Помогите ScoreBoard setPrefix

  • Автор темы Автор темы SaMEC
  • Дата начала Дата начала

SaMEC

Старожил
Пользователь
Баллы
173
Имя в Minecraft
Nick
Собственно в чем то и дело состоит не пойму вроде и все работает и вроде нет. Ошибка возникает при появлении нового игрока.
Мне пишут, что тима уже используется, но вроде как создаю новую тиму каждому игроку, каждый раз снова.
Код:
    public static void setPrefix(Scoreboard scoreboard) {
      
        for (Player player : Bukkit.getServer().getOnlinePlayers()) {
            String string = "#" + player.getName();
            if (string.length() > 16) {
                string = string.substring(0, 16);
            }
            Team team = scoreboard.registerNewTeam(string);
            team.addPlayer((OfflinePlayer)player);
              
                String string4 = "§c"+Levels.getLevel(player.getName())+"ур §e| §c";
                team.setPrefix(string4);
                team.setSuffix(" §e• "+main.ClanName(player).replaceAll("&", "§"));
            }
    }
    public static void updatePrefix() {
        for (Player player : Bukkit.getServer().getOnlinePlayers()) {
            for (Team team : player.getScoreboard().getTeams()) {
                team.unregister();
            }
        }
        for (Player player : Bukkit.getServer().getOnlinePlayers()) {
           
            setPrefix(player.getScoreboard());
        }
    }
Вот собственно ошибка
Код:
[21:49:01] [Craft Scheduler Thread - 45/WARN]: [LolPlugin] Plugin LolPlugin v1.0 generated an exception while executing task 28
java.lang.IllegalArgumentException: Team name '#LolPlayer' is already in use
    at org.apache.commons.lang.Validate.isTrue(Validate.java:136) ~[craftbukkit-spigot-1.12.2.jar:git-Spigot-93e20b3-e8b6e4f]
    at org.bukkit.craftbukkit.v1_12_R1.scoreboard.CraftScoreboard.registerNewTeam(CraftScoreboard.java:140) ~[craftbukkit-spigot-1.12.2.jar:git-Spigot-93e20b3-e8b6e4f]
    at ru.meedway.corerpg.Main.setPrefix(Main.java:443) ~[?:?]
    at ru.meedway.corerpg.Main.updatePrefix(Main.java:462) ~[?:?]
    at ru.meedway.corerpg.Main$3.run(Main.java:432) ~[?:?]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[craftbukkit-spigot-1.12.2.jar:git-Spigot-93e20b3-e8b6e4f]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:52) [craftbukkit-spigot-1.12.2.jar:git-Spigot-93e20b3-e8b6e4f]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
 
Последнее редактирование:
Ну, конечно, если для каждого игрока у PlayerJoinEvent создавать Team, такая ошибка ожидаема.
И рекомендую использовать ProtocolLib + Packet Wrapper для таких вещей
 
Ну, конечно, если для каждого игрока у PlayerJoinEvent создавать Team, такая ошибка ожидаема.
И рекомендую использовать ProtocolLib + Packet Wrapper для таких вещей
PlayerJoinEvent и в помине не учавствует
И все же хочется разобраться как реализовать дедовским способом.
 
PlayerJoinEvent и в помине не учавствует
И все же хочется разобраться как реализовать дедовским способом.
Каждый из тобою использованных игроков должен присутствовать в твоём Scoreboard
 
