Обновить заголовок scoreboard без обновления самого scoreboard

Namer_PRO

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Namer_PRO
Добрый день!

Возникла проблема: когда я обновляю scoreboard с интервалом в 1 тик, он начинает мигать. На сколько понял - это из-за того, что отправляются два пакета: один для удаления, а другой для добавления, между чем есть некоторое время и поэтому табло мерцает. Слышал, что можно использовать teams, но не очень понял, как это к заголовку применить.

Проблема:
ezgif-com-video-to-gif.gif

Вот мой код:
PHP:
package ru.namerpro.NamerBoard;

import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;

public class sendBoard implements Listener
{
    
    @SuppressWarnings("deprecation")
    public void createBoard(Player p)
    {
        
        String title = "12345678";
        
        Bukkit.getScheduler().scheduleSyncRepeatingTask(Main.plugin, new Runnable() {
            
            int n = 0, s = 0;
            boolean flag = false;
            String line = "        ";
            
            @Override
            public void run() {
                
                ScoreboardManager manager = Bukkit.getScoreboardManager();
                Scoreboard board = manager.getNewScoreboard();
                
                Objective objective = board.registerNewObjective("test", "dummy");
                objective.setDisplaySlot(DisplaySlot.SIDEBAR);
                
                if(!flag)
                {
                    
                    if(pushLetter(line).equals("null"))
                    {
                        
                        char[] hLine = line.toCharArray();
                        
                        hLine[line.length() - 1] = title.toCharArray()[n];
                        
                        line = String.copyValueOf(hLine);
                        
                        n += 1;
                        
                    }
                    else if(pushLetter(line).equals("full"))
                    {
                        
                        line = "        ";
                        n = 0;
                        flag = true;
                        
                    }
                    else
                    {
                        
                        line = pushLetter(line);
                        
                    }
                    
                    objective.setDisplayName(ChatColor.AQUA + "► " + ChatColor.WHITE + "§l" + line);
                    
                    
                }
                else
                {
                    
                    objective.setDisplayName(ChatColor.AQUA + "► " + ChatColor.WHITE + "§l" + title);
                    
                    s += 1;
                    
                }
                
                if(s == 60)
                {
                    
                    flag = false;
                    
                    s = 0;
                    
                }
                
                Score sc1 = objective.getScore("ПРОСТО ТЕКСТ!");
                sc1.setScore(1);
                
                p.setScoreboard(board);
                
                
            }
            
        }, 0, (long) 1);
        
    }
    
    public static String pushLetter(String line)
    {
        
        boolean full = true;
        
        for(int i = 0; i < line.length(); i++)
        {
            
            if(line.charAt(i) == ' ')
            {
                
                full = false;
                
            }
            
        }
        
        if(full)
        {
            
            return "full";
            
        }
        
        char[] res = new char[line.length()];
        
        for(int i = line.length()-1; i > 0; i--)
        {
            
            if((line.charAt(i) != ' ') & (line.charAt(i - 1) == ' '))
            {
                
                res = line.toCharArray();
                res[i] = ' ';
                res[i-1] = line.charAt(i);
                
                return String.copyValueOf(res);
                
            }
            
        }
        
        return "null";
        
    }
    
    @EventHandler()
    public void applyBoard(PlayerJoinEvent e)
    {
        
        Bukkit.getScheduler().runTaskLater(Main.plugin, new Runnable()
        {
            
            @Override
            public void run()
            {
                
                createBoard(e.getPlayer());
                
            }
            
        }, 1);
        
    }
    
}

Заранее спасибо 🙂
 
Регается тима для каждой строки и сетается скор по имени тимы, и потом у тимы меняется суффикс и префикс и без ресетания скора обновляется текст динамически.
Буду знать что так можно.
 
Аж глаза вытекли. Вот дарю.

Код:
package Example.board;

import java.util.HashMap;
import java.util.Map;

import org.bukkit.Bukkit;
import org.bukkit.scoreboard.DisplaySlot;
import org.bukkit.scoreboard.Objective;
import org.bukkit.scoreboard.Score;
import org.bukkit.scoreboard.Scoreboard;
import org.bukkit.scoreboard.ScoreboardManager;

public class Board {
    private ScoreboardManager manager;
    private Scoreboard board;
    private Objective objective;
    private Map<Integer, String> score;

    public Board(String displayName) {
        this.manager = Bukkit.getScoreboardManager();
        this.board = manager.getNewScoreboard();
        this.objective = board.registerNewObjective("test", "dummy", displayName);
        this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
        this.score = new HashMap<Integer, String>();
    }

    public Scoreboard getScoreboard() {
        return board;
    }

    public void setDisplayName(String name) {
        this.objective.setDisplayName(name);
    }
   
    public void insertScore(String name, int index) {
        if(score.containsKey(index)) {
            this.resetScores(score.get(index));
        }
        score.put(index, name);
        Score score = objective.getScore(name);
        score.setScore(index);
    }

    public void resetScores(String name) {
        this.board.resetScores(name);
    }
}
А не лучше было бы создать BoardBuilder и объект AnimatedBoard который можно было бы передать в билдер?
 
Назад
Верх