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 } }