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

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

Discussion in 'Разработка плагинов для новичков' started by Slavkaa, May 17, 2017.

Thread Status:
Not open for further replies.
  1. Автор темы
    Slavkaa

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

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

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

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

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

    Dereku Старожил

    Trophy Points:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Значит что то где то как то ты не верно применил. Видно где то с кем то чем то ты не верно разделил.
    Code:
        @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 Администратор

    Trophy Points:
    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 Старожил

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

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

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

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

    Trophy Points:
    21
    Имя в Minecraft:
    Slavok2001
    Ладно, я решил оставить без вывода префикса. Я понял, что для меня это слишком сложно. Да, я невнимателен, это моя основная проблема, ну и, конечно, еще одна моя проблема заключается в скудности моих знаний Java. Тему закрываю.
     
Thread Status:
Not open for further replies.

Share This Page