From e491b28722d77e43361defc4863b1a1c4ab81bee Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Wed, 28 May 2025 00:29:31 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E5=8F=91=E5=8C=85=E7=89=A9?= =?UTF-8?q?=E5=93=81=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/item/BukkitItemManager.java | 21 ++- .../bukkit/item/ComponentItemWrapper.java | 1 + .../bukkit/item/LegacyNetworkItemHandler.java | 63 -------- .../bukkit/item/ModernNetworkItemHandler.java | 150 ++++++++++++++++++ .../bukkit/item/NetworkItemHandler.java | 44 +++++ .../item/factory/BukkitItemFactory.java | 33 ++++ .../factory/ComponentItemFactory1_20_5.java | 15 ++ .../item/factory/UniversalItemFactory.java | 17 -- .../plugin/network/BukkitNetworkManager.java | 98 ++++++++---- .../craftengine/core/item/AbstractItem.java | 15 ++ .../craftengine/core/item/Item.java | 6 + .../craftengine/core/item/ItemFactory.java | 6 + .../core/util/AdventureHelper.java | 8 + gradle.properties | 2 +- .../mod/item/CustomStreamCodec.java | 25 --- .../mod/mixin/FriendlyByteBufMixin.java | 30 ---- .../main/resources/mixins.craftengine.json | 3 +- .../mod/item/CustomStreamCodec.java | 41 ----- .../craftengine/mod/mixin/ItemStackMixin.java | 48 ------ .../main/resources/mixins.craftengine.json | 3 +- .../mod/item/CustomStreamCodec.java | 41 ----- .../craftengine/mod/mixin/ItemStackMixin.java | 66 -------- 22 files changed, 364 insertions(+), 372 deletions(-) delete mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java delete mode 100644 server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java delete mode 100644 server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/mixin/FriendlyByteBufMixin.java delete mode 100644 server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java delete mode 100644 server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/mixin/ItemStackMixin.java delete mode 100644 server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java delete mode 100644 server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/mixin/ItemStackMixin.java 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 b1352aa35..60d9e2167 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 @@ -15,6 +15,7 @@ import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.entity.player.Player; import net.momirealms.craftengine.core.item.*; import net.momirealms.craftengine.core.item.modifier.IdModifier; +import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.context.ContextHolder; import net.momirealms.craftengine.core.plugin.locale.LocalizedResourceConfigException; import net.momirealms.craftengine.core.registry.BuiltInRegistries; @@ -57,7 +58,7 @@ public class BukkitItemManager extends AbstractItemManager { this.itemEventListener = new ItemEventListener(plugin); this.debugStickListener = new DebugStickListener(plugin); this.armorEventListener = new ArmorEventListener(); - this.networkItemHandler = new LegacyNetworkItemHandler(this); + this.networkItemHandler = new ModernNetworkItemHandler(this); this.registerAllVanillaItems(); } @@ -73,11 +74,25 @@ public class BukkitItemManager extends AbstractItemManager { } public Optional s2c(ItemStack itemStack, ItemBuildContext context) { - return this.networkItemHandler.s2c(itemStack, context); + try { + return this.networkItemHandler.s2c(itemStack, context); + } catch (Throwable e) { + if (Config.debug()) { + this.plugin.logger().warn("Failed to handle s2c items.", e); + } + return Optional.empty(); + } } public Optional c2s(ItemStack itemStack, ItemBuildContext context) { - return this.networkItemHandler.c2s(itemStack, context); + try { + return this.networkItemHandler.c2s(itemStack, context); + } catch (Throwable e) { + if (Config.debug()) { + this.plugin.logger().warn("Failed to handle c2s items.", e); + } + return Optional.empty(); + } } @Override diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java index 765d093cd..bda3edb58 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ComponentItemWrapper.java @@ -108,6 +108,7 @@ public class ComponentItemWrapper implements ItemWrapper { @SuppressWarnings({"rawtypes", "unchecked"}) private void setComponentInternal(Object type, DynamicOps ops, Object value) { + if (value == null) return; Object componentType = ensureDataComponentType(type); Codec codec = FastNMS.INSTANCE.method$DataComponentType$codec(componentType); try { 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 deleted file mode 100644 index cf5f55199..000000000 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/LegacyNetworkItemHandler.java +++ /dev/null @@ -1,63 +0,0 @@ -package net.momirealms.craftengine.bukkit.item; - -import net.momirealms.craftengine.core.item.CustomItem; -import net.momirealms.craftengine.core.item.Item; -import net.momirealms.craftengine.core.item.ItemBuildContext; -import net.momirealms.craftengine.core.plugin.config.Config; -import org.bukkit.inventory.ItemStack; - -import java.util.Optional; - -public class LegacyNetworkItemHandler implements NetworkItemHandler { - private final BukkitItemManager itemManager; - - public LegacyNetworkItemHandler(BukkitItemManager itemManager) { - this.itemManager = itemManager; - } - - @Override - public Optional c2s(ItemStack itemStack, ItemBuildContext context) { - Item wrapped = this.itemManager.wrap(itemStack); - if (wrapped == null) return Optional.empty(); - - return Optional.empty(); - } - - @Override - public Optional s2c(ItemStack itemStack, ItemBuildContext context) { - Item wrapped = this.itemManager.wrap(itemStack); - if (wrapped == null) return Optional.empty(); - Optional> optionalCustomItem = wrapped.getCustomItem(); - if (optionalCustomItem.isEmpty()) { - return s2cOtherItems(wrapped, context); - } else { - return Optional.empty(); - } - } - - private Optional s2cOtherItems(Item item, ItemBuildContext context) { - if (!Config.interceptItem()) return Optional.empty(); - -// Optional> optionalLore = item.lore(); -// if (optionalLore.isPresent()) { -// boolean changed = false; -// List lore = optionalLore.get(); -// List newLore = new ArrayList<>(lore.size()); -// for (String line : lore) { -// Map tokens = CraftEngine.instance().fontManager().matchTags(line); -// if (tokens.isEmpty()) { -// newLore.add(line); -// } else { -// newLore.add(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(line), tokens))); -// changed = true; -// } -// } -// if (changed) { -// item.lore(newLore); -// } -// } -// - 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 new file mode 100644 index 000000000..fadbbe8ce --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ModernNetworkItemHandler.java @@ -0,0 +1,150 @@ +package net.momirealms.craftengine.bukkit.item; + +import net.kyori.adventure.text.Component; +import net.momirealms.craftengine.core.item.ComponentKeys; +import net.momirealms.craftengine.core.item.CustomItem; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.config.Config; +import net.momirealms.craftengine.core.util.AdventureHelper; +import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.ListTag; +import net.momirealms.sparrow.nbt.StringTag; +import net.momirealms.sparrow.nbt.Tag; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class ModernNetworkItemHandler implements NetworkItemHandler { + private final BukkitItemManager itemManager; + + public ModernNetworkItemHandler(BukkitItemManager itemManager) { + this.itemManager = itemManager; + } + + @Override + public Optional c2s(ItemStack itemStack, ItemBuildContext context) { + Item wrapped = this.itemManager.wrap(itemStack); + if (wrapped == null) return Optional.empty(); + Tag customData = wrapped.getNBTComponent(ComponentTypes.CUSTOM_DATA); + if (!(customData instanceof CompoundTag compoundTag)) return Optional.empty(); + CompoundTag networkData = compoundTag.getCompound(NETWORK_ITEM_TAG); + if (networkData == null) return Optional.empty(); + compoundTag.remove(NETWORK_ITEM_TAG); + for (Map.Entry entry : networkData.entrySet()) { + if (entry.getValue() instanceof CompoundTag tag) { + NetworkItemHandler.apply(entry.getKey(), tag, wrapped); + } + } + if (compoundTag.isEmpty()) { + wrapped.resetComponent(ComponentTypes.CUSTOM_DATA); + } else { + wrapped.setNBTComponent(ComponentTypes.CUSTOM_DATA, compoundTag); + } + return Optional.of(wrapped.load()); + } + + @Override + public Optional s2c(ItemStack itemStack, ItemBuildContext context) { + Item wrapped = this.itemManager.wrap(itemStack); + if (wrapped == null) return Optional.empty(); + Optional> optionalCustomItem = wrapped.getCustomItem(); + if (optionalCustomItem.isEmpty()) { + if (!Config.interceptItem()) return Optional.empty(); + return new OtherItem(wrapped).process(); + } else { + return Optional.empty(); + } + } + + static class OtherItem { + private final Item item; + private boolean globalChanged = false; + private CompoundTag tag; + + public OtherItem(Item item) { + this.item = item; + } + + public Optional process() { + if (VersionHelper.isOrAbove1_21_5()) { + processModernLore(); + } else { + processLore(); + } + + if (this.globalChanged) { + CompoundTag customData = Optional.ofNullable(this.item.getNBTComponent(ComponentTypes.CUSTOM_DATA)).map(CompoundTag.class::cast).orElse(new CompoundTag()); + customData.put(NETWORK_ITEM_TAG, getOrCreateTag()); + this.item.setNBTComponent(ComponentKeys.CUSTOM_DATA, customData); + return Optional.of(this.item.load()); + } else { + return Optional.empty(); + } + } + + private void processLore() { + Optional> optionalLore = this.item.loreJson(); + if (optionalLore.isPresent()) { + boolean changed = false; + List lore = optionalLore.get(); + List newLore = new ArrayList<>(lore.size()); + for (String line : lore) { + Map tokens = CraftEngine.instance().fontManager().matchTags(line); + if (tokens.isEmpty()) { + newLore.add(line); + } else { + newLore.add(AdventureHelper.componentToJson(AdventureHelper.replaceText(AdventureHelper.jsonToComponent(line), tokens))); + changed = true; + } + } + if (changed) { + this.globalChanged = true; + this.item.loreJson(newLore); + ListTag listTag = new ListTag(); + for (String line : lore) { + listTag.add(new StringTag(line)); + } + getOrCreateTag().put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(Operation.ADD, listTag)); + } + } + } + + private void processModernLore() { + Tag loreTag = this.item.getNBTComponent(ComponentTypes.LORE); + if (loreTag == null) return; + boolean changed = false; + if (!(loreTag instanceof ListTag listTag)) { + return; + } + ListTag newLore = new ListTag(); + for (Tag tag : listTag) { + String tagStr = tag.getAsString(); + Map tokens = CraftEngine.instance().fontManager().matchTags(tagStr); + if (tokens.isEmpty()) { + newLore.add(tag); + } else { + newLore.add(AdventureHelper.componentToNbt(AdventureHelper.replaceText(AdventureHelper.nbtToComponent(tag), tokens))); + changed = true; + } + } + if (changed) { + this.globalChanged = true; + this.item.setNBTComponent(ComponentKeys.LORE, newLore); + getOrCreateTag().put(ComponentKeys.LORE.asString(), NetworkItemHandler.pack(Operation.ADD, listTag)); + } + } + + private CompoundTag getOrCreateTag() { + if (this.tag == null) { + this.tag = new CompoundTag(); + } + return this.tag; + } + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java index 22b2f7881..aa2b6862f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/NetworkItemHandler.java @@ -1,13 +1,57 @@ package net.momirealms.craftengine.bukkit.item; +import net.momirealms.craftengine.core.item.Item; import net.momirealms.craftengine.core.item.ItemBuildContext; +import net.momirealms.craftengine.core.util.TriConsumer; +import net.momirealms.sparrow.nbt.ByteTag; +import net.momirealms.sparrow.nbt.CompoundTag; +import net.momirealms.sparrow.nbt.Tag; import org.bukkit.inventory.ItemStack; +import java.util.Map; import java.util.Optional; public interface NetworkItemHandler { + Operation[] BY_INDEX = new Operation[] {Operation.ADD, Operation.REMOVE, Operation.RESET}; + String NETWORK_ITEM_TAG = "craftengine:network"; + String NETWORK_OPERATION = "type"; + String NETWORK_VALUE = "value"; Optional s2c(ItemStack itemStack, ItemBuildContext context); Optional c2s(ItemStack itemStack, ItemBuildContext context); + + static CompoundTag pack(Operation operation, Tag value) { + return new CompoundTag(Map.of(NETWORK_OPERATION, operation.tag(), NETWORK_VALUE, value)); + } + + static void apply(String componentType, CompoundTag networkData, Item item) { + byte index = networkData.getByte(NETWORK_OPERATION); + Operation operation = BY_INDEX[index]; + operation.consumer.accept(item, componentType, operation == Operation.ADD ? networkData.get(NETWORK_VALUE) : null); + } + + enum Operation { + ADD(0, Item::setNBTComponent), + REMOVE(1, (i, s, t) -> i.removeComponent(s)), + RESET(2, (i, s, t) -> i.resetComponent(s)); + + private final int id; + private final ByteTag tag; + private final TriConsumer, String, Tag> consumer; + + Operation(int id, TriConsumer, String, Tag> consumer) { + this.id = id; + this.tag = new ByteTag((byte) id); + this.consumer = consumer; + } + + public int id() { + return this.id; + } + + public ByteTag tag() { + return tag; + } + } } 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 1365980c2..ec9009aa4 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,6 +1,8 @@ package net.momirealms.craftengine.bukkit.item.factory; +import com.google.gson.JsonElement; import com.saicone.rtag.item.ItemTagStream; +import net.momirealms.craftengine.bukkit.item.LegacyItemWrapper; import net.momirealms.craftengine.bukkit.util.ItemTags; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.item.EquipmentData; @@ -9,6 +11,7 @@ import net.momirealms.craftengine.core.item.ItemWrapper; import net.momirealms.craftengine.core.item.JukeboxPlayable; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.util.Key; +import net.momirealms.sparrow.nbt.Tag; import org.bukkit.inventory.ItemStack; import java.util.Objects; @@ -87,6 +90,36 @@ public abstract class BukkitItemFactory> extend } } + @Override + protected void setJavaComponent(W item, Object type, Object value) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected void setJsonComponent(W item, Object type, JsonElement value) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected void setNBTComponent(W item, Object type, Tag value) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected Object getJavaComponent(W item, Object type) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected JsonElement getJsonComponent(W item, Object type) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + + @Override + protected Tag getNBTComponent(W item, Object type) { + throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); + } + @Override protected void resetComponent(W item, Object type) { throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); 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 ea22561b0..b039709a6 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 @@ -73,6 +73,21 @@ public class ComponentItemFactory1_20_5 extends BukkitItemFactory { return new LegacyItemWrapper(new RtagItem(item), item.getAmount()); } - @Override - protected Object getJavaComponent(LegacyItemWrapper item, Object type) { - throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); - } - - @Override - protected JsonElement getJsonComponent(LegacyItemWrapper item, Object type) { - throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); - } - - @Override - protected Tag getNBTComponent(LegacyItemWrapper item, Object type) { - throw new UnsupportedOperationException("This feature is only available on 1.20.5+"); - } - @Override protected void setTag(LegacyItemWrapper item, Object value, Object... path) { item.set(value, path); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index f8ae2831d..623f5c11f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -40,16 +40,22 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes private static BukkitNetworkManager instance; private static final Map, TriConsumer> NMS_PACKET_HANDLERS = new HashMap<>(); // only for game stage for the moment - private static final Map> BYTE_BUFFER_PACKET_HANDLERS = new HashMap<>(); + private static final Map> S2C_BYTE_BUFFER_PACKET_HANDLERS = new HashMap<>(); + private static final Map> C2S_BYTE_BUFFER_PACKET_HANDLERS = new HashMap<>(); private static void registerNMSPacketConsumer(final TriConsumer function, @Nullable Class packet) { if (packet == null) return; NMS_PACKET_HANDLERS.put(packet, function); } - private static void registerByteBufPacketConsumer(final BiConsumer function, int id) { + private static void registerS2CByteBufPacketConsumer(final BiConsumer function, int id) { if (id == -1) return; - BYTE_BUFFER_PACKET_HANDLERS.put(id, function); + S2C_BYTE_BUFFER_PACKET_HANDLERS.put(id, function); + } + + private static void registerC2SByteBufPacketConsumer(final BiConsumer function, int id) { + if (id == -1) return; + C2S_BYTE_BUFFER_PACKET_HANDLERS.put(id, function); } private final BiConsumer> packetsConsumer; @@ -155,32 +161,32 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.RESOURCE_PACK_RESPONSE, Reflections.clazz$ServerboundResourcePackPacket); registerNMSPacketConsumer(PacketConsumers.ENTITY_EVENT, Reflections.clazz$ClientboundEntityEventPacket); registerNMSPacketConsumer(PacketConsumers.MOVE_POS_AND_ROTATE_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$PosRot); - registerByteBufPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, this.packetIds.clientboundLevelChunkWithLightPacket()); - registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); - registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_21_4() ? PacketConsumers.LEVEL_PARTICLE_1_21_4 : (VersionHelper.isOrAbove1_20_5() ? PacketConsumers.LEVEL_PARTICLE_1_20_5 : PacketConsumers.LEVEL_PARTICLE_1_20), this.packetIds.clientboundLevelParticlesPacket()); - registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_SUBTITLE_TEXT_1_20_3 : PacketConsumers.SET_SUBTITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_ACTIONBAR_TEXT_1_20_3 : PacketConsumers.SET_ACTIONBAR_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.TEAM_1_20_3 : PacketConsumers.TEAM_1_20, this.packetIds.clientboundSetPlayerTeamPacket()); - registerByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_OBJECTIVE_1_20_3 : PacketConsumers.SET_OBJECTIVE_1_20, this.packetIds.clientboundSetObjectivePacket()); - registerByteBufPacketConsumer(PacketConsumers.SET_SCORE_1_20_3, VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1); - registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); - registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); - registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); - registerByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket()); - registerByteBufPacketConsumer(PacketConsumers.CONTAINER_SET_CONTENT, this.packetIds.clientboundContainerSetContentPacket()); - registerByteBufPacketConsumer(PacketConsumers.CONTAINER_SET_SLOT, this.packetIds.clientboundContainerSetSlotPacket()); - registerByteBufPacketConsumer(PacketConsumers.SET_CURSOR_ITEM, this.packetIds.clientboundSetCursorItemPacket()); - registerByteBufPacketConsumer(PacketConsumers.SET_EQUIPMENT, this.packetIds.clientboundSetEquipmentPacket()); - registerByteBufPacketConsumer(PacketConsumers.SET_PLAYER_INVENTORY_1_21_2, this.packetIds.clientboundSetPlayerInventoryPacket()); - registerByteBufPacketConsumer(PacketConsumers.SET_CREATIVE_MODE_SLOT, this.packetIds.serverboundSetCreativeModeSlotPacket()); - registerByteBufPacketConsumer(PacketConsumers.CONTAINER_CLICK_1_20, this.packetIds.serverboundContainerClickPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, this.packetIds.clientboundLevelChunkWithLightPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_21_4() ? PacketConsumers.LEVEL_PARTICLE_1_21_4 : (VersionHelper.isOrAbove1_20_5() ? PacketConsumers.LEVEL_PARTICLE_1_20_5 : PacketConsumers.LEVEL_PARTICLE_1_20), this.packetIds.clientboundLevelParticlesPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_SUBTITLE_TEXT_1_20_3 : PacketConsumers.SET_SUBTITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_ACTIONBAR_TEXT_1_20_3 : PacketConsumers.SET_ACTIONBAR_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.TEAM_1_20_3 : PacketConsumers.TEAM_1_20, this.packetIds.clientboundSetPlayerTeamPacket()); + registerS2CByteBufPacketConsumer(VersionHelper.isOrAbove1_20_3() ? PacketConsumers.SET_OBJECTIVE_1_20_3 : PacketConsumers.SET_OBJECTIVE_1_20, this.packetIds.clientboundSetObjectivePacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.SET_SCORE_1_20_3, VersionHelper.isOrAbove1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1); + registerS2CByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.CONTAINER_SET_CONTENT, this.packetIds.clientboundContainerSetContentPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.CONTAINER_SET_SLOT, this.packetIds.clientboundContainerSetSlotPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.SET_CURSOR_ITEM, this.packetIds.clientboundSetCursorItemPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.SET_EQUIPMENT, this.packetIds.clientboundSetEquipmentPacket()); + registerS2CByteBufPacketConsumer(PacketConsumers.SET_PLAYER_INVENTORY_1_21_2, this.packetIds.clientboundSetPlayerInventoryPacket()); + registerC2SByteBufPacketConsumer(PacketConsumers.SET_CREATIVE_MODE_SLOT, this.packetIds.serverboundSetCreativeModeSlotPacket()); + registerC2SByteBufPacketConsumer(PacketConsumers.CONTAINER_CLICK_1_20, this.packetIds.serverboundContainerClickPacket()); } public static BukkitNetworkManager instance() { @@ -573,7 +579,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes int packetId = buf.readVarInt(); int preIndex = buf.readerIndex(); ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex); - BukkitNetworkManager.this.handleByteBufPacket(this.player, event); + BukkitNetworkManager.this.handleS2CByteBufPacket(this.player, event); if (event.isCancelled()) { buf.clear(); } else if (!event.changed()) { @@ -583,7 +589,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } } - public static class PluginChannelDecoder extends MessageToMessageDecoder { + public class PluginChannelDecoder extends MessageToMessageDecoder { private final NetWorkUser player; public PluginChannelDecoder(NetWorkUser player) { @@ -592,10 +598,30 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes @Override protected void decode(ChannelHandlerContext context, ByteBuf byteBuf, List list) { + this.onByteBufReceive(byteBuf); if (byteBuf.isReadable()) { list.add(byteBuf.retain()); } } + + private void onByteBufReceive(ByteBuf buffer) { + // I don't care packets before PLAY for the moment + if (player.decoderState() != ConnectionState.PLAY) return; + int size = buffer.readableBytes(); + if (size != 0) { + FriendlyByteBuf buf = new FriendlyByteBuf(buffer); + int preProcessIndex = buf.readerIndex(); + int packetId = buf.readVarInt(); + int preIndex = buf.readerIndex(); + ByteBufPacketEvent event = new ByteBufPacketEvent(packetId, buf, preIndex); + BukkitNetworkManager.this.handleC2SByteBufPacket(this.player, event); + if (event.isCancelled()) { + buf.clear(); + } else if (!event.changed()) { + buf.readerIndex(preProcessIndex); + } + } + } } private void onNMSPacketReceive(NetWorkUser user, NMSPacketEvent event, Object packet) { @@ -618,9 +644,15 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes .ifPresent(function -> function.accept(user, event, packet)); } - protected void handleByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { + protected void handleS2CByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { int packetID = event.packetID(); - Optional.ofNullable(BYTE_BUFFER_PACKET_HANDLERS.get(packetID)) + Optional.ofNullable(S2C_BYTE_BUFFER_PACKET_HANDLERS.get(packetID)) + .ifPresent(function -> function.accept(user, event)); + } + + protected void handleC2SByteBufPacket(NetWorkUser user, ByteBufPacketEvent event) { + int packetID = event.packetID(); + Optional.ofNullable(C2S_BYTE_BUFFER_PACKET_HANDLERS.get(packetID)) .ifPresent(function -> function.accept(user, event)); } 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 919f8c62b..51d20ad81 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 @@ -366,6 +366,21 @@ public class AbstractItem, I> implements Item { this.factory.setComponent(this.item, type, value); } + @Override + public void setJavaComponent(Object type, Object value) { + this.factory.setJavaComponent(this.item, type, value); + } + + @Override + public void setJsonComponent(Object type, JsonElement value) { + this.factory.setJsonComponent(this.item, type, value); + } + + @Override + public void setNBTComponent(Object type, Tag value) { + this.factory.setNBTComponent(this.item, type, value); + } + @Override public void resetComponent(Object type) { this.factory.resetComponent(this.item, type); 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 e2c005e07..97770fd37 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 @@ -151,6 +151,12 @@ public interface Item { void setComponent(Object type, Object value); + void setJavaComponent(Object type, Object value); + + void setJsonComponent(Object type, JsonElement value); + + void setNBTComponent(Object type, Tag value); + void resetComponent(Object type); I getItem(); 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 ea15a3823..04777f90e 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 @@ -185,4 +185,10 @@ public abstract class ItemFactory, I> { protected abstract Optional equippable(W item); protected abstract byte[] toByteArray(W item); + + protected abstract void setJavaComponent(W item, Object type, Object value); + + protected abstract void setJsonComponent(W item, Object type, JsonElement value); + + protected abstract void setNBTComponent(W item, Object type, Tag value); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java index c1abe066b..9760a00e4 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java +++ b/core/src/main/java/net/momirealms/craftengine/core/util/AdventureHelper.java @@ -175,6 +175,14 @@ public class AdventureHelper { return getInstance().gsonComponentSerializer.deserializeFromTree(json); } + public static Component nbtToComponent(Tag tag) { + return getInstance().nbtComponentSerializer.deserialize(tag); + } + + public static Tag componentToNbt(Component component) { + return getInstance().nbtComponentSerializer.serialize(component); + } + /** * Converts a Component to a JSON string. * diff --git a/gradle.properties b/gradle.properties index 4a1852463..601a89f27 100644 --- a/gradle.properties +++ b/gradle.properties @@ -39,7 +39,7 @@ geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 commons_imaging_version=1.0.0-alpha6 -sparrow_nbt_version=0.8.1 +sparrow_nbt_version=0.8.2 sparrow_util_version=0.47 fastutil_version=8.5.15 netty_version=4.1.121.Final diff --git a/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java b/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java deleted file mode 100644 index 4fae02230..000000000 --- a/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.momirealms.craftengine.mod.item; - -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.function.Function; - -public class CustomStreamCodec { - public static Function clientBoundDataProcessor; - public static Function serverBoundDataProcessor; - - public static @NotNull ItemStack s2c(@NotNull ItemStack itemStack) { - if (clientBoundDataProcessor != null) { - itemStack = clientBoundDataProcessor.apply(itemStack); - } - return itemStack; - } - - public static @NotNull ItemStack c2s(@NotNull ItemStack itemStack) { - if (serverBoundDataProcessor != null) { - itemStack = serverBoundDataProcessor.apply(itemStack); - } - return itemStack; - } -} \ No newline at end of file diff --git a/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/mixin/FriendlyByteBufMixin.java b/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/mixin/FriendlyByteBufMixin.java deleted file mode 100644 index 2e3fae0e7..000000000 --- a/server-mod/v1_20_1/src/main/java/net/momirealms/craftengine/mod/mixin/FriendlyByteBufMixin.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.momirealms.craftengine.mod.mixin; - -import com.llamalad7.mixinextras.injector.ModifyReturnValue; -import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.world.item.ItemStack; -import net.momirealms.craftengine.mod.item.CustomStreamCodec; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyVariable; - -@Mixin(value = FriendlyByteBuf.class) -public class FriendlyByteBufMixin { - - @ModifyVariable( - method = "a(Lnet/minecraft/world/item/ItemStack;)Lnet/minecraft/network/PacketDataSerializer;", - at = @At("HEAD"), - argsOnly = true - ) - private ItemStack modifyWriteItemParam(ItemStack stack) { - return stack.isEmpty() ? stack : CustomStreamCodec.s2c(stack); - } - - @ModifyReturnValue( - method = "r()Lnet/minecraft/world/item/ItemStack;", - at = @At("RETURN") - ) - private ItemStack modifyReadItemStack(ItemStack original) { - return original.isEmpty() ? original : CustomStreamCodec.c2s(original); - } -} diff --git a/server-mod/v1_20_1/src/main/resources/mixins.craftengine.json b/server-mod/v1_20_1/src/main/resources/mixins.craftengine.json index b6396bab4..69e19f9d0 100644 --- a/server-mod/v1_20_1/src/main/resources/mixins.craftengine.json +++ b/server-mod/v1_20_1/src/main/resources/mixins.craftengine.json @@ -6,7 +6,6 @@ "target": "@env(DEFAULT)", "compatibilityLevel": "JAVA_21", "server": [ - "BlocksMixin", - "FriendlyByteBufMixin" + "BlocksMixin" ] } diff --git a/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java b/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java deleted file mode 100644 index 2d1a47861..000000000 --- a/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.momirealms.craftengine.mod.item; - -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; -import java.util.function.Function; - -public class CustomStreamCodec implements StreamCodec { - public static Function clientBoundDataProcessor; - public static Function serverBoundDataProcessor; - - private final StreamCodec original; - - public CustomStreamCodec(StreamCodec original) { - this.original = Objects.requireNonNull(original); - } - - @Override - public @NotNull ItemStack decode(@NotNull RegistryFriendlyByteBuf buffer) { - ItemStack itemStack = this.original.decode(buffer); - if (!itemStack.isEmpty()) { - if (serverBoundDataProcessor != null) { - itemStack = serverBoundDataProcessor.apply(itemStack); - } - } - return itemStack; - } - - @Override - public void encode(@NotNull RegistryFriendlyByteBuf buffer, @NotNull ItemStack value) { - if (!value.isEmpty()) { - if (clientBoundDataProcessor != null) { - value = clientBoundDataProcessor.apply(value); - } - } - this.original.encode(buffer, value); - } -} \ No newline at end of file diff --git a/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/mixin/ItemStackMixin.java b/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/mixin/ItemStackMixin.java deleted file mode 100644 index 726e9981d..000000000 --- a/server-mod/v1_20_5/src/main/java/net/momirealms/craftengine/mod/mixin/ItemStackMixin.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.momirealms.craftengine.mod.mixin; - -import net.minecraft.core.NonNullList; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.ItemStack; -import net.momirealms.craftengine.mod.item.CustomStreamCodec; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.List; - -@Mixin(ItemStack.class) -public abstract class ItemStackMixin { - @Shadow(remap = false) - @Mutable - public static StreamCodec OPTIONAL_STREAM_CODEC; - @Shadow(remap = false) - @Mutable - public static StreamCodec> OPTIONAL_LIST_STREAM_CODEC; - - private static StreamCodec ORIGINAL_OPTIONAL_STREAM_CODEC; - - @Inject( - method = "", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/world/item/ItemStack;OPTIONAL_STREAM_CODEC:Lnet/minecraft/network/codec/StreamCodec;", - opcode = Opcodes.PUTSTATIC, - shift = At.Shift.AFTER - ) - ) - private static void captureOriginalAfterAssignment(CallbackInfo ci) { - ORIGINAL_OPTIONAL_STREAM_CODEC = OPTIONAL_STREAM_CODEC; - } - - @Inject(method = "", at = @At("RETURN")) - private static void replaceStreamCodec(CallbackInfo ci) { - OPTIONAL_STREAM_CODEC = new CustomStreamCodec(ORIGINAL_OPTIONAL_STREAM_CODEC); - OPTIONAL_LIST_STREAM_CODEC = OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.collection(NonNullList::createWithCapacity)); - } -} diff --git a/server-mod/v1_20_5/src/main/resources/mixins.craftengine.json b/server-mod/v1_20_5/src/main/resources/mixins.craftengine.json index 288b6501f..69e19f9d0 100644 --- a/server-mod/v1_20_5/src/main/resources/mixins.craftengine.json +++ b/server-mod/v1_20_5/src/main/resources/mixins.craftengine.json @@ -6,7 +6,6 @@ "target": "@env(DEFAULT)", "compatibilityLevel": "JAVA_21", "server": [ - "BlocksMixin", - "ItemStackMixin" + "BlocksMixin" ] } diff --git a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java b/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java deleted file mode 100644 index 2d1a47861..000000000 --- a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/item/CustomStreamCodec.java +++ /dev/null @@ -1,41 +0,0 @@ -package net.momirealms.craftengine.mod.item; - -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.Objects; -import java.util.function.Function; - -public class CustomStreamCodec implements StreamCodec { - public static Function clientBoundDataProcessor; - public static Function serverBoundDataProcessor; - - private final StreamCodec original; - - public CustomStreamCodec(StreamCodec original) { - this.original = Objects.requireNonNull(original); - } - - @Override - public @NotNull ItemStack decode(@NotNull RegistryFriendlyByteBuf buffer) { - ItemStack itemStack = this.original.decode(buffer); - if (!itemStack.isEmpty()) { - if (serverBoundDataProcessor != null) { - itemStack = serverBoundDataProcessor.apply(itemStack); - } - } - return itemStack; - } - - @Override - public void encode(@NotNull RegistryFriendlyByteBuf buffer, @NotNull ItemStack value) { - if (!value.isEmpty()) { - if (clientBoundDataProcessor != null) { - value = clientBoundDataProcessor.apply(value); - } - } - this.original.encode(buffer, value); - } -} \ No newline at end of file diff --git a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/mixin/ItemStackMixin.java b/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/mixin/ItemStackMixin.java deleted file mode 100644 index 88bc5d916..000000000 --- a/server-mod/v1_21_5/src/main/java/net/momirealms/craftengine/mod/mixin/ItemStackMixin.java +++ /dev/null @@ -1,66 +0,0 @@ -package net.momirealms.craftengine.mod.mixin; - -import net.minecraft.core.NonNullList; -import net.minecraft.network.RegistryFriendlyByteBuf; -import net.minecraft.network.codec.ByteBufCodecs; -import net.minecraft.network.codec.StreamCodec; -import net.minecraft.world.item.ItemStack; -import net.momirealms.craftengine.mod.item.CustomStreamCodec; -import org.objectweb.asm.Opcodes; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Mutable; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.List; - -@Mixin(ItemStack.class) -public abstract class ItemStackMixin { - @Shadow(remap = false) - @Mutable - public static StreamCodec OPTIONAL_STREAM_CODEC; - @Shadow(remap = false) - @Mutable - public static StreamCodec> OPTIONAL_LIST_STREAM_CODEC; - @Shadow(remap = false) - @Mutable - public static StreamCodec OPTIONAL_UNTRUSTED_STREAM_CODEC; - - private static StreamCodec ORIGINAL_OPTIONAL_STREAM_CODEC; - private static StreamCodec ORIGINAL_OPTIONAL_UNTRUSTED_STREAM_CODEC; - - @Inject( - method = "", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/world/item/ItemStack;OPTIONAL_STREAM_CODEC:Lnet/minecraft/network/codec/StreamCodec;", - opcode = Opcodes.PUTSTATIC, - shift = At.Shift.AFTER - ) - ) - private static void captureOriginalAfterAssignment0(CallbackInfo ci) { - ORIGINAL_OPTIONAL_STREAM_CODEC = OPTIONAL_STREAM_CODEC; - } - - @Inject( - method = "", - at = @At( - value = "FIELD", - target = "Lnet/minecraft/world/item/ItemStack;OPTIONAL_UNTRUSTED_STREAM_CODEC:Lnet/minecraft/network/codec/StreamCodec;", - opcode = Opcodes.PUTSTATIC, - shift = At.Shift.AFTER - ) - ) - private static void captureOriginalAfterAssignment1(CallbackInfo ci) { - ORIGINAL_OPTIONAL_UNTRUSTED_STREAM_CODEC = OPTIONAL_UNTRUSTED_STREAM_CODEC; - } - - @Inject(method = "", at = @At("RETURN")) - private static void replaceStreamCodec(CallbackInfo ci) { - OPTIONAL_STREAM_CODEC = new CustomStreamCodec(ORIGINAL_OPTIONAL_STREAM_CODEC); - OPTIONAL_UNTRUSTED_STREAM_CODEC = new CustomStreamCodec(ORIGINAL_OPTIONAL_UNTRUSTED_STREAM_CODEC); - OPTIONAL_LIST_STREAM_CODEC = OPTIONAL_STREAM_CODEC.apply(ByteBufCodecs.collection(NonNullList::createWithCapacity)); - } -}