9
0
mirror of https://github.com/Xiao-MoMi/craft-engine.git synced 2025-12-25 09:59:20 +00:00

feat(bukkit): 直接抓包判断

This commit is contained in:
jhqwqmc
2025-04-30 00:57:24 +08:00
parent 239a0c5de9
commit 89b4e5290a
4 changed files with 26 additions and 32 deletions

View File

@@ -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);
}
}

View File

@@ -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());

View File

@@ -2286,4 +2286,17 @@ public class PacketConsumers {
CraftEngine.instance().logger().warn("Failed to handle ServerboundResourcePackPacket", e);
}
};
public static final TriConsumer<NetWorkUser, NMSPacketEvent, Object> 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);
}
};
}

View File

@@ -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