Scoreboard for each player

Discussion in 'Plugin Development' started by Kartufle, Feb 19, 2017.

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

    Kartufle

    So i have been trying to make a custom animated scoreboard which is working pretty good. But each time a player joins or i update the content it will set the scoreboard for every player on the server with the stats from the just joined player... How would i fix this?

    This is my code if anyone needs it:
    Code:
    int i = 0;
       
        public HashMap<String, Scoreboard> boards = new HashMap<String, Scoreboard>();
       
        Plugin crmcbasic = Bukkit.getPluginManager().getPlugin("CRMCBasics");
       
        FileConfiguration crmcconfig;
       
        private Objective objective;
       
        private ScoreboardManager manager;
        private Scoreboard board;
       
        static ArrayList<String> a = new ArrayList<String>();
       
        @Override
        public void onEnable(){
    
            this.getServer().getPluginManager().registerEvents(this, this);
           
            if(crmcbasic.getConfig() != null){
               
                crmcconfig = crmcbasic.getConfig();
            }
           
        }
       
        @Override
        public void onDisable(){
           
        }
       
        public void add(final Player player){
    
            updateContent(player);
           
            BukkitScheduler s = Bukkit.getServer().getScheduler();
            s.scheduleSyncRepeatingTask(this, new Runnable(){
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                       
                        i++;
                       
                        if(i >= a.size()){
                            i = 0;
                        }
                       
                       
                       
                        objective.setDisplayName("  " + a.get(i) + "  ");
                       
                    }
               
            }, 0, 5L);
           
            BukkitScheduler updateContent = Bukkit.getServer().getScheduler();
            updateContent.scheduleSyncRepeatingTask(this, new Runnable(){
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                       
                        //updateContent(player);
                       
                       
                    }
               
            }, 0, 30L);
        }
       
        public void updateContent(Player player){
    
           
                    manager = Bukkit.getScoreboardManager();
                    board = manager.getNewScoreboard();
                   
                    objective = board.registerNewObjective("Scoreboard", "dummy");
                    objective.setDisplaySlot(DisplaySlot.SIDEBAR);
                   
                    GAL pl = (GAL)Bukkit.getPluginManager().getPlugin("GAListener");
                   
                    int votes = pl.db.getVotes(player.getName().toLowerCase());
                   
                    int gemBal = crmcconfig.getInt("Gems." + player.getName().toLowerCase());
                   
                    Score spacer = objective.getScore("§4");
                    spacer.setScore(12);
                   
                    Score one = objective.getScore("§8» §a§lWelcome: ");
                    one.setScore(11);
                   
                    Score two = objective.getScore("§8» §e" + player.getName());
                    two.setScore(10);
                   
                    Score spacerTwo = objective.getScore("§2");
                    spacerTwo.setScore(9);
                   
                    Score online = objective.getScore("§8» §a§lOnline:");
                    online.setScore(8);
                   
                    Score onlinep = objective.getScore("§8» §e" + Bukkit.getOnlinePlayers().size() + "§c/§e" + this.getServer().getMaxPlayers());
                    onlinep.setScore(7);
                   
                    Score spacer3 = objective.getScore("§d");
                    spacer3.setScore(6);
                   
                    Score votesHead = objective.getScore("§8» §a§lVotes:");
                    votesHead.setScore(5);
                   
                    Score votest = objective.getScore("§8» §e" + votes);
                    votest.setScore(4);
                   
                    Score spacer4 = objective.getScore("§b");
                    spacer4.setScore(3);
                   
                    Score gemsHead = objective.getScore("§8» §a§lGems:");
                    gemsHead.setScore(2);
                   
                    Score gems = objective.getScore("§8» §e" + gemBal);
                    gems.setScore(1);
                   
                    a.clear();
                    a.add("§6§lC§e§lreativeRealmMC");
                    a.add("§e§lC§6§lr§e§leativeRealmMC");
                    a.add("§e§lCr§6§le§e§lativeRealmMC");
                    a.add("§e§lCre§6§la§e§ltiveRealmMC");
                    a.add("§e§lCrea§6§lt§e§liveRealmMC");
                    a.add("§e§lCreat§6§li§e§lveRealmMC");
                    a.add("§e§lCreati§6§lv§e§leRealmMC");
                    a.add("§e§lCreativ§6§le§e§lRealmMC");
                    a.add("§e§lCreative§6§lR§e§lealmMC");
                    a.add("§e§lCreativeR§6§le§e§lalmMC");
                    a.add("§e§lCreativeRe§6§la§e§llmMC");
                    a.add("§e§lCreativeRea§6§ll§e§lmMC");
                    a.add("§e§lCreativeReal§6§lm§e§lMC");
                    a.add("§e§lCreativeRealm§6§lM§e§lC");
                    a.add("§e§lCreativeRealmM§6§lC§c");
                    a.add("§e§lCreativeRealmMC");
                    a.add("§6§lCreativeRealmMC");
                    a.add("§6§lCreativeRealmMC");
                    a.add("§e§lCreativeRealmMC");
                    a.add("§e§lCreativeRealmMC");
                    a.add("§6§lCreativeRealmMC");
                    a.add("§6§lCreativeRealmMC");
                    a.add("§e§lCreativeRealmMC");
                    a.add("§e§lCreativeRealmMC");
                    a.add("§6§lCreativeRealmMC");
                    a.add("§6§lCreativeRealmMC");
                   
                    player.setScoreboard(board);
        }
       
        @EventHandler
        public void PlayerJoinEvent(PlayerJoinEvent e){
           
            Player p = e.getPlayer();
           
            this.add(p);
    
           
           
           
        }
     
  2. Offline

    MrGeneralQ



    Save your scoreboard in a HashMap. Edit your scoreboard from the HashMap.
     
  3. Offline

    Kartufle

    I tryied that so either i didn't do it right or it didn't work. I probably didn't do it right but how would i do it then?
     
  4. Offline

    MrGeneralQ

    Okay a detailed explenation:

    I first create a new ScoreboardManager on top of my main class.
    Code:
        public ScoreboardManager sbManager = Bukkit.getScoreboardManager();
    I then create a HashMap to store the ScoreBoard itself also on top of my Main class.
    Code:
        public HashMap<Player, Scoreboard> scoreboards = new HashMap<Player, Scoreboard>();
    Then I create a new method to create a scoreBoard for a player:
    Code:
              
    public void createScoreBoard(Player p)  
    {
    Scoreboard board =  sbManager.getNewScoreboard();
                scoreboards.put(p, board);
                Scoreboard pScoreboard = scoreboards.get(p);
                Objective objective = pScoreboard.registerNewObjective("obj", "dummy");   
                objective.setDisplaySlot(DisplaySlot.SIDEBAR);
                objective.setDisplayName(ChatColor.GOLD  + p.getName());
    }
                
    I then create a method to load the scoreboards for all players:
    Code:
        public void loadScoreboard()
        {
            for(Player p: Bukkit.getOnlinePlayers())
            {
            createScoreboard(p);
            }   
        }
    and then the final part is that I run both methods when I need them. For example in a command;

    Code:
    // to create a scoreboard
    createScoreboard(player);
    
    //load all scoreboards
    loadScoreBoard();
    

    Now to edit a scoreboard you must access the scoreboard stored IN the HashMap. So use

    Code:
    this.scoreboards.get(player).[watheverYouWantToUpdate]
    That should be more then enough information. Please don't just copy paste the code and feel free to ask if you don't understand something.
     
  5. Offline

    Kartufle

    @MrGeneralQ there is 1 thing i don't understand. When i wanna set the scores with the "this.scoreboards.get(player)."
    How would i set the score of it to give it a position? Ty for the help btw

    Ok i think i fixed most of it now(not sure) but the only problem i have now is that i have a animated title in a runnable but everytime a new player joins the title stops updating... i don't know why.

    this is my code:
    Code:
    int i = 0;
       
        Plugin crmcbasic = Bukkit.getPluginManager().getPlugin("CRMCBasics");
       
        FileConfiguration crmcconfig;
       
        private Objective objective;
       
        private ScoreboardManager manager = Bukkit.getScoreboardManager();
        private Scoreboard board;
       
        public HashMap<Player, Scoreboard> boards = new HashMap<Player, Scoreboard>();
        public HashMap<Player, Objective> objProvider = new HashMap<Player, Objective>();
       
        static ArrayList<String> a = new ArrayList<String>();
       
        @Override
        public void onEnable(){
    
            this.getServer().getPluginManager().registerEvents(this, this);
           
            if(crmcbasic.getConfig() != null){
               
                crmcconfig = crmcbasic.getConfig();
               
            }
           
            BukkitScheduler s = Bukkit.getServer().getScheduler();
            s.scheduleSyncRepeatingTask(this, new Runnable(){
    
                @Override
                public void run() {
                    // TODO Auto-generated method stub
                       
                        i++;
                       
                        if(i >= a.size()){
                            i = 0;
                        }
                       
                       
                       
                        objective.setDisplayName("  " + a.get(i) + "  ");
                    }
               
            }, 0, 5L);
           
        }
       
        @Override
        public void onDisable(){
           
        }
       
        public void add(final Player player){
           
        }
       
        public void updateContent(final Player p){
               
                    GAL pl = (GAL)Bukkit.getPluginManager().getPlugin("GAListener");
                   
                    int votes = pl.db.getVotes(p.getName().toLowerCase());
                   
                    int gemBal = crmcconfig.getInt("Gems." + p.getName().toLowerCase());
                       
                    this.boards.get(p).resetScores(p.getName());
                   
                    Score one = objective.getScore("§8» §a§lWelcome: ");
                    one.setScore(11);
                   
                    Score two = objective.getScore("§8» §e" + p.getName());
                    two.setScore(10);
                   
                    Score spacerTwo = objective.getScore("§2");
                    spacerTwo.setScore(9);
                   
                    Score online = objective.getScore("§8» §a§lOnline:");
                    online.setScore(8);
                   
                    Score onlinep = objective.getScore("§8» §e" + Bukkit.getOnlinePlayers().size() + "§c/§e" + this.getServer().getMaxPlayers());
                    onlinep.setScore(7);
                   
                    Score spacer3 = objective.getScore("§d");
                    spacer3.setScore(6);
                   
                    Score votesHead = objective.getScore("§8» §a§lVotes:");
                    votesHead.setScore(5);
                   
                    Score votest = objective.getScore("§8» §e0");
                   
                    if(votes >= 1){
                        votest = objective.getScore("§8» §e" + votes);
                       
                    }
                    votest.setScore(4);   
                   
                    Score spacer4 = objective.getScore("§b");
                    spacer4.setScore(3);
                   
                    Score gemsHead = objective.getScore("§8» §a§lGems:");
                    gemsHead.setScore(2);
                   
                    Score gems = objective.getScore("§8» §e" + gemBal);
                    gems.setScore(1);
                   
                   
                    objProvider.put(p, objective);
                   
                    p.setScoreboard(boards.get(p));
        }
       
        public void createBoard(final Player p){
           
            board = manager.getNewScoreboard();
           
            boards.put(p, board);
           
            Scoreboard playerScore = boards.get(p);
           
            a.clear();
            a.add("§6§lC§e§lreativeRealmMC");
            a.add("§e§lC§6§lr§e§leativeRealmMC");
            a.add("§e§lCr§6§le§e§lativeRealmMC");
            a.add("§e§lCre§6§la§e§ltiveRealmMC");
            a.add("§e§lCrea§6§lt§e§liveRealmMC");
            a.add("§e§lCreat§6§li§e§lveRealmMC");
            a.add("§e§lCreati§6§lv§e§leRealmMC");
            a.add("§e§lCreativ§6§le§e§lRealmMC");
            a.add("§e§lCreative§6§lR§e§lealmMC");
            a.add("§e§lCreativeR§6§le§e§lalmMC");
            a.add("§e§lCreativeRe§6§la§e§llmMC");
            a.add("§e§lCreativeRea§6§ll§e§lmMC");
            a.add("§e§lCreativeReal§6§lm§e§lMC");
            a.add("§e§lCreativeRealm§6§lM§e§lC");
            a.add("§e§lCreativeRealmM§6§lC§c");
            a.add("§e§lCreativeRealmMC");
            a.add("§6§lCreativeRealmMC");
            a.add("§6§lCreativeRealmMC");
            a.add("§e§lCreativeRealmMC");
            a.add("§e§lCreativeRealmMC");
            a.add("§6§lCreativeRealmMC");
            a.add("§6§lCreativeRealmMC");
            a.add("§e§lCreativeRealmMC");
            a.add("§e§lCreativeRealmMC");
            a.add("§6§lCreativeRealmMC");
            a.add("§6§lCreativeRealmMC");
           
            objective = playerScore.registerNewObjective("Scoreboard", "dummy");
            objective.setDisplaySlot(DisplaySlot.SIDEBAR);
            objective.setDisplayName(a.get(0));
           
            updateContent(p);
           
           
        }
       
        @EventHandler
        public void PlayerJoinEvent(PlayerJoinEvent e){
           
            Player p = e.getPlayer();
           
            loadScoreboard();
           
           
        }
       
        public void loadScoreboard(){
           
            for(Player p : Bukkit.getOnlinePlayers()){
               
                if(!boards.containsKey(p)){
                    createBoard(p);
                }
               
            }
        }
     
    Last edited: Feb 19, 2017
  6. Offline

    MrGeneralQ

    Well just ovewrite the scoreboard with another scoreboard with the updated data.

    Code:
                Score testScore = objective.getScore(ChatColor.GREEN + "Name: " + ChatColor.AQUA + p.getName()+ "    ");
                testScore.setScore(10);
    Just make another scoreboard and overwrite the existing scoreboard.

    Don't forget to set the scoreboard:
    Code:
                p.setScoreboard(scoreboards.get(p));
     
  7. Offline

    Kartufle

    @MrGeneralQ if it actually did work wouldn't i just be able to updateContent(p) for everyone when a new player joins? and i also tryed do alot of other stuff but nothing works :/ i dont know what im doing wrong, and did i even set the scores as i should?
     
  8. Offline

    MrGeneralQ

    Carefully read my post pls. I'm storing a ScoreBoard for each player using a HashMap. Then I loop through all the scoreboards in the HashMap and set them for each player.
     
  9. Offline

    Kartufle

    @MrGeneralQ Yes thats also what im doing but for some reason it won't update the scoreboard for players already on the serer when a new player joins even thoe i loop through all players as seen here:
    Code:
    @EventHandler
        public void PlayerJoinEvent(PlayerJoinEvent e){
          
            if(boards.containsKey(e.getPlayer())){
                boards.remove(e.getPlayer());
            }
          
            Player p = e.getPlayer();
          
            loadScoreboard();
          
        }
      
        public void loadScoreboard(){
          
            for(final Player p : Bukkit.getOnlinePlayers()){
                    createBoard(p);
            }
        }
    When a player joins i run the loadScoreboard() that then runs this:
    Code:
    public void createBoard(final Player p){
          
            board = manager.getNewScoreboard();
          
            if(!boards.containsKey(p)){
                boards.put(p, board);
            }
          
            Scoreboard playerScore = boards.get(p);
          
            objective = board.registerNewObjective("Scoreboard", "dummy");
            objective.setDisplaySlot(DisplaySlot.SIDEBAR);
          
            updateContent(p);
          
        }
    And when new players join it should get updated for everyone by going through the same code and then this;
    Code:
    public void updateContent(final Player p){
              
                    GAL pl = (GAL)Bukkit.getPluginManager().getPlugin("GAListener");
                  
                    int votes = pl.db.getVotes(p.getName().toLowerCase());
                  
                    int gemBal = crmcconfig.getInt("Gems." + p.getName().toLowerCase());
                  
                    Score one = objective.getScore("§8» §a§lWelcome: ");
                    one.setScore(11);
                  
                    Score two = objective.getScore("§8» §e" + p.getName());
                    two.setScore(10);
                  
                    Score spacerTwo = objective.getScore("§2");
                    spacerTwo.setScore(9);
                  
                    Score online = objective.getScore("§8» §a§lOnline:");
                    online.setScore(8);
                  
                    Score onlinep = objective.getScore("§8» §e" + Bukkit.getOnlinePlayers().size() + "§c/§e" + this.getServer().getMaxPlayers());
                    onlinep.setScore(7);
                  
                    Score spacer3 = objective.getScore("§d");
                    spacer3.setScore(6);
                  
                    Score votesHead = objective.getScore("§8» §a§lVotes:");
                    votesHead.setScore(5);
                  
                    Score voteste = objective.getScore("§8» §e" + "0");
                  
                    if(votes >= 1){
                        voteste = objective.getScore("§8» §e" + votes);
                      
                    }
                    voteste.setScore(4);  
                  
                    Score spacer4 = objective.getScore("§b");
                    spacer4.setScore(3);
                  
                    Score gemsHead = objective.getScore("§8» §a§lGems:");
                    gemsHead.setScore(2);
                  
                    Score gems = objective.getScore("§8» §e" + gemBal);
                    gems.setScore(1);
    
                    p.setScoreboard(boards.get(p));
                      
        }
    And as you can see at the bottom i set the scoreboard for the player again, so am i doing anything wrong here?
     
  10. Offline

    MrGeneralQ


    Your manager is in your createBoard(). In should initialize only once in the Main class.
     
Thread Status:
Not open for further replies.

Share This Page