From 77b4890706cc6b8aaaf047fc2c9f8aa4d0cf0555 Mon Sep 17 00:00:00 2001 From: FateJH Date: Fri, 2 Mar 2018 21:38:46 -0500 Subject: [PATCH] begin initialization of buildings and configuration of their amenities; reorganize entries in Maps.scala to better associate buildings and amenities --- .../objects/zones/InterstellarCluster.scala | 4 +- .../net/psforever/objects/zones/Zone.scala | 27 +--- pslogin/src/main/scala/Maps.scala | 110 ++++++++-------- .../src/main/scala/WorldSessionActor.scala | 123 +++++++++++++----- pslogin/src/main/scala/Zones.scala | 2 +- 5 files changed, 153 insertions(+), 113 deletions(-) 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 e09d55c2..ddd70cca 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 13e05504..f084443d 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 d8c854c8..0a67c6c5 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 a7c9d8f3..1fef2f1f 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 60de7f9c..352c2729 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 } }