From b70930271f1f14b6d38f020a7e86410feedd2c09 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 30 Apr 2025 00:25:14 +0800 Subject: [PATCH 1/5] =?UTF-8?q?feat(bukkit):=20=E5=A4=84=E7=90=86op?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E5=AF=BC=E8=87=B4=E7=9A=84=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/font/BukkitFontManager.java | 38 ++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index c0b332ec6..88a64cd84 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -15,6 +15,7 @@ import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -25,12 +26,14 @@ import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerEditBookEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.view.AnvilView; import java.lang.reflect.InvocationTargetException; import java.util.*; +import java.util.concurrent.TimeUnit; public class BukkitFontManager extends AbstractFontManager implements Listener { private final BukkitCraftEngine plugin; @@ -110,10 +113,17 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { this.processChatEvent(event); } + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onServerCommand(ServerCommandEvent event) { + this.processOpCommand(event.getSender(), event.getCommand()); + } + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onCommand(PlayerCommandPreprocessEvent event) { + Player player = event.getPlayer(); + this.processOpCommand(player, event.getMessage()); if (!Config.filterCommand()) return; - if (!event.getPlayer().hasPermission(FontManager.BYPASS_COMMAND)) { + if (!player.hasPermission(FontManager.BYPASS_COMMAND)) { IllegalCharacterProcessResult result = processIllegalCharacters(event.getMessage()); if (result.has()) { event.setMessage(result.text()); @@ -246,4 +256,30 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { throw new RuntimeException(e); } } + + private void processOpCommand(CommandSender sender, String command) { + this.plugin.scheduler().asyncLater( + () -> { + if (!sender.hasPermission("minecraft.command.op")) return; + if (!sender.hasPermission("minecraft.command.deop")) return; + String input = command.startsWith("/") ? command.substring(1) : command; + int firstSpaceIndex = input.indexOf(' '); + String cmdPart = (firstSpaceIndex == -1) ? input : input.substring(0, firstSpaceIndex); + String argPart = (firstSpaceIndex == -1) ? "" : input.substring(firstSpaceIndex + 1).trim(); + int lastColonIndex = cmdPart.lastIndexOf(':'); + if (lastColonIndex != -1 && !cmdPart.substring(0, lastColonIndex).equals("minecraft")) return; + String cmd = lastColonIndex == -1 ? cmdPart : cmdPart.substring(lastColonIndex + 1); + cmd = cmd.toLowerCase(); + if (!cmd.equals("op") && !cmd.equals("deop")) return; + int nextSpaceIndex = argPart.indexOf(' '); + String targetName = (nextSpaceIndex == -1) ? argPart : argPart.substring(0, nextSpaceIndex); + if (targetName.isEmpty()) return; + Player player = Bukkit.getPlayer(targetName); + if (player == null) return; + if (!player.isOnline()) return; + removeEmojiSuggestions(player); + addEmojiSuggestions(player, getEmojiSuggestion(player)); + }, + 1L, TimeUnit.SECONDS); + } } From b9e385b63e47bbe9cfff0e47dadbdb1015fa7199 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 30 Apr 2025 00:34:20 +0800 Subject: [PATCH 2/5] =?UTF-8?q?feat(bukkit):=20=E5=A4=84=E7=90=86op?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E5=AF=BC=E8=87=B4=E7=9A=84=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/font/BukkitFontManager.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index 88a64cd84..dcfb73ef1 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -258,19 +258,19 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { } private void processOpCommand(CommandSender sender, String command) { + if (!sender.hasPermission("minecraft.command.op")) return; + if (!sender.hasPermission("minecraft.command.deop")) return; + String input = command.startsWith("/") ? command.substring(1) : command; + int firstSpaceIndex = input.indexOf(' '); + String cmdPart = (firstSpaceIndex == -1) ? input : input.substring(0, firstSpaceIndex); + String argPart = (firstSpaceIndex == -1) ? "" : input.substring(firstSpaceIndex + 1).trim(); + int lastColonIndex = cmdPart.lastIndexOf(':'); + if (lastColonIndex != -1 && !cmdPart.substring(0, lastColonIndex).equals("minecraft")) return; + String cmd = lastColonIndex == -1 ? cmdPart : cmdPart.substring(lastColonIndex + 1); + cmd = cmd.toLowerCase(); + if (!cmd.equals("op") && !cmd.equals("deop")) return; this.plugin.scheduler().asyncLater( () -> { - if (!sender.hasPermission("minecraft.command.op")) return; - if (!sender.hasPermission("minecraft.command.deop")) return; - String input = command.startsWith("/") ? command.substring(1) : command; - int firstSpaceIndex = input.indexOf(' '); - String cmdPart = (firstSpaceIndex == -1) ? input : input.substring(0, firstSpaceIndex); - String argPart = (firstSpaceIndex == -1) ? "" : input.substring(firstSpaceIndex + 1).trim(); - int lastColonIndex = cmdPart.lastIndexOf(':'); - if (lastColonIndex != -1 && !cmdPart.substring(0, lastColonIndex).equals("minecraft")) return; - String cmd = lastColonIndex == -1 ? cmdPart : cmdPart.substring(lastColonIndex + 1); - cmd = cmd.toLowerCase(); - if (!cmd.equals("op") && !cmd.equals("deop")) return; int nextSpaceIndex = argPart.indexOf(' '); String targetName = (nextSpaceIndex == -1) ? argPart : argPart.substring(0, nextSpaceIndex); if (targetName.isEmpty()) return; From 239a0c5de9829f277df7556e0a8dd3ab8f1ede0c Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 30 Apr 2025 00:39:34 +0800 Subject: [PATCH 3/5] =?UTF-8?q?feat(bukkit):=20=E5=A4=84=E7=90=86op?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E5=AF=BC=E8=87=B4=E7=9A=84=E6=9D=83=E9=99=90?= =?UTF-8?q?=E5=8F=98=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/font/BukkitFontManager.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index dcfb73ef1..8d52e9ade 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -258,25 +258,22 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { } private void processOpCommand(CommandSender sender, String command) { - if (!sender.hasPermission("minecraft.command.op")) return; - if (!sender.hasPermission("minecraft.command.deop")) return; + if (!sender.hasPermission("minecraft.command.op") || !sender.hasPermission("minecraft.command.deop")) return; String input = command.startsWith("/") ? command.substring(1) : command; int firstSpaceIndex = input.indexOf(' '); String cmdPart = (firstSpaceIndex == -1) ? input : input.substring(0, firstSpaceIndex); String argPart = (firstSpaceIndex == -1) ? "" : input.substring(firstSpaceIndex + 1).trim(); int lastColonIndex = cmdPart.lastIndexOf(':'); if (lastColonIndex != -1 && !cmdPart.substring(0, lastColonIndex).equals("minecraft")) return; - String cmd = lastColonIndex == -1 ? cmdPart : cmdPart.substring(lastColonIndex + 1); - cmd = cmd.toLowerCase(); + String cmd = (lastColonIndex == -1 ? cmdPart : cmdPart.substring(lastColonIndex + 1)).toLowerCase(); if (!cmd.equals("op") && !cmd.equals("deop")) return; + int nextSpaceIndex = argPart.indexOf(' '); + String targetName = (nextSpaceIndex == -1) ? argPart : argPart.substring(0, nextSpaceIndex); + if (targetName.isEmpty()) return; this.plugin.scheduler().asyncLater( () -> { - int nextSpaceIndex = argPart.indexOf(' '); - String targetName = (nextSpaceIndex == -1) ? argPart : argPart.substring(0, nextSpaceIndex); - if (targetName.isEmpty()) return; Player player = Bukkit.getPlayer(targetName); - if (player == null) return; - if (!player.isOnline()) return; + if (player == null || !player.isOnline()) return; removeEmojiSuggestions(player); addEmojiSuggestions(player, getEmojiSuggestion(player)); }, From 89b4e5290a4d7761b9ee5ebae46abed7cd3d4bd0 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 30 Apr 2025 00:57:24 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat(bukkit):=20=E7=9B=B4=E6=8E=A5=E6=8A=93?= =?UTF-8?q?=E5=8C=85=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/font/BukkitFontManager.java | 32 ------------------- .../plugin/network/BukkitNetworkManager.java | 1 + .../plugin/network/PacketConsumers.java | 13 ++++++++ .../craftengine/bukkit/util/Reflections.java | 12 +++++++ 4 files changed, 26 insertions(+), 32 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java index 8d52e9ade..fc4745a63 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/font/BukkitFontManager.java @@ -15,7 +15,6 @@ import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.AdventureHelper; import net.momirealms.craftengine.core.util.VersionHelper; import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -26,14 +25,12 @@ import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerEditBookEvent; import org.bukkit.event.player.PlayerJoinEvent; -import org.bukkit.event.server.ServerCommandEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; import org.bukkit.inventory.view.AnvilView; import java.lang.reflect.InvocationTargetException; import java.util.*; -import java.util.concurrent.TimeUnit; public class BukkitFontManager extends AbstractFontManager implements Listener { private final BukkitCraftEngine plugin; @@ -113,15 +110,9 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { this.processChatEvent(event); } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onServerCommand(ServerCommandEvent event) { - this.processOpCommand(event.getSender(), event.getCommand()); - } - @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onCommand(PlayerCommandPreprocessEvent event) { Player player = event.getPlayer(); - this.processOpCommand(player, event.getMessage()); if (!Config.filterCommand()) return; if (!player.hasPermission(FontManager.BYPASS_COMMAND)) { IllegalCharacterProcessResult result = processIllegalCharacters(event.getMessage()); @@ -256,27 +247,4 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { throw new RuntimeException(e); } } - - private void processOpCommand(CommandSender sender, String command) { - if (!sender.hasPermission("minecraft.command.op") || !sender.hasPermission("minecraft.command.deop")) return; - String input = command.startsWith("/") ? command.substring(1) : command; - int firstSpaceIndex = input.indexOf(' '); - String cmdPart = (firstSpaceIndex == -1) ? input : input.substring(0, firstSpaceIndex); - String argPart = (firstSpaceIndex == -1) ? "" : input.substring(firstSpaceIndex + 1).trim(); - int lastColonIndex = cmdPart.lastIndexOf(':'); - if (lastColonIndex != -1 && !cmdPart.substring(0, lastColonIndex).equals("minecraft")) return; - String cmd = (lastColonIndex == -1 ? cmdPart : cmdPart.substring(lastColonIndex + 1)).toLowerCase(); - if (!cmd.equals("op") && !cmd.equals("deop")) return; - int nextSpaceIndex = argPart.indexOf(' '); - String targetName = (nextSpaceIndex == -1) ? argPart : argPart.substring(0, nextSpaceIndex); - if (targetName.isEmpty()) return; - this.plugin.scheduler().asyncLater( - () -> { - Player player = Bukkit.getPlayer(targetName); - if (player == null || !player.isOnline()) return; - removeEmojiSuggestions(player); - addEmojiSuggestions(player, getEmojiSuggestion(player)); - }, - 1L, TimeUnit.SECONDS); - } } 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 7eb2bc5e4..d485c0da4 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,6 +151,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes registerNMSPacketConsumer(PacketConsumers.HANDSHAKE_C2S, Reflections.clazz$ClientIntentionPacket); registerNMSPacketConsumer(PacketConsumers.LOGIN_ACKNOWLEDGED, Reflections.clazz$ServerboundLoginAcknowledgedPacket); registerNMSPacketConsumer(PacketConsumers.RESOURCE_PACK_RESPONSE, Reflections.clazz$ServerboundResourcePackPacket); + registerNMSPacketConsumer(PacketConsumers.ENTITY_EVENT, Reflections.clazz$ClientboundEntityEventPacket); registerByteBufPacketConsumer(PacketConsumers.LEVEL_CHUNK_WITH_LIGHT, this.packetIds.clientboundLevelChunkWithLightPacket()); registerByteBufPacketConsumer(PacketConsumers.SECTION_BLOCK_UPDATE, this.packetIds.clientboundSectionBlocksUpdatePacket()); registerByteBufPacketConsumer(PacketConsumers.BLOCK_UPDATE, this.packetIds.clientboundBlockUpdatePacket()); 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 13eab66b8..715c1cc55 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 @@ -2286,4 +2286,17 @@ public class PacketConsumers { CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket", e); } }; + + public static final TriConsumer ENTITY_EVENT = (user, event, packet) -> { + try { + int entityId = Reflections.field$ClientboundEntityEventPacket$entityId.getInt(packet); + if (entityId != FastNMS.INSTANCE.method$Entity$getId(user.serverPlayer())) return; + byte eventId = Reflections.field$ClientboundEntityEventPacket$eventId.getByte(packet); + if (eventId >= 24 && eventId <= 28) { + CraftEngine.instance().fontManager().refreshEmojiSuggestions(user.uuid()); + } + } catch (Exception e) { + CraftEngine.instance().logger().warn("Failed to handle ClientboundEntityEventPacket", e); + } + }; } 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 87cc8d579..85165e2e5 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 @@ -3138,6 +3138,18 @@ public class Reflections { ) ); + public static final Field field$ClientboundEntityEventPacket$entityId = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundEntityEventPacket, int.class, 0 + ) + ); + + public static final Field field$ClientboundEntityEventPacket$eventId = requireNonNull( + ReflectionUtils.getDeclaredField( + clazz$ClientboundEntityEventPacket, byte.class, 0 + ) + ); + public static final Constructor constructor$ClientboundEntityEventPacket = requireNonNull( ReflectionUtils.getConstructor( clazz$ClientboundEntityEventPacket, clazz$Entity, byte.class From f7fe08618f0cd0281cf7a225d3899da2a46f7b9e Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Wed, 30 Apr 2025 01:08:31 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat(bukkit):=20=E7=9B=B4=E6=8E=A5=E6=8A=93?= =?UTF-8?q?=E5=8C=85=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/plugin/network/PacketConsumers.java | 4 +++- 1 file changed, 3 insertions(+), 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 715c1cc55..0b9b202fa 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 @@ -2289,8 +2289,10 @@ public class PacketConsumers { public static final TriConsumer ENTITY_EVENT = (user, event, packet) -> { try { + Object player = user.serverPlayer(); + if (player == null) return; int entityId = Reflections.field$ClientboundEntityEventPacket$entityId.getInt(packet); - if (entityId != FastNMS.INSTANCE.method$Entity$getId(user.serverPlayer())) return; + if (entityId != FastNMS.INSTANCE.method$Entity$getId(player)) return; byte eventId = Reflections.field$ClientboundEntityEventPacket$eventId.getByte(packet); if (eventId >= 24 && eventId <= 28) { CraftEngine.instance().fontManager().refreshEmojiSuggestions(user.uuid());