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

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());
        });
    }
 
Так сделай чтобы обновлялись заполнители, а не сам скоребоард
 
А как внедрить инфу 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);
Казалось бы должно обновлять и как то не хочет. Значение постоянно стоит на нуле.
 
Изучал уже и 10й и 11й и 12й пункты видео, но как то понять до конца не особо получилось, а бездумно брать чужой код не совсем хорошо
Почитай книжки по серьезней тогда, если этого не достаточно для изучения языка.
 
Можешь попробовать использовать 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);
 
Так я уже дал полную реализацию немигающего борда.
 
Так я уже дал полную реализацию немигающего борда.
В этой реализации как то странно скорборд работает. То цвет сбивается в строке, то дополнительные символы какие то всплывают посередине слова. Это как то можно пофиксить?
(типо вот таких)
upload_2021-1-2_17-59-47.png
И появилась утечка оперативной памяти, за пол дня 4гб.... когда раньше 2гб за неделю...
 
Последнее редактирование:
UP
Можно сказать, что проблема осталась.
 
В этой реализации как то странно скорборд работает. То цвет сбивается в строке, то дополнительные символы какие то всплывают посередине слова. Это как то можно пофиксить?
(типо вот таких)
Посмотреть вложение 58488
И появилась утечка оперативной памяти, за пол дня 4гб.... когда раньше 2гб за неделю...
Что то не потребное сделал вот и работает через одно место. Научись сперва с ооп работать.
 
Что то не потребное сделал вот и работает через одно место. Научись сперва с ооп работать.
Что можно сделать непотребное в copy/paste. Я просто скопировал все классы. И как оказалось это была плохая идея. Сервер просто падал несколько раз в сутки из-за нехватки памяти.
 
Что можно сделать непотребное в copy/paste. Я просто скопировал все классы. И как оказалось это была плохая идея. Сервер просто падал несколько раз в сутки из-за нехватки памяти.
Себя спроси D
 
Назад
Верх