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..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 @@ -112,8 +112,9 @@ public class BukkitFontManager extends AbstractFontManager implements Listener { @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onCommand(PlayerCommandPreprocessEvent event) { + Player player = event.getPlayer(); 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()); 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..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 @@ -2286,4 +2286,19 @@ public class PacketConsumers { CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket", e); } }; + + 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(player)) 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