diff --git a/src/resources/objects/SWGList.java b/src/resources/objects/SWGList.java index 44945f87..790232f2 100644 --- a/src/resources/objects/SWGList.java +++ b/src/resources/objects/SWGList.java @@ -21,7 +21,6 @@ ******************************************************************************/ package resources.objects; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; @@ -45,7 +44,7 @@ import engine.resources.objects.SWGObject; /* A SWGList element should extend Delta or implement IDelta */ -public class SWGList implements List, Serializable { +public class SWGList extends Delta implements List { private static final long serialVersionUID = 1L; @@ -54,7 +53,6 @@ public class SWGList implements List, Serializable { private byte viewType; private short updateType; private boolean addByte; - protected transient Object objectMutex = new Object(); private transient SWGObject object; public SWGList() { } @@ -67,7 +65,8 @@ public class SWGList implements List, Serializable { } public void init(SWGObject object) { - objectMutex = new Object(); + super.init(object); + updateCounter = 0; this.object = object; @@ -321,7 +320,7 @@ public class SWGList implements List, Serializable { if (!list.isEmpty()) { for (E element : list) { if (valid(element)) { - IoBuffer buffer = Delta.createBuffer((newListData.length + Baseline.toBytes(element).length)); + IoBuffer buffer = createBuffer((newListData.length + Baseline.toBytes(element).length)); buffer.put(newListData); buffer.put(Baseline.toBytes(element)); newListData = buffer.array(); @@ -330,7 +329,7 @@ public class SWGList implements List, Serializable { } } - IoBuffer buffer = Delta.createBuffer(3 + newListData.length); + IoBuffer buffer = createBuffer(3 + newListData.length); buffer.put((byte) 3); buffer.putShort((short) list.size()); buffer.put(newListData); @@ -411,7 +410,7 @@ public class SWGList implements List, Serializable { byte[] object = Baseline.toBytes(o); size += object.length; - IoBuffer buffer = Delta.createBuffer(size); + IoBuffer buffer = createBuffer(size); buffer.put(objects); if (addByte) buffer.put((byte) 0); buffer.put(object); @@ -420,7 +419,7 @@ public class SWGList implements List, Serializable { objects = buffer.array(); } - IoBuffer buffer = Delta.createBuffer(8 + size); + IoBuffer buffer = createBuffer(8 + size); buffer.putInt(list.size()); buffer.putInt(updateCounter); buffer.put(objects); @@ -444,7 +443,7 @@ public class SWGList implements List, Serializable { int size = 1 + ((useIndex) ? 2 : 0) + ((useData) ? data.length : 0); - IoBuffer buffer = Delta.createBuffer(size); + IoBuffer buffer = createBuffer(size); buffer.put((byte) type); if (useIndex) buffer.putShort((short) index); if (useData) buffer.put(data); @@ -456,7 +455,7 @@ public class SWGList implements List, Serializable { } private void queue(byte[] data) { - IoBuffer buffer = Delta.createBuffer((data.length + 8)); + IoBuffer buffer = createBuffer((data.length + 8)); buffer.putInt(1); buffer.putInt(updateCounter); buffer.put(data); @@ -471,7 +470,7 @@ public class SWGList implements List, Serializable { size += queued.length; } - IoBuffer buffer = Delta.createBuffer((size + 8)); + IoBuffer buffer = createBuffer((size + 8)); buffer.putInt(data.size()); buffer.putInt(updateCounter); for (byte[] queued : data) buffer.put(queued); diff --git a/src/resources/objects/SWGMap.java b/src/resources/objects/SWGMap.java index 20ff287e..b8f385d0 100644 --- a/src/resources/objects/SWGMap.java +++ b/src/resources/objects/SWGMap.java @@ -21,7 +21,6 @@ ******************************************************************************/ package resources.objects; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -41,15 +40,15 @@ import engine.resources.objects.SWGObject; /* A SWGMap element should extend Delta or implement IDelta */ -public class SWGMap implements Map, Serializable { +public class SWGMap extends Delta implements Map { private static final long serialVersionUID = 1L; + private Map map = new TreeMap(); private transient int updateCounter = 0; private byte viewType; private short updateType; private boolean addByte; - protected transient Object objectMutex = new Object(); private transient SWGObject object; public SWGMap() { } @@ -71,7 +70,8 @@ public class SWGMap implements Map, Serializable { } public void init(SWGObject object) { - objectMutex = new Object(); + super.init(object); + updateCounter = 0; this.object = object; @@ -306,7 +306,7 @@ public class SWGMap implements Map, Serializable { byte[] value = Baseline.toBytes(entry.getValue()); size += ((addByte) ? 1 : 0) + key.length + value.length; - IoBuffer buffer = Baseline.createBuffer(size); + IoBuffer buffer = createBuffer(size); buffer.put(objects); if (addByte) buffer.put((byte) 0); buffer.put(key); @@ -316,7 +316,7 @@ public class SWGMap implements Map, Serializable { objects = buffer.array(); } - IoBuffer buffer = Baseline.createBuffer(8 + size); + IoBuffer buffer = createBuffer(8 + size); buffer.putInt(map.size()); buffer.putInt(updateCounter); buffer.put(objects); @@ -343,7 +343,7 @@ public class SWGMap implements Map, Serializable { int size = 1 + ((useIndex) ? (Baseline.toBytes(index).length) : 0) + ((useData) ? data.length : 0); - IoBuffer buffer = Delta.createBuffer(size); + IoBuffer buffer = createBuffer(size); buffer.put((byte) type); if (useIndex) buffer.put(Baseline.toBytes(index)); if (useData) buffer.put(data); @@ -355,7 +355,7 @@ public class SWGMap implements Map, Serializable { } private void queue(byte[] data) { - IoBuffer buffer = Delta.createBuffer(data.length + 8); + IoBuffer buffer = createBuffer(data.length + 8); buffer.putInt(1); buffer.putInt(updateCounter); buffer.put(data); @@ -370,7 +370,7 @@ public class SWGMap implements Map, Serializable { size += queued.length; } - IoBuffer buffer = Delta.createBuffer((size + 8)); + IoBuffer buffer = createBuffer((size + 8)); buffer.putInt(data.size()); buffer.putInt(updateCounter); for (byte[] queued : data) buffer.put(queued); diff --git a/src/resources/objects/SWGMultiMap.java b/src/resources/objects/SWGMultiMap.java index 848a12a8..324f8d82 100644 --- a/src/resources/objects/SWGMultiMap.java +++ b/src/resources/objects/SWGMultiMap.java @@ -21,7 +21,6 @@ ******************************************************************************/ package resources.objects; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -39,15 +38,15 @@ import engine.resources.objects.Delta; import engine.resources.objects.IDelta; import engine.resources.objects.SWGObject; -public class SWGMultiMap implements Multimap, Serializable { +public class SWGMultiMap extends Delta implements Multimap { private static final long serialVersionUID = 1L; + private Multimap map = ArrayListMultimap.create(); private transient int updateCounter = 0; private byte viewType; private short updateType; private boolean addByte; - protected transient Object objectMutex = new Object(); private transient SWGObject object; public SWGMultiMap() { } @@ -69,7 +68,8 @@ public class SWGMultiMap implements Multimap, Serializable { } public void init(SWGObject object) { - objectMutex = new Object(); + super.init(object); + updateCounter = 0; this.object = object; @@ -298,7 +298,7 @@ public class SWGMultiMap implements Multimap, Serializable { byte[] value = Baseline.toBytes(entry.getValue()); size += ((addByte) ? 1 : 0) + key.length + value.length; - IoBuffer buffer = Baseline.createBuffer(size); + IoBuffer buffer = createBuffer(size); buffer.put(objects); if (addByte) buffer.put((byte) 0); buffer.put(key); @@ -308,7 +308,7 @@ public class SWGMultiMap implements Multimap, Serializable { objects = buffer.array(); } - IoBuffer buffer = Baseline.createBuffer(8 + size); + IoBuffer buffer = createBuffer(8 + size); buffer.putInt(map.size()); buffer.putInt(updateCounter); buffer.put(objects); @@ -337,7 +337,7 @@ public class SWGMultiMap implements Multimap, Serializable { int size = 1 + ((useIndex) ? (Baseline.toBytes(index).length) : 0) + ((useData) ? data.length : 0); - IoBuffer buffer = Delta.createBuffer(size); + IoBuffer buffer = createBuffer(size); buffer.put((byte) type); if (useIndex) buffer.put(Baseline.toBytes(index)); if (useData) buffer.put(data); @@ -349,7 +349,7 @@ public class SWGMultiMap implements Multimap, Serializable { } private void queue(byte[] data) { - IoBuffer buffer = Delta.createBuffer((data.length + 8)); + IoBuffer buffer = createBuffer((data.length + 8)); buffer.putInt(1); buffer.putInt(updateCounter); buffer.put(data); @@ -364,7 +364,7 @@ public class SWGMultiMap implements Multimap, Serializable { size += queued.length; } - IoBuffer buffer = Delta.createBuffer((size + 8)); + IoBuffer buffer = createBuffer((size + 8)); buffer.putInt(data.size()); buffer.putInt(updateCounter); for (byte[] queued : data) buffer.put(queued); diff --git a/src/resources/objects/SWGSet.java b/src/resources/objects/SWGSet.java index b60a9950..1feed1d2 100644 --- a/src/resources/objects/SWGSet.java +++ b/src/resources/objects/SWGSet.java @@ -21,7 +21,6 @@ ******************************************************************************/ package resources.objects; -import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @@ -38,15 +37,15 @@ import engine.resources.objects.SWGObject; /* A SWGSet element should extend Delta or implement IDelta */ -public class SWGSet implements Set, Serializable { +public class SWGSet extends Delta implements Set { private static final long serialVersionUID = 1L; + private TreeSet set = new TreeSet(); private transient int updateCounter = 0; private byte viewType; private short updateType; private boolean addByte; - protected transient Object objectMutex = new Object(); private transient SWGObject object; public SWGSet() { } @@ -68,7 +67,8 @@ public class SWGSet implements Set, Serializable { } public void init(SWGObject object) { - objectMutex = new Object(); + super.init(object); + updateCounter = 0; this.object = object; @@ -83,130 +83,159 @@ public class SWGSet implements Set, Serializable { } } - public synchronized boolean add(E e) { - if (valid(e)) { - if (set.add(e)) { - queue(item(1, e, null, true, false)); + public boolean add(E e) { + synchronized(objectMutex) { + if (valid(e)) { + if (set.add(e)) { + queue(item(1, e, null, true, false)); + return true; + } + } + + return false; + } + } + + public boolean addAll(Collection c) { + synchronized(objectMutex) { + List buffer = new ArrayList(); + + for (E e : c) { + if (valid(e) && set.add(e)) { + buffer.add(item(1, e, null, true, false)); + } + } + + if (buffer.size() > 0) { + queue(buffer); + return true; + } else { + return false; + } + } + } + + public void clear() { + synchronized(objectMutex) { + set.clear(); + queue(item(2, null, null, false, false)); + } + } + + public boolean contains(Object o) { + synchronized(objectMutex) { + return set.contains(o); + } + } + + public boolean containsAll(Collection c) { + synchronized(objectMutex) { + return set.containsAll(c); + } + } + + public boolean isEmpty() { + synchronized(objectMutex) { + return set.isEmpty(); + } + } + + public Iterator iterator() { + synchronized(objectMutex) { + return set.iterator(); + } + } + + public boolean remove(Object e) { + synchronized(objectMutex) { + if (valid(e) && set.remove(e)) { + queue(item(0, e, null, true, false)); return true; } - } - - return false; - } - - public synchronized boolean addAll(Collection c) { - List buffer = new ArrayList(); - - for (E e : c) { - if (valid(e) && set.add(e)) { - buffer.add(item(1, e, null, true, false)); - } - } - - if (buffer.size() > 0) { - queue(buffer); - return true; - } else { + return false; } } - public synchronized void clear() { - set.clear(); - queue(item(2, null, null, false, false)); - } - - public synchronized boolean contains(Object o) { - return set.contains(o); - } - - public synchronized boolean containsAll(Collection c) { - return set.containsAll(c); - } - - public synchronized boolean isEmpty() { - return set.isEmpty(); - } - - public synchronized Iterator iterator() { - return set.iterator(); - } - - public synchronized boolean remove(Object e) { - if (valid(e) && set.remove(e)) { - queue(item(0, e, null, true, false)); - return true; - } - return false; - } - - public synchronized boolean removeAll(Collection c) { - List buffer = new ArrayList(); - - for (Object o : c) { - if (valid(o) && set.remove(o)) { - buffer.add(item(0, o, null, true, false)); + public boolean removeAll(Collection c) { + synchronized(objectMutex) { + List buffer = new ArrayList(); + + for (Object o : c) { + if (valid(o) && set.remove(o)) { + buffer.add(item(0, o, null, true, false)); + } + } + + if (buffer.size() > 0) { + queue(buffer); + return true; + } else { + return false; } } - - if (buffer.size() > 0) { - queue(buffer); - return true; - } else { - return false; - } } - public synchronized boolean retainAll(Collection c) { + public boolean retainAll(Collection c) { synchronized(objectMutex) { return set.retainAll(c); } } - public synchronized int size() { - return set.size(); + public int size() { + synchronized(objectMutex) { + return set.size(); + } } - public synchronized Object[] toArray() { - return set.toArray(); + public Object[] toArray() { + synchronized(objectMutex) { + return set.toArray(); + } } - public synchronized T[] toArray(T[] a) { - return set.toArray(a); + public T[] toArray(T[] a) { + synchronized(objectMutex) { + return set.toArray(a); + } } - public synchronized int getUpdateCounter() { - return updateCounter; + public int getUpdateCounter() { + synchronized(objectMutex) { + return updateCounter; + } } public Object getMutex() { return objectMutex; } - public synchronized byte[] getBytes() { - byte[] objects = { }; - int size = 0; - - for (Object o : set) { - byte[] object = Baseline.toBytes(o); - size += object.length; + public byte[] getBytes() { + synchronized(objectMutex) { + byte[] objects = { }; + int size = 0; - IoBuffer buffer = Delta.createBuffer(size); + for (Object o : set) { + byte[] object = Baseline.toBytes(o); + size += object.length; + + IoBuffer buffer = createBuffer(size); + buffer.put(objects); + if (addByte) buffer.put((byte) 0); + buffer.put(object); + buffer.flip(); + + objects = buffer.array(); + } + + IoBuffer buffer = createBuffer(8 + size); + buffer.putInt(set.size()); + buffer.putInt(updateCounter); buffer.put(objects); - if (addByte) buffer.put((byte) 0); - buffer.put(object); buffer.flip(); - objects = buffer.array(); + return buffer.array(); } - - IoBuffer buffer = Delta.createBuffer(8 + size); - buffer.putInt(set.size()); - buffer.putInt(updateCounter); - buffer.put(objects); - buffer.flip(); - - return buffer.array(); } private boolean valid(Object o) { @@ -226,7 +255,7 @@ public class SWGSet implements Set, Serializable { int size = 1 + ((useIndex) ? Baseline.toBytes(index).length : 0) + ((useData) ? data.length : 0); - IoBuffer buffer = Delta.createBuffer(size); + IoBuffer buffer = createBuffer(size); buffer.put((byte) type); if (useIndex) buffer.put(Baseline.toBytes(index)); if (useData) buffer.put(data); @@ -238,7 +267,7 @@ public class SWGSet implements Set, Serializable { } private void queue(byte[] data) { - IoBuffer buffer = Delta.createBuffer(data.length + 8); + IoBuffer buffer = createBuffer(data.length + 8); buffer.putInt(1); buffer.putInt(updateCounter); buffer.put(data); @@ -253,7 +282,7 @@ public class SWGSet implements Set, Serializable { size += queued.length; } - IoBuffer buffer = Delta.createBuffer(size + 8); + IoBuffer buffer = createBuffer(size + 8); buffer.putInt(data.size()); buffer.putInt(updateCounter); for (byte[] queued : data) buffer.put(queued); diff --git a/src/resources/objects/creature/CreatureObject.java b/src/resources/objects/creature/CreatureObject.java index 6769379d..691781d5 100644 --- a/src/resources/objects/creature/CreatureObject.java +++ b/src/resources/objects/creature/CreatureObject.java @@ -305,7 +305,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { public void setPosture(byte posture) { synchronized(objectMutex) { - switch (getPosture()) { + switch (posture) { case resources.datatables.Posture.Invalid: setLocomotion(resources.datatables.Locomotion.Invalid); break; @@ -833,47 +833,52 @@ public class CreatureObject extends TangibleObject implements IPersistent { } public int getHealth() { - synchronized(objectMutex) { - return getAttribs().get(0); - } + return getAttribs().get(0); } public void setHealth(int health) { - if (health > getMaxHealth()) { - health = getMaxHealth(); - } - - if (getPosture() == 13) { - synchronized(objectMutex) { - stopIncapTask(); - setIncapTask(null); - getAttribs().set(0, health); + synchronized(objectMutex) { + if (health > getMaxHealth()) { + health = getMaxHealth(); } - setPosture((byte) 0); - setTurnRadius(1); - setSpeedMultiplierBase(1); - } else { - synchronized(objectMutex) { - getAttribs().set(0, health); + if (health == getHealth()) { + return; + } + + if (getPosture() == 13) { + stopIncapTask(); + setIncapTask(null); + } + } + + getAttribs().set(0, health); + + synchronized(objectMutex) { + if (getPosture() == 13) { + setPosture((byte) 0); + setTurnRadius(1); + setSpeedMultiplierBase(1); } } } public int getAction() { - synchronized(objectMutex) { - return getAttribs().get(2); - } + return getAttribs().get(2); } public void setAction(int action) { - if (action > getMaxAction()) { - action = getMaxAction(); + synchronized(objectMutex) { + if (action > getMaxAction()) { + action = getMaxAction(); + } + + if (action == getAction()) { + return; + } } - synchronized(objectMutex) { - getAttribs().set(2, action); - } + getAttribs().set(2, action); } @SuppressWarnings("unchecked") @@ -882,35 +887,39 @@ public class CreatureObject extends TangibleObject implements IPersistent { } public int getMaxHealth() { - synchronized(objectMutex) { - return getMaxAttribs().get(0); - } + return getMaxAttribs().get(0); } public void setMaxHealth(int maxHealth) { + synchronized(objectMutex) { + if (maxHealth == getMaxHealth()) { + return; + } + } + if (maxHealth < getHealth()) { setHealth(maxHealth); } - synchronized(objectMutex) { - getMaxAttribs().set(0, maxHealth); - } + getMaxAttribs().set(0, maxHealth); } public int getMaxAction() { - synchronized(objectMutex) { - return getMaxAttribs().get(2); - } + return getMaxAttribs().get(2); } public void setMaxAction(int maxAction) { + synchronized(objectMutex) { + if (maxAction == getMaxAction()) { + return; + } + } + if (maxAction < getAction()) { setAction(maxAction); } - synchronized(objectMutex) { - getMaxAttribs().set(2, maxAction); - } + getMaxAttribs().set(2, maxAction); } @SuppressWarnings("unchecked") @@ -1073,7 +1082,7 @@ public class CreatureObject extends TangibleObject implements IPersistent { this.performanceWatchee = performanceWatchee; } - setListenToId(performanceWatchee.getObjectID()); + setListenToId((performanceWatchee == null) ? 0L : performanceWatchee.getObjectID()); } public CreatureObject getPerformanceListenee() {