diff --git a/src/main/NGECore.java b/src/main/NGECore.java index ff5def03..9320afd1 100644 --- a/src/main/NGECore.java +++ b/src/main/NGECore.java @@ -420,10 +420,33 @@ public class NGECore { didServerCrash = false; System.out.println("Started Server."); + cleanupCreatureODB(); setGalaxyStatus(2); } + private void cleanupCreatureODB() { + EntityCursor cursor = creatureODB.getCursor(Long.class, CreatureObject.class); + + Iterator it = cursor.iterator(); + List deletedObjects = new ArrayList(); + + while(it.hasNext()) { + CreatureObject creature = it.next(); + if(!characterService.playerExists(creature.getObjectID())) + deletedObjects.add(creature); + } + + cursor.close(); + + Transaction txn = creatureODB.getEnvironment().beginTransaction(null, null); + for(CreatureObject creature : deletedObjects) { + creatureODB.delete(creature.getObjectID(), Long.class, CreatureObject.class, txn); + } + txn.commitSync(); + System.out.println("Deleted " + deletedObjects.size() + " creatures."); + } + public void stop() { System.out.println("Stopping Servers and Connections."); databaseConnection.close(); diff --git a/src/services/CharacterService.java b/src/services/CharacterService.java index 5977b9be..bb6c3015 100644 --- a/src/services/CharacterService.java +++ b/src/services/CharacterService.java @@ -535,6 +535,29 @@ public class CharacterService implements INetworkDispatch { return false; } + /** + * Checks the database for if the object ID of the player exists. + * @param objectId Object ID to check for in the database + * @return Returns True if the player exists + */ + public boolean playerExists(long objectId) { + + try { + PreparedStatement ps = databaseConnection.preparedStatement("SELECT id FROM characters WHERE id=?"); + ps.setLong(1, objectId); + ResultSet resultSet = ps.executeQuery(); + + boolean isDuplicate = resultSet.next(); + resultSet.getStatement().close(); + if (isDuplicate) { return true; } + else { return false; } + } + + catch (SQLException e) { e.printStackTrace(); } + return false; + } + + private void createStarterClothing(CreatureObject creature, String raceTemplate, String profession) { try { ProfessionTemplateVisitor visitor = ClientFileManager.loadFile("creation/profession_defaults_" + profession + ".iff", ProfessionTemplateVisitor.class);