diff --git a/src/resources/objects/SWGMap.java b/src/resources/objects/SWGMap.java index 9b055425..20ff287e 100644 --- a/src/resources/objects/SWGMap.java +++ b/src/resources/objects/SWGMap.java @@ -34,8 +34,6 @@ import java.util.function.Function; import org.apache.mina.core.buffer.IoBuffer; -import com.sleepycat.persist.model.Persistent; - import engine.resources.objects.Baseline; import engine.resources.objects.Delta; import engine.resources.objects.IDelta; @@ -43,7 +41,6 @@ import engine.resources.objects.SWGObject; /* A SWGMap element should extend Delta or implement IDelta */ -@Persistent public class SWGMap implements Map, Serializable { private static final long serialVersionUID = 1L; diff --git a/src/services/object/ObjectList.java b/src/services/object/ObjectList.java new file mode 100644 index 00000000..8092ee6e --- /dev/null +++ b/src/services/object/ObjectList.java @@ -0,0 +1,101 @@ +package services.object; + +import java.io.Serializable; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import engine.resources.objects.SWGObject; + +public class ObjectList implements Map, Serializable { + + private static final long serialVersionUID = 1L; + + private Map objectList = new ConcurrentHashMap(); + private Map history = new ConcurrentHashMap(); + + public ObjectList() { + + } + + public void clear() { + System.err.println("ObjectList was wiped!"); + try { + throw new Exception(); + } catch (Exception e) { + e.printStackTrace(); + } + objectList.clear(); + } + + public boolean containsKey(Object k) { + return objectList.containsKey(k); + } + + public boolean containsValue(Object v) { + return objectList.containsValue(v); + } + + public Set> entrySet() { + return objectList.entrySet(); + } + + public V get(Object key) { + return objectList.get(key); + } + + public boolean isEmpty() { + return objectList.isEmpty(); + } + + public Set keySet() { + return objectList.keySet(); + } + + public V put(K key, V value) { + if ((objectList.containsKey((Long) key) && !((SWGObject) objectList.get(key)).getTemplate().equals(((SWGObject) value).getTemplate())) || + (history.containsKey((Long) key) && !history.get(key).equals(((SWGObject) value).getTemplate()))) { + System.err.println("Attempted to register duplicate Id. Old template: " + ((SWGObject) objectList.get(key)).getTemplate() + " New template: " + ((SWGObject) value).getTemplate()); + + try { + throw new Exception(); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + objectList.put(key, value); + + return value; + } + + public void putAll(Map objects) { + objectList.putAll(objects); + } + + @SuppressWarnings("unchecked") + public V remove(Object object) { + /*if (object instanceof SWGObject) System.err.println("Object was removed! " + ((SWGObject) objectList.get(object)).getTemplate()); + try { + throw new Exception(); + } catch (Exception e) { + e.printStackTrace(); + }*/ + if (objectList.containsKey(object)) { + history.put((K) object, ((SWGObject) objectList.get(object)).getTemplate()); + } + return objectList.remove(object); + } + + public int size() { + return objectList.size(); + } + + public Collection values() { + return objectList.values(); + } + +} diff --git a/src/services/object/ObjectService.java b/src/services/object/ObjectService.java index a93f08c6..52f5fcc7 100644 --- a/src/services/object/ObjectService.java +++ b/src/services/object/ObjectService.java @@ -137,7 +137,8 @@ import services.sui.SUIWindow.Trigger; @SuppressWarnings("unused") public class ObjectService implements INetworkDispatch { - private Map objectList = new ConcurrentHashMap(); + //private Map objectList = new ConcurrentHashMap(); + private Map objectList = new ObjectList(); private NGECore core; private DatabaseConnection databaseConnection; private AtomicLong highestId = new AtomicLong(); @@ -426,7 +427,13 @@ public class ObjectService implements INetworkDispatch { loadServerTemplateTasks.add(() -> loadServerTemplate(pointer)); } - objectList.put(objectID, object); + SWGObject ret = objectList.put(objectID, object); + + //if (ret != null && !ret.getTemplate().equals(object.getTemplate())) { + if (ret == null) { + //System.err.println("ObjectService: Detected duplicate Id. Assigning new one.") + object = createObject(Template, objectID, planet, position, orientation, customServerTemplate, overrideSnapshot, loadServerTemplate); + } return object; }