diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index 94480c053..ff75523c4 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -38,6 +38,7 @@ import network.packets.swg.zone.baselines.Baseline.BaselineType; import network.packets.swg.zone.object_controller.DataTransform; import network.packets.swg.zone.object_controller.DataTransformWithParent; import resources.Location; +import resources.Terrain; import resources.common.CRC; import resources.containers.ContainerPermissions; import resources.containers.ContainerResult; @@ -447,6 +448,22 @@ public abstract class SWGObject implements Serializable, Comparable { return loc; } + public double getX() { + return location.getX(); + } + + public double getY() { + return location.getY(); + } + + public double getZ() { + return location.getZ(); + } + + public Terrain getTerrain() { + return location.getTerrain(); + } + public String getName() { return objectName; } diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index 9847c327f..e03c0bda2 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -27,6 +27,7 @@ ***********************************************************************************/ package services.objects; +import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -50,9 +51,9 @@ import resources.config.ConfigFile; import resources.control.Intent; import resources.control.Manager; import resources.objects.SWGObject; +import resources.objects.building.BuildingObject; import resources.objects.buildouts.BuildoutLoader; import resources.objects.buildouts.SnapshotLoader; -import resources.objects.cell.CellObject; import resources.objects.creature.CreatureObject; import resources.objects.tangible.TangibleObject; import resources.player.Player; @@ -64,10 +65,12 @@ import resources.server_info.ObjectDatabase; import resources.server_info.ObjectDatabase.Traverser; import services.map.MapService; import services.player.PlayerManager; +import services.spawn.StaticService; public class ObjectManager extends Manager { private final MapService mapService; + private final StaticService staticService; private final ObjectDatabase database; private final ObjectAwareness objectAwareness; @@ -76,15 +79,18 @@ public class ObjectManager extends Manager { public ObjectManager() { mapService = new MapService(); + staticService = new StaticService(this); database = new CachedObjectDatabase("odb/objects.db"); objectAwareness = new ObjectAwareness(); objectMap = new HashMap<>(); maxObjectId = 1; + + addChildService(mapService); + addChildService(staticService); } @Override public boolean initialize() { - addChildService(mapService); registerForIntent(GalacticPacketIntent.TYPE); registerForIntent(PlayerEventIntent.TYPE); registerForIntent(ObjectTeleportIntent.TYPE); @@ -110,6 +116,9 @@ public class ObjectManager extends Manager { } } }); + for (SWGObject obj : new ArrayList<>(objectMap.values())) { + staticService.createSupportingObjects(obj); + } double loadTime = (System.nanoTime() - startLoad) / 1E6; Log.i("ObjectManager", "Finished loading %d objects. Time: %fms", database.size(), loadTime); System.out.printf("ObjectManager: Finished loading %d objects. Time: %fms%n", database.size(), loadTime); @@ -178,7 +187,7 @@ public class ObjectManager extends Manager { } private void loadBuildout(SWGObject obj) { - if (obj instanceof TangibleObject || obj instanceof CellObject) { + if (obj instanceof TangibleObject || obj instanceof BuildingObject) { objectAwareness.add(obj); } if (obj.getObjectId() >= maxObjectId) { @@ -188,7 +197,7 @@ public class ObjectManager extends Manager { } private void loadSnapshot(SWGObject obj) { - if (obj instanceof TangibleObject || obj instanceof CellObject) { + if (obj instanceof TangibleObject || obj instanceof BuildingObject) { objectAwareness.add(obj); } if (obj.getObjectId() >= maxObjectId) { @@ -253,7 +262,7 @@ public class ObjectManager extends Manager { default: break; } - }else if(i instanceof ObjectTeleportIntent){ + } else if (i instanceof ObjectTeleportIntent) { processObjectTeleportIntent((ObjectTeleportIntent) i); } } @@ -362,6 +371,10 @@ public class ObjectManager extends Manager { } public SWGObject createObject(String template, Location l, boolean addToAwareness) { + return createObject(template, l, addToAwareness, true); + } + + public SWGObject createObject(String template, Location l, boolean addToAwareness, boolean addToDatabase) { synchronized (objectMap) { long objectId = getNextObjectId(); SWGObject obj = ObjectCreator.createObjectFromTemplate(objectId, template); @@ -374,7 +387,9 @@ public class ObjectManager extends Manager { objectAwareness.add(obj); } objectMap.put(objectId, obj); - database.put(objectId, obj); + if (addToDatabase) { + database.put(objectId, obj); + } Log.i("ObjectManager", "Created object %d [%s]", obj.getObjectId(), obj.getTemplate()); return obj; } diff --git a/src/services/spawn/StaticService.java b/src/services/spawn/StaticService.java new file mode 100644 index 000000000..d626fe795 --- /dev/null +++ b/src/services/spawn/StaticService.java @@ -0,0 +1,98 @@ +package services.spawn; + +import resources.Location; +import resources.Terrain; +import resources.control.Service; +import resources.objects.SWGObject; +import resources.objects.building.BuildingObject; +import resources.objects.cell.CellObject; +import services.objects.ObjectManager; + +public class StaticService extends Service { + + private static final String TICKET_TERMINAL_IFF = "object/tangible/terminal/shared_terminal_travel.iff"; + private static final String BANK_TERMINAL_IFF = "object/tangible/terminal/shared_terminal_bank.iff"; + private static final String PLAYER_TRANSPORT_IFF = "object/creature/npc/theme_park/shared_player_transport.iff"; + private static final String PLAYER_SHUTTLE_IFF = "object/creature/npc/theme_park/shared_player_shuttle.iff"; + private static final String TICKET_COLLECTOR_IFF = "object/tangible/travel/ticket_collector/shared_ticket_collector.iff"; + + private final ObjectManager objectManager; + + public StaticService(ObjectManager objectManager) { + this.objectManager = objectManager; + } + + @Override + public boolean initialize() { + return super.initialize(); + } + + public void createSupportingObjects(SWGObject object) { + switch (object.getTemplate()) { + case "object/building/tatooine/shared_bank_tatooine.iff": + createBankSetup(object); + break; + case "object/building/tatooine/shared_starport_tatooine.iff": + case "object/building/naboo/shared_starport_naboo.iff": + case "object/building/corellia/shared_starport_corellia.iff": + if (!(object instanceof BuildingObject)) { + System.err.println(object.getTemplate() + " is not a building!"); + break; + } + createGeneralStarportSetup((BuildingObject) object); + break; + case "object/building/tatooine/shared_shuttleport_tatooine.iff": + case "object/building/naboo/shared_shuttleport_naboo.iff": + case "object/building/corellia/shared_shuttleport_corellia.iff": + case "object/building/naboo/rori_restuss_shuttleport.iff": + if (!(object instanceof BuildingObject)) { + System.err.println(object.getTemplate() + " is not a building!"); + break; + } + createShuttleport((BuildingObject) object); + break; + } + } + + private void createBankSetup(SWGObject bank) { + Location bankLoc = bank.getWorldLocation(); + createObject(BANK_TERMINAL_IFF, bankLoc, 0, 0.52, 4.3, 0); + createObject(BANK_TERMINAL_IFF, bankLoc, 0, 0.52, -4.3, 180); + createObject(BANK_TERMINAL_IFF, bankLoc, 4.3, 0.52, 0, 90); + createObject(TICKET_TERMINAL_IFF, bankLoc, -4.3, 0.52, 0, -90); + } + + private void createGeneralStarportSetup(BuildingObject starport) { + CellObject foyer4 = starport.getCellByName("foyer4"); + Location starportLoc = starport.getWorldLocation(); + createObject(TICKET_TERMINAL_IFF, foyer4, 11.255, 0.64, 51.64, -35); + createObject(TICKET_TERMINAL_IFF, foyer4, 2.52, 0.64, 50.02, 0); + createObject(TICKET_TERMINAL_IFF, foyer4, -3.23, 0.64, 50.05, 0); + createObject(TICKET_TERMINAL_IFF, foyer4, -12.71, 0.64, 52.04, 35); + createObject(PLAYER_TRANSPORT_IFF, starportLoc, 1.72, 0.6, -5.06, 180); + createObject(TICKET_COLLECTOR_IFF, starportLoc, -7.92, 0.6, 4.75, 90); + } + + private void createShuttleport(BuildingObject shuttleport) { + Location shuttleportLoc = shuttleport.getWorldLocation(); + createObject(TICKET_TERMINAL_IFF, shuttleportLoc, 13.3, 0.6, 9.4, 270); + createObject(PLAYER_SHUTTLE_IFF, shuttleportLoc, 0, 1.6, -5, 180); + createObject(TICKET_COLLECTOR_IFF, shuttleportLoc, 13.3, 0.6, -9.4, 270); + } + + 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, true, false); + parent.addObject(obj); + return obj; + } + + 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 = loc.translate(parentLoc); + return objectManager.createObject(iff, loc, true, false); + } + +}