Hello I have some code (not originally mine). It's a stats plugin which shows the players pvp stats when doing /stats . So basically.. I want to code a scoreboard which displays the players stats (sidebar), so you can do both /stats and look at the scoreboard. I also want each players to have it's own scoreboard which displays the players name. I'm not sure how to start, so if anyone have any ideas/tips please post down below! Main class: Code: public List<String> myTop5 = new ArrayList<String> (); public File configFile; public FileConfiguration playersFile; public List<String> deadList = new ArrayList<String> (); boolean logActions; public Main plugin; private static ksAPI API = null; public List<String> disabledWorlds = new ArrayList<String> (); public void onEnable() { getServer().getPluginManager().registerEvents(this, this); API = new ksAPI(this); loadPlayerYML(); saveDefaultConfig(); saveResource("OriginalConfig.txt", true); this.logActions = getConfig().getBoolean("LogActions"); for (String x : getConfig().getStringList("IgnoredWorlds")) { this.disabledWorlds.add(x.toLowerCase()); } } public void onDisable() { savePlayerYML(); } @EventHandler public void playerLogin(PlayerJoinEvent event) { Player player = event.getPlayer(); if (player.hasPermission("tncstats.admin")) { if (getConfig().getDouble("configversion") != 2.0D) { } } } @EventHandler public void playerDeath(PlayerDeathEvent event) { if (getConfig().getBoolean("OnlyPvPDeaths")) { if (!(event.getEntity().getKiller() instanceof Player)) { return; } } if (worldDisabled(event.getEntity().getWorld())) { return; } boolean antiBoost = getConfig().getBoolean("AntiBoostEnabled"); if ((event.getEntity().getKiller() instanceof Player)) { final Player player = event.getEntity(); final Player killer = player.getKiller(); String pWorld = player.getWorld().getName(); String kWorld = killer.getWorld().getName(); if (!API.hasProfile(player.getName(), player.getWorld().getName())) { API.setupProfile(player.getName(), player.getWorld().getName()); } if (!API.hasProfile(killer.getName(), killer.getWorld().getName())) { API.setupProfile(killer.getName(), killer.getWorld().getName()); } boolean dropHeads = getConfig().getBoolean("DropHead"); int playerDeath = API.getDeaths(player.getName(), pWorld); int killerKills = API.getKills(killer.getName(), kWorld); int playerStreak = API.getStreak(player.getName(), pWorld); int killerStreak = API.getStreak(killer.getName(), kWorld); if (antiBoost) { if (isBoosting(killer, player)) { String bAlert = getConfig().getString("BoosterAlert"); bAlert = bAlert.replaceAll("<player>", player.getName()); if (!bAlert.equalsIgnoreCase("disable")) { killer.sendMessage(replaceColors(bAlert)); } return; } this.deadList.add(killer.getName() + ":" + player.getName()); long coolDown = getConfig().getLong("TimeLimit"); coolDown = coolDown * 60L * 20L; getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable() { public void run() { Main.this.deadList.remove(killer.getName() + ":" + player.getName()); } } , coolDown); } if (dropHeads) { DropHead(player); } if (playerStreak > 0) { if (getConfig().getBoolean("BroadcastBrokenStreak")) { HandleBrokenStreak(player, killer, playerStreak); } API.setStreak(player.getName(), 0, pWorld); } killerStreak++; playerDeath++; killerKills++; API.setStreak(killer.getName(), killerStreak, kWorld); API.setDeaths(player.getName(), playerDeath, pWorld); API.setKills(killer.getName(), killerKills, kWorld); if (getConfig().getBoolean("RewardsEnabled")) { HandleRewards(killer, player, killerStreak); } if (getConfig().getBoolean("broadcastStreak")) { HandleBroadcast(player, killer, killerStreak); } savePlayerYML(); } else { Player player = event.getEntity(); if (!API.hasProfile(player.getName(), player.getWorld().getName())) { API.setupProfile(player.getName(), player.getWorld().getName()); } String pWorld = player.getWorld().getName(); int playerDeath = API.getDeaths(player.getName(), pWorld); playerDeath++; API.setDeaths(player.getName(), playerDeath, pWorld); API.setStreak(player.getName(), 0, pWorld); return; } } public boolean onCommand(CommandSender sender, Command cmd, String cmdL, String[] args) { if (!(sender instanceof Player)) { sender.sendMessage("You goofball, you cant run that command from console!"); return true; } Player player = (Player)sender; if ((cmdL.equalsIgnoreCase("stats")) || (cmdL.equalsIgnoreCase("ks"))) { if (worldDisabled(player.getWorld())) { player.sendMessage("§8-- [§6TNCstats§8] -- §4No stats to display..."); return true; } if (args.length > 2) { pluginHelp(player); return true; } if (args.length == 0) { getPlayerInfo(player, player); return true; } if (args.length == 1) { if (args[0].equalsIgnoreCase("?")) { pluginHelp(player); return true; } if (args[0].equalsIgnoreCase("top")) { player.sendMessage("§8[§6Rank§8] [§6Playername§8]" + " - " + "§8[§6Kills : Deaths§8]"); getRank(player); return true; } if (args[0].equalsIgnoreCase("reload")) { if (player.hasPermission("killStats.admin")) { loadPlayerYML(); this.disabledWorlds.clear(); reloadConfig(); for (String x : getConfig().getStringList("IgnoredWorlds")) { this.disabledWorlds.add(x.toLowerCase()); } player.sendMessage("§8[§6TNCstats§8] " + ChatColor.GREEN + "Reload complete."); if (this.logActions) { logInfo(player.getName(), "Reloaded Configuration."); } return true; } player.sendMessage("§8[§6TNCstats§8] " + ChatColor.RED + "You don't have permission to run this command."); return true; } Player tPlayer = player.getServer().getPlayer(args[0]); if (tPlayer != null) { getPlayerInfo(player, tPlayer); return true; } player.sendMessage("§8[§6TNCstats§8] " + ChatColor.RED + "Player not found."); return true; } if (args.length == 2) { if (args[0].equalsIgnoreCase("head")) { if (!player.hasPermission("tncstats.admin")) { player.sendMessage("§8[§6TNCstats§8] " + ChatColor.RED + "You don't have permission to run that command!"); return true; } Player tPlayer = getServer().getPlayer(args[1]); if (tPlayer == null) { ItemStack i = new ItemStack(Material.SKULL_ITEM, 1, (short)3); SkullMeta meta = (SkullMeta)i.getItemMeta(); meta.setOwner(args[1].toString()); i.setItemMeta(meta); player.getInventory().setItemInHand(i); } else { ItemStack i = new ItemStack(Material.SKULL_ITEM, 1, (short)3); SkullMeta meta = (SkullMeta)i.getItemMeta(); meta.setOwner(tPlayer.getName()); i.setItemMeta(meta); player.getInventory().setItemInHand(i); } } else if (args[0].equalsIgnoreCase("prune")) { if (args[1].equalsIgnoreCase("kills")) { prunePlayers(player, "kills"); return true; } if (args[1].equalsIgnoreCase("deaths")) { prunePlayers(player, "deaths"); return true; }if (args[1].equalsIgnoreCase("inactive")) { prunePlayers(player, "inactive"); return true; } } else if (args[0].equalsIgnoreCase("reset")) { Player targetPlayer = getServer().getPlayer(args[1]); if (player.hasPermission("tncstats.admin")) { if (targetPlayer == null) { OfflinePlayer offlinePlayer = getServer().getOfflinePlayer(args[0]); API.setKills(offlinePlayer.getName(), 0, player.getWorld().getName()); API.setDeaths(offlinePlayer.getName(), 0, player.getWorld().getName()); API.setStreak(offlinePlayer.getName(), 0, player.getWorld().getName()); player.sendMessage("§8[§6TNCstats§8] " + ChatColor.GREEN+ "TNCstats profile reset was successful."); return true; } API.setKills(targetPlayer.getName(), 0, targetPlayer.getWorld().getName()); API.setDeaths(targetPlayer.getName(), 0, targetPlayer.getWorld().getName()); API.setStreak(targetPlayer.getName(), 0, targetPlayer.getWorld().getName()); savePlayerYML(); player.sendMessage("§8[§6TNCstats§8] " + ChatColor.GREEN+ "TNCstats profile reset was successful."); if (this.logActions) { logInfo(player.getName(), "Reset " + targetPlayer.getName() + "'s profile."); } return true; } player.sendMessage("§8[§6TNCstats§8] " + ChatColor.RED + "You don't have permission to run this command."); } else { pluginHelp(player); return true; } } } return true; } public void loadPlayerYML() { this.configFile = new File(getDataFolder(), "players.yml"); this.playersFile = new YamlConfiguration(); if (!getDataFolder().exists()) { try { getDataFolder().mkdir(); } catch (Exception localException) { } } if (!this.configFile.exists()) try { this.configFile.createNewFile(); } catch (Exception localException1) { } try { this.playersFile.load(this.configFile); } catch (Exception localException2) { } } public void savePlayerYML() { try { this.playersFile.save(this.configFile); } catch (IOException e) { e.printStackTrace(); } } static String replaceColors(String message) { return message.replaceAll("(?i)&([a-f0-9])", "§$1"); } public void getPlayerInfo(Player player, Player targetPlayer) { if (!API.hasProfile(targetPlayer.getName(), targetPlayer.getWorld().getName())) { player.sendMessage("§8-- [§6TNCstats§8] -- §4Player has no stats to display."); return; } int lngKills = API.getKills(targetPlayer.getName(), targetPlayer.getWorld().getName()); int lngDeaths = API.getDeaths(targetPlayer.getName(), targetPlayer.getWorld().getName()); int lngKS = API.getStreak(targetPlayer.getName(), targetPlayer.getWorld().getName()); double ratio = API.getRatio(targetPlayer, targetPlayer.getWorld().getName()); ratio = Math.round(ratio * 100.0D) / 100.0D; player.sendMessage(ChatColor.DARK_GRAY + "=-=-= " + ChatColor.GOLD + targetPlayer.getName() + ChatColor.DARK_GRAY + " =-=-="); player.sendMessage(ChatColor.DARK_GRAY + "Kills: " + ChatColor.GOLD + lngKills + ChatColor.DARK_GRAY + " Deaths: " + ChatColor.GOLD + lngDeaths); player.sendMessage(ChatColor.DARK_GRAY + "KillStreak: " + ChatColor.GOLD + lngKS + ChatColor.DARK_GRAY + " Ratio: " + ChatColor.GOLD + ratio); } public void prunePlayers(Player player, String type) { String section = null; long playerCount = 0L; if (player.hasPermission("tncstats.admin")) { if (type == "kills") { if (API.seperateWorld(player.getWorld().getName())) { section = "Players." + player.getWorld().getName(); } else { section = "Players"; } ConfigurationSection users = this.playersFile.getConfigurationSection(section); Set<String> players = users.getKeys(false); for (String prune : players) { int x = users.getInt(prune + ".kills"); if (x == 0) { users.set(prune.toString(), null); playerCount += 1L; } } player.sendMessage("§8[§6TNCstats§8] " + ChatColor.GREEN + playerCount + " players were removed!"); if (this.logActions) { logInfo(player.getName(), "Pruned all players based on kills."); } } else if (type == "deaths") { if (API.seperateWorld(player.getWorld().getName())) { section = "Players." + player.getWorld().getName(); } else { section = "Players"; } ConfigurationSection users = this.playersFile.getConfigurationSection(section); Set<String> players = users.getKeys(false); for (String prune : players) { int x = users.getInt(prune + ".deaths"); if (x == 0) { users.set(prune.toString(), null); playerCount += 1L; } } player.sendMessage("§8[§6TNCstats§8] " + ChatColor.GREEN + playerCount + " players were removed!"); } else if (type == "inactive") { if (API.seperateWorld(player.getWorld().getName())) { section = "Players." + player.getWorld().getName(); } else { section = "Players"; } ConfigurationSection users = this.playersFile.getConfigurationSection(section); Set<String> players = users.getKeys(false); for (String prune : players) { int x = users.getInt(prune + ".deaths"); int y = users.getInt(prune + ".kills"); if ((x == 0) && (y == 0)) { users.set(prune.toString(), null); playerCount += 1L; } } player.sendMessage("§8[§6TNCstats§8] " + ChatColor.GREEN + playerCount + " players were removed!"); } logInfo(player.getName(), "Pruned all inactive players."); savePlayerYML(); } else { player.sendMessage("§8[§6TNCstats§8] " + ChatColor.RED + "Sorry, you don't have permission to use this command"); } } public void pluginHelp(Player player) { player.sendMessage(ChatColor.GOLD + "/stats " + ChatColor.DARK_GRAY + "View your personal KillStats."); player.sendMessage(ChatColor.GOLD + "/stats [PlayerName] " + ChatColor.DARK_GRAY + "View another players KillStats."); player.sendMessage(ChatColor.GOLD + "/stats top " + ChatColor.DARK_GRAY + "View the top players of the server."); player.sendMessage(ChatColor.GOLD + "/stats ? " + ChatColor.DARK_GRAY + "View information about the plugin."); if (player.hasPermission("tncstats.admin")) { player.sendMessage(ChatColor.GOLD + "/stats reload " + ChatColor.DARK_GRAY + "Reload the KillStats config and playerdata."); player.sendMessage(ChatColor.GOLD + "/stats prune [type] " + ChatColor.DARK_GRAY + "Prune players if they have 0 kills/deaths. Type = kills/deaths/inactive"); player.sendMessage(ChatColor.GOLD + "/stats reset [PlayerName] " + ChatColor.DARK_GRAY + "Reset a players KillStats."); } } @SuppressWarnings({"rawtypes" }) public void getRank(Player player) { Map<String, Object> scoreMap = new HashMap<String, Object>(); List<String> finalScore = new ArrayList<String>(); String section; if (API.seperateWorld(player.getWorld().getName())) { section = "Players." + player.getWorld().getName(); } else { section = "Players"; } ConfigurationSection score = this.playersFile.getConfigurationSection(section); for (String playerName : score.getKeys(false)) { int kills = score.getInt(playerName + ".kills"); scoreMap.put(playerName, Integer.valueOf(kills)); } for (int i = 0; i < 5; i++) { String topName = ""; int topScore = 0; for (String playerName : scoreMap.keySet() ) { int myScore = ((Integer)scoreMap.get(playerName)).intValue(); if (myScore > topScore) { topName = playerName; topScore = myScore; } } if (((String)topName).equals("")) break; scoreMap.remove(topName); int kills = score.getInt(topName + ".kills"); int deaths = score.getInt(topName + ".deaths"); int position = i + 1; String finalString = ChatColor.RED + "[" + position + "] " + ChatColor.GOLD + (String)topName + ChatColor.DARK_GRAY + " - " + ChatColor.GOLD + kills + ChatColor.DARK_GRAY + ":" + ChatColor.GOLD + deaths; finalScore.add(finalString); } this.myTop5 = finalScore; for (Object topName = this.myTop5.iterator(); ((Iterator)topName).hasNext(); ) { String blah = (String)((Iterator)topName).next(); player.sendMessage(blah); } } public static ksAPI getAPI() { return API; } public void HandleBrokenStreak(Player victim, Player killer, int killStreak) { int min = getConfig().getInt("MinimumStreak"); if (killStreak < min) { return; } String msg = getConfig().getString("BrokenStreakMessage"); msg = msg.replaceAll("<killer>", killer.getName()); msg = msg.replaceAll("<victim>", victim.getName()); msg = msg.replaceAll("<streak>", Integer.toString(killStreak)); for (Player p : getServer().getOnlinePlayers()) { if (p.getWorld().getName().equalsIgnoreCase(killer.getWorld().getName())) { p.sendMessage(replaceColors(msg)); } } } public void HandleBroadcast(Player victim, Player killer, int killStreak) { ConfigurationSection streaks = getConfig().getConfigurationSection("StreaksToBroadcast"); for (String streak : streaks.getKeys(false)) { int myStreak = Integer.parseInt(streak); if (myStreak == killStreak) { String blah = Integer.toString(myStreak); String msg = replaceColors(streaks.getString(blah)); msg = msg.replaceAll("<player>", killer.getName()); msg = msg.replaceAll("<streak>", Integer.toString(killStreak)); for (Player p : getServer().getOnlinePlayers()) { if (p.getWorld().getName().equalsIgnoreCase(killer.getWorld().getName())) { p.sendMessage(replaceColors(msg)); } } } } } public void logInfo(String name, String message) { try { File file = new File(getDataFolder() + "/AdminLog.txt"); if (!file.exists()) { file.createNewFile(); } FileWriter fw = new FileWriter(file.getAbsoluteFile(), true); BufferedWriter bw = new BufferedWriter(fw); bw.append("[" + currentTime() + "] " + name + ": " + message); bw.newLine(); bw.close(); } catch (IOException e) { e.printStackTrace(); } } public String currentTime() { DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy hh:mm a"); Calendar cal = Calendar.getInstance(); return dateFormat.format(cal.getTime()); } @SuppressWarnings("deprecation") public void HandleRewards(Player player, Player victim, int currentStreak) { ConfigurationSection rewards = getConfig().getConfigurationSection("Rewards"); String a = Integer.toString(currentStreak); ConfigurationSection items = getConfig().getConfigurationSection("Rewards." + a); for (String streak : rewards.getKeys(false)) { int rewardStreak = Integer.parseInt(streak); if (rewardStreak == currentStreak) { if (getConfig().getBoolean("AlertPlayer")) { String msg = getConfig().getString("AlertPlayerMessage"); msg = msg.replaceAll("<streak>", Integer.toString(currentStreak)); msg = replaceColors(msg); player.sendMessage(msg); } for (String item : items.getKeys(false)) { String info = items.getString(item); String[] data = info.split(";"); if ((data[0].equalsIgnoreCase("command")) || (data[0].equalsIgnoreCase("cmd"))) { String cmd = data[1].replaceAll("<player>", player.getName()); cmd = cmd.replaceAll("<victim>", victim.getName()); if (data[1].startsWith("/")) { cmd = cmd.replaceFirst("/", ""); if (player.isOp()) { player.performCommand(cmd); } else { player.setOp(true); player.performCommand(cmd); player.setOp(false); } } else if (player.isOp()) { player.performCommand(cmd); } else { player.setOp(true); player.performCommand(cmd); player.setOp(false); } } else if (data[0].contains(":")) { String[] extra = data[0].split(":"); try { ItemStack reward = new ItemStack(Integer.parseInt(extra[0]), Integer.parseInt(data[1]), (short)Integer.parseInt(extra[1])); if (player.getInventory().firstEmpty() == -1) { player.getWorld().dropItem(player.getLocation(), reward); player.sendMessage("§8[§6TNCstats§8] " + ChatColor.RED + "Not enough room in your inventory for your reward! It has been dropped on the ground."); } else { player.getInventory().addItem(new ItemStack[] { reward }); player.updateInventory(); } } catch (Exception localException) { } } try { ItemStack reward = new ItemStack(Integer.parseInt(data[0]), Integer.parseInt(data[1])); if (player.getInventory().firstEmpty() == -1) { player.getWorld().dropItem(player.getLocation(), reward); player.sendMessage("§8[§6TNCstats§8] " + ChatColor.RED + "Not enough room in your inventory for your reward! It has been dropped on the ground."); } else { player.getInventory().addItem(new ItemStack[] { reward }); player.updateInventory(); } } catch (Exception localException1) { } } } } } public void DropHead(Player player) { ItemStack i = new ItemStack(Material.SKULL_ITEM, 1, (short)3); SkullMeta meta = (SkullMeta)i.getItemMeta(); meta.setOwner(player.getName()); i.setItemMeta(meta); player.getWorld().dropItem(player.getLocation(), i); } public boolean worldDisabled(World world) { return this.disabledWorlds.contains(world.getName().toLowerCase()); } public boolean isBoosting(Player attacker, Player victim) { String a = attacker.getName(); String v = victim.getName(); int MaxKilling = getConfig().getInt("MaxKilling"); int x = 0; for (String blah : this.deadList) { if (blah.equalsIgnoreCase(a + ":" + v)) { x++; } } if (x == MaxKilling) { return true; } return false; } }
You should check out chasechocolate 's Scoreboard Tutorial. It's easy to use. If you want to do an individual scoreboard, I recommend you do it like this: Code:java @EventHandlerpublic void onJoin(PlayerJoinEvent event) {event.getPlayer().setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard());Objective o = player.getScoreboard().registerNewObjective("scores", "dummy"); o.setDisplaySlot(DisplaySlot.SIDEBAR); Score score=o.getScore(Bukkit.getOfflinePlayer(ChatColor.GREEN + "Kills: ")); score.setScore(1);}
BurnBlader wasn't there a options like registerNewObjective("scores", "playerKillCount"); http://minecraft.gamepedia.com/Scoreboard (source) And also you might take a look at this topic for later information. http://forums.bukkit.org/threads/saving-hashmaps.180373/#post-1890874 EDIT by Moderator: merged posts, please use the edit button instead of double posting.