diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java index 884db0a..97710bc 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/Cubot.java @@ -1,5 +1,7 @@ package net.simon987.cubotplugin; +import net.simon987.cubotplugin.event.CubotWalkEvent; +import net.simon987.cubotplugin.event.DeathEvent; import net.simon987.server.GameServer; import net.simon987.server.IServerConfiguration; import net.simon987.server.assembly.CPU; @@ -7,6 +9,7 @@ import net.simon987.server.assembly.HardwareModule; import net.simon987.server.assembly.Memory; import net.simon987.server.assembly.Status; import net.simon987.server.assembly.exception.CancelledException; +import net.simon987.server.event.GameEvent; import net.simon987.server.game.item.Item; import net.simon987.server.game.item.ItemVoid; import net.simon987.server.game.objects.*; @@ -152,17 +155,15 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Me return MAP_INFO; } - /** - * Called every tick - */ @Override public void update() { - if (currentAction == Action.WALKING) { if (spendEnergy(100)) { if (!incrementLocation()) { //Couldn't walk currentAction = Action.IDLE; + }else{ + GameServer.INSTANCE.getEventDispatcher().dispatch(new CubotWalkEvent(this)); } } else { currentAction = Action.IDLE; @@ -272,6 +273,9 @@ public class Cubot extends GameObject implements Updatable, ControllableUnit, Me @Override public boolean onDeadCallback() { + GameEvent event = new DeathEvent(this); + GameServer.INSTANCE.getEventDispatcher().dispatch(event); + reset(); //Teleport to spawn point diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotPlugin.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotPlugin.java index aefb383..5f1d7b2 100644 --- a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotPlugin.java +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/CubotPlugin.java @@ -18,6 +18,9 @@ public class CubotPlugin extends ServerPlugin { listeners.add(new SetInventoryPosition()); listeners.add(new PutItemCommandListener()); listeners.add(new PopItemCommandListener()); + //Leaderboard + listeners.add(new DeathListener()); + listeners.add(new WalkListener()); GameRegistry registry = gameServer.getRegistry(); diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/CubotWalkEvent.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/CubotWalkEvent.java new file mode 100644 index 0000000..e183f1c --- /dev/null +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/CubotWalkEvent.java @@ -0,0 +1,17 @@ +package net.simon987.cubotplugin.event; + +import net.simon987.cubotplugin.Cubot; +import net.simon987.server.event.GameEvent; + +public class CubotWalkEvent extends GameEvent { + + public CubotWalkEvent(Cubot cubot) { + setSource(cubot); + } + + @Override + public Cubot getSource() { + return (Cubot) super.getSource(); + } + +} \ No newline at end of file diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/DeathEvent.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/DeathEvent.java new file mode 100644 index 0000000..9d25837 --- /dev/null +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/DeathEvent.java @@ -0,0 +1,16 @@ +package net.simon987.cubotplugin.event; + +import net.simon987.server.event.GameEvent; +import net.simon987.server.game.objects.GameObject; + +public class DeathEvent extends GameEvent { + + public DeathEvent(GameObject object) { + setSource(object); + } + + @Override + public GameObject getSource() { + return (GameObject) super.getSource(); + } +} \ No newline at end of file diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/DeathListener.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/DeathListener.java new file mode 100644 index 0000000..cf438c9 --- /dev/null +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/DeathListener.java @@ -0,0 +1,23 @@ +package net.simon987.cubotplugin.event; + +import net.simon987.server.event.GameEvent; +import net.simon987.server.event.GameEventListener; +import net.simon987.server.game.objects.ControllableUnit; +import net.simon987.server.game.objects.GameObject; + +public class DeathListener implements GameEventListener { + + @Override + public Class getListenedEventType() { + return DeathEvent.class; + } + + @Override + public void handle(GameEvent event) { + DeathEvent DeathEvent = (DeathEvent) event; + GameObject object = DeathEvent.getSource(); + if (object instanceof ControllableUnit) { + ((ControllableUnit) object).getParent().getStats().incrementStat("death", 1); + } + } +} \ No newline at end of file diff --git a/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/WalkListener.java b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/WalkListener.java new file mode 100644 index 0000000..fd2e96e --- /dev/null +++ b/Plugin Cubot/src/main/java/net/simon987/cubotplugin/event/WalkListener.java @@ -0,0 +1,18 @@ +package net.simon987.cubotplugin.event; + +import net.simon987.server.event.GameEvent; +import net.simon987.server.event.GameEventListener; + +public class WalkListener implements GameEventListener { + + @Override + public Class getListenedEventType() { + return CubotWalkEvent.class; + } + + @Override + public void handle(GameEvent event) { + CubotWalkEvent walkEvent = (CubotWalkEvent) event; + walkEvent.getSource().getParent().getStats().incrementStat("walkDistance", 1); + } +} \ No newline at end of file diff --git a/Server/src/main/java/net/simon987/server/GameServer.java b/Server/src/main/java/net/simon987/server/GameServer.java index e7faa8e..426760b 100644 --- a/Server/src/main/java/net/simon987/server/GameServer.java +++ b/Server/src/main/java/net/simon987/server/GameServer.java @@ -176,6 +176,8 @@ public class GameServer implements Runnable { user.getControlledUnit().getCpu().reset(); int cost = user.getControlledUnit().getCpu().execute(timeout); user.getControlledUnit().spendEnergy(cost); + user.addTime(cost); + } catch (Exception e) { LogManager.LOGGER.severe("Error executing " + user.getUsername() + "'s code"); e.printStackTrace(); diff --git a/Server/src/main/java/net/simon987/server/user/User.java b/Server/src/main/java/net/simon987/server/user/User.java index 69f9dcc..10e4b79 100755 --- a/Server/src/main/java/net/simon987/server/user/User.java +++ b/Server/src/main/java/net/simon987/server/user/User.java @@ -70,6 +70,10 @@ public class User implements MongoSerializable { return user; } + public void addTime(int time){ + this.stats.incrementStat("executionTime", time); + } + public String getUserCode() { return userCode; } diff --git a/Server/src/main/java/net/simon987/server/user/UserStats.java b/Server/src/main/java/net/simon987/server/user/UserStats.java index 1d82b40..1c3fc5e 100644 --- a/Server/src/main/java/net/simon987/server/user/UserStats.java +++ b/Server/src/main/java/net/simon987/server/user/UserStats.java @@ -58,7 +58,28 @@ public class UserStats implements MongoSerializable { * @return The value of the stat. Returns 0 if not found */ public int getInt(String name) { - return stats.getInteger(name, 0); + return stats.getInteger(name, 0); + } + + /** + * Set the value of a stat + * + * @param name Name of the stat + * @param value new value + */ + public void setDouble(String name, double value) { + + stats.put(name, value); + } + + /** + * Get the value of at stat + * + * @param name Name of the value + * @return The value of the stat. Returns 0 if not found + */ + public double getDouble(String name) { + return stats.getDouble(name); } /** diff --git a/Server/src/main/java/net/simon987/server/user/UserStatsHelper.java b/Server/src/main/java/net/simon987/server/user/UserStatsHelper.java index 9af294d..3c8cca0 100644 --- a/Server/src/main/java/net/simon987/server/user/UserStatsHelper.java +++ b/Server/src/main/java/net/simon987/server/user/UserStatsHelper.java @@ -38,7 +38,35 @@ public class UserStatsHelper { for (Document dbUser : users.find().sort(orderBy).limit(n)) { User user = GameServer.INSTANCE.getGameUniverse().getUser((String) dbUser.get("username")); - rows.add(new AbstractMap.SimpleEntry<>(user, user.getStats().getInt(statName))); + int val = 0; + if (user.getStats().getInt(statName) > 0) { + val = user.getStats().getInt(statName); + } + rows.add(new AbstractMap.SimpleEntry<>(user, val)); + } + + return rows; + } + + /** + * Get top n players along with all their stat values, in descending order of completed vaults + * + * @param n Maximum number of players + * @return Top n players, in User,value format, in descending order + */ + public ArrayList>> getLeaderboardStats(int n) { + + ArrayList>> rows = new ArrayList<>(n); + + List users = getTopNSetSize("completedVaults", n); + + for (User user : users) { + Map allStats = new HashMap<>(); + allStats.put("completedVaults", user.getStats().getSet("completedVaults").size()); + allStats.put("death", user.getStats().getInt("death")); + allStats.put("executionTime", user.getStats().getInt("executionTime")); + allStats.put("walkDistance", user.getStats().getInt("walkDistance")); + rows.add(new AbstractMap.SimpleEntry<>(user, allStats)); } return rows; @@ -51,9 +79,9 @@ public class UserStatsHelper { * @param n Maximum number of players * @return Top n players, in User,set format, in descending order */ - public ArrayList> getTopNSetLength(String statName, int n) { + private List getTopNSetSize(String statName, int n) { - ArrayList> rows = new ArrayList<>(); + ArrayList rows = new ArrayList<>(); List ifNullList = new ArrayList<>(2); ifNullList.add("$stats." + statName); @@ -69,7 +97,7 @@ public class UserStatsHelper { new Document("$limit", n)) )) { User user = GameServer.INSTANCE.getGameUniverse().getUser((String) document.get("username")); - rows.add(new AbstractMap.SimpleEntry<>(user, user.getStats().getSet(statName))); + rows.add(user); } return rows; diff --git a/Server/src/main/java/net/simon987/server/web/LeaderBoardPage.java b/Server/src/main/java/net/simon987/server/web/LeaderBoardPage.java index 521b383..66c5e89 100644 --- a/Server/src/main/java/net/simon987/server/web/LeaderBoardPage.java +++ b/Server/src/main/java/net/simon987/server/web/LeaderBoardPage.java @@ -9,13 +9,14 @@ import spark.TemplateViewRoute; import java.util.HashMap; import java.util.Map; + public class LeaderBoardPage implements TemplateViewRoute { @Override public ModelAndView handle(Request request, Response response) { Map model = new HashMap<>(2); model.put("session", request.session()); - model.put("stats", GameServer.INSTANCE.getUserStatsHelper().getTopNSetLength("completedVaults", 25)); + model.put("stats", GameServer.INSTANCE.getUserStatsHelper().getLeaderboardStats(25)); return new ModelAndView(model, "leaderboard.vm"); } } \ No newline at end of file diff --git a/Server/src/main/resources/config.properties b/Server/src/main/resources/config.properties index 49a4cf7..7f85c34 100644 --- a/Server/src/main/resources/config.properties +++ b/Server/src/main/resources/config.properties @@ -12,7 +12,7 @@ server_name=MAR dev # ALLOW | BLOCK guest_policy=ALLOW # DEBUG -autologin=simon +#autologin=simon #Database mongo_dbname=mar_beta diff --git a/Server/src/main/resources/templates/leaderboard.vm b/Server/src/main/resources/templates/leaderboard.vm index 523cbeb..e17059c 100644 --- a/Server/src/main/resources/templates/leaderboard.vm +++ b/Server/src/main/resources/templates/leaderboard.vm @@ -16,13 +16,19 @@ Player Completed vaults + Death counts + Total execution time (ms) + Walk distance #foreach($row in $stats) $row.getKey().getUsername() - $row.getValue().size() + $row.getValue().get("completedVaults") + $row.getValue().get("death") + $row.getValue().get("executionTime") + $row.getValue().get("walkDistance") #end