From 4577fd826c3ef80ab364357c266aefa237bd7300 Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Sun, 15 May 2016 17:14:55 -0500 Subject: [PATCH] Redid observers and awareness and fixed NPCs inside buildings --- scripts/objects/load_creature.js | 1 + src/resources/objects/SWGObject.java | 119 +++++++----------- src/resources/objects/cell/CellObject.java | 4 +- .../objects/creature/CreatureObject.java | 19 ++- .../objects/tangible/OptionFlag.java | 56 ++++----- src/services/objects/ObjectAwareness.java | 14 ++- src/services/spawn/SpawnerService.java | 11 +- 7 files changed, 97 insertions(+), 127 deletions(-) diff --git a/scripts/objects/load_creature.js b/scripts/objects/load_creature.js index e98158620..77109683c 100644 --- a/scripts/objects/load_creature.js +++ b/scripts/objects/load_creature.js @@ -3,4 +3,5 @@ function onLoad(creature) { if(!creature.hasAbility(basicDance)) { creature.addAbility(basicDance); } + creature.addOptionFlags((Java.type("resources.objects.tangible.OptionFlag")).HAM_BAR); } \ No newline at end of file diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 64556da93..90f9ac7b7 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -51,6 +51,7 @@ import resources.network.BaselineObject; import resources.network.NetBuffer; import resources.objects.building.BuildingObject; import resources.objects.creature.CreatureObject; +import resources.objects.tangible.TangibleObject; import resources.player.Player; import resources.server_info.Log; import services.CoreManager; @@ -699,6 +700,7 @@ public abstract class SWGObject extends BaselineObject implements Comparable getObservers() { - return getObservers(this); - } - - private Set getObservers(SWGObject childObject) { - return getObserversFromSet(new HashSet(), childObject); - } - - private Set getObserversFromSet(Set aware, SWGObject childObject) { - Set awareExtra; - synchronized (aware) { - awareExtra = new HashSet<>(aware); - } - synchronized (objectsAware) { - awareExtra.addAll(objectsAware); - } - if (getParent() == null) { - Set observers = new HashSet<>(); - for (SWGObject obj : awareExtra) { - Player p = obj.getOwner(); - if (childObject.isValidPlayer(p)) - observers.add(obj); - else - childObject.getChildrenObservers(observers, obj); - } - childObject.getChildrenObservers(observers, this); - return observers; - } else { - return getParent().getObserversFromSet(awareExtra, childObject); // Search for top level parent - } - } - - private void getChildrenObservers(Set observers, SWGObject obj) { - for (SWGObject child : obj.getContainedObjects()) { - Player p = child.getOwner(); - if (isValidPlayer(p)) { - observers.add(child); - } else { - getChildrenObservers(observers, child); - } - } - } - - private boolean isValidPlayer(Player player) { Player owner = getOwner(); - if (player == null) - return false; - if (owner == null) - return true; - if (player.getCreatureObject() == null) - return false; - if (owner.getCreatureObject() == null) - return true; - if (player.getCreatureObject().equals(owner.getCreatureObject())) - return false; - return player.getCreatureObject().isLoggedInPlayer(); + SWGObject parent = getParent(); + if (parent == null) + return getObservers(owner, true); + while (parent.getParent() != null) + parent = parent.getParent(); + return parent.getObservers(owner, true); + } + + private Set getObservers(Player owner, boolean initial) { + Set nearby = new HashSet<>(); + synchronized (containedObjects) { + nearby.addAll(containedObjects.values()); + } + if (initial) { + synchronized (objectsAware) { + nearby.addAll(objectsAware); + } + } + return getObserversFromSet(nearby, owner); + } + + private Set getObserversFromSet(Set nearby, Player owner) { + Set observers = new HashSet<>(); + for (SWGObject aware : nearby) { + if (aware instanceof CreatureObject) { + Player awareOwner = aware.getOwner(); + if (awareOwner == null || awareOwner.equals(owner)) + continue; + if (((CreatureObject) aware).isLoggedInPlayer()) + observers.add(aware); + } else if (aware instanceof TangibleObject) + observers.addAll(aware.getObservers(owner, false)); + } + return observers; } public void sendObserversAndSelf(Packet ... packets) { @@ -844,7 +826,8 @@ public abstract class SWGObject extends BaselineObject implements Comparable(objectsAware); } - Set observers = getObserversFromSet(withinRange, this); + outOfRange.addAll(getObservers()); + Set observers = getObserversFromSet(withinRange, getOwner()); outOfRange.removeAll(withinRange); outOfRange.removeAll(observers); for (SWGObject o : outOfRange) { @@ -870,8 +853,6 @@ public abstract class SWGObject extends BaselineObject implements Comparable observers = new HashSet<>(); - getChildrenObservers(observers, obj); - for (SWGObject observer : observers) { - createObject(observer.getOwner()); } } - private void destroyObjectObservers(SWGObject obj) { - Set observers = new HashSet<>(); - getChildrenObservers(observers, obj); - for (SWGObject observer : observers) { - destroyObject(observer.getOwner()); - } - } - public void sendDataTransforms(DataTransform dTransform) { Location loc = dTransform.getLocation(); float speed = dTransform.getSpeed(); @@ -974,7 +937,11 @@ public abstract class SWGObject extends BaselineObject implements Comparable flags = PvpFlag.getFlags(getPvpFlags()); - target.sendPacket(new UpdatePvpStatusMessage(getPvpFaction(), getObjectId(), flags.toArray(new PvpFlag[flags.size()]))); - } + + Set flags = PvpFlag.getFlags(getPvpFlags()); + target.sendPacket(new UpdatePvpStatusMessage(getPvpFaction(), getObjectId(), flags.toArray(new PvpFlag[flags.size()]))); } public void createBaseline1(Player target, BaselineBuilder bb) { diff --git a/src/resources/objects/tangible/OptionFlag.java b/src/resources/objects/tangible/OptionFlag.java index 8f505f129..b3515fb54 100644 --- a/src/resources/objects/tangible/OptionFlag.java +++ b/src/resources/objects/tangible/OptionFlag.java @@ -30,35 +30,35 @@ package resources.objects.tangible; import java.util.EnumSet; public enum OptionFlag { - ON_OFF(0x00000001), - VENDOR(0x00000002), - INSURED(0x00000004), - CONVERSABLE(0x00000008), - HIBERNATING(0x00000010), - MAGIC_ITEM(0x00000020), - AGGRESSIVE(0x00000040), - HAM_BAR(0x00000080), - INVULNERABLE(0x00000100), - DISABLED(0x00000200), - UNINSURABLE(0x00000400), - INTERESTING(0x00000800), - MOUNT(0x00001000), - CRAFTED(0x00002000), - WINGS_OPENED(0x00004000), - SPACE_INTERESTING(0x00008000), - DOCKING(0x00010000), // JTL? - DESTROYING(0x00020000), // JTL? - COMMABLE(0x00040000), - DOCKABLE(0x00080000), - EJECT(0x00100000), - INSPECTABLE(0x00200000), - TRANSFERABLE(0x00400000), + ON_OFF (0x00000001), + VENDOR (0x00000002), + INSURED (0x00000004), + CONVERSABLE (0x00000008), + HIBERNATING (0x00000010), + MAGIC_ITEM (0x00000020), + AGGRESSIVE (0x00000040), + HAM_BAR (0x00000080), + INVULNERABLE (0x00000100), + DISABLED (0x00000200), + UNINSURABLE (0x00000400), + INTERESTING (0x00000800), + MOUNT (0x00001000), + CRAFTED (0x00002000), + WINGS_OPENED (0x00004000), + SPACE_INTERESTING (0x00008000), + DOCKING (0x00010000), // JTL? + DESTROYING (0x00020000), // JTL? + COMMABLE (0x00040000), + DOCKABLE (0x00080000), + EJECT (0x00100000), + INSPECTABLE (0x00200000), + TRANSFERABLE (0x00400000), SHOW_FLIGHT_TUTORIAL(0x00800000), - SPACE_COMBAT_MUSIC(0x01000000), - ENCOUNTER_LOCKED(0x02000000), - SPAWNED_CREATURE(0x04000000), - HOLIDAY_INTERESTING(0x08000000), - LOCKED(0x10000000); + SPACE_COMBAT_MUSIC (0x01000000), + ENCOUNTER_LOCKED (0x02000000), + SPAWNED_CREATURE (0x04000000), + HOLIDAY_INTERESTING (0x08000000), + LOCKED (0x10000000); int flag; diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index dce0bb0e6..9ca971a68 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -137,10 +137,8 @@ public class ObjectAwareness extends Service { private void handleObjectCreatedIntent(ObjectCreatedIntent oci) { SWGObject object = oci.getObject(); - if (isInAwareness(object)) { - add(object); - update(object); - } + add(object); + update(object); } private void processObjectTeleportIntent(ObjectTeleportIntent oti) { @@ -153,6 +151,7 @@ public class ObjectAwareness extends Service { } else { moveFromOld(object, old, false); } + object.clearAware(); if (object instanceof CreatureObject && ((CreatureObject) object).isLoggedInPlayer()) new RequestZoneInIntent(owner, (CreatureObject) object, false).broadcast(); } @@ -181,7 +180,6 @@ public class ObjectAwareness extends Service { synchronized (tree) { objects = tree.get(l.getX(), l.getZ()); } - Log.d(this, "Updated awareness for %s", obj); if (objects.contains(obj)) { if (!i.isInAwareness()) { remove(obj); @@ -307,6 +305,8 @@ public class ObjectAwareness extends Service { * @param object the object to add */ public void add(SWGObject object) { + if (!isInAwareness(object)) + return; Location l = object.getLocation(); if (invalidLocation(l)) return; @@ -375,7 +375,7 @@ public class ObjectAwareness extends Service { * @param obj the object to update */ private void update(SWGObject obj) { - if (!obj.isGenerated()) + if (!obj.isGenerated() || !isInAwareness(obj)) return; Location l = obj.getWorldLocation(); if (invalidLocation(l)) @@ -427,6 +427,8 @@ public class ObjectAwareness extends Service { return false; if (obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedOutPlayer()) return false; + if (obj.getParent() != null) + return false; int distSquared = distanceSquared(objLoc, inRange.getWorldLocation()); int loadSquared = (int) (square(inRange.getLoadRange()) + 0.5); return (loadSquared != 0 || distSquared <= DEFAULT_LOAD_RANGE) && (loadSquared == 0 || distSquared <= loadSquared); diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index 6993525f1..9b79aa1d3 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -181,9 +181,14 @@ public final class SpawnerService extends Service { switch (set.getString("attackable")) { case "AGGRESSIVE": object.setPvpFlags(PvpFlag.AGGRESSIVE); - object.setPvpFlags(PvpFlag.ENEMY); - case "ATTACKABLE": object.setPvpFlags(PvpFlag.ATTACKABLE); break; - case "INVULNERABLE": object.addOptionFlags(OptionFlag.INVULNERABLE); break; + object.addOptionFlags(OptionFlag.AGGRESSIVE); + case "ATTACKABLE": + object.setPvpFlags(PvpFlag.ATTACKABLE); + object.addOptionFlags(OptionFlag.HAM_BAR); + break; + case "INVULNERABLE": + object.addOptionFlags(OptionFlag.INVULNERABLE); + break; default: Log.w(this, "An unknown attackable type of %s was specified for %s", set.getString("attackable"), name); break; }