From f8c5dac969547543168959fcb89903e0da581910 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 5 Mar 2018 21:47:28 -0500 Subject: [PATCH] Added logging of vault clears for display in the leaderboard --- .../net/simon987/npcplugin/NpcPlugin.java | 11 ++++ .../simon987/npcplugin/VaultDimension.java | 2 +- .../net/simon987/npcplugin/VaultDoor.java | 1 + .../simon987/npcplugin/VaultExitPortal.java | 61 +++++++++++++++++++ .../npcplugin/io/StatsDatabaseManager.java | 49 +++++++++++++++ .../server/game/ControllableUnit.java | 2 + .../server/webserver/DebugHandler.java | 11 +++- .../server/webserver/SocketServer.java | 2 +- 8 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 Plugin NPC/src/main/java/net/simon987/npcplugin/VaultExitPortal.java create mode 100644 Plugin NPC/src/main/java/net/simon987/npcplugin/io/StatsDatabaseManager.java diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java index b6e5ce7..8aa89c5 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/NpcPlugin.java @@ -4,6 +4,7 @@ import com.mongodb.DBObject; import net.simon987.npcplugin.event.CpuInitialisationListener; import net.simon987.npcplugin.event.VaultWorldUpdateListener; import net.simon987.npcplugin.event.WorldCreationListener; +import net.simon987.npcplugin.io.StatsDatabaseManager; import net.simon987.server.ServerConfiguration; import net.simon987.server.assembly.CpuHardware; import net.simon987.server.game.GameObject; @@ -21,6 +22,8 @@ public class NpcPlugin extends ServerPlugin implements GameObjectDeserializer, C */ private static ArrayList radioTowers; + private static StatsDatabaseManager statsDbManager; + @Override public void init(ServerConfiguration configuration) { @@ -30,6 +33,8 @@ public class NpcPlugin extends ServerPlugin implements GameObjectDeserializer, C radioTowers = new ArrayList<>(32); + statsDbManager = new StatsDatabaseManager(configuration); + LogManager.LOGGER.info("Initialised NPC plugin"); } @@ -52,6 +57,8 @@ public class NpcPlugin extends ServerPlugin implements GameObjectDeserializer, C return ElectricBox.deserialize(obj); } else if (objType == Portal.ID) { return Portal.deserialize(obj); + } else if (objType == VaultExitPortal.ID) { + return VaultExitPortal.deserialize(obj); } return null; @@ -72,4 +79,8 @@ public class NpcPlugin extends ServerPlugin implements GameObjectDeserializer, C public static ArrayList getRadioTowers() { return radioTowers; } + + public static StatsDatabaseManager getStatsDbManager() { + return statsDbManager; + } } diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDimension.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDimension.java index 681d7f3..8f73fa8 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDimension.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDimension.java @@ -140,7 +140,7 @@ public class VaultDimension { if (exitPortalPt != null) { - Portal exitPortal = new Portal(); + VaultExitPortal exitPortal = new VaultExitPortal(); exitPortal.setDst(exitLocation); exitPortal.setX(exitPortalPt.x); exitPortal.setY(exitPortalPt.y); diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java index bdd7cad..65be131 100644 --- a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultDoor.java @@ -157,6 +157,7 @@ public class VaultDoor extends GameObject implements Programmable, Enterable, Up VaultDoor vaultDoor = new VaultDoor(0); //cypherId ? vaultDoor.setX((int) obj.get("x")); vaultDoor.setY((int) obj.get("y")); + vaultDoor.setObjectId((long) obj.get("i")); if (obj.containsField("homeX") && obj.containsField("homeY")) { diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultExitPortal.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultExitPortal.java new file mode 100644 index 0000000..341118a --- /dev/null +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/VaultExitPortal.java @@ -0,0 +1,61 @@ +package net.simon987.npcplugin; + +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import net.simon987.server.game.ControllableUnit; +import net.simon987.server.game.GameObject; +import net.simon987.server.game.Location; +import net.simon987.server.logging.LogManager; + +/** + * Final exit portal located in the 'last' World of a Vault dimension + */ +public class VaultExitPortal extends Portal { + + public static final int ID = 9; + + @Override + public BasicDBObject mongoSerialise() { + BasicDBObject dbObject = new BasicDBObject(); + + dbObject.put("i", getObjectId()); + dbObject.put("x", getX()); + dbObject.put("y", getY()); + dbObject.put("t", ID); + dbObject.put("dstWorldX", getDst().worldX); + dbObject.put("dstWorldY", getDst().worldY); + dbObject.put("dstX", getDst().x); + dbObject.put("dstY", getDst().y); + dbObject.put("dstDimension", getDst().dimension); + + return dbObject; + } + + @Override + public boolean enter(GameObject object) { + + LogManager.LOGGER.info(((ControllableUnit) object).getParent().getUsername() + " Completed vault " + + object.getWorld().getDimension()); + + NpcPlugin.getStatsDbManager().saveVaultCompletion((ControllableUnit) object, object.getWorld().getDimension()); + + + return super.enter(object); + } + + public static Portal deserialize(DBObject obj) { + + VaultExitPortal portal = new VaultExitPortal(); + + portal.setDst(new Location( + (int) obj.get("dstWorldX"), + (int) obj.get("dstWorldY"), + (String) obj.get("dstDimension"), + (int) obj.get("dstX"), + (int) obj.get("dstY"))); + portal.setX((int) obj.get("x")); + portal.setY((int) obj.get("y")); + + return portal; + } +} diff --git a/Plugin NPC/src/main/java/net/simon987/npcplugin/io/StatsDatabaseManager.java b/Plugin NPC/src/main/java/net/simon987/npcplugin/io/StatsDatabaseManager.java new file mode 100644 index 0000000..1990d18 --- /dev/null +++ b/Plugin NPC/src/main/java/net/simon987/npcplugin/io/StatsDatabaseManager.java @@ -0,0 +1,49 @@ +package net.simon987.npcplugin.io; + +import com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException; +import net.simon987.server.ServerConfiguration; +import net.simon987.server.game.ControllableUnit; +import net.simon987.server.io.DatabaseManager; +import net.simon987.server.logging.LogManager; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +public class StatsDatabaseManager extends DatabaseManager { + + public StatsDatabaseManager(ServerConfiguration config) { + super(config); + } + + public void saveVaultCompletion(ControllableUnit unit, String dimension) { + + Connection connection = getConnection(); + + try { + + PreparedStatement p = connection.prepareStatement("INSERT INTO mar_vault_clear " + + "(username, clear_time, vault_id) VALUES (?,?,?)"); + p.setString(1, unit.getParent().getUsername()); + p.setInt(2, 0); + p.setString(3, dimension); + + int result = p.executeUpdate(); + + LogManager.LOGGER.fine("Saved vault clear (" + result + " rows changed)"); + + } catch (MySQLIntegrityConstraintViolationException e) { + LogManager.LOGGER.fine("This vault was already cleared by " + unit.getParent().getUsername()); + } catch (SQLException e) { + LogManager.LOGGER.severe(e.getMessage()); + e.printStackTrace(); + } finally { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + } +} diff --git a/Server/src/main/java/net/simon987/server/game/ControllableUnit.java b/Server/src/main/java/net/simon987/server/game/ControllableUnit.java index 31b279d..a352376 100644 --- a/Server/src/main/java/net/simon987/server/game/ControllableUnit.java +++ b/Server/src/main/java/net/simon987/server/game/ControllableUnit.java @@ -13,6 +13,8 @@ public interface ControllableUnit { void setParent(User user); + User getParent(); + ArrayList getKeyboardBuffer(); Memory getFloppyData(); diff --git a/Server/src/main/java/net/simon987/server/webserver/DebugHandler.java b/Server/src/main/java/net/simon987/server/webserver/DebugHandler.java index cdefe37..96d06ff 100644 --- a/Server/src/main/java/net/simon987/server/webserver/DebugHandler.java +++ b/Server/src/main/java/net/simon987/server/webserver/DebugHandler.java @@ -167,7 +167,11 @@ public class DebugHandler implements MessageHandler { } } catch (Exception e) { - return Arrays.toString(e.getStackTrace()).replaceAll(", ", "\n"); + + String message = e.getMessage(); + message += "\n " + Arrays.toString(e.getStackTrace()).replaceAll(", ", "\n"); + + return message; } @@ -213,7 +217,10 @@ public class DebugHandler implements MessageHandler { } catch (Exception e) { - return Arrays.toString(e.getStackTrace()).replaceAll(", ", "\n"); + String message = e.getMessage(); + message += "\n " + Arrays.toString(e.getStackTrace()).replaceAll(", ", "\n"); + + return message; } } diff --git a/Server/src/main/java/net/simon987/server/webserver/SocketServer.java b/Server/src/main/java/net/simon987/server/webserver/SocketServer.java index ee0752b..e5ff2dd 100644 --- a/Server/src/main/java/net/simon987/server/webserver/SocketServer.java +++ b/Server/src/main/java/net/simon987/server/webserver/SocketServer.java @@ -179,7 +179,7 @@ public class SocketServer extends WebSocketServer { JSONObject json = new JSONObject(); json.put("t", "tick"); - LogManager.LOGGER.info("Notified " + userManager.getOnlineUsers().size() + " users"); +// LogManager.LOGGER.info("Notified " + userManager.getOnlineUsers().size() + " users"); ArrayList onlineUsers = new ArrayList<>(userManager.getOnlineUsers()); //Avoid ConcurrentModificationException for (OnlineUser user : onlineUsers) {