Помогите Как достать статистику оффлайн игрока

ermaksochi

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Serega007
Здравствуйте, мне нужно достать статистику оффлайн игрока (сколько он убил игроков или сколько блоков снега сломал). p.getStatistic не работает на оффлайн игроков. Да знаю, можно создать свою статистику но зачем когда есть world/stats/uuid.json.
В данной теме этот вопрос уже задавался но там нет чёткого ответа да и я новичок в яве, можно мне пример кода?
 
Здравствуйте, мне нужно достать статистику оффлайн игрока (сколько он убил игроков или сколько блоков снега сломал). p.getStatistic не работает на оффлайн игроков. Да знаю, можно создать свою статистику но зачем когда есть world/stats/uuid.json.
В данной теме этот вопрос уже задавался но там нет чёткого ответа да и я новичок в яве, можно мне пример кода?
По UUID берешь этот файл из папки мира и парсишь (Json формат). Достаешь нужную инфу. Для работы с Json рекомендую пользоваться Gson библиотекой (уже встроена в ядро).
 
Ну вообще лучше использовать свою статистику, и гибче и надежнее будет
 
Что я не так делаю?
Код:
        else if(args[0].equalsIgnoreCase("statistics")) {
            sender.sendMessage("§4[§5Events§4] §cДанная команда в разработке!");
            String uuidstring = Bukkit.getPlayer(args[1]).getUniqueId().toString();
            sender.sendMessage("uuid:" + uuidstring);

            try {
            File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "stats");
            for (File playerfile : playerfolder.listFiles()) {
                String filename = playerfile.getName();
                String playername = filename.substring(0, filename.length() - 5);
            
                if (playername.trim().equalsIgnoreCase(uuidstring)) {
                    JSONParser jsonParser = new JSONParser();
                    Object parsed = jsonParser.parse(new FileReader(playerfolder.getPath()));
                    JSONObject jsonObject = (JSONObject) parsed;
                    long stats = (long) jsonObject.get("stat.mineBlock.minecraft.snow");
                    sender.sendMessage("Блоков снега сломано: " + stats);
                }
            }
            } catch (IOException | org.json.simple.parser.ParseException e) {
                e.printStackTrace();
            }
            return true;
        }
Код:
[00:08:46] [Server thread/INFO]: Serega007 issued server command: /event statistics Serega007
[00:08:46] [Server thread/WARN]: java.io.FileNotFoundException: .\world\stats (Отказано в доступе)
[00:08:46] [Server thread/WARN]:     at java.io.FileInputStream.open0(Native Method)
[00:08:46] [Server thread/WARN]:     at java.io.FileInputStream.open(Unknown Source)
[00:08:46] [Server thread/WARN]:     at java.io.FileInputStream.<init>(Unknown Source)
[00:08:46] [Server thread/WARN]:     at java.io.FileInputStream.<init>(Unknown Source)
[00:08:46] [Server thread/WARN]:     at java.io.FileReader.<init>(Unknown Source)
[00:08:46] [Server thread/WARN]:     at klaster.main.CommandEvent.onCommand(CommandEvent.java:600)
[00:08:46] [Server thread/WARN]:     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[00:08:46] [Server thread/WARN]:     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[00:08:46] [Server thread/WARN]:     at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:648)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1399)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1234)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[00:08:46] [Server thread/WARN]:     at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[00:08:46] [Server thread/WARN]:     at java.util.concurrent.FutureTask.run(Unknown Source)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
[00:08:46] [Server thread/WARN]:     at java.lang.Thread.run(Unknown Source)
 
Последнее редактирование:
Что я не так делаю?
Код:
        else if(args[0].equalsIgnoreCase("statistics")) {
            sender.sendMessage("§4[§5Events§4] §cДанная команда в разработке!");
            String uuidstring = Bukkit.getPlayer(args[1]).getUniqueId().toString();
            sender.sendMessage("uuid:" + uuidstring);

            try {
            File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "stats");
            for (File playerfile : playerfolder.listFiles()) {
                String filename = playerfile.getName();
                String playername = filename.substring(0, filename.length() - 5);
           
                if (playername.trim().equalsIgnoreCase(uuidstring)) {
                    JSONParser jsonParser = new JSONParser();
                    Object parsed = jsonParser.parse(new FileReader(playerfolder.getPath()));
                    JSONObject jsonObject = (JSONObject) parsed;
                    long stats = (long) jsonObject.get("stat.mineBlock.minecraft.snow");
                    sender.sendMessage("Блоков снега сломано: " + stats);
                }
            }
            } catch (IOException | org.json.simple.parser.ParseException e) {
                e.printStackTrace();
            }
            return true;
        }
