From 437b1bc991fa90e6448630d3c6797c2956fd5309 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 4 Aug 2025 20:04:46 +0800 Subject: [PATCH] =?UTF-8?q?refactor(network):=20=E9=87=8D=E5=86=99=201.21.?= =?UTF-8?q?5+=20=E7=89=88=E6=9C=AC=E5=AE=B9=E5=99=A8=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 3 +- .../plugin/network/PacketConsumers.java | 79 ++++++------------- .../minecraft/NetworkReflections.java | 9 +++ gradle.properties | 2 +- 4 files changed, 37 insertions(+), 56 deletions(-) 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 291e542c3..7b3928905 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 @@ -169,6 +169,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.FINISH_CONFIGURATION, NetworkReflections.clazz$ClientboundFinishConfigurationPacket); registerNMSPacketConsumer(PacketConsumers.LOGIN_FINISHED, NetworkReflections.clazz$ClientboundLoginFinishedPacket); registerNMSPacketConsumer(PacketConsumers.UPDATE_TAGS, NetworkReflections.clazz$ClientboundUpdateTagsPacket); + registerNMSPacketConsumer(PacketConsumers.CONTAINER_CLICK_1_21_5, VersionHelper.isOrAbove1_21_5() ? NetworkReflections.clazz$ServerboundContainerClickPacket : null); registerS2CByteBufPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, this.packetIds.clientboundLevelChunkWithLightPacket()); registerS2CByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); registerS2CByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); @@ -198,7 +199,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes 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(VersionHelper.isOrAbove1_21_5() ? PacketConsumers.CONTAINER_CLICK_1_21_5 : PacketConsumers.CONTAINER_CLICK_1_20, this.packetIds.serverboundContainerClickPacket()); + registerC2SByteBufPacketConsumer(PacketConsumers.CONTAINER_CLICK_1_20, VersionHelper.isOrAbove1_21_5() ? -1 : this.packetIds.serverboundContainerClickPacket()); registerC2SByteBufPacketConsumer(PacketConsumers.INTERACT_ENTITY, this.packetIds.serverboundInteractPacket()); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index 298009399..34d910efb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -2237,63 +2237,34 @@ public class PacketConsumers { } }; - public static final BiConsumer CONTAINER_CLICK_1_21_5 = (user, event) -> { + // 因为不能走编码器只能替换对象 + public static final TriConsumer CONTAINER_CLICK_1_21_5 = (user, event, packet) -> { try { - FriendlyByteBuf buf = event.getBuffer(); - boolean changed = false; - Object friendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); - Object inventory = FastNMS.INSTANCE.method$Player$getInventory(user.serverPlayer()); - int containerId = buf.readContainerId(); - int stateId = buf.readVarInt(); - short slotNum = buf.readShort(); - byte buttonNum = buf.readByte(); - int clickType = buf.readVarInt(); - int i = buf.readVarInt(); - Int2ObjectMap changedSlots = new Int2ObjectOpenHashMap<>(i); - for (int j = 0; j < i; ++j) { - int k = buf.readShort(); - Object hashedStack = FastNMS.INSTANCE.method$StreamDecoder$decode(NetworkReflections.instance$HashedStack$STREAM_CODEC, friendlyBuf); - Object serverSideItemStack = FastNMS.INSTANCE.method$Container$getItem(inventory, k); - Optional optional = BukkitItemManager.instance().s2c(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(serverSideItemStack).clone(), ((net.momirealms.craftengine.core.entity.player.Player) user)); - if (optional.isPresent()) { - Object clientSideItemStack = FastNMS.INSTANCE.field$CraftItemStack$handle(optional.get()); - boolean isSync = FastNMS.INSTANCE.method$HashedStack$matches(hashedStack, clientSideItemStack, BukkitItemManager.instance().decoratedHashOpsGenerator()); - if (isSync) { - changed = true; - hashedStack = FastNMS.INSTANCE.method$HashedStack$create(serverSideItemStack, BukkitItemManager.instance().decoratedHashOpsGenerator()); - } - } - changedSlots.put(k, hashedStack); + var player = (net.momirealms.craftengine.core.entity.player.Player) user; + int containerId = FastNMS.INSTANCE.field$ServerboundContainerClickPacket$containerId(packet); + int stateId = FastNMS.INSTANCE.field$ServerboundContainerClickPacket$stateId(packet); + short slotNum = FastNMS.INSTANCE.field$ServerboundContainerClickPacket$slotNum(packet); + byte buttonNum = FastNMS.INSTANCE.field$ServerboundContainerClickPacket$buttonNum(packet); + Object clickType = FastNMS.INSTANCE.field$ServerboundContainerClickPacket$clickType(packet); + @SuppressWarnings("unchecked") + Int2ObjectMap changedSlots = FastNMS.INSTANCE.field$ServerboundContainerClickPacket$changedSlots(packet); + Int2ObjectMap newChangedSlots = new Int2ObjectOpenHashMap<>(); + for (Int2ObjectMap.Entry entry : changedSlots.int2ObjectEntrySet()) { + Object hashedStack = entry.getValue(); + if (!NetworkReflections.clazz$HashedStack$ActualItem.isInstance(hashedStack)) continue; + Object item = FastNMS.INSTANCE.method$ActualItem$item(hashedStack); + int count = FastNMS.INSTANCE.method$ActualItem$count(hashedStack); + Object components = FastNMS.INSTANCE.method$ActualItem$components(hashedStack); + newChangedSlots.put(entry.getIntKey(), FastNMS.INSTANCE.constructor$InjectedHashedStack(item, count, components, player)); } - Object carriedHashedStack = FastNMS.INSTANCE.method$StreamDecoder$decode(NetworkReflections.instance$HashedStack$STREAM_CODEC, friendlyBuf); - Object containerMenu = FastNMS.INSTANCE.field$Player$containerMenu(user.serverPlayer()); - Object serverSideCarriedItemStack = FastNMS.INSTANCE.method$AbstractContainerMenu$getCarried(containerMenu); - Optional optional = BukkitItemManager.instance().s2c(FastNMS.INSTANCE.method$CraftItemStack$asCraftMirror(serverSideCarriedItemStack).clone(), ((net.momirealms.craftengine.core.entity.player.Player) user)); - if (optional.isPresent()) { - Object clientSideCarriedItemStack = FastNMS.INSTANCE.field$CraftItemStack$handle(optional.get()); - boolean isSync = FastNMS.INSTANCE.method$HashedStack$matches(carriedHashedStack, clientSideCarriedItemStack, BukkitItemManager.instance().decoratedHashOpsGenerator()); - if (isSync) { - changed = true; - carriedHashedStack = FastNMS.INSTANCE.method$HashedStack$create(serverSideCarriedItemStack, BukkitItemManager.instance().decoratedHashOpsGenerator()); - } - } - if (changed) { - event.setChanged(true); - buf.clear(); - buf.writeVarInt(event.packetID()); - buf.writeContainerId(containerId); - buf.writeVarInt(stateId); - buf.writeShort(slotNum); - buf.writeByte(buttonNum); - buf.writeVarInt(clickType); - buf.writeVarInt(changedSlots.size()); - Object newFriendlyBuf = FastNMS.INSTANCE.constructor$FriendlyByteBuf(buf); - changedSlots.forEach((k, v) -> { - buf.writeShort(k); - FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$HashedStack$STREAM_CODEC, newFriendlyBuf, v); - }); - FastNMS.INSTANCE.method$StreamEncoder$encode(NetworkReflections.instance$HashedStack$STREAM_CODEC, newFriendlyBuf, carriedHashedStack); + Object carriedItem = FastNMS.INSTANCE.field$ServerboundContainerClickPacket$carriedItem(packet); + if (NetworkReflections.clazz$HashedStack$ActualItem.isInstance(carriedItem)) { + Object item = FastNMS.INSTANCE.method$ActualItem$item(carriedItem); + int count = FastNMS.INSTANCE.method$ActualItem$count(carriedItem); + Object components = FastNMS.INSTANCE.method$ActualItem$components(carriedItem); + carriedItem = FastNMS.INSTANCE.constructor$InjectedHashedStack(item, count, components, player); } + event.replacePacket(FastNMS.INSTANCE.constructor$ServerboundContainerClickPacket(containerId, stateId, slotNum, buttonNum, clickType, newChangedSlots, carriedItem)); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ServerboundContainerClickPacket", e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java index 6c11c869e..5bb4bd47d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/reflection/minecraft/NetworkReflections.java @@ -1646,4 +1646,13 @@ public final class NetworkReflections { public static final Constructor constructor$UnknownPayload = Optional.ofNullable(clazz$UnknownPayload) .map(ReflectionUtils::getTheOnlyConstructor) .orElse(null); + + // 1.21.5+ + public static final Class clazz$HashedStack$ActualItem = MiscUtils.requireNonNullIf( + BukkitReflectionUtils.findReobfOrMojmapClass( + "network.HashedStack$a", + "network.HashedStack$ActualItem" + ), + VersionHelper.isOrAbove1_21_5() + ); } diff --git a/gradle.properties b/gradle.properties index 7399a1fc1..fef1459a3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -50,7 +50,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.18 -nms_helper_version=1.0.52 +nms_helper_version=1.0.53 evalex_version=3.5.0 reactive_streams_version=1.0.4 amazon_awssdk_version=2.31.23