Помогите ScoreBoard и Tab - оптимизация

Dark_Pro

Старожил
Пользователь
Баллы
103
Имя в Minecraft
Nick
В общем с тяжкими усилиями разобрался как это все работает и нацарапал вот такой вот код, который вроде бы работает, но имеет свои проблемы.
1. Моргание ника в табе и скорборда (сильное моргание)
2. Подозрение на утечку памяти
Java:
    [USER=79777]@Override[/USER]
    public void onEnable(){
        plugin = this;
            new BukkitRunnable(){
                [USER=79777]@Override[/USER]
                public void run(){
                    startscoreboard();
                    starttabprefix();
                }}.runTaskLater(this, 60L);
         Bukkit.getPluginManager().registerEvents(this, this);
    }

     public void createBoard(Player player){
        Scoreboard scoreboard = Bukkit.getServer().getScoreboardManager().getNewScoreboard();
        Objective objective = scoreboard.registerNewObjective("stats", "dummy");
        setScore(objective, player);
        setPrefix(scoreboard);
        player.setScoreboard(scoreboard);
     }

    public void setScore(Objective o, Player p){
        o.setDisplaySlot(DisplaySlot.SIDEBAR);
        o.setDisplayName("§e§lШлакоКрафт");
        o.getScore("§fТут").setScore(3);
        o.getScore("§fКакой-то бред").setScore(2);
        o.getScore("    ").setScore(1);
        o.getScore("§6сайт точка ру").setScore(0);
    }

@SuppressWarnings("deprecation")
    public void startscoreboard() {
        new BukkitRunnable(){
            [USER=79777]@Override[/USER]
            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(plugin, 0L, (long)(80));
    }

    public void starttabprefix() {
        new BukkitRunnable(){
            [USER=79777]@Override[/USER]
            public void run() {
                updatePrefix();
            
            }
        }.runTaskTimerAsynchronously(plugin, 0L, (long)(81));
    }

    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);
            team.addPlayer((OfflinePlayer)player);
                team.setPrefix(getStatus(player)+" §e| §a");
                team.setSuffix(" §e• ");              
            }else{
            team.addEntry(player.getName());
            }
        }
    }

    public 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());
        }
    }

    [USER=74023]@EventHandler[/USER]
    public void onJoin(PlayerJoinEvent e){
        createBoard(e.getPlayer());
    }
За советы буду очень благодарен!
 
Я не профи, но мне кажется ты всё время ScoreBoard ставишь, поэтому он мерцает, если мне память не сдаёт, то там как-то через команды( Team ) можно провернуть
 
Он же создается 1 раз, когда его нет
57fb5b44db.jpg

Такая хрень отошлет дохрелион пакетов, если много игроков, и борд будет мигать.
 
Посмотрел в очень многих плагинах, все так делают, как то это можно изменить?
И они все мигают да?
Код:
public class Board {
    private ScoreboardManager manager;
    private Scoreboard board;
    private Objective objective;

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

    public Scoreboard getScoreboard() {
        return this.board;
    }

    public void setDisplayName(String name) {
        this.objective.setDisplayName(name);
    }

    public void setScore(String name, int index) {
        int length = 64;
        if (name.length() > length + length-2) {
            name = name.substring(0, length + length-2);
        }
        String tname = build(index);
        Team team = this.board.getTeam(tname);
        if (team == null) {
            team = this.board.registerNewTeam(tname);
            team.addEntry(tname);
            Score score = objective.getScore(tname);
            score.setScore(index);
        }
        String color = build(name);
        if (name.length() > length) {
            team.setPrefix(name.substring(0, length));
            team.setSuffix("§" + color + name.substring(length));
        } else {
            team.setPrefix(name);
            team.setSuffix("§" + color);
        }
    }

    public void resetScores(int index) {
        String string = build(index);
        this.board.getTeam(string).unregister();
        this.board.resetScores(string);
    }

