diff --git a/src/de/anura/core/API/Core.java b/src/de/anura/core/API/Core.java index adadc7c..20c342c 100644 --- a/src/de/anura/core/API/Core.java +++ b/src/de/anura/core/API/Core.java @@ -229,4 +229,8 @@ public class Core { } return true; } + + public static Level getLevel() { + return getMainClass().level; + } } diff --git a/src/de/anura/core/API/Inventories.java b/src/de/anura/core/API/Inventories.java index 90fbb66..e5431ff 100644 --- a/src/de/anura/core/API/Inventories.java +++ b/src/de/anura/core/API/Inventories.java @@ -194,6 +194,7 @@ public class Inventories implements Listener { } final Player player = (Player) event.getWhoClicked(); Inventory inventory = event.getClickedInventory(); + if (inventory == null) return; String invName = inventory.getName(); if (invNames.containsKey(invName)) { event.setCancelled(true); diff --git a/src/de/anura/core/API/Level.java b/src/de/anura/core/API/Level.java new file mode 100644 index 0000000..4171d4c --- /dev/null +++ b/src/de/anura/core/API/Level.java @@ -0,0 +1,117 @@ +package de.anura.core.API; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import org.bukkit.Bukkit; +import org.bukkit.Statistic; +import org.bukkit.entity.Player; + +public final class Level { + + private static final HashMap anuraLevel = new HashMap<>(); + private static final HashMap smashLevel = new HashMap<>(); + private static final HashMap ffLevel = new HashMap<>(); + + public Level() { + for (Player P : Bukkit.getOnlinePlayers()) { + Core.getMainClass().joinTime.put(P, (int) (System.currentTimeMillis() / 1000)); + Core.getMainClass().aimTheWaterWins.put(P, 0); + } + loadLevelAll(); + Bukkit.getScheduler().scheduleSyncRepeatingTask(Core.getMainClass(), new Runnable() { + + @Override + public void run() { + update(); + } + + }, 20 * 60, 20 * 60); + } + + public void saveStuffAll() { + for (Player P : Bukkit.getOnlinePlayers()) { + saveStuff(P); + } + } + + public void saveStuff(Player P) { + int walkedMeters = P.getStatistic(Statistic.WALK_ONE_CM) / 100; + int playedTime = (int) ((System.currentTimeMillis() / 1000 - Core.getMainClass().joinTime.get(P)) / 60); + Core.getMySql().queryUpdate("UPDATE coreStats " + + "SET onlineTime = onlineTime + " + playedTime + "" + + ", walkedMeters = walkedMeters + " + walkedMeters + "" + + ", aimTheWaterWins = aimTheWaterWins + " + Core.getMainClass().aimTheWaterWins.get(P) + " " + + "WHERE player = (SELECT id FROM players WHERE uuid = '" + P.getUniqueId().toString() + "')"); + Core.getMainClass().joinTime.put(P, (int) (System.currentTimeMillis() / 1000)); + P.setStatistic(Statistic.WALK_ONE_CM, 0); + Core.getMainClass().aimTheWaterWins.put(P, 0); + } + + public void loadLevelAll() { + for (Player P : Bukkit.getOnlinePlayers()) { + loadLevel(P); + } + } + + public void loadLevel(Player P) { + try { + ResultSet rs = Core.getMySql().querySelect("SELECT level, smashLevel, ffLevel FROM coreStats WHERE player = (SELECT id FROM players WHERE uuid = '" + P.getUniqueId().toString() + "')"); + rs.first(); + anuraLevel.put(P, (int) rs.getDouble("level")); + smashLevel.put(P, rs.getInt("smashLevel")); + ffLevel.put(P, rs.getInt("ffLevel")); + } catch (SQLException ex) { + System.err.println("Error whilst loading player level"); + } + } + + public void update() { + for (Player P : Bukkit.getOnlinePlayers()) { + update(P); + } + } + + public void update(Player P) { + saveStuff(P); + try { + String whereClause = " = (SELECT id FROM players WHERE uuid = '" + P.getUniqueId().toString() + "')"; + ResultSet stats = Core.getMySql().querySelect("SELECT * FROM coreStats WHERE player" + whereClause); + ResultSet features = Core.getMySql().querySelect("SELECT count(*) as features FROM coreFeatures WHERE playerId" + whereClause); + ResultSet pots = Core.getMySql().querySelect("SELECT count(*) as pots FROM coreFoundPots WHERE player" + whereClause); + ResultSet stages = Core.getMySql().querySelect("SELECT count(*) as stages FROM jumpUsers WHERE userId" + whereClause); + ResultSet smashClasses = Core.getMySql().querySelect("SELECT count(*) as classes FROM smashClasses WHERE playerId" + whereClause); + stats.first(); + features.first(); + pots.first(); + stages.first(); + smashClasses.first(); + int time = stats.getInt("onlineTime"); + double walked = stats.getInt("walkedMeters"); + int wins = stats.getInt("aimTheWaterWins"); + double kills = stats.getInt("smashKills"); + double deaths = stats.getInt("smashDeaths"); + double killstreak = stats.getInt("smashKillstreak"); + double smashMoney = stats.getInt("smashMoney"); + int feature = features.getInt("features"); + int pot = pots.getInt("pots"); + int stage = stages.getInt("stages"); + int classes = smashClasses.getInt("classes"); + double level = (time * 0.0375 + walked / 300.0 + wins * 400 + feature * 1200 + pot * 200 + stage * 300) / 400.0; + double sLevel = ((kills / (deaths + 1)) * kills / 90 + smashMoney / 90 + classes * 5 + (killstreak * killstreak) / 4) / 3 + 1; + anuraLevel.put(P, (int) level); + smashLevel.put(P, (int) sLevel); + Core.getMySql().queryUpdate("UPDATE coreStats SET level = '" + level + "', smashLevel = '" + sLevel + "' WHERE player" + whereClause); + } catch (SQLException ex) { + System.err.println("SQLException whilst updating player level (" + ex.getLocalizedMessage() + ")"); + } + } + + public static void updateLevel(Player P) { + Core.getMainClass().level.update(P); + } + + public static int getSmashLevel(Player P) { + return smashLevel.get(P); + } +} diff --git a/src/de/anura/core/AnuraCore.java b/src/de/anura/core/AnuraCore.java index 8ae6faf..24e0e36 100644 --- a/src/de/anura/core/AnuraCore.java +++ b/src/de/anura/core/AnuraCore.java @@ -1,6 +1,7 @@ package de.anura.core; import de.anura.core.API.Core; +import de.anura.core.API.Level; import de.anura.core.API.Money; import de.anura.core.API.MySQL; import de.anura.core.API.Tools; @@ -37,10 +38,13 @@ public class AnuraCore extends JavaPlugin { public HashMap releaseGolf = new HashMap<>(); public HashMap golfBall = new HashMap<>(); public HashMap disableCommandsAdventure = new HashMap<>(); + public HashMap joinTime = new HashMap<>(); + public HashMap aimTheWaterWins = new HashMap<>(); public Features features; public Permissions perms; public Signs signs; public Tools tools; + public Level level; @Override public void onEnable() { @@ -79,6 +83,7 @@ public class AnuraCore extends JavaPlugin { } sql.queryUpdate("DELETE FROM coreServers WHERE name = '" + this.getConfig().getString("server-name") + "'"); features.reset(); + level.update(); for (Player P : this.sittingPlayer.keySet()) { Core.endSitting(P); } diff --git a/src/de/anura/core/Setup.java b/src/de/anura/core/Setup.java index 689fa16..cf864f3 100644 --- a/src/de/anura/core/Setup.java +++ b/src/de/anura/core/Setup.java @@ -2,6 +2,7 @@ package de.anura.core; import de.anura.core.API.Core; import de.anura.core.API.Inventories; +import de.anura.core.API.Level; import de.anura.core.API.Tools; import static de.anura.core.AnuraCore.sql; import de.anura.core.commands.AdminCommands; @@ -91,6 +92,7 @@ public class Setup { Core.getMainClass().tools = new Tools(); Core.getMainClass().pots = new FlowerPots(); Core.getMainClass().signs = new Signs(); + Core.getMainClass().level = new Level(); RealTime.setup(); ResultSet rs = sql.querySelect("SELECT id, X, Y, Z, world, type, waitTime FROM corePots"); try { @@ -207,6 +209,7 @@ public class Setup { Core.getMainClass().getCommand("joinminigame").setExecutor(pc); Core.getMainClass().getCommand("leaveminigame").setExecutor(pc); Core.getMainClass().getCommand("toggleminigame").setExecutor(pc); + Core.getMainClass().getCommand("addAimTWWin").setExecutor(oc); } public static void setupInventories() { diff --git a/src/de/anura/core/commands/OtherCommands.java b/src/de/anura/core/commands/OtherCommands.java index b785610..3cd6bee 100644 --- a/src/de/anura/core/commands/OtherCommands.java +++ b/src/de/anura/core/commands/OtherCommands.java @@ -39,6 +39,19 @@ public class OtherCommands implements CommandExecutor { } else if (cmd.getName().equalsIgnoreCase("none")) { Core.statusMsg(sender, "cmd_not_found", false); return true; + } else if (cmd.getName().equalsIgnoreCase("addAimTWWin")) { + if (!(sender instanceof BlockCommandSender)) { + Core.getTools().sendStatusMsg(sender, "Only command block cmd!", false); + return true; + } + if (args.length != 1) return false; + String p = args[0]; + if (Bukkit.getOfflinePlayer(p).isOnline()) { + Player player = Bukkit.getPlayer(p); + Core.getMainClass().aimTheWaterWins.put(player, Core.getMainClass().aimTheWaterWins.get(player) + 1); + return true; + } + } return false; } diff --git a/src/de/anura/core/events/PlayerJoin.java b/src/de/anura/core/events/PlayerJoin.java index 885f935..10aa9d8 100644 --- a/src/de/anura/core/events/PlayerJoin.java +++ b/src/de/anura/core/events/PlayerJoin.java @@ -1,5 +1,6 @@ package de.anura.core.events; +import de.anura.core.API.Core; import de.anura.core.AnuraCore; import java.sql.ResultSet; import java.sql.SQLException; @@ -38,6 +39,9 @@ public class PlayerJoin implements Listener { plugin.pots.refreshPlayer(event.getPlayer()); plugin.getFeatures().updateFeatures(event.getPlayer()); plugin.disableCommandsAdventure.put(event.getPlayer(), false); + plugin.joinTime.put(event.getPlayer(), (int) (System.currentTimeMillis() / 1000)); + plugin.aimTheWaterWins.put(event.getPlayer(), 0); + Core.getLevel().loadLevel(event.getPlayer()); if (plugin.getConfig().getBoolean("on-join-to-spawn")) { event.getPlayer().teleport(event.getPlayer().getWorld().getSpawnLocation()); } diff --git a/src/de/anura/core/events/PlayerQuit.java b/src/de/anura/core/events/PlayerQuit.java index 145ad14..b2c2539 100644 --- a/src/de/anura/core/events/PlayerQuit.java +++ b/src/de/anura/core/events/PlayerQuit.java @@ -19,5 +19,6 @@ public class PlayerQuit implements Listener { Core.endSitting(event.getPlayer()); AnuraCore.getInstance().disableCommandsAdventure.remove(event.getPlayer()); Money.saveMoney(event.getPlayer()); + Core.getLevel().update(event.getPlayer()); } } diff --git a/src/plugin.yml b/src/plugin.yml index 0dc6c58..6b31f26 100644 --- a/src/plugin.yml +++ b/src/plugin.yml @@ -78,4 +78,7 @@ commands: usage: / (xpBattle|pool) toggleminigame: description: Join/Leave a redstone minigame - usage: / (xpBattle|pool) \ No newline at end of file + usage: / (xpBattle|pool) + addAimTWWin: + description: Adds an Aim the Water win to the statistics + usage: / \ No newline at end of file