diff --git a/src/services/ConnectionService.java b/src/services/ConnectionService.java index 934efd58..94b05138 100644 --- a/src/services/ConnectionService.java +++ b/src/services/ConnectionService.java @@ -226,10 +226,13 @@ public class ConnectionService implements INetworkDispatch { long parentId = object.getParentId(); + boolean removed = false; if(object.getContainer() == null) { boolean remove = core.simulationService.remove(object, object.getPosition().x, object.getPosition().z); - if(remove) + if(remove) { System.out.println("Successful quadtree remove"); + removed = true; + } } else { object.getContainer()._remove(object); object.setParentId(parentId); @@ -250,8 +253,10 @@ public class ConnectionService implements INetworkDispatch { object.createTransaction(core.getCreatureODB().getEnvironment()); core.getCreatureODB().put(object, Long.class, CreatureObject.class, object.getTransaction()); object.getTransaction().commitSync(); - core.objectService.destroyObject(object); - + if(removed) + core.objectService.destroyObject(object, false); + else + core.objectService.destroyObject(object); } diff --git a/src/services/LoginService.java b/src/services/LoginService.java index 7bb0a2ef..29e65124 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -42,7 +42,6 @@ import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; import engine.resources.service.LocalDbLoginProvider; import engine.resources.service.VBLoginProvider; - import protocol.swg.CharacterCreationDisabled; import protocol.swg.ClientUIErrorMessage; import protocol.swg.DeleteCharacterMessage; @@ -56,7 +55,6 @@ import protocol.swg.ServerNowEpochTime; import protocol.swg.StationIdHasJediSlot; import resources.common.*; import resources.datatables.PlayerFlags; - import resources.objects.creature.CreatureObject; @SuppressWarnings("unused") @@ -182,41 +180,49 @@ public class LoginService implements INetworkDispatch{ packet.deserialize(data); Client client = core.getClient(session); - PreparedStatement preparedStatement; - - preparedStatement = databaseConnection1.preparedStatement("DELETE FROM characters WHERE \"id\"=? AND \"galaxyId\"=? AND \"accountId\"=?"); - preparedStatement.setLong(1, packet.getcharId()); - preparedStatement.setInt(2, packet.getgalaxyId()); - preparedStatement.setInt(3, (int) client.getAccountId()); - boolean resultSet = preparedStatement.execute(); - - //TODO: send deletecharacter failed - if(!resultSet) { - CreatureObject object = (CreatureObject) core.objectService.getObject(packet.getcharId()); - - if (object != null) { - if (object.isInQuadtree() && object.getClient() != null) { - core.connectionService.disconnect(object.getClient()); - } - - if (object.isInQuadtree()) { - core.simulationService.remove(object, object.getPosition().x, object.getPosition().z, true); - } - - core.objectService.destroyObject(object); - } - - core.getCreatureODB().delete(new Long(packet.getcharId()), Long.class, CreatureObject.class); - DeleteCharacterReplyMessage reply = new DeleteCharacterReplyMessage(0); - session.write(reply.serialize()); - } - - preparedStatement.close(); + PreparedStatement preparedStatement; + preparedStatement = databaseConnection1.preparedStatement("DELETE FROM characters WHERE \"id\"=? AND \"galaxyId\"=? AND \"accountId\"=?"); + preparedStatement.setLong(1, packet.getcharId()); + preparedStatement.setInt(2, packet.getgalaxyId()); + preparedStatement.setInt(3, (int) client.getAccountId()); + boolean resultSet = preparedStatement.execute(); + CreatureObject object = (CreatureObject) core.objectService.getObject(packet.getcharId()); + + // TODO: Revert DELETE if everything fails for some reason... ? + if(!resultSet) { + if (object != null) { + boolean destroyed = false; + if(object.isInQuadtree() && object.getClient() != null) { + core.connectionService.disconnect(object.getClient()); // destroyed in method + destroyed = true; + } + else { + core.objectService.destroyObject(object, false, false); + destroyed = true; + } + if(destroyed) { + core.getCreatureODB().delete(new Long(packet.getcharId()), Long.class, CreatureObject.class); + DeleteCharacterReplyMessage reply = new DeleteCharacterReplyMessage(0); + session.write(reply.serialize()); + } else { + //core.getCreatureODB().delete(new Long(packet.getcharId()), Long.class, CreatureObject.class); + DeleteCharacterReplyMessage reply = new DeleteCharacterReplyMessage(1); + session.write(reply.serialize()); + } + } else { + //core.getCreatureODB().delete(new Long(packet.getcharId()), Long.class, CreatureObject.class); + DeleteCharacterReplyMessage reply = new DeleteCharacterReplyMessage(1); + session.write(reply.serialize()); + } + } else { + //core.getCreatureODB().delete(new Long(packet.getcharId()), Long.class, CreatureObject.class); + DeleteCharacterReplyMessage reply = new DeleteCharacterReplyMessage(1); + session.write(reply.serialize()); + } + preparedStatement.close(); } - }); - } public void shutdown() { diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 6771397a..e756aab7 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -357,18 +357,22 @@ public class ObjectService implements INetworkDispatch { public Map getObjectList() { return objectList; } + public void destroyObject(SWGObject object) { + destroyObject(object, false, true); + } + public void destroyObject(final SWGObject object, int seconds) { scheduler.schedule(new Runnable() { @Override public void run() { - destroyObject(object); + destroyObject(object, false, true); } }, seconds, TimeUnit.SECONDS); } - public void destroyObject(SWGObject object) { + public void destroyObject(SWGObject object, boolean notify, boolean removeFromQt) { if (object == null) { return; } @@ -411,20 +415,29 @@ public class ObjectService implements INetworkDispatch { objectList.remove(obj.getObjectID()); } }); - objectList.remove(object.getObjectID()); - core.simulationService.remove(object, object.getPosition().x, object.getPosition().y); + if(removeFromQt && !notify) + core.simulationService.remove(object, object.getPosition().x, object.getPosition().y); + + else if(notify && removeFromQt) + core.simulationService.remove(object, object.getPosition().x, object.getPosition().y, true); + + objectList.remove(object.getObjectID()); + } public void destroyObject(long objectID) { SWGObject object = getObject(objectID); if(object != null) { - destroyObject(object); + destroyObject(object, false, true); } } + public void destroyObject(SWGObject object, boolean removeFromQt) { + destroyObject(object, false, removeFromQt); + } public SWGObject getObjectByCustomName(String customName) { synchronized(objectList) {