From 4e4b25c2b83b52b968c93fcf63c5e859754f95e5 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 12 Apr 2025 02:02:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0player=20info=E6=8B=A6?= =?UTF-8?q?=E6=88=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/recipe/RecipeEventListener.java | 3 +- .../plugin/injector/BukkitInjector.java | 8 +-- .../plugin/network/BukkitNetworkManager.java | 1 + .../plugin/network/PacketConsumers.java | 44 ++++++++++++++ .../craftengine/bukkit/util/Reflections.java | 57 +++++++++++++++---- .../core/plugin/config/Config.java | 4 ++ .../core/util/MarkedArrayList.java | 16 ++++++ gradle.properties | 2 +- 8 files changed, 117 insertions(+), 18 deletions(-) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/util/MarkedArrayList.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java index f67a36256..f0eb1042f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/recipe/RecipeEventListener.java @@ -343,8 +343,7 @@ public class RecipeEventListener implements Listener { ItemStack itemStack = event.getItem(); if (ItemUtils.isEmpty(itemStack)) return; try { - @SuppressWarnings("unchecked") - Optional optionalMCRecipe = (Optional) Reflections.method$RecipeManager$getRecipeFor1.invoke( + Optional optionalMCRecipe = FastNMS.INSTANCE.method$RecipeManager$getRecipeFor( BukkitRecipeManager.nmsRecipeManager(), Reflections.instance$RecipeType$CAMPFIRE_COOKING, Reflections.constructor$SingleRecipeInput.newInstance(FastNMS.INSTANCE.method$CraftItemStack$asNMSCopy(itemStack)), 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 641947e72..2386ea39b 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 @@ -406,7 +406,7 @@ public class BukkitInjector { InjectedCacheCheck injectedCacheCheck = (InjectedCacheCheck) thisObj; Object type = injectedCacheCheck.recipeType(); Object lastRecipe = injectedCacheCheck.lastRecipe(); - Optional> optionalRecipe = (Optional>) Reflections.method$RecipeManager$getRecipeFor0.invoke(mcRecipeManager, type, args[0], args[1], lastRecipe); + Optional> optionalRecipe = FastNMS.INSTANCE.method$RecipeManager$getRecipeFor(mcRecipeManager, type, args[0], args[1], lastRecipe); if (optionalRecipe.isPresent()) { Pair pair = optionalRecipe.get(); Object resourceLocation = pair.getFirst(); @@ -474,7 +474,7 @@ public class BukkitInjector { InjectedCacheCheck injectedCacheCheck = (InjectedCacheCheck) thisObj; Object type = injectedCacheCheck.recipeType(); Object lastRecipe = injectedCacheCheck.lastRecipe(); - Optional optionalRecipe = (Optional) Reflections.method$RecipeManager$getRecipeFor0.invoke(mcRecipeManager, type, args[0], args[1], lastRecipe); + Optional optionalRecipe = (Optional) FastNMS.INSTANCE.method$RecipeManager$getRecipeFor(mcRecipeManager, type, args[0], args[1], lastRecipe); if (optionalRecipe.isPresent()) { Object holder = optionalRecipe.get(); Object id = FastNMS.INSTANCE.field$RecipeHolder$id(holder); @@ -542,7 +542,7 @@ public class BukkitInjector { InjectedCacheCheck injectedCacheCheck = (InjectedCacheCheck) thisObj; Object type = injectedCacheCheck.recipeType(); Object lastRecipe = injectedCacheCheck.lastRecipe(); - Optional optionalRecipe = (Optional) Reflections.method$RecipeManager$getRecipeFor0.invoke(mcRecipeManager, type, args[0], args[1], lastRecipe); + Optional optionalRecipe = (Optional) FastNMS.INSTANCE.method$RecipeManager$getRecipeFor(mcRecipeManager, type, args[0], args[1], lastRecipe); if (optionalRecipe.isPresent()) { Object holder = optionalRecipe.get(); Object id = FastNMS.INSTANCE.field$RecipeHolder$id(holder); @@ -602,7 +602,7 @@ public class BukkitInjector { InjectedCacheCheck injectedCacheCheck = (InjectedCacheCheck) thisObj; Object type = injectedCacheCheck.recipeType(); Object lastRecipe = injectedCacheCheck.lastRecipe(); - Optional optionalRecipe = (Optional) Reflections.method$RecipeManager$getRecipeFor1.invoke(mcRecipeManager, type, args[0], args[1], lastRecipe); + Optional optionalRecipe = (Optional) FastNMS.INSTANCE.method$RecipeManager$getRecipeFor(mcRecipeManager, type, args[0], args[1], lastRecipe); if (optionalRecipe.isPresent()) { Object holder = optionalRecipe.get(); Object id = FastNMS.INSTANCE.field$RecipeHolder$id(holder); 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 4816cd91f..b2c53a8da 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 @@ -127,6 +127,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes private void registerPacketHandlers() { registerNMSPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, Reflections.clazz$ClientboundLevelChunkWithLightPacket); + registerNMSPacketConsumer(PacketConsumers.PLAYER_INFO_UPDATE, Reflections.clazz$ClientboundPlayerInfoUpdatePacket); registerNMSPacketConsumer(PacketConsumers.PLAYER_ACTION, Reflections.clazz$ServerboundPlayerActionPacket); registerNMSPacketConsumer(PacketConsumers.SWING_HAND, Reflections.clazz$ServerboundSwingPacket); registerNMSPacketConsumer(PacketConsumers.USE_ITEM_ON, Reflections.clazz$ServerboundUseItemOnPacket); 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 a618c49df..cd158fe39 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 @@ -321,6 +321,50 @@ public class PacketConsumers { } }; + public static final TriConsumer PLAYER_INFO_UPDATE = (user, event, packet) -> { + try { + if (!user.isOnline()) return; + if (!Config.interceptPlayerInfo()) return; + List entries = FastNMS.INSTANCE.field$ClientboundPlayerInfoUpdatePacket$entries(packet); + if (entries instanceof MarkedArrayList) { + return; + } + EnumSet> enums = FastNMS.INSTANCE.field$ClientboundPlayerInfoUpdatePacket$actions(packet); + outer: { + for (Object entry : enums) { + if (entry == Reflections.instance$ClientboundPlayerInfoUpdatePacket$Action$UPDATE_DISPLAY_NAME) { + break outer; + } + } + return; + } + + List newEntries = new MarkedArrayList<>(); + Reflections.field$ClientboundPlayerInfoUpdatePacket$entries.set(packet, newEntries); + for (Object entry : entries) { + Object mcComponent = FastNMS.INSTANCE.field$ClientboundPlayerInfoUpdatePacket$Entry$displayName(entry); + if (mcComponent == null) { + newEntries.add(entry); + continue; + } + String json = ComponentUtils.minecraftToJson(mcComponent); + Map tokens = CraftEngine.instance().imageManager().matchTags(json); + if (tokens.isEmpty()) { + newEntries.add(entry); + continue; + } + Component component = AdventureHelper.jsonToComponent(json); + for (Map.Entry token : tokens.entrySet()) { + component = component.replaceText(b -> b.matchLiteral(token.getKey()).replacement(token.getValue())); + } + Object newEntry = FastNMS.INSTANCE.constructor$ClientboundPlayerInfoUpdatePacket$Entry(entry, ComponentUtils.adventureToMinecraft(component)); + newEntries.add(newEntry); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundPlayerInfoUpdatePacket", e); + } + }; + public static final BiConsumer TEAM_1_20 = (user, event) -> { if (!Config.interceptTeam()) return; try { 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 fdb961d06..95c2827ff 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 @@ -1766,6 +1766,35 @@ public class Reflections { ) ); + public static final Field field$ClientboundPlayerInfoUpdatePacket$entries = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundPlayerInfoUpdatePacket, List.class, 0 + ) + ); + + public static final Class clazz$ClientboundPlayerInfoUpdatePacket$Action = requireNonNull( + ReflectionUtils.getClazz( + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundPlayerInfoUpdatePacket$Action") + ) + ); + + public static final Method method$ClientboundPlayerInfoUpdatePacket$Action$values = requireNonNull( + ReflectionUtils.getStaticMethod( + clazz$ClientboundPlayerInfoUpdatePacket$Action, clazz$ClientboundPlayerInfoUpdatePacket$Action.arrayType() + ) + ); + + public static final Object instance$ClientboundPlayerInfoUpdatePacket$Action$UPDATE_DISPLAY_NAME; + + static { + try { + Object[] values = (Object[]) method$ClientboundPlayerInfoUpdatePacket$Action$values.invoke(null); + instance$ClientboundPlayerInfoUpdatePacket$Action$UPDATE_DISPLAY_NAME = values[5]; + } catch (ReflectiveOperationException e) { + throw new RuntimeException(e); + } + } + @Deprecated public static final Field field$ClientboundLevelChunkWithLightPacket$chunkData = requireNonNull( ReflectionUtils.getDeclaredField( @@ -4811,17 +4840,23 @@ public class Reflections { .map(it -> ReflectionUtils.getConstructor(it, clazz$ItemStack)) .orElse(null); - // 1.20.1-1.21.1 - public static final Method method$RecipeManager$getRecipeFor0 = - ReflectionUtils.getMethod( - clazz$RecipeManager, Optional.class, clazz$RecipeType, clazz$Container, clazz$Level, clazz$ResourceLocation - ); - - // 1.21.2+ - public static final Method method$RecipeManager$getRecipeFor1 = - ReflectionUtils.getMethod( - clazz$RecipeManager, Optional.class, clazz$RecipeType, clazz$RecipeInput, clazz$Level, clazz$ResourceKey - ); +// // 1.20.1-1.20.6 +// public static final Method method$RecipeManager$getRecipeFor0 = +// ReflectionUtils.getMethod( +// clazz$RecipeManager, Optional.class, clazz$RecipeType, clazz$Container, clazz$Level, clazz$ResourceLocation +// ); +// +// // 1.21.1 +// public static final Method method$RecipeManager$getRecipeFor2 = +// ReflectionUtils.getMethod( +// clazz$RecipeManager, Optional.class, clazz$RecipeType, clazz$RecipeInput, clazz$Level, clazz$ResourceLocation +// ); +// +// // 1.21.2+ +// public static final Method method$RecipeManager$getRecipeFor1 = +// ReflectionUtils.getMethod( +// clazz$RecipeManager, Optional.class, clazz$RecipeType, clazz$RecipeInput, clazz$Level, clazz$ResourceKey +// ); // 1.21+ public static final Field field$SingleRecipeInput$item = Optional.ofNullable(clazz$SingleRecipeInput) 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 409acc738..8e976ca03 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 @@ -652,6 +652,10 @@ public class Config { return instance.image$intercept_packets$armor_stand; } + public static boolean interceptPlayerInfo() { + return instance.image$intercept_packets$player_info; + } + public YamlDocument loadOrCreateYamlData(String fileName) { File file = new File(this.plugin.dataFolderFile(), fileName); if (!file.exists()) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/util/MarkedArrayList.java b/core/src/main/java/net/momirealms/craftengine/core/util/MarkedArrayList.java new file mode 100644 index 000000000..1d1e57d24 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/util/MarkedArrayList.java @@ -0,0 +1,16 @@ +package net.momirealms.craftengine.core.util; + +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; + +public class MarkedArrayList extends ArrayList { + + public MarkedArrayList() { + } + + public MarkedArrayList(@NotNull Collection c) { + super(c); + } +} diff --git a/gradle.properties b/gradle.properties index 4d122a98e..617b4f248 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.55 +nms_helper_version=0.56.2 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7 From f4d8e405461b1e540effb3f979e8bc1de2cde298 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sat, 12 Apr 2025 02:04:53 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8C=85=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/plugin/network/BukkitNetworkManager.java | 4 ++-- .../bukkit/plugin/network/{impl => id}/PacketIdFinder.java | 2 +- .../bukkit/plugin/network/{impl => id}/PacketIds1_20.java | 2 +- .../bukkit/plugin/network/{impl => id}/PacketIds1_20_5.java | 2 +- .../net/momirealms/craftengine/bukkit/util/Reflections.java | 3 ++- 5 files changed, 7 insertions(+), 6 deletions(-) rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/{impl => id}/PacketIdFinder.java (97%) rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/{impl => id}/PacketIds1_20.java (98%) rename bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/{impl => id}/PacketIds1_20_5.java (97%) 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 b2c53a8da..77b5bce77 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 @@ -8,8 +8,8 @@ import io.netty.util.internal.logging.InternalLogger; import io.netty.util.internal.logging.InternalLoggerFactory; import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; -import net.momirealms.craftengine.bukkit.plugin.network.impl.PacketIds1_20; -import net.momirealms.craftengine.bukkit.plugin.network.impl.PacketIds1_20_5; +import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20; +import net.momirealms.craftengine.bukkit.plugin.network.id.PacketIds1_20_5; import net.momirealms.craftengine.bukkit.plugin.user.BukkitServerPlayer; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.plugin.CraftEngine; 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/id/PacketIdFinder.java similarity index 97% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIdFinder.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIdFinder.java index 737534fcc..489ea5d01 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/id/PacketIdFinder.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.plugin.network.impl; +package net.momirealms.craftengine.bukkit.plugin.network.id; import com.google.gson.JsonElement; import net.momirealms.craftengine.bukkit.nms.FastNMS; 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/id/PacketIds1_20.java similarity index 98% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20.java index f7632f51d..a42831d0b 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/id/PacketIds1_20.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.plugin.network.impl; +package net.momirealms.craftengine.bukkit.plugin.network.id; import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; import net.momirealms.craftengine.bukkit.util.Reflections; 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/id/PacketIds1_20_5.java similarity index 97% rename from bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/impl/PacketIds1_20_5.java rename to bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/id/PacketIds1_20_5.java index 66d8e2319..290f16df7 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/id/PacketIds1_20_5.java @@ -1,4 +1,4 @@ -package net.momirealms.craftengine.bukkit.plugin.network.impl; +package net.momirealms.craftengine.bukkit.plugin.network.id; import net.momirealms.craftengine.bukkit.plugin.network.PacketIds; 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 95c2827ff..a163b570d 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 @@ -1774,7 +1774,8 @@ public class Reflections { public static final Class clazz$ClientboundPlayerInfoUpdatePacket$Action = requireNonNull( ReflectionUtils.getClazz( - BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundPlayerInfoUpdatePacket$Action") + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundPlayerInfoUpdatePacket$Action"), + BukkitReflectionUtils.assembleMCClass("network.protocol.game.ClientboundPlayerInfoUpdatePacket$a") ) );