Помогите Очередная ошибка, при создании статистики.

  • Автор темы Автор темы Slavkaa
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Slavkaa

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Slavok2001
Создавая плагин на статистику, мозгами девелоперов с рубаккита, я столкнулся с новой проблемой. Мне помогли вывести префикс группы, в которой состоит игрок. Но, как только там появляется 'Player p = Bukkit.getPlayer(args[0]), т.е. игрок, перестает работать выводиться статистика игроков, которые оффлайн, хотя данные, которые выводятся, хранятся в файле. Подскажите, как мне решить эту проблему. При попытки получения статистики игрока, который оффлайн, выходит знакомая ошибка "Am internal..."
Код:
Java:
    @Override
    public boolean onCommand(CommandSender s, Command cmd, String label, String[] args) {
        String arg1 = args[0].toLowerCase();
        if(args.length != 1) {
            s.sendMessage("Неверное использование");
            return true;
        }
        if(!plugin.getConfig().contains("players." + arg1)) {
            s.sendMessage("Такого игрока нет");
            return true;
        }

        Player player = Bukkit.getPlayer(args[0]);
        String group = Main.c.getPrimaryGroup(player);
        String prefix = Main.c.getGroupPrefix(player.getWorld(), group);
        prefix = prefix.replace("&", "\u00a7");
        String status = Bukkit.getPlayerExact(args[0]) == null ? plugin.getConfig().getString("status.offline") : plugin.getConfig().getString("status.online");
        int kills = plugin.getConfig().getInt("players." + arg1 + ".kills");
        int deaths = plugin.getConfig().getInt("players." + arg1 + ".deaths");
        int rating = plugin.getConfig().getInt("players." + arg1 + ".rating");
        String skills = String.valueOf(kills);
       String sdeaths = String.valueOf(deaths);
       String srating = String.valueOf(rating);
       int percent = deaths == 0 && kills == 0 ? 0 : kills*100/(deaths+kills);
       String spercent = percent < 50 ? ChatColor.RED + String.valueOf(percent) : percent < 60 ? ChatColor.YELLOW + String.valueOf(percent) : percent < 75 ? ChatColor.DARK_AQUA + String.valueOf(percent) : percent < 95 ? ChatColor.DARK_PURPLE + String.valueOf(percent) : ChatColor.LIGHT_PURPLE + String.valueOf(percent);
        List<String> stat = plugin.getConfig().getStringList("message");
        for (String statlist : stat) {
            statlist = statlist.replace("&", "\u00a7");
            statlist = statlist.replaceAll("%kills", skills);
            statlist = statlist.replaceAll("%deaths", sdeaths);
            statlist = statlist.replaceAll("%rating", srating);
            statlist = statlist.replaceAll("%nick", args[0]);
            statlist = statlist.replaceAll("%percent", spercent);
            statlist = statlist.replaceAll("%prefix", prefix);
            statlist = statlist.replaceAll("%status", status);
            s.sendMessage(statlist);
        }
        return true;
    }
Конфиг, из которого берутся данные:
Код:
status:
  online: '&aOnline'
  offline: '&cOffline'
message:
- '&6==================='
- '&6Ник: &e%nick'
- '&6Привилегия: %prefix'
- '&6Убийств: &a%kills'
- '&cСмертей: %deaths'
- '&eБоевой рейтинг: &a%rating'
- '&6Процент побед: %percent%'
- '&6Статус: %status'
- '&6==================='
config:
  rating-add: 6
  rating-remove: 8
players:
  slavkaa:
    kills: 0
    rating: 0
    deaths: 0
  blackmaster:
    kills: 0
    rating: 0
    deaths: 0
 
Java:
OfflinePlayer player = Bukkit.getPlayer(args[0]);
if (player == null) {
    player = Bukkit.getOfflinePlayer(args[0]);
}
Или Java 8 вариант:
Java:
OfflinePlayer player = Optional.ofNullable(Bukkit.getPlayer(args[0])).orElse(Bukkit.getOfflinePlayer(args[0]));
 
