From 8b894c088c2b8149a29353aec5b38ba0a17dd247 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 11:10:16 +0800 Subject: [PATCH 01/16] =?UTF-8?q?refactor(network):=20=E9=A2=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9SYNC=5FENTITY=5FPOSITION?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 2 ++ .../plugin/network/PacketConsumers.java | 21 +++++++++++++------ .../bukkit/plugin/network/PacketIds.java | 2 ++ .../plugin/network/impl/PacketIdFinder.java | 2 +- .../plugin/network/impl/PacketIds1_20.java | 5 +++++ .../plugin/network/impl/PacketIds1_20_2.java | 5 +++++ .../plugin/network/impl/PacketIds1_20_3.java | 5 +++++ .../plugin/network/impl/PacketIds1_20_5.java | 5 +++++ .../plugin/network/impl/PacketIds1_21.java | 5 +++++ 9 files changed, 45 insertions(+), 7 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 b1c8bc67f..8b55761d7 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 @@ -46,6 +46,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } private static void registerByteBufPacketConsumer(final BiConsumer function, int id) { + if (id == -1) return; BYTE_BUFFER_PACKET_HANDLERS.put(id, function); } @@ -156,6 +157,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket()); + // registerByteBufPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, this.packetIds.clientboundEntityPositionSyncPacket()); } public static BukkitNetworkManager instance() { 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 c99cf53b3..14a37b6e3 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 @@ -243,10 +243,10 @@ public class PacketConsumers { public static final BiConsumer OPEN_SCREEN = (user, event) -> { try { + FriendlyByteBuf buf = event.getBuffer(); + int containerId = buf.readVarInt(); + int type = buf.readVarInt(); if (VersionHelper.isVersionNewerThan1_20_3()) { - FriendlyByteBuf buf = event.getBuffer(); - int containerId = buf.readVarInt(); - int type = buf.readVarInt(); Tag nbt = buf.readNbt(false); if (nbt == null) return; Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); @@ -261,9 +261,6 @@ public class PacketConsumers { buf.writeVarInt(type); buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); } else { - FriendlyByteBuf buf = event.getBuffer(); - int containerId = buf.readVarInt(); - int type = buf.readVarInt(); String json = buf.readUtf(); Map tokens = CraftEngine.instance().imageManager().matchTags(json); if (tokens.isEmpty()) return; @@ -695,6 +692,17 @@ public class PacketConsumers { // 1.21.3+ // TODO USE bytebuffer + // public static final BiConsumer OPEN_SCREEN = (user, event) -> { + // try { + // FriendlyByteBuf buf = event.getBuffer(); + // int entityId = buf.readVarInt(); + // if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { + // event.setCancelled(true); + // } + // } catch (Exception e) { + // CraftEngine.instance().logger().warn("Failed to handle ClientboundEntityPositionSyncPacket", e); + // } + // }; public static final TriConsumer SYNC_ENTITY_POSITION = (user, event, packet) -> { try { int entityId = (int) Reflections.field$ClientboundEntityPositionSyncPacket$id.get(packet); @@ -1001,6 +1009,7 @@ public class PacketConsumers { ); user.nettyChannel().writeAndFlush(kickPacket); user.nettyChannel().disconnect(); + return; } user.setClientModState(true); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index ca7338f6b..d560aa1d1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -13,4 +13,6 @@ public interface PacketIds { int clientboundAddEntityPacket(); int clientboundOpenScreenPacket(); + + int clientboundEntityPositionSyncPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIdFinder.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIdFinder.java index d7db35e57..eea73d2ec 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIdFinder.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIdFinder.java @@ -28,6 +28,6 @@ public class PacketIdFinder { } public static int clientboundByName(String packetName) { - return gamePacketIds.get("clientbound").get(packetName); + return gamePacketIds.get("clientbound").getOrDefault(packetName, -1); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index e833e4d8c..4a501c330 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -33,4 +33,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundOpenScreenPacket() { return 48; } + + @Override + public int clientboundEntityPositionSyncPacket() { + return -1; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index c4d740242..ff30aa2ca 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -33,4 +33,9 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundOpenScreenPacket() { return 49; } + + @Override + public int clientboundEntityPositionSyncPacket() { + return -1; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index c18291673..284377e77 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -33,4 +33,9 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundOpenScreenPacket() { return 49; } + + @Override + public int clientboundEntityPositionSyncPacket() { + return -1; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index 70e909fd6..ef0f54612 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -33,4 +33,9 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundOpenScreenPacket() { return 51; } + + @Override + public int clientboundEntityPositionSyncPacket() { + return -1; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index 8d1417f2a..41afe8ae1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -33,4 +33,9 @@ public class PacketIds1_21 implements PacketIds { public int clientboundOpenScreenPacket() { return PacketIdFinder.clientboundByName("minecraft:open_screen"); } + + @Override + public int clientboundEntityPositionSyncPacket() { + return PacketIdFinder.clientboundByName("minecraft:entity_position_sync"); + } } From 74743ee25b2fec40c7597e353c98c91aa108b03c Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 11:11:27 +0800 Subject: [PATCH 02/16] =?UTF-8?q?refactor(network):=20=E9=A2=84=E4=BF=AE?= =?UTF-8?q?=E6=94=B9SYNC=5FENTITY=5FPOSITION?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/network/PacketConsumers.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 14a37b6e3..dd843561a 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 @@ -697,7 +697,7 @@ public class PacketConsumers { // FriendlyByteBuf buf = event.getBuffer(); // int entityId = buf.readVarInt(); // if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { - // event.setCancelled(true); + // event.setCancelled(true); // 这里炸了导致无法实现 // } // } catch (Exception e) { // CraftEngine.instance().logger().warn("Failed to handle ClientboundEntityPositionSyncPacket", e); From 1e8b7e0607e0d42a2ba893e4bad7a8837ef3eb46 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 18:17:17 +0800 Subject: [PATCH 03/16] =?UTF-8?q?refactor(network):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=9B=B8=E5=85=B3=E7=9A=84=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E5=8C=85=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 | 9 ++- .../plugin/network/PacketConsumers.java | 78 ++++++++++++------- .../bukkit/plugin/network/PacketIds.java | 2 + .../plugin/network/impl/PacketIds1_20.java | 5 ++ .../plugin/network/impl/PacketIds1_20_2.java | 5 ++ .../plugin/network/impl/PacketIds1_20_3.java | 5 ++ .../plugin/network/impl/PacketIds1_20_5.java | 5 ++ .../plugin/network/impl/PacketIds1_21.java | 5 ++ .../craftengine/bukkit/util/Reflections.java | 18 +++++ gradle.properties | 2 +- 10 files changed, 101 insertions(+), 33 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 8b55761d7..4cb0324bf 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 @@ -141,7 +141,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.LOGIN, Reflections.clazz$ClientboundLoginPacket); registerNMSPacketConsumer(PacketConsumers.RESPAWN, Reflections.clazz$ClientboundRespawnPacket); registerNMSPacketConsumer(PacketConsumers.INTERACT_ENTITY, Reflections.clazz$ServerboundInteractPacket); - registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket); + // registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket); registerNMSPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, Reflections.clazz$ClientboundEntityPositionSyncPacket); registerNMSPacketConsumer(PacketConsumers.MOVE_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$Pos); registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_ENTITY, Reflections.clazz$ServerboundPickItemFromEntityPacket); @@ -157,7 +157,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket()); - // registerByteBufPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, this.packetIds.clientboundEntityPositionSyncPacket()); + registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); + registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); } public static BukkitNetworkManager instance() { @@ -483,7 +484,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } if (byteBuf.isReadable()) { list.add(byteBuf.retain()); - } + }/* else { + list.add(io.netty.buffer.Unpooled.EMPTY_BUFFER); + }*/ } private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { 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 dd843561a..3f23869ae 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 @@ -652,18 +652,54 @@ public class PacketConsumers { Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)); } - // TODO USE bytebuffer + public static final BiConsumer ADD_ENTITY_BYTEBUFFER = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + int id = buf.readVarInt(); + UUID uuid = buf.readUUID(); + int type = buf.readVarInt(); + double x = buf.readDouble(); + double y = buf.readDouble(); + double z = buf.readDouble(); + byte xRot = buf.readByte(); + byte yRot = buf.readByte(); + byte yHeadRot = buf.readByte(); + int data = buf.readVarInt(); + int xa = buf.readShort(); + int ya = buf.readShort(); + int za = buf.readShort(); + // Falling blocks + if (type == Reflections.instance$EntityType$FALLING_BLOCK$registryId) { + int remapped = remap(data); + if (remapped != data) { + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(id); + buf.writeUUID(uuid); + buf.writeVarInt(type); + buf.writeDouble(x); + buf.writeDouble(y); + buf.writeDouble(z); + buf.writeByte(xRot); + buf.writeByte(yRot); + buf.writeByte(yHeadRot); + buf.writeVarInt(remapped); + buf.writeShort(xa); + buf.writeShort(ya); + buf.writeShort(za); + } + } else if (type == Reflections.instance$EntityType$BLOCK_DISPLAY$registryId) { + user.entityView().put(id, Reflections.instance$EntityType$BLOCK_DISPLAY); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); + } + }; + public static final TriConsumer ADD_ENTITY = (user, event, packet) -> { try { Object entityType = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$type(packet); - // Falling blocks - if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { - int data = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$data(packet); - int remapped = remap(data); - if (remapped != data) { - Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); - } - } else if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { + if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { // Furniture int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId); @@ -681,9 +717,6 @@ public class PacketConsumers { if (furniture != null) { event.setCancelled(true); } - } else if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { - int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); - user.entityView().put(entityId, entityType); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); @@ -691,21 +724,9 @@ public class PacketConsumers { }; // 1.21.3+ - // TODO USE bytebuffer - // public static final BiConsumer OPEN_SCREEN = (user, event) -> { - // try { - // FriendlyByteBuf buf = event.getBuffer(); - // int entityId = buf.readVarInt(); - // if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { - // event.setCancelled(true); // 这里炸了导致无法实现 - // } - // } catch (Exception e) { - // CraftEngine.instance().logger().warn("Failed to handle ClientboundEntityPositionSyncPacket", e); - // } - // }; public static final TriConsumer SYNC_ENTITY_POSITION = (user, event, packet) -> { try { - int entityId = (int) Reflections.field$ClientboundEntityPositionSyncPacket$id.get(packet); + int entityId = FastNMS.INSTANCE.method$ClientboundEntityPositionSyncPacket$id(packet); if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { event.setCancelled(true); } @@ -714,7 +735,6 @@ public class PacketConsumers { } }; - // TODO USE bytebuffer public static final TriConsumer MOVE_ENTITY = (user, event, packet) -> { try { int entityId = (int) Reflections.field$ClientboundMoveEntityPacket$entityId.get(packet); @@ -726,10 +746,10 @@ public class PacketConsumers { } }; - // TODO USE bytebuffer - public static final TriConsumer REMOVE_ENTITY = (user, event, packet) -> { + public static final BiConsumer REMOVE_ENTITY = (user, event) -> { try { - IntList intList = FastNMS.INSTANCE.field$ClientboundRemoveEntitiesPacket$entityIds(packet); + FriendlyByteBuf buf = event.getBuffer(); + IntList intList = buf.readIntIdList(); for (int i = 0, size = intList.size(); i < size; i++) { List entities = user.furnitureView().remove(intList.getInt(i)); if (entities == null) continue; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index d560aa1d1..92bd4c108 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -15,4 +15,6 @@ public interface PacketIds { int clientboundOpenScreenPacket(); int clientboundEntityPositionSyncPacket(); + + int clientboundRemoveEntitiesPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index 4a501c330..b299a92c5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -38,4 +38,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return -1; } + + @Override + public int clientboundRemoveEntitiesPacket() { + return 62; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index ff30aa2ca..e4774319e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -38,4 +38,9 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return -1; } + + @Override + public int clientboundRemoveEntitiesPacket() { + return 64; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index 284377e77..4d1a66b7d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -38,4 +38,9 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return -1; } + + @Override + public int clientboundRemoveEntitiesPacket() { + return 64; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index ef0f54612..df520e0f3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -38,4 +38,9 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return -1; } + + @Override + public int clientboundRemoveEntitiesPacket() { + return 66; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index 41afe8ae1..48b07e5fd 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -38,4 +38,9 @@ public class PacketIds1_21 implements PacketIds { public int clientboundEntityPositionSyncPacket() { return PacketIdFinder.clientboundByName("minecraft:entity_position_sync"); } + + @Override + public int clientboundRemoveEntitiesPacket() { + return PacketIdFinder.clientboundByName("minecraft:remove_entities"); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 46cdb16c4..487d633b3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -6264,4 +6264,22 @@ public class Reflections { public static final Field field$ClientInformation$particleStatus = Optional.ofNullable(clazz$ClientInformation) .map(it -> ReflectionUtils.getDeclaredField(it, 8)) .orElse(null); + + public static final Method method$Registry$getId = requireNonNull( + ReflectionUtils.getMethod(clazz$Registry, int.class, Object.class) + ); + + public static final int instance$EntityType$FALLING_BLOCK$registryId; + public static final int instance$EntityType$BLOCK_DISPLAY$registryId; + + static { + try { + Object blockDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "block_display"); + instance$EntityType$BLOCK_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, blockDisplay); + Object fallingBlock = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "falling_block"); + instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, fallingBlock); + } catch (Exception e) { + throw new RuntimeException(e); + } + } } diff --git a/gradle.properties b/gradle.properties index a80c87bb7..700cc6878 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.13 -nms_helper_version=0.43 +nms_helper_version=0.44 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7 From 3b8141c05691e35040956208127ecb414d974727 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 7 Apr 2025 18:41:34 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E5=A2=9E=E5=BC=BAmove=20packet=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/injector/BukkitInjector.java | 46 +++++++++++++++++++ .../injector/InternalFieldAccessor.java | 6 +++ .../plugin/network/PacketConsumers.java | 3 +- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/InternalFieldAccessor.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index def463fba..c3bfcf3d3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -3,16 +3,25 @@ package net.momirealms.craftengine.bukkit.plugin.injector; import com.mojang.datafixers.util.Pair; import net.bytebuddy.ByteBuddy; import net.bytebuddy.ClassFileVersion; +import net.bytebuddy.description.field.FieldDescription; +import net.bytebuddy.description.method.ParameterDescription; import net.bytebuddy.description.modifier.Visibility; +import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; +import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.dynamic.scaffold.subclass.ConstructorStrategy; import net.bytebuddy.implementation.FieldAccessor; import net.bytebuddy.implementation.FixedValue; +import net.bytebuddy.implementation.Implementation; import net.bytebuddy.implementation.MethodDelegation; import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.SuperCall; import net.bytebuddy.implementation.bind.annotation.This; +import net.bytebuddy.implementation.bytecode.assign.TypeCasting; +import net.bytebuddy.implementation.bytecode.member.FieldAccess; +import net.bytebuddy.implementation.bytecode.member.MethodReturn; +import net.bytebuddy.implementation.bytecode.member.MethodVariableAccess; import net.bytebuddy.matcher.ElementMatchers; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.block.BukkitBlockShape; @@ -54,6 +63,7 @@ import java.lang.invoke.MethodType; import java.lang.invoke.VarHandle; import java.lang.reflect.Constructor; import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -82,6 +92,8 @@ public class BukkitInjector { private static Class clazz$InjectedCacheChecker; + private static InternalFieldAccessor internalFieldAccessor; + public static void init() { try { // Paletted Container @@ -149,6 +161,36 @@ public class BukkitInjector { .getLoaded(); instance$OptimizedItemDisplayFactory = Objects.requireNonNull(ReflectionUtils.getConstructor(clazz$OptimizedItemDisplayFatory, 0)).newInstance(); + // InternalFieldAccessor Interface + Class internalFieldAccessorInterface = new ByteBuddy() + .makeInterface() + .name("net.momirealms.craftengine.bukkit.plugin.injector.InternalFieldAccessor") + .defineMethod("field$ClientboundMoveEntityPacket$entityId", int.class, Modifier.PUBLIC) + .withParameter(Object.class, "packet") + .withoutCode() + .make() + .load(Reflections.clazz$ClientboundMoveEntityPacket.getClassLoader(), ClassLoadingStrategy.Default.INJECTION) + .getLoaded(); + + // Internal field accessor + FieldDescription moveEntityIdFieldDesc = new FieldDescription.ForLoadedField(Reflections.field$ClientboundMoveEntityPacket$entityId); + Class clazz$InternalFieldAccessor = byteBuddy + .subclass(Object.class) + .name("net.minecraft.network.protocol.game.CraftEngineInternalFieldAccessor") + .implement(internalFieldAccessorInterface) + .method(ElementMatchers.named("field$ClientboundMoveEntityPacket$entityId")) + .intercept(new Implementation.Simple( + MethodVariableAccess.REFERENCE.loadFrom(1), + TypeCasting.to(TypeDescription.ForLoadedType.of(Reflections.clazz$ClientboundMoveEntityPacket)), + FieldAccess.forField(moveEntityIdFieldDesc).read(), + MethodReturn.INTEGER + )) + .make() + .load(Reflections.clazz$ClientboundMoveEntityPacket.getClassLoader(), ClassLoadingStrategy.Default.INJECTION) + .getLoaded(); + internalFieldAccessor = (InternalFieldAccessor) clazz$InternalFieldAccessor.getConstructor().newInstance(); + + // CraftEngine Blocks String packageWithName = BukkitInjector.class.getName(); String generatedClassName = packageWithName.substring(0, packageWithName.lastIndexOf('.')) + ".CraftEngineBlock"; DynamicType.Builder builder = byteBuddy @@ -293,6 +335,10 @@ public class BukkitInjector { } } + public static InternalFieldAccessor internalFieldAccessor() { + return internalFieldAccessor; + } + public static void injectCookingBlockEntity(Object entity) throws ReflectiveOperationException { if (Reflections.clazz$AbstractFurnaceBlockEntity.isInstance(entity)) { Object quickCheck = Reflections.field$AbstractFurnaceBlockEntity$quickCheck.get(entity); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/InternalFieldAccessor.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/InternalFieldAccessor.java new file mode 100644 index 000000000..94c5f6be2 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/InternalFieldAccessor.java @@ -0,0 +1,6 @@ +package net.momirealms.craftengine.bukkit.plugin.injector; + +public interface InternalFieldAccessor { + + int field$ClientboundMoveEntityPacket$entityId(Object packet); +} 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 c99cf53b3..582ce1793 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 @@ -14,6 +14,7 @@ import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; +import net.momirealms.craftengine.bukkit.plugin.injector.BukkitInjector; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.*; import net.momirealms.craftengine.core.block.ImmutableBlockState; @@ -709,7 +710,7 @@ public class PacketConsumers { // TODO USE bytebuffer public static final TriConsumer MOVE_ENTITY = (user, event, packet) -> { try { - int entityId = (int) Reflections.field$ClientboundMoveEntityPacket$entityId.get(packet); + int entityId = BukkitInjector.internalFieldAccessor().field$ClientboundMoveEntityPacket$entityId(packet); if (BukkitFurnitureManager.instance().isFurnitureRealEntity(entityId)) { event.setCancelled(true); } From 0ae08a496a416be0965999e7f94b9baf1b7bb232 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 22:07:16 +0800 Subject: [PATCH 05/16] =?UTF-8?q?refactor(network):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=9B=B8=E5=85=B3=E7=9A=84=E7=BD=91=E7=BB=9C?= =?UTF-8?q?=E5=8C=85=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 | 6 +- .../plugin/network/PacketConsumers.java | 117 ++++++++++++------ .../bukkit/plugin/network/PacketIds.java | 4 +- .../plugin/network/impl/PacketIds1_20.java | 9 +- .../plugin/network/impl/PacketIds1_20_2.java | 9 +- .../plugin/network/impl/PacketIds1_20_3.java | 9 +- .../plugin/network/impl/PacketIds1_20_5.java | 9 +- .../plugin/network/impl/PacketIds1_21.java | 9 +- .../craftengine/bukkit/util/Reflections.java | 21 +++- 9 files changed, 140 insertions(+), 53 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 4cb0324bf..5a247e1a2 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 @@ -141,7 +141,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.LOGIN, Reflections.clazz$ClientboundLoginPacket); registerNMSPacketConsumer(PacketConsumers.RESPAWN, Reflections.clazz$ClientboundRespawnPacket); registerNMSPacketConsumer(PacketConsumers.INTERACT_ENTITY, Reflections.clazz$ServerboundInteractPacket); - // registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket); + registerNMSPacketConsumer(PacketConsumers.REMOVE_ENTITY, Reflections.clazz$ClientboundRemoveEntitiesPacket); registerNMSPacketConsumer(PacketConsumers.SYNC_ENTITY_POSITION, Reflections.clazz$ClientboundEntityPositionSyncPacket); registerNMSPacketConsumer(PacketConsumers.MOVE_ENTITY, Reflections.clazz$ClientboundMoveEntityPacket$Pos); registerNMSPacketConsumer(PacketConsumers.PICK_ITEM_FROM_ENTITY, Reflections.clazz$ServerboundPickItemFromEntityPacket); @@ -157,8 +157,10 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket()); - registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); + // 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()); } public static BukkitNetworkManager instance() { 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 c997fa049..84a60b157 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 @@ -673,6 +673,7 @@ public class PacketConsumers { if (type == Reflections.instance$EntityType$FALLING_BLOCK$registryId) { int remapped = remap(data); if (remapped != data) { + event.setChanged(true); buf.clear(); buf.writeVarInt(event.packetID()); buf.writeVarInt(id); @@ -747,12 +748,13 @@ public class PacketConsumers { } }; - public static final BiConsumer REMOVE_ENTITY = (user, event) -> { + // TODO USE bytebuffer + public static final TriConsumer REMOVE_ENTITY = (user, event, packet) -> { try { - FriendlyByteBuf buf = event.getBuffer(); - IntList intList = buf.readIntIdList(); + IntList intList = FastNMS.INSTANCE.field$ClientboundRemoveEntitiesPacket$entityIds(packet); for (int i = 0, size = intList.size(); i < size; i++) { List entities = user.furnitureView().remove(intList.getInt(i)); + System.out.println("Removing " + entities); if (entities == null) continue; for (int entityId : entities) { intList.add(entityId); @@ -1039,38 +1041,83 @@ public class PacketConsumers { } }; - // TODO 使用bytebuffer -// public static final TriConsumer SET_ENTITY_DATA = (user, event, packet) -> { -// try { -// int id = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$id(packet); -// Object entityType = user.entityView().get(id); -// if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { -// List packedItems = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$packedItems(packet); -// for (int i = 0; i < packedItems.size(); i++) { -// Object packedItem = packedItems.get(i); -// int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); -// if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) { -// continue; -// } -// Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); -// int stateId = BlockStateUtils.blockStateToId(blockState); -// int newStateId; -// if (!user.clientModEnabled()) { -// newStateId = remap(stateId); -// } else { -// newStateId = remapMOD(stateId); -// } -// Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); -// packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( -// entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId) -// )); -// break; -// } -// } -// } catch (Exception e) { -// CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); -// } -// }; + + // TODO 需要修复 + // @SuppressWarnings("unchecked") + // public static final BiConsumer SET_ENTITY_DATA = (user, event) -> { + // try { + // FriendlyByteBuf buf = event.getBuffer(); + // int id = buf.readVarInt(); + // Object entityType = user.entityView().get(id); + // if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { + // Object registryFriendlyByteBuf = FastNMS.INSTANCE.constructor$RegistryFriendlyByteBuf(buf, Reflections.instance$registryAccess); + // boolean isChanged = false; + // List packedItems = (List) Reflections.method$ClientboundSetEntityDataPacket$unpack.invoke(null, registryFriendlyByteBuf); + // for (int i = 0; i < packedItems.size(); i++) { + // Object packedItem = packedItems.get(i); + // int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + // if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) { + // continue; + // } + // Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + // int stateId = BlockStateUtils.blockStateToId(blockState); + // int newStateId; + // if (!user.clientModEnabled()) { + // newStateId = remap(stateId); + // } else { + // newStateId = remapMOD(stateId); + // } + // Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + // packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( + // entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId) + // )); + // isChanged = true; + // break; + // } + // if (isChanged) { + // System.out.println("Changed"); + // event.setChanged(true); + // buf.clear(); + // buf.writeVarInt(event.packetID()); + // Reflections.method$ClientboundSetEntityDataPacket$pack.invoke(null, packedItems, registryFriendlyByteBuf); + // } + // } + // } catch (Exception e) { + // CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); + // } + // }; + // 之前的旧东西经供参考需要改成使用bytebuffer的 + // public static final TriConsumer SET_ENTITY_DATA = (user, event, packet) -> { + // try { + // int id = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$id(packet); + // Object entityType = user.entityView().get(id); + // if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { + // List packedItems = FastNMS.INSTANCE.field$ClientboundSetEntityDataPacket$packedItems(packet); + // for (int i = 0; i < packedItems.size(); i++) { + // Object packedItem = packedItems.get(i); + // int entityDataId = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$id(packedItem); + // if (entityDataId != EntityDataUtils.BLOCK_STATE_DATA_ID) { + // continue; + // } + // Object blockState = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$value(packedItem); + // int stateId = BlockStateUtils.blockStateToId(blockState); + // int newStateId; + // if (!user.clientModEnabled()) { + // newStateId = remap(stateId); + // } else { + // newStateId = remapMOD(stateId); + // } + // Object serializer = FastNMS.INSTANCE.field$SynchedEntityData$DataValue$serializer(packedItem); + // packedItems.set(i, FastNMS.INSTANCE.constructor$SynchedEntityData$DataValue( + // entityDataId, serializer, BlockStateUtils.idToBlockState(newStateId) + // )); + // break; + // } + // } + // } catch (Exception e) { + // CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); + // } + // }; // public static final TriConsumer OPEN_SCREEN = (user, event, packet) -> { // try { diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index 92bd4c108..bc89467c1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -14,7 +14,9 @@ public interface PacketIds { int clientboundOpenScreenPacket(); - int clientboundEntityPositionSyncPacket(); + int clientboundSoundPacket(); int clientboundRemoveEntitiesPacket(); + + int clientboundSetEntityDataPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index b299a92c5..418af0473 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -35,12 +35,17 @@ public class PacketIds1_20 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return -1; + public int clientboundSoundPacket() { + return 98; } @Override public int clientboundRemoveEntitiesPacket() { return 62; } + + @Override + public int clientboundSetEntityDataPacket() { + return 82; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index e4774319e..a79c2a0ea 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -35,12 +35,17 @@ public class PacketIds1_20_2 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return -1; + public int clientboundSoundPacket() { + return 100; } @Override public int clientboundRemoveEntitiesPacket() { return 64; } + + @Override + public int clientboundSetEntityDataPacket() { + return 84; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index 4d1a66b7d..dcae35e59 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -35,12 +35,17 @@ public class PacketIds1_20_3 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return -1; + public int clientboundSoundPacket() { + return 102; } @Override public int clientboundRemoveEntitiesPacket() { return 64; } + + @Override + public int clientboundSetEntityDataPacket() { + return 86; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index df520e0f3..d6da5f830 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -35,12 +35,17 @@ public class PacketIds1_20_5 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return -1; + public int clientboundSoundPacket() { + return 104; } @Override public int clientboundRemoveEntitiesPacket() { return 66; } + + @Override + public int clientboundSetEntityDataPacket() { + return 88; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index 48b07e5fd..944d99a1a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -35,12 +35,17 @@ public class PacketIds1_21 implements PacketIds { } @Override - public int clientboundEntityPositionSyncPacket() { - return PacketIdFinder.clientboundByName("minecraft:entity_position_sync"); + public int clientboundSoundPacket() { + return PacketIdFinder.clientboundByName("minecraft:sound"); } @Override public int clientboundRemoveEntitiesPacket() { return PacketIdFinder.clientboundByName("minecraft:remove_entities"); } + + @Override + public int clientboundSetEntityDataPacket() { + return PacketIdFinder.clientboundByName("minecraft:set_entity_data"); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index 487d633b3..282888557 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -6269,17 +6269,28 @@ public class Reflections { ReflectionUtils.getMethod(clazz$Registry, int.class, Object.class) ); - public static final int instance$EntityType$FALLING_BLOCK$registryId; public static final int instance$EntityType$BLOCK_DISPLAY$registryId; + public static final int instance$EntityType$FALLING_BLOCK$registryId; static { try { - Object blockDisplay = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "block_display"); - instance$EntityType$BLOCK_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, blockDisplay); - Object fallingBlock = method$ResourceLocation$fromNamespaceAndPath.invoke(null, "minecraft", "falling_block"); - instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, fallingBlock); + instance$EntityType$BLOCK_DISPLAY$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$BLOCK_DISPLAY); + instance$EntityType$FALLING_BLOCK$registryId = (int) Reflections.method$Registry$getId.invoke(Reflections.instance$BuiltInRegistries$ENTITY_TYPE, instance$EntityType$FALLING_BLOCK); } catch (Exception e) { throw new RuntimeException(e); } } + + // 先注释后面再说 + // public static final Method method$ClientboundSetEntityDataPacket$pack = requireNonNull( + // ReflectionUtils.getDeclaredMethod( + // clazz$ClientboundSetEntityDataPacket, void.class, List.class, clazz$RegistryFriendlyByteBuf + // ) + // ); + // + // public static final Method method$ClientboundSetEntityDataPacket$unpack = requireNonNull( + // ReflectionUtils.getDeclaredMethod( + // clazz$ClientboundSetEntityDataPacket, List.class, clazz$RegistryFriendlyByteBuf + // ) + // ); } From 3e17dd9e22c063e2219d79e81ac78dc0168ce999 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 22:11:28 +0800 Subject: [PATCH 06/16] =?UTF-8?q?clean(network):=20=E6=B8=85=E7=90=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/network/BukkitNetworkManager.java | 4 +--- .../craftengine/bukkit/plugin/network/PacketConsumers.java | 2 +- 2 files changed, 2 insertions(+), 4 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 5a247e1a2..bcb2ff7c4 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 @@ -486,9 +486,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } if (byteBuf.isReadable()) { list.add(byteBuf.retain()); - }/* else { - list.add(io.netty.buffer.Unpooled.EMPTY_BUFFER); - }*/ + } } private boolean handleCompression(ChannelHandlerContext ctx, ByteBuf buffer) { 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 84a60b157..7acfeea64 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 @@ -754,7 +754,6 @@ public class PacketConsumers { IntList intList = FastNMS.INSTANCE.field$ClientboundRemoveEntitiesPacket$entityIds(packet); for (int i = 0, size = intList.size(); i < size; i++) { List entities = user.furnitureView().remove(intList.getInt(i)); - System.out.println("Removing " + entities); if (entities == null) continue; for (int entityId : entities) { intList.add(entityId); @@ -1086,6 +1085,7 @@ public class PacketConsumers { // CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); // } // }; + // 之前的旧东西经供参考需要改成使用bytebuffer的 // public static final TriConsumer SET_ENTITY_DATA = (user, event, packet) -> { // try { From 3a8d1abbe8458f5262a2bd794ece6118a87f51f7 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 22:22:09 +0800 Subject: [PATCH 07/16] =?UTF-8?q?refactor(network):=20=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 2 +- .../bukkit/plugin/network/PacketConsumers.java | 14 +++++++++++++- 2 files changed, 14 insertions(+), 2 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 bcb2ff7c4..f0fba5cb7 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 @@ -158,7 +158,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket()); // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); - registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); + // registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); // registerByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket()); } 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 7acfeea64..aaec44bfb 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 @@ -701,7 +701,15 @@ public class PacketConsumers { public static final TriConsumer ADD_ENTITY = (user, event, packet) -> { try { Object entityType = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$type(packet); - if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { + // Falling blocks + if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { + // TODO USE bytebuffer + int data = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$data(packet); + int remapped = remap(data); + if (remapped != data) { + Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); + } + } else if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { // Furniture int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId); @@ -719,6 +727,10 @@ public class PacketConsumers { if (furniture != null) { event.setCancelled(true); } + } else if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { + // TODO USE bytebuffer + int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); + user.entityView().put(entityId, entityType); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); From 0a89eed2e5a5e93341b7a2e6506382db47f8e417 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 22:22:34 +0800 Subject: [PATCH 08/16] =?UTF-8?q?refactor(network):=20=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/network/PacketConsumers.java | 1 + 1 file changed, 1 insertion(+) 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 aaec44bfb..d5a417747 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 @@ -653,6 +653,7 @@ public class PacketConsumers { Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)); } + // TODO 需要修复 public static final BiConsumer ADD_ENTITY_BYTEBUFFER = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); From d6274fa0a2818b305db853d22d282bfbae8eab98 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 7 Apr 2025 22:35:52 +0800 Subject: [PATCH 09/16] =?UTF-8?q?refactor(network):=20=E5=9B=9E=E9=80=80?= =?UTF-8?q?=E5=9B=9E=E9=80=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 2 +- .../bukkit/plugin/network/PacketConsumers.java | 15 +-------------- 2 files changed, 2 insertions(+), 15 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 f0fba5cb7..bcb2ff7c4 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 @@ -158,7 +158,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket()); // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); - // registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); + registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); // registerByteBufPacketConsumer(PacketConsumers.SET_ENTITY_DATA, this.packetIds.clientboundSetEntityDataPacket()); } 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 d5a417747..7acfeea64 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 @@ -653,7 +653,6 @@ public class PacketConsumers { Reflections.field$ServerPlayer$connection.get(FastNMS.INSTANCE.method$CraftPlayer$getHandle(player)), FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)); } - // TODO 需要修复 public static final BiConsumer ADD_ENTITY_BYTEBUFFER = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); @@ -702,15 +701,7 @@ public class PacketConsumers { public static final TriConsumer ADD_ENTITY = (user, event, packet) -> { try { Object entityType = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$type(packet); - // Falling blocks - if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { - // TODO USE bytebuffer - int data = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$data(packet); - int remapped = remap(data); - if (remapped != data) { - Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); - } - } else if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { + if (entityType == Reflections.instance$EntityType$ITEM_DISPLAY) { // Furniture int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); LoadedFurniture furniture = BukkitFurnitureManager.instance().loadedFurnitureByRealEntityId(entityId); @@ -728,10 +719,6 @@ public class PacketConsumers { if (furniture != null) { event.setCancelled(true); } - } else if (entityType == Reflections.instance$EntityType$BLOCK_DISPLAY) { - // TODO USE bytebuffer - int entityId = FastNMS.INSTANCE.field$ClientboundAddEntityPacket$entityId(packet); - user.entityView().put(entityId, entityType); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); From 49960e1b6a24cd68aa92f6781929d8af88f9bb85 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 7 Apr 2025 23:54:00 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E7=A2=B0=E6=92=9E?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E6=8E=89=E8=90=BD=E7=89=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../furniture/FurnitureEventListener.java | 2 +- .../plugin/network/BukkitNetworkManager.java | 2 +- .../plugin/network/PacketConsumers.java | 65 ++++++++++--------- gradle.properties | 4 +- 4 files changed, 40 insertions(+), 33 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java index 18bfa8e42..23b69487d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java @@ -55,7 +55,7 @@ public class FurnitureEventListener implements Listener { if (entity instanceof ItemDisplay itemDisplay) { this.manager.handleBaseEntityLoadLate(itemDisplay, 0); } else if (entity instanceof Shulker shulker) { - this.manager.handleCollisionEntityLoadLate(shulker, 0); + //this.manager.handleCollisionEntityLoadLate(shulker, 0); } } 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 bcb2ff7c4..5797298c4 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 @@ -156,7 +156,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); - registerByteBufPacketConsumer(PacketConsumers.OPEN_SCREEN, this.packetIds.clientboundOpenScreenPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket()); // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); 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 7acfeea64..b9f604513 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 @@ -242,40 +242,47 @@ public class PacketConsumers { } }; - public static final BiConsumer OPEN_SCREEN = (user, event) -> { + public static final BiConsumer OPEN_SCREEN_1_20 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); int containerId = buf.readVarInt(); int type = buf.readVarInt(); - if (VersionHelper.isVersionNewerThan1_20_3()) { - Tag nbt = buf.readNbt(false); - if (nbt == null) return; - Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); - if (tokens.isEmpty()) return; - Component component = NBTComponentSerializer.nbt().deserialize(nbt); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); - } - buf.clear(); - buf.writeVarInt(event.packetID()); - buf.writeVarInt(containerId); - buf.writeVarInt(type); - buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); - } else { - String json = buf.readUtf(); - Map tokens = CraftEngine.instance().imageManager().matchTags(json); - if (tokens.isEmpty()) return; - event.setChanged(true); - Component component = AdventureHelper.jsonToComponent(json); - for (Map.Entry token : tokens.entrySet()) { - component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); - } - buf.clear(); - buf.writeVarInt(event.packetID()); - buf.writeVarInt(containerId); - buf.writeVarInt(type); - buf.writeUtf(AdventureHelper.componentToJson(component)); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(containerId); + buf.writeVarInt(type); + buf.writeUtf(AdventureHelper.componentToJson(component)); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); + } + }; + + public static final BiConsumer OPEN_SCREEN_1_20_3 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + int containerId = buf.readVarInt(); + int type = buf.readVarInt(); + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeVarInt(containerId); + buf.writeVarInt(type); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundOpenScreenPacket", e); } diff --git a/gradle.properties b/gradle.properties index 700cc6878..e6694e50f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.45 +project_version=0.0.46 config_version=22 lang_version=4 project_group=net.momirealms @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.13 -nms_helper_version=0.44 +nms_helper_version=0.44.2 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7 From 9f4d0314fa40cee0710c018dcd4a52670557faf3 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Apr 2025 00:12:02 +0800 Subject: [PATCH 11/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 3 +- .../plugin/network/PacketConsumers.java | 38 +++++++++++++++++++ .../bukkit/plugin/network/PacketIds.java | 4 ++ .../plugin/network/impl/PacketIds1_20.java | 10 +++++ .../plugin/network/impl/PacketIds1_20_2.java | 10 +++++ .../plugin/network/impl/PacketIds1_20_3.java | 10 +++++ .../plugin/network/impl/PacketIds1_20_5.java | 10 +++++ .../plugin/network/impl/PacketIds1_21.java | 10 +++++ 8 files changed, 94 insertions(+), 1 deletion(-) 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 5797298c4..db6201ef5 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 @@ -151,12 +151,13 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.EDIT_BOOK, Reflections.clazz$ServerboundEditBookPacket); registerNMSPacketConsumer(PacketConsumers.CUSTOM_PAYLOAD, Reflections.clazz$ServerboundCustomPayloadPacket); // registerNMSPacketConsumer(PacketConsumers.SET_ENTITY_DATA, Reflections.clazz$ClientboundSetEntityDataPacket); -// registerNMSPacketConsumer(PacketConsumers.OPEN_SCREEN, Reflections.clazz$ClientboundOpenScreenPacket); registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); 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 b9f604513..3e6029613 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 @@ -242,6 +242,44 @@ public class PacketConsumers { } }; + public static final BiConsumer SET_TITLE_TEXT_1_20 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(AdventureHelper.componentToJson(component)); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSet(Sub)TitleTextPacket", e); + } + }; + + public static final BiConsumer SET_TITLE_TEXT_1_20_3 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSet(Sub)TitleTextPacket", e); + } + }; + public static final BiConsumer OPEN_SCREEN_1_20 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index bc89467c1..b020e518a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -19,4 +19,8 @@ public interface PacketIds { int clientboundRemoveEntitiesPacket(); int clientboundSetEntityDataPacket(); + + int clientboundSetTitleTextPacket(); + + int clientboundSetSubtitleTextPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index 418af0473..147dde60d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -48,4 +48,14 @@ public class PacketIds1_20 implements PacketIds { public int clientboundSetEntityDataPacket() { return 82; } + + @Override + public int clientboundSetTitleTextPacket() { + return 95; + } + + @Override + public int clientboundSetSubtitleTextPacket() { + return 93; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index a79c2a0ea..aea096922 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -48,4 +48,14 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundSetEntityDataPacket() { return 84; } + + @Override + public int clientboundSetTitleTextPacket() { + return 97; + } + + @Override + public int clientboundSetSubtitleTextPacket() { + return 95; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index dcae35e59..ee9a808a4 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -48,4 +48,14 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundSetEntityDataPacket() { return 86; } + + @Override + public int clientboundSetTitleTextPacket() { + return 99; + } + + @Override + public int clientboundSetSubtitleTextPacket() { + return 97; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index d6da5f830..72ceaf28e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -48,4 +48,14 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundSetEntityDataPacket() { return 88; } + + @Override + public int clientboundSetTitleTextPacket() { + return 101; + } + + @Override + public int clientboundSetSubtitleTextPacket() { + return 99; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index 944d99a1a..e5721ba10 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -48,4 +48,14 @@ public class PacketIds1_21 implements PacketIds { public int clientboundSetEntityDataPacket() { return PacketIdFinder.clientboundByName("minecraft:set_entity_data"); } + + @Override + public int clientboundSetTitleTextPacket() { + return PacketIdFinder.clientboundByName("minecraft:set_title_text"); + } + + @Override + public int clientboundSetSubtitleTextPacket() { + return PacketIdFinder.clientboundByName("minecraft:set_subtitle_text"); + } } From 52498e18df6df83afaf57da71631754237a98b66 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Apr 2025 01:21:24 +0800 Subject: [PATCH 12/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=B7=B7=E5=90=88?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8Blist=20nbt=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/injector/BukkitInjector.java | 1 - .../bukkit/plugin/network/BukkitNetworkManager.java | 5 +++-- .../bukkit/plugin/network/PacketConsumers.java | 11 +++++++---- .../craftengine/bukkit/plugin/network/PacketIds.java | 2 ++ .../bukkit/plugin/network/impl/PacketIds1_20.java | 5 +++++ .../bukkit/plugin/network/impl/PacketIds1_20_2.java | 5 +++++ .../bukkit/plugin/network/impl/PacketIds1_20_3.java | 5 +++++ .../bukkit/plugin/network/impl/PacketIds1_20_5.java | 5 +++++ .../bukkit/plugin/network/impl/PacketIds1_21.java | 5 +++++ gradle.properties | 2 +- 10 files changed, 38 insertions(+), 8 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java index c3bfcf3d3..641947e72 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/injector/BukkitInjector.java @@ -4,7 +4,6 @@ import com.mojang.datafixers.util.Pair; import net.bytebuddy.ByteBuddy; import net.bytebuddy.ClassFileVersion; import net.bytebuddy.description.field.FieldDescription; -import net.bytebuddy.description.method.ParameterDescription; import net.bytebuddy.description.modifier.Visibility; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.dynamic.DynamicType; 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 db6201ef5..5d7d621d3 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 @@ -156,8 +156,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket()); - registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); - registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); 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 3e6029613..f30b4fb77 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 @@ -5,6 +5,7 @@ import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TranslationArgument; +import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; @@ -242,7 +243,7 @@ public class PacketConsumers { } }; - public static final BiConsumer SET_TITLE_TEXT_1_20 = (user, event) -> { + public static final BiConsumer SET_TEXT_1_20 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); String json = buf.readUtf(); @@ -257,18 +258,20 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeUtf(AdventureHelper.componentToJson(component)); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundSet(Sub)TitleTextPacket", e); + CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); } }; - public static final BiConsumer SET_TITLE_TEXT_1_20_3 = (user, event) -> { + public static final BiConsumer SET_TEXT_1_20_3 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; + System.out.println(nbt.getAsString()); Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; Component component = NBTComponentSerializer.nbt().deserialize(nbt); + System.out.println(GsonComponentSerializer.gson().serialize(component)); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } @@ -276,7 +279,7 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundSet(Sub)TitleTextPacket", e); + CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); } }; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index b020e518a..f877d6470 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -23,4 +23,6 @@ public interface PacketIds { int clientboundSetTitleTextPacket(); int clientboundSetSubtitleTextPacket(); + + int clientboundSetActionBarTextPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index 147dde60d..d60d861a9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -58,4 +58,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundSetSubtitleTextPacket() { return 93; } + + @Override + public int clientboundSetActionBarTextPacket() { + return 70; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index aea096922..8e8754964 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -58,4 +58,9 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundSetSubtitleTextPacket() { return 95; } + + @Override + public int clientboundSetActionBarTextPacket() { + return 72; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index ee9a808a4..a140c817f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -58,4 +58,9 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundSetSubtitleTextPacket() { return 97; } + + @Override + public int clientboundSetActionBarTextPacket() { + return 74; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index 72ceaf28e..81fcf7ea0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -58,4 +58,9 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundSetSubtitleTextPacket() { return 99; } + + @Override + public int clientboundSetActionBarTextPacket() { + return 76; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index e5721ba10..444c81877 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -58,4 +58,9 @@ public class PacketIds1_21 implements PacketIds { public int clientboundSetSubtitleTextPacket() { return PacketIdFinder.clientboundByName("minecraft:set_subtitle_text"); } + + @Override + public int clientboundSetActionBarTextPacket() { + return PacketIdFinder.clientboundByName("minecraft:set_action_bar_text"); + } } diff --git a/gradle.properties b/gradle.properties index e6694e50f..5f0e31ca5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -40,7 +40,7 @@ lz4_version=1.8.0 geantyref_version=1.3.16 zstd_version=1.5.7-2 commons_io_version=2.18.0 -sparrow_nbt_version=0.4.6 +sparrow_nbt_version=0.5 sparrow_util_version=0.37 fastutil_version=8.5.15 netty_version=4.1.119.Final From 168838da9146c92286377ab8e915ec5da4b8a269 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Apr 2025 01:41:17 +0800 Subject: [PATCH 13/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86boss=20event?= =?UTF-8?q?=E5=8C=85=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 1 + .../plugin/network/PacketConsumers.java | 98 ++++++++++++++++++- .../bukkit/plugin/network/PacketIds.java | 2 + .../plugin/network/impl/PacketIds1_20.java | 5 + .../plugin/network/impl/PacketIds1_20_2.java | 5 + .../plugin/network/impl/PacketIds1_20_3.java | 5 + .../plugin/network/impl/PacketIds1_20_5.java | 5 + .../plugin/network/impl/PacketIds1_21.java | 5 + 8 files changed, 124 insertions(+), 2 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 5d7d621d3..7f81d157f 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 @@ -159,6 +159,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket()); // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); 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 f30b4fb77..350a5309f 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 @@ -243,6 +243,102 @@ public class PacketConsumers { } }; + public static final BiConsumer BOSS_EVENT_1_20 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + UUID uuid = buf.readUUID(); + int actionType = buf.readVarInt(); + if (actionType == 0) { + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + float health = buf.readFloat(); + int color = buf.readVarInt(); + int division = buf.readVarInt(); + byte flag = buf.readByte(); + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUUID(uuid); + buf.writeVarInt(actionType); + buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeFloat(health); + buf.writeVarInt(color); + buf.writeVarInt(division); + buf.writeByte(flag); + } else if (actionType == 3) { + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUUID(uuid); + buf.writeVarInt(actionType); + buf.writeUtf(AdventureHelper.componentToJson(component)); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e); + } + }; + + public static final BiConsumer BOSS_EVENT_1_20_3 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + UUID uuid = buf.readUUID(); + int actionType = buf.readVarInt(); + if (actionType == 0) { + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + float health = buf.readFloat(); + int color = buf.readVarInt(); + int division = buf.readVarInt(); + byte flag = buf.readByte(); + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUUID(uuid); + buf.writeVarInt(actionType); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeFloat(health); + buf.writeVarInt(color); + buf.writeVarInt(division); + buf.writeByte(flag); + } else if (actionType == 3) { + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUUID(uuid); + buf.writeVarInt(actionType); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundBossEventPacket", e); + } + }; + public static final BiConsumer SET_TEXT_1_20 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); @@ -267,11 +363,9 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); if (nbt == null) return; - System.out.println(nbt.getAsString()); Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; Component component = NBTComponentSerializer.nbt().deserialize(nbt); - System.out.println(GsonComponentSerializer.gson().serialize(component)); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index f877d6470..424447dbf 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -25,4 +25,6 @@ public interface PacketIds { int clientboundSetSubtitleTextPacket(); int clientboundSetActionBarTextPacket(); + + int clientboundBossEventPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index d60d861a9..bbdd64ea2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -63,4 +63,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundSetActionBarTextPacket() { return 70; } + + @Override + public int clientboundBossEventPacket() { + return 11; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index 8e8754964..4c19842d7 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -63,4 +63,9 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundSetActionBarTextPacket() { return 72; } + + @Override + public int clientboundBossEventPacket() { + return 10; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index a140c817f..7a74981a3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -63,4 +63,9 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundSetActionBarTextPacket() { return 74; } + + @Override + public int clientboundBossEventPacket() { + return 10; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index 81fcf7ea0..6f70f8b33 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -63,4 +63,9 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundSetActionBarTextPacket() { return 76; } + + @Override + public int clientboundBossEventPacket() { + return 10; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index 444c81877..fd8008c27 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -63,4 +63,9 @@ public class PacketIds1_21 implements PacketIds { public int clientboundSetActionBarTextPacket() { return PacketIdFinder.clientboundByName("minecraft:set_action_bar_text"); } + + @Override + public int clientboundBossEventPacket() { + return PacketIdFinder.clientboundByName("minecraft:boss_event"); + } } From bfc02b6baf755dd193ea499dcec3f73a64acad33 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Apr 2025 02:14:19 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Tab=20footer=20header?= =?UTF-8?q?=EF=BC=8C=E6=B6=88=E6=81=AF=E6=8B=A6=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/BukkitNetworkManager.java | 2 + .../plugin/network/PacketConsumers.java | 115 +++++++++++++++++- .../bukkit/plugin/network/PacketIds.java | 4 + .../plugin/network/impl/PacketIds1_20.java | 10 ++ .../plugin/network/impl/PacketIds1_20_2.java | 10 ++ .../plugin/network/impl/PacketIds1_20_3.java | 10 ++ .../plugin/network/impl/PacketIds1_20_5.java | 10 ++ .../plugin/network/impl/PacketIds1_21.java | 10 ++ 8 files changed, 170 insertions(+), 1 deletion(-) 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 7f81d157f..c7b472db4 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 @@ -160,6 +160,8 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket()); // registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); // registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); 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 350a5309f..a625517be 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 @@ -5,7 +5,6 @@ import io.netty.buffer.Unpooled; import it.unimi.dsi.fastutil.ints.IntList; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.TranslationArgument; -import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer; import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; @@ -339,6 +338,49 @@ public class PacketConsumers { } }; + public static final BiConsumer SYSTEM_CHAT_1_20 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + boolean overlay = buf.readBoolean(); + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(AdventureHelper.componentToJson(component)); + buf.writeBoolean(overlay); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e); + } + }; + + public static final BiConsumer SYSTEM_CHAT_1_20_3 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + boolean overlay = buf.readBoolean(); + event.setChanged(true); + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + buf.writeBoolean(overlay); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSystemChatPacket", e); + } + }; + public static final BiConsumer SET_TEXT_1_20 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); @@ -365,6 +407,7 @@ public class PacketConsumers { if (nbt == null) return; Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); if (tokens.isEmpty()) return; + event.setChanged(true); Component component = NBTComponentSerializer.nbt().deserialize(nbt); for (Map.Entry token : tokens.entrySet()) { component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); @@ -377,6 +420,76 @@ public class PacketConsumers { } }; + public static final BiConsumer TAB_LIST_1_20 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + String json1 = buf.readUtf(); + String json2 = buf.readUtf(); + Map tokens1 = CraftEngine.instance().imageManager().matchTags(json1); + Map tokens2 = CraftEngine.instance().imageManager().matchTags(json2); + if (tokens1.isEmpty() && tokens2.isEmpty()) return; + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + if (!tokens1.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(json1); + for (Map.Entry token : tokens1.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeUtf(AdventureHelper.componentToJson(component)); + } else { + buf.writeUtf(json1); + } + if (!tokens2.isEmpty()) { + Component component = AdventureHelper.jsonToComponent(json2); + for (Map.Entry token : tokens2.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeUtf(AdventureHelper.componentToJson(component)); + } else { + buf.writeUtf(json2); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + } + }; + + public static final BiConsumer TAB_LIST_1_20_3 = (user, event) -> { + try { + FriendlyByteBuf buf = event.getBuffer(); + Tag nbt1 = buf.readNbt(false); + if (nbt1 == null) return; + Tag nbt2 = buf.readNbt(false); + if (nbt2 == null) return; + Map tokens1 = CraftEngine.instance().imageManager().matchTags(nbt1.getAsString()); + Map tokens2 = CraftEngine.instance().imageManager().matchTags(nbt2.getAsString()); + if (tokens1.isEmpty() && tokens2.isEmpty()) return; + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + if (!tokens1.isEmpty()) { + Component component = NBTComponentSerializer.nbt().deserialize(nbt1); + for (Map.Entry token : tokens1.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } else { + buf.writeNbt(nbt1, false); + } + if (!tokens2.isEmpty()) { + Component component = NBTComponentSerializer.nbt().deserialize(nbt2); + for (Map.Entry token : tokens2.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } else { + buf.writeNbt(nbt2, false); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + } + }; + public static final BiConsumer OPEN_SCREEN_1_20 = (user, event) -> { try { FriendlyByteBuf buf = event.getBuffer(); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java index 424447dbf..cba589e6e 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketIds.java @@ -27,4 +27,8 @@ public interface PacketIds { int clientboundSetActionBarTextPacket(); int clientboundBossEventPacket(); + + int clientboundSystemChatPacket(); + + int clientboundTabListPacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java index bbdd64ea2..68b07152f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java @@ -68,4 +68,14 @@ public class PacketIds1_20 implements PacketIds { public int clientboundBossEventPacket() { return 11; } + + @Override + public int clientboundSystemChatPacket() { + return 100; + } + + @Override + public int clientboundTabListPacket() { + return 101; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java index 4c19842d7..9773d7cb5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_2.java @@ -68,4 +68,14 @@ public class PacketIds1_20_2 implements PacketIds { public int clientboundBossEventPacket() { return 10; } + + @Override + public int clientboundSystemChatPacket() { + return 103; + } + + @Override + public int clientboundTabListPacket() { + return 104; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java index 7a74981a3..c6d0a66ca 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_3.java @@ -68,4 +68,14 @@ public class PacketIds1_20_3 implements PacketIds { public int clientboundBossEventPacket() { return 10; } + + @Override + public int clientboundSystemChatPacket() { + return 105; + } + + @Override + public int clientboundTabListPacket() { + return 106; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java index 6f70f8b33..75b6566e3 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java @@ -68,4 +68,14 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundBossEventPacket() { return 10; } + + @Override + public int clientboundSystemChatPacket() { + return 108; + } + + @Override + public int clientboundTabListPacket() { + return 109; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java index fd8008c27..5dc7fa843 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_21.java @@ -68,4 +68,14 @@ public class PacketIds1_21 implements PacketIds { public int clientboundBossEventPacket() { return PacketIdFinder.clientboundByName("minecraft:boss_event"); } + + @Override + public int clientboundSystemChatPacket() { + return PacketIdFinder.clientboundByName("minecraft:system_chat"); + } + + @Override + public int clientboundTabListPacket() { + return PacketIdFinder.clientboundByName("minecraft:tab_list"); + } } From b1ffaf7dc361882b4fa58b0bcb554ddd065c603c Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Apr 2025 02:37:41 +0800 Subject: [PATCH 15/16] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=8C=85=E7=9B=B8=E5=BA=94=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 13 +++ .../plugin/network/BukkitNetworkManager.java | 6 +- .../plugin/network/PacketConsumers.java | 100 +++++++++++++++++- .../core/plugin/config/Config.java | 36 +++++++ 4 files changed, 148 insertions(+), 7 deletions(-) diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index c7a90b6a0..add64ec6f 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -152,6 +152,19 @@ image: chat: true command: true sign: true + # By intercepting packets, you are allowed to use in other plugins + intercept-packets: + system-chat: true + tab-list: true + actionbar: true + title: true + bossbar: true + container: true + # TODO: toast: true + # TODO: name: true + # TODO: team: true + +emoji: {} recipe: # Enable the plugin's recipe system 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 c7b472db4..4fa682f7d 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 @@ -156,9 +156,9 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(PacketConsumers.LEVEL_PARTICLE, this.packetIds.clientboundLevelParticlesPacket()); registerByteBufPacketConsumer(PacketConsumers.LEVEL_EVENT, this.packetIds.clientboundLevelEventPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.OPEN_SCREEN_1_20_3 : PacketConsumers.OPEN_SCREEN_1_20, this.packetIds.clientboundOpenScreenPacket()); - registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); - registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); - registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TEXT_1_20_3 : PacketConsumers.SET_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_TITLE_TEXT_1_20_3 : PacketConsumers.SET_TITLE_TEXT_1_20, this.packetIds.clientboundSetTitleTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_SUBTITLE_TEXT_1_20_3 : PacketConsumers.SET_SUBTITLE_TEXT_1_20, this.packetIds.clientboundSetSubtitleTextPacket()); + registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_ACTIONBAR_TEXT_1_20_3 : PacketConsumers.SET_ACTIONBAR_TEXT_1_20, this.packetIds.clientboundSetActionBarTextPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.BOSS_EVENT_1_20_3 : PacketConsumers.BOSS_EVENT_1_20, this.packetIds.clientboundBossEventPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SYSTEM_CHAT_1_20_3 : PacketConsumers.SYSTEM_CHAT_1_20, this.packetIds.clientboundSystemChatPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket()); 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 a625517be..d0c11d59b 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 @@ -243,6 +243,7 @@ public class PacketConsumers { }; public static final BiConsumer BOSS_EVENT_1_20 = (user, event) -> { + if (!Config.interceptBossBar()) return; try { FriendlyByteBuf buf = event.getBuffer(); UUID uuid = buf.readUUID(); @@ -290,6 +291,7 @@ public class PacketConsumers { }; public static final BiConsumer BOSS_EVENT_1_20_3 = (user, event) -> { + if (!Config.interceptBossBar()) return; try { FriendlyByteBuf buf = event.getBuffer(); UUID uuid = buf.readUUID(); @@ -339,6 +341,7 @@ public class PacketConsumers { }; public static final BiConsumer SYSTEM_CHAT_1_20 = (user, event) -> { + if (!Config.interceptSystemChat()) return; try { FriendlyByteBuf buf = event.getBuffer(); String json = buf.readUtf(); @@ -360,6 +363,7 @@ public class PacketConsumers { }; public static final BiConsumer SYSTEM_CHAT_1_20_3 = (user, event) -> { + if (!Config.interceptSystemChat()) return; try { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); @@ -381,7 +385,8 @@ public class PacketConsumers { } }; - public static final BiConsumer SET_TEXT_1_20 = (user, event) -> { + public static final BiConsumer SET_SUBTITLE_TEXT_1_20 = (user, event) -> { + if (!Config.interceptTitle()) return; try { FriendlyByteBuf buf = event.getBuffer(); String json = buf.readUtf(); @@ -396,11 +401,12 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeUtf(AdventureHelper.componentToJson(component)); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e); } }; - public static final BiConsumer SET_TEXT_1_20_3 = (user, event) -> { + public static final BiConsumer SET_SUBTITLE_TEXT_1_20_3 = (user, event) -> { + if (!Config.interceptTitle()) return; try { FriendlyByteBuf buf = event.getBuffer(); Tag nbt = buf.readNbt(false); @@ -416,11 +422,94 @@ public class PacketConsumers { buf.writeVarInt(event.packetID()); buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); } catch (Exception e) { - CraftEngine.instance().logger().warn("Failed to handle ClientboundSet[(Sub)Title/ActionBar]TextPacket", e); + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetSubtitleTextPacket", e); + } + }; + + public static final BiConsumer SET_TITLE_TEXT_1_20 = (user, event) -> { + if (!Config.interceptTitle()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(AdventureHelper.componentToJson(component)); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e); + } + }; + + public static final BiConsumer SET_TITLE_TEXT_1_20_3 = (user, event) -> { + if (!Config.interceptTitle()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetTitleTextPacket", e); + } + }; + + public static final BiConsumer SET_ACTIONBAR_TEXT_1_20 = (user, event) -> { + if (!Config.interceptActionBar()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + String json = buf.readUtf(); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(AdventureHelper.componentToJson(component)); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e); + } + }; + + public static final BiConsumer SET_ACTIONBAR_TEXT_1_20_3 = (user, event) -> { + if (!Config.interceptActionBar()) return; + try { + FriendlyByteBuf buf = event.getBuffer(); + Tag nbt = buf.readNbt(false); + if (nbt == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(nbt.getAsString()); + if (tokens.isEmpty()) return; + event.setChanged(true); + Component component = NBTComponentSerializer.nbt().deserialize(nbt); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(AdventureHelper.miniMessage().deserialize(token.getValue()))); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeNbt(NBTComponentSerializer.nbt().serialize(component), false); + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetActionBarTextPacket", e); } }; public static final BiConsumer TAB_LIST_1_20 = (user, event) -> { + if (!Config.interceptTabList()) return; try { FriendlyByteBuf buf = event.getBuffer(); String json1 = buf.readUtf(); @@ -455,6 +544,7 @@ public class PacketConsumers { }; public static final BiConsumer TAB_LIST_1_20_3 = (user, event) -> { + if (!Config.interceptTabList()) return; try { FriendlyByteBuf buf = event.getBuffer(); Tag nbt1 = buf.readNbt(false); @@ -491,6 +581,7 @@ public class PacketConsumers { }; public static final BiConsumer OPEN_SCREEN_1_20 = (user, event) -> { + if (!Config.interceptContainer()) return; try { FriendlyByteBuf buf = event.getBuffer(); int containerId = buf.readVarInt(); @@ -514,6 +605,7 @@ public class PacketConsumers { }; public static final BiConsumer OPEN_SCREEN_1_20_3 = (user, event) -> { + if (!Config.interceptContainer()) return; try { FriendlyByteBuf buf = event.getBuffer(); int containerId = buf.readVarInt(); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java index 24b31ff21..5aaffc694 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/config/Config.java @@ -122,6 +122,12 @@ public class Config { protected boolean image$illegal_characters_filter$anvil; protected boolean image$illegal_characters_filter$sign; protected boolean image$illegal_characters_filter$book; + protected boolean image$intercept_packets$system_chat; + protected boolean image$intercept_packets$tab_list; + protected boolean image$intercept_packets$actionbar; + protected boolean image$intercept_packets$title; + protected boolean image$intercept_packets$bossbar; + protected boolean image$intercept_packets$container; public Config(CraftEngine plugin) { this.plugin = plugin; @@ -278,6 +284,12 @@ public class Config { image$illegal_characters_filter$chat = config.getBoolean("image.illegal-characters-filter.chat", true); image$illegal_characters_filter$command = config.getBoolean("image.illegal-characters-filter.command", true); image$illegal_characters_filter$sign = config.getBoolean("image.illegal-characters-filter.sign", true); + image$intercept_packets$system_chat = config.getBoolean("image.intercept-packets.system-chat", true); + image$intercept_packets$tab_list = config.getBoolean("image.intercept-packets.tab-list", true); + image$intercept_packets$actionbar = config.getBoolean("image.intercept-packets.actionbar", true); + image$intercept_packets$title = config.getBoolean("image.intercept-packets.title", true); + image$intercept_packets$bossbar = config.getBoolean("image.intercept-packets.bossbar", true); + image$intercept_packets$container = config.getBoolean("image.intercept-packets.container", true); Class modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); if (modClazz != null) { @@ -578,6 +590,30 @@ public class Config { return id; } + public static boolean interceptSystemChat() { + return instance.image$intercept_packets$system_chat; + } + + public static boolean interceptTabList() { + return instance.image$intercept_packets$tab_list; + } + + public static boolean interceptActionBar() { + return instance.image$intercept_packets$actionbar; + } + + public static boolean interceptTitle() { + return instance.image$intercept_packets$title; + } + + public static boolean interceptBossBar() { + return instance.image$intercept_packets$bossbar; + } + + public static boolean interceptContainer() { + return instance.image$intercept_packets$container; + } + public YamlDocument loadOrCreateYamlData(String fileName) { File file = new File(this.plugin.dataFolderFile(), fileName); if (!file.exists()) { From caeeab641b3733f1a749123be0fc8a1dcc9a6fa3 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 8 Apr 2025 03:30:09 +0800 Subject: [PATCH 16/16] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dworldedit=E5=AE=9E?= =?UTF-8?q?=E4=BD=93=E5=A4=8D=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/entity/furniture/BukkitFurnitureManager.java | 3 ++- .../bukkit/entity/furniture/FurnitureEventListener.java | 2 +- .../bukkit/plugin/command/feature/TestCommand.java | 7 ++++--- gradle.properties | 4 ++-- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index 0c970796b..9fd2c4f8f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -323,8 +323,9 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { if (FastNMS.INSTANCE.method$CraftEntity$getHandle(shulker) instanceof CollisionEntity) { return; } + // not a collision entity Byte flag = shulker.getPersistentDataContainer().get(FURNITURE_COLLISION, PersistentDataType.BYTE); - if (flag != null && flag == 1) { + if (flag == null || flag != 1) { return; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java index 23b69487d..18bfa8e42 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/FurnitureEventListener.java @@ -55,7 +55,7 @@ public class FurnitureEventListener implements Listener { if (entity instanceof ItemDisplay itemDisplay) { this.manager.handleBaseEntityLoadLate(itemDisplay, 0); } else if (entity instanceof Shulker shulker) { - //this.manager.handleCollisionEntityLoadLate(shulker, 0); + this.manager.handleCollisionEntityLoadLate(shulker, 0); } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java index f7aa65dbe..0b7a822c2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/command/feature/TestCommand.java @@ -1,7 +1,6 @@ package net.momirealms.craftengine.bukkit.plugin.command.feature; -import net.momirealms.craftengine.bukkit.nms.CollisionEntity; -import net.momirealms.craftengine.bukkit.nms.FastNMS; +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.plugin.command.BukkitCommandFeature; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; @@ -9,6 +8,8 @@ import org.bukkit.Location; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; +import org.bukkit.entity.Shulker; +import org.bukkit.persistence.PersistentDataType; import org.incendo.cloud.Command; import java.util.Collection; @@ -29,7 +30,7 @@ public class TestCommand extends BukkitCommandFeature { try { Collection entities = player.getLocation().getNearbyEntities(2,2,2); for (Entity entity : entities) { - if (FastNMS.INSTANCE.method$CraftEntity$getHandle(entity) instanceof CollisionEntity) { + if (entity instanceof Shulker) { } } } catch (Exception e) { diff --git a/gradle.properties b/gradle.properties index 5f0e31ca5..6db3d7e84 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,7 +3,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] project_version=0.0.46 -config_version=22 +config_version=23 lang_version=4 project_group=net.momirealms latest_supported_version=1.21.5 @@ -51,7 +51,7 @@ byte_buddy_version=1.17.5 ahocorasick_version=0.6.3 snake_yaml_version=2.4 anti_grief_version=0.13 -nms_helper_version=0.44.2 +nms_helper_version=0.45 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7