From 2e33a3c911bac2ff97d162ebf996b2b8adb0024f Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Thu, 26 May 2016 11:33:05 -0500 Subject: [PATCH] Fixed object/character deletion --- src/services/objects/ObjectManager.java | 59 ++++++------------------- src/services/player/LoginService.java | 13 +++--- 2 files changed, 20 insertions(+), 52 deletions(-) diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 7a37a516..1b547ce6 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -29,7 +29,6 @@ package services.objects; import java.util.Collection; import java.util.Hashtable; -import java.util.Iterator; import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -44,7 +43,6 @@ import intents.RequestZoneInIntent; import intents.network.GalacticPacketIntent; import network.packets.Packet; import network.packets.swg.ErrorMessage; -import network.packets.swg.zone.SceneDestroyObject; import network.packets.swg.zone.insertion.SelectCharacter; import resources.control.Intent; import resources.control.Manager; @@ -214,10 +212,6 @@ public class ObjectManager extends Manager { if (i instanceof DestroyObjectIntent) processDestroyObjectIntent((DestroyObjectIntent) i); break; - case DeleteCharacterIntent.TYPE: - if (i instanceof DeleteCharacterIntent) - deleteObject(((DeleteCharacterIntent) i).getCreature().getObjectId()); - break; } } @@ -263,22 +257,6 @@ public class ObjectManager extends Manager { } } - private SWGObject deleteObject(long objId) { - synchronized (database) { - database.remove(objId); - database.save(); - } - synchronized (objectMap) { - SWGObject obj = objectMap.remove(objId); - if (obj == null) - return null; - obj.clearAware(); - objectAwareness.remove(obj); - Log.v("ObjectManager", "Deleted object %d [%s]", obj.getObjectId(), obj.getTemplate()); - return obj; - } - } - private void putObject(SWGObject object) { ObjectCreator.updateMaxObjectId(object.getObjectId()); synchronized (objectMap) { @@ -287,36 +265,25 @@ public class ObjectManager extends Manager { } private SWGObject destroyObject(SWGObject object) { - - long objId = object.getObjectId(); - for (SWGObject slottedObj : object.getSlots().values()) { if (slottedObj != null) destroyObject(slottedObj); } - - Iterator containerIterator = object.getContainedObjects().iterator(); - while(containerIterator.hasNext()) { - SWGObject containedObject = containerIterator.next(); - if (containedObject != null) - destroyObject(containedObject); + + for (SWGObject contained : object.getContainedObjects()) { + if (contained != null) + destroyObject(contained); } - - // Remove object from the parent - SWGObject parent = object.getParent(); - if (parent != null) { - if (parent instanceof CreatureObject) { - ((CreatureObject) parent).removeEquipment(object); - } - object.sendObserversAndSelf(new SceneDestroyObject(objId)); - - object.moveToContainer(null); - } else { - object.sendObservers(new SceneDestroyObject(objId)); + object.moveToContainer(null); + objectAwareness.remove(object); + object.clearAware(); + synchronized (database) { + database.remove(object.getObjectId()); + database.save(); + } + synchronized (objectMap) { + objectMap.remove(object.getObjectId()); } - - // Finally, remove from the awareness tree - deleteObject(object.getObjectId()); return object; } diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index 0779a187..f84cd361 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -105,7 +105,7 @@ public class LoginService extends Service { @Override public void onIntentReceived(Intent i) { if (i instanceof DeleteCharacterIntent) { - deleteCharacter(((DeleteCharacterIntent) i).getCreature().getObjectId()); + deleteCharacter(((DeleteCharacterIntent) i).getCreature()); } else if (i instanceof GalacticPacketIntent) { GalacticPacketIntent gpi = (GalacticPacketIntent) i; handlePacket(gpi, gpi.getPlayerManager().getPlayerFromNetworkId(gpi.getNetworkId()), gpi.getPacket()); @@ -134,13 +134,13 @@ public class LoginService extends Service { private void handleCharDeletion(GalacticIntent intent, Player player, DeleteCharacterRequest request) { SWGObject obj = intent.getObjectManager().getObjectById(request.getPlayerId()); - if (obj != null) + boolean success = false; if (obj != null && obj instanceof CreatureObject) { - new DestroyObjectIntent(obj).broadcast(); + success = deleteCharacter(obj); Log.i("LoginService", "Deleted character %s for user %s", ((CreatureObject)obj).getName(), player.getUsername()); } else Log.w("LoginService", "Could not delete character! Character: ID: " + request.getPlayerId() + " / " + obj); - sendPacket(player, new DeleteCharacterResponse(deleteCharacter(request.getPlayerId()))); + sendPacket(player, new DeleteCharacterResponse(success)); } private void handleLogin(Player player, LoginClientId id) { @@ -320,10 +320,11 @@ public class LoginService extends Service { return characters.toArray(new SWGCharacter[characters.size()]); } - private boolean deleteCharacter(long id) { + private boolean deleteCharacter(SWGObject obj) { + new DestroyObjectIntent(obj).broadcast(); synchronized (deleteCharacter) { try { - deleteCharacter.setLong(1, id); + deleteCharacter.setLong(1, obj.getObjectId()); return deleteCharacter.executeUpdate() > 0; } catch (SQLException e) { e.printStackTrace();