From 8cbb0f500b201f3df59f7885d31bdcc4106ac178 Mon Sep 17 00:00:00 2001 From: cervinakuy <16023430+cervinakuy@users.noreply.github.com> Date: Sun, 18 Apr 2021 17:12:17 -0700 Subject: [PATCH] Added /kp stats for offline players --- .../kitpvp/command/MainCommand.java | 42 ++++---------- .../com/planetgallium/kitpvp/game/Arena.java | 22 +++---- .../planetgallium/kitpvp/game/Infobase.java | 16 +++++ .../com/planetgallium/kitpvp/game/Kits.java | 2 +- .../com/planetgallium/kitpvp/game/Levels.java | 33 +++++------ .../com/planetgallium/kitpvp/game/Stats.java | 58 +++++++++---------- .../kitpvp/listener/ChatListener.java | 2 +- .../kitpvp/listener/DeathListener.java | 4 +- src/main/resources/messages.yml | 4 +- 9 files changed, 86 insertions(+), 97 deletions(-) diff --git a/src/main/java/com/planetgallium/kitpvp/command/MainCommand.java b/src/main/java/com/planetgallium/kitpvp/command/MainCommand.java index 8cb0b55..714552d 100644 --- a/src/main/java/com/planetgallium/kitpvp/command/MainCommand.java +++ b/src/main/java/com/planetgallium/kitpvp/command/MainCommand.java @@ -5,7 +5,6 @@ import com.planetgallium.kitpvp.Game; import com.planetgallium.kitpvp.api.Kit; import com.planetgallium.kitpvp.game.Arena; import com.planetgallium.kitpvp.util.*; -import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.GameMode; import org.bukkit.Location; @@ -14,9 +13,7 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; -import org.bukkit.potion.Potion; import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionType; import org.bukkit.scheduler.BukkitRunnable; import java.io.File; @@ -185,23 +182,18 @@ public class MainCommand implements CommandExecutor { } else if (args[0].equalsIgnoreCase("stats") && hasPermission(sender, "kp.command.stats.other")) { - // TODO: now with database you can get anyone's stats regardless if online. implement - String targetName = args[1]; - Player target = Toolkit.getPlayerCaseInsensitive(targetName); + String targetUUID = plugin.getDatabase().usernameToUUID("stats", targetName); - if (target != null) { - - for (String line : messages.getStringList("Messages.Stats.Message")) { - - sender.sendMessage(addPlaceholdersIfPossible(target, Toolkit.translate(line))); - - } + // kp setkills cervinakuy 10 + // kp setdeaths cervinakuy 89 + // kp setexperience cervinakuy 10 + // kp setlevel cervinakuy 10 + if (targetUUID != null) { + sendStatsMessage(sender, targetName, targetUUID); } else { - sender.sendMessage(messages.getString("Messages.Error.Offline")); - } } @@ -242,11 +234,7 @@ public class MainCommand implements CommandExecutor { if (args[0].equalsIgnoreCase("stats") && hasPermission(sender, "kp.command.stats")) { - for (String line : messages.getStringList("Messages.Stats.Message")) { - - p.sendMessage(addPlaceholdersIfPossible(p, Toolkit.translate(line))); - - } + sendStatsMessage(p, p.getName(), p.getUniqueId().toString()); } else if (args[0].equalsIgnoreCase("menu") && hasPermission(sender, "kp.command.menu")) { @@ -473,20 +461,12 @@ public class MainCommand implements CommandExecutor { } - private String addPlaceholdersIfPossible(Player p, String text) { + private void sendStatsMessage(CommandSender receiver, String username, String targetUUID) { - if (plugin.hasPlaceholderAPI()) { - text = PlaceholderAPI.setPlaceholders(p, text); + for (String line : messages.getStringList("Messages.Stats.Message")) { + receiver.sendMessage(arena.replacePlaceholderIfPresent(line, username, targetUUID)); } - text = text.replace("%player%", p.getName()) - .replace("%kills%", String.valueOf(arena.getStats().getKills(p.getUniqueId()))) - .replace("%deaths%", String.valueOf(arena.getStats().getDeaths(p.getUniqueId()))) - .replace("%level%", String.valueOf(arena.getLevels().getLevel(p.getUniqueId()))) - .replace("%experience%", String.valueOf(arena.getLevels().getExperience(p.getUniqueId()))); - - return text; - } } diff --git a/src/main/java/com/planetgallium/kitpvp/game/Arena.java b/src/main/java/com/planetgallium/kitpvp/game/Arena.java index c6dd187..84c2877 100644 --- a/src/main/java/com/planetgallium/kitpvp/game/Arena.java +++ b/src/main/java/com/planetgallium/kitpvp/game/Arena.java @@ -197,30 +197,30 @@ public class Arena { text = PlaceholderAPI.setPlaceholders(p, text); } - return replacePlaceholderIfPresent(text, p); + return replacePlaceholderIfPresent(text, p.getName(), p.getUniqueId().toString()); } - public String replacePlaceholderIfPresent(String s, Player p) { + public String replacePlaceholderIfPresent(String s, String username, String uuid) { // The reason I'm doing all these if statements rather than a more concise code solution is to reduce // the amount of data that is unnecessarily fetched (ex by using .replace) to improve performance // no longer constantly fetching stats from database for EACH line of scoreboard on update and player join if (s.contains("%streak%")) { - s = s.replace("%streak%", String.valueOf(getKillStreaks().getStreak(p.getName()))); + s = s.replace("%streak%", String.valueOf(getKillStreaks().getStreak(username))); } if (s.contains("%player%")) { - s = s.replace("%player%", p.getName()); + s = s.replace("%player%", username); } if (s.contains("%xp%")) { - s = s.replace("%xp%", String.valueOf(getLevels().getExperience(p.getUniqueId()))); + s = s.replace("%xp%", String.valueOf(getLevels().getExperience(uuid))); } if (s.contains("%level%")) { - s = s.replace("%level%", String.valueOf(levels.getLevel(p.getUniqueId()))); + s = s.replace("%level%", String.valueOf(levels.getLevel(uuid))); } if (s.contains("%max_xp%")) { @@ -232,20 +232,20 @@ public class Arena { } if (s.contains("%kd%")) { - s = s.replace("%kd%", String.valueOf(getStats().getKDRatio(p.getUniqueId()))); + s = s.replace("%kd%", String.valueOf(getStats().getKDRatio(uuid))); } if (s.contains("%kills%")) { - s = s.replace("%kills%", String.valueOf(getStats().getKills(p.getUniqueId()))); + s = s.replace("%kills%", String.valueOf(getStats().getKills(uuid.toString()))); } if (s.contains("%deaths%")) { - s = s.replace("%deaths%", String.valueOf(getStats().getDeaths(p.getUniqueId()))); + s = s.replace("%deaths%", String.valueOf(getStats().getDeaths(uuid))); } if (s.contains("%kit%")) { - if (getKits().getKitOfPlayer(p.getName()) != null) { - s = s.replace("%kit%", getKits().getKitOfPlayer(p.getName()).getName()); + if (getKits().getKitOfPlayer(username) != null) { + s = s.replace("%kit%", getKits().getKitOfPlayer(username).getName()); } else { s = s.replace("%kit%", "None"); } diff --git a/src/main/java/com/planetgallium/kitpvp/game/Infobase.java b/src/main/java/com/planetgallium/kitpvp/game/Infobase.java index 19314cd..c1aa0eb 100644 --- a/src/main/java/com/planetgallium/kitpvp/game/Infobase.java +++ b/src/main/java/com/planetgallium/kitpvp/game/Infobase.java @@ -137,6 +137,22 @@ public class Infobase { } + public String usernameToUUID(String tableName, String username) { + + Table table = getTableByName(tableName); + if (table == null) return null; + + Column usernameColumn = new Column("username", DataType.STRING); + usernameColumn.setValue(username); + + List> results = table.search(usernameColumn); + if (results.size() > 0 && results.get(0).size() > 0) { + return (String) table.search(usernameColumn).get(0).get(0).getValue(); + } + return null; + + } + public void cleanupUnusedKitCooldownTables() { for (Table table : database.getTables()) { diff --git a/src/main/java/com/planetgallium/kitpvp/game/Kits.java b/src/main/java/com/planetgallium/kitpvp/game/Kits.java index afa70c3..7f82a2c 100644 --- a/src/main/java/com/planetgallium/kitpvp/game/Kits.java +++ b/src/main/java/com/planetgallium/kitpvp/game/Kits.java @@ -195,7 +195,7 @@ public class Kits { } if (!(Toolkit.getPermissionAmount(p, "kp.levelbypass.", 0) >= kit.getLevel() || - arena.getLevels().getLevel(p.getUniqueId()) >= kit.getLevel())) { + arena.getLevels().getLevel(p.getUniqueId().toString()) >= kit.getLevel())) { p.sendMessage(messages.getString("Messages.Other.Needed").replace("%level%", String.valueOf(kit.getLevel()))); return; } diff --git a/src/main/java/com/planetgallium/kitpvp/game/Levels.java b/src/main/java/com/planetgallium/kitpvp/game/Levels.java index 2ff0132..fafd8c0 100644 --- a/src/main/java/com/planetgallium/kitpvp/game/Levels.java +++ b/src/main/java/com/planetgallium/kitpvp/game/Levels.java @@ -1,7 +1,6 @@ package com.planetgallium.kitpvp.game; import java.util.List; -import java.util.UUID; import com.cryptomorin.xseries.XSound; import com.planetgallium.kitpvp.util.Resource; @@ -14,9 +13,9 @@ import com.planetgallium.kitpvp.util.Toolkit; public class Levels { - private Arena arena; - private Resources resources; - private Resource levels; + private final Arena arena; + private final Resources resources; + private final Resource levels; public Levels(Arena arena, Resources resources) { this.arena = arena; @@ -28,12 +27,12 @@ public class Levels { if (levels.getBoolean("Levels.Levels.Enabled")) { - arena.getStats().addExperience(p.getUniqueId(), experience); + arena.getStats().addExperience(p.getUniqueId().toString(), experience); - if (arena.getLevels().getExperience(p.getUniqueId()) >= levels.getInt("Levels.Options.Experience-To-Level-Up")) { + if (arena.getLevels().getExperience(p.getUniqueId().toString()) >= levels.getInt("Levels.Options.Experience-To-Level-Up")) { arena.getLevels().levelUp(p); - Bukkit.getPluginManager().callEvent(new PlayerLevelUpEvent(p, getLevel(p.getUniqueId()))); + Bukkit.getPluginManager().callEvent(new PlayerLevelUpEvent(p, getLevel(p.getUniqueId().toString()))); } @@ -45,7 +44,7 @@ public class Levels { if (levels.getBoolean("Levels.Levels.Enabled")) { - arena.getStats().removeExperience(p.getUniqueId(), experience); + arena.getStats().removeExperience(p.getUniqueId().toString(), experience); } @@ -53,12 +52,12 @@ public class Levels { public void levelUp(Player p) { - if (arena.getStats().getLevel(p.getUniqueId()) != levels.getInt("Levels.Options.Maximum-Level")) { + if (arena.getStats().getLevel(p.getUniqueId().toString()) != levels.getInt("Levels.Options.Maximum-Level")) { - arena.getStats().setLevel(p.getUniqueId(), arena.getLevels().getLevel(p.getUniqueId()) + 1); - arena.getStats().setExperience(p.getUniqueId(), 0); + arena.getStats().setLevel(p.getUniqueId().toString(), arena.getLevels().getLevel(p.getUniqueId().toString()) + 1); + arena.getStats().setExperience(p.getUniqueId().toString(), 0); - String newLevel = String.valueOf(getLevel(p.getUniqueId())); + String newLevel = String.valueOf(getLevel(p.getUniqueId().toString())); List levelUpCommands = levels.getStringList("Levels.Commands-On-Level-Up"); Toolkit.runCommands(p, levelUpCommands, "%level%", newLevel); @@ -73,22 +72,18 @@ public class Levels { } else { - arena.getStats().setExperience(p.getUniqueId(), 0); + arena.getStats().setExperience(p.getUniqueId().toString(), 0); } } - public int getLevel(UUID uuid) { - + public int getLevel(String uuid) { return arena.getStats().getLevel(uuid); - } - public int getExperience(UUID uuid) { - + public int getExperience(String uuid) { return arena.getStats().getExperience(uuid); - } } diff --git a/src/main/java/com/planetgallium/kitpvp/game/Stats.java b/src/main/java/com/planetgallium/kitpvp/game/Stats.java index 3c9e255..630dfa2 100644 --- a/src/main/java/com/planetgallium/kitpvp/game/Stats.java +++ b/src/main/java/com/planetgallium/kitpvp/game/Stats.java @@ -5,8 +5,6 @@ import com.planetgallium.kitpvp.util.Toolkit; import com.zp4rker.localdb.DataType; import org.bukkit.entity.Player; -import java.util.UUID; - public class Stats { private final Infobase database; @@ -16,16 +14,16 @@ public class Stats { } public void createPlayer(Player p) { - if (!isPlayerRegistered(p.getUniqueId())) { + if (!isPlayerRegistered(p.getUniqueId().toString())) { database.createPlayerStats(p); } } - public boolean isPlayerRegistered(UUID uuid) { - return database.databaseTableContainsUUID("stats", uuid.toString()); + public boolean isPlayerRegistered(String uuid) { + return database.databaseTableContainsUUID("stats", uuid); } - public double getKDRatio(UUID uuid) { + public double getKDRatio(String uuid) { if (getDeaths(uuid) != 0) { double divided = (double) getKills(uuid) / getDeaths(uuid); return Toolkit.round(divided, 2); @@ -33,19 +31,19 @@ public class Stats { return 0.00; } - public void addKills(UUID uuid, int amount) { + public void addKills(String uuid, int amount) { setKills(uuid, getKills(uuid) + amount); } - public void addDeaths(UUID uuid, int amount) { + public void addDeaths(String uuid, int amount) { setDeaths(uuid, getDeaths(uuid) + amount); } - public void addExperience(UUID uuid, int amount) { + public void addExperience(String uuid, int amount) { setExperience(uuid, getExperience(uuid) + amount); } - public void removeExperience(UUID uuid, int amount) { + public void removeExperience(String uuid, int amount) { if (isPlayerRegistered(uuid)) { if (getExperience(uuid) > amount) { setExperience(uuid, getExperience(uuid) - amount); @@ -53,40 +51,40 @@ public class Stats { } } - public void setKills(UUID uuid, int kills) { - if (!database.databaseTableContainsUUID("stats", uuid.toString())) return; - database.setData("stats", "kills", kills, DataType.INTEGER, uuid.toString()); + public void setKills(String uuid, int kills) { + if (!database.databaseTableContainsUUID("stats", uuid)) return; + database.setData("stats", "kills", kills, DataType.INTEGER, uuid); } - public void setDeaths(UUID uuid, int deaths) { - if (!database.databaseTableContainsUUID("stats", uuid.toString())) return; - database.setData("stats", "deaths", deaths, DataType.INTEGER, uuid.toString()); + public void setDeaths(String uuid, int deaths) { + if (!database.databaseTableContainsUUID("stats", uuid)) return; + database.setData("stats", "deaths", deaths, DataType.INTEGER, uuid); } - public void setExperience(UUID uuid, int experience) { - if (!database.databaseTableContainsUUID("stats", uuid.toString())) return; - database.setData("stats", "experience", experience, DataType.INTEGER, uuid.toString()); + public void setExperience(String uuid, int experience) { + if (!database.databaseTableContainsUUID("stats", uuid)) return; + database.setData("stats", "experience", experience, DataType.INTEGER, uuid); } - public void setLevel(UUID uuid, int level) { - if (!database.databaseTableContainsUUID("stats", uuid.toString())) return; - database.setData("stats", "level", level, DataType.INTEGER, uuid.toString()); + public void setLevel(String uuid, int level) { + if (!database.databaseTableContainsUUID("stats", uuid)) return; + database.setData("stats", "level", level, DataType.INTEGER, uuid); } - public int getKills(UUID uuid) { - return (int) database.getData("stats", "kills", uuid.toString()); + public int getKills(String uuid) { + return (int) database.getData("stats", "kills", uuid); } - public int getDeaths(UUID uuid) { - return (int) database.getData("stats", "deaths", uuid.toString()); + public int getDeaths(String uuid) { + return (int) database.getData("stats", "deaths", uuid); } - public int getExperience(UUID uuid) { - return (int) database.getData("stats", "experience", uuid.toString()); + public int getExperience(String uuid) { + return (int) database.getData("stats", "experience", uuid); } - public int getLevel(UUID uuid) { - return (int) database.getData("stats", "level", uuid.toString()); + public int getLevel(String uuid) { + return (int) database.getData("stats", "level", uuid); } } diff --git a/src/main/java/com/planetgallium/kitpvp/listener/ChatListener.java b/src/main/java/com/planetgallium/kitpvp/listener/ChatListener.java index 71b15a5..58bcfbd 100644 --- a/src/main/java/com/planetgallium/kitpvp/listener/ChatListener.java +++ b/src/main/java/com/planetgallium/kitpvp/listener/ChatListener.java @@ -27,7 +27,7 @@ public class ChatListener implements Listener { Player p = e.getPlayer(); - String playerLevel = String.valueOf(arena.getLevels().getLevel(p.getUniqueId())); + String playerLevel = String.valueOf(arena.getLevels().getLevel(p.getUniqueId().toString())); String levelPrefix = resources.getLevels().getString("Levels.Levels." + playerLevel + ".Prefix") .replace("%level%", playerLevel); diff --git a/src/main/java/com/planetgallium/kitpvp/listener/DeathListener.java b/src/main/java/com/planetgallium/kitpvp/listener/DeathListener.java index ecbcc89..05c7b89 100644 --- a/src/main/java/com/planetgallium/kitpvp/listener/DeathListener.java +++ b/src/main/java/com/planetgallium/kitpvp/listener/DeathListener.java @@ -54,7 +54,7 @@ public class DeathListener implements Listener { setDeathMessage(victim); respawnPlayer(victim); - arena.getStats().addDeaths(victim.getUniqueId(), 1); + arena.getStats().addDeaths(victim.getUniqueId().toString(), 1); arena.getLevels().removeExperience(victim, resources.getLevels().getInt("Levels.Options.Experience-Taken-On-Death")); if (config.getBoolean("Arena.DeathParticle")) { @@ -267,7 +267,7 @@ public class DeathListener implements Listener { if (!victim.getName().equals(killer.getName())) { - arena.getStats().addKills(killer.getUniqueId(), 1); + arena.getStats().addKills(killer.getUniqueId().toString(), 1); arena.getLevels().addExperience(killer, resources.getLevels().getInt("Levels.Options.Experience-Given-On-Kill")); List killCommands = config.getStringList("Kill.Commands"); diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index 13b688e..c2b4387 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -39,7 +39,7 @@ Messages: KitInvalid: '%prefix% &cYou cannot perform this action because you have a kit selected.' CooldownKit: '%prefix% &cYou cannot select this kit for another %cooldown%.' CooldownAbility: '%prefix% &cYou cannot use this ability for another %cooldown%.' - Offline: '%prefix% &cThe specified player is not online or not in an arena.' + Offline: '%prefix% &cThe specified player could not be found.' Menu: '%prefix% &cFailed to automatically add to the menu, the menu may be full.' PVP: '%prefix% &cPVP is not permitted in this region.' Stats: @@ -48,7 +48,7 @@ Messages: - ' ' - ' &b&lStats for %player%' - ' &aLevel: &7%level%/100' - - ' &aExperience: &7%experience%/100' + - ' &aExperience: &7%xp%/100' - ' &aKills: &7%kills%' - ' &aDeaths: &7%deaths%' - ' '