diff --git a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/SNBTConverter.kt b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/SNBTConverter.kt index a8a242496..57d4f9e5f 100644 --- a/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/SNBTConverter.kt +++ b/eco-core/core-nms/v1_17_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_17_R1/SNBTConverter.kt @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_17_R1.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_17_R1.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -18,7 +19,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { diff --git a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/SNBTConverter.kt b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/SNBTConverter.kt index 127322582..b10243362 100644 --- a/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/SNBTConverter.kt +++ b/eco-core/core-nms/v1_18_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R1/SNBTConverter.kt @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_18_R1.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_18_R1.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -18,7 +19,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { diff --git a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/SNBTConverter.kt b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/SNBTConverter.kt index afaab5965..81aa3cd8b 100644 --- a/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/SNBTConverter.kt +++ b/eco-core/core-nms/v1_18_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_18_R2/SNBTConverter.kt @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_18_R2.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_18_R2.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -18,7 +19,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { diff --git a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/SNBTConverter.kt b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/SNBTConverter.kt index 4bb9b080d..17969b0fa 100644 --- a/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/SNBTConverter.kt +++ b/eco-core/core-nms/v1_19_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R1/SNBTConverter.kt @@ -8,6 +8,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_19_R1.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_19_R1.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -19,7 +20,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { diff --git a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/SNBTConverter.kt b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/SNBTConverter.kt index 2d7a5ab46..49262e3d8 100644 --- a/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/SNBTConverter.kt +++ b/eco-core/core-nms/v1_19_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R2/SNBTConverter.kt @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_19_R2.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_19_R2.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -18,7 +19,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { diff --git a/eco-core/core-nms/v1_19_R3/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R3/SNBTConverter.kt b/eco-core/core-nms/v1_19_R3/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R3/SNBTConverter.kt index c3bad7504..42aaf116e 100644 --- a/eco-core/core-nms/v1_19_R3/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R3/SNBTConverter.kt +++ b/eco-core/core-nms/v1_19_R3/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_19_R3/SNBTConverter.kt @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_19_R3.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_19_R3.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -18,7 +19,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { diff --git a/eco-core/core-nms/v1_20_6/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_6/SNBTConverter.kt b/eco-core/core-nms/v1_20_6/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_6/SNBTConverter.kt index 51c4b2cb5..73eeead8d 100644 --- a/eco-core/core-nms/v1_20_6/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_6/SNBTConverter.kt +++ b/eco-core/core-nms/v1_20_6/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_6/SNBTConverter.kt @@ -1,37 +1,63 @@ package com.willfp.eco.internal.spigot.proxy.v1_20_6 +import com.mojang.serialization.Dynamic import com.willfp.eco.core.items.TestableItem import com.willfp.eco.core.recipe.parts.EmptyTestableItem import com.willfp.eco.internal.spigot.proxy.SNBTConverterProxy import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.NbtOps import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser +import net.minecraft.server.MinecraftServer +import net.minecraft.util.datafix.fixes.References import org.bukkit.Bukkit import org.bukkit.craftbukkit.CraftServer import org.bukkit.craftbukkit.inventory.CraftItemStack +import org.bukkit.craftbukkit.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack -private val holderLookupProvider = (Bukkit.getServer() as CraftServer).server.registryAccess() +private val registryAccess = (Bukkit.getServer() as CraftServer).server.registryAccess() class SNBTConverter : SNBTConverterProxy { - override fun fromSNBT(snbt: String): ItemStack? { + private fun parseItemSNBT(snbt: String): CompoundTag? { val nbt = runCatching { TagParser.parseTag(snbt) }.getOrNull() ?: return null - val nms = net.minecraft.world.item.ItemStack.parse(holderLookupProvider, nbt).orElse(null) ?: return null + val dataVersion = if (nbt.contains("DataVersion")) { + nbt.getInt("DataVersion") + } else null + + // If the data version is the same as the server's data version, we don't need to fix it + if (dataVersion == CraftMagicNumbers.INSTANCE.dataVersion) { + return nbt + } + + return MinecraftServer.getServer().fixerUpper.update( + References.ITEM_STACK, + Dynamic(NbtOps.INSTANCE, nbt), + dataVersion ?: 3700, // 3700 is the 1.20.4 data version + CraftMagicNumbers.INSTANCE.dataVersion + ).value as CompoundTag + } + + override fun fromSNBT(snbt: String): ItemStack? { + val tag = parseItemSNBT(snbt) ?: return null + val nms = net.minecraft.world.item.ItemStack.parse(registryAccess, tag).orElse(null) ?: return null return CraftItemStack.asBukkitCopy(nms) } override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(holderLookupProvider)) + val tag = nms.save(registryAccess) as CompoundTag + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { - val nbt = runCatching { TagParser.parseTag(snbt) }.getOrNull() ?: return EmptyTestableItem() - val nms = net.minecraft.world.item.ItemStack.parse(holderLookupProvider, nbt).orElse(null) + val tag = parseItemSNBT(snbt) ?: return EmptyTestableItem() + val nms = net.minecraft.world.item.ItemStack.parse(registryAccess, tag).orElse(null) ?: return EmptyTestableItem() - nbt.remove("Count") - return SNBTTestableItem(CraftItemStack.asBukkitCopy(nms), nbt) + tag.remove("Count") + return SNBTTestableItem(CraftItemStack.asBukkitCopy(nms), tag) } class SNBTTestableItem( @@ -44,7 +70,7 @@ class SNBTConverter : SNBTConverterProxy { } val nms = CraftItemStack.asNMSCopy(itemStack) - val nmsTag = nms.save(holderLookupProvider) as CompoundTag + val nmsTag = nms.save(registryAccess) as CompoundTag nmsTag.remove("Count") return tag.copy().merge(nmsTag) == nmsTag && itemStack.type == item.type } diff --git a/eco-core/core-nms/v1_20_6/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_6/packet/NewItemsPacketSetCreativeSlot.kt b/eco-core/core-nms/v1_20_6/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_6/packet/NewItemsPacketSetCreativeSlot.kt index db4d2b8bc..8e0d8f57f 100644 --- a/eco-core/core-nms/v1_20_6/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_6/packet/NewItemsPacketSetCreativeSlot.kt +++ b/eco-core/core-nms/v1_20_6/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_6/packet/NewItemsPacketSetCreativeSlot.kt @@ -16,4 +16,4 @@ object NewItemsPacketSetCreativeSlot : PacketListener { event.player.lastDisplayFrame = DisplayFrame.EMPTY } -} \ No newline at end of file +} diff --git a/eco-core/core-nms/v1_20_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R1/SNBTConverter.kt b/eco-core/core-nms/v1_20_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R1/SNBTConverter.kt index 1f95201f2..4fb706d6f 100644 --- a/eco-core/core-nms/v1_20_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R1/SNBTConverter.kt +++ b/eco-core/core-nms/v1_20_R1/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R1/SNBTConverter.kt @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_20_R1.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -18,7 +19,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { diff --git a/eco-core/core-nms/v1_20_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R2/SNBTConverter.kt b/eco-core/core-nms/v1_20_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R2/SNBTConverter.kt index 50c81e666..cca7842dd 100644 --- a/eco-core/core-nms/v1_20_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R2/SNBTConverter.kt +++ b/eco-core/core-nms/v1_20_R2/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R2/SNBTConverter.kt @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_20_R2.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -18,7 +19,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem { diff --git a/eco-core/core-nms/v1_20_R3/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R3/SNBTConverter.kt b/eco-core/core-nms/v1_20_R3/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R3/SNBTConverter.kt index d40e7adc7..f29cef7e0 100644 --- a/eco-core/core-nms/v1_20_R3/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R3/SNBTConverter.kt +++ b/eco-core/core-nms/v1_20_R3/src/main/kotlin/com/willfp/eco/internal/spigot/proxy/v1_20_R3/SNBTConverter.kt @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.SnbtPrinterTagVisitor import net.minecraft.nbt.TagParser import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack +import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers import org.bukkit.inventory.ItemStack class SNBTConverter : SNBTConverterProxy { @@ -18,7 +19,9 @@ class SNBTConverter : SNBTConverterProxy { override fun toSNBT(itemStack: ItemStack): String { val nms = CraftItemStack.asNMSCopy(itemStack) - return SnbtPrinterTagVisitor().visit(nms.save(CompoundTag())) + val tag = nms.save(CompoundTag()) + tag.putInt("DataVersion", CraftMagicNumbers.INSTANCE.dataVersion) + return SnbtPrinterTagVisitor().visit(tag) } override fun makeSNBTTestable(snbt: String): TestableItem {