Solved Help with Scoreboard

Discussion in 'Plugin Development' started by DevRosemberg, Sep 7, 2013.

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

    DevRosemberg

    Hi, so i have this code for a scoreboard:

    Code:java
    1. package com.devrosemberg.payload.utils;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.ChatColor;
    5. import org.bukkit.entity.Player;
    6. import org.bukkit.scoreboard.DisplaySlot;
    7. import org.bukkit.scoreboard.Objective;
    8. import org.bukkit.scoreboard.Scoreboard;
    9.  
    10. import com.devrosemberg.payload.Payload;
    11.  
    12. public class ScoreboardUtil {
    13.  
    14. private Payload plugin;
    15.  
    16. private int MAXP = 20;
    17. private Objective objective;
    18. private int online = Bukkit.getOnlinePlayers().length;
    19. private int needed = MAXP - Bukkit.getOnlinePlayers().length;
    20.  
    21.  
    22. public ScoreboardUtil(Payload payload) {
    23. this.plugin = payload;
    24. }
    25.  
    26.  
    27. public void startScoreboards() {
    28. Scoreboard scoreboard = this.plugin.getServer().getScoreboardManager().getNewScoreboard();
    29. this.objective = scoreboard.registerNewObjective("Payload", "dummy");
    30. this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
    31. for (Player p : this.plugin.getServer().getOnlinePlayers()) {
    32. p.setScoreboard(this.objective.getScoreboard());
    33. }
    34. }
    35.  
    36. public void startLobbyScoreboard() {
    37. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Waiting for Players");
    38. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Max:")).setScore(8);
    39. this.objective.getScore(Bukkit.getOfflinePlayer("" + MAXP)).setScore(7);
    40. this.objective.getScore(Bukkit.getOfflinePlayer("")).setScore(6);
    41. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Online:")).setScore(5);
    42. this.objective.getScore(Bukkit.getOfflinePlayer("" + online)).setScore(4);
    43. this.objective.getScore(Bukkit.getOfflinePlayer(" ")).setScore(3);
    44. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Needed:")).setScore(2);
    45. this.objective.getScore(Bukkit.getOfflinePlayer("" + needed)).setScore(1);
    46. }
    47.  
    48. public void showLobbyScoreboard(Player p) {
    49. p.setScoreboard(this.objective.getScoreboard());
    50. }
    51.  
    52. public void updateLobbyScoreboard() {
    53. if (Bukkit.getOnlinePlayers().length == 2) {
    54. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Starting...");
    55. } else if (Bukkit.getOnlinePlayers().length < 2) {
    56. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Waiting for Players");
    57. }
    58. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Max:")).setScore(8);
    59. this.objective.getScore(Bukkit.getOfflinePlayer("" + MAXP)).setScore(7);
    60. this.objective.getScore(Bukkit.getOfflinePlayer("")).setScore(6);
    61. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Online:")).setScore(5);
    62. this.objective.getScore(Bukkit.getOfflinePlayer("" + online)).setScore(4);
    63. this.objective.getScore(Bukkit.getOfflinePlayer(" ")).setScore(3);
    64. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Needed:")).setScore(2);
    65. this.objective.getScore(Bukkit.getOfflinePlayer("" + needed)).setScore(1);
    66. }
    67.  
    68. public void endLobbyScoreboard() {
    69. this.objective.getScoreboard().resetScores(Bukkit.getOfflinePlayer(ChatColor.RED + "Needed:"));
    70. this.objective.getScoreboard().resetScores(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Online:"));
    71. }
    72.  
    73.  
    74.  
    75.  
    76. }
    77.  


    And this Join Listener:

    Code:java
    1. package com.devrosemberg.payload.listeners;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.ChatColor;
    5. import org.bukkit.GameMode;
    6. import org.bukkit.Location;
    7. import org.bukkit.Sound;
    8. import org.bukkit.entity.Player;
    9. import org.bukkit.event.EventHandler;
    10. import org.bukkit.event.Listener;
    11. import org.bukkit.event.player.PlayerJoinEvent;
    12. import org.bukkit.inventory.ItemStack;
    13.  
    14. import com.devrosemberg.payload.Payload;
    15. import com.devrosemberg.payload.utils.BookUtil;
    16. import com.devrosemberg.payload.utils.ChatUtil;
    17.  
    18. public class JoinListener implements Listener {
    19.  
    20. private Payload plugin;
    21. private int MAXPLAYERS = 20;
    22.  
    23. public void PlayerJoinListener(Payload payload) {
    24. this.plugin = payload;
    25. }
    26. public void registerEvents(Payload plugin) {
    27. this.plugin = plugin;
    28. plugin.getServer().getPluginManager().registerEvents(this, plugin);
    29. }
    30.  
    31. @EventHandler
    32. public void onPlayerJoin(PlayerJoinEvent e) {
    33. final Player p = e.getPlayer();
    34. this.plugin.scoreboardUtil.showLobbyScoreboard(p);
    35. Location lobby = this.plugin.getLocation("lobby");
    36. p.teleport(lobby);
    37. p.setDisplayName(ChatUtil.ChatPrefix + p.getName() + ChatColor.WHITE);
    38. p.getInventory().clear();
    39. p.getInventory().setArmorContents(null);
    40. p.setGameMode(GameMode.SURVIVAL);
    41. p.setLevel(0);
    42. p.playSound(p.getLocation(), Sound.ENDERDRAGON_GROWL, 100, 1);
    43. p.getInventory().addItem(new ItemStack[] { BookUtil.getGuide()});
    44. this.plugin.gameUtil.createFirework(p.getLocation());
    45. e.setJoinMessage(ChatUtil.PREFIX + p.getName() + " has joined the game (" + Bukkit.getOnlinePlayers().length + "/" + MAXPLAYERS + ")");
    46. this.plugin.gameUtil.checkForCountdownOnStart();
    47. this.plugin.fileUtil.createFile(p);
    48. this.plugin.scoreboardUtil.updateLobbyScoreboard();
    49. }
    50.  
    51. }
    52.  


    But it the scoreboard wont work correctly, for example, when there are 2 players online it shows there is only one:

    [​IMG]

    Or if i leave and only 1 player is onlin the title is still starting.

    I also want to add the time to the Title but it would kick us for more than 16 characters.
    Please help, this is the last thing to finish my Minigame.
     
  2. Offline

    Gopaintman

    @DevRosemberg
    Try seeing what happens when you have 3 people on? If it returns 2 then just add 1 to the int online
     
  3. Offline

    DevRosemberg

  4. Offline

    david_rosales

    I see your problem
    before you set the score for online players in the scoreboard
    do
    online = Bukkit.getOnlinePlayers().length;
    Because online gets set when the server first starts
    or when its last set'
    not constant and real time
    You have to change it
    Make sense?
     
    lol768 likes this.
  5. Offline

    DevRosemberg

  6. Offline

    Janmm14

    in updateLobbyScoreboard(),first remove the values, then add the given code and ghen set the scores again.
     
  7. Offline

    DevRosemberg

    Janmm14
    What do you mean? That i have to resetScore or what?
    if not write it and done.
     
  8. Offline

    Janmm14

    First do
    scoreboard.resetScores(Bukkit.getOfflinePlayer(online));
    scoreboard.resetScores(Bukkit.getOfflinePlayer(needed));
    then the code from devrosemberg and then your code
     
  9. Offline

    DevRosemberg

    Janmm14 Lets hope that works.
    It should as it would be clearing the score and getting it again.
     
  10. This should fix your code, Sorry if i'm late

    Code:java
    1.  
    2. package com.devrosemberg.payload.utils;
    3.  
    4. import org.bukkit.Bukkit;
    5. import org.bukkit.ChatColor;
    6. import org.bukkit.entity.Player;
    7. import org.bukkit.scoreboard.DisplaySlot;
    8. import org.bukkit.scoreboard.Objective;
    9. import org.bukkit.scoreboard.Scoreboard;
    10.  
    11. import com.devrosemberg.payload.Payload;
    12.  
    13. public class ScoreboardUtil {
    14.  
    15. private Payload plugin;
    16.  
    17. private int MAXP = 20;
    18. private Objective objective;
    19.  
    20.  
    21. public ScoreboardUtil(Payload payload) {
    22. this.plugin = payload;
    23. }
    24.  
    25.  
    26. public void startScoreboards() {
    27. Scoreboard scoreboard = this.plugin.getServer().getScoreboardManager().getNewScoreboard();
    28. this.objective = scoreboard.registerNewObjective("Payload", "dummy");
    29. this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
    30. for (Player p : this.plugin.getServer().getOnlinePlayers()) {
    31. p.setScoreboard(this.objective.getScoreboard());
    32. }
    33. }
    34.  
    35. public void startLobbyScoreboard() {
    36. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Waiting for Players");
    37. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Max:")).setScore(8);
    38. this.objective.getScore(Bukkit.getOfflinePlayer("" + MAXP)).setScore(7);
    39. this.objective.getScore(Bukkit.getOfflinePlayer("")).setScore(6);
    40. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Online:")).setScore(5);
    41. this.objective.getScore(Bukkit.getOfflinePlayer("" + Bukkit.getOnlinePlayers().length)).setScore(4);
    42. this.objective.getScore(Bukkit.getOfflinePlayer(" ")).setScore(3);
    43. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Needed:")).setScore(2);
    44. this.objective.getScore(Bukkit.getOfflinePlayer("" + (MAXP - Bukkit.getOnlinePlayers().length))).setScore(1);
    45. }
    46.  
    47. public void showLobbyScoreboard(Player p) {
    48. p.setScoreboard(this.objective.getScoreboard());
    49. }
    50.  
    51. public void updateLobbyScoreboard() {
    52. if (Bukkit.getOnlinePlayers().length == 2) {
    53. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Starting...");
    54. } else if (Bukkit.getOnlinePlayers().length < 2) {
    55. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Waiting for Players");
    56. }
    57. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Max:")).setScore(8);
    58. this.objective.getScore(Bukkit.getOfflinePlayer("" + MAXP)).setScore(7);
    59. this.objective.getScore(Bukkit.getOfflinePlayer("")).setScore(6);
    60. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Online:")).setScore(5);
    61. this.objective.getScore(Bukkit.getOfflinePlayer("" + Bukkit.getOnlinePlayers().length)).setScore(4);
    62. this.objective.getScore(Bukkit.getOfflinePlayer(" ")).setScore(3);
    63. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Needed:")).setScore(2);
    64. this.objective.getScore(Bukkit.getOfflinePlayer("" + (MAXP - Bukkit.getOnlinePlayers().length))).setScore(1);
    65. }
    66.  
    67. public void endLobbyScoreboard() {
    68. this.objective.getScoreboard().resetScores(Bukkit.getOfflinePlayer(ChatColor.RED + "Needed:"));
    69. this.objective.getScoreboard().resetScores(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Online:"));
    70. }
    71.  
    72.  
    73.  
    74.  
    75. }
    76.  
     
  11. Offline

    Janmm14

    DevRosemberg
    The code you have posted does not fix the second problem.
     
  12. Offline

    WhatAaCow

    @Janmm14 make a new objective every updateLobbyScoreboard()
     
  13. Minecraft has a character limit on most thing of 16, So its not really possible. Never really tried to do a workaround, So maybe someone has one.
     
  14. Offline

    Janmm14

    I mean that my code is helping for the doubled things in the scoreboard picture.
     
  15. Offline

    DevRosemberg

  16. Offline

    feildmaster

    You never change
     
  17. That means he just ignored my code.. Which fixed first issue
     
  18. Offline

    DevRosemberg

  19. Offline

    Janmm14

    Hello,

    if you get your first posted ScoreboardUil code, change the whole updateScoreboards() method with this one:
    Code:
        public void updateLobbyScoreboard() {
     
            if (Bukkit.getOnlinePlayers().length == 2) {
                objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Starting...");
            } else if (Bukkit.getOnlinePlayers().length < 2) {
                objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Waiting for Players");
            }
         
            objective.getScoreboard().resetScores(Bukkit.getOfflinePlayer(online + ""));
            objective.getScoreboard().resetScores(Bukkit.getOfflinePlayer(needed + ""));
         
            online = Bukkit.getOnlinePlayers().length;
            needed = MAXP - Bukkit.getOnlinePlayers().length;
         
            objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Max:")).setScore(8);
            objective.getScore(Bukkit.getOfflinePlayer("" + MAXP)).setScore(7);
            objective.getScore(Bukkit.getOfflinePlayer("")).setScore(6);
            objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Online:")).setScore(5);
            objective.getScore(Bukkit.getOfflinePlayer("" + online)).setScore(4);
            objective.getScore(Bukkit.getOfflinePlayer(" ")).setScore(3);
            objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Needed:")).setScore(2);
            objective.getScore(Bukkit.getOfflinePlayer("" + needed)).setScore(1);
        }
    
     
  20. Offline

    DevRosemberg

    Janmm14 Would that work with this code?
    Code:java
    1. package com.devrosemberg.payload.utils;
    2.  
    3. import org.bukkit.Bukkit;
    4. import org.bukkit.ChatColor;
    5. import org.bukkit.entity.Player;
    6. import org.bukkit.scoreboard.DisplaySlot;
    7. import org.bukkit.scoreboard.Objective;
    8. import org.bukkit.scoreboard.Scoreboard;
    9.  
    10. import com.devrosemberg.payload.Payload;
    11.  
    12. public class ScoreboardUtil {
    13.  
    14. private Payload plugin;
    15.  
    16. private int MAXP = 20;
    17. private Objective objective;
    18.  
    19.  
    20. public ScoreboardUtil(Payload payload) {
    21. this.plugin = payload;
    22. }
    23.  
    24.  
    25. public void startScoreboards() {
    26. Scoreboard scoreboard = this.plugin.getServer().getScoreboardManager().getNewScoreboard();
    27. this.objective = scoreboard.registerNewObjective("Payload", "dummy");
    28. this.objective.setDisplaySlot(DisplaySlot.SIDEBAR);
    29. for (Player p : this.plugin.getServer().getOnlinePlayers()) {
    30. p.setScoreboard(this.objective.getScoreboard());
    31. }
    32. }
    33.  
    34. public void startLobbyScoreboard() {
    35. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Waiting for Players");
    36. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Max:")).setScore(8);
    37. this.objective.getScore(Bukkit.getOfflinePlayer("" + MAXP)).setScore(7);
    38. this.objective.getScore(Bukkit.getOfflinePlayer("")).setScore(6);
    39. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Online:")).setScore(5);
    40. this.objective.getScore(Bukkit.getOfflinePlayer("" + Bukkit.getOnlinePlayers().length)).setScore(4);
    41. this.objective.getScore(Bukkit.getOfflinePlayer(" ")).setScore(3);
    42. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Needed:")).setScore(2);
    43. this.objective.getScore(Bukkit.getOfflinePlayer("" + (MAXP - Bukkit.getOnlinePlayers().length))).setScore(1);
    44. }
    45.  
    46. public void showLobbyScoreboard(Player p) {
    47. p.setScoreboard(this.objective.getScoreboard());
    48. }
    49.  
    50. public void updateLobbyScoreboard() {
    51. String timeString = TimeUtil.formatIntoHHMMSS(this.plugin.gameUtil.time);
    52. if (Bukkit.getOnlinePlayers().length == 2) {
    53. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Starting in " + timeString);
    54. } else if (Bukkit.getOnlinePlayers().length < 2) {
    55. this.objective.setDisplayName(ChatColor.GREEN + ChatColor.BOLD.toString() + "Waiting for Players");
    56. }
    57. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Max:")).setScore(8);
    58. this.objective.getScore(Bukkit.getOfflinePlayer("" + MAXP)).setScore(7);
    59. this.objective.getScore(Bukkit.getOfflinePlayer("")).setScore(6);
    60. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Online:")).setScore(5);
    61. this.objective.getScore(Bukkit.getOfflinePlayer("" + Bukkit.getOnlinePlayers().length)).setScore(4);
    62. this.objective.getScore(Bukkit.getOfflinePlayer(" ")).setScore(3);
    63. this.objective.getScore(Bukkit.getOfflinePlayer(ChatColor.YELLOW + "Needed:")).setScore(2);
    64. this.objective.getScore(Bukkit.getOfflinePlayer("" + (MAXP - Bukkit.getOnlinePlayers().length))).setScore(1);
    65. }
    66.  
    67. public void endLobbyScoreboard() {
    68. for (Player p : Bukkit.getOnlinePlayers()) {
    69. p.setScoreboard(this.plugin.getServer().getScoreboardManager().getNewScoreboard());
    70. }
    71. }
    72.  
    73.  
    74.  
    75.  
    76. }
    77.  
     
  21. Offline

    Janmm14

    DevRosemberg
    All, what you need for my new update method are these class variables:
    Code:
    private int MAXP = 20;
    private Objective objective;
    private int online = Bukkit.getOnlinePlayers().length;
    private int needed = MAXP - Bukkit.getOnlinePlayers().length;
     
Thread Status:
Not open for further replies.

Share This Page