From 081ca840a491eda1b239222175384ba07cebdca3 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sat, 12 Apr 2025 22:08:50 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat(network):=20=E6=8B=A6=E6=88=AA?= =?UTF-8?q?=E5=92=8C=E5=A4=84=E7=90=86=E8=AE=BE=E7=BD=AE=E5=88=86=E6=95=B0?= =?UTF-8?q?=E7=9A=84=E7=BD=91=E7=BB=9C=E6=95=B0=E6=8D=AE=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/loader/src/main/resources/config.yml | 1 + .../plugin/network/BukkitNetworkManager.java | 1 + .../plugin/network/PacketConsumers.java | 80 ++++++++++++++++++- .../bukkit/plugin/network/PacketIds.java | 2 + .../plugin/network/id/PacketIds1_20.java | 6 ++ .../plugin/network/id/PacketIds1_20_5.java | 6 ++ .../craftengine/bukkit/util/Reflections.java | 7 ++ .../core/plugin/config/Config.java | 6 ++ gradle.properties | 2 +- 9 files changed, 109 insertions(+), 2 deletions(-) diff --git a/bukkit/loader/src/main/resources/config.yml b/bukkit/loader/src/main/resources/config.yml index 7ba3c04e5..e09b121c9 100644 --- a/bukkit/loader/src/main/resources/config.yml +++ b/bukkit/loader/src/main/resources/config.yml @@ -158,6 +158,7 @@ image: system-chat: true tab-list: true # Tab list header and footer player-info: true # User list in tab + set-score: true actionbar: true title: true bossbar: true 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 0afcc7e55..02f13cf9b 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 @@ -157,6 +157,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TAB_LIST_1_20_3 : PacketConsumers.TAB_LIST_1_20, this.packetIds.clientboundTabListPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.TEAM_1_20_3 : PacketConsumers.TEAM_1_20, this.packetIds.clientboundSetPlayerTeamPacket()); registerByteBufPacketConsumer(VersionHelper.isVersionNewerThan1_20_3() ? PacketConsumers.SET_OBJECTIVE_1_20_3 : PacketConsumers.SET_OBJECTIVE_1_20, this.packetIds.clientboundSetObjectivePacket()); + registerByteBufPacketConsumer(PacketConsumers.SET_SCORE_1_20_3, VersionHelper.isVersionNewerThan1_20_3() ? this.packetIds.clientboundSetScorePacket() : -1); registerByteBufPacketConsumer(PacketConsumers.REMOVE_ENTITY, this.packetIds.clientboundRemoveEntitiesPacket()); registerByteBufPacketConsumer(PacketConsumers.ADD_ENTITY_BYTEBUFFER, this.packetIds.clientboundAddEntityPacket()); registerByteBufPacketConsumer(PacketConsumers.SOUND, this.packetIds.clientboundSoundPacket()); 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 0d9f63c9a..7d1707bed 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 @@ -33,6 +33,7 @@ import net.momirealms.craftengine.core.world.chunk.PalettedContainer; import net.momirealms.craftengine.core.world.chunk.packet.MCSection; import net.momirealms.sparrow.nbt.Tag; import org.bukkit.*; +import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -1275,7 +1276,7 @@ public class PacketConsumers { // do ray trace to get current block RayTraceResult result = bukkitPlayer.rayTraceBlocks(interactionRange, FluidCollisionMode.NEVER); if (result == null) return; - org.bukkit.block.Block hitBlock = result.getHitBlock(); + Block hitBlock = result.getHitBlock(); if (hitBlock == null) return; ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(hitBlock.getBlockData())); // not a custom block @@ -2006,4 +2007,81 @@ public class PacketConsumers { CraftEngine.instance().logger().warn("Failed to handle ClientboundSetEntityDataPacket", e); } }; + + public static final BiConsumer SET_SCORE_1_20_3 = (user, event) -> { + try { + if (!Config.interceptSetScore()) return; + boolean isChanged = false; + FriendlyByteBuf buf = event.getBuffer(); + String owner = buf.readUtf(); + String objectiveName = buf.readUtf(); + int score = buf.readVarInt(); + boolean hasDisplay = buf.readBoolean(); + Tag displayName = null; + if (hasDisplay) { + displayName = buf.readNbt(false); + } + outside : if (displayName != null) { + Map tokens = CraftEngine.instance().imageManager().matchTags(displayName.getAsString()); + if (tokens.isEmpty()) break outside; + Component component = AdventureHelper.tagToComponent(displayName); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + displayName = AdventureHelper.componentToTag(component); + isChanged = true; + } + boolean hasNumberFormat = buf.readBoolean(); + int format = -1; + Tag style = null; + Tag fixed = null; + if (hasNumberFormat) { + format = buf.readVarInt(); + if (format == 0) { + if (displayName == null) return; + } else if (format == 1) { + if (displayName == null) return; + style = buf.readNbt(false); + } else if (format == 2) { + fixed = buf.readNbt(false); + if (fixed == null) return; + Map tokens = CraftEngine.instance().imageManager().matchTags(fixed.getAsString()); + if (tokens.isEmpty() && !isChanged) return; + if (!tokens.isEmpty()) { + Component component = AdventureHelper.tagToComponent(fixed); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + fixed = AdventureHelper.componentToTag(component); + isChanged = true; + } + } + } + if (isChanged) { + event.setChanged(true); + buf.clear(); + buf.writeVarInt(event.packetID()); + buf.writeUtf(owner); + buf.writeUtf(objectiveName); + buf.writeVarInt(score); + if (hasDisplay) { + buf.writeBoolean(true); + buf.writeNbt(displayName, false); + } else { + buf.writeBoolean(false); + } + if (hasNumberFormat) { + buf.writeBoolean(true); + buf.writeVarInt(format); + if (format == 1) { + buf.writeNbt(style, false); + } else if (format == 2) { + buf.writeNbt(fixed, false); + } + } + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundSetScorePacket", 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 978507531..3ac33c779 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 @@ -39,4 +39,6 @@ public interface PacketIds { int clientboundLevelChunkWithLightPacket(); int clientboundPlayerInfoUpdatePacket(); + + int clientboundSetScorePacket(); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java index a42831d0b..08c4fab48 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java @@ -2,6 +2,7 @@ package net.momirealms.craftengine.bukkit.plugin.network.id; import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; import net.momirealms.craftengine.bukkit.util.Reflections; +import net.momirealms.craftengine.core.util.VersionHelper; public class PacketIds1_20 implements PacketIds { @@ -99,4 +100,9 @@ public class PacketIds1_20 implements PacketIds { public int clientboundPlayerInfoUpdatePacket() { return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundPlayerInfoUpdatePacket); } + + @Override + public int clientboundSetScorePacket() { + return PacketIdFinder.clientboundByClazz(Reflections.clazz$ClientboundSetScorePacket); + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java index 290f16df7..cc5a611fb 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java @@ -1,6 +1,7 @@ package net.momirealms.craftengine.bukkit.plugin.network.id; import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; +import net.momirealms.craftengine.bukkit.util.Reflections; public class PacketIds1_20_5 implements PacketIds { @@ -98,4 +99,9 @@ public class PacketIds1_20_5 implements PacketIds { public int clientboundPlayerInfoUpdatePacket() { return PacketIdFinder.clientboundByName("minecraft:player_info_update"); } + + @Override + public int clientboundSetScorePacket() { + return PacketIdFinder.clientboundByName("minecraft:set_score"); + } } 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 a163b570d..43cb6780e 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 @@ -6425,4 +6425,11 @@ public class Reflections { throw new RuntimeException(e); } } + + public static final Class clazz$ClientboundSetScorePacket = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundSetScorePacket"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.PacketPlayOutScoreboardScore") + ) + ); } 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 8e976ca03..13f81cb36 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 @@ -135,6 +135,7 @@ public class Config { protected boolean image$intercept_packets$text_display; protected boolean image$intercept_packets$armor_stand; protected boolean image$intercept_packets$player_info; + protected boolean image$intercept_packets$set_score; public Config(CraftEngine plugin) { this.plugin = plugin; @@ -304,6 +305,7 @@ public class Config { image$intercept_packets$text_display = config.getBoolean("image.intercept-packets.text-display", true); image$intercept_packets$armor_stand = config.getBoolean("image.intercept-packets.armor-stand", true); image$intercept_packets$player_info = config.getBoolean("image.intercept-packets.player-info", true); + image$intercept_packets$set_score = config.getBoolean("image.intercept-packets.set-score", true); Class modClazz = ReflectionUtils.getClazz(CraftEngine.MOD_CLASS); if (modClazz != null) { @@ -656,6 +658,10 @@ public class Config { return instance.image$intercept_packets$player_info; } + public static boolean interceptSetScore() { + return instance.image$intercept_packets$set_score; + } + public YamlDocument loadOrCreateYamlData(String fileName) { File file = new File(this.plugin.dataFolderFile(), fileName); if (!file.exists()) { diff --git a/gradle.properties b/gradle.properties index dc9fb4f15..262a6d571 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.47 -config_version=24 +config_version=25 lang_version=4 project_group=net.momirealms latest_supported_version=1.21.5 From b518e62286b768a7beb5c6a01dc276725332b9fb Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sat, 12 Apr 2025 22:09:35 +0800 Subject: [PATCH 2/3] =?UTF-8?q?build(gradle):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E7=89=88=E6=9C=AC=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 262a6d571..bfc5dfdfd 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.47 +project_version=0.0.48 config_version=25 lang_version=4 project_group=net.momirealms From 48e811e69649c8da56f525731b7a12755928a935 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Sat, 12 Apr 2025 22:16:31 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix(network):=20=E5=B0=91=E5=86=99=E4=BA=86?= =?UTF-8?q?=E4=B8=AAfalse?= 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, 2 insertions(+) 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 7d1707bed..252144ad5 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 @@ -2078,6 +2078,8 @@ public class PacketConsumers { } else if (format == 2) { buf.writeNbt(fixed, false); } + } else { + buf.writeBoolean(false); } } } catch (Exception e) {