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

Помогите Мигающий ScoreBoard

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

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

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Имеется ScoreBoard в котором мерцает скорборд, и чем больше игроков играет тем сильнее мерцает.
    В ооп не шарю, находил какой-то код, но так в нем и не разобрался.
    Код:
        @EventHandler
        public void onJoin(PlayerJoinEvent e){
            createBoard(e.getPlayer());
        }
    
         public void createBoard(Player player) {
            Scoreboard scoreboard = Bukkit.getServer().getScoreboardManager().getNewScoreboard();
            Objective objective = scoreboard.registerNewObjective("stats", "dummy");
            Objective objective1 = scoreboard.registerNewObjective("lives", "dummy");
            setScore(objective, player);
            setLevel(objective1, player);
            setPrefix(scoreboard);
            player.setScoreboard(scoreboard);
         }
    
        public void setLevel(Objective o, Player p) {
            o.setDisplaySlot(DisplaySlot.BELOW_NAME);
            o.setDisplayName(data.getString("below"));
                for(Player online : Bukkit.getOnlinePlayers()){
                    Score score = o.getScore(online);
                    long health = Math.round((online).getHealth());
                    score.setScore((int) health);
                }
        }
    
        public void setScore(Objective o, Player p) {
            o.setDisplaySlot(DisplaySlot.SIDEBAR);
            List<String> board = new ArrayList<>();
            board = data.getStringList("scoreboard.score");
            o.setDisplayName(data.getString("scoreboard.title"));
            o.getScore(board.get(0).replace("{battle}", ""+points.get(p))).setScore(4);
            o.getScore(board.get(1)).setScore(3);
            o.getScore(board.get(2).replace("{random}", randomLine(p))).setScore(2);
            o.getScore(board.get(3)).setScore(1);
            o.getScore(board.get(4)).setScore(0);
        }
    
    @SuppressWarnings("deprecation")
        public void startscoreboard() {
            new BukkitRunnable(){
                @Override
                public void run() {
                    for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                        Scoreboard scoreboard = player.getScoreboard();
                        if(scoreboard == null){
                            createBoard(player);
                        }else{
                            for(String entry : scoreboard.getEntries()){
                               scoreboard.resetScores(entry);
                            }
                            setScore(scoreboard.getObjective("stats"), player);
                            setLevel(scoreboard.getObjective("lives"), player);
                            player.setScoreboard(scoreboard); 
                        }
                    }
                }
            }.runTaskTimer(Main.getInstance(), 0L, (long)(60));
        }
    
    
        public void starttabprefix() {
            new BukkitRunnable(){
                @Override
                public void run() {
                    updatePrefix();
                }
            }.runTaskTimer(Main.getInstance(), 0L, (long)(61));
        }
    
        public void setPrefix(Scoreboard scoreboard) {
            for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                String string = "#" + player.getName();
                String preo;
            if(string.length() > 16) {
                    preo = string.substring(0, 16);
                }else{
                    preo = string;
            }
           
            Team team = scoreboard.getTeam(preo);
            if (team == null) {
                team = scoreboard.registerNewTeam(preo);
                if(Events.getRegion(player).equalsIgnoreCase("Кафе")){
                    team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.NEVER);
                }else{
                    team.setOption(Team.Option.COLLISION_RULE, Team.OptionStatus.ALWAYS);
                }
                team.addPlayer((OfflinePlayer)player);
                    team.setPrefix(data.getString("prefix").replace("{level}", ""+Level.get(player)));
                }else{
                team.addEntry(player.getName());
                }
            } 
        }
    
        public void updatePrefix() {
            for (Player player : Bukkit.getServer().getOnlinePlayers()) {
                for (Team team : player.getScoreboard().getTeams()) {
                    team.unregister();
                }
            }
            Bukkit.getServer().getOnlinePlayers().stream().forEach((player) -> {
                setPrefix(player.getScoreboard());
            });
        }
    
     
  2. _EneRo_

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

    Баллы:
    76
    Так сделай чтобы обновлялись заполнители, а не сам скоребоард
     
  3. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    А можно какой нибудь намек, как это можно реализовать
     
  4. alexandrage

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

    Баллы:
    173
  5. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
  6. alexandrage

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

    Баллы:
    173
  7. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Изучал уже и 10й и 11й и 12й пункты видео, но как то понять до конца не особо получилось, а бездумно брать чужой код не совсем хорошо
     
  8. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    А как внедрить инфу DisplaySlot.BELOW_NAME (строка между игроком и ником)
    Код:
    я занес в Board
            private final Objective objective2;
            this.objective2 = board.registerNewObjective("lives", "dummy");
            this.objective2.setDisplaySlot(DisplaySlot.BELOW_NAME);
            this.objective2.setDisplayName("§c♥");
    
    и 
    
            public void resetLive(Player p, String name){
                Score score = objective2.getScore(name);
                long health = Math.round((p).getHealth());
                score.setScore((int) health);
            }
    
    в run() добавил
    board.resetLive(player, live);
    
    Казалось бы должно обновлять и как то не хочет. Значение постоянно стоит на нуле.
     
  9. alexandrage

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

    Баллы:
    173
    Почитай книжки по серьезней тогда, если этого не достаточно для изучения языка.
     
  10. HogeltBellai

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

    Баллы:
    66
    Имя в Minecraft:
    HogeltBellai
    Можешь попробовать использовать Team, Scheduler и Thread обновлять только суффиксы.


    Код:
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    Team team9 = scoreboard.getTeam("line9");
                    Team team5 = scoreboard.getTeam("line5");
                    team9.setSuffix("" + format.format(data));
                    team5.setSuffix("" + SkyWars.members.size());
                  
                }
            });
            thread.start();

    Код:
            Bukkit.getScheduler().runTaskTimer(SkyWars.getPlugin(), new Runnable() {
                public void run() {
                    for(Player players : Bukkit.getOnlinePlayers()) {
                        updateScoreboard(players.getScoreboard(), players);
                    }
                }
    Но ты уж прости, весь код кидать не буду, ты должен сам научиться это делать.
    Попробуй изучить этот вопрос на ютубе, там много полезностей.

    Если идти по твоим стопам, то точно не стоит в шулдер вставлять -
    player.setScoreboard(scoreboard);
     
  11. alexandrage

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

    Баллы:
    173
    Так я уже дал полную реализацию немигающего борда.
     
  12. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    В этой реализации как то странно скорборд работает. То цвет сбивается в строке, то дополнительные символы какие то всплывают посередине слова. Это как то можно пофиксить?
    (типо вот таких)
    upload_2021-1-2_17-59-47.png
    И появилась утечка оперативной памяти, за пол дня 4гб.... когда раньше 2гб за неделю...
     
    Последнее редактирование: 3 янв 2021
  13. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    UP
    Можно сказать, что проблема осталась.
     
  14. HogeltBellai

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

    Баллы:
    66
    Имя в Minecraft:
    HogeltBellai
    Попробуй мою, что ещё сказать
     
  15. alexandrage

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

    Баллы:
    173
    Что то не потребное сделал вот и работает через одно место. Научись сперва с ооп работать.
     
  16. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Что можно сделать непотребное в copy/paste. Я просто скопировал все классы. И как оказалось это была плохая идея. Сервер просто падал несколько раз в сутки из-за нехватки памяти.
     
  17. alexandrage

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

    Баллы:
    173
    Себя спроси D
     

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