From e3d63a872e6f6926f21bcd3bb71ee920b8b1de1f Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 00:29:52 -0500 Subject: [PATCH 01/21] attempt a sanity check --- src/resources/equipment/Equipment.java | 44 ++++++++++++++------------ 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/resources/equipment/Equipment.java b/src/resources/equipment/Equipment.java index 4a1418ab..fa72eacd 100644 --- a/src/resources/equipment/Equipment.java +++ b/src/resources/equipment/Equipment.java @@ -68,28 +68,32 @@ public class Equipment extends Delta { TangibleObject object = (TangibleObject) getObject(); - synchronized(objectMutex) { - int size = 19 + object.getCustomization ().length; + if (object.getCustomization ().length > 0) { + synchronized(objectMutex) { + int size = 19 + object.getCustomization ().length; + + if (object instanceof WeaponObject) { + size += ((WeaponObject) object).getBaseline(3).getBaseline().array().length; + size += ((WeaponObject) object).getBaseline(6).getBaseline().array().length; + } - if (object instanceof WeaponObject) { - size += ((WeaponObject) object).getBaseline(3).getBaseline().array().length; - size += ((WeaponObject) object).getBaseline(6).getBaseline().array().length; + IoBuffer buffer = createBuffer(size); + buffer.putShort((short) object.getCustomization().length); + buffer.put(object.getCustomization()); + buffer.putInt(object.getArrangementId()); + buffer.putLong(object.getObjectID()); + buffer.putInt(CRC.StringtoCRC(object.getTemplate())); + buffer.put(getBoolean((object instanceof WeaponObject))); + if (object instanceof WeaponObject) { + buffer.put(((WeaponObject) object).getBaseline(3).getBaseline().array()); + buffer.put(((WeaponObject) object).getBaseline(6).getBaseline().array()); + } + buffer.flip(); + + return buffer.array(); } - - IoBuffer buffer = createBuffer(size); - buffer.putShort((short) object.getCustomization().length); - buffer.put(object.getCustomization()); - buffer.putInt(object.getArrangementId()); - buffer.putLong(object.getObjectID()); - buffer.putInt(CRC.StringtoCRC(object.getTemplate())); - buffer.put(getBoolean((object instanceof WeaponObject))); - if (object instanceof WeaponObject) { - buffer.put(((WeaponObject) object).getBaseline(3).getBaseline().array()); - buffer.put(((WeaponObject) object).getBaseline(6).getBaseline().array()); - } - buffer.flip(); - - return buffer.array(); + } else { + throw new IndexOutOfBoundsException(); //null or 0 index is out of bounds } } From 3c1480b891156ec9bbc7b61d08fb6f597b7b6134 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 00:34:56 -0500 Subject: [PATCH 02/21] try this then --- src/resources/equipment/Equipment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/resources/equipment/Equipment.java b/src/resources/equipment/Equipment.java index fa72eacd..e1c3738f 100644 --- a/src/resources/equipment/Equipment.java +++ b/src/resources/equipment/Equipment.java @@ -93,8 +93,10 @@ public class Equipment extends Delta { return buffer.array(); } } else { - throw new IndexOutOfBoundsException(); //null or 0 index is out of bounds + System.err.println("Serious error: Equipment object is null in objectList."); } + + return null; } } From b44c1ab13bfce3ebedb5b8dbabcef86ccb95338a Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 00:37:03 -0500 Subject: [PATCH 03/21] fix my comparison --- src/resources/equipment/Equipment.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/resources/equipment/Equipment.java b/src/resources/equipment/Equipment.java index e1c3738f..2f3544c7 100644 --- a/src/resources/equipment/Equipment.java +++ b/src/resources/equipment/Equipment.java @@ -68,7 +68,7 @@ public class Equipment extends Delta { TangibleObject object = (TangibleObject) getObject(); - if (object.getCustomization ().length > 0) { + if (object.getCustomization().length == 0) { synchronized(objectMutex) { int size = 19 + object.getCustomization ().length; From 02a9581ccf60b31b274839e82febad42c82f1bd9 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 00:42:16 -0500 Subject: [PATCH 04/21] attempt an equipment fix...may be able to remove the typecasting and just use object up top? --- src/resources/equipment/Equipment.java | 56 +++++++++++++------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/src/resources/equipment/Equipment.java b/src/resources/equipment/Equipment.java index 2f3544c7..0c6b16ac 100644 --- a/src/resources/equipment/Equipment.java +++ b/src/resources/equipment/Equipment.java @@ -58,45 +58,43 @@ public class Equipment extends Delta { } public byte[] getBytes() { - if (!(getObject() instanceof TangibleObject)) { - if (getObject() == null) { + SWGObject sobject = getObject(); + + if (!(sobject instanceof TangibleObject)) { + if (sobject == null) { System.err.println("Serious error: Equipment object is null in objectList."); } else { System.err.println("Serious error: Equipment object isn't a TangibleObject"); } + + return null; } - TangibleObject object = (TangibleObject) getObject(); + TangibleObject object = (TangibleObject) sobject; - if (object.getCustomization().length == 0) { - synchronized(objectMutex) { - int size = 19 + object.getCustomization ().length; - - if (object instanceof WeaponObject) { - size += ((WeaponObject) object).getBaseline(3).getBaseline().array().length; - size += ((WeaponObject) object).getBaseline(6).getBaseline().array().length; - } + synchronized(objectMutex) { + int size = 19 + object.getCustomization ().length; - IoBuffer buffer = createBuffer(size); - buffer.putShort((short) object.getCustomization().length); - buffer.put(object.getCustomization()); - buffer.putInt(object.getArrangementId()); - buffer.putLong(object.getObjectID()); - buffer.putInt(CRC.StringtoCRC(object.getTemplate())); - buffer.put(getBoolean((object instanceof WeaponObject))); - if (object instanceof WeaponObject) { - buffer.put(((WeaponObject) object).getBaseline(3).getBaseline().array()); - buffer.put(((WeaponObject) object).getBaseline(6).getBaseline().array()); - } - buffer.flip(); - - return buffer.array(); + if (object instanceof WeaponObject) { + size += ((WeaponObject) object).getBaseline(3).getBaseline().array().length; + size += ((WeaponObject) object).getBaseline(6).getBaseline().array().length; } - } else { - System.err.println("Serious error: Equipment object is null in objectList."); + + IoBuffer buffer = createBuffer(size); + buffer.putShort((short) object.getCustomization().length); + buffer.put(object.getCustomization()); + buffer.putInt(object.getArrangementId()); + buffer.putLong(object.getObjectID()); + buffer.putInt(CRC.StringtoCRC(object.getTemplate())); + buffer.put(getBoolean((object instanceof WeaponObject))); + if (object instanceof WeaponObject) { + buffer.put(((WeaponObject) object).getBaseline(3).getBaseline().array()); + buffer.put(((WeaponObject) object).getBaseline(6).getBaseline().array()); + } + buffer.flip(); + + return buffer.array(); } - - return null; } } From d8f47c62361b30779fd0b61360bf016a7695e378 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 00:47:14 -0500 Subject: [PATCH 05/21] this seems more logical...it's returned as an SWGObject, how can it be anything else? --- src/resources/equipment/Equipment.java | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/resources/equipment/Equipment.java b/src/resources/equipment/Equipment.java index 0c6b16ac..7f6ac7df 100644 --- a/src/resources/equipment/Equipment.java +++ b/src/resources/equipment/Equipment.java @@ -60,13 +60,8 @@ public class Equipment extends Delta { public byte[] getBytes() { SWGObject sobject = getObject(); - if (!(sobject instanceof TangibleObject)) { - if (sobject == null) { - System.err.println("Serious error: Equipment object is null in objectList."); - } else { - System.err.println("Serious error: Equipment object isn't a TangibleObject"); - } - + if (sobject == null) { + System.err.println("Serious error: Equipment object is null in objectList."); return null; } From 572cb9c1288a257d4d6e3c29b6da5900c51463cb Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:00:12 -0500 Subject: [PATCH 06/21] fix something stupid --- src/services/object/ObjectService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 158c8f9a..d6e39144 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -575,7 +575,8 @@ public class ObjectService implements INetworkDispatch { if (objectList.containsKey(objectID)) { System.err.println("getObject(): object is null but objectList contains objectID key"); } else { -// System.err.println("getObject(): object is null"); + System.err.println("getObject(): object of id "+ objectID + "is null. Destroying object."); + destroyObject(object,0); } } From d2f81b7dc439b77b0ee8a06f79b7d8f7c33f64f3 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:02:02 -0500 Subject: [PATCH 07/21] proper return val on null --- src/services/object/ObjectService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index d6e39144..18e83a17 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -576,7 +576,8 @@ public class ObjectService implements INetworkDispatch { System.err.println("getObject(): object is null but objectList contains objectID key"); } else { System.err.println("getObject(): object of id "+ objectID + "is null. Destroying object."); - destroyObject(object,0); + destroyObject(object,0); + return null; } } From 9fb4c11d291ceab5bc3f8ada4a11f5aa2b5a5ffc Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:07:23 -0500 Subject: [PATCH 08/21] debugging... --- src/services/object/ObjectService.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 18e83a17..67b7e89f 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -575,9 +575,8 @@ public class ObjectService implements INetworkDispatch { if (objectList.containsKey(objectID)) { System.err.println("getObject(): object is null but objectList contains objectID key"); } else { - System.err.println("getObject(): object of id "+ objectID + "is null. Destroying object."); - destroyObject(object,0); - return null; + System.err.println("getObject(): object of id "+ objectID + "is null."); + Thread.currentThread().getStackTrace(); } } From 0a60cf3c7a57fd0f5a9661c27b0c3e48b405199f Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:13:27 -0500 Subject: [PATCH 09/21] dump the stack --- src/services/object/ObjectService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 67b7e89f..8da93689 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -575,8 +575,8 @@ public class ObjectService implements INetworkDispatch { if (objectList.containsKey(objectID)) { System.err.println("getObject(): object is null but objectList contains objectID key"); } else { - System.err.println("getObject(): object of id "+ objectID + "is null."); - Thread.currentThread().getStackTrace(); + System.err.println("getObject(): object is null"); + Thread.currentThread().dumpStack(); } } From ca1f3fd6b8fca04d912d74b2052c066abdd614ed Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:21:10 -0500 Subject: [PATCH 10/21] staticservice fix, hopefully --- src/services/StaticService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/services/StaticService.java b/src/services/StaticService.java index e09c2288..96a511e4 100644 --- a/src/services/StaticService.java +++ b/src/services/StaticService.java @@ -127,7 +127,10 @@ public class StaticService implements INetworkDispatch { long buildingId = 0; int cellNumber = 0; - SWGObject cell = core.objectService.getObject(cellId); + if (cellId != 0L) { + SWGObject cell = core.objectService.getObject(cellId); + return null; + } if (cellId != 0 && cell == null) { System.err.println("CellId invalid for template " + template); From 23bdbcb0ef4d7de56787bd8fef14c68028885827 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:22:28 -0500 Subject: [PATCH 11/21] had my logic reversed, need more coffee --- src/services/StaticService.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/services/StaticService.java b/src/services/StaticService.java index 96a511e4..85086dbe 100644 --- a/src/services/StaticService.java +++ b/src/services/StaticService.java @@ -127,12 +127,9 @@ public class StaticService implements INetworkDispatch { long buildingId = 0; int cellNumber = 0; - if (cellId != 0L) { + if (cellId != 0L && cellId != 0) { SWGObject cell = core.objectService.getObject(cellId); - return null; - } - - if (cellId != 0 && cell == null) { + } else { System.err.println("CellId invalid for template " + template); return null; } From a549bedd6b740e74e499d205bf8d0a5f101d6e58 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:24:59 -0500 Subject: [PATCH 12/21] avoid errors --- src/services/StaticService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/services/StaticService.java b/src/services/StaticService.java index 85086dbe..0af320d3 100644 --- a/src/services/StaticService.java +++ b/src/services/StaticService.java @@ -127,8 +127,10 @@ public class StaticService implements INetworkDispatch { long buildingId = 0; int cellNumber = 0; + SWGObject cell = null; + if (cellId != 0L && cellId != 0) { - SWGObject cell = core.objectService.getObject(cellId); + cell = core.objectService.getObject(cellId); } else { System.err.println("CellId invalid for template " + template); return null; From 998b1d9e3971397433efcdfaa4d3247d7a7572d4 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:52:16 -0500 Subject: [PATCH 13/21] fix what appears to be a bug --- src/services/object/ObjectService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 8da93689..a85bd4cb 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -1229,7 +1229,7 @@ public class ObjectService implements INetworkDispatch { if(object.getParentId() != 0 && object.getContainer() == null) object.setParent(getObject(object.getParentId())); object.getContainerInfo(object.getTemplate()); - if(getObject(object.getObjectID()) == null) + if(getObject(object.getObjectID()) != null) objectList.put(object.getObjectID(), object); }); From a7d5e0d2fdee950db76ffa50efb652dd5164d712 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 01:59:48 -0500 Subject: [PATCH 14/21] is the object null? --- src/services/object/ObjectService.java | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index a85bd4cb..89fcc439 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -1223,14 +1223,18 @@ public class ObjectService implements INetworkDispatch { }); creature.viewChildren(creature, true, true, (object) -> { - if(object.getMutex() == null) - object.initializeBaselines(); - object.initAfterDBLoad(); - if(object.getParentId() != 0 && object.getContainer() == null) - object.setParent(getObject(object.getParentId())); - object.getContainerInfo(object.getTemplate()); - if(getObject(object.getObjectID()) != null) - objectList.put(object.getObjectID(), object); + if (object != null) { + if(object.getMutex() == null) + object.initializeBaselines(); + object.initAfterDBLoad(); + if(object.getParentId() != 0 && object.getContainer() == null) + object.setParent(getObject(object.getParentId())); + object.getContainerInfo(object.getTemplate()); + if(getObject(object.getObjectID()) != null) + objectList.put(object.getObjectID(), object); + } else { + Thread.currentThread().dumpStack(); + } }); if(creature.getParentId() != 0) { From 6e2e6beab3d4bd0f254d39ccf1f31a1eb3572e0e Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 02:15:42 -0500 Subject: [PATCH 15/21] more error handling for null creatures --- src/services/object/ObjectService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 89fcc439..0aba9904 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -1149,7 +1149,8 @@ public class ObjectService implements INetworkDispatch { return; } CreatureObject creature = null; - if(getObject(objectId) == null) { + + if(objectId != 0 && objectId != 0L && getObject(objectId) == null) { creature = getCreatureFromDB(objectId); if(creature == null) { System.err.println("Cant get creature from db"); @@ -1166,7 +1167,7 @@ public class ObjectService implements INetworkDispatch { } else { if (!(getObject(objectId) instanceof CreatureObject)) { - System.out.println("Character is not an instance of CreatureObject!"); + System.out.println("Character is not an instance of CreatureObject or is null!"); return; } From 6e3fdb73043dc94b834c4499eb59fc5ef7d9dc69 Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 02:22:30 -0500 Subject: [PATCH 16/21] longs when null equate to 0L --- src/services/object/ObjectService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 0aba9904..5819ab18 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -1148,9 +1148,10 @@ public class ObjectService implements INetworkDispatch { System.err.println("NULL Client"); return; } + CreatureObject creature = null; - if(objectId != 0 && objectId != 0L && getObject(objectId) == null) { + if(objectId != 0L && getObject(objectId) == null) { creature = getCreatureFromDB(objectId); if(creature == null) { System.err.println("Cant get creature from db"); From 0670c8478594261a18c73aef6d1dbc76551319ef Mon Sep 17 00:00:00 2001 From: Matt Parnell Date: Sun, 5 Oct 2014 03:23:01 -0500 Subject: [PATCH 17/21] another potential fix --- src/services/command/CommandService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/services/command/CommandService.java b/src/services/command/CommandService.java index 32c7fe68..2b7b218f 100644 --- a/src/services/command/CommandService.java +++ b/src/services/command/CommandService.java @@ -997,6 +997,11 @@ public class CommandService implements INetworkDispatch { @Override public void handlePacket(IoSession session, IoBuffer data) throws Exception { + if (data == null){ + System.out.println("NULL data passed to insertOpcodes, ignoring."); + return; + } + data.order(ByteOrder.LITTLE_ENDIAN); Client client = core.getClient(session); @@ -1017,7 +1022,7 @@ public class CommandService implements INetworkDispatch { BaseSWGCommand command = getCommandByCRC(commandCRC); if (command == null) { - //System.out.println("Unknown Command CRC: " + commandEnqueue.getCommandCRC()); + System.out.println("Unknown Command CRC: " + commandEnqueue.getCommandCRC()); return; } From e86354818224106fd0ad3ce87d5e9f8ddf0c1bb9 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 5 Oct 2014 18:48:34 +0200 Subject: [PATCH 18/21] Fixed getBytes() exception Only objects that are in objectList are added to the Quadtree. Prevents later errors where the quadtree objects would not be found in objectList. After all such objects should not even be around, but well ... --- .../objects/creature/CreatureObject.java | 45 +++++++++++++++++++ src/services/SimulationService.java | 12 +++++ 2 files changed, 57 insertions(+) diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 0eaaa13d..09a74693 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -21,6 +21,9 @@ ******************************************************************************/ package resources.objects.creature; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; @@ -1431,6 +1434,9 @@ public class CreatureObject extends TangibleObject implements IPersistent { public void sendBaselines(Client destination) { if (destination != null && destination.getSession() != null) { + + //objectFieldDiagnosis(); + destination.getSession().write(getBaseline(3).getBaseline()); destination.getSession().write(getBaseline(6).getBaseline()); if (destination == getClient()) { @@ -1451,6 +1457,45 @@ public class CreatureObject extends TangibleObject implements IPersistent { } } + // Utility method to check which fields are null + public void objectFieldDiagnosis(){ + System.out.println("Object being diagnosed: " + this.getTemplate() + " Id: " + this.getObjectID()); + + ArrayList list = new ArrayList(); + Method[] methods = this.getClass().getDeclaredMethods(); + for (Method method : methods) + if (isGetter(method)){ + try { + Object valueObject = method.invoke(this, (Object[]) null); + if (valueObject==null){ + System.err.println("method " + method.getName() + " delivers null object"); + } + } catch (IllegalAccessException e) { + System.err.println("IllegalAccessException during reflection"); + e.printStackTrace(); + } catch (IllegalArgumentException e) { + System.err.println("IllegalArgumentException during reflection"); + e.printStackTrace(); + } catch (InvocationTargetException e) { + System.err.println("InvocationTargetException during reflection"); + e.printStackTrace(); + } + } + } + + public static boolean isGetter(Method method) { + if (Modifier.isPublic(method.getModifiers()) && + method.getParameterTypes().length == 0) { + if (method.getName().matches("^get[A-Z].*") && + !method.getReturnType().equals(void.class)) + return true; + if (method.getName().matches("^is[A-Z].*") && + method.getReturnType().equals(boolean.class)) + return true; + } + return false; + } + public void sendListDelta(byte viewType, short updateType, IoBuffer buffer) { switch (viewType) { case 1: diff --git a/src/services/SimulationService.java b/src/services/SimulationService.java index e8dc0bc0..e2bdfeb4 100644 --- a/src/services/SimulationService.java +++ b/src/services/SimulationService.java @@ -192,6 +192,7 @@ public class SimulationService implements INetworkDispatch { if(notifyObservers) { Point3D pos = new Point3D(x, 0, z); Collection newAwareObjects = get(object.getPlanet(), x, z, 512); + cleanAwareObjects(newAwareObjects); // Only objects that are in objectList are considered!!! for(Iterator it = newAwareObjects.iterator(); it.hasNext();) { SWGObject obj = it.next(); if((obj.getAttachment("bigSpawnRange") == null && obj.getWorldPosition().getDistance2D(pos) > 200) || obj == object) @@ -211,6 +212,17 @@ public class SimulationService implements INetworkDispatch { return success; } + public void cleanAwareObjects(Collection newAwareObjects){ + Collection cleanUpObjects = new ArrayList(); + for(Iterator it = newAwareObjects.iterator(); it.hasNext();) { + SWGObject obj = it.next(); + SWGObject objInList = NGECore.getInstance().objectService.getObject(obj.getObjectID()); + if (objInList==null) + cleanUpObjects.add(obj); + } + newAwareObjects.removeAll(cleanUpObjects); + } + public void addChildObjects(SWGObject object, Vector childObjects) { for(SWGObject childObject : childObjects) { From df3d11779cb03b430e79ba773a09bab7ebd42445 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 5 Oct 2014 21:47:08 +0200 Subject: [PATCH 19/21] Added check to ObjectService Makes it easier to differentiate if an object is really missing from objectList from the check in select character that checks for the object in the list. --- src/services/object/ObjectService.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index 5819ab18..bd843e93 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -583,6 +583,15 @@ public class ObjectService implements INetworkDispatch { return object; } + public boolean checkIfObjectAlreadyInList(long objectID){ + SWGObject object = objectList.get(objectID); + + if (object == null) + return false; + else + return true; + } + public Map getObjectList() { return objectList; } @@ -1232,7 +1241,9 @@ public class ObjectService implements INetworkDispatch { if(object.getParentId() != 0 && object.getContainer() == null) object.setParent(getObject(object.getParentId())); object.getContainerInfo(object.getTemplate()); - if(getObject(object.getObjectID()) != null) +// if(getObject(object.getObjectID()) != null) +// objectList.put(object.getObjectID(), object); + if(! checkIfObjectAlreadyInList(object.getObjectID())) objectList.put(object.getObjectID(), object); } else { Thread.currentThread().dumpStack(); From 835e9f5fe4f128aa2e07a5b5b77c4b3b82705fd3 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Sun, 5 Oct 2014 22:05:01 +0200 Subject: [PATCH 20/21] Added the check in more places --- src/services/object/ObjectService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index bd843e93..f77ccb59 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -1543,7 +1543,8 @@ public class ObjectService implements INetworkDispatch { // Treeku - Refactored to work around duplicate objectIds // Required for instances/heroics which are duplicated ie. 10 times - if(!template.equals("object/cell/shared_cell.iff") && objectId != 0 && getObject(objectId) != null) { + //if(!template.equals("object/cell/shared_cell.iff") && objectId != 0 && getObject(objectId) != null) { + if(!template.equals("object/cell/shared_cell.iff") && objectId != 0 && checkIfObjectAlreadyInList(objectId)) { SWGObject object = getObject(objectId); // Same coordinates is a true duplicate @@ -1562,7 +1563,8 @@ public class ObjectService implements INetworkDispatch { String planetName = planet.getName(); // TODO needs to a way to work for mustafar and kashyyyk which both have instances - if (objectId != 0 && getObject(objectId) != null && (planetName.contains("dungeon") || planetName.contains("adventure"))) { + //if (objectId != 0 && getObject(objectId) != null && (planetName.contains("dungeon") || planetName.contains("adventure"))) { + if (objectId != 0 && checkIfObjectAlreadyInList(objectId) && (planetName.contains("dungeon") || planetName.contains("adventure"))) { SWGObject container = getObject(containerId); float x = (px + ((container == null) ? x1 : container.getPosition().x)); float z = (pz + ((container == null) ? z1 : container.getPosition().z)); From 741420938158d1aad5d93b4b9c66a3e99c6adb71 Mon Sep 17 00:00:00 2001 From: CharonInferar Date: Mon, 6 Oct 2014 21:30:48 +0200 Subject: [PATCH 21/21] Hotfix for equipment-related crash issue Persisted player equipment objects were not managed at all by the objectservice collection upon reload leading to inconsistencies. --- src/resources/equipment/Equipment.java | 2 +- src/services/object/ObjectService.java | 52 +++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 6 deletions(-) diff --git a/src/resources/equipment/Equipment.java b/src/resources/equipment/Equipment.java index 7f6ac7df..3175f6d4 100644 --- a/src/resources/equipment/Equipment.java +++ b/src/resources/equipment/Equipment.java @@ -61,7 +61,7 @@ public class Equipment extends Delta { SWGObject sobject = getObject(); if (sobject == null) { - System.err.println("Serious error: Equipment object is null in objectList."); + System.err.println("Serious error: Equipment object is null in objectList. OID: " + getObjectId()); return null; } diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index f77ccb59..0106b1e3 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -50,6 +50,7 @@ import resources.common.*; import resources.datatables.DisplayType; import resources.datatables.Options; import resources.datatables.PlayerFlags; +import resources.equipment.Equipment; import resources.guild.Guild; import resources.harvest.SurveyTool; @@ -107,6 +108,7 @@ import engine.resources.service.INetworkDispatch; import engine.resources.service.INetworkRemoteEvent; import main.NGECore; import resources.objectives.BountyMissionObjective; +import resources.objects.SWGList; import resources.objects.building.BuildingObject; import resources.objects.cell.CellObject; import resources.objects.craft.DraftSchematic; @@ -575,8 +577,8 @@ public class ObjectService implements INetworkDispatch { if (objectList.containsKey(objectID)) { System.err.println("getObject(): object is null but objectList contains objectID key"); } else { - System.err.println("getObject(): object is null"); - Thread.currentThread().dumpStack(); + //System.err.println("getObject(): object is null"); + //Thread.currentThread().dumpStack(); } } @@ -771,12 +773,50 @@ public class ObjectService implements INetworkDispatch { CreatureObject object = (CreatureObject) core.getSWGObjectODB().get(objectId); if (object != null) { loadServerTemplate(object); + if(! checkIfObjectAlreadyInList(object.getObjectID())) + objectList.put(object.getObjectID(), object); + object.viewChildren(object, true, true, (child) -> loadServerTemplate(child)); + object.viewChildren(object, true, true, (child) -> instantiateChild(child)); } + /* Diagnostic part */ +// System.out.println("Creo : " + object.getCustomName()); +// System.out.println("Creo ID : " + object.getObjectID()); +// System.out.println("Equipment List : " + object.getEquipmentList().size()); + /* Diagnostic part */ + + SWGList eqList = object.getEquipmentList(); + List delList = new ArrayList(); + for (Equipment eq :eqList){ +// System.out.println("Equipment getObjectID() " + eq.getObjectId()); +// System.out.println("Equipment Class " + eq.getObject().getClass()); -> NPE +// System.out.println("Equipment Name " + eq.getObject().getCustomName()); -> NPE +// System.out.println("Equipment Template " + eq.getObject().getTemplate()); -> NPE + + if(! checkIfObjectAlreadyInList(eq.getObjectId())) + delList.add(eq); + } + + + eqList.removeAll(delList); // The persisted equipment list contains objects that do not exist anymore, merely a hotfix really + object.getEquipmentList().clear(); + object.getEquipmentList().addAll(eqList); + return (CreatureObject) object; } + public void instantiateChild(SWGObject child) { +// SWGObject object = (SWGObject) core.getSWGObjectODB().get(child); +// createObject(String Template, long objectID, Planet planet, Point3D position, Quaternion orientation, String customServerTemplate) +// System.out.println("childname : " + child.getCustomName()); +// System.out.println("Child Class " + child.getClass()); + if(! checkIfObjectAlreadyInList(child.getObjectID())) + objectList.put(child.getObjectID(), child); +// System.out.println("Child getObjectID() " + child.getObjectID()); +// System.out.println("Child class " + child.getClass().getName()); + } + public long generateObjectID() { /*Random random = new Random(); @@ -1170,7 +1210,7 @@ public class ObjectService implements INetworkDispatch { System.err.println("Player with ObjID of " + creature.getObjectID() + " tried logging in but has a null/empty name!"); return; } else { - System.err.println("SelectCharacter: not in object list"); + //System.err.println("SelectCharacter: not in object list"); Because it wasnt added still at this point } } @@ -1754,7 +1794,8 @@ public class ObjectService implements INetworkDispatch { // Treeku - Refactored to work around duplicate objectIds // Required for instances/heroics which are duplicated ie. 10 times - if(!template.equals("object/cell/shared_cell.iff") && objectId != 0 && getObject(objectId) != null) { + //if(!template.equals("object/cell/shared_cell.iff") && objectId != 0 && getObject(objectId) != null) { + if(!template.equals("object/cell/shared_cell.iff") && objectId != 0 && (checkIfObjectAlreadyInList(objectId))) { SWGObject object = getObject(objectId); // Same coordinates is a true duplicate @@ -1773,7 +1814,8 @@ public class ObjectService implements INetworkDispatch { String planetName = planet.getName(); // TODO needs to a way to work for mustafar and kashyyyk which both have instances - if (objectId != 0 && getObject(objectId) != null && (planetName.contains("dungeon") || planetName.contains("adventure"))) { + //if (objectId != 0 && getObject(objectId) != null && (planetName.contains("dungeon") || planetName.contains("adventure"))) { + if (objectId != 0 && checkIfObjectAlreadyInList(objectId) && (planetName.contains("dungeon") || planetName.contains("adventure"))) { SWGObject container = getObject(containerId); float x = (px + ((container == null) ? x1 : container.getPosition().x)); float z = (pz + ((container == null) ? z1 : container.getPosition().z));