diff --git a/src/intents/object/ObjectCreateIntent.java b/src/intents/object/ObjectCreateIntent.java index 48cb6cfe9..317d7a9b4 100644 --- a/src/intents/object/ObjectCreateIntent.java +++ b/src/intents/object/ObjectCreateIntent.java @@ -34,26 +34,18 @@ import resources.objects.SWGObject; * Created by Waverunner on 8/19/2015 */ public class ObjectCreateIntent extends Intent { + public static final String TYPE = "ObjectCreateIntent"; private SWGObject object; - private boolean addToAwareness; - - public ObjectCreateIntent(SWGObject object, boolean addToAwareness) { - super(TYPE); - this.object = object; - this.addToAwareness = addToAwareness; - } public ObjectCreateIntent(SWGObject object) { - this(object, false); + super(TYPE); + this.object = object; } - + public SWGObject getObject() { return object; } - - public boolean isAddToAwareness() { - return addToAwareness; - } + } \ No newline at end of file diff --git a/src/resources/commands/callbacks/RequestWaypointCmdCallback.java b/src/resources/commands/callbacks/RequestWaypointCmdCallback.java index 585eeef1a..30c285b14 100644 --- a/src/resources/commands/callbacks/RequestWaypointCmdCallback.java +++ b/src/resources/commands/callbacks/RequestWaypointCmdCallback.java @@ -62,7 +62,7 @@ public class RequestWaypointCmdCallback implements ICmdCallback { String name = (cmd.length == 6 ? cmd[5] : "@planet_n:" + terrain.getName()); - WaypointObject waypoint = (WaypointObject) galacticManager.getObjectManager().createObject("object/waypoint/shared_waypoint.iff", false); + WaypointObject waypoint = (WaypointObject) galacticManager.getObjectManager().createObject("object/waypoint/shared_waypoint.iff"); waypoint.setLocation(new Location(x, y, z, terrain)); waypoint.setName(name.isEmpty() ? "@planet_n:" + terrain.getName() : name); if (color != null) diff --git a/src/resources/objects/buildouts/BuildoutArea.java b/src/resources/objects/buildouts/SwgBuildoutArea.java similarity index 100% rename from src/resources/objects/buildouts/BuildoutArea.java rename to src/resources/objects/buildouts/SwgBuildoutArea.java diff --git a/src/resources/objects/buildouts/BuildoutRow.java b/src/resources/objects/buildouts/SwgBuildoutRow.java similarity index 100% rename from src/resources/objects/buildouts/BuildoutRow.java rename to src/resources/objects/buildouts/SwgBuildoutRow.java diff --git a/src/resources/objects/buildouts/TerrainBuildoutLoader.java b/src/resources/objects/buildouts/TerrainBuildoutLoader.java index ed98d0dbd..78196b9b8 100644 --- a/src/resources/objects/buildouts/TerrainBuildoutLoader.java +++ b/src/resources/objects/buildouts/TerrainBuildoutLoader.java @@ -77,7 +77,7 @@ class TerrainBuildoutLoader { String file = BASE_PATH+"areas_"+terrain.getName()+".iff"; DatatableData areaTable = (DatatableData) ClientFactory.getInfoFromFile(file); for (int row = 0; row < areaTable.getRowCount(); row++) { - BuildoutArea area = new BuildoutArea(); + SwgBuildoutArea area = new SwgBuildoutArea(); area.load(areaTable.getRow(row), sceneNumber, row); if (!area.getName().startsWith(terrain.getName())) continue; @@ -85,10 +85,10 @@ class TerrainBuildoutLoader { } } - private void loadArea(BuildoutArea area) { + private void loadArea(SwgBuildoutArea area) { String file = BASE_PATH+terrain.getName()+"/"+area.getName().replace("server", "client")+".iff"; DatatableData areaTable = (DatatableData) ClientFactory.getInfoFromFile(file); - BuildoutRow buildoutRow = new BuildoutRow(area); + SwgBuildoutRow buildoutRow = new SwgBuildoutRow(area); for (int row = 0; row < areaTable.getRowCount(); row++) { buildoutRow.load(areaTable.getRow(row), crcTable); SWGObject object = createObject(buildoutRow); @@ -101,7 +101,7 @@ class TerrainBuildoutLoader { } } - private SWGObject createObject(BuildoutRow row) { + private SWGObject createObject(SwgBuildoutRow row) { SWGObject object = ObjectCreator.createObjectFromTemplate(row.getObjectId(), row.getTemplate()); Location l = row.getLocation(); l.setTerrain(terrain); diff --git a/src/services/objects/BuildoutAreaService.java b/src/services/objects/BuildoutAreaService.java index 6a0dfdad5..37ffcd356 100644 --- a/src/services/objects/BuildoutAreaService.java +++ b/src/services/objects/BuildoutAreaService.java @@ -1,5 +1,7 @@ package services.objects; +import intents.player.PlayerTransformedIntent; +import resources.control.Intent; import resources.control.Service; import resources.server_info.RelationalServerData; @@ -15,8 +17,25 @@ public class BuildoutAreaService extends Service { @Override public boolean initialize() { + registerForIntent(PlayerTransformedIntent.TYPE); boolean success = clientSdb.linkTableWithSdb("areas", FILE_PREFIX+"areas.sdb"); return super.initialize() && success; } + @Override + public void onIntentReceived(Intent i) { + switch (i.getType()) { + case PlayerTransformedIntent.TYPE: + if (i instanceof PlayerTransformedIntent) + handlePlayerTransform((PlayerTransformedIntent) i); + break; + default: + break; + } + } + + private void handlePlayerTransform(PlayerTransformedIntent pti) { + + } + } diff --git a/src/services/objects/ObjectAwareness.java b/src/services/objects/ObjectAwareness.java index 66097e77a..1a5fcdfde 100644 --- a/src/services/objects/ObjectAwareness.java +++ b/src/services/objects/ObjectAwareness.java @@ -27,6 +27,10 @@ ***********************************************************************************/ package services.objects; +import intents.PlayerEventIntent; +import intents.object.ObjectCreateIntent; +import intents.object.ObjectCreatedIntent; + import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -36,10 +40,14 @@ import java.util.Set; import network.packets.swg.zone.UpdateContainmentMessage; import resources.Location; import resources.Terrain; +import resources.control.Intent; +import resources.control.Service; import resources.objects.SWGObject; +import resources.objects.creature.CreatureObject; import resources.objects.quadtree.QuadTree; +import resources.player.Player; -public class ObjectAwareness { +public class ObjectAwareness extends Service { private static final double AWARE_RANGE = 1024; @@ -49,11 +57,73 @@ public class ObjectAwareness { quadTree = new HashMap>(); } + @Override public boolean initialize() { + registerForIntent(PlayerEventIntent.TYPE); + registerForIntent(ObjectCreateIntent.TYPE); + registerForIntent(ObjectCreatedIntent.TYPE); loadQuadTree(); return true; } + @Override + public void onIntentReceived(Intent i) { + switch (i.getType()) { + case PlayerEventIntent.TYPE: + if (i instanceof PlayerEventIntent) + handlePlayerEventIntent((PlayerEventIntent) i); + break; + case ObjectCreateIntent.TYPE: + if (i instanceof ObjectCreateIntent) + handleObjectCreateIntent((ObjectCreateIntent) i); + break; + case ObjectCreatedIntent.TYPE: + if (i instanceof ObjectCreatedIntent) + handleObjectCreatedIntent((ObjectCreatedIntent) i); + default: + break; + } + } + + private void handlePlayerEventIntent(PlayerEventIntent pei) { + Player p = pei.getPlayer(); + CreatureObject creature = p.getCreatureObject(); + if (creature == null) + return; + switch (pei.getEvent()) { + case PE_DISAPPEAR: + creature.clearAware(); + remove(creature); + for (SWGObject obj : creature.getObservers()) + creature.destroyObject(obj.getOwner()); + creature.setOwner(null); + p.setCreatureObject(null); + break; + case PE_FIRST_ZONE: + if (creature.getParent() == null) + creature.createObject(p); + break; + case PE_ZONE_IN: + creature.clearAware(); + update(creature); + break; + default: + break; + } + } + + private void handleObjectCreateIntent(ObjectCreateIntent oci) { + SWGObject obj = oci.getObject(); + if (obj.getParent() == null) + add(obj); + } + + private void handleObjectCreatedIntent(ObjectCreatedIntent oci) { + SWGObject obj = oci.getObject(); + if (obj.getParent() == null) + add(obj); + } + private void loadQuadTree() { for (Terrain t : Terrain.values()) { quadTree.put(t, new QuadTree(16, -8192, -8192, 8192, 8192)); diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 4bc408d59..54e0dc0b8 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -42,6 +42,7 @@ import intents.object.ObjectIdRequestIntent; import intents.object.ObjectIdResponseIntent; import intents.object.ObjectTeleportIntent; import intents.player.DeleteCharacterIntent; +import intents.player.PlayerTransformedIntent; import intents.PlayerEventIntent; import intents.RequestZoneInIntent; import intents.network.GalacticPacketIntent; @@ -79,30 +80,35 @@ import services.spawn.StaticService; public class ObjectManager extends Manager { + private final ObjectAwareness objectAwareness; private final MapManager mapManager; private final StaticService staticService; private final SpawnerService spawnerService; private final RadialService radialService; + private final BuildoutAreaService buildoutAreaService; private final ObjectDatabase database; - private final ObjectAwareness objectAwareness; private final Map objectMap; private long maxObjectId; public ObjectManager() { + objectAwareness = new ObjectAwareness(); mapManager = new MapManager(); staticService = new StaticService(this); spawnerService = new SpawnerService(this); radialService = new RadialService(); + buildoutAreaService = new BuildoutAreaService(); + database = new CachedObjectDatabase("odb/objects.db"); - objectAwareness = new ObjectAwareness(); objectMap = new Hashtable<>(16*1024); maxObjectId = 1; + addChildService(objectAwareness); addChildService(mapManager); addChildService(staticService); addChildService(radialService); addChildService(spawnerService); + addChildService(buildoutAreaService); } @Override @@ -113,10 +119,10 @@ public class ObjectManager extends Manager { registerForIntent(ObjectIdRequestIntent.TYPE); registerForIntent(ObjectCreateIntent.TYPE); registerForIntent(DeleteCharacterIntent.TYPE); - objectAwareness.initialize(); + boolean init = super.initialize(); loadClientObjects(); loadObjects(); - return super.initialize(); + return init; } private void loadObjects() { @@ -186,24 +192,18 @@ public class ObjectManager extends Manager { objectAwareness.add(obj); if (obj instanceof CreatureObject && ((CreatureObject) obj).getPlayerObject() != null) { if (!obj.hasSlot("bank")) { - SWGObject missing = createObject("object/tangible/bank/shared_character_bank.iff", false); - + SWGObject missing = createObject(obj, "object/tangible/bank/shared_character_bank.iff", false); missing.setContainerPermissions(ContainerPermissions.INVENTORY); - obj.addObject(missing); } if (!obj.hasSlot("mission_bag")) { - SWGObject missing = createObject("object/tangible/mission_bag/shared_mission_bag.iff", false); - + SWGObject missing = createObject(obj, "object/tangible/mission_bag/shared_mission_bag.iff", false); missing.setContainerPermissions(ContainerPermissions.INVENTORY); - obj.addObject(missing); } if (!obj.hasSlot("appearance_inventory")) { - SWGObject missing = createObject("object/tangible/inventory/shared_appearance_inventory.iff", false); - + SWGObject missing = createObject(obj, "object/tangible/inventory/shared_appearance_inventory.iff", false); missing.setContainerPermissions(ContainerPermissions.INVENTORY); - obj.addObject(missing); } } objectMap.put(obj.getObjectId(), obj); @@ -254,7 +254,6 @@ public class ObjectManager extends Manager { if (p.getCreatureObject() == null) break; p.getCreatureObject().clearAware(); - objectAwareness.remove(p.getCreatureObject()); for (SWGObject obj : p.getCreatureObject().getObservers()) p.getCreatureObject().destroyObject(obj.getOwner()); p.getCreatureObject().setOwner(null); @@ -266,7 +265,6 @@ public class ObjectManager extends Manager { break; case PE_ZONE_IN: p.getCreatureObject().clearAware(); - objectAwareness.update(p.getCreatureObject()); break; default: break; @@ -284,11 +282,6 @@ public class ObjectManager extends Manager { private void processObjectCreateIntent(ObjectCreateIntent intent) { SWGObject object = intent.getObject(); - - if (intent.isAddToAwareness()) { - objectAwareness.add(object); - } - objectMap.put(object.getObjectId(), object); } @@ -398,24 +391,32 @@ public class ObjectManager extends Manager { return object; } - + public SWGObject createObject(String template) { return createObject(template, null); } - public SWGObject createObject(String template, boolean addToAwareness) { - return createObject(template, null, addToAwareness); + public SWGObject createObject(SWGObject parent, String template) { + return createObject(parent, template, null); } public SWGObject createObject(String template, Location l) { return createObject(template, l, true); } - public SWGObject createObject(String template, Location l, boolean addToAwareness) { - return createObject(template, l, addToAwareness, true); + public SWGObject createObject(SWGObject parent, String template, boolean addToDatabase) { + return createObject(parent, template, null, addToDatabase); } - public SWGObject createObject(String template, Location l, boolean addToAwareness, boolean addToDatabase) { + public SWGObject createObject(SWGObject parent, String template, Location l) { + return createObject(parent, template, l, true); + } + + public SWGObject createObject(String template, Location l, boolean addToDatabase) { + return createObject(null, template, l, addToDatabase); + } + + public SWGObject createObject(SWGObject parent, String template, Location l, boolean addToDatabase) { synchronized (objectMap) { long objectId = getNextObjectId(); SWGObject obj = ObjectCreator.createObjectFromTemplate(objectId, template); @@ -424,10 +425,10 @@ public class ObjectManager extends Manager { return null; } obj.setLocation(l); - if (addToAwareness) { - objectAwareness.add(obj); - } objectMap.put(objectId, obj); + if (parent != null) { + parent.addObject(obj); + } if (addToDatabase) { database.put(objectId, obj); } @@ -442,6 +443,8 @@ public class ObjectManager extends Manager { return; Location newLocation = transform.getLocation(); newLocation.setTerrain(obj.getTerrain()); + if (obj instanceof CreatureObject) + new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), null, obj.getLocation(), newLocation).broadcast(); objectAwareness.move(obj, newLocation); obj.sendDataTransforms(transform); @@ -458,6 +461,8 @@ public class ObjectManager extends Manager { Log.e("ObjectManager", "Could not find parent for transform! Cell: %d Object: %s", transformWithParent.getCellId(), obj); return; } + if (obj instanceof CreatureObject) + new PlayerTransformedIntent((CreatureObject) obj, obj.getParent(), parent, obj.getLocation(), newLocation).broadcast(); objectAwareness.move(obj, parent, newLocation); obj.sendParentDataTransforms(transformWithParent); } diff --git a/src/services/player/CharacterCreationService.java b/src/services/player/CharacterCreationService.java index 464feab9c..b0a7a27e5 100644 --- a/src/services/player/CharacterCreationService.java +++ b/src/services/player/CharacterCreationService.java @@ -307,8 +307,6 @@ public class CharacterCreationService extends Service { if (creatureObj == null) return -1; PlayerObject playerObj = createPlayer(objManager, "object/player/shared_player.iff"); - SWGObject bankObj = objManager.createObject("object/tangible/bank/shared_character_bank.iff", false); - SWGObject missionObj = objManager.createObject("object/tangible/mission_bag/shared_mission_bag.iff", false); setCreatureObjectValues(objManager, creatureObj, create); setPlayerObjectValues(playerObj, create); @@ -318,8 +316,6 @@ public class CharacterCreationService extends Service { creatureObj.setVolume(0x000F4240); creatureObj.setOwner(player); creatureObj.addObject(playerObj); // ghost slot - creatureObj.addObject(bankObj); - creatureObj.addObject(missionObj); playerObj.setAdminTag(player.getAccessLevel()); player.setCreatureObject(creatureObj); return creatureObj.getObjectId(); @@ -373,6 +369,12 @@ public class CharacterCreationService extends Service { return null; } + private SWGObject createInventoryObject(ObjectManager objManager, CreatureObject creatureObj, String template) { + SWGObject obj = objManager.createObject(creatureObj, template); + obj.setContainerPermissions(ContainerPermissions.INVENTORY); + return obj; + } + private void createHair(ObjectManager objManager, CreatureObject creatureObj, String hair, byte [] customization) { if (hair.isEmpty()) return; @@ -384,15 +386,6 @@ public class CharacterCreationService extends Service { } private void setCreatureObjectValues(ObjectManager objManager, CreatureObject creatureObj, ClientCreateCharacter create) { - TangibleObject inventory = createTangible(objManager, "object/tangible/inventory/shared_character_inventory.iff"); - inventory.setContainerPermissions(ContainerPermissions.INVENTORY); - TangibleObject datapad = createTangible(objManager, "object/tangible/datapad/shared_character_datapad.iff"); - datapad.setContainerPermissions(ContainerPermissions.INVENTORY); - TangibleObject apprncInventory = createTangible(objManager, "object/tangible/inventory/shared_appearance_inventory.iff"); - apprncInventory.setContainerPermissions(ContainerPermissions.INVENTORY); - TangibleObject safetyDeposit = createTangible(objManager, "object/tangible/bank/shared_character_bank.iff"); - safetyDeposit.setContainerPermissions(ContainerPermissions.INVENTORY); - creatureObj.setRace(Race.getRaceByFile(create.getRace())); creatureObj.setAppearanceData(create.getCharCustomization()); creatureObj.setHeight(create.getHeight()); @@ -400,15 +393,12 @@ public class CharacterCreationService extends Service { creatureObj.setPvpFlags(PvpFlag.PLAYER, PvpFlag.OVERT); creatureObj.getSkills().add("species_" + creatureObj.getRace().getSpecies()); - creatureObj.addObject(inventory); // slot = inventory - creatureObj.addObject(datapad); // slot = datapad - creatureObj.addObject(apprncInventory); // slot = appearance_inventory - creatureObj.addObject(safetyDeposit); // slot = bank + creatureObj.addEquipment(createInventoryObject(objManager, creatureObj, "object/tangible/inventory/shared_character_inventory.iff")); + creatureObj.addEquipment(createInventoryObject(objManager, creatureObj, "object/tangible/datapad/shared_character_datapad.iff")); + creatureObj.addEquipment(createInventoryObject(objManager, creatureObj, "object/tangible/inventory/shared_appearance_inventory.iff")); + createInventoryObject(objManager, creatureObj, "object/tangible/bank/shared_character_bank.iff"); + createInventoryObject(objManager, creatureObj, "object/tangible/mission_bag/shared_mission_bag.iff"); - creatureObj.addEquipment(inventory); - creatureObj.addEquipment(datapad); - creatureObj.addEquipment(apprncInventory); - creatureObj.joinPermissionGroup("world"); } diff --git a/src/services/spawn/SpawnerService.java b/src/services/spawn/SpawnerService.java index d05409d44..0a4552e3d 100644 --- a/src/services/spawn/SpawnerService.java +++ b/src/services/spawn/SpawnerService.java @@ -74,6 +74,8 @@ public final class SpawnerService extends Service { @Override public void onIntentReceived(Intent i) { + if (!(i instanceof ConfigChangedIntent)) + return; ConfigChangedIntent cgi = (ConfigChangedIntent) i; String newValue, oldValue; @@ -100,21 +102,23 @@ public final class SpawnerService extends Service { } private void loadSpawners() { - try(ResultSet jointTable = spawnerDatabase.prepareStatement(GET_ALL_SPAWNERS_SQL).executeQuery()) { + try (ResultSet jointTable = spawnerDatabase.prepareStatement(GET_ALL_SPAWNERS_SQL).executeQuery()) { while (jointTable.next()) { - if(jointTable.getBoolean("active")) { + if (jointTable.getBoolean("active")) { Location loc = new Location(jointTable.getFloat("x"), jointTable.getFloat("y"), jointTable.getFloat("z"), Terrain.valueOf(jointTable.getString("terrain_name"))); SpawnerType spawnerType = SpawnerType.valueOf(jointTable.getString("spawner_type")); long objectId = jointTable.getLong("object_id"); - long cellId = jointTable.getLong("cell_id"); - final boolean spawnInCell = cellId > 0; + int cellId = jointTable.getInt("cell_id"); loc.setOrientation(jointTable.getFloat("oX"), jointTable.getFloat("oY"), jointTable.getFloat("oZ"), jointTable.getFloat("oW")); - final SWGObject egg = objectManager.createObject(spawnerType.getObjectTemplate(), loc, !spawnInCell, false); + SWGObject parent = null; + if (cellId > 0) { + parent = objectManager.getObjectById(objectId); + if (parent instanceof BuildingObject) + parent = ((BuildingObject) parent).getCellByNumber(cellId); + } + SWGObject egg = objectManager.createObject(parent, spawnerType.getObjectTemplate(), loc, false); - if(spawnInCell) - ((BuildingObject) objectManager.getObjectById(objectId)).getCellByNumber(jointTable.getInt("cell_id")).addObject(egg); - spawners.add(new Spawner(egg)); } } diff --git a/src/services/spawn/StaticService.java b/src/services/spawn/StaticService.java index c007189df..b7cb68866 100644 --- a/src/services/spawn/StaticService.java +++ b/src/services/spawn/StaticService.java @@ -111,16 +111,14 @@ public class StaticService extends Service { private SWGObject createObject(String iff, SWGObject parent, double x, double y, double z, double heading) { Location loc = new Location(x, y, z, parent.getTerrain()); loc.setHeading(heading); - SWGObject obj = objectManager.createObject(iff, loc, false, false); - parent.addObject(obj); - return obj; + return objectManager.createObject(parent, iff, loc, false); } private SWGObject createObject(String iff, Location parentLoc, double x, double y, double z, double heading) { Location loc = new Location(x, y, z, parentLoc.getTerrain()); loc.setHeading(heading); loc.translateLocation(parentLoc); - return objectManager.createObject(iff, loc, true, false); + return objectManager.createObject(iff, loc, false); } } diff --git a/src/utilities/BuildoutGenerator.java b/src/utilities/BuildoutGenerator.java index e29d5054b..4ea542ce1 100644 --- a/src/utilities/BuildoutGenerator.java +++ b/src/utilities/BuildoutGenerator.java @@ -14,7 +14,7 @@ import resources.client_info.ClientFactory; import resources.client_info.visitors.CrcStringTableData; import resources.client_info.visitors.DatatableData; import resources.objects.SWGObject; -import resources.objects.buildouts.BuildoutArea; +import resources.objects.buildouts.SwgBuildoutArea; import resources.objects.buildouts.BuildoutLoader; import resources.objects.buildouts.SnapshotLoader; import resources.objects.cell.CellObject; @@ -114,7 +114,7 @@ public class BuildoutGenerator { String file = "datatables/buildout/areas_"+t.getName()+".iff"; DatatableData areaTable = (DatatableData) ClientFactory.getInfoFromFile(file); for (int row = 0; row < areaTable.getRowCount(); row++) { - BuildoutArea area = new BuildoutArea(); + SwgBuildoutArea area = new SwgBuildoutArea(); area.load(areaTable.getRow(row), sceneRow, row); areas.add(new GenBuildoutArea(area, t, area.getX1(), area.getZ1(), area.getX2(), area.getZ2(), sceneRow*100+row, adjust)); } @@ -166,7 +166,7 @@ public class BuildoutGenerator { } private static class GenBuildoutArea implements Comparable { - public final BuildoutArea area; + public final SwgBuildoutArea area; public final Terrain terrain; public final int x1; public final int z1; @@ -175,7 +175,7 @@ public class BuildoutGenerator { public final int id; public final boolean adjust; - public GenBuildoutArea(BuildoutArea area, Terrain terrain, double x1, double z1, double x2, double z2, int id, boolean adjust) { + public GenBuildoutArea(SwgBuildoutArea area, Terrain terrain, double x1, double z1, double x2, double z2, int id, boolean adjust) { this.area = area; this.terrain = terrain; this.x1 = (int) x1;