diff --git a/common/src/main/scala/net/psforever/objects/zones/InterstellarCluster.scala b/common/src/main/scala/net/psforever/objects/zones/InterstellarCluster.scala
index e09d55c27..ddd70cca2 100644
--- a/common/src/main/scala/net/psforever/objects/zones/InterstellarCluster.scala
+++ b/common/src/main/scala/net/psforever/objects/zones/InterstellarCluster.scala
@@ -50,9 +50,7 @@ class InterstellarCluster(zones : List[Zone]) extends Actor {
}
case InterstellarCluster.RequestClientInitialization(tplayer) =>
- zones.foreach(zone => {
- sender ! Zone.ClientInitialization(zone.ClientInitialization()) //do this for each Zone
- })
+ zones.foreach(zone => { sender ! Zone.ClientInitialization(zone.ClientInitialization()) })
sender ! InterstellarCluster.ClientInitializationComplete(tplayer) //will be processed after all Zones
case _ => ;
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 13e055048..f084443df 100644
--- a/common/src/main/scala/net/psforever/objects/zones/Zone.scala
+++ b/common/src/main/scala/net/psforever/objects/zones/Zone.scala
@@ -10,7 +10,6 @@ import net.psforever.objects.guid.actor.UniqueNumberSystem
import net.psforever.objects.guid.selector.RandomSelector
import net.psforever.objects.guid.source.LimitedNumberSource
import net.psforever.objects.serverobject.structures.{Amenity, Building}
-import net.psforever.packet.GamePacket
import net.psforever.packet.game.PlanetSideGUID
import net.psforever.types.Vector3
@@ -218,6 +217,8 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) {
def Transport : ActorRef = transport
+ def Buildings : Map[Int, Building] = buildings
+
def Building(id : Int) : Option[Building] = {
buildings.get(id)
}
@@ -250,25 +251,7 @@ class Zone(private val zoneId : String, zoneMap : ZoneMap, zoneNumber : Int) {
* - `ZonePopulationUpdateMessage`
* @return a `List` of `GamePacket` messages
*/
- def ClientInitialization() : List[GamePacket] = {
- //TODO unimplemented
- List.empty[GamePacket]
- }
-
- /**
- * Provide bulk correspondence on all server objects that can be composed into packet messages and reported to a client.
- * These messages are sent in this fashion at the time of joining a specific `Zone`:
- * - `HackMessage`
- * - `PlanetsideAttributeMessage`
- * - `SetEmpireMessage`
- * - `TimeOfDayMessage`
- * - `WeatherMessage`
- * @return a `List` of `GamePacket` messages
- */
- def ClientConfiguration() : List[GamePacket] = {
- //TODO unimplemented
- List.empty[GamePacket]
- }
+ def ClientInitialization() : Zone = this
}
object Zone {
@@ -308,11 +291,11 @@ object Zone {
/**
* Message to report the packet messages that initialize the client.
- * @param list a `List` of `GamePacket` messages
+ * @param zone a `Zone` to have its buildings and continental parameters turned into packet data
* @see `Zone.ClientInitialization()`
* `InterstallarCluster`
*/
- final case class ClientInitialization(list : List[GamePacket])
+ final case class ClientInitialization(zone : Zone)
/**
* Overloaded constructor.
diff --git a/pslogin/src/main/scala/Maps.scala b/pslogin/src/main/scala/Maps.scala
index d8c854c8c..0a67c6c56 100644
--- a/pslogin/src/main/scala/Maps.scala
+++ b/pslogin/src/main/scala/Maps.scala
@@ -48,15 +48,22 @@ object Maps {
val map12 = new ZoneMap("map12")
val map13 = new ZoneMap("map13") {
- 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(372, Door.Constructor))
+ LocalObject(ServerObjectBuilder(373, Door.Constructor))
+
+ LocalObject(ServerObjectBuilder(520, ImplantTerminalMech.Constructor)) //Hart B
+ LocalObject(ServerObjectBuilder(1081, Terminal.Constructor(implant_terminal_interface))) //tube 520
+ LocalObject(ServerObjectBuilder(853, Terminal.Constructor(order_terminal)))
+ LocalObject(ServerObjectBuilder(855, Terminal.Constructor(order_terminal)))
+ LocalObject(ServerObjectBuilder(860, Terminal.Constructor(order_terminal)))
+
+ 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(372, Door.Constructor))
- LocalObject(ServerObjectBuilder(373, Door.Constructor))
LocalObject(ServerObjectBuilder(374, Door.Constructor))
LocalObject(ServerObjectBuilder(375, Door.Constructor))
LocalObject(ServerObjectBuilder(394, Door.Constructor))
@@ -66,7 +73,6 @@ object Maps {
LocalObject(ServerObjectBuilder(398, Door.Constructor))
LocalObject(ServerObjectBuilder(462, Door.Constructor))
LocalObject(ServerObjectBuilder(463, Door.Constructor))
- LocalObject(ServerObjectBuilder(520, ImplantTerminalMech.Constructor)) //Hart B
LocalObject(ServerObjectBuilder(522, ImplantTerminalMech.Constructor)) //Hart C
LocalObject(ServerObjectBuilder(523, ImplantTerminalMech.Constructor)) //Hart C
LocalObject(ServerObjectBuilder(524, ImplantTerminalMech.Constructor)) //Hart C
@@ -75,10 +81,6 @@ object Maps {
LocalObject(ServerObjectBuilder(527, ImplantTerminalMech.Constructor)) //Hart C
LocalObject(ServerObjectBuilder(528, ImplantTerminalMech.Constructor)) //Hart C
LocalObject(ServerObjectBuilder(529, ImplantTerminalMech.Constructor)) //Hart C
- LocalObject(ServerObjectBuilder(556, IFFLock.Constructor))
- LocalObject(ServerObjectBuilder(557, IFFLock.Constructor))
- LocalObject(ServerObjectBuilder(558, IFFLock.Constructor))
- LocalObject(ServerObjectBuilder(559, IFFLock.Constructor))
LocalObject(ServerObjectBuilder(686, Locker.Constructor))
LocalObject(ServerObjectBuilder(687, Locker.Constructor))
LocalObject(ServerObjectBuilder(688, Locker.Constructor))
@@ -87,17 +89,10 @@ object Maps {
LocalObject(ServerObjectBuilder(691, Locker.Constructor))
LocalObject(ServerObjectBuilder(692, Locker.Constructor))
LocalObject(ServerObjectBuilder(693, Locker.Constructor))
- LocalObject(ServerObjectBuilder(186, Terminal.Constructor(cert_terminal)))
- LocalObject(ServerObjectBuilder(187, Terminal.Constructor(cert_terminal)))
- LocalObject(ServerObjectBuilder(188, Terminal.Constructor(cert_terminal)))
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(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(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
@@ -106,16 +101,6 @@ object Maps {
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(ServerObjectBuilder(1063, Terminal.Constructor(ground_vehicle_terminal)))
- LocalObject(ServerObjectBuilder(500,
- VehicleSpawnPad.Constructor(Vector3(3506.0f, 2820.0f, 92.0f), Vector3(0f, 0f, 270.0f))
- )) //TODO guid not correct
- LocalObject(ServerObjectBuilder(304, Terminal.Constructor(dropship_vehicle_terminal)))
- LocalObject(ServerObjectBuilder(501,
- VehicleSpawnPad.Constructor(Vector3(3508.9844f, 2895.961f, 92.296875f), Vector3(0f, 0f, 270.0f))
- )) //TODO guid not correct
-
- LocalBuilding(2, FoundationBuilder(Building.Structure))
ObjectToBuilding(186, 2)
ObjectToBuilding(187, 2)
ObjectToBuilding(188, 2)
@@ -139,29 +124,6 @@ object Maps {
ObjectToBuilding(843, 2)
ObjectToBuilding(844, 2)
ObjectToBuilding(845, 2)
- ObjectToBuilding(853, 2) //TODO check building_id
- ObjectToBuilding(855, 2) //TODO check building_id
- ObjectToBuilding(860, 2) //TODO check building_id
- ObjectToBuilding(1063, 2) //TODO unowned courtyard terminal?
- ObjectToBuilding(500, 2) //TODO unowned courtyard spawnpad?
- ObjectToBuilding(304, 2) //TODO unowned courtyard terminal?
- ObjectToBuilding(501, 2) //TODO unowned courtyard spawnpad?
-
- LocalBuilding(29, FoundationBuilder(Building.Structure))
- ObjectToBuilding(330, 29)
- ObjectToBuilding(332, 29)
- ObjectToBuilding(556, 29)
- ObjectToBuilding(558, 29)
-
- //ObjectToBuilding(1081, ?)
- //ObjectToBuilding(520, ?)
-
- DoorToLock(330, 558)
- DoorToLock(331, 559)
- DoorToLock(332, 556)
- DoorToLock(333, 557)
- TerminalToSpawnPad(1063, 500)
- TerminalToSpawnPad(304, 501)
TerminalToInterface(520, 1081)
TerminalToInterface(522, 1082)
TerminalToInterface(523, 1083)
@@ -171,6 +133,52 @@ object Maps {
TerminalToInterface(527, 1087)
TerminalToInterface(528, 1088)
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))
+ ObjectToBuilding(330, 29)
+ ObjectToBuilding(331, 29)
+ ObjectToBuilding(332, 29)
+ ObjectToBuilding(333, 29)
+ ObjectToBuilding(556, 29)
+ ObjectToBuilding(557, 29)
+ ObjectToBuilding(558, 29)
+ ObjectToBuilding(559, 29)
+ DoorToLock(330, 558)
+ DoorToLock(331, 559)
+ DoorToLock(332, 556)
+ DoorToLock(333, 557)
+
+ LocalBuilding(51, FoundationBuilder(Building.Structure))
+ LocalObject(ServerObjectBuilder(304, Terminal.Constructor(dropship_vehicle_terminal)))
+ LocalObject(ServerObjectBuilder(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,
+ VehicleSpawnPad.Constructor(Vector3(3506.0f, 2820.0f, 92.0f), Vector3(0f, 0f, 270.0f))
+ ))
+ ObjectToBuilding(1063, 77)
+ ObjectToBuilding(706, 77)
+ TerminalToSpawnPad(1063, 706)
+
+ //ObjectToBuilding(1081, ?)
+ //ObjectToBuilding(520, ?)
+ ObjectToBuilding(853, 2) //TODO check building_id
+ ObjectToBuilding(855, 2) //TODO check building_id
+ ObjectToBuilding(860, 2) //TODO check building_id
}
val map14 = new ZoneMap("map13")
diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala
index a7c9d8f3d..1fef2f1f1 100644
--- a/pslogin/src/main/scala/WorldSessionActor.scala
+++ b/pslogin/src/main/scala/WorldSessionActor.scala
@@ -26,6 +26,9 @@ import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import net.psforever.objects.serverobject.terminals.{MatrixTerminalDefinition, Terminal}
import net.psforever.objects.serverobject.terminals.Terminal.TerminalMessage
import net.psforever.objects.vehicles.{AccessPermissionGroup, Utility, VehicleLockState}
+import net.psforever.objects.serverobject.structures.Building
+import net.psforever.objects.serverobject.terminals.Terminal
+import net.psforever.objects.vehicles.{AccessPermissionGroup, VehicleLockState}
import net.psforever.objects.zones.{InterstellarCluster, Zone}
import net.psforever.packet.game.objectcreate._
import net.psforever.types._
@@ -976,39 +979,23 @@ class WorldSessionActor extends Actor with MDCContextAware {
case VehicleLoaded(_/*vehicle*/) => ;
//currently being handled by VehicleSpawnPad.LoadVehicle during testing phase
- case Zone.ClientInitialization(/*initList*/_) =>
- //TODO iterate over initList; for now, just do this
- sendResponse(
- BuildingInfoUpdateMessage(
- PlanetSideGUID(6), //Ceryshen
- PlanetSideGUID(2), //Anguta
- 8, //80% NTU
- false, //Base hacked
- PlanetSideEmpire.NEUTRAL, //Base hacked by NC
- 0, //10 minutes remaining for hack
- PlanetSideEmpire.VS, //Base owned by VS
- 0, //!! Field != 0 will cause malformed packet. See class def.
- None,
- PlanetSideGeneratorState.Normal, //Generator critical
- true, //Respawn tubes destroyed
- true, //Force dome active
- 16, //Tech plant lattice benefit
- 0,
- Nil, //!! Field > 0 will cause malformed packet. See class def.
- 0,
- false,
- 8, //!! Field != 8 will cause malformed packet. See class def.
- None,
- true, //Boosted spawn room pain field
- true //Boosted generator room pain field
- )
- )
- sendResponse(ContinentalLockUpdateMessage(PlanetSideGUID(13), PlanetSideEmpire.VS)) // "The VS have captured the VS Sanctuary."
- sendResponse(BroadcastWarpgateUpdateMessage(PlanetSideGUID(13), PlanetSideGUID(1), false, false, true)) // VS Sanctuary: Inactive Warpgate -> Broadcast Warpgate
- sendResponse(ZonePopulationUpdateMessage(PlanetSideGUID(13), 414, 138, 0, 138, 0, 138, 0, 138, 0))
+ case Zone.ClientInitialization(initZone) =>
+ val continentNumber = PlanetSideGUID(initZone.Number)
+ initZone.Buildings.foreach({ case(id, building) => initBuilding(continentNumber, PlanetSideGUID(id), building) })
+ sendResponse(ZonePopulationUpdateMessage(continentNumber, 414, 138, 0, 138, 0, 138, 0, 138, 0))
+ //ContinentLockUpdateMessage()
+ //CaptureFlagUpdateMessage()
+ //VanuModuleUpdateMessage()
+ //ModuleLimitsMessage()
+ //ZoneInfoMessage()
+ //ZoneInfoLockMessage()
+ //ZoneForcedCavernConnectionMessage()
case InterstellarCluster.ClientInitializationComplete(tplayer)=>
//this will cause the client to send back a BeginZoningMessage packet (see below)
+ sendResponse(ContinentalLockUpdateMessage(PlanetSideGUID(13), PlanetSideEmpire.VS)) // "The VS have captured the VS Sanctuary."
+ sendResponse(BroadcastWarpgateUpdateMessage(PlanetSideGUID(13), PlanetSideGUID(1), false, false, true)) // VS Sanctuary: Inactive Warpgate -> Broadcast Warpgate
+
sendResponse(LoadMapMessage(continent.Map.Name, continent.Id, 40100,25,true,3770441820L)) //VS Sanctuary
log.info("Load the now-registered player")
//load the now-registered player
@@ -1241,12 +1228,9 @@ class WorldSessionActor extends Actor with MDCContextAware {
case msg @ BeginZoningMessage() =>
log.info("Reticulating splines ...")
//map-specific initializations
- //TODO continent.ClientConfiguration()
- sendResponse(PlanetsideAttributeMessage(PlanetSideGUID(0), 112, 1))
-
- sendResponse(SetEmpireMessage(PlanetSideGUID(2), PlanetSideEmpire.VS)) //HART building C
- sendResponse(SetEmpireMessage(PlanetSideGUID(29), PlanetSideEmpire.NC)) //South Villa Gun Tower
-
+ configZone(continent) //todo density
+ //sendResponse(SetEmpireMessage(PlanetSideGUID(2), PlanetSideEmpire.VS)) //HART building C
+ //sendResponse(SetEmpireMessage(PlanetSideGUID(29), PlanetSideEmpire.NC)) //South Villa Gun Tower
sendResponse(TimeOfDayMessage(1191182336))
sendResponse(ReplicationStreamMessage(5, Some(6), Vector(SquadListing()))) //clear squad list
@@ -3050,6 +3034,73 @@ class WorldSessionActor extends Actor with MDCContextAware {
log.error(s"DeployRequest: $obj can not transition to $state - $reason$mobileShift")
}
+ def initBuilding(continentNumber : PlanetSideGUID, buildingNumber : PlanetSideGUID, building : Building) : Unit = {
+ sendResponse(
+ BuildingInfoUpdateMessage(
+ continentNumber, buildingNumber,
+ 10,
+ false,
+ PlanetSideEmpire.NEUTRAL,
+ 0,
+ building.Faction,
+ 0,
+ None,
+ PlanetSideGeneratorState.Normal,
+ true,
+ false,
+ 0,
+ 0,
+ Nil,
+ 0,
+ false,
+ 8,
+ None,
+ false,
+ false
+ )
+ )
+ // sendResponse(
+ // BuildingInfoUpdateMessage(
+ // PlanetSideGUID(6), //Ceryshen
+ // PlanetSideGUID(2), //Anguta
+ // 8, //80% NTU
+ // true, //Base hacked
+ // PlanetSideEmpire.NC, //Base hacked by NC
+ // 600000, //10 minutes remaining for hack
+ // PlanetSideEmpire.VS, //Base owned by VS
+ // 0, //!! Field != 0 will cause malformed packet. See class def.
+ // None,
+ // PlanetSideGeneratorState.Critical, //Generator critical
+ // true, //Respawn tubes destroyed
+ // true, //Force dome active
+ // 16, //Tech plant lattice benefit
+ // 0,
+ // Nil, //!! Field > 0 will cause malformed packet. See class def.
+ // 0,
+ // false,
+ // 8, //!! Field != 8 will cause malformed packet. See class def.
+ // None,
+ // true, //Boosted spawn room pain field
+ // true //Boosted generator room pain field
+ // )
+ // )
+ //TODO DensityLevelUpdateMessage()
+ //TODO BroadcastWarpgateUpdateMessage() for warp gates
+ }
+
+ def configZone(zone : Zone) : Unit = {
+ zone.Buildings.foreach({case (id, building) =>
+ sendResponse(SetEmpireMessage(PlanetSideGUID(id), building.Faction))
+ //TODO HackMessage() ?
+ building.Amenities.foreach(amenity => {
+ val amenityId = amenity.GUID
+ //TODO HackMessage() ?
+ sendResponse(PlanetsideAttributeMessage(amenityId, 50, 0))
+ sendResponse(PlanetsideAttributeMessage(amenityId, 51, 0))
+ })
+ })
+ }
+
def failWithError(error : String) = {
log.error(error)
sendResponse(ConnectionClose())
diff --git a/pslogin/src/main/scala/Zones.scala b/pslogin/src/main/scala/Zones.scala
index 60de7f9c8..352c27294 100644
--- a/pslogin/src/main/scala/Zones.scala
+++ b/pslogin/src/main/scala/Zones.scala
@@ -39,7 +39,7 @@ object Zones {
super.Init(context)
import net.psforever.types.PlanetSideEmpire
- Building(2).get.Faction = PlanetSideEmpire.VS //HART building C
+ Buildings.values.foreach(building => { building.Faction = PlanetSideEmpire.VS })
Building(29).get.Faction = PlanetSideEmpire.NC //South Villa Gun Tower
}
}