Обновить заголовок 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);
        
    }
    
}

Заранее спасибо 🙂
 
Попробуй не создавать новый скорборд каждый раз - "собери" его за пределами run() и изменяй требуемое уже внутри(в этом случае Objective#setDisplayName(String)).
 
Аж глаза вытекли. Вот дарю.

Код:
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);
    }
}
 
Аж глаза вытекли. Вот дарю.

Код:
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);
    }
}
Спасибо, но тупо копировать код - не круто 👎 Сейчас только учу java и совмещаю с bukkit. Если я пока чего-то не могу, значит рано еще. Со временем, когда прочту до конца весь учебник, буду разбираться. Код беру на заметку. Еще раз спасибо за желание помочь 👍
 
Спасибо, но тупо копировать код - не круто 👎 Сейчас только учу java и совмещаю с bukkit. Если я пока чего-то не могу, значит рано еще. Со временем, когда прочту до конца весь учебник, буду разбираться. Код беру на заметку. Еще раз спасибо за желание помочь 👍
Пздц хрень какую-то сморозил.
 
Пздц хрень какую-то сморозил.
Ну, согласись, это лучше, чем если бы он лез на рожон без каких-либо представлений о языке. А таких, на минуточку, 90% на этом форуме.
Если есть время - пускай реально джаву изучает, а уже потом баккит. Вай нот?
 
Ну, согласись, это лучше, чем если бы он лез на рожон без каких-либо представлений о языке. А таких, на минуточку, 90% на этом форуме.
Если есть время - пускай реально джаву изучает, а уже потом баккит. Вай нот?
Да не про это я, думал шо он год с х*ем кодит, а такую изи вещь не понимает, ну видимо ошибся.
Собсна экземпл alexandrage говнокод какой-то нерасширяемый, не советовал бы юзать кроме как интернал утилиту какую-то.
 
Да не про это я, думал шо он год с х*ем кодит, а такую изи вещь не понимает, ну видимо ошибся.
Собсна экземпл alexandrage говнокод какой-то нерасширяемый, не советовал бы юзать кроме как интернал утилиту какую-то.
Ну, тут уж я не в курсе. Код не смотрел.
Хотя, конечно, кодинг под баккит в целом не особо сложный, если не брать в расчет невозможность реализовать тот или иной функционал без работы с нмс
 
Ну, тут уж я не в курсе. Код не смотрел.
Хотя, конечно, кодинг под баккит в целом не особо сложный, если не брать в расчет невозможность реализовать тот или иной функционал без работы с нмс
Ну да, порог вхождения оч низкий у бакит апи.
 
Да не про это я, думал шо он год с х*ем кодит, а такую изи вещь не понимает, ну видимо ошибся.
Собсна экземпл alexandrage говнокод какой-то нерасширяемый, не советовал бы юзать кроме как интернал утилиту какую-то.
Словно в нем есть что расширять. Чет в голос.
 
Словно в нем есть что расширять. Чет в голос.
Ну да, в примере только статические строчки, я динамические никак не сделаю по этому классу.
Годится только как пример ознакомления с бордами.
 
Ну да, в примере только статические строчки, я динамические никак не сделаю по этому классу.
Годится только как пример ознакомления с бордами.
Видос выше с не считается динамическим? Ну тогда мне не понять о чем ты.
 
Был простой шедулер написаный по фасту, но там может быть любой обработчик.
Код:
public class ScoreboardRun extends BukkitRunnable {
    private Board board;
    private List<String> list = new ArrayList<String>();
    private int index;

    public ScoreboardRun(Board board) {
        this.board = board;
        setup("localhost      ");
    }

    @Override
    public void run() {
        if (index == list.size()) {
            index = 0;
        }
        this.board.insertScore(list.get(index), 0);
        this.board.setDisplayName(list.get(index));
        index++;
    }
    
    private void setup(String string) {
        String string2 =  Strings.repeat(" ", string.length());
        char[] ch = string.toCharArray();
        int count = ch.length+1;
        for(int i = 0; i<ch.length; i++) {
            for(int x = count; x>i;x--) {
                String s = string2.substring(count-x+i)+ch[i]+string2.substring(0, count-x);
                list.add(string.substring(0,i)+s);
            }
        }
    }
}
 
Последнее редактирование:
Был простой шедулер написаный по фасту, но там может быть любой обработчик.
Код:
public class ScoreboardRun extends BukkitRunnable {
    private Board board;
    private List<String> list = new ArrayList<String>();
    private int index;

    public ScoreboardRun(Board board) {
        this.board = board;
        setup("localhost      ");
    }

    @Override
    public void run() {
        if (index == list.size()) {
            index = 0;
        }
        this.board.insertScore(list.get(index), 0);
        this.board.setDisplayName(list.get(index));
        index++;
    }
  
    private void setup(String string) {
        String string2 =  Strings.repeat(" ", string.length());
        char[] ch = string.toCharArray();
        int count = ch.length+1;
        for(int i = 0; i<ch.length; i++) {
            for(int x = count; x>i;x--) {
                String s = string2.substring(count-x+i)+ch[i]+string2.substring(0, count-x);
                list.add(string.substring(0,i)+s);
            }
        }
    }
}
Ну это костыльно выглядит, оч сложно буит разные анимации под одну иерарихию сделать, и выходит процедурная хрень. Да и плейсхолдеры поддерживать оч неудобно.
Те же банальные разные периоды для обновления разных строк тоже через костыли ток делать.
+ Каждый раз скоры ресетаются вместо того, чтобы через тимы делать.
 
Ну это костыльно выглядит, оч сложно буит разные анимации под одну иерарихию сделать, и выходит процедурная хрень. Да и плейсхолдеры поддерживать оч неудобно.
Те же банальные разные периоды для обновления разных строк тоже через костыли ток делать.
+ Каждый раз скоры ресетаются вместо того, чтобы через тимы делать.
Причем тут твои костыли? Передал борд либе анимации и все. Чушь несешь какую то.
 
Причем тут твои костыли? Передал борд либе анимации и все. Чушь несешь какую то.
Ну тогда и такой борд не нужен либе анимации, оно внутри себя все сможет сделать и проще буит.
Что значит через тимы делать? Пакажи пример. Там только строку и индекс он жрет.
Регается тима для каждой строки и сетается скор по имени тимы, и потом у тимы меняется суффикс и префикс и без ресетания скора обновляется текст динамически.

Опять же основная притензиа - не нужна такая обертка, так то можно доп. обертки над этой написать и все шо угодно сделать, но нужно делать по нормальному.
 
Назад
Верх