diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/ObjectCreator.java b/src/main/java/com/projectswg/holocore/resources/support/objects/ObjectCreator.java index a59c29a07..4a23eab8e 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/ObjectCreator.java +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/ObjectCreator.java @@ -191,9 +191,7 @@ public final class ObjectCreator { if (descriptor == null) return; - for (String slotName : descriptor.getSlots()) { - object.setSlot(slotName, null); - } + object.setSlots(descriptor.getSlots()); } if (!arrangementDescriptor.isEmpty()) { diff --git a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/SWGObject.java b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/SWGObject.java index 955056a7c..c824f0014 100644 --- a/src/main/java/com/projectswg/holocore/resources/support/objects/swg/SWGObject.java +++ b/src/main/java/com/projectswg/holocore/resources/support/objects/swg/SWGObject.java @@ -60,6 +60,7 @@ import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.Map.Entry; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; @@ -69,8 +70,9 @@ public abstract class SWGObject extends BaselineObject implements Comparable containedObjects= new CopyOnWriteArraySet<>(); - private final Map slots = Collections.synchronizedMap(new HashMap<>()); + private final Map slots = new ConcurrentHashMap<>(); private final Map attributes = Collections.synchronizedMap(new LinkedHashMap<>()); + private final Set slotsAvailable = new CopyOnWriteArraySet<>(); private final ObjectAware awareness = new ObjectAware(this); private final Map dataAttributes = new EnumMap<>(ObjectDataAttribute.class); private final AtomicInteger updateCounter = new AtomicInteger(1); @@ -139,7 +141,7 @@ public abstract class SWGObject extends BaselineObject implements Comparable getContainedObjects() { - return Collections.unmodifiableSet(containedObjects); - } - - public boolean hasSlot(String slotName) { - return slots.containsKey(slotName); + return Collections.unmodifiableCollection(containedObjects); } - public void setSlot(String name, SWGObject value) { + public void setSlots(@NotNull Collection slots) { + this.slotsAvailable.clear(); + this.slotsAvailable.addAll(slots); + } + + public boolean hasSlot(@NotNull String slotName) { + return slotsAvailable.contains(slotName); + } + + public void setSlot(@NotNull String name, @NotNull SWGObject value) { slots.put(name, value); } - - public boolean hasSlottedObject(SWGObject obj) { - return slots.containsValue(obj); - } + @NotNull public Map getSlots() { - return new HashMap<>(slots); + return Collections.unmodifiableMap(slots); } - public List getSlottedObjects() { - synchronized (this.slots) { - List slots = new ArrayList<>(this.slots.size()); - SWGObject obj; - for (Entry e : this.slots.entrySet()) { - obj = e.getValue(); - if (obj != null) - slots.add(obj); - } - return slots; - } + @NotNull + public Collection getSlottedObjects() { + return Collections.unmodifiableCollection(slots.values()); } public void setOwner(Player player) {