Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Slavkaa, 17 май 2017.

Статус темы:
Закрыта.
  1. Автор темы
    Slavkaa

    Slavkaa Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    Slavok2001
    Создавая плагин на статистику, мозгами девелоперов с рубаккита, я столкнулся с новой проблемой. Мне помогли вывести префикс группы, в которой состоит игрок. Но, как только там появляется 'Player p = Bukkit.getPlayer(args[0]), т.е. игрок, перестает работать выводиться статистика игроков, которые оффлайн, хотя данные, которые выводятся, хранятся в файле. Подскажите, как мне решить эту проблему. При попытки получения статистики игрока, который оффлайн, выходит знакомая ошибка "Am internal..."
    Код:
    Код:
        @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
    
     
  2. Хостинг MineCraft
    <
  3. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Код:
    OfflinePlayer player = Bukkit.getPlayer(args[0]);
    if (player == null) {
        player = Bukkit.getOfflinePlayer(args[0]);
    }
    Или Java 8 вариант:
    Код:
    OfflinePlayer player = Optional.ofNullable(Bukkit.getPlayer(args[0])).orElse(Bukkit.getOfflinePlayer(args[0]));
     
  4. Автор темы
    Slavkaa

    Slavkaa Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    Slavok2001
    Не помогло. Ошибка осталась.
     
  5. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Значит что то где то как то ты не верно применил. Видно где то с кем то чем то ты не верно разделил.
    Код:
        @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;
        }
    По идее это должно работать. Но я не знаю, какой шайтан код у тебя в других местах.
     
  6. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Сервак сдохнет же от getOfflinePlayer.[DOUBLEPOST=1495080486,1495080350][/DOUBLEPOST]
    1. Player player = Bukkit.getPlayer(args[0]); ->Тут может быть null
    2. String group = Main.c.getPrimaryGroup(player); ->getPrimaryGroup(из null == npe);
     
  7. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Я ему предлагал читать json у мира, но он пошёл по другому пути.
     
  8. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    Тут проблема чисто в невнимательности, а не в том что и как юзать. То у него деление на ноль, то npe. Ну и по мелочи, хранить всех игроков в одном файле не есть норм.
     
    Последнее редактирование: 18 май 2017
  9. Автор темы
    Slavkaa

    Slavkaa Новичок Пользователь

    Баллы:
    21
    Имя в Minecraft:
    Slavok2001
    Ладно, я решил оставить без вывода префикса. Я понял, что для меня это слишком сложно. Да, я невнимателен, это моя основная проблема, ну и, конечно, еще одна моя проблема заключается в скудности моих знаний Java. Тему закрываю.
     
Статус темы:
Закрыта.

Поделиться этой страницей