From ebf0cd4dea7a8d526babc8f19398c7fa94e308db Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 24 Mar 2025 17:34:00 +0800 Subject: [PATCH] =?UTF-8?q?perf(network):=20=E4=BC=98=E5=8C=96=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=8C=85=E7=9A=84=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plugin/network/PacketConsumers.java | 154 ++++++++++++------ 1 file changed, 104 insertions(+), 50 deletions(-) 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 055f5c200..c5170df88 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 @@ -55,44 +55,73 @@ public class PacketConsumers { BIOME_LIST = new IntIdentityList(RegistryUtils.currentBiomeRegistrySize()); } - public static int remap(int stateId, NetWorkUser user) { - int remapId = mappings[stateId]; - if (remapId == stateId) return stateId; - if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(stateId)) return stateId; - return remapId; + public static int remap(int stateId) { + return mappings[stateId]; } public static final TriConsumer LEVEL_CHUNK_WITH_LIGHT = (user, event, packet) -> { try { - BukkitServerPlayer player = (BukkitServerPlayer) user; - Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); - byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); - ByteBuf buf = Unpooled.copiedBuffer(buffer); - FriendlyByteBuf friendlyByteBuf = new FriendlyByteBuf(buf); - FriendlyByteBuf newBuf = new FriendlyByteBuf(Unpooled.buffer()); - for (int i = 0, count = player.clientSideSectionCount(); i < count; i++) { - try { - MCSection mcSection = new MCSection(BLOCK_LIST, BIOME_LIST); - mcSection.readPacket(friendlyByteBuf); - PalettedContainer container = mcSection.blockStateContainer(); - Palette palette = container.data().palette(); - if (palette.canRemap()) { - palette.remap(stateId -> remap(stateId, user)); - } else { - for (int j = 0; j < 4096; j ++) { - int state = container.get(j); - int newState = remap(state, user); - if (newState != state) { - container.set(j, newState); + if (!user.usingClientMod()) { + BukkitServerPlayer player = (BukkitServerPlayer) user; + Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); + byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); + ByteBuf buf = Unpooled.copiedBuffer(buffer); + FriendlyByteBuf friendlyByteBuf = new FriendlyByteBuf(buf); + FriendlyByteBuf newBuf = new FriendlyByteBuf(Unpooled.buffer()); + for (int i = 0, count = player.clientSideSectionCount(); i < count; i++) { + try { + MCSection mcSection = new MCSection(BLOCK_LIST, BIOME_LIST); + mcSection.readPacket(friendlyByteBuf); + PalettedContainer container = mcSection.blockStateContainer(); + Palette palette = container.data().palette(); + if (palette.canRemap()) { + palette.remap(PacketConsumers::remap); + } else { + for (int j = 0; j < 4096; j++) { + int state = container.get(j); + int newState = remap(state); + if (newState != state) { + container.set(j, newState); + } } } + mcSection.writePacket(newBuf); + } catch (Exception e) { + break; } - mcSection.writePacket(newBuf); - } catch (Exception e) { - break; } + Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); + } else { + BukkitServerPlayer player = (BukkitServerPlayer) user; + Object chunkData = Reflections.field$ClientboundLevelChunkWithLightPacket$chunkData.get(packet); + byte[] buffer = (byte[]) Reflections.field$ClientboundLevelChunkPacketData$buffer.get(chunkData); + ByteBuf buf = Unpooled.copiedBuffer(buffer); + FriendlyByteBuf friendlyByteBuf = new FriendlyByteBuf(buf); + FriendlyByteBuf newBuf = new FriendlyByteBuf(Unpooled.buffer()); + for (int i = 0, count = player.clientSideSectionCount(); i < count; i++) { + try { + MCSection mcSection = new MCSection(BLOCK_LIST, BIOME_LIST); + mcSection.readPacket(friendlyByteBuf); + PalettedContainer container = mcSection.blockStateContainer(); + Palette palette = container.data().palette(); + if (palette.canRemap()) { + palette.remap(state -> BlockStateUtils.isVanillaBlock(state) ? remap(state) : state); + } else { + for (int j = 0; j < 4096; j++) { + int state = container.get(j); + int newState = BlockStateUtils.isVanillaBlock(state) ? remap(state) : state; + if (newState != state) { + container.set(j, newState); + } + } + } + mcSection.writePacket(newBuf); + } catch (Exception e) { + break; + } + } + Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); } - Reflections.field$ClientboundLevelChunkPacketData$buffer.set(chunkData, newBuf.array()); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundLevelChunkWithLightPacket", e); } @@ -100,24 +129,46 @@ public class PacketConsumers { public static final BiConsumer SECTION_BLOCK_UPDATE = (user, event) -> { try { - FriendlyByteBuf buf = event.getBuffer(); - long pos = buf.readLong(); - int blocks = buf.readVarInt(); - short[] positions = new short[blocks]; - int[] states = new int[blocks]; - for (int i = 0; i < blocks; i++) { - long k = buf.readVarLong(); - positions[i] = (short) ((int) (k & 4095L)); - states[i] = remap((int) (k >>> 12), user); + if (!user.usingClientMod()) { + FriendlyByteBuf buf = event.getBuffer(); + long pos = buf.readLong(); + int blocks = buf.readVarInt(); + short[] positions = new short[blocks]; + int[] states = new int[blocks]; + for (int i = 0; i < blocks; i++) { + long k = buf.readVarLong(); + positions[i] = (short) ((int) (k & 4095L)); + states[i] = remap((int) (k >>> 12)); + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeLong(pos); + buf.writeVarInt(blocks); + for (int i = 0; i < blocks; i++) { + buf.writeVarLong((long) states[i] << 12 | positions[i]); + } + event.setChanged(true); + } else { + FriendlyByteBuf buf = event.getBuffer(); + long pos = buf.readLong(); + int blocks = buf.readVarInt(); + short[] positions = new short[blocks]; + int[] states = new int[blocks]; + for (int i = 0; i < blocks; i++) { + long k = buf.readVarLong(); + positions[i] = (short) ((int) (k & 4095L)); + int stateId = (int) (k >>> 12); + states[i] = BlockStateUtils.isVanillaBlock(stateId) ? remap(stateId) : stateId; + } + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeLong(pos); + buf.writeVarInt(blocks); + for (int i = 0; i < blocks; i++) { + buf.writeVarLong((long) states[i] << 12 | positions[i]); + } + event.setChanged(true); } - buf.clear(); - buf.writeVarInt(event.packetID()); - buf.writeLong(pos); - buf.writeVarInt(blocks); - for (int i = 0; i < blocks; i ++) { - buf.writeVarLong((long) states[i] << 12 | positions[i]); - } - event.setChanged(true); } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundSectionBlocksUpdatePacket", e); } @@ -128,7 +179,10 @@ public class PacketConsumers { FriendlyByteBuf buf = event.getBuffer(); BlockPos pos = buf.readBlockPos(buf); int before = buf.readVarInt(); - int state = remap(before, user); + if (user.usingClientMod() && !BlockStateUtils.isVanillaBlock(before)) { + return; + } + int state = remap(before); if (state == before) { return; } @@ -150,7 +204,7 @@ public class PacketConsumers { BlockPos blockPos = buf.readBlockPos(buf); int state = buf.readInt(); boolean global = buf.readBoolean(); - int newState = remap(state, user); + int newState = remap(state); if (newState == state) { return; } @@ -184,7 +238,7 @@ public class PacketConsumers { if (!Reflections.clazz$BlockParticleOption.isInstance(option)) return; Object blockState = Reflections.field$BlockParticleOption$blockState.get(option); int id = BlockStateUtils.blockStateToId(blockState); - int remapped = remap(id, user); + int remapped = remap(id); if (remapped == id) return; Reflections.field$BlockParticleOption$blockState.set(option, BlockStateUtils.idToBlockState(remapped)); event.setChanged(true); @@ -526,7 +580,7 @@ public class PacketConsumers { // Falling blocks if (entityType == Reflections.instance$EntityType$FALLING_BLOCK) { int data = Reflections.field$ClientboundAddEntityPacket$data.getInt(packet); - int remapped = remap(data, user); + int remapped = remap(data); if (remapped != data) { Reflections.field$ClientboundAddEntityPacket$data.set(packet, remapped); }