Собственно в чем то и дело состоит не пойму вроде и все работает и вроде нет. Ошибка возникает при появлении нового игрока.
Мне пишут, что тима уже используется, но вроде как создаю новую тиму каждому игроку, каждый раз снова.
Вот собственно ошибка
Код:
[21:49:01] [Craft Scheduler Thread - 45/WARN]: [LolPlugin] Plugin LolPlugin v1.0 generated an exception while executing task 28
java.lang.IllegalArgumentException: Team name '#LolPlayer' is already in use
    at org.apache.commons.lang.Validate.isTrue(Validate.java:136) ~[craftbukkit-spigot-1.12.2.jar:git-Spigot-93e20b3-e8b6e4f]
    at org.bukkit.craftbukkit.v1_12_R1.scoreboard.CraftScoreboard.registerNewTeam(CraftScoreboard.java:140) ~[craftbukkit-spigot-1.12.2.jar:git-Spigot-93e20b3-e8b6e4f]
    at ru.meedway.corerpg.Main.setPrefix(Main.java:443) ~[?:?]
    at ru.meedway.corerpg.Main.updatePrefix(Main.java:462) ~[?:?]
    at ru.meedway.corerpg.Main$3.run(Main.java:432) ~[?:?]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftTask.run(CraftTask.java:71) ~[craftbukkit-spigot-1.12.2.jar:git-Spigot-93e20b3-e8b6e4f]
    at org.bukkit.craftbukkit.v1_12_R1.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:52) [craftbukkit-spigot-1.12.2.jar:git-Spigot-93e20b3-e8b6e4f]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
    at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
Для одного и того же скорборда нельзя регистрировать одну тиму более 1 раза. Проверяй ее наличие прежде чем регистрировать.
 
Для одного и того же скорборда нельзя регистрировать одну тиму более 1 раза. Проверяй ее наличие прежде чем регистрировать.
Тиму я
team.unregister();
Ну примерно я понял почему так, у меня 2 игрока регистрируются в одной тиме, но т.к. я создаю тиму для каждого. Странно почему он все же регистрируется в одной тиме вроде бы я делаю так -
Код:
        for (Player player : Bukkit.getServer().getOnlinePlayers()) {
            String string = "#" + player.getName();
и тд
 
Каждый из тобою использованных игроков должен присутствовать в твоём Scoreboard
Код:
@SuppressWarnings("deprecation")
    public static void refresh() {
        new BukkitRunnable(){
            @Override
            public void run() {
                for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                    Scoreboard scoreboard = player.getScoreboard();
                    if(scoreboard == null){
                        createBoard(player);
                    }else{
                       scoreboard.getObjective("stats").unregister(); 
                        Objective objective = scoreboard.registerNewObjective("stats", "dummy");
                        setScore(objective, player);
                        player.setScoreboard(scoreboard);     
                    }
                 
                }
            }
        }.runTaskTimerAsynchronously(m, 0L, (long)(5*20));
    }
 
Код:
@SuppressWarnings("deprecation")
    public static void refresh() {
        new BukkitRunnable(){
            @Override
            public void run() {
                for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                    Scoreboard scoreboard = player.getScoreboard();
                    if(scoreboard == null){
                        createBoard(player);
                    }else{
                       scoreboard.getObjective("stats").unregister();
                        Objective objective = scoreboard.registerNewObjective("stats", "dummy");
                        setScore(objective, player);
                        player.setScoreboard(scoreboard);    
                    }
                
                }
            }
        }.runTaskTimerAsynchronously(m, 0L, (long)(5*20));
    }
Я не думаю, что это целиком безопасно здесь использовать асинхронный таймер
 
Тиму я
team.unregister();
Ну примерно я понял почему так, у меня 2 игрока регистрируются в одной тиме, но т.к. я создаю тиму для каждого. Странно почему он все же регистрируется в одной тиме вроде бы я делаю так -
Код:
        for (Player player : Bukkit.getServer().getOnlinePlayers()) {
            String string = "#" + player.getName();
и тд
Просто проверяй наличие тимы перед регистрацией.
 
Просто проверяй наличие тимы перед регистрацией.
Благодарю, сделал таким образом и все пошло как по маслу
Код:
        Team team = scoreboard.getTeam(string);
     
        if (team == null) {

            team = scoreboard.registerNewTeam(string);
            team.addPlayer((OfflinePlayer)player);
             
                team.setPrefix("§c"+Levels.getLevel(player.getName())+"ур §e| §c");
                team.setSuffix(" §e• "+main.ClanName(player).replaceAll("&", "§"));
            }else{
            team.addEntry(player.getName());
        }
 
Назад
Верх