diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java index a74547ea7..20c326586 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/BukkitItemManager.java @@ -1,6 +1,5 @@ package net.momirealms.craftengine.bukkit.item; -import com.saicone.rtag.item.ItemTagStream; import net.momirealms.craftengine.bukkit.item.behavior.BucketItemBehavior; import net.momirealms.craftengine.bukkit.item.behavior.FlintAndSteelItemBehavior; import net.momirealms.craftengine.bukkit.item.behavior.WaterBucketItemBehavior; @@ -13,7 +12,6 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MBuiltInRegistries; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; -import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; import net.momirealms.craftengine.bukkit.util.ItemUtils; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.core.entity.player.Player; @@ -26,7 +24,6 @@ import net.momirealms.craftengine.core.registry.BuiltInRegistries; import net.momirealms.craftengine.core.registry.Holder; import net.momirealms.craftengine.core.registry.WritableRegistry; import net.momirealms.craftengine.core.util.Key; -import net.momirealms.craftengine.core.util.ResourceConfigUtils; import net.momirealms.craftengine.core.util.ResourceKey; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; @@ -141,7 +138,7 @@ public class BukkitItemManager extends AbstractItemManager { @Override public Item fromByteArray(byte[] bytes) { - return this.factory.wrap(ItemTagStream.INSTANCE.fromBytes(bytes)); + return this.factory.wrap(ItemStack.deserializeBytes(bytes)); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java index 2d283d73f..5cf774fd7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/BukkitItemFactory.java @@ -1,8 +1,6 @@ package net.momirealms.craftengine.bukkit.item.factory; import com.google.gson.JsonElement; -import com.saicone.rtag.item.ItemTagStream; -import net.momirealms.craftengine.bukkit.item.ComponentItemWrapper; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.util.ItemTags; import net.momirealms.craftengine.core.item.ItemFactory; @@ -50,7 +48,7 @@ public abstract class BukkitItemFactory> extend @Override protected byte[] toByteArray(W item) { - return ItemTagStream.INSTANCE.toBytes(item.getItem()); + return item.getItem().serializeAsBytes(); } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java index f37e0118c..7956395c6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/BukkitRecipeManager.java @@ -11,6 +11,7 @@ import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.plugin.reflection.bukkit.CraftBukkitReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.CoreReflections; import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistries; +import net.momirealms.craftengine.bukkit.plugin.reflection.minecraft.MRegistryOps; import net.momirealms.craftengine.bukkit.util.KeyUtils; import net.momirealms.craftengine.bukkit.util.MaterialUtils; import net.momirealms.craftengine.bukkit.util.RecipeUtils; @@ -666,7 +667,14 @@ public class BukkitRecipeManager extends AbstractRecipeManager { jsonObject.addProperty("id", result.id()); jsonObject.addProperty("count", result.count()); jsonObject.add("components", result.components()); - Object nmsStack = ItemObject.newItem(TagCompound.newTag(jsonObject.toString())); + Object nmsTag = TagCompound.newTag(jsonObject.toString()); + Object nmsStack; + if (VersionHelper.isOrAbove1_21_6()) { + nmsStack = CoreReflections.instance$ItemStack$CODEC.parse(MRegistryOps.NBT, nmsTag) + .resultOrPartial((itemId) -> plugin.logger().severe("Tried to load invalid item: '" + itemId + "'")).orElse(null); + } else { + nmsStack = ItemObject.newItem(nmsTag); + } try { itemStack = FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(nmsStack); } catch (Exception e) { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java index ef984cf72..c8deb96cd 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/CoreReflections.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.plugin.reflection.minecraft; import com.google.common.collect.ImmutableList; import com.google.gson.JsonElement; +import com.mojang.serialization.Codec; import com.mojang.serialization.DynamicOps; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelFuture; @@ -3323,4 +3324,23 @@ public final class CoreReflections { "world.inventory.EnchantmentMenu" ) ); + + // 1.20.5+ + public static final Field field$ItemStack$CODEC = ReflectionUtils.getDeclaredField( + clazz$ItemStack, "CODEC", "b" + ); + + public static final Codec instance$ItemStack$CODEC; + + static { + try { + if (VersionHelper.isOrAbove1_20_5()) { + instance$ItemStack$CODEC = (Codec) field$ItemStack$CODEC.get(null); + } else { + instance$ItemStack$CODEC = null; + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } }