From 001f9a40e9ad0519024fd900b734bb8e2b80bd72 Mon Sep 17 00:00:00 2001 From: FateJH Date: Sat, 10 Mar 2018 21:18:27 -0500 Subject: [PATCH] Anguta, Ceryshen, the Anguta Watchower, and Anguta's two bunkers have had their amenities wired together, excluding the door locks being connected to doors. Modified how things like spectator status, fly status and speed persist. --- .../psforever/objects/GlobalDefinitions.scala | 4 +- .../scala/net/psforever/objects/Player.scala | 8 - .../serverobject/ServerObjectBuilder.scala | 8 +- .../serverobject/structures/Building.scala | 18 +- .../terminals/SpawnTerminalDefinition.scala | 15 + .../objects/serverobject/tube/SpawnTube.scala | 38 +- .../net/psforever/objects/zones/Zone.scala | 15 +- .../psforever/objects/zones/ZoneActor.scala | 10 +- .../net/psforever/objects/zones/ZoneMap.scala | 13 +- .../src/test/scala/objects/PlayerTest.scala | 9 - pslogin/src/main/scala/Maps.scala | 399 ++++++++++++++---- .../src/main/scala/WorldSessionActor.scala | 121 ++++-- pslogin/src/main/scala/Zones.scala | 7 +- 13 files changed, 490 insertions(+), 175 deletions(-) create mode 100644 common/src/main/scala/net/psforever/objects/serverobject/terminals/SpawnTerminalDefinition.scala diff --git a/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala b/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala index 14c8fbfe..fd0f8f87 100644 --- a/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala +++ b/common/src/main/scala/net/psforever/objects/GlobalDefinitions.scala @@ -509,6 +509,8 @@ object GlobalDefinitions { val vehicle_terminal_combined = new VehicleTerminalCombinedDefinition + val spawn_terminal = new SpawnTerminalDefinition + val spawn_pad = new VehicleSpawnPadDefinition val mb_locker = new LockerDefinition @@ -643,7 +645,7 @@ object GlobalDefinitions { * @param faction the faction * @return the `ToolDefinition` for the launcher */ - def AntiVehicular(faction : PlanetSideEmpire.Value) : ToolDefinition = { + def AntiVehicularLauncher(faction : PlanetSideEmpire.Value) : ToolDefinition = { faction match { case PlanetSideEmpire.TR => striker case PlanetSideEmpire.NC => hunterseeker diff --git a/common/src/main/scala/net/psforever/objects/Player.scala b/common/src/main/scala/net/psforever/objects/Player.scala index 6da1a64c..f2a01282 100644 --- a/common/src/main/scala/net/psforever/objects/Player.scala +++ b/common/src/main/scala/net/psforever/objects/Player.scala @@ -62,7 +62,6 @@ class Player(private val name : String, private var backpackAccess : Option[PlanetSideGUID] = None private var admin : Boolean = false - private var spectator : Boolean = false private var vehicleSeated : Option[PlanetSideGUID] = None private var vehicleOwned : Option[PlanetSideGUID] = None @@ -526,8 +525,6 @@ class Player(private val name : String, def Admin : Boolean = admin - def Spectator : Boolean = spectator - def VehicleSeated : Option[PlanetSideGUID] = vehicleSeated def VehicleSeated_=(guid : PlanetSideGUID) : Option[PlanetSideGUID] = VehicleSeated_=(Some(guid)) @@ -616,11 +613,6 @@ object Player { player } - def Spectate(player : Player, isSpectator : Boolean) : Player = { - player.spectator = isSpectator - player - } - def Release(player : Player) : Player = { if(player.Release) { val obj = new Player(player.Name, player.Faction, player.Sex, player.Voice, player.Head) diff --git a/common/src/main/scala/net/psforever/objects/serverobject/ServerObjectBuilder.scala b/common/src/main/scala/net/psforever/objects/serverobject/ServerObjectBuilder.scala index abc00e16..de9d15c8 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/ServerObjectBuilder.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/ServerObjectBuilder.scala @@ -18,7 +18,7 @@ import net.psforever.objects.guid.NumberPoolHub * a closed number space, which is also the `Zone`. * It utilizes those qualities of the enclosing region to construct the entity within that region.
*
- * Example: `ServerObjectBuilder(n, function)` + * Example: `ServerObjectBuilder(n, function)`
* Example: `new ServerBuilderObject[A](n, function)`, where `function` is a `(Int,Context)=>A` * @see `ZoneMap` * @see `Zone.Init` @@ -28,7 +28,7 @@ import net.psforever.objects.guid.NumberPoolHub * can be inferred from the output of `constructor` */ class ServerObjectBuilder[A <: PlanetSideServerObject](private val id : Int, - private val constructor : (Int, ActorContext) => A + private val constructor : ServerObjectBuilder.ConstructorType[A] ) { /** * Instantiate and configure the given server object. @@ -49,6 +49,8 @@ class ServerObjectBuilder[A <: PlanetSideServerObject](private val id : Int, } object ServerObjectBuilder { + type ConstructorType[A <: PlanetSideServerObject] = (Int, ActorContext)=>A + /** * Overloaded constructor. * @param id the unqiue id that will be assigned to this entity @@ -56,7 +58,7 @@ object ServerObjectBuilder { * @tparam A any object that extends from PlanetSideServerObject that will be produced by this class * @return a `ServerObjectBuilder` object */ - def apply[A <: PlanetSideServerObject](id : Int, constructor : (Int, ActorContext) => A) : ServerObjectBuilder[A] = { + def apply[A <: PlanetSideServerObject](id : Int, constructor : ConstructorType[A]) : ServerObjectBuilder[A] = { new ServerObjectBuilder[A](id, constructor) } } diff --git a/common/src/main/scala/net/psforever/objects/serverobject/structures/Building.scala b/common/src/main/scala/net/psforever/objects/serverobject/structures/Building.scala index 84a14c2c..7b078dc9 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/structures/Building.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/structures/Building.scala @@ -8,12 +8,17 @@ import net.psforever.objects.zones.Zone import net.psforever.packet.game.PlanetSideGUID import net.psforever.types.PlanetSideEmpire -class Building(private val id : Int, private val zone : Zone) extends PlanetSideServerObject { +class Building(private val mapId : Int, private val zone : Zone) extends PlanetSideServerObject { + /** + * The mapId is the identifier number used in BuildingInfoUpdateMessage. + * The modelId is the identifier number used in SetEmpireMessage. + */ + private var modelId : Option[Int] = None private var faction : PlanetSideEmpire.Value = PlanetSideEmpire.NEUTRAL private var amenities : List[Amenity] = List.empty GUID = PlanetSideGUID(0) - def Id : Int = id + def Id : Int = mapId def Faction : PlanetSideEmpire.Value = faction @@ -32,6 +37,15 @@ class Building(private val id : Int, private val zone : Zone) extends PlanetSide def Zone : Zone = zone + def ModelId : Int = modelId.getOrElse(Id) + + def ModelId_=(id : Int) : Int = ModelId_=(Some(id)) + + def ModelId_=(id : Option[Int]) : Int = { + modelId = id + ModelId + } + def Definition: ObjectDefinition = Building.BuildingDefinition } diff --git a/common/src/main/scala/net/psforever/objects/serverobject/terminals/SpawnTerminalDefinition.scala b/common/src/main/scala/net/psforever/objects/serverobject/terminals/SpawnTerminalDefinition.scala new file mode 100644 index 00000000..8483a2c3 --- /dev/null +++ b/common/src/main/scala/net/psforever/objects/serverobject/terminals/SpawnTerminalDefinition.scala @@ -0,0 +1,15 @@ +// Copyright (c) 2017 PSForever +package net.psforever.objects.serverobject.terminals + +import net.psforever.objects.Player +import net.psforever.packet.game.ItemTransactionMessage + +/** + * The definition for any `Terminal` that is of a type "spawn_terminal." + * A "spawn_terminal" is somewhat like the `matrix_terminalc` of an advanced mobile spawn unit, but inside of facilities. + */ +class SpawnTerminalDefinition extends TerminalDefinition(812) { + Name = "spawn_terminal" + + override def Buy(player : Player, msg : ItemTransactionMessage) : Terminal.Exchange = Terminal.NoDeal() +} diff --git a/common/src/main/scala/net/psforever/objects/serverobject/tube/SpawnTube.scala b/common/src/main/scala/net/psforever/objects/serverobject/tube/SpawnTube.scala index 9d9baac9..4bc80f06 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/tube/SpawnTube.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/tube/SpawnTube.scala @@ -13,22 +13,24 @@ object SpawnTube { new SpawnTube(tubeDef) } -// import akka.actor.ActorContext -// import net.psforever.types.Vector3 -// /** -// * Instantiate an configure a `SpawnTube` object -// * @param pos the position (used to determine spawn point) -// * @param orient the orientation (used to indicate spawn direction) -// * @param id the unique id that will be assigned to this entity -// * @param context a context to allow the object to properly set up `ActorSystem` functionality -// * @return the `SpawnTube` object -// */ -// def Constructor(pos : Vector3, orient : Vector3)(id : Int, context : ActorContext) : SpawnTube = { -// import net.psforever.objects.GlobalDefinitions -// -// val obj = SpawnTube(GlobalDefinitions.ams_respawn_tube) -// obj.Position = pos -// obj.Orientation = orient -// obj -// } + import akka.actor.ActorContext + import net.psforever.types.Vector3 + /** + * Instantiate an configure a `SpawnTube` object + * @param pos the position (used to determine spawn point) + * @param orient the orientation (used to indicate spawn direction) + * @param id the unique id that will be assigned to this entity + * @param context a context to allow the object to properly set up `ActorSystem` functionality + * @return the `SpawnTube` object + */ + def Constructor(pos : Vector3, orient : Vector3)(id : Int, context : ActorContext) : SpawnTube = { + import akka.actor.Props + import net.psforever.objects.GlobalDefinitions + + val obj = SpawnTube(GlobalDefinitions.ams_respawn_tube) + obj.Position = pos + obj.Orientation = orient + obj.Actor = context.actorOf(Props(classOf[SpawnTubeControl], obj), s"${GlobalDefinitions.ams_respawn_tube.Name}_$id") + obj + } } diff --git a/common/src/main/scala/net/psforever/objects/zones/Zone.scala b/common/src/main/scala/net/psforever/objects/zones/Zone.scala index f084443d..859aafa2 100644 --- a/common/src/main/scala/net/psforever/objects/zones/Zone.scala +++ b/common/src/main/scala/net/psforever/objects/zones/Zone.scala @@ -44,8 +44,8 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { private var accessor : ActorRef = ActorRef.noSender /** The basic support structure for the globally unique number system used by this `Zone`. */ private var guid : NumberPoolHub = new NumberPoolHub(new LimitedNumberSource(65536)) - guid.AddPool("environment", (0 to 2000).toList) - guid.AddPool("dynamic", (2001 to 10000).toList).Selector = new RandomSelector //TODO unlump pools later; do not make too big + guid.AddPool("environment", (0 to 3000).toList) //TODO tailer ro suit requirements of zone + guid.AddPool("dynamic", (3001 to 10000).toList).Selector = new RandomSelector //TODO unlump pools later; do not make too big /** A synchronized `List` of items (`Equipment`) dropped by players on the ground and can be collected again. */ private val equipmentOnGround : ListBuffer[Equipment] = ListBuffer[Equipment]() /** Used by the `Zone` to coordinate `Equipment` dropping and collection requests. */ @@ -66,7 +66,12 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { * First, the `Actor`-driven aspect of the globally unique identifier system for this `Zone` is finalized. * Second, all supporting `Actor` agents are created, e.g., `ground`. * Third, the `ZoneMap` server objects are loaded and constructed within that aforementioned system. - * To avoid being called more than once, there is a test whether the `accessor` for the globally unique identifier system has been changed. + * To avoid being called more than once, there is a test whether the `accessor` for the globally unique identifier system has been changed.
+ *
+ * Execution of this operation should be fail-safe. + * The chances of failure should be mitigated or skipped. + * An testing routine should be run after the fact on the results of the process. + * @see `ZoneActor.ZoneSetupCheck` * @param context a reference to an `ActorContext` necessary for `Props` */ def Init(implicit context : ActorContext) : Unit = { @@ -76,9 +81,7 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) { ground = context.actorOf(Props(classOf[ZoneGroundActor], equipmentOnGround), s"$Id-ground") transport = context.actorOf(Props(classOf[ZoneVehicleActor], this), s"$Id-vehicles") - Map.LocalObjects.foreach({ builderObject => - builderObject.Build - }) + Map.LocalObjects.foreach({ builderObject => builderObject.Build }) MakeBuildings(context) AssignAmenities() } diff --git a/common/src/main/scala/net/psforever/objects/zones/ZoneActor.scala b/common/src/main/scala/net/psforever/objects/zones/ZoneActor.scala index af5c06ea..92d36827 100644 --- a/common/src/main/scala/net/psforever/objects/zones/ZoneActor.scala +++ b/common/src/main/scala/net/psforever/objects/zones/ZoneActor.scala @@ -29,9 +29,9 @@ class ZoneActor(zone : Zone) extends Actor { val validateObject : (Int, (PlanetSideGameObject)=>Boolean, String) => Boolean = ValidateObject(guid, slog) //check base to object associations - map.ObjectToBuilding.foreach({ case((object_guid, base_id)) => - if(zone.Building(base_id).isEmpty) { - slog.error(s"expected a building at id #$base_id") + map.ObjectToBuilding.foreach({ case((object_guid, building_id)) => + if(zone.Building(building_id).isEmpty) { + slog.error(s"expected a building at id #$building_id") } if(guid(object_guid).isEmpty) { slog.error(s"expected object id $object_guid to exist, but it did not") @@ -85,8 +85,8 @@ object ZoneActor { } } catch { - case _ : Exception => - elog.error(s"expected a $description at id $object_guid but no object is initialized") + case e : Exception => + elog.error(s"expected a $description at id $object_guid but no object is initialized - $e") false } } diff --git a/common/src/main/scala/net/psforever/objects/zones/ZoneMap.scala b/common/src/main/scala/net/psforever/objects/zones/ZoneMap.scala index d8019274..51ebeafa 100644 --- a/common/src/main/scala/net/psforever/objects/zones/ZoneMap.scala +++ b/common/src/main/scala/net/psforever/objects/zones/ZoneMap.scala @@ -2,7 +2,7 @@ package net.psforever.objects.zones import net.psforever.objects.serverobject.structures.FoundationBuilder -import net.psforever.objects.serverobject.ServerObjectBuilder +import net.psforever.objects.serverobject.{PlanetSideServerObject, ServerObjectBuilder} /** * The fixed instantiation and relation of a series of server objects.
@@ -44,10 +44,15 @@ class ZoneMap(private val name : String) { /** * Append the builder for a server object to the list of builders known to this `ZoneMap`. - * @param obj the builder for a server object + * @param id the unique id that will be assigned to this entity + * @param constructor the logic that initializes the emitted entity + * @return the current number of builders */ - def LocalObject(obj : ServerObjectBuilder[_]) : Unit = { - localObjects = localObjects :+ obj + def LocalObject[A <: PlanetSideServerObject](id : Int, constructor : ServerObjectBuilder.ConstructorType[A]) : Int = { + if(id > 0) { + localObjects = localObjects :+ ServerObjectBuilder[A](id, constructor) + } + localObjects.size } def LocalBuildings : Map[Int, FoundationBuilder] = buildings diff --git a/common/src/test/scala/objects/PlayerTest.scala b/common/src/test/scala/objects/PlayerTest.scala index d082fe2f..facf231c 100644 --- a/common/src/test/scala/objects/PlayerTest.scala +++ b/common/src/test/scala/objects/PlayerTest.scala @@ -247,13 +247,4 @@ class PlayerTest extends Specification { Player.Administrate(obj, false) obj.Admin mustEqual false } - - "spectate" in { - val obj = new Player("Chord", PlanetSideEmpire.TR, CharacterGender.Male, 0, 5) - obj.Spectator mustEqual false - Player.Spectate(obj, true) - obj.Spectator mustEqual true - Player.Spectate(obj, false) - obj.Spectator mustEqual false - } } diff --git a/pslogin/src/main/scala/Maps.scala b/pslogin/src/main/scala/Maps.scala index ab19d2db..72a17cc7 100644 --- a/pslogin/src/main/scala/Maps.scala +++ b/pslogin/src/main/scala/Maps.scala @@ -1,7 +1,6 @@ // Copyright (c) 2017 PSForever import net.psforever.objects.zones.ZoneMap import net.psforever.objects.GlobalDefinitions._ -import net.psforever.objects.serverobject.ServerObjectBuilder import net.psforever.objects.serverobject.doors.Door import net.psforever.objects.serverobject.implantmech.ImplantTerminalMech import net.psforever.objects.serverobject.locks.IFFLock @@ -9,6 +8,7 @@ import net.psforever.objects.serverobject.mblocker.Locker import net.psforever.objects.serverobject.pad.VehicleSpawnPad import net.psforever.objects.serverobject.structures.{Building, FoundationBuilder, WarpGate} import net.psforever.objects.serverobject.terminals.Terminal +import net.psforever.objects.serverobject.tube.SpawnTube import net.psforever.types.Vector3 object Maps { @@ -23,16 +23,247 @@ object Maps { val map5 = new ZoneMap("map05") val map6 = new ZoneMap("map06") { - //TODO TEST ceryshen - LocalObject(ServerObjectBuilder(3353, Terminal.Constructor(ground_vehicle_terminal))) - LocalObject(ServerObjectBuilder(500, + LocalBuilding(2, FoundationBuilder(Building.Structure)) //Anguta + LocalObject(222, Door.Constructor) //air term building, bay door + LocalObject(370, Door.Constructor) //courtyard + LocalObject(371, Door.Constructor) //courtyard + LocalObject(372, Door.Constructor) //courtyard + LocalObject(373, Door.Constructor) //courtyard + LocalObject(375, Door.Constructor) //2nd level door + LocalObject(376, Door.Constructor) //2nd level door + LocalObject(383, Door.Constructor) //courtyard + LocalObject(384, Door.Constructor) //3rd floor door + LocalObject(385, Door.Constructor) //courtyard + LocalObject(387, Door.Constructor) //2nd level door + LocalObject(391, Door.Constructor) //courtyard + LocalObject(393, Door.Constructor) //air term building, upstairs door + LocalObject(394, Door.Constructor) //air term building, f.door + LocalObject(396, Door.Constructor) //courtyard + LocalObject(398, Door.Constructor) //courtyard + LocalObject(399, Door.Constructor) //courtyard + LocalObject(402, Door.Constructor) //courtyard + LocalObject(403, Door.Constructor) //courtyard + LocalObject(404, Door.Constructor) //b.door + LocalObject(603, Door.Constructor) + LocalObject(604, Door.Constructor) + LocalObject(605, Door.Constructor) + LocalObject(606, Door.Constructor) + LocalObject(607, Door.Constructor) + LocalObject(610, Door.Constructor) + LocalObject(611, Door.Constructor) + LocalObject(614, Door.Constructor) + LocalObject(619, Door.Constructor) + LocalObject(620, Door.Constructor) //generator room door + LocalObject(621, Door.Constructor) + LocalObject(622, Door.Constructor) //spawn room door + LocalObject(623, Door.Constructor) //spawn room door + LocalObject(630, Door.Constructor) //spawn room door + LocalObject(631, Door.Constructor) //spawn room door, kitchen + LocalObject(634, Door.Constructor) //air term building, interior + LocalObject(638, Door.Constructor) //cc door + LocalObject(642, Door.Constructor) //cc door, interior + LocalObject(643, Door.Constructor) //cc door + LocalObject(645, Door.Constructor) //b.door interior + LocalObject(646, Door.Constructor) //b.door interior + LocalObject(715, Door.Constructor) //f.door + LocalObject(1177, Locker.Constructor) + LocalObject(1178, Locker.Constructor) + LocalObject(1179, Locker.Constructor) + LocalObject(1180, Locker.Constructor) + LocalObject(1181, Locker.Constructor) + LocalObject(1182, Locker.Constructor) + LocalObject(1183, Locker.Constructor) + LocalObject(1184, Locker.Constructor) + LocalObject(1185, Locker.Constructor) + LocalObject(1186, Locker.Constructor) + LocalObject(1187, Locker.Constructor) + LocalObject(1188, Locker.Constructor) + LocalObject(1564, Terminal.Constructor(order_terminal)) + LocalObject(1568, Terminal.Constructor(order_terminal)) + LocalObject(1569, Terminal.Constructor(order_terminal)) + LocalObject(1570, Terminal.Constructor(order_terminal)) + LocalObject(1571, Terminal.Constructor(order_terminal)) + LocalObject(1576, Terminal.Constructor(order_terminal)) + LocalObject(1577, Terminal.Constructor(order_terminal)) + LocalObject(1578, Terminal.Constructor(order_terminal)) + LocalObject(2145, SpawnTube.Constructor(Vector3(3980.4062f, 4252.7656f, 257.5625f), Vector3(0, 0, 90))) + LocalObject(2146, SpawnTube.Constructor(Vector3(3980.4062f, 4259.992f, 257.5625f), Vector3(0, 0, 90))) + LocalObject(2147, SpawnTube.Constructor(Vector3(3980.4062f, 4267.3047f, 257.5625f), Vector3(0, 0, 90))) + LocalObject(2239, Terminal.Constructor(spawn_terminal)) + LocalObject(2244, Terminal.Constructor(spawn_terminal)) + LocalObject(2245, Terminal.Constructor(spawn_terminal)) + LocalObject(2246, Terminal.Constructor(spawn_terminal)) + LocalObject(2248, Terminal.Constructor(spawn_terminal)) + LocalObject(2250, Terminal.Constructor(spawn_terminal)) + LocalObject(2251, Terminal.Constructor(spawn_terminal)) + LocalObject(2253, Terminal.Constructor(spawn_terminal)) + LocalObject(2254, Terminal.Constructor(spawn_terminal)) + LocalObject(2322, Door.Constructor) //spawn tube door + LocalObject(2323, Door.Constructor) //spawn tube door + LocalObject(2324, Door.Constructor) //spawn tube door + LocalObject(2419, Terminal.Constructor(ground_vehicle_terminal)) + LocalObject(500, VehicleSpawnPad.Constructor(Vector3(3962.0f, 4334.0f, 268.0f), Vector3(0f, 0f, 180.0f)) - )) //TODO guid not correct - - LocalBuilding(2, FoundationBuilder(Building.Structure)) - ObjectToBuilding(3353, 2) + ) //TODO guid not correct + LocalObject(224, Terminal.Constructor(dropship_vehicle_terminal)) + LocalObject(501, + VehicleSpawnPad.Constructor(Vector3(4012.3594f, 4364.8047f, 271.90625f), Vector3(0f, 0f, 180.0f)) + ) //TODO guid not correct + ObjectToBuilding(222, 2) + ObjectToBuilding(224, 2) + ObjectToBuilding(370, 2) + ObjectToBuilding(371, 2) + ObjectToBuilding(372, 2) + ObjectToBuilding(373, 2) + ObjectToBuilding(375, 2) + ObjectToBuilding(376, 2) + ObjectToBuilding(383, 2) + ObjectToBuilding(384, 2) + ObjectToBuilding(385, 2) + ObjectToBuilding(387, 2) + ObjectToBuilding(391, 2) + ObjectToBuilding(393, 2) + ObjectToBuilding(394, 2) + ObjectToBuilding(396, 2) + ObjectToBuilding(398, 2) + ObjectToBuilding(399, 2) + ObjectToBuilding(402, 2) + ObjectToBuilding(403, 2) + ObjectToBuilding(404, 2) + ObjectToBuilding(603, 2) + ObjectToBuilding(604, 2) + ObjectToBuilding(605, 2) + ObjectToBuilding(606, 2) + ObjectToBuilding(607, 2) + ObjectToBuilding(610, 2) + ObjectToBuilding(611, 2) + ObjectToBuilding(614, 2) + ObjectToBuilding(619, 2) + ObjectToBuilding(620, 2) + ObjectToBuilding(621, 2) + ObjectToBuilding(622, 2) + ObjectToBuilding(623, 2) + ObjectToBuilding(630, 2) + ObjectToBuilding(631, 2) + ObjectToBuilding(634, 2) + ObjectToBuilding(638, 2) + ObjectToBuilding(642, 2) + ObjectToBuilding(643, 2) + ObjectToBuilding(645, 2) + ObjectToBuilding(646, 2) + ObjectToBuilding(715, 2) + ObjectToBuilding(1177, 2) + ObjectToBuilding(1178, 2) + ObjectToBuilding(1179, 2) + ObjectToBuilding(1180, 2) + ObjectToBuilding(1181, 2) + ObjectToBuilding(1182, 2) + ObjectToBuilding(1183, 2) + ObjectToBuilding(1184, 2) + ObjectToBuilding(1185, 2) + ObjectToBuilding(1186, 2) + ObjectToBuilding(1187, 2) + ObjectToBuilding(1188, 2) + ObjectToBuilding(1564, 2) + ObjectToBuilding(1568, 2) + ObjectToBuilding(1569, 2) + ObjectToBuilding(1570, 2) + ObjectToBuilding(1571, 2) + ObjectToBuilding(1576, 2) + ObjectToBuilding(1577, 2) + ObjectToBuilding(1578, 2) + ObjectToBuilding(2145, 2) + ObjectToBuilding(2146, 2) + ObjectToBuilding(2147, 2) + ObjectToBuilding(2239, 2) + ObjectToBuilding(2244, 2) + ObjectToBuilding(2245, 2) + ObjectToBuilding(2246, 2) + ObjectToBuilding(2248, 2) + ObjectToBuilding(2250, 2) + ObjectToBuilding(2251, 2) + ObjectToBuilding(2253, 2) + ObjectToBuilding(2254, 2) + ObjectToBuilding(2322, 2) + ObjectToBuilding(2323, 2) + ObjectToBuilding(2324, 2) + ObjectToBuilding(2419, 2) ObjectToBuilding(500, 2) - TerminalToSpawnPad(3353, 500) + ObjectToBuilding(501, 2) + TerminalToSpawnPad(224, 501) + TerminalToSpawnPad(2419, 500) + + LocalBuilding(38, FoundationBuilder(Building.Structure)) //Anguta, West Bunker + LocalObject(362, Door.Constructor) + ObjectToBuilding(362, 38) + + LocalBuilding(42, FoundationBuilder(Building.Structure)) //Anguta, East Bunker(s) + LocalObject(407, Door.Constructor) + LocalObject(408, Door.Constructor) + ObjectToBuilding(407, 42) + ObjectToBuilding(408, 42) + + LocalBuilding(48, FoundationBuilder(Building.Structure)) //North Anguta Watchtower + LocalObject(364, Door.Constructor(Vector3(3871.9688f, 4509.992f, 269.65625f), Vector3(0f, 0f, 180f))) //s1 + LocalObject(365, Door.Constructor(Vector3(3871.9688f, 4509.992f, 279.57812f), Vector3(0f, 0f, 180f))) //s2 + LocalObject(366, Door.Constructor(Vector3(3871.9688f, 4509.992f, 299.57812f), Vector3(0f, 0f, 180f))) //s3 + LocalObject(367, Door.Constructor(Vector3(3871.9688f, 4525.9844f, 269.65625f), Vector3(0f, 0f, 0f))) //n1 + LocalObject(368, Door.Constructor(Vector3(3871.9688f, 4525.9844f, 279.57812f), Vector3(0f, 0f, 0f))) //n2 + LocalObject(369, Door.Constructor(Vector3(3871.9688f, 4525.9844f, 299.57812f), Vector3(0f, 0f, 0f))) //n3 + LocalObject(854, IFFLock.Constructor) + LocalObject(855, IFFLock.Constructor) + LocalObject(856, IFFLock.Constructor) + LocalObject(857, IFFLock.Constructor) + LocalObject(858, IFFLock.Constructor) + LocalObject(859, IFFLock.Constructor) + LocalObject(1140, Locker.Constructor) + LocalObject(1141, Locker.Constructor) + LocalObject(1142, Locker.Constructor) + LocalObject(1143, Locker.Constructor) + LocalObject(1144, Locker.Constructor) + LocalObject(1145, Locker.Constructor) + LocalObject(1146, Locker.Constructor) + LocalObject(1147, Locker.Constructor) + LocalObject(1561, Terminal.Constructor(order_terminal)) + LocalObject(1562, Terminal.Constructor(order_terminal)) + LocalObject(1563, Terminal.Constructor(order_terminal)) + LocalObject(2138, SpawnTube.Constructor(Vector3(3870.9688f, 4505.7266f, 259.875f), Vector3(0, 0, 90))) + LocalObject(2139, SpawnTube.Constructor(Vector3(3870.9688f, 4522.1562f, 259.875f), Vector3(0, 0, 90))) + LocalObject(2315, Door.Constructor) //spawn tube door + LocalObject(2316, Door.Constructor) //spawn tube door + ObjectToBuilding(364, 48) + ObjectToBuilding(365, 48) + ObjectToBuilding(366, 48) + ObjectToBuilding(367, 48) + ObjectToBuilding(368, 48) + ObjectToBuilding(369, 48) + ObjectToBuilding(854, 48) + ObjectToBuilding(855, 48) + ObjectToBuilding(856, 48) + ObjectToBuilding(857, 48) + ObjectToBuilding(858, 48) + ObjectToBuilding(859, 48) + ObjectToBuilding(1140, 48) + ObjectToBuilding(1141, 48) + ObjectToBuilding(1142, 48) + ObjectToBuilding(1143, 48) + ObjectToBuilding(1144, 48) + ObjectToBuilding(1145, 48) + ObjectToBuilding(1146, 48) + ObjectToBuilding(1147, 48) + ObjectToBuilding(1561, 48) + ObjectToBuilding(1562, 48) + ObjectToBuilding(1563, 48) + ObjectToBuilding(2138, 48) + ObjectToBuilding(2139, 48) + ObjectToBuilding(2315, 48) + ObjectToBuilding(2316, 48) + DoorToLock(364, 857) + DoorToLock(365, 858) + DoorToLock(366, 859) + DoorToLock(367, 854) + DoorToLock(368, 855) + DoorToLock(369, 856) } val map7 = new ZoneMap("map07") @@ -52,63 +283,69 @@ object Maps { LocalBuilding(2, FoundationBuilder(WarpGate.Structure)) LocalBuilding(3, FoundationBuilder(WarpGate.Structure)) - LocalObject(ServerObjectBuilder(372, Door.Constructor)) - LocalObject(ServerObjectBuilder(373, Door.Constructor)) - - LocalObject(ServerObjectBuilder(520, ImplantTerminalMech.Constructor)) //Hart B - LocalObject(ServerObjectBuilder(853, Terminal.Constructor(order_terminal))) - LocalObject(ServerObjectBuilder(855, Terminal.Constructor(order_terminal))) - LocalObject(ServerObjectBuilder(860, Terminal.Constructor(order_terminal))) - LocalObject(ServerObjectBuilder(1081, Terminal.Constructor(implant_terminal_interface))) //tube 520 + LocalObject(520, ImplantTerminalMech.Constructor) //Hart B + LocalObject(1081, Terminal.Constructor(implant_terminal_interface)) //tube 520 TerminalToInterface(520, 1081) LocalBuilding(2, FoundationBuilder(Building.Structure)) //HART building C - LocalObject(ServerObjectBuilder(186, Terminal.Constructor(cert_terminal))) - LocalObject(ServerObjectBuilder(187, Terminal.Constructor(cert_terminal))) - LocalObject(ServerObjectBuilder(188, Terminal.Constructor(cert_terminal))) - LocalObject(ServerObjectBuilder(362, Door.Constructor)) - LocalObject(ServerObjectBuilder(370, Door.Constructor)) - LocalObject(ServerObjectBuilder(371, Door.Constructor)) - LocalObject(ServerObjectBuilder(374, Door.Constructor)) - LocalObject(ServerObjectBuilder(375, Door.Constructor)) - LocalObject(ServerObjectBuilder(394, Door.Constructor)) - LocalObject(ServerObjectBuilder(395, Door.Constructor)) - LocalObject(ServerObjectBuilder(396, Door.Constructor)) - LocalObject(ServerObjectBuilder(397, Door.Constructor)) - LocalObject(ServerObjectBuilder(398, Door.Constructor)) - LocalObject(ServerObjectBuilder(462, Door.Constructor)) - LocalObject(ServerObjectBuilder(463, Door.Constructor)) - LocalObject(ServerObjectBuilder(522, ImplantTerminalMech.Constructor)) //Hart C - LocalObject(ServerObjectBuilder(523, ImplantTerminalMech.Constructor)) //Hart C - LocalObject(ServerObjectBuilder(524, ImplantTerminalMech.Constructor)) //Hart C - LocalObject(ServerObjectBuilder(525, ImplantTerminalMech.Constructor)) //Hart C - LocalObject(ServerObjectBuilder(526, ImplantTerminalMech.Constructor)) //Hart C - LocalObject(ServerObjectBuilder(527, ImplantTerminalMech.Constructor)) //Hart C - LocalObject(ServerObjectBuilder(528, ImplantTerminalMech.Constructor)) //Hart C - LocalObject(ServerObjectBuilder(529, ImplantTerminalMech.Constructor)) //Hart C - LocalObject(ServerObjectBuilder(686, Locker.Constructor)) - LocalObject(ServerObjectBuilder(687, Locker.Constructor)) - LocalObject(ServerObjectBuilder(688, Locker.Constructor)) - LocalObject(ServerObjectBuilder(689, Locker.Constructor)) - LocalObject(ServerObjectBuilder(690, Locker.Constructor)) - LocalObject(ServerObjectBuilder(691, Locker.Constructor)) - LocalObject(ServerObjectBuilder(692, Locker.Constructor)) - LocalObject(ServerObjectBuilder(693, Locker.Constructor)) - LocalObject(ServerObjectBuilder(842, Terminal.Constructor(order_terminal))) - LocalObject(ServerObjectBuilder(843, Terminal.Constructor(order_terminal))) - LocalObject(ServerObjectBuilder(844, Terminal.Constructor(order_terminal))) - LocalObject(ServerObjectBuilder(845, Terminal.Constructor(order_terminal))) - LocalObject(ServerObjectBuilder(1082, Terminal.Constructor(implant_terminal_interface))) //TODO guid not correct - LocalObject(ServerObjectBuilder(1083, Terminal.Constructor(implant_terminal_interface))) //TODO guid not correct - LocalObject(ServerObjectBuilder(1084, Terminal.Constructor(implant_terminal_interface))) //TODO guid not correct - LocalObject(ServerObjectBuilder(1085, Terminal.Constructor(implant_terminal_interface))) //TODO guid not correct - LocalObject(ServerObjectBuilder(1086, Terminal.Constructor(implant_terminal_interface))) //TODO guid not correct - LocalObject(ServerObjectBuilder(1087, Terminal.Constructor(implant_terminal_interface))) //TODO guid not correct - LocalObject(ServerObjectBuilder(1088, Terminal.Constructor(implant_terminal_interface))) //TODO guid not correct - LocalObject(ServerObjectBuilder(1089, Terminal.Constructor(implant_terminal_interface))) //TODO guid not correct + LocalObject(186, Terminal.Constructor(cert_terminal)) + LocalObject(187, Terminal.Constructor(cert_terminal)) + LocalObject(188, Terminal.Constructor(cert_terminal)) + LocalObject(362, Door.Constructor) + LocalObject(370, Door.Constructor) + LocalObject(371, Door.Constructor) + LocalObject(372, Door.Constructor) + LocalObject(373, Door.Constructor) + LocalObject(374, Door.Constructor) + LocalObject(375, Door.Constructor) + LocalObject(394, Door.Constructor) + LocalObject(395, Door.Constructor) + LocalObject(396, Door.Constructor) + LocalObject(397, Door.Constructor) + LocalObject(398, Door.Constructor) + LocalObject(522, ImplantTerminalMech.Constructor) + LocalObject(523, ImplantTerminalMech.Constructor) + LocalObject(524, ImplantTerminalMech.Constructor) + LocalObject(525, ImplantTerminalMech.Constructor) + LocalObject(526, ImplantTerminalMech.Constructor) + LocalObject(527, ImplantTerminalMech.Constructor) + LocalObject(528, ImplantTerminalMech.Constructor) + LocalObject(529, ImplantTerminalMech.Constructor) + LocalObject(686, Locker.Constructor) + LocalObject(687, Locker.Constructor) + LocalObject(688, Locker.Constructor) + LocalObject(689, Locker.Constructor) + LocalObject(690, Locker.Constructor) + LocalObject(691, Locker.Constructor) + LocalObject(692, Locker.Constructor) + LocalObject(693, Locker.Constructor) + LocalObject(842, Terminal.Constructor(order_terminal)) + LocalObject(843, Terminal.Constructor(order_terminal)) + LocalObject(844, Terminal.Constructor(order_terminal)) + LocalObject(845, Terminal.Constructor(order_terminal)) + LocalObject(1082, Terminal.Constructor(implant_terminal_interface)) //TODO guid not correct + LocalObject(1083, Terminal.Constructor(implant_terminal_interface)) //TODO guid not correct + LocalObject(1084, Terminal.Constructor(implant_terminal_interface)) //TODO guid not correct + LocalObject(1085, Terminal.Constructor(implant_terminal_interface)) //TODO guid not correct + LocalObject(1086, Terminal.Constructor(implant_terminal_interface)) //TODO guid not correct + LocalObject(1087, Terminal.Constructor(implant_terminal_interface)) //TODO guid not correct + LocalObject(1088, Terminal.Constructor(implant_terminal_interface)) //TODO guid not correct + LocalObject(1089, Terminal.Constructor(implant_terminal_interface)) //TODO guid not correct ObjectToBuilding(186, 2) ObjectToBuilding(187, 2) ObjectToBuilding(188, 2) + ObjectToBuilding(362, 2) + ObjectToBuilding(370, 2) + ObjectToBuilding(371, 2) + ObjectToBuilding(372, 2) + ObjectToBuilding(373, 2) + ObjectToBuilding(374, 2) + ObjectToBuilding(375, 2) + ObjectToBuilding(394, 2) + ObjectToBuilding(395, 2) + ObjectToBuilding(396, 2) + ObjectToBuilding(397, 2) + ObjectToBuilding(398, 2) ObjectToBuilding(522, 2) ObjectToBuilding(523, 2) ObjectToBuilding(524, 2) @@ -147,14 +384,14 @@ object Maps { TerminalToInterface(529, 1089) LocalBuilding(29, FoundationBuilder(Building.Structure)) //South Villa Gun Tower - LocalObject(ServerObjectBuilder(330, Door.Constructor(Vector3(3979.9219f, 2592.0547f, 91.140625f), Vector3(0, 0, 180)))) - LocalObject(ServerObjectBuilder(331, Door.Constructor(Vector3(3979.9219f, 2592.0547f, 111.140625f), Vector3(0, 0, 180)))) - LocalObject(ServerObjectBuilder(332, Door.Constructor(Vector3(3979.9688f, 2608.0625f, 91.140625f), Vector3(0, 0, 0)))) - LocalObject(ServerObjectBuilder(333, Door.Constructor(Vector3(3979.9688f, 2608.0625f, 111.140625f), Vector3(0, 0, 0)))) - LocalObject(ServerObjectBuilder(556, IFFLock.Constructor)) - LocalObject(ServerObjectBuilder(557, IFFLock.Constructor)) - LocalObject(ServerObjectBuilder(558, IFFLock.Constructor)) - LocalObject(ServerObjectBuilder(559, IFFLock.Constructor)) + LocalObject(330, Door.Constructor(Vector3(3979.9219f, 2592.0547f, 91.140625f), Vector3(0, 0, 180))) + LocalObject(331, Door.Constructor(Vector3(3979.9219f, 2592.0547f, 111.140625f), Vector3(0, 0, 180))) + LocalObject(332, Door.Constructor(Vector3(3979.9688f, 2608.0625f, 91.140625f), Vector3(0, 0, 0))) + LocalObject(333, Door.Constructor(Vector3(3979.9688f, 2608.0625f, 111.140625f), Vector3(0, 0, 0))) + LocalObject(556, IFFLock.Constructor) + LocalObject(557, IFFLock.Constructor) + LocalObject(558, IFFLock.Constructor) + LocalObject(559, IFFLock.Constructor) ObjectToBuilding(330, 29) ObjectToBuilding(331, 29) ObjectToBuilding(332, 29) @@ -169,26 +406,34 @@ object Maps { DoorToLock(333, 557) LocalBuilding(51, FoundationBuilder(Building.Structure)) - LocalObject(ServerObjectBuilder(304, Terminal.Constructor(dropship_vehicle_terminal))) - LocalObject(ServerObjectBuilder(292, + LocalObject(304, Terminal.Constructor(dropship_vehicle_terminal)) + LocalObject(292, VehicleSpawnPad.Constructor(Vector3(3508.9844f, 2895.961f, 92.296875f), Vector3(0f, 0f, 270.0f)) - )) + ) ObjectToBuilding(304, 51) ObjectToBuilding(292, 51) TerminalToSpawnPad(304, 292) LocalBuilding(77, FoundationBuilder(Building.Structure)) - LocalObject(ServerObjectBuilder(1063, Terminal.Constructor(ground_vehicle_terminal))) - LocalObject(ServerObjectBuilder(706, + LocalObject(1063, Terminal.Constructor(ground_vehicle_terminal)) + LocalObject(706, VehicleSpawnPad.Constructor(Vector3(3506.0f, 2820.0f, 92.0f), Vector3(0f, 0f, 270.0f)) - )) + ) ObjectToBuilding(1063, 77) ObjectToBuilding(706, 77) TerminalToSpawnPad(1063, 706) - ObjectToBuilding(853, 2) //TODO check building_id - ObjectToBuilding(855, 2) //TODO check building_id - ObjectToBuilding(860, 2) //TODO check building_id + //TODO check building id: these belong to a spawn building in HART C campus + LocalObject(462, Door.Constructor) + LocalObject(463, Door.Constructor) + LocalObject(853, Terminal.Constructor(order_terminal)) + LocalObject(855, Terminal.Constructor(order_terminal)) + LocalObject(860, Terminal.Constructor(order_terminal)) + ObjectToBuilding(462, 2) + ObjectToBuilding(463, 2) + ObjectToBuilding(853, 2) + ObjectToBuilding(855, 2) + ObjectToBuilding(860, 2) } val map14 = new ZoneMap("map13") diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index cbd3698d..41405724 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -23,7 +23,7 @@ import net.psforever.objects.serverobject.implantmech.ImplantTerminalMech import net.psforever.objects.serverobject.locks.IFFLock import net.psforever.objects.serverobject.mblocker.Locker import net.psforever.objects.serverobject.pad.VehicleSpawnPad -import net.psforever.objects.serverobject.terminals.{MatrixTerminalDefinition, Terminal} +import net.psforever.objects.serverobject.terminals.{MatrixTerminalDefinition, SpawnTerminalDefinition, Terminal} import net.psforever.objects.serverobject.terminals.Terminal.TerminalMessage import net.psforever.objects.vehicles.{AccessPermissionGroup, Utility, VehicleLockState} import net.psforever.objects.serverobject.structures.{Building, WarpGate} @@ -56,6 +56,9 @@ class WorldSessionActor extends Actor with MDCContextAware { var progressBarValue : Option[Float] = None var shooting : Option[PlanetSideGUID] = None var accessedContainer : Option[PlanetSideGameObject with Container] = None + var flying : Boolean = false + var speed : Float = 1.0f + var spectator : Boolean = false var clientKeepAlive : Cancellable = DefaultCancellable.obj var progressBarUpdate : Cancellable = DefaultCancellable.obj @@ -1182,39 +1185,39 @@ class WorldSessionActor extends Actor with MDCContextAware { log.info(s"New world login to $server with Token:$token. $clientVersion") //TODO begin temp player character auto-loading; remove later import net.psforever.objects.GlobalDefinitions._ + import net.psforever.types.CertificationType._ player = Player("TestCharacter"+sessionId.toString, PlanetSideEmpire.VS, CharacterGender.Female, 41, 1) - //player.Position = Vector3(3674.8438f, 2726.789f, 91.15625f) - //player.Position = Vector3(3523.039f, 2855.5078f, 90.859375f) - player.Position = Vector3(3561.0f, 2854.0f, 90.859375f) + //player.Position = Vector3(3561.0f, 2854.0f, 90.859375f) //home3, HART C + player.Position = Vector3(3881.9688f, 4432.008f, 267.0f) //z6, Anguta / n.tower player.Orientation = Vector3(0f, 0f, 90f) - player.Certifications += CertificationType.StandardAssault - player.Certifications += CertificationType.MediumAssault - player.Certifications += CertificationType.StandardExoSuit - player.Certifications += CertificationType.AgileExoSuit - player.Certifications += CertificationType.ReinforcedExoSuit - player.Certifications += CertificationType.ATV - player.Certifications += CertificationType.Harasser + player.Certifications += StandardAssault + player.Certifications += MediumAssault + player.Certifications += StandardExoSuit + player.Certifications += AgileExoSuit + player.Certifications += ReinforcedExoSuit + player.Certifications += ATV + player.Certifications += Harasser // - player.Certifications += CertificationType.InfiltrationSuit - player.Certifications += CertificationType.Sniping - player.Certifications += CertificationType.AntiVehicular - player.Certifications += CertificationType.HeavyAssault - player.Certifications += CertificationType.SpecialAssault - player.Certifications += CertificationType.EliteAssault - player.Certifications += CertificationType.GroundSupport - player.Certifications += CertificationType.GroundTransport - player.Certifications += CertificationType.Flail - player.Certifications += CertificationType.Switchblade - player.Certifications += CertificationType.AssaultBuggy - player.Certifications += CertificationType.ArmoredAssault1 - player.Certifications += CertificationType.ArmoredAssault2 - player.Certifications += CertificationType.AirCavalryScout - player.Certifications += CertificationType.AirCavalryAssault - player.Certifications += CertificationType.AirCavalryInterceptor - player.Certifications += CertificationType.AirSupport - player.Certifications += CertificationType.GalaxyGunship - player.Certifications += CertificationType.Phantasm - player.Certifications += CertificationType.UniMAX + player.Certifications += InfiltrationSuit + player.Certifications += Sniping + player.Certifications += AntiVehicular + player.Certifications += HeavyAssault + player.Certifications += SpecialAssault + player.Certifications += EliteAssault + player.Certifications += GroundSupport + player.Certifications += GroundTransport + player.Certifications += Flail + player.Certifications += Switchblade + player.Certifications += AssaultBuggy + player.Certifications += ArmoredAssault1 + player.Certifications += ArmoredAssault2 + player.Certifications += AirCavalryScout + player.Certifications += AirCavalryAssault + player.Certifications += AirCavalryInterceptor + player.Certifications += AirSupport + player.Certifications += GalaxyGunship + player.Certifications += Phantasm + player.Certifications += UniMAX AwardBattleExperiencePoints(player, 1000000L) // player.ExoSuit = ExoSuitType.MAX //TODO strange issue; divide number above by 10 when uncommenting player.Slot(0).Equipment = SimpleItem(remote_electronics_kit) //Tool(GlobalDefinitions.StandardPistol(player.Faction)) @@ -1226,7 +1229,7 @@ class WorldSessionActor extends Actor with MDCContextAware { player.Slot(33).Equipment = AmmoBox(bullet_9mm_AP) player.Slot(36).Equipment = AmmoBox(GlobalDefinitions.StandardPistolAmmo(player.Faction)) player.Slot(39).Equipment = AmmoBox(plasma_cartridge) //SimpleItem(remote_electronics_kit) - player.Slot(5).Equipment.get.asInstanceOf[LockerContainer].Inventory += 0 -> SimpleItem(remote_electronics_kit) + player.Locker.Inventory += 0 -> SimpleItem(remote_electronics_kit) //TODO end temp player character auto-loading self ! ListAccountCharacters import scala.concurrent.duration._ @@ -1249,7 +1252,7 @@ class WorldSessionActor extends Actor with MDCContextAware { //TODO check if can spawn on last continent/location from player? //TODO if yes, get continent guid accessors //TODO if no, get sanctuary guid accessors and reset the player's expectations - galaxy ! InterstellarCluster.GetWorld("home3") + galaxy ! InterstellarCluster.GetWorld("z6") case default => log.error("Unsupported " + default + " in " + msg) } @@ -1259,12 +1262,12 @@ class WorldSessionActor extends Actor with MDCContextAware { case msg @ BeginZoningMessage() => log.info("Reticulating splines ...") - //map-specific initializations configZone(continent) //todo density sendResponse(TimeOfDayMessage(1191182336)) //custom sendResponse(ContinentalLockUpdateMessage(13, PlanetSideEmpire.VS)) // "The VS have captured the VS Sanctuary." - (1 to 255).foreach(i => { sendResponse(SetEmpireMessage(PlanetSideGUID(i), PlanetSideEmpire.VS)) }) + sendResponse(ReplicationStreamMessage(5, Some(6), Vector(SquadListing()))) //clear squad list + sendResponse(PlanetsideAttributeMessage(PlanetSideGUID(0), 112, 1)) //render Equipment that was dropped into zone before the player arrived continent.EquipmentOnGround.foreach(item => { @@ -1355,7 +1358,7 @@ class WorldSessionActor extends Actor with MDCContextAware { case Some(item) => item.Definition == GlobalDefinitions.bolt_driver case None => false } - avatarService ! AvatarServiceMessage(continent.Id, AvatarAction.PlayerState(avatar_guid, msg, player.Spectator, wepInHand)) + avatarService ! AvatarServiceMessage(continent.Id, AvatarAction.PlayerState(avatar_guid, msg, spectator, wepInHand)) case msg @ ChildObjectStateMessage(object_guid, pitch, yaw) => //the majority of the following check retrieves information to determine if we are in control of the child @@ -1425,6 +1428,37 @@ class WorldSessionActor extends Actor with MDCContextAware { log.info("SetChatFilters: " + msg) case msg @ ChatMsg(messagetype, has_wide_contents, recipient, contents, note_contents) => + var echoContents : String = contents + //TODO messy on/off strings may work + if(messagetype == ChatMessageType.CMT_FLY) { + if(contents.trim.equals("on")) { + flying = true + } + else if(contents.trim.equals("off")) { + flying = false + } + } + else if(messagetype == ChatMessageType.CMT_SPEED) { + speed = { + try { + contents.trim.toFloat + } + catch { + case _ : Exception => + echoContents = "1.000" + 1f + } + } + } + else if(messagetype == ChatMessageType.CMT_TOGGLESPECTATORMODE) { + if(contents.trim.equals("on")) { + spectator = true + } + else if(contents.trim.equals("off")) { + spectator = false + } + } + // TODO: Prevents log spam, but should be handled correctly if (messagetype != ChatMessageType.CMT_TOGGLE_GM) { log.info("Chat: " + msg) @@ -1449,9 +1483,14 @@ class WorldSessionActor extends Actor with MDCContextAware { sendResponse(DropSession(sessionId, "user quit")) } + if(contents.trim.equals("!loc")) { //dev hack; consider bang-commands to complement slash-commands + echoContents = s"pos=${player.Position.x}, ${player.Position.y}, ${player.Position.z}; ori=${player.Orientation.x}, ${player.Orientation.y}, ${player.Orientation.z}" + log.info(echoContents) + } + // TODO: Depending on messagetype, may need to prepend sender's name to contents with proper spacing // TODO: Just replays the packet straight back to sender; actually needs to be routed to recipients! - sendResponse(ChatMsg(messagetype, has_wide_contents, recipient, contents, note_contents)) + sendResponse(ChatMsg(messagetype, has_wide_contents, recipient, echoContents, note_contents)) case msg @ VoiceHostRequest(unk, PlanetSideGUID(player_guid), data) => log.info("Player "+player_guid+" requested in-game voice chat.") @@ -1991,7 +2030,7 @@ class WorldSessionActor extends Actor with MDCContextAware { } case Some(obj : Terminal) => - if(obj.Definition.isInstanceOf[MatrixTerminalDefinition]) { + if(obj.Definition.isInstanceOf[MatrixTerminalDefinition] || obj.Definition.isInstanceOf[SpawnTerminalDefinition]) { //TODO matrix spawn point; for now, just blindly bind to show work (and hope nothing breaks) sendResponse(BindPlayerMessage(1, "@ams", true, true, 0, 0, 0, obj.Position)) } @@ -3161,14 +3200,14 @@ class WorldSessionActor extends Actor with MDCContextAware { } def configZone(zone : Zone) : Unit = { - zone.Buildings.foreach({case (id, building) => - sendResponse(SetEmpireMessage(PlanetSideGUID(id), building.Faction)) + zone.Buildings.values.foreach(building => { + sendResponse(SetEmpireMessage(PlanetSideGUID(building.ModelId), building.Faction)) building.Amenities.foreach(amenity => { val amenityId = amenity.GUID sendResponse(PlanetsideAttributeMessage(amenityId, 50, 0)) sendResponse(PlanetsideAttributeMessage(amenityId, 51, 0)) }) - sendResponse(HackMessage(3, PlanetSideGUID(id), PlanetSideGUID(0), 0, 3212836864L, HackState.HackCleared, 8)) + sendResponse(HackMessage(3, PlanetSideGUID(building.ModelId), PlanetSideGUID(0), 0, 3212836864L, HackState.HackCleared, 8)) }) } diff --git a/pslogin/src/main/scala/Zones.scala b/pslogin/src/main/scala/Zones.scala index 352c2729..051fcf5a 100644 --- a/pslogin/src/main/scala/Zones.scala +++ b/pslogin/src/main/scala/Zones.scala @@ -19,6 +19,11 @@ object Zones { import net.psforever.types.PlanetSideEmpire Building(2).get.Faction = PlanetSideEmpire.VS + Building(2).get.ModelId = 20 + Building(38).get.ModelId = 0 + Building(42).get.ModelId = 0 + Building(48).get.Faction = PlanetSideEmpire.VS + Building(48).get.ModelId = 59 } } @@ -39,7 +44,7 @@ object Zones { super.Init(context) import net.psforever.types.PlanetSideEmpire - Buildings.values.foreach(building => { building.Faction = PlanetSideEmpire.VS }) + Buildings.values.foreach { _.Faction = PlanetSideEmpire.VS } Building(29).get.Faction = PlanetSideEmpire.NC //South Villa Gun Tower } }