From 7c53454d8ae585ccd5b7ee2569869ed7f6149ebe Mon Sep 17 00:00:00 2001 From: Treeku Date: Sat, 28 Dec 2013 17:08:24 +0000 Subject: [PATCH] Delete char now logs it out & removes it from game - Incase they are logged onto the character with another client when it's deleted. - Ensures removal from the quadtree. --- src/services/LoginService.java | 51 ++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/src/services/LoginService.java b/src/services/LoginService.java index 7f6ad1c7..bd464fc2 100644 --- a/src/services/LoginService.java +++ b/src/services/LoginService.java @@ -55,8 +55,10 @@ import protocol.swg.LoginEnumCluster; import protocol.swg.ServerNowEpochTime; import protocol.swg.StationIdHasJediSlot; import resources.common.*; +import resources.datatables.PlayerFlags; import resources.objects.creature.CreatureObject; +import resources.objects.player.PlayerObject; @SuppressWarnings("unused") @@ -181,21 +183,40 @@ 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) { - 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(); + + //TODO: send deletecharacter failed + if(!resultSet) { + CreatureObject object = core.objectService.getObject(packet.getcharId()); + + if (object != null) { + PlayerObject player = object.getSlottedObject("ghost"); + + + if (player != null && !player.isSet(PlayerFlags.LD) && object.getClient()) { + core.connectionService.disconnect(object.getClient().getSession()); + } + + if (object.isInQuadtree()) { + core.simulationService.remove(object, object.getPosition().x, object.getPosition().z, true); + } + + destroyObject(object); + } + + core.getCreatureODB().delete(new Long(packet.getcharId()), Long.class, CreatureObject.class); + DeleteCharacterReplyMessage reply = new DeleteCharacterReplyMessage(0); + session.write(reply.serialize()); + } + + preparedStatement.close(); + } });