Java:
OfflinePlayer player = Bukkit.getPlayer(args[0]);
if (player == null) {
    player = Bukkit.getOfflinePlayer(args[0]);
}
Или Java 8 вариант:
Java:
OfflinePlayer player = Optional.ofNullable(Bukkit.getPlayer(args[0])).orElse(Bukkit.getOfflinePlayer(args[0]));
Не помогло. Ошибка осталась.
 
Не помогло. Ошибка осталась.
Значит что то где то как то ты не верно применил. Видно где то с кем то чем то ты не верно разделил.
Java:
    @Override
    public boolean onCommand(CommandSender s, Command cmd, String label, String[] args) {
        if(args.length != 1) {
            s.sendMessage("Неверное использование");
            return true;
        }
        String arg1 = args[0].toLowerCase();
        if(!plugin.getConfig().contains("players." + arg1)) {
            s.sendMessage("Такого игрока нет");
            return true;
        }

        //Player player = Bukkit.getPlayer(args[0]);
        OfflinePlayer player = Optional.ofNullable(Bukkit.getPlayer(args[0])).orElse(Bukkit.getOfflinePlayer(args[0]));
        String group = Main.c.getPrimaryGroup(player);
        String prefix = Main.c.getGroupPrefix(player.getWorld(), group);//Possible NullPointerException
        prefix = prefix.replace("&", "\u00a7");
        String status = !player.isOnline() ? plugin.getConfig().getString("status.offline") : plugin.getConfig().getString("status.online");
        int kills = plugin.getConfig().getInt("players." + arg1 + ".kills");
        int deaths = plugin.getConfig().getInt("players." + arg1 + ".deaths");
        int rating = plugin.getConfig().getInt("players." + arg1 + ".rating");
        String skills = String.valueOf(kills);
       String sdeaths = String.valueOf(deaths);
       String srating = String.valueOf(rating);
       int percent = deaths == 0 && kills == 0 ? 0 : kills*100/(deaths+kills);
       String spercent = percent < 50 ? ChatColor.RED + String.valueOf(percent) : percent < 60 ? ChatColor.YELLOW + String.valueOf(percent) : percent < 75 ? ChatColor.DARK_AQUA + String.valueOf(percent) : percent < 95 ? ChatColor.DARK_PURPLE + String.valueOf(percent) : ChatColor.LIGHT_PURPLE + String.valueOf(percent);
        List<String> stat = plugin.getConfig().getStringList("message");
        for (String statlist : stat) {
            statlist = statlist.replace("&", "\u00a7");
            statlist = statlist.replace("%kills", skills);
            statlist = statlist.replace("%deaths", sdeaths);
            statlist = statlist.replace("%rating", srating);
            statlist = statlist.replace("%nick", player.getName());
            statlist = statlist.replace("%percent", spercent);
            statlist = statlist.replace("%prefix", prefix);
            statlist = statlist.replace("%status", status);
            s.sendMessage(statlist);
        }
        return true;
    }
По идее это должно работать. Но я не знаю, какой шайтан код у тебя в других местах.
 
Java:
OfflinePlayer player = Bukkit.getPlayer(args[0]);
if (player == null) {
    player = Bukkit.getOfflinePlayer(args[0]);
}
Или Java 8 вариант:
Java:
OfflinePlayer player = Optional.ofNullable(Bukkit.getPlayer(args[0])).orElse(Bukkit.getOfflinePlayer(args[0]));
Сервак сдохнет же от getOfflinePlayer.

  1. Player player = Bukkit.getPlayer(args[0]); ->Тут может быть null
  2. String group = Main.c.getPrimaryGroup(player); ->getPrimaryGroup(из null == npe);
 
Я ему предлагал читать json у мира, но он пошёл по другому пути.
Тут проблема чисто в невнимательности, а не в том что и как юзать. То у него деление на ноль, то npe. Ну и по мелочи, хранить всех игроков в одном файле не есть норм.
 
Последнее редактирование:
Ладно, я решил оставить без вывода префикса. Я понял, что для меня это слишком сложно. Да, я невнимателен, это моя основная проблема, ну и, конечно, еще одна моя проблема заключается в скудности моих знаний Java. Тему закрываю.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх