diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java index 85a1a4ce8..204680ad5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.item; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.CustomItem; import net.momirealms.craftengine.core.item.Item; @@ -25,6 +26,7 @@ import java.util.Map; import java.util.Optional; import java.util.function.BiConsumer; +@SuppressWarnings("DuplicatedCode") public class LegacyNetworkItemHandler implements NetworkItemHandler { @Override @@ -32,9 +34,9 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { Optional> optionalCustomItem = wrapped.getCustomItem(); boolean hasDifferentMaterial = false; if (optionalCustomItem.isPresent()) { - CustomItem customItem = optionalCustomItem.get(); - if (!customItem.material().equals(wrapped.vanillaId())) { - wrapped = wrapped.transmuteCopy(customItem.material()); + BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get(); + if (customItem.item() != FastNMS.INSTANCE.method$ItemStack$getItem(wrapped.getLiteralObject())) { + wrapped = wrapped.unsafeTransmuteCopy(customItem.item(), wrapped.count()); hasDifferentMaterial = true; } } @@ -61,10 +63,10 @@ public class LegacyNetworkItemHandler implements NetworkItemHandler { if (!Config.interceptItem()) return Optional.empty(); return new OtherItem(wrapped, false).process(); } else { - CustomItem customItem = optionalCustomItem.get(); - boolean hasDifferentMaterial = !wrapped.vanillaId().equals(customItem.clientBoundMaterial()); + BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get(); + boolean hasDifferentMaterial = FastNMS.INSTANCE.method$ItemStack$getItem(wrapped.getItem()) != customItem.clientItem(); if (hasDifferentMaterial) { - wrapped = wrapped.transmuteCopy(customItem.clientBoundMaterial()); + wrapped = wrapped.unsafeTransmuteCopy(customItem.clientItem(), wrapped.count()); } if (!customItem.hasClientBoundDataModifier()) { if (!Config.interceptItem() && !hasDifferentMaterial) return Optional.empty(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java index 460deddcd..f9aecf921 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.item; import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.*; import net.momirealms.craftengine.core.item.modifier.ArgumentModifier; @@ -33,9 +34,9 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler> optionalCustomItem = wrapped.getCustomItem(); boolean hasDifferentMaterial = false; if (optionalCustomItem.isPresent()) { - CustomItem customItem = optionalCustomItem.get(); - if (!customItem.material().equals(wrapped.vanillaId())) { - wrapped = wrapped.transmuteCopy(customItem.material()); + BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get(); + if (customItem.item() != FastNMS.INSTANCE.method$ItemStack$getItem(wrapped.getLiteralObject())) { + wrapped = wrapped.unsafeTransmuteCopy(customItem.item(), wrapped.count()); hasDifferentMaterial = true; } } @@ -64,10 +65,10 @@ public final class ModernNetworkItemHandler implements NetworkItemHandler customItem = optionalCustomItem.get(); - boolean hasDifferentMaterial = !wrapped.vanillaId().equals(customItem.clientBoundMaterial()); + BukkitCustomItem customItem = (BukkitCustomItem) optionalCustomItem.get(); + boolean hasDifferentMaterial = FastNMS.INSTANCE.method$ItemStack$getItem(wrapped.getItem()) != customItem.clientItem(); if (hasDifferentMaterial) { - wrapped = wrapped.transmuteCopy(customItem.clientBoundMaterial()); + wrapped = wrapped.unsafeTransmuteCopy(customItem.clientItem(), wrapped.count()); } if (!customItem.hasClientBoundDataModifier()) { if (!Config.interceptItem() && !hasDifferentMaterial) return Optional.empty(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java index c7ad75a33..1a3c19dc9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/factory/ComponentItemFactory1_20_5.java @@ -526,9 +526,16 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory { @Override protected LegacyItemWrapper mergeCopy(LegacyItemWrapper item1, LegacyItemWrapper item2) { Object itemStack = ItemObject.copy(item2.getLiteralObject()); - ItemObject.setCustomDataTag(itemStack, TagCompound.clone(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item1.getLiteralObject()))); + FastNMS.INSTANCE.method$ItemStack$setTag(itemStack, TagCompound.clone(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item1.getLiteralObject()))); // one more step than vanilla TagCompound.merge(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(itemStack), FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item2.getLiteralObject()), true, true); return new LegacyItemWrapper(new RtagItem(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(itemStack))); @@ -318,7 +318,7 @@ public class UniversalItemFactory extends BukkitItemFactory { protected void merge(LegacyItemWrapper item1, LegacyItemWrapper item2) { // load previous changes on nms items item1.load(); - TagCompound.merge(ItemObject.getCustomDataTag(item1.getLiteralObject()), ItemObject.getCustomDataTag(item2.getLiteralObject()), true, true); + TagCompound.merge(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item1.getLiteralObject()), FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item2.getLiteralObject()), true, true); // update wrapped item item1.update(); } @@ -326,7 +326,14 @@ public class UniversalItemFactory extends BukkitItemFactory { @Override protected LegacyItemWrapper transmuteCopy(LegacyItemWrapper item, Key newItem, int amount) { Object newItemStack = FastNMS.INSTANCE.constructor$ItemStack(FastNMS.INSTANCE.method$Registry$getValue(MBuiltInRegistries.ITEM, KeyUtils.toResourceLocation(newItem)), amount); - ItemObject.setCustomDataTag(newItemStack, TagCompound.clone(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item.getLiteralObject()))); + FastNMS.INSTANCE.method$ItemStack$setTag(newItemStack, TagCompound.clone(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item.getLiteralObject()))); + return new LegacyItemWrapper(new RtagItem(ItemObject.asCraftMirror(newItemStack))); + } + + @Override + protected LegacyItemWrapper unsafeTransmuteCopy(LegacyItemWrapper item, Object newItem, int amount) { + Object newItemStack = FastNMS.INSTANCE.constructor$ItemStack(newItem, amount); + FastNMS.INSTANCE.method$ItemStack$setTag(newItemStack, TagCompound.clone(FastNMS.INSTANCE.field$ItemStack$getOrCreateTag(item.getLiteralObject()))); return new LegacyItemWrapper(new RtagItem(ItemObject.asCraftMirror(newItemStack))); } } \ No newline at end of file diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java index be0e995d5..219dd5e3f 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/AbstractItem.java @@ -429,6 +429,11 @@ public class AbstractItem, I> implements Item { return new AbstractItem<>(this.factory, this.factory.transmuteCopy(this.item, another, count)); } + @Override + public Item unsafeTransmuteCopy(Object another, int count) { + return new AbstractItem<>(this.factory, this.factory.unsafeTransmuteCopy(this.item, another, count)); + } + @SuppressWarnings({"unchecked", "rawtypes"}) @Override public void merge(Item another) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java index adbc45d3e..8b2954c31 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/Item.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/Item.java @@ -181,6 +181,8 @@ public interface Item { Item transmuteCopy(Key another, int count); + Item unsafeTransmuteCopy(Object another, int count); + void shrink(int amount); default Item transmuteCopy(Key another) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java index 4c19ce8ef..783bf3365 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java +++ b/core/src/main/java/net/momirealms/craftengine/core/item/ItemFactory.java @@ -196,4 +196,6 @@ public abstract class ItemFactory, I> { protected abstract void setNBTComponent(W item, Object type, Tag value); protected abstract W transmuteCopy(W item, Key newItem, int amount); + + protected abstract W unsafeTransmuteCopy(W item, Object newItem, int count); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java index 55c1244a8..cf807696c 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/pack/AbstractPackManager.java @@ -116,6 +116,7 @@ public abstract class AbstractPackManager implements PackManager { loadInternalList("models", "block/", VANILLA_MODELS::add); loadInternalList("models", "item/", VANILLA_MODELS::add); + VANILLA_MODELS.add(Key.of("minecraft", "builtin/entity")); } private void loadInternalData(String path, BiConsumer callback) { diff --git a/gradle.properties b/gradle.properties index 5ead891b5..a3f1ff254 100644 --- a/gradle.properties +++ b/gradle.properties @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.17 -nms_helper_version=0.67.10 +nms_helper_version=0.67.11 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23