FFA ScoreBoard?!

Discussion in 'Plugin Development' started by digitox, Mar 23, 2017.

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

    digitox

    I need help whit my FFA ScoreBoard. I don't know what i have done wrong. i have made a Stats Scoreboard.

    Code:
    package me.digitox.ffa.Utilities;
    
    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.entity.PlayerDeathEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerLevelChangeEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.event.player.PlayerRespawnEvent;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Score;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    
    import me.digitox.ffa.Main;
    
    public class SB implements Listener{
      
        @EventHandler
        public void on(PlayerJoinEvent e) {
            for(Player all : Bukkit.getOnlinePlayers()) {
                updateSB(all);
            }
        }
      
        @EventHandler
        public void on(PlayerQuitEvent e) {
            for(Player all : Bukkit.getOnlinePlayers()) {
                updateSB(all);
            }
        }
      
    
        @EventHandler
        public void on(PlayerRespawnEvent e) {
            Player p = e.getPlayer();
            updateSB(p);
        }
      
    
        @EventHandler
        public void on(PlayerLevelChangeEvent e) {
            Player p = e.getPlayer();
            updateSB(p);
          
        }
      
    
        @EventHandler
        public void on(PlayerDeathEvent e) {
            Player p = (Player) e.getEntity();
            Player k = p.getKiller();
            updateSB(p);
            updateSB(k);
        }
    
      
      
        public static void updateSB(Player p) {
            ScoreboardManager manager = Bukkit.getScoreboardManager();
            Scoreboard board = manager.getNewScoreboard();
          
            int kills = Main.getInstance().getConfig().getInt("Stats." + p.getName() + ".Kills");
            int deaths = Main.getInstance().getConfig().getInt("Stats." + p.getName() + ".Deaths");
            double kdr = kills/deaths;
            String out = String.format("%.1f", Double.valueOf(kdr));
          
            Objective o = board.registerNewObjective("test", "dummy");
            o.setDisplaySlot(DisplaySlot.SIDEBAR);
            if(p instanceof Player);
          
            o.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&8---§7[" + "&3&lFFA &9&lStats " + "§7]&8---"));
          
            Score s1 = o.getScore("            ");
            s1.setScore(7);
          
            Score name = o.getScore(ChatColor.YELLOW + "Name: " + ChatColor.WHITE + p.getName());
            name.setScore(6);
          
            Score k = o.getScore(ChatColor.YELLOW + "Kills: " + ChatColor.WHITE + kills);
            k.setScore(5);
          
            Score d = o.getScore(ChatColor.YELLOW + "Deaths: " + ChatColor.WHITE + deaths);
            d.setScore(4);
          
            Score s = o.getScore(ChatColor.YELLOW + "Streak: " + ChatColor.WHITE + p.getLevel());
            s.setScore(3);
          
            Score kd = o.getScore(ChatColor.YELLOW + "Kills: " + ChatColor.WHITE + out);
            kd.setScore(2);
          
            Score s2 = o.getScore("            ");
            s2.setScore(1);
          
            p.setScoreboard(board);
          
        }
    
    }
    
    the Problem is that the Scoreboard don't work. When i join my server, There is no Scoreboard.
    i don't know how to fix that!


    this is the code for the ScoreBoard. If you need some more of my FFA code just say it.
     
    Last edited: Mar 23, 2017
  2. Offline

    mine-care

    The only answer i can give you at this stage is "OK" as you havent told us what the problem is, what it does, when it happends, and provide the error log if any.
    What i can do is underline some of the obvious issues with the code:

    Err? few lines above that you declare a Player variable p, therefore p is always going to be a Player so the condition of this check is always true making the if statement unessesary. Also you are stoping the if statement with a semicolon therefore even if the condition was valid the if would be practially useless
    Package names must be all lowercase by convention ;)
    k can be null but you are not checking for that before you use it in your code :p
     
  3. Offline

    digitox

    @mine-care The problem is that the scoreboard is not coming on my screen when i join the server, Whit the ffa plugin. I don't know how to fix that so can you please help?
     
  4. Online

    timtower Administrator Administrator Moderator

    @digitox Could you post your onEnable and all the methods that are used in it?
     
  5. Offline

    digitox

    Do you mean that im going to send the Main?
     
  6. Online

    timtower Administrator Administrator Moderator

  7. Offline

    digitox

    Code:
    package me.digitox.ffa;
    
    import java.util.logging.Logger;
    
    import org.bukkit.configuration.file.FileConfiguration;
    import org.bukkit.plugin.PluginManager;
    import org.bukkit.plugin.java.JavaPlugin;
    
    import me.digitox.ffa.Events.antiBuildListener;
    import me.digitox.ffa.Events.arrowEvent;
    import me.digitox.ffa.Events.deathEvent;
    import me.digitox.ffa.Events.dropEvent;
    import me.digitox.ffa.Events.foodEvent;
    import me.digitox.ffa.Events.joinLeaveEvent;
    import me.digitox.ffa.Events.killStreakEvent;
    import me.digitox.ffa.Events.mobSpawnEvent;
    import me.digitox.ffa.Events.pickupEvent;
    import me.digitox.ffa.Events.respawnEvent;
    import me.digitox.ffa.Events.weatherEvent;
    import me.digitox.ffa.Stats.statsCommand;
    import me.digitox.ffa.Stats.statsData;
    import me.digitox.ffa.Stats.statsReset;
    import me.digitox.ffa.Utilities.SB;
    
    public class Main extends JavaPlugin{
       
        public static Main instance;
        Logger log = Logger.getLogger("Minecraft");
       
        public static String prefix = "§3FFA §8> ";
       
        public void registerListeners() {
            PluginManager pm = getServer().getPluginManager();
            pm.registerEvents(new joinLeaveEvent(), this);
            pm.registerEvents(new respawnEvent(), this);
            pm.registerEvents(new deathEvent(), this);
            pm.registerEvents(new pickupEvent(), this);
            pm.registerEvents(new foodEvent(), this);
            pm.registerEvents(new arrowEvent(), this);
            pm.registerEvents(new weatherEvent(), this);
            pm.registerEvents(new dropEvent(), this);
            pm.registerEvents(new statsData(), this);
            pm.registerEvents(new killStreakEvent(), this);
            pm.registerEvents(new antiBuildListener(), this);
            pm.registerEvents(new SB(), this);
            pm.registerEvents(new mobSpawnEvent(), this);
           
            getCommand("stats").setExecutor(new statsCommand());
            getCommand("resetstats").setExecutor(new statsReset());
        }
       
        public static Main getInstance() {
            return instance;
        }
       
        @Override
        public void onEnable() {
            this.log.info("[FFA] has benn enabled!");
           
            instance = this;
            registerListeners();
            saveConfig();
        }
       
        @Override
        public void onDisable() {
            this.log.info("[FFA] has been disabled");
            instance = null;
            saveConfig();
           
        }
       
        public void loadConfig() {
            FileConfiguration cfg = getConfig();
            cfg.options().copyDefaults(true);
            cfg.options().header(prefix + "§cPlayer stats have been registered succsesfully!");
           
            saveConfig();
           
           
        }
       
       
       
    }
    
    here is the Code @timtower
     
  8. @digitox I would really recommend against using a public static string. They can be a big pain in the butt, and almost everyone will recommend the same. Also, remove the lines below as Bukkit will do this for you.

    Code:
     this.log.info("[FFA] has benn enabled!"); 
    Code:
     this.log.info("[FFA] has been disabled"); 
    Plus, you spelled been wrong ("benn").
     
  9. Offline

    digitox

    @TheEnderCrafter9 Can you help me whit the public Static void. i don't know what i'm going to do?!
     
  10. Offline

    MrGriefer_

    Are any errors appearing in the console? And remove the line:
    PHP:
    if(instanceof Player);
    in your updateSB method!
     
  11. Offline

    digitox

    @MrGriefer_ there is no errors in Console

    Here is the new code.
    Code:
    package me.digitox.ffa.Utilities;
    
    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.entity.PlayerDeathEvent;
    import org.bukkit.event.player.PlayerJoinEvent;
    import org.bukkit.event.player.PlayerLevelChangeEvent;
    import org.bukkit.event.player.PlayerQuitEvent;
    import org.bukkit.event.player.PlayerRespawnEvent;
    import org.bukkit.scoreboard.DisplaySlot;
    import org.bukkit.scoreboard.Objective;
    import org.bukkit.scoreboard.Score;
    import org.bukkit.scoreboard.Scoreboard;
    import org.bukkit.scoreboard.ScoreboardManager;
    
    import me.digitox.ffa.Main;
    
    public class SB implements Listener{
       
        @EventHandler
        public void on(PlayerJoinEvent e) {
            for(Player all : Bukkit.getOnlinePlayers()) {
                updateSB(all);
            }
        }
       
        @EventHandler
        public void on(PlayerQuitEvent e) {
            for(Player all : Bukkit.getOnlinePlayers()) {
                updateSB(all);
            }
        }
       
    
        @EventHandler
        public void on(PlayerRespawnEvent e) {
            Player p = e.getPlayer();
            updateSB(p);
        }
       
    
        @EventHandler
        public void on(PlayerLevelChangeEvent e) {
            Player p = e.getPlayer();
            updateSB(p);
           
        }
       
    
        @EventHandler
        public void on(PlayerDeathEvent e) {
            Player p = (Player) e.getEntity();
            Player k = p.getKiller();
            updateSB(p);
            updateSB(k);
        }
    
       
       
        public static void updateSB(Player p) {
            ScoreboardManager manager = Bukkit.getScoreboardManager();
            Scoreboard board = manager.getNewScoreboard();
           
            int kills = Main.getInstance().getConfig().getInt("Stats." + p.getName() + ".Kills");
            int deaths = Main.getInstance().getConfig().getInt("Stats." + p.getName() + ".Deaths");
            double kdr = kills/deaths;
            String out = String.format("%.1f", Double.valueOf(kdr));
           
            Objective o = board.registerNewObjective("test", "dummy");
            o.setDisplaySlot(DisplaySlot.SIDEBAR);
           
            o.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&8----§7[&3&lFFA &9&lStats§7]&8----"));
           
            Score s1 = o.getScore("            ");
            s1.setScore(7);
           
            Score name = o.getScore(ChatColor.YELLOW + "Spiller: " + ChatColor.WHITE + p.getName());
            name.setScore(6);
           
            Score k = o.getScore(ChatColor.YELLOW + "Kills: " + ChatColor.WHITE + kills);
            k.setScore(5);
           
            Score d = o.getScore(ChatColor.YELLOW + "Deaths: " + ChatColor.WHITE + deaths);
            d.setScore(4);
           
            Score s = o.getScore(ChatColor.YELLOW + "Streak: " + ChatColor.WHITE + p.getLevel());
            s.setScore(3);
           
            Score kd = o.getScore(ChatColor.YELLOW + "KDR: " + ChatColor.WHITE + out);
            kd.setScore(2);
           
            Score s2 = o.getScore("            ");
            s2.setScore(1);
           
            p.setScoreboard(board);
        }
    
    }
    Ok. i got one error when i ReJoined. i don't know what it means but i'm going to send it to you.

    There is an error on line
    Code:
            for(Player all : Bukkit.getOnlinePlayers()) {
                updateSB(all);
    
    AND
    Code:
            double kdr = kills/deaths;
    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Mar 27, 2017
  12. Online

    timtower Administrator Administrator Moderator

    @digitox deaths or kills can be 0, you need to catch that.
     
  13. Offline

    digitox

  14. Online

    timtower Administrator Administrator Moderator

    @digitox Check if kills or deaths is null.
    If so: don't do the math.
    Else: do the math.
     
  15. Offline

    digitox

    where am i going to check if the kills and deaths are null?
     
  16. Online

    timtower Administrator Administrator Moderator

    Before you do the divide.
     
  17. Offline

    digitox

    i don't know what you mean. what do i need to send you?
     
  18. Online

    timtower Administrator Administrator Moderator

    @digitox You don't send me anything.
    You divide 2 numbers in your code.
    Before that you need to check if any of them == 0
     
  19. Offline

    digitox

    Code:
    package me.digitox.ffa.Stats;
    
    import org.bukkit.Bukkit;
    import org.bukkit.command.Command;
    import org.bukkit.command.CommandExecutor;
    import org.bukkit.command.CommandSender;
    import org.bukkit.entity.Player;
    
    import me.digitox.ffa.Main;
    
    public class statsCommand implements CommandExecutor {
    
        @Override
        public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
         
            if(!(sender instanceof Player)) {
                sender.sendMessage("§cYou need to be ingame to use this command!");
                return true;
            }
            if(args.length == 0) {
                Player p = (Player) sender;
                int kills = Main.getInstance().getConfig().getInt("stats." + p.getName() + ".Kills");
                int deaths = Main.getInstance().getConfig().getInt("stats." + p.getName() + ".Deaths");
                if((kills == 0) && (deaths == 0)) {
                    sender.sendMessage("  ");
                    sender.sendMessage("§8§m--- §6Stats §8§m---");
                    sender.sendMessage("§ePlayer: §f" + p.getDisplayName());
                    sender.sendMessage("§eKills: §f" + kills);
                    sender.sendMessage("§eDeaths: §f" + deaths);
                    sender.sendMessage("§eSteak: §f" + p.getLevel());
                    sender.sendMessage("§eKDR: §f0");
                    sender.sendMessage("§8§m--------------");
                    sender.sendMessage("  ");
                    return true;
                 
                } else if(deaths == 0) {
                    sender.sendMessage(" ");
                    sender.sendMessage("§8§m--- §6Stats §8§m---");
                    sender.sendMessage("§ePlayer: §f" + p.getDisplayName());
                    sender.sendMessage("§eKills: §f" + kills);
                    sender.sendMessage("§eDeaths: §f" + deaths);
                    sender.sendMessage("§eSteak: §f" + p.getLevel());
                    sender.sendMessage("§eKDR: §f" + kills);
                    sender.sendMessage("§8§m--------------");
                    sender.sendMessage(" ");
                    return true;
                 
                } else {
                    double kdr = kills/deaths;
                    String out = String.format("%.1f", Double.valueOf(kdr));
                    sender.sendMessage(" ");
                    sender.sendMessage("§8§m--- §6Stats §8§m---");
                    sender.sendMessage("§ePlayer: §f" + p.getDisplayName());
                    sender.sendMessage("§eKills: §f" + kills);
                    sender.sendMessage("§eDeaths: §f" + deaths);
                    sender.sendMessage("§eSteak: §f" + p.getLevel());
                    sender.sendMessage("§eKDR: §f" + out);
                    sender.sendMessage("§8§m--------------");
                    sender.sendMessage(" ");
                    return true;
                }
            }
            if(args.length == 1) {
                Player t = Bukkit.getServer().getPlayer(args[0]);
                int kills = Main.getInstance().getConfig().getInt("stats." + t.getName() + ".Kills");
                int deaths = Main.getInstance().getConfig().getInt("stats." + t.getName() + ".Deaths");
                if(!t.isOnline() || !t.hasPlayedBefore() || t == null) {
                    sender.sendMessage(Main.prefix + "§4That player is not online or has never played before!");
                    return true;
                }
                if((kills == 0) && (deaths == 0)) {
                    sender.sendMessage(" ");
                    sender.sendMessage("§8§m--- §6Stats §8§m---");
                    sender.sendMessage("§ePlayer: §f" + t.getDisplayName());
                    sender.sendMessage("§eKills: §f" + kills);
                    sender.sendMessage("§eDeaths: §f" + deaths);
                    sender.sendMessage("§eSteak: §f" + t.getLevel());
                    sender.sendMessage("§eKDR: §f0");
                    sender.sendMessage("§8§m--------------");
                    sender.sendMessage(" ");
    
                    return true;
                } else if(deaths == 0) {
                    sender.sendMessage(" ");
                    sender.sendMessage("§8§m--- §6Stats §8§m---");
                    sender.sendMessage("§ePlayer: §f" + t.getDisplayName());
                    sender.sendMessage("§eKills: §f" + kills);
                    sender.sendMessage("§eDeaths: §f" + deaths);
                    sender.sendMessage("§eSteak: §f" + t.getLevel());
                    sender.sendMessage("§eKDR: §f" + kills);
                    sender.sendMessage("§8§m--------------");
                    sender.sendMessage(" ");
                    return true;
                 
                } else {
                    double kdr = kills/deaths;
                    String out = String.format("%.1f", Double.valueOf(kdr));
                    sender.sendMessage(" ");
                    sender.sendMessage("§8§m--- §6Stats §8§m---");
                    sender.sendMessage("§ePlayer: §f" + t.getDisplayName());
                    sender.sendMessage("§eKills: §f" + kills);
                    sender.sendMessage("§eDeaths: §f" + deaths);
                    sender.sendMessage("§eSteak: §f" + t.getLevel());
                    sender.sendMessage("§eKDR: §f" + out);
                    sender.sendMessage("§8§m--------------");
                    sender.sendMessage(" ");
                    return true;
                 
                }
            }
         
            return false;
        }
    
    }
    @timtower what am i going to do?!

    @timtower ?

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: Mar 27, 2017
  20. Offline

    MrGriefer_

    Your plugin is getting the kills of the player from the config! And the kills of the player is not set in the config that's why your getting the Null pointer exception. Set it then check if it isn't null. If it isn't then get it from the config ! Hope that makes sense :p

    EDIT: Sorry didn't read the error, anyways check if one of the values is 0 before you divide them.
     
    Last edited: Mar 27, 2017
Thread Status:
Not open for further replies.

Share This Page