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.
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
@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?
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
@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").
Are any errors appearing in the console? And remove the line: PHP: if(p instanceof Player); in your updateSB method!
@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.
@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
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.
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 EDIT: Sorry didn't read the error, anyways check if one of the values is 0 before you divide them.