Код:
[00:08:46] [Server thread/INFO]: Serega007 issued server command: /event statistics Serega007
[00:08:46] [Server thread/WARN]: java.io.FileNotFoundException: .\world\stats (Отказано в доступе)
[00:08:46] [Server thread/WARN]:     at java.io.FileInputStream.open0(Native Method)
[00:08:46] [Server thread/WARN]:     at java.io.FileInputStream.open(Unknown Source)
[00:08:46] [Server thread/WARN]:     at java.io.FileInputStream.<init>(Unknown Source)
[00:08:46] [Server thread/WARN]:     at java.io.FileInputStream.<init>(Unknown Source)
[00:08:46] [Server thread/WARN]:     at java.io.FileReader.<init>(Unknown Source)
[00:08:46] [Server thread/WARN]:     at klaster.main.CommandEvent.onCommand(CommandEvent.java:600)
[00:08:46] [Server thread/WARN]:     at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44)
[00:08:46] [Server thread/WARN]:     at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141)
[00:08:46] [Server thread/WARN]:     at org.bukkit.craftbukkit.v1_12_R1.CraftServer.dispatchCommand(CraftServer.java:648)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PlayerConnection.handleCommand(PlayerConnection.java:1399)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PlayerConnection.a(PlayerConnection.java:1234)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:45)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PacketPlayInChat.a(PacketPlayInChat.java:1)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.PlayerConnectionUtils$1.run(SourceFile:13)
[00:08:46] [Server thread/WARN]:     at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
[00:08:46] [Server thread/WARN]:     at java.util.concurrent.FutureTask.run(Unknown Source)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.SystemUtils.a(SourceFile:46)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.MinecraftServer.D(MinecraftServer.java:748)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.DedicatedServer.D(DedicatedServer.java:406)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.MinecraftServer.C(MinecraftServer.java:679)
[00:08:46] [Server thread/WARN]:     at net.minecraft.server.v1_12_R1.MinecraftServer.run(MinecraftServer.java:577)
[00:08:46] [Server thread/WARN]:     at java.lang.Thread.run(Unknown Source)
Наверное в FileReader нужно файл пихать а не папку с игроками.
 
2. Неправильно извлекаешь значение из json. Это тебе не yaml, здесь нужно извлекать элементы древа последовательно.
Кстати в SnakeYAML тоже не оч просто, пути с разделителем точкой это уже наработки баккита )
 
Получилось, может кому-то пригодится:
Код:
        else if(args[0].equalsIgnoreCase("statistics")) {
            sender.sendMessage("§4[§5Events§4] §cДанная команда в разработке!");
            if(args.length == 1) {
                sender.sendMessage("§4[§5Events§4] §cУкажите ник игрока!");
                return true;
            }
            String uuidstring = Bukkit.getOfflinePlayer(args[1]).getUniqueId().toString();
       
            File playerfolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "stats");
            String filename = "/" + uuidstring +  ".json";
            try (Reader reader = new FileReader(playerfolder.getPath() + filename)){
                    JSONParser jsonParser = new JSONParser();
                    Object parsed = jsonParser.parse(reader);
                    JSONObject jsonObject = (JSONObject) parsed;
                    long stats = (long) jsonObject.get("stat.mineBlock.minecraft.snow");
                    sender.sendMessage("Блоков снега сломано: " + stats);
            } catch (IOException | org.json.simple.parser.ParseException e) {
                sender.sendMessage("§4[§5Events§4]§6 " + args[1] + " §cне существует!");
            } catch (NullPointerException e) {
                sender.sendMessage("Блоков снега сломано: 0");
            }
            return true;
        }
Если я всё же где-то допустил ошибку в коде (не смотря на то что всё работает), говорите, буду рад помощи
 
Последнее редактирование:
Ну кроме того, что оно сломается в 1.13 из за смены формата статистики. Ничего.
 
Назад
Верх