Merged projectswg/holocore into quality_assurance

This commit is contained in:
Tacef Ine
2017-06-26 21:21:19 +02:00
20 changed files with 290 additions and 117 deletions
+3 -1
View File
@@ -26,7 +26,9 @@ test {
events "skipped", "failed" // just good to know in terms of what failed
}
afterSuite { TestDescriptor td, TestResult tr ->
println 'Tests run: ('+tr.getTestCount()+'), Failures: ('+tr.getFailedTestCount()+')' // IMPORTANT - this is required for Lightspeed
if (td.parent == null) {
println 'Tests run: ('+tr.getTestCount()+'), Failures: ('+tr.getFailedTestCount()+')' // IMPORTANT - this is required for Lightspeed
}
}
include 'main/TestAll.class' // to run only a single test case
}
Binary file not shown.
+1 -1
View File
@@ -362,7 +362,7 @@ public enum PacketType {
public static SWGPacket getForCrc(int crc) {
PacketType type = packetMap.get(crc);
if (type == null)
if (type == null || type == UNKNOWN)
return null;
Class <? extends SWGPacket> c = type.c;
try {
@@ -81,7 +81,7 @@ public class OutOfBandPackage implements Encodable, Persistable {
int padding = data.getShort();
Type type = Type.getTypeForByte(data.getByte());
unpackOutOfBandData(data, type);
data.position(data.position() + padding);
data.seek(padding);
remaining -= data.position() - start;
}
}
@@ -170,7 +170,7 @@ public class OutOfBandPackage implements Encodable, Persistable {
private static final EnumLookup<Byte, Type> LOOKUP = new EnumLookup<>(Type.class, t -> t.getType());
byte type;
private byte type;
Type(int type) {
this.type = (byte) type;
+1 -1
View File
@@ -274,7 +274,7 @@ public class ProsePackage implements OutOfBandData {
return base.hashCode() * 3 + actor.hashCode() * 7 + target.hashCode() * 13 + other.hashCode() * 17 + (grammarFlag ? 1 : 0) + di * 19 + ((int) (df * 23));
}
private static class Prose implements Encodable, Persistable {
public static class Prose implements Encodable, Persistable {
private long objectId;
private StringId stringId;
+25 -20
View File
@@ -39,13 +39,12 @@ import resources.objects.SWGObject;
import resources.objects.tangible.TangibleObject;
import resources.objects.weapon.WeaponObject;
import resources.persistable.SWGObjectFactory;
import resources.player.Player;
import services.objects.ObjectCreator;
public class Equipment implements Encodable, Persistable {
private TangibleObject weapon;
private byte [] customizationString;
private byte[] customizationString;
private int arrangementId;
private long objectId;
private CRC template;
@@ -70,18 +69,18 @@ public class Equipment implements Encodable, Persistable {
@Override
public byte [] encode() {
byte [] weaponData = (weapon != null) ? getWeaponData() : new byte[0];
NetBuffer buffer = NetBuffer.allocate(19 + weaponData.length);
boolean hasWeapon = weapon != null;
byte [] weaponData = hasWeapon ? getWeaponData() : new byte[0];
NetBuffer buffer = NetBuffer.allocate(getLength(weaponData.length));
buffer.addArray(customizationString); // TODO: Create encodable class for customization string
buffer.addInt(arrangementId);
buffer.addLong(objectId);
buffer.addEncodable(template);
buffer.addBoolean(weapon != null);
buffer.addBoolean(hasWeapon);
buffer.addRawArray(weaponData);
return buffer.array();
}
@Override
public void decode(NetBuffer data) {
customizationString = data.getArray(); // TODO: Create encodable class for customization string
@@ -94,7 +93,13 @@ public class Equipment implements Encodable, Persistable {
@Override
public int getLength() {
return 19 + (weapon != null ? getWeaponData().length : 0);
boolean hasWeapon = weapon != null;
int weaponLength = hasWeapon ? getWeaponData().length : 0;
return getLength(weaponLength);
}
private int getLength(int weaponLength) {
return 15 + weaponLength + customizationString.length + template.getLength();
}
@Override
@@ -120,8 +125,8 @@ public class Equipment implements Encodable, Persistable {
weapon = (TangibleObject) SWGObjectFactory.create(stream);
}
public byte[] getCustomizationString() {return customizationString;}
public void setCustomizationString(byte[] customizationString) { this.customizationString = customizationString; }
public byte [] getCustomizationString() {return customizationString;}
public void setCustomizationString(byte [] customizationString) { this.customizationString = customizationString; }
public int getArrangementId() { return arrangementId; }
public void setArrangementId(int arrangementId) { this.arrangementId = arrangementId; }
@@ -136,17 +141,17 @@ public class Equipment implements Encodable, Persistable {
public void setWeapon(TangibleObject weapon) { this.weapon = weapon; }
private byte[] getWeaponData() {
Player target = weapon.getOwner();
NetBuffer data3 = weapon.createBaseline3(target).encode();
data3.position(0);
NetBuffer data6 = weapon.createBaseline6(target).encode();
data6.position(0);
if (weapon == null)
return new byte[0];
NetBuffer data3 = weapon.createBaseline3(null).encode();
NetBuffer data6 = weapon.createBaseline6(null).encode();
NetBuffer ret = NetBuffer.allocate(data3.remaining() + data6.remaining());
ret.addRawArray(data3.array());
ret.addRawArray(data6.array());
return ret.array();
int data3Size = data3.limit();
int data6Size = data6.limit();
byte [] ret = new byte[data3Size + data6Size];
System.arraycopy(data3.array(), 0, ret, 0, data3Size);
System.arraycopy(data6.array(), 0, ret, data3Size, data6Size);
return ret;
}
private TangibleObject createWeaponFromData(NetBuffer data) {
+29 -22
View File
@@ -30,6 +30,8 @@ package resources.network;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.lang.ref.SoftReference;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.util.ArrayList;
import java.util.List;
@@ -71,28 +73,33 @@ public class BaselineObject {
public void parseBaseline(Baseline baseline) {
NetBuffer buffer = NetBuffer.wrap(baseline.getBaselineData());
buffer.getShort();
switch (baseline.getNum()) {
case 1:
parseBaseline1(buffer);
break;
case 3:
parseBaseline3(buffer);
break;
case 4:
parseBaseline4(buffer);
break;
case 6:
parseBaseline6(buffer);
break;
case 7:
parseBaseline7(buffer);
break;
case 8:
parseBaseline8(buffer);
break;
case 9:
parseBaseline9(buffer);
break;
try {
switch (baseline.getNum()) {
case 1:
parseBaseline1(buffer);
break;
case 3:
parseBaseline3(buffer);
break;
case 4:
parseBaseline4(buffer);
break;
case 6:
parseBaseline6(buffer);
break;
case 7:
parseBaseline7(buffer);
break;
case 8:
parseBaseline8(buffer);
break;
case 9:
parseBaseline9(buffer);
break;
}
} catch (BufferUnderflowException | BufferOverflowException e) {
Log.e("Failed to parse baseline %s %d with object: %s", baseline.getType(), baseline.getNum(), this);
Log.e(e);
}
}
+9 -4
View File
@@ -40,6 +40,7 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
import com.projectswg.common.concurrency.SynchronizedMap;
import com.projectswg.common.data.CRC;
@@ -295,11 +296,15 @@ public abstract class SWGObject extends BaselineObject implements Comparable<SWG
}
public Map<String, SWGObject> getSlots() {
synchronized (slots) {
return new HashMap<>(slots);
}
return new HashMap<>(slots);
}
public List<SWGObject> getSlottedObjects() {
return slots.values().stream()
.filter(obj -> (obj != null))
.collect(Collectors.toList());
}
public void setOwner(Player player) {
if (owner == player)
return;
@@ -147,6 +147,7 @@ class Aware {
private Set<Player> getObservers(Player owner, SWGObject original, boolean useAware) {
Set<Player> observers = new HashSet<>();
addObserversToSet(getObject().getContainedObjects(), observers, owner, original);
addObserversToSet(getObject().getSlottedObjects(), observers, owner, original);
if (useAware) {
addObserversToSet(getAware(), observers, owner, original);
}
@@ -37,6 +37,8 @@ import com.projectswg.common.debug.Log;
import resources.objects.SWGObject;
import resources.objects.awareness.TerrainMap.TerrainMapCallback;
import resources.objects.creature.CreatureObject;
import resources.objects.creature.CreatureState;
public class AwarenessHandler implements AutoCloseable {
@@ -80,7 +82,7 @@ public class AwarenessHandler implements AutoCloseable {
}
// Update location
obj.setLocation(requestedLocation);
if (obj.getParent() != null)
if (obj.getParent() != null && !(obj instanceof CreatureObject && ((CreatureObject) obj).isStatesBitmask(CreatureState.RIDING_MOUNT)))
obj.moveToContainer(null);
obj.onObjectMoved();
// Update awareness
@@ -101,7 +103,7 @@ public class AwarenessHandler implements AutoCloseable {
if (oldMap != null)
oldMap.removeWithoutUpdate(obj);
// Update location
if (obj.getParent() != parent)
if (obj.getParent() != parent && !(obj instanceof CreatureObject && ((CreatureObject) obj).isStatesBitmask(CreatureState.RIDING_MOUNT)))
obj.moveToContainer(parent);
obj.setLocation(requestedLocation);
obj.onObjectMoved();
@@ -27,6 +27,7 @@
***********************************************************************************/
package resources.objects.building;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -50,10 +51,13 @@ public class BuildingObject extends TangibleObject {
private final Map<String, CellObject> nameToCell;
private final Map<Integer, CellObject> idToCell;
private WeakReference<PortalLayoutData> portalLayoutData;
public BuildingObject(long objectId) {
super(objectId, BaselineType.BUIO);
nameToCell = new SynchronizedMap<>();
idToCell = new SynchronizedMap<>();
this.nameToCell = new SynchronizedMap<>();
this.idToCell = new SynchronizedMap<>();
this.portalLayoutData = null;
}
public CellObject getCellByName(String cellName) {
@@ -71,14 +75,14 @@ public class BuildingObject extends TangibleObject {
@Override
public void addObject(SWGObject object) {
super.addObject(object);
Assert.test(object instanceof CellObject);
Assert.test(object instanceof CellObject, "Object added to building is not a cell!");
CellObject cell = (CellObject) object;
Assert.test(cell.getNumber() > 0);
Assert.test(cell.getNumber() < getCellCount());
Assert.test(cell.getNumber() > 0, "Cell Number must be greater than 0!");
Assert.test(cell.getNumber() < getCellCount(), "Cell Number must be less than the cell count!");
cell.setCellName(getCellName(cell.getNumber()));
synchronized (idToCell) {
Assert.isNull(idToCell.get(cell.getNumber()));
Assert.isNull(idToCell.get(cell.getNumber()), "Multiple cells have the same number!");
idToCell.put(cell.getNumber(), cell);
nameToCell.put(cell.getCellName(), cell); // Can be multiple cells with the same name
}
@@ -91,7 +95,7 @@ public class BuildingObject extends TangibleObject {
if (idToCell.get(i) != null)
continue;
CellObject cell = (CellObject) ObjectCreator.createObjectFromTemplate("object/cell/shared_cell.iff");
Assert.notNull(cell);
Assert.notNull(cell, "Failed to create a cell!");
cell.setNumber(i);
cell.setTerrain(getTerrain());
addObject(cell);
@@ -115,12 +119,16 @@ public class BuildingObject extends TangibleObject {
}
private PortalLayoutData getPortalLayoutData() {
String portalFile = (String) getDataAttribute(ObjectDataAttribute.PORTAL_LAYOUT_FILENAME);
if (portalFile == null || portalFile.isEmpty())
return null;
PortalLayoutData portalLayoutData = (PortalLayoutData) ClientFactory.getInfoFromFile(portalFile, true);
Assert.test(portalLayoutData != null && portalLayoutData.getCells() != null && portalLayoutData.getCells().size() > 0);
PortalLayoutData portalLayoutData = (this.portalLayoutData == null) ? null : this.portalLayoutData.get();
if (portalLayoutData == null) {
String portalFile = (String) getDataAttribute(ObjectDataAttribute.PORTAL_LAYOUT_FILENAME);
if (portalFile == null || portalFile.isEmpty())
return null;
portalLayoutData = (PortalLayoutData) ClientFactory.getInfoFromFile(portalFile, true);
this.portalLayoutData = new WeakReference<>(portalLayoutData);
}
Assert.test(portalLayoutData != null && portalLayoutData.getCells() != null && portalLayoutData.getCells().size() > 0, "Invalid portal layout data!");
return portalLayoutData;
}
+6 -1
View File
@@ -87,11 +87,13 @@ public class CellObject extends SWGObject {
this.labelZ = z;
}
@Override
protected void sendFinalBaselinePackets(Player target) {
super.sendFinalBaselinePackets(target);
target.sendPacket(new UpdateCellPermissionMessage((byte) 1, getObjectId()));
}
@Override
protected void createBaseline3(Player target, BaselineBuilder bb) {
super.createBaseline3(target, bb);
bb.addBoolean(isPublic);
@@ -99,21 +101,24 @@ public class CellObject extends SWGObject {
bb.incrementOperandCount(2);
}
@Override
protected void createBaseline6(Player target, BaselineBuilder bb) {
super.createBaseline6(target, bb);
bb.addUnicode(label);
bb.addFloat((float) labelX);
bb.addFloat((float) 0);
bb.addFloat(0);
bb.addFloat((float) labelZ);
bb.incrementOperandCount(2);
}
@Override
protected void parseBaseline3(NetBuffer buffer) {
super.parseBaseline3(buffer);
isPublic = buffer.getBoolean();
number = buffer.getInt();
}
@Override
protected void parseBaseline6(NetBuffer buffer) {
super.parseBaseline6(buffer);
label = buffer.getUnicode();
@@ -605,6 +605,14 @@ public class CreatureObject extends TangibleObject {
public long getStatesBitmask() {
return statesBitmask;
}
public boolean isStatesBitmask(CreatureState ... states) {
for (CreatureState state : states) {
if ((statesBitmask & state.getBitmask()) == 0)
return false;
}
return true;
}
public void setStatesBitmask(CreatureState ... states) {
for (CreatureState state : states)
@@ -975,8 +983,6 @@ public class CreatureObject extends TangibleObject {
@Override
protected void parseBaseline3(NetBuffer buffer) {
super.parseBaseline3(buffer);
if (getStringId().toString().equals("@obj_n:unknown_object"))
return;
posture = Posture.getFromId(buffer.getByte());
factionRank = buffer.getByte();
ownerId = buffer.getLong();
@@ -988,16 +994,12 @@ public class CreatureObject extends TangibleObject {
@Override
protected void parseBaseline4(NetBuffer buffer) {
super.parseBaseline4(buffer);
if (getStringId().toString().equals("@obj_n:unknown_object"))
return;
creo4.parseBaseline4(buffer);
}
@Override
protected void parseBaseline6(NetBuffer buffer) {
super.parseBaseline6(buffer);
if (getStringId().toString().equals("@obj_n:unknown_object"))
return;
creo6.parseBaseline6(buffer);
}
@@ -78,12 +78,6 @@ public class MissionObject extends IntangibleObject {
bb.addObject(waypoint);
}
@Override
public void createBaseline6(Player target, BaselineBuilder bb) {
super.createBaseline6(target, bb);
bb.addInt(-1);
}
@Override
public void parseBaseline3(NetBuffer buffer) {
super.parseBaseline3(buffer);
@@ -106,12 +100,6 @@ public class MissionObject extends IntangibleObject {
waypoint.decode(buffer);
}
@Override
public void parseBaseline6(NetBuffer buffer) {
super.parseBaseline6(buffer);
buffer.getInt();
}
@Override
public void save(NetBufferStream stream) {
super.save(stream);
@@ -29,12 +29,13 @@ package resources.objects.staticobject;
import com.projectswg.common.network.NetBufferStream;
import resources.objects.creature.CreatureObject;
import network.packets.swg.zone.baselines.Baseline.BaselineType;
import resources.objects.SWGObject;
public class StaticObject extends CreatureObject {
public class StaticObject extends SWGObject {
public StaticObject(long objectId) {
super(objectId);
super(objectId, BaselineType.STAO);
}
@Override
@@ -294,8 +294,6 @@ public class TangibleObject extends SWGObject {
@Override
protected void createBaseline3(Player target, BaselineBuilder bb) {
super.createBaseline3(target, bb); // 4 variables - BASE3 (4)
if (getStringId().toString().equals("@obj_n:unknown_object"))
return;
bb.addInt(pvpFaction.getCrc()); // Faction - 4
bb.addInt(pvpStatus.getValue()); // Faction Status - 5
bb.addArray(appearanceData); // - 6
@@ -313,8 +311,6 @@ public class TangibleObject extends SWGObject {
@Override
protected void createBaseline6(Player target, BaselineBuilder bb) {
super.createBaseline6(target, bb);
if (getStringId().toString().equals("@obj_n:unknown_object"))
return;
bb.addBoolean(inCombat); // 2 - Combat flag
bb.addObject(defenders); // 3 - Defenders List (Set, Long)
bb.addInt(0); // 4 - Map color
@@ -330,8 +326,6 @@ public class TangibleObject extends SWGObject {
@Override
protected void parseBaseline3(NetBuffer buffer) {
super.parseBaseline3(buffer);
if (getStringId().toString().equals("@obj_n:unknown_object"))
return;
pvpFaction = PvpFaction.getFactionForCrc(buffer.getInt());
pvpStatus = PvpStatus.getStatusForValue(buffer.getInt());
appearanceData = buffer.getArray();
@@ -346,8 +340,6 @@ public class TangibleObject extends SWGObject {
@Override
protected void parseBaseline6(NetBuffer buffer) {
super.parseBaseline6(buffer);
if (getStringId().toString().equals("@obj_n:unknown_object"))
return;
inCombat = buffer.getBoolean();
defenders = SWGSet.getSwgSet(buffer, 6, 3, Long.TYPE);
buffer.getInt();
+8 -1
View File
@@ -31,6 +31,7 @@ import com.projectswg.common.control.Service;
import com.projectswg.common.data.info.RelationalDatabase;
import com.projectswg.common.data.info.RelationalServerFactory;
import com.projectswg.common.data.location.Location;
import com.projectswg.common.data.swgfile.ClientFactory;
import com.projectswg.common.debug.Log;
import intents.chat.ChatBroadcastIntent;
import intents.chat.ChatCommandIntent;
@@ -348,9 +349,15 @@ public final class LootService extends Service {
String[] itemNames = itemGroup.getItemNames();
String randomItemName = itemNames[random.nextInt(itemNames.length)]; // Selects a completely random item from the group
if (randomItemName.startsWith("dynamic_") || randomItemName.endsWith(".iff")) {
if (randomItemName.startsWith("dynamic_")) {
// TODO dynamic item handling
new ChatBroadcastIntent(requester.getOwner(), "We don't support this loot item yet: " + randomItemName).broadcast();
} else if (randomItemName.endsWith(".iff")) {
String sharedTemplate = ClientFactory.formatToSharedFile(randomItemName);
SWGObject object = ObjectCreator.createObjectFromTemplate(sharedTemplate);
object.moveToContainer(lootInventory);
new ObjectCreatedIntent(object).broadcast();
} else {
new CreateStaticItemIntent(requester, lootInventory, new StaticItemService.ObjectCreationHandler() {
@Override
+16 -8
View File
@@ -64,6 +64,7 @@ import resources.objects.awareness.AwarenessHandler;
import resources.objects.awareness.DataTransformHandler;
import resources.objects.awareness.TerrainMap.TerrainMapCallback;
import resources.objects.creature.CreatureObject;
import resources.objects.creature.CreatureState;
import resources.player.Player;
import resources.player.PlayerEvent;
import resources.player.PlayerState;
@@ -155,11 +156,9 @@ public class ObjectAwareness extends Service implements TerrainMapCallback {
private void handleDestroyObjectIntent(DestroyObjectIntent doi) {
SWGObject obj = doi.getObject();
disappearObject(obj, true, true);
obj.moveToContainer(null);
disappearObject(obj, true, true);
obj.setPosition(Terrain.GONE, 0, 0, 0);
obj.clearObjectsAware();
obj.clearCustomAware(true);
}
private void processObjectTeleportIntent(ObjectTeleportIntent oti) {
@@ -306,17 +305,26 @@ public class ObjectAwareness extends Service implements TerrainMapCallback {
}
private void moveObjectWithTransform(SWGObject obj, SWGObject parent, Location requestedLocation, double speed, int update) {
moveObject(obj, parent, requestedLocation);
if (parent == null)
dataTransformHandler.handleMove(obj, speed, update);
else
dataTransformHandler.handleMove(obj, parent, speed, update);
if (obj instanceof CreatureObject && ((CreatureObject) obj).isStatesBitmask(CreatureState.RIDING_MOUNT)) {
SWGObject vehicle = obj.getParent();
moveObject(vehicle, null, requestedLocation);
dataTransformHandler.handleMove(vehicle, speed, update);
moveObject(obj, null, requestedLocation);
} else {
moveObject(obj, parent, requestedLocation);
if (parent == null)
dataTransformHandler.handleMove(obj, speed, update);
else
dataTransformHandler.handleMove(obj, parent, speed, update);
}
if (obj instanceof CreatureObject && ((CreatureObject) obj).isLoggedInPlayer())
new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), parent, obj.getLocation(), requestedLocation).broadcast();
}
private void disappearObject(SWGObject obj, boolean disappearObjects, boolean disappearCustom) {
awarenessHandler.disappearObject(obj, disappearObjects, disappearCustom);
obj.clearObjectsAware();
obj.clearCustomAware(true);
}
}
+2 -2
View File
@@ -154,6 +154,7 @@ public final class ObjectCreator {
case GOTM_RESOURCE_CONTAINER: return new ResourceContainerObject(objectId);
case GOTM_SHIP: return new ShipObject(objectId);
case GOTM_WEAPON: return new WeaponObject(objectId);
case GOTM_VEHICLE: return new CreatureObject(objectId);
case GOTM_ARMOR:
case GOTM_CLOTHING:
case GOTM_COMPONENT:
@@ -163,8 +164,7 @@ public final class ObjectCreator {
case GOTM_CHRONICLES:
case GOTM_CYBERNETIC:
case GOTM_TERMINAL:
case GOTM_POWERUP_WEAPON:
case GOTM_VEHICLE: return new TangibleObject(objectId);
case GOTM_POWERUP_WEAPON: return new TangibleObject(objectId);
default: return null;
}
}
@@ -37,13 +37,20 @@ import org.junit.runners.JUnit4;
import com.projectswg.common.concurrency.Delay;
import com.projectswg.common.control.Intent;
import com.projectswg.common.control.IntentManager;
import com.projectswg.common.data.location.Location;
import com.projectswg.common.data.location.Terrain;
import intents.PlayerEventIntent;
import intents.object.ContainerTransferIntent;
import intents.object.DestroyObjectIntent;
import intents.object.MoveObjectIntent;
import intents.object.ObjectCreatedIntent;
import resources.Posture;
import resources.objects.building.BuildingObject;
import resources.objects.cell.CellObject;
import resources.objects.creature.CreatureObject;
import resources.objects.creature.CreatureState;
import resources.player.PlayerEvent;
import services.objects.ObjectAwareness;
import services.objects.ObjectCreator;
import test_resources.GenericCreatureObject;
@@ -51,7 +58,8 @@ import test_resources.GenericCreatureObject;
@RunWith(JUnit4.class)
public class TestObjectAwareness {
private GenericCreatureObject player;
private GenericCreatureObject player1;
private GenericCreatureObject player2;
private BuildingObject building;
private CellObject firstCell;
private CreatureObject npc;
@@ -60,11 +68,12 @@ public class TestObjectAwareness {
public void initializeTests() {
IntentManager.setInstance(new IntentManager(1));
IntentManager.getInstance().initialize();
player = new GenericCreatureObject(1);
building = (BuildingObject) ObjectCreator.createObjectFromTemplate(2, "object/building/tatooine/shared_starport_tatooine.iff");
firstCell = new CellObject(3);
player1 = new GenericCreatureObject(1);
player2 = new GenericCreatureObject(2);
building = (BuildingObject) ObjectCreator.createObjectFromTemplate(10, "object/building/tatooine/shared_starport_tatooine.iff");
firstCell = new CellObject(11);
firstCell.setNumber(1);
npc = (CreatureObject) ObjectCreator.createObjectFromTemplate(4, "object/mobile/dressed_tatooine_opening_wh_guard.iff");
npc = (CreatureObject) ObjectCreator.createObjectFromTemplate(20, "object/mobile/dressed_tatooine_opening_wh_guard.iff");
Assert.assertNotNull("Building is null!", building);
Assert.assertNotNull("NPC is null!", npc);
building.addObject(firstCell);
@@ -82,11 +91,11 @@ public class TestObjectAwareness {
* 1) Player is inside Cell #1
* 2) NPC is inside Cell #1
*/
player.setPosition(Terrain.TATOOINE, 0, 0, 0);
player1.setPosition(Terrain.TATOOINE, 0, 0, 0);
building.setPosition(Terrain.TATOOINE, 10, 10, 10);
npc.setPosition(Terrain.TATOOINE, 0, 0, 0);
npc.moveToContainer(firstCell);
player.moveToContainer(firstCell);
player1.moveToContainer(firstCell);
// Create service and start sending intents
ObjectAwareness awareness = new ObjectAwareness();
@@ -94,12 +103,143 @@ public class TestObjectAwareness {
Assert.assertTrue(awareness.start());
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(building)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(npc)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(player)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(player1)));
// Check to make sure NPC is in awareness
Assert.assertTrue("Player isn't inside NPC's observer set!", npc.getObservers().contains(player.getOwner()));
Assert.assertTrue("Player isn't inside NPC's observer set!", npc.getObservers().contains(player1.getOwner()));
Assert.assertTrue(fireAndWait(1000, new DestroyObjectIntent(npc)));
Assert.assertFalse("Player is still inside NPC's observer set!", npc.getObservers().contains(player.getOwner()));
Assert.assertFalse("Player is still inside NPC's observer set!", npc.getObservers().contains(player1.getOwner()));
Assert.assertTrue(awareness.stop());
Assert.assertTrue(awareness.terminate());
}
@Test
public void testObjectAwarenessPlayerLogOut() {
/*
* Setup:
* 1) Player 1 is inside Cell #1
* 2) Player 2 is inside Cell #1
* 3) NPC is inside Cell #1
*/
player1.setPosition(Terrain.TATOOINE, 0, 0, 0);
player2.setPosition(Terrain.TATOOINE, 0, 0, 0);
building.setPosition(Terrain.TATOOINE, 10, 10, 10);
npc.setPosition(Terrain.TATOOINE, 0, 0, 0);
npc.moveToContainer(firstCell);
player1.moveToContainer(firstCell);
player2.moveToContainer(firstCell);
// Create service and start sending intents
ObjectAwareness awareness = new ObjectAwareness();
Assert.assertTrue(awareness.initialize());
Assert.assertTrue(awareness.start());
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(building)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(npc)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(player1)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(player2)));
// Check to make sure NPC is in awareness
Assert.assertTrue("Player1 isn't inside NPC's observer set!", npc.getObservers().contains(player1.getOwner()));
Assert.assertTrue("Player2 isn't inside NPC's observer set!", npc.getObservers().contains(player2.getOwner()));
Assert.assertTrue("Player2 isn't inside Player1's observer set!", player1.getObservers().contains(player2.getOwner()));
Assert.assertTrue("Player1 isn't inside Player2's observer set!", player2.getObservers().contains(player1.getOwner()));
Assert.assertTrue(fireAndWait(1000, new PlayerEventIntent(player2.getOwner(), PlayerEvent.PE_DISAPPEAR)));
Assert.assertTrue(fireAndWait(1000, new PlayerEventIntent(player2.getOwner(), PlayerEvent.PE_DESTROYED)));
Assert.assertFalse("Player2 is still inside Player1's observer set!", player1.getObservers().contains(player2.getOwner()));
Assert.assertFalse("Player2 is still inside NPC's observer set!", npc.getObservers().contains(player2.getOwner()));
Assert.assertTrue("Player1 isn't inside NPC's observer set! (round 2)", npc.getObservers().contains(player1.getOwner()));
Assert.assertTrue(fireAndWait(1000, new DestroyObjectIntent(npc)));
Assert.assertFalse("NPC is still inside Player1's observer set!", player1.getObservers().contains(npc.getOwner()));
Assert.assertFalse("Player2 is still inside Player1's observer set! (round 2)", player1.getObservers().contains(player2.getOwner()));
Assert.assertTrue(awareness.stop());
Assert.assertTrue(awareness.terminate());
}
@Test
public void testVehicleMount() {
CreatureObject vehicle = (CreatureObject) ObjectCreator.createObjectFromTemplate("object/mobile/vehicle/shared_barc_speeder.iff");
player1.setPosition(Terrain.TATOOINE, 3500, 5, -4800);
player2.setPosition(Terrain.TATOOINE, 3510, 5, -4810); // 12ish meters away
vehicle.setPosition(Terrain.TATOOINE, 3500, 5, -4800);
ObjectAwareness awareness = new ObjectAwareness();
Assert.assertTrue(awareness.initialize());
Assert.assertTrue(awareness.start());
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(player1)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(player2)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(vehicle)));
Assert.assertTrue("Player1 is not inside Player2's observer set!", player2.getObservers().contains(player1.getOwner()));
Assert.assertTrue("Player2 is not inside Player1's observer set!", player1.getObservers().contains(player2.getOwner()));
Assert.assertTrue("Vehicle is not inside Player1's awareness set!", player1.getObjectsAware().contains(vehicle));
Assert.assertTrue("Vehicle is not inside Player2's awareness set!", player2.getObjectsAware().contains(vehicle));
Assert.assertNull("Player1 is in a parent!", player1.getParent());
// Mount
Assert.assertTrue(fireAndWait(100, new ContainerTransferIntent(player1, vehicle)));
player1.setStatesBitmask(CreatureState.RIDING_MOUNT);
vehicle.setStatesBitmask(CreatureState.MOUNTED_CREATURE);
vehicle.setPosture(Posture.DRIVING_VEHICLE);
Assert.assertTrue("Player1 is not inside Player2's observer set!", player2.getObservers().contains(player1.getOwner()));
Assert.assertTrue("Player2 is not inside Player1's observer set!", player1.getObservers().contains(player2.getOwner()));
Assert.assertFalse("Vehicle is still inside Player1's awareness set!", player1.getObjectsAware().contains(vehicle));
Assert.assertTrue("Vehicle is not inside Player2's awareness set!", player2.getObjectsAware().contains(vehicle));
Assert.assertNotNull("Player1 is not in a parent!", player1.getParent());
Assert.assertEquals("Player1 is not mounted to the vehicle!", vehicle, player1.getParent());
Assert.assertTrue(fireAndWait(100, new MoveObjectIntent(player1, new Location(3510, 5, -4810, Terrain.TATOOINE), 7.3, 1)));
Assert.assertTrue("Player1 is not inside Player2's observer set!", player2.getObservers().contains(player1.getOwner()));
Assert.assertTrue("Player2 is not inside Player1's observer set!", player1.getObservers().contains(player2.getOwner()));
Assert.assertFalse("Vehicle is inside Player1's awareness set!", player1.getObjectsAware().contains(vehicle));
Assert.assertTrue("Vehicle is not inside Player2's awareness set!", player2.getObjectsAware().contains(vehicle));
Assert.assertNotNull("Player1 is not in a parent!", player1.getParent());
Assert.assertEquals("Player1 is not mounted to the vehicle!", vehicle, player1.getParent());
Assert.assertTrue(awareness.stop());
Assert.assertTrue(awareness.terminate());
}
@Test
public void testVehicleMove() {
CreatureObject vehicle = (CreatureObject) ObjectCreator.createObjectFromTemplate("object/mobile/vehicle/shared_barc_speeder.iff");
player1.setPosition(Terrain.TATOOINE, 3500, 5, -4800);
player2.setPosition(Terrain.TATOOINE, 3510, 5, -4810); // 12ish meters away
vehicle.setPosition(Terrain.TATOOINE, 3500, 5, -4800);
npc.setPosition(Terrain.TATOOINE, 3000, 5, 4000);
ObjectAwareness awareness = new ObjectAwareness();
Assert.assertTrue(awareness.initialize());
Assert.assertTrue(awareness.start());
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(player1)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(player2)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(npc)));
Assert.assertTrue(fireAndWait(100, new ObjectCreatedIntent(vehicle)));
Assert.assertTrue(fireAndWait(100, new ContainerTransferIntent(player1, vehicle)));
player1.setStatesBitmask(CreatureState.RIDING_MOUNT);
vehicle.setStatesBitmask(CreatureState.MOUNTED_CREATURE);
vehicle.setPosture(Posture.DRIVING_VEHICLE);
Assert.assertTrue("Player1 is not inside Player2's observer set!", player2.getObservers().contains(player1.getOwner()));
Assert.assertTrue("Player2 is not inside Player1's observer set!", player1.getObservers().contains(player2.getOwner()));
Assert.assertFalse("Vehicle is still inside Player1's awareness set!", player1.getObjectsAware().contains(vehicle));
Assert.assertTrue("Vehicle is not inside Player2's awareness set!", player2.getObjectsAware().contains(vehicle));
Assert.assertNotNull("Player1 is not in a parent!", player1.getParent());
Assert.assertEquals("Player1 is not mounted to the vehicle!", vehicle, player1.getParent());
Assert.assertTrue(fireAndWait(100, new MoveObjectIntent(player1, new Location(3000, 5, 4010, Terrain.TATOOINE), 7.3, 1)));
Assert.assertFalse("Player1 is still inside Player2's observer set!", player2.getObservers().contains(player1.getOwner()));
Assert.assertFalse("Player2 is still inside Player1's observer set!", player1.getObservers().contains(player2.getOwner()));
Assert.assertFalse("Vehicle is inside Player1's awareness set!", player1.getObjectsAware().contains(vehicle));
Assert.assertFalse("Vehicle is still inside Player2's awareness set!", player2.getObjectsAware().contains(vehicle));
Assert.assertNotNull("Player1 is not in a parent!", player1.getParent());
Assert.assertEquals("Player1 is not mounted to the vehicle!", vehicle, player1.getParent());
Assert.assertTrue("Player1 is not inside NPC's observer set!", npc.getObservers().contains(player1.getOwner()));
Assert.assertTrue("Vehicle is not inside NPC's awareness set!", npc.getObjectsAware().contains(vehicle));
Assert.assertTrue(awareness.stop());
Assert.assertTrue(awareness.terminate());
}