diff --git a/pandalib-paper/pom.xml b/pandalib-paper/pom.xml
index 8094be6..ab64ad8 100644
--- a/pandalib-paper/pom.xml
+++ b/pandalib-paper/pom.xml
@@ -22,6 +22,11 @@
fabricmc
https://maven.fabricmc.net/
+
+ minecraft-libraries
+ Minecraft Libraries
+ https://libraries.minecraft.net
+
@@ -84,6 +89,12 @@
provided
+
+ com.mojang
+ datafixerupper
+ ${datafixerupper.version}
+
+
io.papermc.paper
diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/players/PlayerDataWrapper.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/players/PlayerDataWrapper.java
index c72a554..e354b13 100644
--- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/players/PlayerDataWrapper.java
+++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/players/PlayerDataWrapper.java
@@ -3,9 +3,14 @@ package fr.pandacube.lib.paper.players;
import fr.pandacube.lib.paper.inventory.DummyPlayerInventory;
import fr.pandacube.lib.paper.reflect.wrapper.craftbukkit.CraftItemStack;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.nbt.CompoundTag;
-import fr.pandacube.lib.paper.reflect.wrapper.minecraft.nbt.ListTag;
-import fr.pandacube.lib.paper.reflect.wrapper.minecraft.nbt.Tag;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.util.ProblemReporter;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ItemStackWithSlot;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.TagValueInput;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.TagValueOutput;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ValueInput;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ValueOutputTypedOutputList;
import fr.pandacube.lib.paper.util.ExperienceUtil;
+import fr.pandacube.lib.reflect.wrapper.ReflectWrapper;
import org.bukkit.Bukkit;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.Inventory;
@@ -14,6 +19,7 @@ import org.bukkit.inventory.PlayerInventory;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Optional;
import java.util.TreeMap;
import java.util.UUID;
import java.util.function.IntUnaryOperator;
@@ -118,17 +124,17 @@ public record PlayerDataWrapper(CompoundTag data) {
}
private Map getRawInventoryContent(String key) {
- if (!data.contains(key, Tag.TAG_LIST()))
- return Map.of();
- ListTag list = data.getList(key, Tag.TAG_COMPOUND());
- if (list == null)
- return Map.of();
+
+ ValueInput vi = TagValueInput.createGlobal(ProblemReporter.DISCARDING(), data);
+ Iterable> listNMSItemStackWithSlot = ReflectWrapper.unwrap(vi.listOrEmpty(key, ItemStackWithSlot.CODEC()));
Map stacks = new TreeMap<>();
- for (int i = 0; i < list.size(); i++) {
- CompoundTag itemTag = list.getCompound(i);
- int nbtSlot = itemTag.getByte("Slot") & 255;
- fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ItemStack.parse(itemTag)
+
+ for (Object nmsISWS : listNMSItemStackWithSlot) {
+ ItemStackWithSlot isws = ReflectWrapper.wrap(nmsISWS, ItemStackWithSlot.class);
+
+ int nbtSlot = isws.slot() & 255;
+ Optional.of(isws.stack())
.map(nms -> filterStack(CraftItemStack.asCraftMirror(nms)))
.ifPresent(is -> stacks.put(nbtSlot, is));
}
@@ -153,21 +159,22 @@ public record PlayerDataWrapper(CompoundTag data) {
}
private void setRawInventoryContent(String key, Map stacks) {
- ListTag list = new ListTag();
+
+ TagValueOutput vo = TagValueOutput.createWrappingGlobal(ProblemReporter.DISCARDING(), data);
+ ValueOutputTypedOutputList listNMSItemStackWithSlot = vo.list(key, ItemStackWithSlot.CODEC());
+
for (Entry is : stacks.entrySet()) {
ItemStack stack = filterStack(is.getValue());
if (stack == null)
continue;
- CompoundTag itemTag = new CompoundTag();
- itemTag.putByte("Slot", is.getKey().byteValue());
- list.add(list.size(), CraftItemStack.asNMSCopy(is.getValue()).save(itemTag));
+
+ listNMSItemStackWithSlot.add(ReflectWrapper.unwrap(new ItemStackWithSlot(is.getKey(), CraftItemStack.asNMSCopy(is.getValue()))));
}
- data.put(key, list);
}
private ItemStack filterStack(ItemStack is) {
- return is == null || is.getType().isEmpty() || is.getAmount() == 0 ? null : is;
+ return is == null || is.isEmpty() || is.getAmount() <= 0 ? null : is;
}
diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/PandalibPaperReflect.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/PandalibPaperReflect.java
index 17a6e06..3e227e6 100644
--- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/PandalibPaperReflect.java
+++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/PandalibPaperReflect.java
@@ -59,11 +59,18 @@ import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ChunkPos;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ChunkStorage;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.Entity;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ItemStack;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ItemStackWithSlot;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.Level;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.MapItemSavedData;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.PlayerDataStorage;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.RegionFileStorage;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.SavedData;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.TagValueInput;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.TagValueOutput;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ValueInput;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ValueInputTypedInputList;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ValueOutput;
+import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.ValueOutputTypedOutputList;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.Vec3;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.VoxelShape;
import fr.pandacube.lib.paper.reflect.wrapper.minecraft.world.block.BambooStalkBlock;
@@ -189,11 +196,18 @@ public class PandalibPaperReflect {
thAcc.catchThrowable(() -> initWrapper(ChunkStorage.class, ChunkStorage.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(Entity.class, Entity.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(ItemStack.class, ItemStack.REFLECT.get()));
+ thAcc.catchThrowable(() -> initWrapper(ItemStackWithSlot.class, ItemStackWithSlot.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(Level.class, Level.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(MapItemSavedData.class, MapItemSavedData.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(PlayerDataStorage.class, PlayerDataStorage.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(RegionFileStorage.class, RegionFileStorage.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(SavedData.class, SavedData.REFLECT.get()));
+ thAcc.catchThrowable(() -> initWrapper(TagValueInput.class, TagValueInput.REFLECT.get()));
+ thAcc.catchThrowable(() -> initWrapper(TagValueOutput.class, TagValueOutput.REFLECT.get()));
+ thAcc.catchThrowable(() -> initWrapper(ValueInput.class, ValueInput.REFLECT.get()));
+ thAcc.catchThrowable(() -> initWrapper(ValueInputTypedInputList.class, ValueInputTypedInputList.REFLECT.get()));
+ thAcc.catchThrowable(() -> initWrapper(ValueOutput.class, ValueOutput.REFLECT.get()));
+ thAcc.catchThrowable(() -> initWrapper(ValueOutputTypedOutputList.class, ValueOutputTypedOutputList.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(Vec3.class, Vec3.REFLECT.get()));
thAcc.catchThrowable(() -> initWrapper(VoxelShape.class, VoxelShape.REFLECT.get()));
// minecraft
diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/minecraft/nbt/CompoundTag.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/minecraft/nbt/CompoundTag.java
index 95e29b3..459a5d4 100644
--- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/minecraft/nbt/CompoundTag.java
+++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/minecraft/nbt/CompoundTag.java
@@ -6,7 +6,6 @@ import fr.pandacube.lib.reflect.ReflectConstructor;
import fr.pandacube.lib.reflect.ReflectMethod;
import fr.pandacube.lib.reflect.wrapper.ReflectWrapper;
-import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -20,17 +19,14 @@ public class CompoundTag extends ReflectWrapper implements Tag {
private static final ReflectMethod> putBoolean = wrapEx(() -> REFLECT.method("putBoolean", String.class, boolean.class));
private static final ReflectMethod> putByte = wrapEx(() -> REFLECT.method("putByte", String.class, byte.class));
private static final ReflectMethod> putByteArray = wrapEx(() -> REFLECT.method("putByteArray", String.class, byte[].class));
- private static final ReflectMethod> putByteArray_List = wrapEx(() -> REFLECT.method("putByteArray", String.class, List.class));
private static final ReflectMethod> putDouble = wrapEx(() -> REFLECT.method("putDouble", String.class, double.class));
private static final ReflectMethod> putFloat = wrapEx(() -> REFLECT.method("putFloat", String.class, float.class));
private static final ReflectMethod> putInt = wrapEx(() -> REFLECT.method("putInt", String.class, int.class));
private static final ReflectMethod> putIntArray = wrapEx(() -> REFLECT.method("putIntArray", String.class, int[].class));
- private static final ReflectMethod> putIntArray_List = wrapEx(() -> REFLECT.method("putIntArray", String.class, List.class));
private static final ReflectMethod> putString = wrapEx(() -> REFLECT.method("putString", String.class, String.class));
private static final ReflectMethod> putUUID = wrapEx(() -> REFLECT.method("putUUID", String.class, UUID.class));
private static final ReflectMethod> putLong = wrapEx(() -> REFLECT.method("putLong", String.class, long.class));
private static final ReflectMethod> putLongArray = wrapEx(() -> REFLECT.method("putLongArray", String.class, long[].class));
- private static final ReflectMethod> putLongArray_List = wrapEx(() -> REFLECT.method("putLongArray", String.class, List.class));
private static final ReflectMethod> putShort = wrapEx(() -> REFLECT.method("putShort", String.class, short.class));
private static final ReflectMethod> put = wrapEx(() -> REFLECT.method("put", String.class, Tag.REFLECT.get()));
@@ -73,9 +69,6 @@ public class CompoundTag extends ReflectWrapper implements Tag {
public void putByteArray(String key, byte[] value) {
wrapReflectEx(() -> putByteArray.invoke(__getRuntimeInstance(), key, value));
}
- public void putByteArray(String key, List value) {
- wrapReflectEx(() -> putByteArray_List.invoke(__getRuntimeInstance(), key, value));
- }
public void putDouble(String key, double value) {
wrapReflectEx(() -> putDouble.invoke(__getRuntimeInstance(), key, value));
}
@@ -88,9 +81,6 @@ public class CompoundTag extends ReflectWrapper implements Tag {
public void putIntArray(String key, int[] value) {
wrapReflectEx(() -> putIntArray.invoke(__getRuntimeInstance(), key, value));
}
- public void putIntArray(String key, List value) {
- wrapReflectEx(() -> putIntArray_List.invoke(__getRuntimeInstance(), key, value));
- }
public void putString(String key, String value) {
wrapReflectEx(() -> putString.invoke(__getRuntimeInstance(), key, value));
}
@@ -103,9 +93,6 @@ public class CompoundTag extends ReflectWrapper implements Tag {
public void putLongArray(String key, long[] value) {
wrapReflectEx(() -> putLongArray.invoke(__getRuntimeInstance(), key, value));
}
- public void putLongArray(String key, List value) {
- wrapReflectEx(() -> putLongArray_List.invoke(__getRuntimeInstance(), key, value));
- }
public void putShort(String key, short value) {
wrapReflectEx(() -> putShort.invoke(__getRuntimeInstance(), key, value));
}
diff --git a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/minecraft/world/ItemStack.java b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/minecraft/world/ItemStack.java
index 234ad44..6193388 100644
--- a/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/minecraft/world/ItemStack.java
+++ b/pandalib-paper/src/main/java/fr/pandacube/lib/paper/reflect/wrapper/minecraft/world/ItemStack.java
@@ -1,63 +1,15 @@
package fr.pandacube.lib.paper.reflect.wrapper.minecraft.world;
-import fr.pandacube.lib.paper.reflect.wrapper.craftbukkit.CraftServer;
-import fr.pandacube.lib.paper.reflect.wrapper.minecraft.core.HolderLookupProvider;
-import fr.pandacube.lib.paper.reflect.wrapper.minecraft.core.RegistryAccess;
-import fr.pandacube.lib.paper.reflect.wrapper.minecraft.nbt.Tag;
import fr.pandacube.lib.reflect.Reflect;
import fr.pandacube.lib.reflect.ReflectClass;
-import fr.pandacube.lib.reflect.ReflectMethod;
import fr.pandacube.lib.reflect.wrapper.ReflectWrapper;
-import org.bukkit.Bukkit;
-
-import java.util.Optional;
import static fr.pandacube.lib.util.ThrowableUtil.wrapEx;
-import static fr.pandacube.lib.util.ThrowableUtil.wrapReflectEx;
public class ItemStack extends ReflectWrapper {
public static final ReflectClass> REFLECT = wrapEx(() -> Reflect.ofClass("net.minecraft.world.item.ItemStack"));
- private static final ReflectMethod> parse = wrapEx(() -> REFLECT.method("parse", HolderLookupProvider.REFLECT.get(), Tag.REFLECT.get()));
- private static final ReflectMethod> saveWithPrefix = wrapEx(() -> REFLECT.method("save", HolderLookupProvider.REFLECT.get(), Tag.REFLECT.get()));
- private static final ReflectMethod> save = wrapEx(() -> REFLECT.method("save", HolderLookupProvider.REFLECT.get()));
-
- @SuppressWarnings("unchecked")
- public static Optional parse(HolderLookupProvider registries, Tag nbt) {
- return ((Optional