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

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

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

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

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    В общем с тяжкими усилиями разобрался как это все работает и нацарапал вот такой вот код, который вроде бы работает, но имеет свои проблемы.
    1. Моргание ника в табе и скорборда (сильное моргание)
    2. Подозрение на утечку памяти
    Код:
        [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());
        }
    
    За советы буду очень благодарен!
     
  2. miku5102

    miku5102 Активный участник

    Баллы:
    61
    Имя в Minecraft:
    Miku5102
    Я не профи, но мне кажется ты всё время ScoreBoard ставишь, поэтому он мерцает, если мне память не сдаёт, то там как-то через команды( Team ) можно провернуть
     
  3. alexandrage

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

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

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    TPS вообще не падал не разу, а вот оперативка забивалась
     
  5. alexandrage

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

    Баллы:
    173
    Дык он падает на 1 тик когда твой говнокод шлет дохрелион пакетов игрокам.
     
  6. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Он же создается 1 раз, когда его нет
     
  7. alexandrage

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

    Баллы:
    173
    [​IMG]
    Такая хрень отошлет дохрелион пакетов, если много игроков, и борд будет мигать.
     
  8. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Посмотрел в очень многих плагинах, все так делают, как то это можно изменить?
     
  9. alexandrage

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

    Баллы:
    173
    И они все мигают да?
    Код:
    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;
     
    Последнее редактирование: 26 ноя 2019
  10. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Пасиб
     
  11. Автор темы
    Dark_Pro

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

    Баллы:
    103
    Имя в Minecraft:
    Nick
    Чисто ради изучения, если бы я заменил данные строки на
    Код:
    
    for(String entry : scoreboard.getEntries()){
                               scoreboard.resetScores(entry);
                           }
    
    так полагаю избавился бы с зависанием тпс?
     

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