    private String build(int index) {
        String hex = Integer.toHexString(index);
        StringBuilder sb = new StringBuilder();
        for (char c : hex.toCharArray()) {
            sb.append("§" + c);
        }
        String value = sb.toString();
        sb.setLength(0);
        return value;
    }
 
    private String build(String name) {
        String color = "f";
        if (name.split("§").length > 1) {
            for (String temp : name.split("§")) {
                if (temp.length() > 0) {
                    color = temp.substring(0, 1);
                }
            }
        }
        return color;
    }
}
Код:
public class Boards {
    private Map<String, Board> boardMap = new ConcurrentHashMap<String, Board>();

    public Board getBoard(Player player) {
        if (player.hasPermission("board.use")) {
            if (!this.boardMap.containsKey(player.getName())) {
                Board board = new Board("-");
                this.boardMap.put(player.getName(), board);
                player.setScoreboard(board.getScoreboard());
            }
        } else if (this.boardMap.containsKey(player.getName())) {
            removeBoard(player);
        }
        return this.boardMap.get(player.getName());
    }

    public void removeBoard(Player player) {
        player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
        this.boardMap.remove(player.getName());
    }
}
В старых версиях длинна строки короче, если что, поменяешь тут int length = 62;
 
Последнее редактирование:
И они все мигают да?
Код:
public class Board {
    private ScoreboardManager manager;
    private Scoreboard board;
    private Objective objective;

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

    public Scoreboard getScoreboard() {
        return this.board;
    }

    public void setDisplayName(String name) {
        this.objective.setDisplayName(name);
    }

    public void setScore(String name, int index) {
        int length = 64;
        if (name.length() > length + length-2) {
            name = name.substring(0, length + length-2);
        }
        String tname = build(index);
        Team team = this.board.getTeam(tname);
        if (team == null) {
            team = this.board.registerNewTeam(tname);
            team.addEntry(tname);
            Score score = objective.getScore(tname);
            score.setScore(index);
        }
        String color = build(name);
        if (name.length() > length) {
            team.setPrefix(name.substring(0, length));
            team.setSuffix("§" + color + name.substring(length));
        } else {
            team.setPrefix(name);
            team.setSuffix("§" + color);
        }
    }

    public void resetScores(int index) {
        String string = build(index);
        this.board.getTeam(string).unregister();
        this.board.resetScores(string);
    }

    private String build(int index) {
        String hex = Integer.toHexString(index);
        StringBuilder sb = new StringBuilder();
        for (char c : hex.toCharArray()) {
            sb.append("§" + c);
        }
        String value = sb.toString();
        sb.setLength(0);
        return value;
    }
 
    private String build(String name) {
        String color = "f";
        if (name.split("§").length > 1) {
            for (String temp : name.split("§")) {
                if (temp.length() > 0) {
                    color = temp.substring(0, 1);
                }
            }
        }
        return color;
    }
}
Код:
public class Boards {
    private Map<String, Board> boardMap = new ConcurrentHashMap<String, Board>();

    public Board getBoard(Player player) {
        if (player.hasPermission("board.use")) {
            if (!this.boardMap.containsKey(player.getName())) {
                Board board = new Board("-");
                this.boardMap.put(player.getName(), board);
                player.setScoreboard(board.getScoreboard());
            }
        } else if (this.boardMap.containsKey(player.getName())) {
            removeBoard(player);
        }
        return this.boardMap.get(player.getName());
    }

    public void removeBoard(Player player) {
        player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
        this.boardMap.remove(player.getName());
    }
}
В старых версиях длинна строки короче, если что, поменяешь тут int length = 62;
Пасиб
 
57fb5b44db.jpg

Такая хрень отошлет дохрелион пакетов, если много игроков, и борд будет мигать.
Чисто ради изучения, если бы я заменил данные строки на
Код:
for(String entry : scoreboard.getEntries()){
                           scoreboard.resetScores(entry);
                       }
так полагаю избавился бы с зависанием тпс?
 
Назад
Верх