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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user