Add level calculation for anura level + smash level

This commit is contained in:
kaenganxt
2014-10-29 12:35:18 +01:00
parent 20f8a38df4
commit ff89689b21
9 changed files with 152 additions and 1 deletions

View File

@@ -229,4 +229,8 @@ public class Core {
}
return true;
}
public static Level getLevel() {
return getMainClass().level;
}
}

View File

@@ -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);

View File

@@ -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<Player, Integer> anuraLevel = new HashMap<>();
private static final HashMap<Player, Integer> smashLevel = new HashMap<>();
private static final HashMap<Player, Integer> 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);
}
}

View File

@@ -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<Player, Boolean> releaseGolf = new HashMap<>();
public HashMap<Player, Entity> golfBall = new HashMap<>();
public HashMap<Player, Boolean> disableCommandsAdventure = new HashMap<>();
public HashMap<Player, Integer> joinTime = new HashMap<>();
public HashMap<Player, Integer> 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);
}

View File

@@ -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() {

View File

@@ -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;
}

View File

@@ -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());
}

View File

@@ -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());
}
}

View File

@@ -78,4 +78,7 @@ commands:
usage: /<command> (xpBattle|pool)
toggleminigame:
description: Join/Leave a redstone minigame
usage: /<command> (xpBattle|pool)
usage: /<command> (xpBattle|pool)
addAimTWWin:
description: Adds an Aim the Water win to the statistics
usage: /<command> <username>