public class InspectCommand implements CommandExecutor {
private ProtocolManager protocolManager;
private Map<String, Long> packetTimes = new HashMap<>();
public InspectCommand(Plugin plugin) {
protocolManager = ProtocolLibrary.getProtocolManager();
// Регистрируем листенер, который будет обрабатывать пакеты игрока
protocolManager.addPacketListener(new PacketAdapter(plugin, ListenerPriority.NORMAL, PacketType.Play.Client.ALL) {
@Override
public void onPacketReceiving(PacketEvent event) {
Player player = event.getPlayer();
String playerName = player.getName();
// Проверяем, что игрок использует команду /inspect
if (!player.hasMetadata("inspect")) {
return;
}
// Получаем тип и время пакета
PacketType packetType = event.getPacketType();
long timestamp = System.currentTimeMillis();
// Добавляем время пакета в карту
packetTimes.put(packetType + " - " + playerName, timestamp);
}
});
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
sender.sendMessage("Команда только для игроков!");
return true;
}
Player player = (Player) sender;
if (args.length != 1 || !args[0].equals("inspect")) {
return false;
}
// Устанавливаем метаданные игроку, чтобы отслеживать его пакеты
player.setMetadata("inspect", new FixedMetadataValue(plugin, true));
// Ждем 10 секунд, чтобы собрать достаточно информации
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// Удаляем метаданные игрока и выводим время, затраченное на каждый пакет
player.removeMetadata("inspect", plugin);
for (Map.Entry<String, Long> entry : packetTimes.entrySet()) {
String packetType = entry.getKey();
long time = System.currentTimeMillis() - entry.getValue();
player.sendMessage(packetType + " - " + time + "мс");
}
// Очищаем карту для следующего игрока
packetTimes.clear();
return true;
}
}