diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 6f39ac4c8..ac3a0d0b0 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -54,6 +54,7 @@ import resources.player.Player; import resources.server_info.Log; import services.CoreManager; import services.objects.ObjectCreator; +import utilities.AwarenessUtilities; import java.util.ArrayList; import java.util.Collection; @@ -182,10 +183,9 @@ public abstract class SWGObject extends BaselineObject implements Comparable observer.sendPacket(update)); return ContainerResult.SUCCESS; } @@ -288,6 +288,8 @@ public abstract class SWGObject extends BaselineObject implements Comparable observers = target.getAwareness().getChildObservers(); + if (target.getOwner() != null) + observers.add(target.getOwner()); + for (Player observer : observers) { + createObject(observer, ignoreSnapshotChecks); + } + } + + public void createObject(Player target, boolean ignoreSnapshotChecks) { if (!isSnapshot() || ignoreSnapshotChecks) { sendSceneCreateObject(target); sendBaselines(target); @@ -665,22 +671,28 @@ public abstract class SWGObject extends BaselineObject implements Comparable observers = target.getAwareness().getChildObservers(); + if (target.getOwner() != null) + observers.add(target.getOwner()); + for (Player observer : observers) { + sendSceneDestroyObject(observer); + } } public void addObjectAware(SWGObject aware) { if (awareness.addObjectAware(aware.getAwareness())) { - createObject(aware.getOwner()); - aware.createObject(getOwner()); + createObject(aware); + aware.createObject(this); } } public void removeObjectAware(SWGObject aware) { if (awareness.removeObjectAware(aware.getAwareness())) { - destroyObject(aware.getOwner()); - aware.destroyObject(getOwner()); + destroyObject(aware); + aware.destroyObject(this); } } @@ -689,13 +701,11 @@ public abstract class SWGObject extends BaselineObject implements Comparable observers = awareness.getObjectObservers(); + Set aware = awareness.getObjectsAware(); awareness.clearObjectsAware(); - Player owner = getOwner(); - for (Player p : observers) { - destroyObject(p); - if (owner != null) - ((SWGObject) p.getCreatureObject()).destroyObject(owner); + for (SWGObject obj : aware) { + destroyObject(obj); + obj.destroyObject(this); } } @@ -709,15 +719,15 @@ public abstract class SWGObject extends BaselineObject implements Comparable observers = sendUpdates ? awareness.getCustomObservers() : null; + Set aware = sendUpdates ? awareness.getCustomAware() : null; awareness.clearCustomAware(); if (!sendUpdates) return; - Player owner = getOwner(); - for (Player p : observers) { - destroyObject(p); - ((SWGObject) p.getCreatureObject()).destroyObject(owner); + for (SWGObject obj : aware) { + destroyObject(obj); + obj.destroyObject(this); } } @@ -786,7 +795,7 @@ public abstract class SWGObject extends BaselineObject implements Comparable getAware() { -// Set aware = new AwarenessSet(awareness.size()); Set aware = new HashSet<>(awareness.size()); synchronized (awareness) { for (Aware a : awareness) { diff --git a/src/resources/objects/awareness/AwarenessHandler.java b/src/resources/objects/awareness/AwarenessHandler.java index 625c5f6ca..f7a15305b 100644 --- a/src/resources/objects/awareness/AwarenessHandler.java +++ b/src/resources/objects/awareness/AwarenessHandler.java @@ -38,6 +38,7 @@ import resources.objects.SWGObject; import resources.objects.awareness.TerrainMap.TerrainMapCallback; import resources.player.Player; import resources.server_info.Log; +import utilities.AwarenessUtilities; public class AwarenessHandler { @@ -96,16 +97,16 @@ public class AwarenessHandler { if (obj.getParent() != parent) obj.moveToContainer(parent); // Remove from previous awareness - TerrainMap oldTerrain = getTerrainMap(obj); - if (oldTerrain != null) - oldTerrain.removeWithoutUpdate(obj); + TerrainMap oldMap = getTerrainMap(requestedLocation.getTerrain()); + if (oldMap != null) + oldMap.removeWithoutUpdate(obj); // Update location obj.setLocation(requestedLocation); // Update awareness TerrainMap map = getTerrainMap(parent); if (map != null) { map.moveToParent(obj, parent); - handleUpdateAwarenessManual(obj, oldAware, oldObservers, obj.getObjectsAware(), obj.getObservers()); + AwarenessUtilities.handleUpdateAwarenessManual(obj, oldAware, oldObservers, obj.getObjectsAware(), obj.getObservers()); } else if (!requestedLocation.equals(GONE_LOCATION)) { Log.e(this, "Unknown terrain: %s", requestedLocation.getTerrain()); } @@ -119,29 +120,6 @@ public class AwarenessHandler { obj.clearCustomAware(true); } - private void handleUpdateAwarenessManual(SWGObject obj, Set oldAware, Set oldObservers, Set newAware, Set newObservers) { - // Create obj for all new observers - for (Player nowObserver : newObservers) { - if (!oldObservers.remove(nowObserver)) - obj.createObject(nowObserver); - } - // Destroy obj for all old observers - for (Player oldObserver : oldObservers) - obj.destroyObject(oldObserver); - - Player owner = obj.getOwner(); - if (owner == null) - return; - // Create new aware objects for obj - for (SWGObject nowAware : newAware) { - if (!oldAware.remove(nowAware)) - nowAware.createObject(owner); - } - // Destroy old aware objects for obj - for (SWGObject old : oldAware) - old.destroyObject(owner); - } - private TerrainMap getTerrainMap(SWGObject object) { Terrain t = object.getTerrain(); if (t == null) diff --git a/src/resources/objects/awareness/TerrainMap.java b/src/resources/objects/awareness/TerrainMap.java index 8a935e9d2..9f52b4dcc 100644 --- a/src/resources/objects/awareness/TerrainMap.java +++ b/src/resources/objects/awareness/TerrainMap.java @@ -36,7 +36,9 @@ import resources.Location; import resources.Terrain; import resources.callback.CallbackManager; import resources.objects.SWGObject; +import resources.objects.creature.CreatureObject; import resources.server_info.Log; +import utilities.AwarenessUtilities; public class TerrainMap { @@ -87,11 +89,7 @@ public class TerrainMap { } public void moveToParent(SWGObject obj, SWGObject parent) { - SWGObject superParent = obj.getSuperParent(); - if (superParent != null) { - superParent.removeObjectAware(obj); // Just in case - update(superParent); - } + obj.resetAwareness(); } public void removeWithoutUpdate(SWGObject obj) { @@ -127,16 +125,10 @@ public class TerrainMap { } private void update(SWGObject obj) { - Set aware = getNearbyAware(obj); Set prevAware = obj.getObjectsAware(); - for (SWGObject inRange : aware) { - if (!prevAware.remove(inRange)) { - callbackManager.callOnEach((call) -> call.onWithinRange(obj, inRange)); - } - } - for (SWGObject outRange : prevAware) { - callbackManager.callOnEach((call) -> call.onOutOfRange(obj, outRange)); - } + Set aware = getNearbyAware(obj); + AwarenessUtilities.callForNewAware(prevAware, aware, (inRange) -> callbackManager.callOnEach((call) -> call.onWithinRange(obj, inRange))); + AwarenessUtilities.callForOldAware(prevAware, aware, (outRange) -> callbackManager.callOnEach((call) -> call.onOutOfRange(obj, outRange))); } private Set getNearbyAware(SWGObject obj) { @@ -154,7 +146,11 @@ public class TerrainMap { } private boolean isInAwareness(SWGObject obj) { - return obj.getParent() == null; + if (obj.getParent() != null) + return false; + if (!(obj instanceof CreatureObject)) + return true; + return ((CreatureObject) obj).isLoggedInPlayer() || !((CreatureObject) obj).isPlayer(); } private TerrainMapChunk getChunk(double x, double z) { diff --git a/src/resources/player/Player.java b/src/resources/player/Player.java index 50f56f97b..5bf1276be 100644 --- a/src/resources/player/Player.java +++ b/src/resources/player/Player.java @@ -27,18 +27,18 @@ ***********************************************************************************/ package resources.player; -import network.OutboundPacketService; +import intents.network.OutboundPacketIntent; import network.packets.Packet; import resources.control.Service; import resources.objects.SWGObject; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; import services.player.PlayerManager; +import utilities.IntentChain; public class Player implements Comparable { - private static final OutboundPacketService outboundPacketService = new OutboundPacketService(); - + private final IntentChain packetChain; private Service playerManager; private long networkId; @@ -56,10 +56,11 @@ public class Player implements Comparable { private long lastInboundMessage = 0; public Player() { - this.playerManager = null; + this(null, 0); } public Player(Service playerManager, long networkId) { + this.packetChain = new IntentChain(); this.playerManager = playerManager; setNetworkId(networkId); } @@ -112,6 +113,8 @@ public class Player implements Comparable { this.creatureObject = obj; if (obj != null && obj.getOwner() != this) obj.setOwner(this); + if (obj == null) + packetChain.reset(); } public void updateLastPacketTimestamp() { @@ -178,15 +181,16 @@ public class Player implements Comparable { } public void sendPacket(Packet ... packets) { - outboundPacketService.send(networkId, packets); + for (Packet p : packets) { + packetChain.broadcastAfter(new OutboundPacketIntent(p, networkId)); + } } @Override public String toString() { String str = "Player["; - str += "ID=" + userId + " / " + getCreatureObject().getObjectId(); - str += " NAME=" + username + " / " + getCreatureObject().getName(); - str += " LEVEL=" + accessLevel; + str += "ID=" + userId + " / " + (creatureObject==null?"null":creatureObject.getObjectId()); + str += " NAME=" + username + " / " + (creatureObject==null?"null":creatureObject.getName()); str += " STATE=" + state; return str + "]"; } diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index 49dc78210..e2938e4aa 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -35,12 +35,15 @@ import intents.object.MoveObjectIntent; import intents.object.ObjectCreatedIntent; import intents.object.ObjectTeleportIntent; import intents.player.PlayerTransformedIntent; - +import main.ProjectSWG; import network.packets.Packet; import network.packets.swg.zone.CmdSceneReady; +import network.packets.swg.zone.insertion.CmdStartScene; import network.packets.swg.zone.object_controller.DataTransform; import network.packets.swg.zone.object_controller.DataTransformWithParent; import resources.Location; +import resources.Race; +import resources.Terrain; import resources.control.Intent; import resources.control.Service; import resources.objects.SWGObject; @@ -139,12 +142,20 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { case PE_DESTROYED: creature.setOwner(null); break; + case PE_ZONE_IN_CLIENT: + startScene(creature); + break; case PE_ZONE_IN_SERVER: creature.resetAwareness(); if (creature.getParent() == null) moveObject(creature, creature.getLocation()); - else + else { + for (SWGObject obj : creature.getSuperParent().getObjectsAware()) { + obj.createObject(creature); + creature.createObject(obj); + } moveObject(creature, creature.getParent(), creature.getLocation()); + } p.sendPacket(new CmdSceneReady()); break; default: @@ -168,11 +179,8 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { SWGObject object = oti.getObject(); Player owner = object.getOwner(); object.setLocation(oti.getNewLocation()); - if (oti.getParent() != null) { - moveObject(object, oti.getParent(), null); - } else { - moveObject(object, null); - } + if (oti.getParent() != object.getParent()) + object.moveToContainer(oti.getParent()); if (object instanceof CreatureObject && ((CreatureObject) object).isLoggedInPlayer()) new RequestZoneInIntent(owner, (CreatureObject) object, false).broadcast(); } @@ -200,12 +208,30 @@ public class ObjectAwareness extends Service implements TerrainMapCallback { } private void processMoveObjectIntent(MoveObjectIntent i) { - if (i.getParent() != null) + if (i.getParent() == null) moveObjectWithTransform(i.getObject(), i.getNewLocation(), i.getSpeed(), i.getUpdateCounter()); else moveObjectWithTransform(i.getObject(), i.getParent(), i.getNewLocation(), i.getSpeed(), i.getUpdateCounter()); } + private void startScene(SWGObject obj) { + Location loc = obj.getWorldLocation(); + long time = ProjectSWG.getGalacticTime(); + Race race = ((CreatureObject) obj).getRace(); + boolean ignoreSnapshots = loc.getTerrain() == Terrain.DEV_AREA; + Player owner = obj.getOwner(); + owner.sendPacket(new CmdStartScene(ignoreSnapshots, obj.getObjectId(), race, loc, time, (int)(System.currentTimeMillis()/1E3))); + recursiveCreateObject(obj, owner); + } + + private void recursiveCreateObject(SWGObject obj, Player owner) { + SWGObject parent = obj.getParent(); + if (parent != null) + recursiveCreateObject(parent, owner); + else + obj.createObject(owner, true); + } + private void moveObject(SWGObject obj, Location requestedLocation) { if (requestedLocation == null) awarenessHandler.disappearObject(obj, true, true); diff --git a/src/services/player/ZoneManager.java b/src/services/player/ZoneManager.java index a4c077775..e0f931234 100644 --- a/src/services/player/ZoneManager.java +++ b/src/services/player/ZoneManager.java @@ -32,7 +32,6 @@ import intents.PlayerEventIntent; import intents.RequestZoneInIntent; import intents.chat.ChatBroadcastIntent; import intents.network.GalacticPacketIntent; -import main.ProjectSWG; import network.packets.Packet; import network.packets.swg.login.AccountFeatureBits; import network.packets.swg.login.ClientIdMsg; @@ -49,21 +48,15 @@ import network.packets.swg.zone.chat.ChatOnConnectAvatar; import network.packets.swg.zone.chat.ChatSystemMessage; import network.packets.swg.zone.chat.VoiceChatStatus; import network.packets.swg.zone.insertion.ChatServerStatus; -import network.packets.swg.zone.insertion.CmdStartScene; - import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; -import resources.Location; -import resources.Race; -import resources.Terrain; import resources.config.ConfigFile; import resources.control.Intent; import resources.control.Manager; -import resources.objects.SWGObject; import resources.objects.creature.CreatureMood; import resources.objects.creature.CreatureObject; import resources.objects.player.PlayerObject; @@ -140,38 +133,19 @@ public class ZoneManager extends Manager { PlayerObject playerObj = creature.getPlayerObject(); player.setPlayerState(PlayerState.ZONING_IN); creature.setOwner(player); - - if (firstZone) - sendZonePackets(player, creature); - startScene(creature, creature.getWorldLocation()); - if (firstZone) - playerObj.setStartPlayTime((int) System.currentTimeMillis()); initPlayerBeforeZoneIn(player, creature, playerObj); Log.i("ObjectManager", "Zoning in %s with character %s", player.getUsername(), player.getCharacterName()); + if (firstZone) { - new PlayerEventIntent(player, PlayerEvent.PE_FIRST_ZONE).broadcast(); + sendZonePackets(player, creature); + playerObj.setStartPlayTime((int) System.currentTimeMillis()); sendCommitHistory(player); sendMessageOfTheDay(player); + new PlayerEventIntent(player, PlayerEvent.PE_FIRST_ZONE).broadcast(); } new PlayerEventIntent(player, PlayerEvent.PE_ZONE_IN_CLIENT).broadcast(); } - private void startScene(CreatureObject object, Location newLocation) { - long time = ProjectSWG.getGalacticTime(); - Race race = ((CreatureObject)object).getRace(); - boolean ignoreSnapshots = newLocation.getTerrain() == Terrain.DEV_AREA; - object.getOwner().sendPacket(new CmdStartScene(ignoreSnapshots, object.getObjectId(), race, newLocation, time, (int)(System.currentTimeMillis()/1E3))); - recursiveCreateObject(object, object.getOwner()); - } - - private void recursiveCreateObject(SWGObject obj, Player p) { - SWGObject parent = obj.getParent(); - if (parent != null) - recursiveCreateObject(parent, p); - else - obj.createObject(p, true); - } - private void loadCommitHistory() { File repoDir = new File("./" + Constants.DOT_GIT); int commitCount = 3; diff --git a/src/network/OutboundPacketService.java b/src/utilities/AwarenessUtilities.java similarity index 51% rename from src/network/OutboundPacketService.java rename to src/utilities/AwarenessUtilities.java index bab4fce09..b9dee113c 100644 --- a/src/network/OutboundPacketService.java +++ b/src/utilities/AwarenessUtilities.java @@ -25,23 +25,71 @@ * along with Holocore. If not, see . * * * ***********************************************************************************/ -package network; +package utilities; -import intents.network.OutboundPacketIntent; -import utilities.IntentChain; -import network.packets.Packet; +import java.util.Set; -public class OutboundPacketService { +import resources.objects.SWGObject; +import resources.player.Player; + +public class AwarenessUtilities { - private final IntentChain chain = new IntentChain(); - - public void send(long networkId, Packet ... packets) { - for (Packet packet : packets) - send(networkId, packet); + public static void handleUpdateAwarenessManual(SWGObject obj, Set oldAware, Set oldObservers, Set newAware, Set newObservers) { + callForNewObserver(oldObservers, newObservers, (observer) -> obj.createObject(observer.getCreatureObject())); + callForOldObserver(oldObservers, newObservers, (observer) -> obj.destroyObject(observer.getCreatureObject())); + + callForNewAware(oldAware, newAware, (aware) -> aware.createObject(obj)); + callForOldAware(oldAware, newAware, (aware) -> aware.destroyObject(obj)); } - public void send(long networkId, Packet packet) { - chain.broadcastAfter(new OutboundPacketIntent(packet, networkId)); + public static void callForNewObserver(Set oldObservers, Set newObservers, ObserverBasedRunnable r) { + for (Player newObserver : newObservers) { + if (!oldObservers.contains(newObserver)) + r.run(newObserver); + } + } + + public static void callForOldObserver(Set oldObservers, Set newObservers, ObserverBasedRunnable r) { + for (Player oldObserver : oldObservers) { + if (!newObservers.contains(oldObserver)) + r.run(oldObserver); + } + } + + public static void callForSameObserver(Set oldObservers, Set newObservers, ObserverBasedRunnable r) { + for (Player newObserver : newObservers) { + if (oldObservers.contains(newObserver)) + r.run(newObserver); + } + } + + public static void callForNewAware(Set oldAware, Set newAware, AwareBasedRunnable r) { + for (SWGObject aware : newAware) { + if (!oldAware.contains(aware)) + r.run(aware); + } + } + + public static void callForOldAware(Set oldAware, Set newAware, AwareBasedRunnable r) { + for (SWGObject aware : oldAware) { + if (!newAware.contains(aware)) + r.run(aware); + } + } + + public static void callForSameAware(Set oldAware, Set newAware, AwareBasedRunnable r) { + for (SWGObject aware : newAware) { + if (oldAware.contains(aware)) + r.run(aware); + } + } + + public interface AwareBasedRunnable { + void run(SWGObject aware); + } + + public interface ObserverBasedRunnable { + void run(Player owner); } } diff --git a/test/resources/objects/awareness/TestAwarenessHandler.java b/test/resources/objects/awareness/TestAwarenessHandler.java index 1f131a593..64298e1e4 100644 --- a/test/resources/objects/awareness/TestAwarenessHandler.java +++ b/test/resources/objects/awareness/TestAwarenessHandler.java @@ -28,12 +28,9 @@ package resources.objects.awareness; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import java.util.stream.Collectors; - import org.junit.Assert; -import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -49,20 +46,45 @@ import services.objects.ClientBuildoutService; public class TestAwarenessHandler { private static final Location CREATURE_LOCATION = new Location(3618, 5, -4801, Terrain.TATOOINE); + private static final Location CREATURE2_LOCATION = new Location(3650, 5, -4800, Terrain.TATOOINE); - private List eisleyObjects = new ArrayList<>(); + private static final List EISLEY_OBJECTS = new ArrayList<>(2524); + private static final List WITHIN_RANGE = new ArrayList<>(537); - @Before - public void initTatooine() { + private static final GenericCreatureObject CREATURE2 = new GenericCreatureObject(2); + private static final GenericCreatureObject CREATURE3 = new GenericCreatureObject(3); + + @BeforeClass + public static void initTatooine() { ClientBuildoutService buildoutService = new ClientBuildoutService(); - Collection allObjects = buildoutService.loadClientObjectsByArea(843); // mos eisley's area id - eisleyObjects = allObjects.stream().filter((obj) -> { - return obj.getTerrain() == Terrain.TATOOINE && obj.getParent() == null; - }).collect(Collectors.toList()); - allObjects = buildoutService.loadClientObjectsByArea(-59); // general tatooine's area id - eisleyObjects.addAll(allObjects.stream().filter((obj) -> { - return obj.getTerrain() == Terrain.TATOOINE && obj.getParent() == null && CREATURE_LOCATION.isWithinFlatDistance(obj.getLocation(), 1024*Math.sqrt(2)); - }).collect(Collectors.toList())); + double loadDistance = 1024*1.414; // 1024 * sqrt(2) + for (SWGObject obj : buildoutService.loadClientObjectsByArea(843)) { // mos eisley's area id + initObject(obj, loadDistance); + } + for (SWGObject obj : buildoutService.loadClientObjectsByArea(-59)) { // general tatooine's area id + initObject(obj, loadDistance); + } + CREATURE2.setLocation(CREATURE2_LOCATION); + initObject(CREATURE2, loadDistance); + CREATURE3.setLocation(CREATURE2_LOCATION); + CREATURE3.setHasOwner(false); + initObject(CREATURE3, loadDistance); + } + + private static void initObject(SWGObject obj, double loadDistance) { + if (obj.getParent() == null && CREATURE_LOCATION.isWithinFlatDistance(obj.getLocation(), loadDistance)) { + EISLEY_OBJECTS.add(obj); + if (isValidWithinRange(obj, CREATURE_LOCATION, Math.max(obj.getLoadRange(), 200))) + WITHIN_RANGE.add(obj); + } + } + + private static boolean isValidWithinRange(SWGObject inRange, Location objLocation, double range) { + if (inRange instanceof CreatureObject && ((CreatureObject) inRange).isLoggedOutPlayer()) + return false; + if (!inRange.getWorldLocation().isWithinFlatDistance(objLocation, Math.max(range, inRange.getLoadRange()))) + return false; + return true; } @Test @@ -70,39 +92,28 @@ public class TestAwarenessHandler { MapCallbackRealistic callback = new MapCallbackRealistic(); AwarenessHandler awareness = new AwarenessHandler(callback); GenericCreatureObject creature = new GenericCreatureObject(1); - List withinRange = new ArrayList<>(); - for (SWGObject obj : eisleyObjects) { - awareness.moveObject(obj, obj.getLocation()); - if (isValidWithinRange(creature, obj, CREATURE_LOCATION, Math.max(obj.getLoadRange(), creature.getLoadRange()))) - withinRange.add(obj); - } - callback.waitFor(0, 0, eisleyObjects.size(), 0, 1000); - callback.set(0, 0, 0, 0); + initAwareness(awareness, callback); awareness.moveObject(creature, CREATURE_LOCATION); - callback.waitAndTest(withinRange.size(), 0, 1, 0, 1000); + callback.waitAndTest(WITHIN_RANGE.size(), 0, 1, 0, 1000); callback.set(0, 0, 0, 0); awareness.moveObject(creature, CREATURE_LOCATION); callback.waitAndTest(0, 0, 1, 0, 1000); } @Test - public void testMoveAway() throws InterruptedException { + public void testMoveAwayBack() throws InterruptedException { MapCallbackRealistic callback = new MapCallbackRealistic(); AwarenessHandler awareness = new AwarenessHandler(callback); + initAwareness(awareness, callback); GenericCreatureObject creature = new GenericCreatureObject(1); - List withinRange = new ArrayList<>(); - for (SWGObject obj : eisleyObjects) { - awareness.moveObject(obj, obj.getLocation()); - if (isValidWithinRange(creature, obj, CREATURE_LOCATION, Math.max(obj.getLoadRange(), creature.getLoadRange()))) - withinRange.add(obj); - } - callback.waitFor(0, 0, eisleyObjects.size(), 0, 1000); - callback.set(0, 0, 0, 0); awareness.moveObject(creature, CREATURE_LOCATION); - callback.waitAndTest(withinRange.size(), 0, 1, 0, 1000); + callback.waitAndTest(WITHIN_RANGE.size(), 0, 1, 0, 1000); callback.set(0, 0, 0, 0); awareness.moveObject(creature, new Location(0, 0, 0, Terrain.TATOOINE)); - callback.waitAndTest(0, withinRange.size(), 1, 0, 1000); + callback.waitAndTest(0, WITHIN_RANGE.size(), 1, 0, 1000); + callback.set(0, 0, 0, 0); + awareness.moveObject(creature, CREATURE_LOCATION); + callback.waitAndTest(WITHIN_RANGE.size(), 0, 1, 0, 1000); } @Test @@ -110,34 +121,27 @@ public class TestAwarenessHandler { MapCallbackRealistic callback = new MapCallbackRealistic(); AwarenessHandler awareness = new AwarenessHandler(callback); GenericCreatureObject creature = new GenericCreatureObject(1); - List withinRange = new ArrayList<>(); BuildingObject starport = null; - for (SWGObject obj : eisleyObjects) { - awareness.moveObject(obj, obj.getLocation()); - if (isValidWithinRange(creature, obj, CREATURE_LOCATION, Math.max(obj.getLoadRange(), creature.getLoadRange()))) { - withinRange.add(obj); - if (obj instanceof BuildingObject && obj.getTemplate().contains("starport")) - starport = (BuildingObject) obj; - } + for (SWGObject obj : WITHIN_RANGE) { + if (obj instanceof BuildingObject && obj.getTemplate().contains("starport")) + starport = (BuildingObject) obj; } Assert.assertNotNull("Starport is null!", starport); - callback.waitFor(0, 0, eisleyObjects.size(), 0, 1000); - callback.set(0, 0, 0, 0); + initAwareness(awareness, callback); awareness.moveObject(creature, CREATURE_LOCATION); - callback.waitAndTest(withinRange.size(), 0, 1, 0, 1000); + callback.waitAndTest(WITHIN_RANGE.size(), 0, 1, 0, 1000); callback.set(0, 0, 0, 0); awareness.moveObject(creature, starport.getCellByNumber(1), new Location(0, 0, 0, Terrain.TATOOINE)); - callback.waitAndTest(0, 0, 0, 0, 1000); + awareness.moveObject(CREATURE2, CREATURE2_LOCATION); + callback.waitAndTest(0, 0, 1, 0, 1000); } - private boolean isValidWithinRange(SWGObject obj, SWGObject inRange, Location objLocation, double range) { - if (obj.equals(inRange)) - return false; - if (inRange instanceof CreatureObject && ((CreatureObject) inRange).isLoggedOutPlayer()) - return false; - if (!inRange.getWorldLocation().isWithinFlatDistance(objLocation, Math.max(range, inRange.getLoadRange()))) - return false; - return true; + private void initAwareness(AwarenessHandler awareness, MapCallback callback) { + for (SWGObject obj : EISLEY_OBJECTS) { + awareness.moveObject(obj, obj.getLocation()); + } + callback.waitFor(0, 0, EISLEY_OBJECTS.size(), 0, 1000); + callback.set(0, 0, 0, 0); } private static class MapCallbackRealistic extends MapCallback { diff --git a/test/resources/objects/awareness/TestTerrainMap.java b/test/resources/objects/awareness/TestTerrainMap.java index 3ada82cc0..02821cc8e 100644 --- a/test/resources/objects/awareness/TestTerrainMap.java +++ b/test/resources/objects/awareness/TestTerrainMap.java @@ -81,7 +81,7 @@ public class TestTerrainMap { objB.setLocation(new Location(5, 0, 5, Terrain.TATOOINE)); objB.moveToContainer(cell); map.moveToParent(objB, cell); // 0 - Within Range, 0 - Successful Move - callback.waitAndTest(2, 0, 2, 0, 1000); + callback.waitAndTest(1, 0, 2, 0, 1000); } finally { map.stop(); }