My scoreboard plugin not working as it should.

Discussion in 'Plugin Development' started by TijusM, Apr 1, 2023.

Thread Status:
Not open for further replies.
  1. Offline

    TijusM

    So I'm new to minecraft plugins creating/developing and I'm trying to create this scoreboard plugin. But when I tested it, the scoreboard looked weird. It could all be seen in the screenshot. Tried to look on how to solve it but decided to come and ask for help here...
     

    Attached Files:

  2. Offline

    timtower Administrator Administrator Moderator

    And the code?
     
  3. Offline

    TijusM

    Code:
    package com.tijusm.scoreboardx.scoreboardx;
    
    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.event.player.PlayerQuitEvent;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    import org.bukkit.scoreboard.Team;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class ScoreboardXManager implements Listener {
    
        private final ScoreboardManager scoreboardManager;
        private final Scoreboard scoreboard;
        private final Objective objective;
    
        private final Map<Player, Team> teams = new HashMap<>();
    
        public ScoreboardXManager() {
            this.scoreboardManager = Bukkit.getScoreboardManager();
            assert scoreboardManager != null;
            this.scoreboard = scoreboardManager.getNewScoreboard();
            this.objective = scoreboard.registerNewObjective("scoreboard", "dummy", ChatColor.BOLD + "Scoreboard");
            this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
        }
    
        public void enable(Player player) {
            Team team = scoreboard.getTeam(player.getName());
            if (team == null) {
                team = scoreboard.registerNewTeam(player.getName());
                team.addEntry(player.getName());
            }
    
            // set server name (line 1)
            team.addEntry(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "------------------");
            objective.getScore(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "------------------").setScore(7);
            team.setPrefix(ChatColor.WHITE + "" + ChatColor.BOLD + "Server: ");
            team.setSuffix(ChatColor.WHITE + "" + ChatColor.BOLD + "Server");
            objective.getScore(ChatColor.GOLD + "" + ChatColor.BOLD + "Server: ").setScore(6);
    
            // set player name (line 2)
            team.addEntry(ChatColor.GREEN + "Name: ");
            objective.getScore(ChatColor.GREEN + "Name: ").setScore(5);
            team.setPrefix(ChatColor.GREEN + "Name: " + ChatColor.WHITE);
            team.setSuffix(player.getName());
    
            // set player balance (line 3)
            int balance = 100;
            team.addEntry(ChatColor.GOLD + "Balance: ");
            objective.getScore(ChatColor.GOLD + "Balance: ").setScore(4);
            team.setPrefix(ChatColor.GOLD + "Balance: " + ChatColor.WHITE + balance + "  ");
    
            // set player xp amount (line 4)
            team.addEntry(ChatColor.LIGHT_PURPLE + "XP: ");
            objective.getScore(ChatColor.LIGHT_PURPLE + "XP: ").setScore(3);
            team.setPrefix(ChatColor.LIGHT_PURPLE + "XP: " + ChatColor.WHITE);
            team.setSuffix(String.valueOf(player.getExp()));
    
            // set player health (line 5)
            team.addEntry(ChatColor.RED + "Health: ");
            objective.getScore(ChatColor.RED + "Health: ").setScore(2);
            team.setPrefix(ChatColor.RED + "Health: " + ChatColor.WHITE);
            team.setSuffix(String.valueOf(player.getHealth()));
    
            // set server IP address (line 6)
            team.addEntry(ChatColor.DARK_AQUA + "IP: ");
            objective.getScore(ChatColor.DARK_AQUA + "IP: ").setScore(1);
            team.setPrefix(ChatColor.DARK_AQUA + "IP: " + ChatColor.WHITE);
            team.setSuffix("127.0.0.1");
    
            player.setScoreboard(scoreboard);
        }
    
    
        public void disable(Player player) {
            scoreboard.resetScores(player.getName());
            player.setScoreboard(scoreboardManager.getMainScoreboard());
            teams.remove(player);
        }
    
        public void disable() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                disable(player);
            }
        }
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            enable(event.getPlayer());
        }
    
        @EventHandler
        public void onPlayerQuit(PlayerQuitEvent event) {
            disable(event.getPlayer());
        }
    }
    
     
    digital99 likes this.
  4. Offline

    timtower Administrator Administrator Moderator

    Don't set the suffix the entire time then.
     
  5. Offline

    TijusM

    Still didn't help. Same problem.
     
  6. Offline

    timtower Administrator Administrator Moderator

    Show the new code then please
     
  7. Offline

    TijusM

    Code:
    package com.tijusm.scoreboardx.scoreboardx;
    
    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.event.player.PlayerQuitEvent;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    import org.bukkit.scoreboard.Team;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.scoreboard.Score;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class ScoreboardXManager implements Listener {
    
        private final ScoreboardManager scoreboardManager;
        private final Scoreboard scoreboard;
        private final Objective objective;
    
        private final Map<Player, Team> teams = new HashMap<>();
        private final Plugin plugin;
    
        public ScoreboardXManager(Plugin plugin) {
            this.plugin = plugin;
            this.scoreboardManager = Bukkit.getScoreboardManager();
            assert scoreboardManager != null;
            this.scoreboard = scoreboardManager.getNewScoreboard();
            this.objective = scoreboard.registerNewObjective("scoreboard", "dummy", ChatColor.BOLD + "Scoreboard");
            this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
        }
    
        public void enable(Player player) {
            Team team = scoreboard.getTeam(player.getName());
            if (team == null) {
                team = scoreboard.registerNewTeam(player.getName());
                team.addEntry(player.getName());
            }
    
            // set server name (line 1)
            team.addEntry(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "------------------");
            objective.getScore(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "------------------").setScore(7);
            team.setPrefix(ChatColor.WHITE + "" + ChatColor.BOLD + "Server: ");
            team.setSuffix(ChatColor.WHITE + "" + ChatColor.BOLD + "Server");
            objective.getScore(ChatColor.GOLD + "" + ChatColor.BOLD + "Server: ").setScore(6);
    
            // set player name (line 2)
            team.addEntry(ChatColor.GREEN + "Name: ");
            objective.getScore(ChatColor.GREEN + "Name: ").setScore(5);
            team.setPrefix(ChatColor.GREEN + "Name: " + ChatColor.WHITE);
            team.setSuffix(player.getName());
    
            // set player balance (line 3)
            team.addEntry(ChatColor.GOLD + "Balance: ");
            objective.getScore(ChatColor.GOLD + "Balance: ").setScore(4);
    
            // set player xp amount (line 4)
            team.addEntry(ChatColor.LIGHT_PURPLE + "XP: ");
            objective.getScore(ChatColor.LIGHT_PURPLE + "XP: ").setScore(3);
            team.setPrefix(ChatColor.LIGHT_PURPLE + "XP: " + ChatColor.WHITE);
            team.setSuffix(String.valueOf(player.getExp()));
    
            // set player health (line 5)
            team.addEntry(ChatColor.RED + "Health: ");
            objective.getScore(ChatColor.RED + "Health: ").setScore(2);
            team.setPrefix(ChatColor.RED + "Health: " + ChatColor.WHITE);
            team.setSuffix(String.valueOf(player.getHealth()));
    
            // set server IP address (line 6)
            team.addEntry(ChatColor.DARK_AQUA + "IP: ");
            objective.getScore(ChatColor.DARK_AQUA + "IP: ").setScore(1);
            team.setPrefix(ChatColor.DARK_AQUA + "IP: " + ChatColor.WHITE);
            team.setSuffix("127.0.0.1");
    
            player.setScoreboard(scoreboard);
    
            final Player finalPlayer = player;
            Bukkit.getScheduler().runTaskTimer(plugin, () -> {
                if (!finalPlayer.isOnline()) {
                    return;
                }
                int balance = getPlayerBalance(finalPlayer);
                Score score = objective.getScore(ChatColor.GOLD + "Balance: ");
                score.setScore(9);
                score.setScore(Integer.parseInt(String.valueOf(balance)));
            }, 0L, 20L);
    
        }
    
        private int getPlayerBalance(Player finalPlayer) {
            return 0;
        }
    
        public void disable(Player player) {
            scoreboard.resetScores(player.getName());
            player.setScoreboard(scoreboardManager.getMainScoreboard());
            teams.remove(player);
        }
    
        public void disable() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                disable(player);
            }
        }
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            enable(event.getPlayer());
        }
    
        @EventHandler
        public void onPlayerQuit(PlayerQuitEvent event) {
            disable(event.getPlayer());
        }
    }
     
  8. Offline

    timtower Administrator Administrator Moderator

    @TijusM You are still setting the suffix of the team.
    Cache the value that you want to show instead.
    Remove it when you update the scoreboard, set a new one.
     
  9. Offline

    TijusM

    Like this?

    Code:
    package com.tijusm.scoreboardx.scoreboardx;
    
    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.event.player.PlayerQuitEvent;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    import org.bukkit.scoreboard.Team;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.scoreboard.Score;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class ScoreboardXManager implements Listener {
    
        private final ScoreboardManager scoreboardManager;
        private final Scoreboard scoreboard;
        private final Objective objective;
    
        private final Map<Player, Team> teams = new HashMap<>();
        private final Map<Player, Integer> cachedBalances = new HashMap<>(); // Add this line
        private final Plugin plugin;
    
        public ScoreboardXManager(Plugin plugin) {
            this.plugin = plugin;
            this.scoreboardManager = Bukkit.getScoreboardManager();
            assert scoreboardManager != null;
            this.scoreboard = scoreboardManager.getNewScoreboard();
            this.objective = scoreboard.registerNewObjective("scoreboard", "dummy", ChatColor.BOLD + "Scoreboard");
            this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
        }
    
        public void enable(Player player) {
            Team team = scoreboard.getTeam(player.getName());
            if (team == null) {
                team = scoreboard.registerNewTeam(player.getName());
                team.addEntry(player.getName());
            }
    
            // set server name (line 1)
            team.addEntry(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "------------------");
            objective.getScore(ChatColor.GRAY + "" + ChatColor.STRIKETHROUGH + "------------------").setScore(7);
            team.setPrefix(ChatColor.WHITE + "" + ChatColor.BOLD + "Server: ");
            team.setSuffix(ChatColor.WHITE + "" + ChatColor.BOLD + "Server");
            objective.getScore(ChatColor.GOLD + "" + ChatColor.BOLD + "Server: ").setScore(6);
    
            // set player name (line 2)
            team.addEntry(ChatColor.GREEN + "Name: ");
            objective.getScore(ChatColor.GREEN + "Name: ").setScore(5);
            team.setPrefix(ChatColor.GREEN + "Name: " + ChatColor.WHITE + player.getName());
    
            // set player balance (line 3)
            team.addEntry(ChatColor.GOLD + "Balance: ");
            objective.getScore(ChatColor.GOLD + "Balance: ").setScore(4);
    
            // set player xp amount (line 4)
            team.addEntry(ChatColor.LIGHT_PURPLE + "XP: ");
            objective.getScore(ChatColor.LIGHT_PURPLE + "XP: ").setScore(3);
            team.setPrefix(ChatColor.LIGHT_PURPLE + "XP: " + ChatColor.WHITE + player.getExp());
    
            // set player health (line 5)
            team.addEntry(ChatColor.RED + "Health: ");
            objective.getScore(ChatColor.RED + "Health: ").setScore(2);
            team.setPrefix(ChatColor.RED + "Health: " + ChatColor.WHITE + player.getHealth());
    
            // set server IP address (line 6)
            team.addEntry(ChatColor.DARK_AQUA + "IP: ");
            objective.getScore(ChatColor.DARK_AQUA + "IP: ").setScore(1);
            team.setPrefix(ChatColor.DARK_AQUA + "IP: " + ChatColor.WHITE + "127.0.0.1");
    
            player.setScoreboard(scoreboard);
    
            final Player finalPlayer = player;
            Bukkit.getScheduler().runTaskTimer(plugin, () -> {
                if (!finalPlayer.isOnline()) {
                    return;
                }
                int balance = getPlayerBalance(finalPlayer);
                Score score = objective.getScore(ChatColor.GOLD + "Balance: ");
                score.setScore(9);
                score.setScore(Integer.parseInt(String.valueOf(balance)));
            }, 0L, 20L);
    
        }
    
        private int getPlayerBalance(Player finalPlayer) {
            return 0;
        }
    
        public void disable(Player player) {
            scoreboard.resetScores(player.getName());
            player.setScoreboard(scoreboardManager.getMainScoreboard());
            teams.remove(player);
        }
    
        public void disable() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                disable(player);
            }
        }
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            enable(event.getPlayer());
        }
    
        @EventHandler
        public void onPlayerQuit(PlayerQuitEvent event) {
            disable(event.getPlayer());
        }
    }
     
  10. Offline

    timtower Administrator Administrator Moderator

    No, you are still using setPrefix and setSuffix, that is for the entire team.
    You should not be using those 2 methods for this.
     
  11. Offline

    TijusM

    Now? As I said I'm new to this, some things are hard for me to understand.

    Code:
    package com.tijusm.scoreboardx.scoreboardx;
    
    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.event.player.PlayerQuitEvent;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    import org.bukkit.scoreboard.Team;
    import org.bukkit.plugin.Plugin;
    import org.bukkit.scoreboard.Score;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class ScoreboardXManager implements Listener {
    
        private final ScoreboardManager scoreboardManager;
        private final Scoreboard scoreboard;
        private final Objective objective;
    
        private final Map<Player, Team> teams = new HashMap<>();
        private final Map<Player, Integer> cachedBalances = new HashMap<>();
        private final Plugin plugin;
    
        public ScoreboardXManager(Plugin plugin) {
            this.plugin = plugin;
            this.scoreboardManager = Bukkit.getScoreboardManager();
            assert scoreboardManager != null;
            this.scoreboard = scoreboardManager.getNewScoreboard();
            this.objective = scoreboard.registerNewObjective("scoreboard", "dummy", ChatColor.BOLD + "Scoreboard");
            this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
        }
    
        public void enable(Player player) {
    
            // set server name (line 1)
            objective.getScore(ChatColor.WHITE + "" + ChatColor.BOLD + "Server: " + ChatColor.WHITE + "" + ChatColor.BOLD + "Server").setScore(6);
    
            // set player name (line 2)
            objective.getScore(ChatColor.GREEN + "Name: " + ChatColor.WHITE + player.getName()).setScore(5);
    
            // set player balance (line 3)
            // The balance will be updated in the runTaskTimer later.
    
            // set player xp amount (line 4)
            objective.getScore(ChatColor.LIGHT_PURPLE + "XP: " + ChatColor.WHITE + player.getExp()).setScore(3);
    
            // set player health (line 5)
            objective.getScore(ChatColor.RED + "Health: " + ChatColor.WHITE + player.getHealth()).setScore(2);
    
            // set server IP address (line 6)
            objective.getScore(ChatColor.DARK_AQUA + "IP: " + ChatColor.WHITE + "127.0.0.1").setScore(1);
    
    
            Bukkit.getScheduler().runTaskTimer(plugin, () -> {
                Player finalPlayer = player; // Change this line
                if (!finalPlayer.isOnline()) {
                    return;
                }
                int balance = getPlayerBalance(finalPlayer);
                String balanceLine = ChatColor.GOLD + "Balance: " + ChatColor.WHITE + balance;
                Score score = objective.getScore(balanceLine);
    
                if (score.isScoreSet()) {
                    scoreboard.resetScores(balanceLine);
                }
    
                score.setScore(4);
            }, 0L, 20L);
    
        }
    
    
        private int getPlayerBalance(Player finalPlayer) {
            return 0;
        }
    
        public void disable(Player player) {
            scoreboard.resetScores(player.getName());
            player.setScoreboard(scoreboardManager.getMainScoreboard());
            teams.remove(player);
            cachedBalances.remove(player); // Remove the player from the cachedBalances map
        }
    
        public void disable() {
            for (Player player : Bukkit.getOnlinePlayers()) {
                disable(player);
            }
        }
    
        @EventHandler
        public void onPlayerJoin(PlayerJoinEvent event) {
            enable(event.getPlayer());
        }
    
        @EventHandler
        public void onPlayerQuit(PlayerQuitEvent event) {
            disable(event.getPlayer());
        }
    }
    
     
  12. Offline

    timtower Administrator Administrator Moderator

    @TijusM Yes, but now you need to keep track of the old values in the scoreboard to remove them and set the new values.
    Else when your balance changes you will just get a new line.
     
Thread Status:
Not open for further replies.

Share This Page