1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите ScoreBoard setPrefix

Тема в разделе "Разработка плагинов для новичков", создана пользователем SaMEC, 3 окт 2018.

  1. Автор темы
    SaMEC

    SaMEC Старожил Пользователь

    Баллы:
    173
    Skype:
    support.meedway
    Имя в 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]
    
     
    Последнее редактирование: 3 окт 2018
  2. Klavy

    Klavy Активный участник Пользователь

    Баллы:
    66
    Ну, конечно, если для каждого игрока у PlayerJoinEvent создавать Team, такая ошибка ожидаема.
    И рекомендую использовать ProtocolLib + Packet Wrapper для таких вещей
     
  3. Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Может быть проблема через запуск из другого потока.
     
  4. Автор темы
    SaMEC

    SaMEC Старожил Пользователь

    Баллы:
    173
    Skype:
    support.meedway
    Имя в Minecraft:
    Nick
    PlayerJoinEvent и в помине не учавствует
    И все же хочется разобраться как реализовать дедовским способом.
     
  5. Klavy

    Klavy Активный участник Пользователь

    Баллы:
    66
    Каждый из тобою использованных игроков должен присутствовать в твоём Scoreboard
     
  6. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Для одного и того же скорборда нельзя регистрировать одну тиму более 1 раза. Проверяй ее наличие прежде чем регистрировать.
     
  7. Автор темы
    SaMEC

    SaMEC Старожил Пользователь

    Баллы:
    173
    Skype:
    support.meedway
    Имя в Minecraft:
    Nick
    Тиму я
    team.unregister();
    Ну примерно я понял почему так, у меня 2 игрока регистрируются в одной тиме, но т.к. я создаю тиму для каждого. Странно почему он все же регистрируется в одной тиме вроде бы я делаю так -
    Код:
            for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                String string = "#" + player.getName();
    и тд
    
     
  8. Автор темы
    SaMEC

    SaMEC Старожил Пользователь

    Баллы:
    173
    Skype:
    support.meedway
    Имя в Minecraft:
    Nick
    Код:
    @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));
        }
     
  9. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Я не думаю, что это целиком безопасно здесь использовать асинхронный таймер
     
  10. LuckyZeeRo

    LuckyZeeRo Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    i0xHeX
    Просто проверяй наличие тимы перед регистрацией.
     
  11. Автор темы
    SaMEC

    SaMEC Старожил Пользователь

    Баллы:
    173
    Skype:
    support.meedway
    Имя в Minecraft:
    Nick
    Благодарю, сделал таким образом и все пошло как по маслу
    Код:
            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());
            }
    
    
     

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