From 4838c991b3d17fbcb78abd73752539de99d9ec73 Mon Sep 17 00:00:00 2001 From: Fate-JH Date: Sun, 1 Feb 2026 09:46:15 -0500 Subject: [PATCH] working VehicleService based on GenericServiceEvent(WithSupport); manually corrected almost every message to VehicleService to ensure channel and filters are preserved --- .codecov.yml | 1 - .../actor/objects/VehicleSpawnPadTest.scala | 10 +- .../CustomerServiceRepresentativeMode.scala | 4 +- .../session/csr/MountHandlerLogic.scala | 14 +- .../actors/session/csr/VehicleLogic.scala | 43 +- .../session/normal/MountHandlerLogic.scala | 14 +- .../session/normal/VehicleHandlerLogic.scala | 247 +++++----- .../actors/session/normal/VehicleLogic.scala | 43 +- .../session/spectator/MountHandlerLogic.scala | 14 +- .../spectator/VehicleHandlerLogic.scala | 115 ++--- .../session/spectator/VehicleLogic.scala | 19 +- .../session/support/GeneralOperations.scala | 3 +- .../actors/session/support/SessionData.scala | 3 +- .../support/SessionMountHandlers.scala | 27 +- .../support/SessionVehicleHandlers.scala | 4 +- .../WeaponAndProjectileOperations.scala | 21 +- .../session/support/ZoningOperations.scala | 20 +- .../objects/FieldTurretDeployable.scala | 3 +- .../psforever/objects/SensorDeployable.scala | 4 +- .../objects/ShieldGeneratorDeployable.scala | 19 +- .../psforever/objects/TurretDeployable.scala | 3 +- .../net/psforever/objects/Vehicles.scala | 21 +- .../equipment/ArmorSiphonBehavior.scala | 7 +- .../objects/equipment/JammingUnit.scala | 7 +- .../damage/DamageableVehicle.scala | 12 +- .../damage/DamageableWeaponTurret.scala | 14 +- .../deploy/DeploymentBehavior.scala | 8 +- .../pad/VehicleSpawnControl.scala | 40 +- .../serverobject/pad/VehicleSpawnPad.scala | 34 +- .../VehicleSpawnControlConcealPlayer.scala | 3 +- .../VehicleSpawnControlDriverControl.scala | 3 +- .../VehicleSpawnControlFinalClearance.scala | 12 +- .../VehicleSpawnControlLoadVehicle.scala | 3 +- .../process/VehicleSpawnControlRailJack.scala | 3 +- .../VehicleSpawnControlSeatDriver.scala | 5 +- ...cleSpawnControlServerVehicleOverride.scala | 7 +- .../repair/RepairableWeaponTurret.scala | 3 +- .../resourcesilo/ResourceSiloControl.scala | 4 +- .../terminals/ProximityTerminalControl.scala | 5 +- .../implant/ImplantTerminalMechControl.scala | 4 +- .../turret/FacilityTurretControl.scala | 7 +- .../serverobject/turret/WeaponTurrets.scala | 11 +- .../vehicles/AntTransferBehavior.scala | 13 +- .../vehicles/BfrTransferBehavior.scala | 2 +- .../objects/vehicles/CarrierBehavior.scala | 46 +- .../objects/vehicles/control/AmsControl.scala | 9 +- .../objects/vehicles/control/ApcControl.scala | 7 +- .../objects/vehicles/control/BfrControl.scala | 21 +- .../vehicles/control/VehicleCapacitance.scala | 3 +- .../vehicles/control/VehicleControl.scala | 27 +- .../net/psforever/objects/zones/MapInfo.scala | 5 +- .../objects/zones/ZoneVehicleActor.scala | 3 +- .../services/avatar/AvatarService.scala | 2 +- .../services/base/GenericEventService.scala | 28 +- .../base/GenericEventServiceWithSupport.scala | 22 +- .../services/base/bus/GenericEventBus.scala | 4 + .../base/bus/GenericEventBusWithSupport.scala | 2 +- .../services/galaxy/GalaxyService.scala | 10 +- .../services/local/LocalService.scala | 2 +- .../services/vehicle/VehicleAction.scala | 196 ++++++++ .../services/vehicle/VehicleService.scala | 452 +----------------- .../vehicle/VehicleServiceMessage.scala | 162 +------ .../vehicle/VehicleServiceResponse.scala | 138 +----- .../vehicle/support/TurretUpgrader.scala | 5 +- src/test/scala/objects/DamageableTest.scala | 26 +- src/test/scala/objects/DeploymentTest.scala | 26 +- .../scala/objects/FacilityTurretTest.scala | 2 +- src/test/scala/objects/RepairableTest.scala | 2 +- .../scala/objects/VehicleControlTest.scala | 48 +- .../scala/service/VehicleServiceTest.scala | 92 ++-- 70 files changed, 793 insertions(+), 1406 deletions(-) create mode 100644 src/main/scala/net/psforever/services/vehicle/VehicleAction.scala diff --git a/.codecov.yml b/.codecov.yml index b34307e32..06eb9388a 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -77,4 +77,3 @@ ignore: - "src/main/scala/net/psforever/services/hart/HartTimerActions.scala" - "src/main/scala/net/psforever/services/local/LocalAction.scala" - "src/main/scala/net/psforever/services/vehicle/VehicleAction.scala" - - "src/main/scala/net/psforever/services/vehicle/VehicleResponse.scala" diff --git a/server/src/test/scala/actor/objects/VehicleSpawnPadTest.scala b/server/src/test/scala/actor/objects/VehicleSpawnPadTest.scala index 6ca49eca0..1691f6244 100644 --- a/server/src/test/scala/actor/objects/VehicleSpawnPadTest.scala +++ b/server/src/test/scala/actor/objects/VehicleSpawnPadTest.scala @@ -82,11 +82,11 @@ class VehicleSpawnControl3Test extends ActorTest { probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.ServerVehicleOverrideStart]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.ServerVehicleOverrideEnd]) assert(probe.receiveOne(1 minute) match { - case VehicleSpawnPad.PeriodicReminder(_, VehicleSpawnPad.Reminders.Blocked, _) => true + case VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, _) => true case _ => false }) assert(probe.receiveOne(1 minute) match { - case VehicleSpawnPad.PeriodicReminder(_, VehicleSpawnPad.Reminders.Blocked, _) => true + case VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, _) => true case _ => false }) @@ -139,7 +139,7 @@ class VehicleSpawnControl5Test extends ActorTest() { probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.DetachFromRails]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer]) assert(probe.receiveOne(1 minute) match { - case VehicleServiceMessage(_, VehicleAction.LoadVehicle(_, _, _, _, _)) => true + case VehicleServiceMessage(_, _, VehicleAction.LoadVehicle(_, _, _, _, _)) => true case _ => false }) assert(probe.receiveOne(1 minute) match { @@ -166,7 +166,7 @@ class VehicleSpawnControl6Test extends ActorTest() { probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.DetachFromRails]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer]) assert(probe.receiveOne(1 minute) match { - case VehicleServiceMessage(_, VehicleAction.LoadVehicle(_, _, _, _, _)) => true + case VehicleServiceMessage(_, _, VehicleAction.LoadVehicle(_, _, _, _, _)) => true case _ => false }) assert(probe.receiveOne(1 minute) match { @@ -194,7 +194,7 @@ class VehicleSpawnControl7Test extends ActorTest { probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.DetachFromRails]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer]) assert(probe.receiveOne(1 minute) match { - case VehicleServiceMessage(_, VehicleAction.LoadVehicle(_, _, _, _, _)) => true + case VehicleServiceMessage(_, _, VehicleAction.LoadVehicle(_, _, _, _, _)) => true case _ => false }) assert(probe.receiveOne(1 minute) match { diff --git a/src/main/scala/net/psforever/actors/session/csr/CustomerServiceRepresentativeMode.scala b/src/main/scala/net/psforever/actors/session/csr/CustomerServiceRepresentativeMode.scala index de3d59d25..419174a9c 100644 --- a/src/main/scala/net/psforever/actors/session/csr/CustomerServiceRepresentativeMode.scala +++ b/src/main/scala/net/psforever/actors/session/csr/CustomerServiceRepresentativeMode.scala @@ -203,7 +203,7 @@ case object CustomerServiceRepresentativeMode extends PlayerMode { data.sendResponse(PlanetsideAttributeMessage(guid, shieldsUi, maxShieldsOfVehicle)) data.continent.VehicleEvents ! VehicleServiceMessage( data.continent.id, - VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), guid, shieldsUi, maxShieldsOfVehicle) + VehicleAction.PlanetsideAttribute(guid, shieldsUi, maxShieldsOfVehicle) ) } } @@ -217,7 +217,7 @@ case object CustomerServiceRepresentativeMode extends PlayerMode { data.sendResponse(PlanetsideAttributeMessage(guid, 0, maxHealthOf)) data.continent.VehicleEvents ! VehicleServiceMessage( data.continent.id, - VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), guid, 0, maxHealthOf) + VehicleAction.PlanetsideAttribute(guid, 0, maxHealthOf) ) } } diff --git a/src/main/scala/net/psforever/actors/session/csr/MountHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/csr/MountHandlerLogic.scala index 1965825ab..a397908dd 100644 --- a/src/main/scala/net/psforever/actors/session/csr/MountHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/csr/MountHandlerLogic.scala @@ -15,7 +15,6 @@ import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret} import net.psforever.objects.vehicles.AccessPermissionGroup import net.psforever.objects.vital.InGameHistory import net.psforever.packet.game.{ChatMsg, DelayedPathMountMsg, DismountVehicleCargoMsg, DismountVehicleMsg, GenericObjectActionMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectDetachMessage, PlanetsideAttributeMessage, PlayerStasisMessage, PlayerStateShiftMessage, ShiftState} -import net.psforever.services.Service import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.types.{BailType, ChatMessageType, DriveState, PlanetSideGUID, Vector3} @@ -215,7 +214,7 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act //DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages events ! VehicleServiceMessage( player.Name, - VehicleAction.SendResponse(Service.defaultPlayerGUID, PlayerStasisMessage(pguid)) //the stasis message + VehicleAction.SendResponse(PlayerStasisMessage(pguid)) //the stasis message ) //when the player dismounts, they will be positioned where the shuttle was when it disappeared in the sky //the player will fall to the ground and is perfectly vulnerable in this state @@ -223,14 +222,12 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act //having no in-game avatar target will throw us out of the map screen when deploying and cause softlock events ! VehicleServiceMessage( player.Name, - VehicleAction.SendResponse( - Service.defaultPlayerGUID, - PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay - ) + VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None))) ) events ! VehicleServiceMessage( continent.id, - VehicleAction.SendResponse(pguid, GenericObjectActionMessage(pguid, code=9)) //conceal the player + pguid, + VehicleAction.SendResponse(GenericObjectActionMessage(pguid, code=9)) //conceal the player ) sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive @@ -258,7 +255,8 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act case Mountable.CanDismount(obj: Vehicle, seat_num, _) => continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.KickPassenger(tplayer.GUID, seat_num, unk2=true, obj.GUID) + tplayer.GUID, + VehicleAction.KickPassenger(seat_num, unk2=true, obj.GUID) ) case Mountable.CanDismount(obj: PlanetSideGameObject with PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) => diff --git a/src/main/scala/net/psforever/actors/session/csr/VehicleLogic.scala b/src/main/scala/net/psforever/actors/session/csr/VehicleLogic.scala index 6870f3c12..30400f266 100644 --- a/src/main/scala/net/psforever/actors/session/csr/VehicleLogic.scala +++ b/src/main/scala/net/psforever/actors/session/csr/VehicleLogic.scala @@ -78,8 +78,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex // continent.VehicleEvents ! VehicleServiceMessage( continent.id, + player.GUID, VehicleAction.VehicleState( - player.GUID, vehicle_guid, unk1, position, @@ -166,23 +166,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex obj.DeploymentState = if (is_crouched || !notMountedState) DriveState.Kneeling else DriveState.Mobile continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.FrameVehicleState( - player.GUID, - vehicle_guid, - unk1, - position, - angle, - velocity, - unk2, - unk3, - unk4, - is_crouched, - is_airborne, - ascending_flight, - flight_time, - unk9, - unkA - ) + player.GUID, + VehicleAction.FrameVehicleState(vehicle_guid, unk1, position, angle, velocity, unk2, unk3, unk4, is_crouched, is_airborne, ascending_flight, flight_time, unk9, unkA) ) sessionLogic.squad.updateSquad() case (None, _) => @@ -236,7 +221,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex player.Orientation = angle continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.ChildObjectState(player.GUID, object_guid, pitch, yaw) + player.GUID, + VehicleAction.ChildObjectState(object_guid, pitch, yaw) ) } //TODO status condition of "playing getting out of vehicle to allow for late packets without warning @@ -258,20 +244,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex obj.zoneInteractions() continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.VehicleState( - player.GUID, - vehicle_guid, - unk1, - pos, - ang, - obj.Velocity, - obj.Flying, - 0, - 0, - 15, - unk5 = false, - obj.Cloaked - ) + player.GUID, + VehicleAction.VehicleState(vehicle_guid, unk1, pos, ang, obj.Velocity, obj.Flying, 0, 0, 15, unk5 = false, obj.Cloaked) ) } } @@ -330,7 +304,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, unk3=false, Vector3.Zero)) continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.DeployRequest(player.GUID, obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero) + player.GUID, + VehicleAction.DeployRequest(obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero) ) } } diff --git a/src/main/scala/net/psforever/actors/session/normal/MountHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/normal/MountHandlerLogic.scala index ae8399757..96f629a6b 100644 --- a/src/main/scala/net/psforever/actors/session/normal/MountHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/MountHandlerLogic.scala @@ -16,7 +16,6 @@ import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret} import net.psforever.objects.vehicles.AccessPermissionGroup import net.psforever.objects.vital.InGameHistory import net.psforever.packet.game.{ChatMsg, DelayedPathMountMsg, DismountVehicleCargoMsg, DismountVehicleMsg, GenericObjectActionMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectDetachMessage, PlanetsideAttributeMessage, PlayerStasisMessage, PlayerStateShiftMessage, ShiftState} -import net.psforever.services.Service import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.types.{BailType, ChatMessageType, DriveState, PlanetSideGUID, Vector3} @@ -251,7 +250,7 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act //DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages events ! VehicleServiceMessage( player.Name, - VehicleAction.SendResponse(Service.defaultPlayerGUID, PlayerStasisMessage(pguid)) //the stasis message + VehicleAction.SendResponse(PlayerStasisMessage(pguid)) //the stasis message ) //when the player dismounts, they will be positioned where the shuttle was when it disappeared in the sky //the player will fall to the ground and is perfectly vulnerable in this state @@ -259,14 +258,12 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act //having no in-game avatar target will throw us out of the map screen when deploying and cause softlock events ! VehicleServiceMessage( player.Name, - VehicleAction.SendResponse( - Service.defaultPlayerGUID, - PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay - ) + VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None))) ) events ! VehicleServiceMessage( continent.id, - VehicleAction.SendResponse(pguid, GenericObjectActionMessage(pguid, code=9)) //conceal the player + pguid, + VehicleAction.SendResponse(GenericObjectActionMessage(pguid, code=9)) //conceal the player ) sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive @@ -295,7 +292,8 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act case Mountable.CanDismount(obj: Vehicle, seat_num, _) => continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.KickPassenger(tplayer.GUID, seat_num, unk2=true, obj.GUID) + tplayer.GUID, + VehicleAction.KickPassenger(seat_num, unk2=true, obj.GUID) ) case Mountable.CanDismount(obj: PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) => diff --git a/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala index f6102dedb..4eef98263 100644 --- a/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/VehicleHandlerLogic.scala @@ -14,8 +14,9 @@ import net.psforever.objects.serverobject.pad.VehicleSpawnPad import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChatMsg, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, HitHint, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage} import net.psforever.services.Service +import net.psforever.services.base.EventResponse import net.psforever.services.local.support.CaptureFlagManager -import net.psforever.services.vehicle.{VehicleResponse, VehicleServiceResponse} +import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse} import net.psforever.types.{BailType, ChatMessageType, PlanetSideGUID, Vector3} object VehicleHandlerLogic { @@ -38,7 +39,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: * @param guid na * @param reply na */ - def handle(toChannel: String, guid: PlanetSideGUID, reply: VehicleResponse.Response): Unit = { + def handle(toChannel: String, guid: PlanetSideGUID, reply: EventResponse): Unit = { val resolvedPlayerGuid = if (player.HasGUID) { player.GUID } else { @@ -46,7 +47,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: } val isNotSameTarget = resolvedPlayerGuid != guid reply match { - case VehicleResponse.VehicleState( + case VehicleAction.VehicleState( vehicleGuid, unk1, pos, @@ -74,7 +75,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: } } - case VehicleResponse.VehicleState( + case VehicleAction.VehicleState( vehicleGuid, unk1, pos, @@ -90,23 +91,23 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: //player who is watching the vehicle from the outside sendResponse(VehicleStateMessage(vehicleGuid, unk1, pos, ang, vel, unk2, unk3, unk4, wheelDirection, unk5, unk6)) - case VehicleResponse.ChildObjectState(objectGuid, pitch, yaw) if isNotSameTarget => + case VehicleAction.ChildObjectState(objectGuid, pitch, yaw) if isNotSameTarget => sendResponse(ChildObjectStateMessage(objectGuid, pitch, yaw)) - case VehicleResponse.FrameVehicleState(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA) + case VehicleAction.FrameVehicleState(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA) if isNotSameTarget => sendResponse(FrameVehicleStateMessage(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA)) - case VehicleResponse.ChangeFireState_Start(weaponGuid) if isNotSameTarget => + case VehicleAction.ChangeFireState_Start(weaponGuid) if isNotSameTarget => sendResponse(ChangeFireStateMessage_Start(weaponGuid)) - case VehicleResponse.ChangeFireState_Stop(weaponGuid) if isNotSameTarget => + case VehicleAction.ChangeFireState_Stop(weaponGuid) if isNotSameTarget => sendResponse(ChangeFireStateMessage_Stop(weaponGuid)) - case VehicleResponse.Reload(itemGuid) if isNotSameTarget => + case VehicleAction.Reload(itemGuid) if isNotSameTarget => sendResponse(ReloadMessage(itemGuid, ammo_clip=1, unk1=0)) - case VehicleResponse.ChangeAmmo(weapon_guid, weapon_slot, previous_guid, ammo_id, ammo_guid, ammo_data) if isNotSameTarget => + case VehicleAction.ChangeAmmo(weapon_guid, weapon_slot, previous_guid, ammo_id, ammo_guid, ammo_data) if isNotSameTarget => sendResponse(ObjectDetachMessage(weapon_guid, previous_guid, Vector3.Zero, 0)) //TODO? sendResponse(ObjectDeleteMessage(previousAmmoGuid, 0)) sendResponse( @@ -119,7 +120,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: ) sendResponse(ChangeAmmoMessage(weapon_guid, 1)) - case VehicleResponse.WeaponDryFire(weaponGuid) if isNotSameTarget => + case VehicleAction.WeaponDryFire(weaponGuid) if isNotSameTarget => continent.GUID(weaponGuid).collect { case tool: Tool if tool.Magazine == 0 => // check that the magazine is still empty before sending WeaponDryFireMessage @@ -127,45 +128,28 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: sendResponse(WeaponDryFireMessage(weaponGuid)) } - case VehicleResponse.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget => + case VehicleAction.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget => sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver)) - case VehicleResponse.MountVehicle(vehicleGuid, seat) if isNotSameTarget => + case VehicleAction.MountVehicle(vehicleGuid, seat) if isNotSameTarget => sendResponse(ObjectAttachMessage(vehicleGuid, guid, seat)) - case VehicleResponse.DeployRequest(objectGuid, state, unk1, unk2, pos) if isNotSameTarget => + case VehicleAction.DeployRequest(objectGuid, state, unk1, unk2, pos) if isNotSameTarget => sendResponse(DeployRequestMessage(guid, objectGuid, state, unk1, unk2, pos)) - case VehicleResponse.SendResponse(msg) => + case VehicleAction.SendResponse(msg) => sendResponse(msg) - case VehicleResponse.AttachToRails(vehicleGuid, padGuid) => - sendResponse(ObjectAttachMessage(padGuid, vehicleGuid, slot=3)) - - case VehicleResponse.ConcealPlayer(playerGuid) => - sendResponse(GenericObjectActionMessage(playerGuid, code=9)) - - case VehicleResponse.DetachFromRails(vehicleGuid, padGuid, padPosition, padOrientationZ) => - val pad = continent.GUID(padGuid).get.asInstanceOf[VehicleSpawnPad].Definition - sendResponse( - ObjectDetachMessage( - padGuid, - vehicleGuid, - padPosition + Vector3.z(pad.VehicleCreationZOffset), - padOrientationZ + pad.VehicleCreationZOrientOffset - ) - ) - - case VehicleResponse.EquipmentInSlot(pkt) if isNotSameTarget => + case VehicleAction.EquipmentCreatedInSlot(pkt) if isNotSameTarget => sendResponse(pkt) - case VehicleResponse.GenericObjectAction(objectGuid, action) if isNotSameTarget => + case VehicleAction.GenericObjectAction(objectGuid, action) if isNotSameTarget => sendResponse(GenericObjectActionMessage(objectGuid, action)) - case VehicleResponse.HitHint(sourceGuid) if player.isAlive => + case VehicleAction.HitHint(sourceGuid) if player.isAlive => sendResponse(HitHint(sourceGuid, player.GUID)) - case VehicleResponse.InventoryState(obj, parentGuid, start, conData) if isNotSameTarget => + case VehicleAction.InventoryState(obj, parentGuid, start, conData) if isNotSameTarget => //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly? val objGuid = obj.GUID sendResponse(ObjectDeleteMessage(objGuid, unk1=0)) @@ -176,7 +160,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: conData )) - case VehicleResponse.KickPassenger(_, wasKickedByDriver, vehicleGuid) if resolvedPlayerGuid == guid => + case VehicleAction.KickPassenger(_, wasKickedByDriver, vehicleGuid) if resolvedPlayerGuid == guid => //seat number (first field) seems to be correct if passenger is kicked manually by driver //but always seems to return 4 if user is kicked by mount permissions changing sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver)) @@ -190,47 +174,41 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: log.info(s"${player.Name} has been kicked from $typeOfRide!") player.WhichSide = OutsideOf - case VehicleResponse.KickPassenger(_, wasKickedByDriver, _) => + case VehicleAction.KickPassenger(_, wasKickedByDriver, _) => //seat number (first field) seems to be correct if passenger is kicked manually by driver //but always seems to return 4 if user is kicked by mount permissions changing sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver)) - case VehicleResponse.InventoryState2(objGuid, parentGuid, value) if isNotSameTarget => + case VehicleAction.InventoryState2(objGuid, parentGuid, value) if isNotSameTarget => sendResponse(InventoryStateMessage(objGuid, unk=0, parentGuid, value)) - case VehicleResponse.LoadVehicle(vehicle, vtype, vguid, vdata) if isNotSameTarget => + case VehicleAction.LoadVehicle(vehicle, vtype, vguid, vdata) if isNotSameTarget => //this is not be suitable for vehicles with people who are seated in it before it spawns (if that is possible) sendResponse(ObjectCreateMessage(vtype, vguid, vdata)) Vehicles.ReloadAccessPermissions(vehicle, player.Name) - case VehicleResponse.ObjectDelete(itemGuid) if isNotSameTarget => + case VehicleAction.ObjectDelete(itemGuid) if isNotSameTarget => sendResponse(ObjectDeleteMessage(itemGuid, unk1=0)) - case VehicleResponse.Ownership(vehicleGuid) if resolvedPlayerGuid == guid => + case VehicleAction.Ownership(vehicleGuid) if resolvedPlayerGuid == guid => //Only the player that owns this vehicle needs the ownership packet avatarActor ! AvatarActor.SetVehicle(Some(vehicleGuid)) sendResponse(PlanetsideAttributeMessage(resolvedPlayerGuid, attribute_type=21, vehicleGuid)) - case VehicleResponse.LoseOwnership(_, vehicleGuid) => + case VehicleAction.LoseOwnership(_, vehicleGuid) => ops.announceAmsDecay(vehicleGuid,msg = "@ams_decaystarted") - case VehicleResponse.PlanetsideAttribute(vehicleGuid, attributeType, attributeValue) if isNotSameTarget => + case VehicleAction.PlanetsideAttribute(vehicleGuid, attributeType, attributeValue) if isNotSameTarget => sendResponse(PlanetsideAttributeMessage(vehicleGuid, attributeType, attributeValue)) - case VehicleResponse.ResetSpawnPad(padGuid) => - sendResponse(GenericObjectActionMessage(padGuid, code=23)) - - case VehicleResponse.RevealPlayer(playerGuid) => - sendResponse(GenericObjectActionMessage(playerGuid, code=10)) - - case VehicleResponse.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget => + case VehicleAction.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget => sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission)) - case VehicleResponse.StowEquipment(vehicleGuid, slot, itemType, itemGuid, itemData) if isNotSameTarget => + case VehicleAction.StowCreatedEquipment(vehicleGuid, slot, itemType, itemGuid, itemData) if isNotSameTarget => //TODO prefer ObjectAttachMessage, but how to force ammo pools to update properly? sendResponse(ObjectCreateDetailedMessage(itemType, itemGuid, ObjectCreateMessageParent(vehicleGuid, slot), itemData)) - case VehicleResponse.UnloadVehicle(_, vehicleGuid) => + case VehicleAction.UnloadVehicle(_, vehicleGuid) => sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1)) if (sessionLogic.zoning.spawn.prevSpawnPoint.map(_.Owner).exists { case ams: Vehicle => @@ -243,22 +221,22 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: sendResponse(ChatMsg(ChatMessageType.UNK_229, "@ams_decayed")) } - case VehicleResponse.UnstowEquipment(itemGuid) if isNotSameTarget => + case VehicleAction.UnstowEquipment(itemGuid) if isNotSameTarget => //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly? sendResponse(ObjectDeleteMessage(itemGuid, unk1=0)) - case VehicleResponse.UpdateAmsSpawnPoint(list) => + case VehicleAction.UpdateAmsSpawnList(list) => sessionLogic.zoning.spawn.amsSpawnPoints = list.filter(tube => tube.Faction == player.Faction) sessionLogic.zoning.spawn.DrawCurrentAmsSpawnPoint() - case VehicleResponse.TransferPassengerChannel(oldChannel, tempChannel, vehicle, vehicleToDelete) if isNotSameTarget => + case VehicleAction.TransferPassengerChannel(oldChannel, tempChannel, vehicle, vehicleToDelete) if isNotSameTarget => sessionLogic.zoning.interstellarFerry = Some(vehicle) sessionLogic.zoning.interstellarFerryTopLevelGUID = Some(vehicleToDelete) continent.VehicleEvents ! Service.Leave(Some(oldChannel)) //old vehicle-specific channel (was s"${vehicle.Actor}") galaxyService ! Service.Join(tempChannel) //temporary vehicle-specific channel log.debug(s"TransferPassengerChannel: ${player.Name} now subscribed to $tempChannel for vehicle gating") - case VehicleResponse.KickCargo(vehicle, speed, delay) + case VehicleAction.KickCargo(vehicle, speed, delay) if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive && speed > 0 => val strafe = 1 + Vehicles.CargoOrientation(vehicle) val reverseSpeed = if (strafe > 1) { 0 } else { speed } @@ -281,75 +259,14 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: context.system.scheduler.scheduleOnce( delay milliseconds, context.self, - VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleResponse.KickCargo(vehicle, speed=0, delay)) + VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleAction.KickCargo(vehicle, speed=0, delay)) ) - case VehicleResponse.KickCargo(cargo, _, _) + case VehicleAction.KickCargo(cargo, _, _) if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive => sessionLogic.vehicles.TotalDriverVehicleControl(cargo) - case VehicleResponse.StartPlayerSeatedInVehicle(vehicle, _) - if player.VisibleSlots.contains(player.DrawnSlot) => - player.DrawnSlot = Player.HandsDownSlot - startPlayerSeatedInVehicle(vehicle) - - case VehicleResponse.StartPlayerSeatedInVehicle(vehicle, _) => - startPlayerSeatedInVehicle(vehicle) - - case VehicleResponse.PlayerSeatedInVehicle(vehicle, _) => - Vehicles.ReloadAccessPermissions(vehicle, player.Name) - sessionLogic.vehicles.ServerVehicleOverrideWithPacket( - vehicle, - ServerVehicleOverrideMsg( - lock_accelerator=true, - lock_wheel=true, - reverse=true, - unk4=false, - lock_vthrust=1, - lock_strafe=0, - movement_speed=0, - unk8=Some(0) - ) - ) - sessionLogic.vehicles.serverVehicleControlVelocity = Some(0) - - case VehicleResponse.ServerVehicleOverrideStart(vehicle, _) => - val vdef = vehicle.Definition - sessionLogic.vehicles.ServerVehicleOverrideWithPacket( - vehicle, - ServerVehicleOverrideMsg( - lock_accelerator=true, - lock_wheel=true, - reverse=false, - unk4=false, - lock_vthrust=if (GlobalDefinitions.isFlightVehicle(vdef)) { 1 } else { 0 }, - lock_strafe=0, - movement_speed=vdef.AutoPilotSpeed1, - unk8=Some(0) - ) - ) - - case VehicleResponse.ServerVehicleOverrideEnd(vehicle, _) => - sessionLogic.vehicles.ServerVehicleOverrideStop(vehicle) - - case VehicleResponse.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, data) => - val str = s"${data.getOrElse("The vehicle spawn pad where you placed your order is blocked.")}" - val msg = if (str.contains("@")) { - ChatMsg(ChatMessageType.UNK_229, str) - } else { - ChatMsg(ChatMessageType.CMT_OPEN, wideContents = true, recipient = "", str, note = None) - } - sendResponse(msg) - - case VehicleResponse.PeriodicReminder(_, data) => - val (isType, flag, msg): (ChatMessageType, Boolean, String) = data match { - case Some(msg: String) if msg.startsWith("@") => (ChatMessageType.UNK_227, false, msg) - case Some(msg: String) => (ChatMessageType.CMT_OPEN, true, msg) - case _ => (ChatMessageType.CMT_OPEN, true, "Your vehicle order has been cancelled.") - } - sendResponse(ChatMsg(isType, flag, recipient="", msg, None)) - - case VehicleResponse.ChangeLoadout(target, oldWeapons, addedWeapons, oldInventory, newInventory) + case VehicleAction.ChangeLoadout(target, oldWeapons, addedWeapons, oldInventory, newInventory) if player.avatar.vehicle.contains(target) => //TODO when vehicle weapons can be changed without visual glitches, rewrite this continent.GUID(target).collect { case vehicle: Vehicle => @@ -373,7 +290,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory) } - case VehicleResponse.ChangeLoadout(target, oldWeapons, _, oldInventory, _) + case VehicleAction.ChangeLoadout(target, oldWeapons, _, oldInventory, _) if sessionLogic.general.accessedContainer.map(_.GUID).contains(target) => //TODO when vehicle weapons can be changed without visual glitches, rewrite this continent.GUID(target).collect { case vehicle: Vehicle => @@ -382,12 +299,96 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory) } - case VehicleResponse.ChangeLoadout(target, oldWeapons, _, oldInventory, _) => + case VehicleAction.ChangeLoadout(target, oldWeapons, _, oldInventory, _) => //TODO when vehicle weapons can be changed without visual glitches, rewrite this continent.GUID(target).collect { case vehicle: Vehicle => changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory) } + case VehicleSpawnPad.AttachToRails(vehicle, pad) => + sendResponse(ObjectAttachMessage(pad.GUID, vehicle.GUID, slot=3)) + + case VehicleSpawnPad.ConcealPlayer(playerGuid) => + sendResponse(GenericObjectActionMessage(playerGuid, code=9)) + + case VehicleSpawnPad.DetachFromRails(vehicle, pad) => + val padDefinition = pad.Definition + sendResponse( + ObjectDetachMessage( + pad.GUID, + vehicle.GUID, + pad.Position + Vector3.z(padDefinition.VehicleCreationZOffset), + pad.Orientation.z + padDefinition.VehicleCreationZOrientOffset + ) + ) + + case VehicleSpawnPad.ResetSpawnPad(pad) => + sendResponse(GenericObjectActionMessage(pad.GUID, code=23)) + + case VehicleSpawnPad.RevealPlayer(playerGuid) => + sendResponse(GenericObjectActionMessage(playerGuid, code=10)) + + case VehicleSpawnPad.StartPlayerSeatedInVehicle(vehicle, _) + if player.VisibleSlots.contains(player.DrawnSlot) => + player.DrawnSlot = Player.HandsDownSlot + startPlayerSeatedInVehicle(vehicle) + + case VehicleSpawnPad.StartPlayerSeatedInVehicle(vehicle, _) => + startPlayerSeatedInVehicle(vehicle) + + case VehicleSpawnPad.PlayerSeatedInVehicle(vehicle, _) => + Vehicles.ReloadAccessPermissions(vehicle, player.Name) + sessionLogic.vehicles.ServerVehicleOverrideWithPacket( + vehicle, + ServerVehicleOverrideMsg( + lock_accelerator=true, + lock_wheel=true, + reverse=true, + unk4=false, + lock_vthrust=1, + lock_strafe=0, + movement_speed=0, + unk8=Some(0) + ) + ) + sessionLogic.vehicles.serverVehicleControlVelocity = Some(0) + + case VehicleSpawnPad.ServerVehicleOverrideStart(vehicle, _) => + val vdef = vehicle.Definition + sessionLogic.vehicles.ServerVehicleOverrideWithPacket( + vehicle, + ServerVehicleOverrideMsg( + lock_accelerator=true, + lock_wheel=true, + reverse=false, + unk4=false, + lock_vthrust=if (GlobalDefinitions.isFlightVehicle(vdef)) { 1 } else { 0 }, + lock_strafe=0, + movement_speed=vdef.AutoPilotSpeed1, + unk8=Some(0) + ) + ) + + case VehicleSpawnPad.ServerVehicleOverrideEnd(vehicle, _) => + sessionLogic.vehicles.ServerVehicleOverrideStop(vehicle) + + case VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, data) => + val str = s"${data.getOrElse("The vehicle spawn pad where you placed your order is blocked.")}" + val msg = if (str.contains("@")) { + ChatMsg(ChatMessageType.UNK_229, str) + } else { + ChatMsg(ChatMessageType.CMT_OPEN, wideContents = true, recipient = "", str, note = None) + } + sendResponse(msg) + + case VehicleSpawnPad.PeriodicReminder(_, data) => + val (isType, flag, msg): (ChatMessageType, Boolean, String) = data match { + case Some(msg: String) if msg.startsWith("@") => (ChatMessageType.UNK_227, false, msg) + case Some(msg: String) => (ChatMessageType.CMT_OPEN, true, msg) + case _ => (ChatMessageType.CMT_OPEN, true, "Your vehicle order has been cancelled.") + } + sendResponse(ChatMsg(isType, flag, recipient="", msg, None)) + case _ => () } } diff --git a/src/main/scala/net/psforever/actors/session/normal/VehicleLogic.scala b/src/main/scala/net/psforever/actors/session/normal/VehicleLogic.scala index 883fbfe94..ed6e4171e 100644 --- a/src/main/scala/net/psforever/actors/session/normal/VehicleLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/VehicleLogic.scala @@ -77,8 +77,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex // continent.VehicleEvents ! VehicleServiceMessage( continent.id, + player.GUID, VehicleAction.VehicleState( - player.GUID, vehicle_guid, unk1, position, @@ -164,23 +164,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex obj.DeploymentState = if (is_crouched || !notMountedState) DriveState.Kneeling else DriveState.Mobile continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.FrameVehicleState( - player.GUID, - vehicle_guid, - unk1, - position, - angle, - velocity, - unk2, - unk3, - unk4, - is_crouched, - is_airborne, - ascending_flight, - flight_time, - unk9, - unkA - ) + player.GUID, + VehicleAction.FrameVehicleState(vehicle_guid, unk1, position, angle, velocity, unk2, unk3, unk4, is_crouched, is_airborne, ascending_flight, flight_time, unk9, unkA) ) sessionLogic.squad.updateSquad() case (None, _) => @@ -232,7 +217,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex player.Orientation = angle continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.ChildObjectState(player.GUID, object_guid, pitch, yaw) + player.GUID, + VehicleAction.ChildObjectState(object_guid, pitch, yaw) ) } //TODO status condition of "playing getting out of vehicle to allow for late packets without warning @@ -254,20 +240,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex obj.zoneInteractions() continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.VehicleState( - player.GUID, - vehicle_guid, - unk1, - pos, - ang, - obj.Velocity, - obj.Flying, - 0, - 0, - 15, - unk5 = false, - obj.Cloaked - ) + player.GUID, + VehicleAction.VehicleState(vehicle_guid, unk1, pos, ang, obj.Velocity, obj.Flying, 0, 0, 15, unk5 = false, obj.Cloaked) ) } } @@ -348,7 +322,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, unk3=false, Vector3.Zero)) continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.DeployRequest(player.GUID, obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero) + player.GUID, + VehicleAction.DeployRequest(obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero) ) "; enforcing Mobile deployment state" } else { diff --git a/src/main/scala/net/psforever/actors/session/spectator/MountHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/spectator/MountHandlerLogic.scala index 42214bbd4..de1e1323b 100644 --- a/src/main/scala/net/psforever/actors/session/spectator/MountHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/spectator/MountHandlerLogic.scala @@ -12,7 +12,6 @@ import net.psforever.objects.serverobject.mount.Mountable import net.psforever.objects.serverobject.terminals.implant.ImplantTerminalMech import net.psforever.objects.vital.InGameHistory import net.psforever.packet.game.{DelayedPathMountMsg, DismountVehicleCargoMsg, DismountVehicleMsg, GenericObjectActionMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectDetachMessage, PlayerStasisMessage, PlayerStateShiftMessage, ShiftState} -import net.psforever.services.Service import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} @@ -78,7 +77,7 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act //DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages events ! VehicleServiceMessage( player.Name, - VehicleAction.SendResponse(Service.defaultPlayerGUID, PlayerStasisMessage(pguid)) //the stasis message + VehicleAction.SendResponse(PlayerStasisMessage(pguid)) //the stasis message ) //when the player dismounts, they will be positioned where the shuttle was when it disappeared in the sky //the player will fall to the ground and is perfectly vulnerable in this state @@ -86,14 +85,12 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act //having no in-game avatar target will throw us out of the map screen when deploying and cause softlock events ! VehicleServiceMessage( player.Name, - VehicleAction.SendResponse( - Service.defaultPlayerGUID, - PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay - ) + VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None))) ) events ! VehicleServiceMessage( continent.id, - VehicleAction.SendResponse(pguid, GenericObjectActionMessage(pguid, code=9)) //conceal the player + pguid, + VehicleAction.SendResponse(GenericObjectActionMessage(pguid, code=9)) //conceal the player ) context.self ! SessionActor.SetMode(NormalMode) sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive @@ -113,7 +110,8 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act case Mountable.CanDismount(obj: Vehicle, seat_num, _) => continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.KickPassenger(tplayer.GUID, seat_num, unk2=true, obj.GUID) + tplayer.GUID, + VehicleAction.KickPassenger(seat_num, unk2=true, obj.GUID) ) case Mountable.CanDismount(obj: PlanetSideGameObject with PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) => diff --git a/src/main/scala/net/psforever/actors/session/spectator/VehicleHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/spectator/VehicleHandlerLogic.scala index d68308a68..ddb2d7b27 100644 --- a/src/main/scala/net/psforever/actors/session/spectator/VehicleHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/spectator/VehicleHandlerLogic.scala @@ -7,8 +7,9 @@ import net.psforever.objects.{Tool, Vehicle, Vehicles} import net.psforever.objects.equipment.Equipment import net.psforever.objects.serverobject.pad.VehicleSpawnPad import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent -import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, HitHint, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage} -import net.psforever.services.vehicle.{VehicleResponse, VehicleServiceResponse} +import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage} +import net.psforever.services.base.EventResponse +import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse} import net.psforever.types.{BailType, PlanetSideGUID, Vector3} object VehicleHandlerLogic { @@ -31,7 +32,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: * @param guid na * @param reply na */ - def handle(toChannel: String, guid: PlanetSideGUID, reply: VehicleResponse.Response): Unit = { + def handle(toChannel: String, guid: PlanetSideGUID, reply: EventResponse): Unit = { val resolvedPlayerGuid = if (player.HasGUID) { player.GUID } else { @@ -39,7 +40,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: } val isNotSameTarget = resolvedPlayerGuid != guid reply match { - case VehicleResponse.VehicleState( + case VehicleAction.VehicleState( vehicleGuid, unk1, pos, @@ -59,7 +60,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: player.Velocity = vel sessionLogic.updateLocalBlockMap(pos) - case VehicleResponse.VehicleState( + case VehicleAction.VehicleState( vehicleGuid, unk1, pos, @@ -75,23 +76,23 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: //player who is watching the vehicle from the outside sendResponse(VehicleStateMessage(vehicleGuid, unk1, pos, ang, vel, unk2, unk3, unk4, wheelDirection, unk5, unk6)) - case VehicleResponse.ChildObjectState(objectGuid, pitch, yaw) if isNotSameTarget => + case VehicleAction.ChildObjectState(objectGuid, pitch, yaw) if isNotSameTarget => sendResponse(ChildObjectStateMessage(objectGuid, pitch, yaw)) - case VehicleResponse.FrameVehicleState(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA) + case VehicleAction.FrameVehicleState(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA) if isNotSameTarget => sendResponse(FrameVehicleStateMessage(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA)) - case VehicleResponse.ChangeFireState_Start(weaponGuid) if isNotSameTarget => + case VehicleAction.ChangeFireState_Start(weaponGuid) if isNotSameTarget => sendResponse(ChangeFireStateMessage_Start(weaponGuid)) - case VehicleResponse.ChangeFireState_Stop(weaponGuid) if isNotSameTarget => + case VehicleAction.ChangeFireState_Stop(weaponGuid) if isNotSameTarget => sendResponse(ChangeFireStateMessage_Stop(weaponGuid)) - case VehicleResponse.Reload(itemGuid) if isNotSameTarget => + case VehicleAction.Reload(itemGuid) if isNotSameTarget => sendResponse(ReloadMessage(itemGuid, ammo_clip=1, unk1=0)) - case VehicleResponse.ChangeAmmo(weapon_guid, weapon_slot, previous_guid, ammo_id, ammo_guid, ammo_data) if isNotSameTarget => + case VehicleAction.ChangeAmmo(weapon_guid, weapon_slot, previous_guid, ammo_id, ammo_guid, ammo_data) if isNotSameTarget => sendResponse(ObjectDetachMessage(weapon_guid, previous_guid, Vector3.Zero, 0)) //TODO? sendResponse(ObjectDeleteMessage(previousAmmoGuid, 0)) sendResponse( @@ -104,7 +105,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: ) sendResponse(ChangeAmmoMessage(weapon_guid, 1)) - case VehicleResponse.WeaponDryFire(weaponGuid) if isNotSameTarget => + case VehicleAction.WeaponDryFire(weaponGuid) if isNotSameTarget => continent.GUID(weaponGuid).collect { case tool: Tool if tool.Magazine == 0 => // check that the magazine is still empty before sending WeaponDryFireMessage @@ -112,42 +113,25 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: sendResponse(WeaponDryFireMessage(weaponGuid)) } - case VehicleResponse.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget => + case VehicleAction.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget => sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver)) - case VehicleResponse.MountVehicle(vehicleGuid, seat) if isNotSameTarget => + case VehicleAction.MountVehicle(vehicleGuid, seat) if isNotSameTarget => sendResponse(ObjectAttachMessage(vehicleGuid, guid, seat)) - case VehicleResponse.DeployRequest(objectGuid, state, unk1, unk2, pos) if isNotSameTarget => + case VehicleAction.DeployRequest(objectGuid, state, unk1, unk2, pos) if isNotSameTarget => sendResponse(DeployRequestMessage(guid, objectGuid, state, unk1, unk2, pos)) - case VehicleResponse.SendResponse(msg) => + case VehicleAction.SendResponse(msg) => sendResponse(msg) - case VehicleResponse.AttachToRails(vehicleGuid, padGuid) => - sendResponse(ObjectAttachMessage(padGuid, vehicleGuid, slot=3)) - - case VehicleResponse.ConcealPlayer(playerGuid) => - sendResponse(GenericObjectActionMessage(playerGuid, code=9)) - - case VehicleResponse.DetachFromRails(vehicleGuid, padGuid, padPosition, padOrientationZ) => - val pad = continent.GUID(padGuid).get.asInstanceOf[VehicleSpawnPad].Definition - sendResponse( - ObjectDetachMessage( - padGuid, - vehicleGuid, - padPosition + Vector3.z(pad.VehicleCreationZOffset), - padOrientationZ + pad.VehicleCreationZOrientOffset - ) - ) - - case VehicleResponse.EquipmentInSlot(pkt) if isNotSameTarget => + case VehicleAction.EquipmentCreatedInSlot(pkt) if isNotSameTarget => sendResponse(pkt) - case VehicleResponse.GenericObjectAction(objectGuid, action) if isNotSameTarget => + case VehicleAction.GenericObjectAction(objectGuid, action) if isNotSameTarget => sendResponse(GenericObjectActionMessage(objectGuid, action)) - case VehicleResponse.InventoryState(obj, parentGuid, start, conData) if isNotSameTarget => + case VehicleAction.InventoryState(obj, parentGuid, start, conData) if isNotSameTarget => //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly? val objGuid = obj.GUID sendResponse(ObjectDeleteMessage(objGuid, unk1=0)) @@ -158,7 +142,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: conData )) - case VehicleResponse.KickPassenger(_, wasKickedByDriver, vehicleGuid) if resolvedPlayerGuid == guid => + case VehicleAction.KickPassenger(_, wasKickedByDriver, vehicleGuid) if resolvedPlayerGuid == guid => //seat number (first field) seems to be correct if passenger is kicked manually by driver //but always seems to return 4 if user is kicked by mount permissions changing sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver)) @@ -168,46 +152,40 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: case _ => () } - case VehicleResponse.KickPassenger(_, wasKickedByDriver, _) => + case VehicleAction.KickPassenger(_, wasKickedByDriver, _) => //seat number (first field) seems to be correct if passenger is kicked manually by driver //but always seems to return 4 if user is kicked by mount permissions changing sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver)) - case VehicleResponse.InventoryState2(objGuid, parentGuid, value) if isNotSameTarget => + case VehicleAction.InventoryState2(objGuid, parentGuid, value) if isNotSameTarget => sendResponse(InventoryStateMessage(objGuid, unk=0, parentGuid, value)) - case VehicleResponse.LoadVehicle(vehicle, vtype, vguid, vdata) if isNotSameTarget => + case VehicleAction.LoadVehicle(vehicle, vtype, vguid, vdata) if isNotSameTarget => //this is not be suitable for vehicles with people who are seated in it before it spawns (if that is possible) sendResponse(ObjectCreateMessage(vtype, vguid, vdata)) Vehicles.ReloadAccessPermissions(vehicle, player.Name) - case VehicleResponse.ObjectDelete(itemGuid) if isNotSameTarget => + case VehicleAction.ObjectDelete(itemGuid) if isNotSameTarget => sendResponse(ObjectDeleteMessage(itemGuid, unk1=0)) - case VehicleResponse.PlanetsideAttribute(vehicleGuid, attributeType, attributeValue) if isNotSameTarget => + case VehicleAction.PlanetsideAttribute(vehicleGuid, attributeType, attributeValue) if isNotSameTarget => sendResponse(PlanetsideAttributeMessage(vehicleGuid, attributeType, attributeValue)) - case VehicleResponse.ResetSpawnPad(padGuid) => - sendResponse(GenericObjectActionMessage(padGuid, code=23)) - - case VehicleResponse.RevealPlayer(playerGuid) => - sendResponse(GenericObjectActionMessage(playerGuid, code=10)) - - case VehicleResponse.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget => + case VehicleAction.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget => sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission)) - case VehicleResponse.UnloadVehicle(_, vehicleGuid) => + case VehicleAction.UnloadVehicle(_, vehicleGuid) => sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1)) - case VehicleResponse.UnstowEquipment(itemGuid) if isNotSameTarget => + case VehicleAction.UnstowEquipment(itemGuid) if isNotSameTarget => //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly? sendResponse(ObjectDeleteMessage(itemGuid, unk1=0)) - case VehicleResponse.UpdateAmsSpawnPoint(list) => + case VehicleAction.UpdateAmsSpawnList(list) => sessionLogic.zoning.spawn.amsSpawnPoints = list.filter(tube => tube.Faction == player.Faction) sessionLogic.zoning.spawn.DrawCurrentAmsSpawnPoint() - case VehicleResponse.KickCargo(vehicle, speed, delay) + case VehicleAction.KickCargo(vehicle, speed, delay) if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive && speed > 0 => val strafe = 1 + Vehicles.CargoOrientation(vehicle) val reverseSpeed = if (strafe > 1) { 0 } else { speed } @@ -230,17 +208,40 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context: context.system.scheduler.scheduleOnce( delay milliseconds, context.self, - VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleResponse.KickCargo(vehicle, speed=0, delay)) + VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleAction.KickCargo(vehicle, speed=0, delay)) ) - case VehicleResponse.KickCargo(cargo, _, _) + case VehicleAction.KickCargo(cargo, _, _) if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive => sessionLogic.vehicles.TotalDriverVehicleControl(cargo) - case VehicleResponse.ServerVehicleOverrideEnd(vehicle, _) => + case VehicleSpawnPad.AttachToRails(vehicle, pad) => + sendResponse(ObjectAttachMessage(pad.GUID, vehicle.GUID, slot=3)) + + case VehicleSpawnPad.ConcealPlayer(playerGuid) => + sendResponse(GenericObjectActionMessage(playerGuid, code=9)) + + case VehicleSpawnPad.DetachFromRails(vehicle, pad) => + val padDefinition = pad.Definition + sendResponse( + ObjectDetachMessage( + pad.GUID, + vehicle.GUID, + pad.Position + Vector3.z(padDefinition.VehicleCreationZOffset), + pad.Orientation.z + padDefinition.VehicleCreationZOrientOffset + ) + ) + + case VehicleSpawnPad.ResetSpawnPad(pad) => + sendResponse(GenericObjectActionMessage(pad.GUID, code=23)) + + case VehicleSpawnPad.RevealPlayer(playerGuid) => + sendResponse(GenericObjectActionMessage(playerGuid, code=10)) + + case VehicleSpawnPad.ServerVehicleOverrideEnd(vehicle, _) => sessionLogic.vehicles.ServerVehicleOverrideStop(vehicle) - case VehicleResponse.ChangeLoadout(target, oldWeapons, _, oldInventory, _) => + case VehicleAction.ChangeLoadout(target, oldWeapons, _, oldInventory, _) => //TODO when vehicle weapons can be changed without visual glitches, rewrite this continent.GUID(target).collect { case vehicle: Vehicle => changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory) diff --git a/src/main/scala/net/psforever/actors/session/spectator/VehicleLogic.scala b/src/main/scala/net/psforever/actors/session/spectator/VehicleLogic.scala index c61499dd8..ec7b4d4b4 100644 --- a/src/main/scala/net/psforever/actors/session/spectator/VehicleLogic.scala +++ b/src/main/scala/net/psforever/actors/session/spectator/VehicleLogic.scala @@ -41,20 +41,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex obj.zoneInteractions() continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.VehicleState( - player.GUID, - vehicle_guid, - unk1, - pos, - ang, - obj.Velocity, - obj.Flying, - 0, - 0, - 15, - unk5 = false, - obj.Cloaked - ) + player.GUID, + VehicleAction.VehicleState(vehicle_guid, unk1, pos, ang, obj.Velocity, obj.Flying, 0, 0, 15, unk5 = false, obj.Cloaked) ) case _ => () } @@ -94,7 +82,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, unk3=false, Vector3.Zero)) continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.DeployRequest(player.GUID, obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero) + player.GUID, + VehicleAction.DeployRequest(obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero) ) "; enforcing Mobile deployment state" } else { diff --git a/src/main/scala/net/psforever/actors/session/support/GeneralOperations.scala b/src/main/scala/net/psforever/actors/session/support/GeneralOperations.scala index 5e3cdb08e..5cef27ea4 100644 --- a/src/main/scala/net/psforever/actors/session/support/GeneralOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/GeneralOperations.scala @@ -1016,7 +1016,8 @@ class GeneralOperations( obj.Seats(seatNum).unmount(tplayer) continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.KickPassenger(tplayer.GUID, seatNum, unk2=false, obj.GUID) + tplayer.GUID, + VehicleAction.KickPassenger(seatNum, unk2=false, obj.GUID) ) case _ => () } diff --git a/src/main/scala/net/psforever/actors/session/support/SessionData.scala b/src/main/scala/net/psforever/actors/session/support/SessionData.scala index 33b838102..cf17f9a4a 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionData.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionData.scala @@ -569,7 +569,8 @@ class SessionData( obj.Seats(seatNum).unmount(tplayer) continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.KickPassenger(tplayer.GUID, seatNum, unk2=false, obj.GUID) + tplayer.GUID, + VehicleAction.KickPassenger(seatNum, unk2=false, obj.GUID) ) case _ => () } diff --git a/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala index 7f5004529..c2f1c543e 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionMountHandlers.scala @@ -8,7 +8,6 @@ import net.psforever.objects.{PlanetSideGameObject, Tool, Vehicle} import net.psforever.objects.vehicles.{CargoBehavior, MountableWeapons} import net.psforever.objects.vital.InGameHistory import net.psforever.packet.game.{DismountVehicleCargoMsg, GenericObjectActionMessage, InventoryStateMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectAttachMessage, ObjectDetachMessage, PlanetsideAttributeMessage} -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.types.{BailType, PlanetSideGUID, Vector3} // @@ -187,7 +186,8 @@ class SessionMountHandlers( sendResponse(ObjectAttachMessage(objGuid, playerGuid, seatNum)) continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.MountVehicle(playerGuid, objGuid, seatNum) + playerGuid, + VehicleAction.MountVehicle(objGuid, seatNum) ) } @@ -204,11 +204,11 @@ class SessionMountHandlers( sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.SendResponse(Service.defaultPlayerGUID, PlanetsideAttributeMessage(obj.GUID, 81, 1)) + VehicleAction.SendResponse(PlanetsideAttributeMessage(obj.GUID, 81, 1)) ) continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.SendResponse(Service.defaultPlayerGUID, ObjectDetachMessage(obj.GUID, tplayer.GUID, tplayer.Position, obj.Orientation)) + VehicleAction.SendResponse(ObjectDetachMessage(obj.GUID, tplayer.GUID, tplayer.Position, obj.Orientation)) ) } else { @@ -225,20 +225,8 @@ class SessionMountHandlers( v.Velocity = Vector3.Zero continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.VehicleState( - tplayer.GUID, - v.GUID, - unk1 = 0, - tplayer.Position, - v.Orientation, - v.Velocity, - v.Flying, - unk3 = 0, - unk4 = 0, - wheel_direction = 15, - unk5 = false, - unk6 = v.Cloaked - ) + tplayer.GUID, + VehicleAction.VehicleState(v.GUID, unk1 = 0, tplayer.Position, v.Orientation, v.Velocity, v.Flying, unk3 = 0, unk4 = 0, wheel_direction = 15, unk5 = false, unk6 = v.Cloaked) ) case _ => () } @@ -262,7 +250,8 @@ class SessionMountHandlers( sendResponse(DismountVehicleMsg(playerGuid, bailType, wasKickedByDriver = false)) continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.DismountVehicle(playerGuid, bailType, unk2 = false) + playerGuid, + VehicleAction.DismountVehicle(bailType, unk2 = false) ) } diff --git a/src/main/scala/net/psforever/actors/session/support/SessionVehicleHandlers.scala b/src/main/scala/net/psforever/actors/session/support/SessionVehicleHandlers.scala index b493b1ff2..03d0f0df2 100644 --- a/src/main/scala/net/psforever/actors/session/support/SessionVehicleHandlers.scala +++ b/src/main/scala/net/psforever/actors/session/support/SessionVehicleHandlers.scala @@ -5,13 +5,13 @@ import akka.actor.{ActorContext, ActorRef, typed} import net.psforever.actors.session.AvatarActor import net.psforever.objects.Vehicle import net.psforever.packet.game.ChatMsg -import net.psforever.services.vehicle.VehicleResponse +import net.psforever.services.base.EventResponse import net.psforever.types.{ChatMessageType, DriveState, PlanetSideGUID} trait VehicleHandlerFunctions extends CommonSessionInterfacingFunctionality { def ops: SessionVehicleHandlers - def handle(toChannel: String, guid: PlanetSideGUID, reply: VehicleResponse.Response): Unit + def handle(toChannel: String, guid: PlanetSideGUID, reply: EventResponse): Unit } class SessionVehicleHandlers( diff --git a/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala b/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala index 13668606c..f9dbb878f 100644 --- a/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/WeaponAndProjectileOperations.scala @@ -286,7 +286,8 @@ class WeaponAndProjectileOperations( case _: Equipment => continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.WeaponDryFire(player.GUID, weapon_guid) + player.GUID, + VehicleAction.WeaponDryFire(weapon_guid) ) } .orElse { @@ -1098,7 +1099,8 @@ class WeaponAndProjectileOperations( } continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.ChangeFireState_Start(player.GUID, itemGuid) + player.GUID, + VehicleAction.ChangeFireState_Start(itemGuid) ) } @@ -1138,7 +1140,8 @@ class WeaponAndProjectileOperations( } continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.ChangeFireState_Stop(player.GUID, itemGuid) + player.GUID, + VehicleAction.ChangeFireState_Stop(itemGuid) ) } @@ -1201,7 +1204,8 @@ class WeaponAndProjectileOperations( def reloadVehicleMessages(itemGuid: PlanetSideGUID): Unit = { continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.Reload(player.GUID, itemGuid) + player.GUID, + VehicleAction.Reload(itemGuid) ) } @@ -1478,13 +1482,8 @@ class WeaponAndProjectileOperations( obj.Find(box).collect { index => continent.VehicleEvents ! VehicleServiceMessage( s"${obj.Actor}", - VehicleAction.InventoryState( - player.GUID, - box, - obj.GUID, - index, - box.Definition.Packet.DetailedConstructorData(box).get - ) + player.GUID, + VehicleAction.InventoryState(box, obj.GUID, index, box.Definition.Packet.DetailedConstructorData(box).get) ) } } diff --git a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala index e491e35fe..846a0449d 100644 --- a/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala +++ b/src/main/scala/net/psforever/actors/session/support/ZoningOperations.scala @@ -549,7 +549,7 @@ class ZoningOperations( } //spawn point update request continent.VehicleEvents ! VehicleServiceMessage( - continent.id, + player.Name, VehicleAction.UpdateAmsSpawnPoint(continent) ) spawn.upstreamMessageCount = 0 @@ -1353,7 +1353,8 @@ class ZoningOperations( val topLevel = interstellarFerryTopLevelGUID.getOrElse(vehicle.GUID) continent.VehicleEvents ! VehicleServiceMessage( s"${vehicle.Actor}", - VehicleAction.TransferPassengerChannel(pguid, s"${vehicle.Actor}", toChannel, vehicle, topLevel) + pguid, + VehicleAction.TransferPassengerChannel(s"${vehicle.Actor}", toChannel, vehicle, topLevel) ) manifest.cargo.foreach { case ManifestPassengerEntry("MISSING_DRIVER", index) => @@ -1366,7 +1367,8 @@ class ZoningOperations( val cargo = vehicle.CargoHolds(entry.mount).occupant.get continent.VehicleEvents ! VehicleServiceMessage( entry.name, - VehicleAction.TransferPassengerChannel(pguid, s"${cargo.Actor}", toChannel, cargo, topLevel) + pguid, + VehicleAction.TransferPassengerChannel(s"${cargo.Actor}", toChannel, cargo, topLevel) ) } // @@ -1397,7 +1399,8 @@ class ZoningOperations( //do not delete if vehicle has passengers or cargo continent.VehicleEvents ! VehicleServiceMessage( continent.id, - VehicleAction.UnloadVehicle(pguid, vehicle, topLevel) + pguid, + VehicleAction.UnloadVehicle(vehicle, topLevel) ) None } else { @@ -2595,7 +2598,8 @@ class ZoningOperations( .foreach { _.MountedIn = vguid } events ! VehicleServiceMessage( zoneid, - VehicleAction.LoadVehicle(player.GUID, vehicle, vObjectId, vguid, data) + player.GUID, + VehicleAction.LoadVehicle(vehicle, vObjectId, vguid, data) ) carrierInfo match { case (Some(carrier), Some((index, _))) => @@ -2622,7 +2626,8 @@ class ZoningOperations( val zone = vehicle.PreviousGatingManifest().get.origin zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.UnloadVehicle(player.GUID, vehicle, vehicleToDelete) + player.GUID, + VehicleAction.UnloadVehicle(vehicle, vehicleToDelete) ) log.debug( s"AvatarCreate: cleaning up ghost of transitioning vehicle ${vehicle.Definition.Name}@${vehicleToDelete.guid} in zone ${zone.id}" @@ -3392,7 +3397,8 @@ class ZoningOperations( vehicle.OwnerGuid = guid continent.VehicleEvents ! VehicleServiceMessage( s"${tplayer.Faction}", - VehicleAction.Ownership(guid, vehicle.GUID) + guid, + VehicleAction.Ownership(vehicle.GUID) ) case _ => avatarActor ! AvatarActor.SetVehicle(None) diff --git a/src/main/scala/net/psforever/objects/FieldTurretDeployable.scala b/src/main/scala/net/psforever/objects/FieldTurretDeployable.scala index be51a5cba..d1088a9bf 100644 --- a/src/main/scala/net/psforever/objects/FieldTurretDeployable.scala +++ b/src/main/scala/net/psforever/objects/FieldTurretDeployable.scala @@ -13,7 +13,6 @@ import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, TurretSource} import net.psforever.objects.vital.{DismountingActivity, InGameActivity, MountingActivity, ShieldCharge} import net.psforever.packet.game.HackState1 import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} -import net.psforever.types.PlanetSideGUID import scala.annotation.unused @@ -100,7 +99,7 @@ class FieldTurretControl(turret: TurretDeployable) turret.Shields = turret.Shields + amount turret.Zone.VehicleEvents ! VehicleServiceMessage( s"${turret.Actor}", - VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), turret.GUID, turret.Definition.shieldUiAttribute, turret.Shields) + VehicleAction.PlanetsideAttribute(turret.GUID, turret.Definition.shieldUiAttribute, turret.Shields) ) } } diff --git a/src/main/scala/net/psforever/objects/SensorDeployable.scala b/src/main/scala/net/psforever/objects/SensorDeployable.scala index cea1251aa..b3a2fad81 100644 --- a/src/main/scala/net/psforever/objects/SensorDeployable.scala +++ b/src/main/scala/net/psforever/objects/SensorDeployable.scala @@ -77,7 +77,7 @@ class SensorDeployableControl(sensor: SensorDeployable) case obj: PlanetSideServerObject if !jammedSound => obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 54, 1) + VehicleAction.PlanetsideAttribute(obj.GUID, 54, 1) ) super.StartJammeredSound(obj, dur) case _ => ; @@ -101,7 +101,7 @@ class SensorDeployableControl(sensor: SensorDeployable) val zone = obj.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 54, 0) + VehicleAction.PlanetsideAttribute(obj.GUID, 54, 0) ) case _ => ; } diff --git a/src/main/scala/net/psforever/objects/ShieldGeneratorDeployable.scala b/src/main/scala/net/psforever/objects/ShieldGeneratorDeployable.scala index 15a7ceadc..f6247f13f 100644 --- a/src/main/scala/net/psforever/objects/ShieldGeneratorDeployable.scala +++ b/src/main/scala/net/psforever/objects/ShieldGeneratorDeployable.scala @@ -14,7 +14,6 @@ import net.psforever.objects.serverobject.repair.RepairableEntity import net.psforever.objects.vital.interaction.DamageResult import net.psforever.objects.vital.resolution.ResolutionCalculations import net.psforever.types.PlanetSideGUID -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} class ShieldGeneratorDeployable(cdef: ShieldGeneratorDefinition) @@ -22,12 +21,12 @@ class ShieldGeneratorDeployable(cdef: ShieldGeneratorDefinition) with Hackable with JammableUnit -class ShieldGeneratorDefinition extends DeployableDefinition(240) +class ShieldGeneratorDefinition extends DeployableDefinition(objectId = 240) with WithShields { Packet = new ShieldGeneratorConverter DeployCategory = DeployableCategory.ShieldGenerators - override def Initialize(obj: Deployable, context: ActorContext) = { + override def Initialize(obj: Deployable, context: ActorContext): Unit = { obj.Actor = context.actorOf(Props(classOf[ShieldGeneratorControl], obj), PlanetSideServerObject.UniqueActorName(obj)) } @@ -39,10 +38,10 @@ class ShieldGeneratorControl(gen: ShieldGeneratorDeployable) with JammableBehavior with DamageableEntity with RepairableEntity { - def DeployableObject = gen - def JammableObject = gen - def DamageableObject = gen - def RepairableObject = gen + def DeployableObject: ShieldGeneratorDeployable = gen + def JammableObject: ShieldGeneratorDeployable = gen + def DamageableObject: ShieldGeneratorDeployable = gen + def RepairableObject: ShieldGeneratorDeployable = gen deletionType = 1 //from DeployableBehavior override def postStop(): Unit = { @@ -127,7 +126,7 @@ class ShieldGeneratorControl(gen: ShieldGeneratorDeployable) case obj: PlanetSideServerObject with JammableUnit => obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 1) + VehicleAction.PlanetsideAttribute(obj.GUID, 27, 1) ) super.StartJammeredStatus(obj, dur) case _ => ; @@ -140,7 +139,7 @@ class ShieldGeneratorControl(gen: ShieldGeneratorDeployable) case obj: PlanetSideServerObject with JammableUnit if obj.Jammed => obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 0) + VehicleAction.PlanetsideAttribute(obj.GUID, 27, 0) ) case _ => ; } @@ -162,7 +161,7 @@ object ShieldGeneratorControl { val zone = target.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, target.GUID, 68, target.Shields) + VehicleAction.PlanetsideAttribute(target.GUID, 68, target.Shields) ) } } diff --git a/src/main/scala/net/psforever/objects/TurretDeployable.scala b/src/main/scala/net/psforever/objects/TurretDeployable.scala index f21f74707..576a1629c 100644 --- a/src/main/scala/net/psforever/objects/TurretDeployable.scala +++ b/src/main/scala/net/psforever/objects/TurretDeployable.scala @@ -111,7 +111,8 @@ abstract class TurretDeployableControl player.VehicleSeated = None zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.KickPassenger(player.GUID, 4, wasKickedByDriver, TurretObject.GUID) + player.GUID, + VehicleAction.KickPassenger(4, wasKickedByDriver, TurretObject.GUID) ) } } diff --git a/src/main/scala/net/psforever/objects/Vehicles.scala b/src/main/scala/net/psforever/objects/Vehicles.scala index 5ae4191fe..5db132936 100644 --- a/src/main/scala/net/psforever/objects/Vehicles.scala +++ b/src/main/scala/net/psforever/objects/Vehicles.scala @@ -47,7 +47,8 @@ object Vehicles { Vehicles.ReloadAccessPermissions(vehicle, tplayer.Faction.toString) vehicle.Zone.VehicleEvents ! VehicleServiceMessage( vehicle.Zone.id, - VehicleAction.Ownership(tplayer.GUID, vehicle.GUID) + tplayer.GUID, + VehicleAction.Ownership(vehicle.GUID) ) Some(vehicle) case None => @@ -138,13 +139,14 @@ object Vehicles { val pguid = player.GUID if (vehicle.OwnerGuid.contains(pguid)) { vehicle.AssignOwnership(None) - //vehicle.Zone.VehicleEvents ! VehicleServiceMessage(player.Name, VehicleAction.Ownership(pguid, PlanetSideGUID(0))) + //vehicle.Zone.VehicleEvents ! VehicleServiceMessage(player.Name, pguid, VehicleAction.Ownership(pguid, PlanetSideGUID(0))) //val vguid = vehicle.GUID val empire = VehicleLockState.Empire.id (0 to 2).foreach(group => { vehicle.PermissionGroup(group, empire) /*vehicle.Zone.VehicleEvents ! VehicleServiceMessage( s"${vehicle.Faction}", + pguid, VehicleAction.SeatPermissions(pguid, vguid, group, empire) )*/ }) @@ -252,10 +254,7 @@ object Vehicles { val previousOwnerName = target.OwnerName.getOrElse("") vehicleEvents ! VehicleServiceMessage( zoneid, - VehicleAction.SendResponse( - Service.defaultPlayerGUID, - HackMessage(HackState1.Unk2, tGuid, hGuid, 100, 0f, HackState.Hacked, HackState7.Unk8) - ) + VehicleAction.SendResponse(HackMessage(HackState1.Unk2, tGuid, hGuid, 100, 0f, HackState.Hacked, HackState7.Unk8)) ) target.Actor ! CommonMessages.Hack(hacker, target) // Forcefully dismount any cargo @@ -272,7 +271,8 @@ object Vehicles { player.VehicleSeated = None vehicleEvents ! VehicleServiceMessage( zoneid, - VehicleAction.KickPassenger(player.GUID, 4, unk2 = false, tGuid) + player.GUID, + VehicleAction.KickPassenger(4, unk2 = false, tGuid) ) } // In case BFR is occupied and may or may not be crouched @@ -345,15 +345,12 @@ object Vehicles { util.Actor ! TelepadLike.Activate(util) } case GlobalDefinitions.ams if target.DeploymentState == DriveState.Deployed => - vehicleEvents ! VehicleServiceMessage.AMSDeploymentChange(zone) + vehicleEvents ! VehicleServiceMessage(zone.id, VehicleAction.AMSDeploymentChange(zone)) case _ => () } vehicleEvents ! VehicleServiceMessage( zoneid, - VehicleAction.SendResponse( - Service.defaultPlayerGUID, - HackMessage(HackState1.Unk2, tGuid, tGuid, 0, 1L, HackState.HackCleared, HackState7.Unk8) - ) + VehicleAction.SendResponse(HackMessage(HackState1.Unk2, tGuid, tGuid, 0, 1L, HackState.HackCleared, HackState7.Unk8)) ) target.Actor ! CommonMessages.ClearHack() } diff --git a/src/main/scala/net/psforever/objects/equipment/ArmorSiphonBehavior.scala b/src/main/scala/net/psforever/objects/equipment/ArmorSiphonBehavior.scala index 5547f36fd..faee62ec9 100644 --- a/src/main/scala/net/psforever/objects/equipment/ArmorSiphonBehavior.scala +++ b/src/main/scala/net/psforever/objects/equipment/ArmorSiphonBehavior.scala @@ -10,7 +10,6 @@ import net.psforever.objects.vital.RepairFromArmorSiphon import net.psforever.objects.vital.etc.{ArmorSiphonModifiers, ArmorSiphonReason} import net.psforever.objects.vital.interaction.DamageInteraction import net.psforever.packet.game.QuantityUpdateMessage -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.types.PlanetSideGUID @@ -80,7 +79,7 @@ object ArmorSiphonBehavior { val zone = obj.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 0, after) + VehicleAction.PlanetsideAttribute(obj.GUID, 0, after) ) } case _ => ; @@ -99,7 +98,7 @@ object ArmorSiphonBehavior { //update current charge level zone.VehicleEvents ! VehicleServiceMessage( obj.Actor.toString, - VehicleAction.SendResponse(Service.defaultPlayerGUID, QuantityUpdateMessage(siphon.AmmoSlot.Box.GUID, siphon.Magazine)) + VehicleAction.SendResponse(QuantityUpdateMessage(siphon.AmmoSlot.Box.GUID, siphon.Magazine)) ) siphonRecharge.put(guid, context.system.scheduler.scheduleWithFixedDelay( initialDelay = 3000 milliseconds, @@ -121,7 +120,7 @@ object ArmorSiphonBehavior { if (after > before) { zone.VehicleEvents ! VehicleServiceMessage( obj.Actor.toString, - VehicleAction.SendResponse(Service.defaultPlayerGUID, QuantityUpdateMessage(siphon.AmmoSlot.Box.GUID, after)) + VehicleAction.SendResponse(QuantityUpdateMessage(siphon.AmmoSlot.Box.GUID, after)) ) if (after == siphon.MaxMagazine) { endSiphonRecharge(guid) diff --git a/src/main/scala/net/psforever/objects/equipment/JammingUnit.scala b/src/main/scala/net/psforever/objects/equipment/JammingUnit.scala index 84443d560..ed89d9ba2 100644 --- a/src/main/scala/net/psforever/objects/equipment/JammingUnit.scala +++ b/src/main/scala/net/psforever/objects/equipment/JammingUnit.scala @@ -9,7 +9,6 @@ import net.psforever.objects.vital.interaction.DamageResult import net.psforever.objects.vital.projectile.ProjectileReason import net.psforever.objects.zones.{Zone, ZoneAware} import net.psforever.types.Vector3 -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import scala.collection.mutable @@ -245,7 +244,7 @@ trait JammableMountedWeapons extends JammableBehavior { case obj: PlanetSideServerObject with MountedWeapons with JammableUnit if !jammedSound => obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 1) + VehicleAction.PlanetsideAttribute(obj.GUID, 27, 1) ) super.StartJammeredSound(target, dur) case _ => ; @@ -266,7 +265,7 @@ trait JammableMountedWeapons extends JammableBehavior { case obj: PlanetSideServerObject if jammedSound => obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 0) + VehicleAction.PlanetsideAttribute(obj.GUID, 27, 0) ) case _ => ; } @@ -310,7 +309,7 @@ object JammableMountedWeapons { target.Jammed = statusCode == 1 zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, target.GUID, 27, statusCode) + VehicleAction.PlanetsideAttribute(target.GUID, 27, statusCode) ) } } diff --git a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableVehicle.scala b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableVehicle.scala index 28cb07aae..0f177da03 100644 --- a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableVehicle.scala +++ b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableVehicle.scala @@ -144,21 +144,21 @@ trait DamageableVehicle if (damageToShields > 0) { events ! VehicleServiceMessage( shieldChannel, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, targetGUID, obj.Definition.shieldUiAttribute, obj.Shields) + VehicleAction.PlanetsideAttribute(targetGUID, obj.Definition.shieldUiAttribute, obj.Shields) ) announceConfrontation = true } if (damageToHealth > 0) { events ! VehicleServiceMessage( healthChannel, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, targetGUID, 0, obj.Health) + VehicleAction.PlanetsideAttribute(targetGUID, 0, obj.Health) ) announceConfrontation = true } } if (announceConfrontation) { if (showAsAggravated) { - val msg = VehicleAction.SendResponse(Service.defaultPlayerGUID, DamageWithPositionMessage(totalDamage, Vector3.Zero)) + val msg = VehicleAction.SendResponse(DamageWithPositionMessage(totalDamage, Vector3.Zero)) obj.Seats.values .collect { case seat if seat.occupant.nonEmpty => seat.occupant.get.Name } .foreach { channel => @@ -219,7 +219,7 @@ trait DamageableVehicle obj.Shields = 0 zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, target.GUID, obj.Definition.shieldUiAttribute, 0) + VehicleAction.PlanetsideAttribute(target.GUID, obj.Definition.shieldUiAttribute, 0) ) } //database entry @@ -252,13 +252,13 @@ trait DamageableVehicle val guid = obj.GUID events ! VehicleServiceMessage( zoneid, - VehicleAction.PlanetsideAttribute(guid0, guid, 0, 1) + VehicleAction.PlanetsideAttribute(guid, 0, 1) ) if (obj.Shields > 0) { obj.Shields = 0 zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, obj.Definition.shieldUiAttribute, 0) + VehicleAction.PlanetsideAttribute(obj.GUID, obj.Definition.shieldUiAttribute, 0) ) } //aggravation cancel diff --git a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableWeaponTurret.scala b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableWeaponTurret.scala index 6900ea938..b901fb193 100644 --- a/src/main/scala/net/psforever/objects/serverobject/damage/DamageableWeaponTurret.scala +++ b/src/main/scala/net/psforever/objects/serverobject/damage/DamageableWeaponTurret.scala @@ -9,10 +9,10 @@ import net.psforever.objects.vital.interaction.DamageResult import net.psforever.objects.zones.Zone import net.psforever.packet.game.DamageWithPositionMessage import net.psforever.types.Vector3 -import net.psforever.services.Service import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} +import net.psforever.services.base.support.SupportActor import net.psforever.services.vehicle.support.TurretUpgrader -import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} +import net.psforever.services.vehicle.{TurretMessage, VehicleAction, VehicleServiceMessage} /** * The "control" `Actor` mixin for damage-handling code for `WeaponTurret` objects. @@ -64,14 +64,14 @@ trait DamageableWeaponTurret DamageableMountable.DamageAwareness(DamageableObject, cause, damageToHealth) events ! VehicleServiceMessage( zoneId, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, targetGUID, 0, obj.Health) + VehicleAction.PlanetsideAttribute(targetGUID, 0, obj.Health) ) announceConfrontation = true } } if (announceConfrontation) { if (aggravated) { - val msg = VehicleAction.SendResponse(Service.defaultPlayerGUID, DamageWithPositionMessage(damageToHealth, Vector3.Zero)) + val msg = VehicleAction.SendResponse(DamageWithPositionMessage(damageToHealth, Vector3.Zero)) obj.Seats.values .collect { case seat if seat.occupant.nonEmpty => seat.occupant.get.Name } .foreach { channel => @@ -112,7 +112,7 @@ object DamageableWeaponTurret { * @see `TurretUpgrader.AddTask` * @see `TurretUpgrader.ClearSpecific` * @see `WeaponTurret` - * @see `VehicleServiceMessage.TurretUpgrade` + * @see `TurretMessage` * @see `Zone.AvatarEvents` * @see `Zone.VehicleEvents` * @param target the entity being destroyed; @@ -137,8 +137,8 @@ object DamageableWeaponTurret { case turret: WeaponTurret => if (turret.Upgrade != TurretUpgrade.None) { val vehicleEvents = zone.VehicleEvents - vehicleEvents ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.ClearSpecific(List(turret), zone)) - vehicleEvents ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.AddTask(turret, zone, TurretUpgrade.None)) + vehicleEvents ! TurretMessage(SupportActor.ClearSpecific(List(turret), zone)) + vehicleEvents ! TurretMessage(TurretUpgrader.AddTask(turret, zone, TurretUpgrade.None)) } case _ => } diff --git a/src/main/scala/net/psforever/objects/serverobject/deploy/DeploymentBehavior.scala b/src/main/scala/net/psforever/objects/serverobject/deploy/DeploymentBehavior.scala index 0eb8cf718..49df2465a 100644 --- a/src/main/scala/net/psforever/objects/serverobject/deploy/DeploymentBehavior.scala +++ b/src/main/scala/net/psforever/objects/serverobject/deploy/DeploymentBehavior.scala @@ -106,7 +106,7 @@ trait DeploymentBehavior { obj.Velocity = Some(Vector3.Zero) //no velocity zone.VehicleEvents ! VehicleServiceMessage( zoneChannel, - VehicleAction.DeployRequest(GUID0, guid, state, 0, unk2=false, Vector3.Zero) + VehicleAction.DeployRequest(guid, state, 0, unk2=false, Vector3.Zero) ) deploymentTimer.cancel() deploymentTimer = context.system.scheduler.scheduleOnce(obj.DeployTime.milliseconds)({ @@ -117,7 +117,7 @@ trait DeploymentBehavior { obj.Velocity = Some(Vector3.Zero) //no velocity zone.VehicleEvents ! VehicleServiceMessage( zoneChannel, - VehicleAction.DeployRequest(GUID0, guid, state, 0, unk2=false, Vector3.Zero) + VehicleAction.DeployRequest(guid, state, 0, unk2=false, Vector3.Zero) ) state } else { @@ -138,7 +138,7 @@ trait DeploymentBehavior { if (state == DriveState.Undeploying) { zone.VehicleEvents ! VehicleServiceMessage( zoneChannel, - VehicleAction.DeployRequest(GUID0, guid, state, 0, unk2=false, Vector3.Zero) + VehicleAction.DeployRequest(guid, state, 0, unk2=false, Vector3.Zero) ) import scala.concurrent.ExecutionContext.Implicits.global deploymentTimer.cancel() @@ -149,7 +149,7 @@ trait DeploymentBehavior { } else if (state == DriveState.Mobile) { zone.VehicleEvents ! VehicleServiceMessage( zoneChannel, - VehicleAction.DeployRequest(GUID0, guid, state, 0, unk2=false, Vector3.Zero) + VehicleAction.DeployRequest(guid, state, 0, unk2=false, Vector3.Zero) ) state } else { diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/VehicleSpawnControl.scala b/src/main/scala/net/psforever/objects/serverobject/pad/VehicleSpawnControl.scala index 29bd0f511..4eb50c1e1 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/VehicleSpawnControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/VehicleSpawnControl.scala @@ -11,6 +11,7 @@ import net.psforever.objects.sourcing.AmenitySource import net.psforever.objects.vital.TerminalUsedActivity import net.psforever.objects.zones.{Zone, ZoneAware, Zoning} import net.psforever.objects.{Default, PlanetSideGameObject, Player, Vehicle} +import net.psforever.services.vehicle.VehicleServiceMessage import net.psforever.types.{PlanetSideGUID, TransactionType, Vector3} import scala.annotation.tailrec @@ -128,7 +129,7 @@ class VehicleSpawnControl(pad: VehicleSpawnPad) } trackedOrder = None handleOrderFunc = NewTasking - pad.Zone.VehicleEvents ! VehicleSpawnPad.ResetSpawnPad(pad) //cautious animation reset + pad.Zone.VehicleEvents ! VehicleServiceMessage(pad.Zone.id, VehicleSpawnPad.ResetSpawnPad(pad)) //cautious animation reset self ! akka.actor.Kill //should cause the actor to restart, which will abort any trapped messages case _ => () @@ -164,19 +165,17 @@ class VehicleSpawnControl(pad: VehicleSpawnPad) //first queued order orders = List(order) queueManagementTask() - pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( + pad.Zone.VehicleEvents ! VehicleServiceMessage( name, - VehicleSpawnPad.Reminders.Queue, - Some(s"@SVCP_PositionInQueue^2~^2~") + VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_PositionInQueue^2~^2~")) ) case -1 => //new order orders = orders :+ order val size = orders.size + 1 - pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( + pad.Zone.VehicleEvents ! VehicleServiceMessage( name, - VehicleSpawnPad.Reminders.Queue, - Some(s"@SVCP_PositionInQueue^$size~^$size~") + VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_PositionInQueue^$size~^$size~")) ) case n if orders(n).vehicle.Definition ne order.vehicle.Definition => //replace existing order with new order @@ -185,10 +184,9 @@ class VehicleSpawnControl(pad: VehicleSpawnPad) val originalVehicle = originalOrder.vehicle.Definition.Name orders = (orders.take(n) :+ order) ++ orders.drop(n+1) VehicleSpawnControl.DisposeVehicle(originalOrder.vehicle, zone) - zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( + zone.VehicleEvents ! VehicleServiceMessage( name, - VehicleSpawnPad.Reminders.Queue, - Some(s"@SVCP_ReplacedVehicleWithVehicle^@$originalVehicle~^@${order.vehicle.Definition.Name}~") + VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_ReplacedVehicleWithVehicle^@$originalVehicle~^@${order.vehicle.Definition.Name}~")) ) case _ => //order is the duplicate of an existing order; do nothing to the queue @@ -245,10 +243,9 @@ class VehicleSpawnControl(pad: VehicleSpawnPad) val newOrder = VehicleSpawnControl.Order(driver, vehicle) recursiveOrderReminder(orders.iterator, size) trace(s"processing next order - a ${vehicle.Definition.Name} for $name") - pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( + pad.Zone.VehicleEvents ! VehicleServiceMessage( name, - VehicleSpawnPad.Reminders.Queue, - Some(s"@SVCP_PositionInQueue^1~^$size~") + VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_PositionInQueue^1~^$size~")) ) trackedOrder = Some(newOrder) //guard on context.system.scheduler.scheduleOnce(2000 milliseconds, concealPlayer, newOrder) @@ -324,7 +321,10 @@ class VehicleSpawnControl(pad: VehicleSpawnPad) private def CancelOrder(vehicle: Vehicle, player: Player, msg: Option[String]): Unit = { if (vehicle.Seats.values.count(_.isOccupied) == 0) { VehicleSpawnControl.DisposeSpawnedVehicle(vehicle, player, pad.Zone) - pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder(player.Name, VehicleSpawnPad.Reminders.Cancelled, msg) + pad.Zone.VehicleEvents ! VehicleServiceMessage( + player.Name, + VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Cancelled, msg) + ) } } @@ -451,10 +451,9 @@ class VehicleSpawnControl(pad: VehicleSpawnPad) entry: VehicleSpawnPad.VehicleOrder, cause: Option[Any] ): Unit = { - pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( + pad.Zone.VehicleEvents ! VehicleServiceMessage( entry.player.Name, - VehicleSpawnPad.Reminders.Blocked, - cause + VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, cause) ) } @@ -465,10 +464,9 @@ class VehicleSpawnControl(pad: VehicleSpawnPad) ): Unit = { if (iter.hasNext) { val recipient = iter.next() - pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( + pad.Zone.VehicleEvents ! VehicleServiceMessage( recipient.player.Name, - VehicleSpawnPad.Reminders.Queue, - Some(s"@SVCP_PositionInQueue^$position~^$size~") + VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_PositionInQueue^$position~^$size~")) ) recursiveOrderReminder(iter, size, position + 1) } @@ -564,7 +562,7 @@ object VehicleSpawnControl { */ private def DisposeSpawnedVehicle(vehicle: Vehicle, player: Player, zone: Zone): Unit = { DisposeVehicle(vehicle, zone) - zone.VehicleEvents ! VehicleSpawnPad.RevealPlayer(player.GUID) + zone.VehicleEvents ! VehicleServiceMessage(zone.id, VehicleSpawnPad.RevealPlayer(player.GUID)) } /** diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/VehicleSpawnPad.scala b/src/main/scala/net/psforever/objects/serverobject/pad/VehicleSpawnPad.scala index 4b9bb47c4..a08939d98 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/VehicleSpawnPad.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/VehicleSpawnPad.scala @@ -5,6 +5,7 @@ import net.psforever.objects.serverobject.interior.Sidedness import net.psforever.objects.{Player, Vehicle} import net.psforever.objects.serverobject.structures.Amenity import net.psforever.objects.serverobject.terminals.Terminal +import net.psforever.services.base.SelfResponseMessage import net.psforever.types.PlanetSideGUID /** @@ -25,7 +26,6 @@ class VehicleSpawnPad(spDef: VehicleSpawnPadDefinition) extends Amenity { } object VehicleSpawnPad { - /** * Message to the spawn pad to enqueue the following vehicle order. * This is the entry point to vehicle spawn pad functionality. @@ -39,14 +39,14 @@ object VehicleSpawnPad { * @see `GenericObjectActionMessage` * @param player_guid the player */ - final case class ConcealPlayer(player_guid: PlanetSideGUID) + final case class ConcealPlayer(player_guid: PlanetSideGUID) extends SelfResponseMessage /** * Message is intended to undo the effects of the above message, `ConcealPlayer`. * @see `ConcealPlayer` * @param player_guid the player */ - final case class RevealPlayer(player_guid: PlanetSideGUID) + final case class RevealPlayer(player_guid: PlanetSideGUID) extends SelfResponseMessage /** * Message to attach the vehicle to the spawn pad's lifting platform ("put on rails"). @@ -55,7 +55,7 @@ object VehicleSpawnPad { * @param vehicle the vehicle being spawned * @param pad the spawn pad */ - final case class AttachToRails(vehicle: Vehicle, pad: VehicleSpawnPad) + final case class AttachToRails(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage /** * Message to detach the vehicle from the spawn pad's lifting platform ("put on rails"). @@ -63,72 +63,64 @@ object VehicleSpawnPad { * @param vehicle the vehicle being spawned * @param pad the spawn pad */ - final case class DetachFromRails(vehicle: Vehicle, pad: VehicleSpawnPad) + final case class DetachFromRails(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage /** * Message that resets the spawn pad for its next order fulfillment operation by lowering the lifting platform. * @see `GenericObjectActionMessage` * @param pad the spawn pad */ - final case class ResetSpawnPad(pad: VehicleSpawnPad) + final case class ResetSpawnPad(pad: VehicleSpawnPad) extends SelfResponseMessage /** * Message that acts as callback to the driver that the process of sitting in the driver mount will be initiated soon. * This information should only be communicated to the driver's client only. - * @param driver_name the person who will drive the vehicle * @param vehicle the vehicle being spawned * @param pad the spawn pad */ - final case class StartPlayerSeatedInVehicle(driver_name: String, vehicle: Vehicle, pad: VehicleSpawnPad) + final case class StartPlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage /** * Message that acts as callback to the driver that the process of sitting in the driver mount should be finished. * This information should only be communicated to the driver's client only. - * @param driver_name the person who will drive the vehicle * @param vehicle the vehicle being spawned * @param pad the spawn pad */ - final case class PlayerSeatedInVehicle( - driver_name: String, - vehicle: Vehicle, - pad: VehicleSpawnPad - ) //TODO while using fake rails + //TODO while using fake rails (later edit: what does this mean?) + final case class PlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage /** * Message that starts the newly-spawned vehicle to begin driving away from the spawn pad. * Information about the driving process is available on the vehicle itself. * This information should only be communicated to the driver's client only. * @see `VehicleDefinition` - * @param driver_name the person who will drive the vehicle * @param vehicle the vehicle * @param pad the spawn pad */ - final case class ServerVehicleOverrideStart(driver_name: String, vehicle: Vehicle, pad: VehicleSpawnPad) + final case class ServerVehicleOverrideStart(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage /** * Message that transitions the newly-spawned vehicle into a cancellable auto-drive state. * Information about the driving process is available on the vehicle itself. * This information should only be communicated to the driver's client only. * @see `VehicleDefinition` - * @param driver_name the person who will drive the vehicle * @param vehicle the vehicle * @param pad the spawn pad */ - final case class ServerVehicleOverrideEnd(driver_name: String, vehicle: Vehicle, pad: VehicleSpawnPad) + final case class ServerVehicleOverrideEnd(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage /** * Message to initiate the process of properly disposing of the vehicle that may have been or was spawned into the game world. * @param vehicle the vehicle */ - final case class DisposeVehicle(vehicle: Vehicle) + final case class DisposeVehicle(vehicle: Vehicle) extends SelfResponseMessage /** * Message to send targeted messages to the clients of specific users. - * @param driver_name the person who will drive the vehicle * @param reason the nature of the message * @param data optional information for rendering the message to the client */ - final case class PeriodicReminder(driver_name: String, reason: Reminders.Value, data: Option[Any] = None) + final case class PeriodicReminder(reason: Reminders.Value, data: Option[Any] = None) extends SelfResponseMessage /** * An `Enumeration` of reasons for sending a periodic reminder to the user. diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlConcealPlayer.scala b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlConcealPlayer.scala index b035a7849..3f3813584 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlConcealPlayer.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlConcealPlayer.scala @@ -3,6 +3,7 @@ package net.psforever.objects.serverobject.pad.process import akka.actor.Props import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} +import net.psforever.services.vehicle.VehicleServiceMessage import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ @@ -28,7 +29,7 @@ class VehicleSpawnControlConcealPlayer(pad: VehicleSpawnPad) extends VehicleSpaw case order @ VehicleSpawnControl.Order(driver, vehicle) => if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty) { trace(s"hiding ${driver.Name}") - pad.Zone.VehicleEvents ! VehicleSpawnPad.ConcealPlayer(driver.GUID) + pad.Zone.VehicleEvents ! VehicleServiceMessage(pad.Zone.id, VehicleSpawnPad.ConcealPlayer(driver.GUID)) context.system.scheduler.scheduleOnce(2000 milliseconds, loadVehicle, order) } else { trace(s"integral component lost; abort order fulfillment") diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlDriverControl.scala b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlDriverControl.scala index dbef9a3c8..d43d36a43 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlDriverControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlDriverControl.scala @@ -3,6 +3,7 @@ package net.psforever.objects.serverobject.pad.process import akka.actor.Props import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} +import net.psforever.services.vehicle.VehicleServiceMessage /** * An `Actor` that handles vehicle spawning orders for a `VehicleSpawnPad`. @@ -24,7 +25,7 @@ class VehicleSpawnControlDriverControl(pad: VehicleSpawnPad) extends VehicleSpaw case order @ VehicleSpawnControl.Order(driver, vehicle) => trace(s"returning control of ${vehicle.Definition.Name} to its current driver") if (vehicle.PassengerInSeat(driver).nonEmpty) { - pad.Zone.VehicleEvents ! VehicleSpawnPad.ServerVehicleOverrideEnd(driver.Name, vehicle, pad) + pad.Zone.VehicleEvents ! VehicleServiceMessage(driver.Name, VehicleSpawnPad.ServerVehicleOverrideEnd(vehicle, pad)) } finalClear ! order diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlFinalClearance.scala b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlFinalClearance.scala index 67c8d6e61..d8ab0a7c5 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlFinalClearance.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlFinalClearance.scala @@ -4,7 +4,7 @@ package net.psforever.objects.serverobject.pad.process import akka.actor.Cancellable import net.psforever.objects.Default import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} -import net.psforever.types.{PlanetSideGUID, Vector3} +import net.psforever.types.Vector3 import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import scala.concurrent.ExecutionContext.Implicits.global @@ -37,13 +37,7 @@ class VehicleSpawnControlFinalClearance(pad: VehicleSpawnPad) extends VehicleSpa val definition = vehicle.Definition pad.Zone.VehicleEvents ! VehicleServiceMessage( s"${pad.Continent}", - VehicleAction.LoadVehicle( - PlanetSideGUID(0), - vehicle, - definition.ObjectId, - vehicle.GUID, - definition.Packet.ConstructorData(vehicle).get - ) + VehicleAction.LoadVehicle(vehicle, definition.ObjectId, vehicle.GUID, definition.Packet.ConstructorData(vehicle).get) ) } context.parent ! VehicleSpawnControl.ProcessControl.Reminder @@ -70,7 +64,7 @@ class VehicleSpawnControlFinalClearance(pad: VehicleSpawnPad) extends VehicleSpa } case VehicleSpawnControlFinalClearance.NextOrder => - pad.Zone.VehicleEvents ! VehicleSpawnPad.ResetSpawnPad(pad) + pad.Zone.VehicleEvents ! VehicleServiceMessage(pad.Zone.id, VehicleSpawnPad.ResetSpawnPad(pad)) context.parent ! VehicleSpawnControl.ProcessControl.GetNewOrder case _ => () diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlLoadVehicle.scala b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlLoadVehicle.scala index 7bbb1123c..bf2a90b48 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlLoadVehicle.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlLoadVehicle.scala @@ -7,7 +7,6 @@ import akka.util.Timeout import net.psforever.objects.GlobalDefinitions import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} import net.psforever.objects.zones.Zone -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.types.Vector3 import net.psforever.zones.Zones @@ -70,7 +69,7 @@ class VehicleSpawnControlLoadVehicle(pad: VehicleSpawnPad) extends VehicleSpawnC val vdata = definition.Packet.ConstructorData(v).get zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.LoadVehicle(Service.defaultPlayerGUID, v, vtype, vguid, vdata) + VehicleAction.LoadVehicle(v, vtype, vguid, vdata) ) railJack ! temp.get temp = None diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlRailJack.scala b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlRailJack.scala index c7740c7da..f3142039b 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlRailJack.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlRailJack.scala @@ -11,6 +11,7 @@ import net.psforever.objects.vital.interaction.{DamageInteraction, DamageResult} import net.psforever.objects.vital.prop.DamageProperties import net.psforever.objects.vital.Vitality import net.psforever.objects.zones.Zone +import net.psforever.services.vehicle.VehicleServiceMessage import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ @@ -40,7 +41,7 @@ class VehicleSpawnControlRailJack(pad: VehicleSpawnPad) extends VehicleSpawnCont pad.Definition.killBox(pad, vehicle.Definition.CanFly), Zone.findAllTargets ) - pad.Zone.VehicleEvents ! VehicleSpawnPad.AttachToRails(vehicle, pad) + pad.Zone.VehicleEvents ! VehicleServiceMessage(pad.Zone.id, VehicleSpawnPad.AttachToRails(vehicle, pad)) context.system.scheduler.scheduleOnce(10 milliseconds, seatDriver, order) case msg @ (VehicleSpawnControl.ProcessControl.Reminder | VehicleSpawnControl.ProcessControl.GetNewOrder) => diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlSeatDriver.scala b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlSeatDriver.scala index 520d0c1ec..92ca1f010 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlSeatDriver.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlSeatDriver.scala @@ -4,6 +4,7 @@ package net.psforever.objects.serverobject.pad.process import akka.actor.{ActorRef, Props} import net.psforever.objects.{Default, Vehicle} import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} +import net.psforever.services.vehicle.VehicleServiceMessage import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ @@ -46,7 +47,7 @@ class VehicleSpawnControlSeatDriver(pad: VehicleSpawnPad) extends VehicleSpawnCo vehicle.Actor ! Vehicle.Deconstruct(Some(pad.Definition.VehicleCreationDeconstructTime.seconds)) if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty) { trace("driver to be made seated in vehicle") - pad.Zone.VehicleEvents ! VehicleSpawnPad.StartPlayerSeatedInVehicle(driver.Name, vehicle, pad) + pad.Zone.VehicleEvents ! VehicleServiceMessage(driver.Name, VehicleSpawnPad.StartPlayerSeatedInVehicle(vehicle, pad)) } else { trace("driver lost; vehicle stranded on pad") } @@ -58,7 +59,7 @@ class VehicleSpawnControlSeatDriver(pad: VehicleSpawnPad) extends VehicleSpawnCo if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty && entry.vehicle.PassengerInSeat(entry.driver).contains(0)) { trace(s"driver ${entry.driver.Name} has taken the wheel") - pad.Zone.VehicleEvents ! VehicleSpawnPad.PlayerSeatedInVehicle(entry.driver.Name, entry.vehicle, pad) + pad.Zone.VehicleEvents ! VehicleServiceMessage(entry.driver.Name, VehicleSpawnPad.PlayerSeatedInVehicle(entry.vehicle, pad)) } else { trace("driver lost, but operations can continue") } diff --git a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlServerVehicleOverride.scala b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlServerVehicleOverride.scala index bbec75af4..0dabf4807 100644 --- a/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlServerVehicleOverride.scala +++ b/src/main/scala/net/psforever/objects/serverobject/pad/process/VehicleSpawnControlServerVehicleOverride.scala @@ -3,6 +3,7 @@ package net.psforever.objects.serverobject.pad.process import akka.actor.Props import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} +import net.psforever.services.vehicle.VehicleServiceMessage import net.psforever.types.Vector3 import scala.concurrent.ExecutionContext.Implicits.global @@ -31,18 +32,18 @@ class VehicleSpawnControlServerVehicleOverride(pad: VehicleSpawnPad) extends Veh val driverFailState = !driver.isAlive || driver.Continent != pad.Continent || !vehicle.PassengerInSeat(driver).contains(0) vehicle.MountedIn = None - pad.Zone.VehicleEvents ! VehicleSpawnPad.DetachFromRails(vehicle, pad) + pad.Zone.VehicleEvents ! VehicleServiceMessage(pad.Zone.id, VehicleSpawnPad.DetachFromRails(vehicle, pad)) if (vehicleFailState || driverFailState) { if (vehicleFailState) { trace(s"vehicle was already destroyed") } else { trace(s"driver is not ready") } - pad.Zone.VehicleEvents ! VehicleSpawnPad.RevealPlayer(order.DriverGUID) + pad.Zone.VehicleEvents ! VehicleServiceMessage(pad.Zone.id, VehicleSpawnPad.RevealPlayer(order.DriverGUID)) driverControl ! order } else { trace(s"telling ${driver.Name} that the server is assuming control of the ${vehicle.Definition.Name}") - pad.Zone.VehicleEvents ! VehicleSpawnPad.ServerVehicleOverrideStart(driver.Name, vehicle, pad) + pad.Zone.VehicleEvents ! VehicleServiceMessage(driver.Name, VehicleSpawnPad.ServerVehicleOverrideStart(vehicle, pad)) context.system.scheduler.scheduleOnce(4000 milliseconds, driverControl, order) } diff --git a/src/main/scala/net/psforever/objects/serverobject/repair/RepairableWeaponTurret.scala b/src/main/scala/net/psforever/objects/serverobject/repair/RepairableWeaponTurret.scala index f7f5fd693..64e4b5ced 100644 --- a/src/main/scala/net/psforever/objects/serverobject/repair/RepairableWeaponTurret.scala +++ b/src/main/scala/net/psforever/objects/serverobject/repair/RepairableWeaponTurret.scala @@ -5,7 +5,6 @@ import net.psforever.objects.Tool import net.psforever.objects.equipment.EquipmentSlot import net.psforever.objects.serverobject.turret.WeaponTurret import net.psforever.objects.vehicles.MountedWeapons -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} /** @@ -48,7 +47,7 @@ object RepairableWeaponTurret { case (index: Int, Some(tool: Tool)) => events ! VehicleServiceMessage( zoneId, - VehicleAction.EquipmentInSlot(Service.defaultPlayerGUID, tguid, index, tool) + VehicleAction.EquipmentInSlot(tguid, index, tool) ) } } diff --git a/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala b/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala index 7e94f947f..a3eff3c11 100644 --- a/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala @@ -233,7 +233,7 @@ class ResourceSiloControl(resourceSilo: ResourceSilo) val zone = resourceSilo.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, resourceSilo.GUID, 49, 1) + VehicleAction.PlanetsideAttribute(resourceSilo.GUID, 49, 1) ) math.min(resourceSilo.MaxNtuCapacitor - currentlyHas, trigger) } else if (trigger < 0) { @@ -244,7 +244,7 @@ class ResourceSiloControl(resourceSilo: ResourceSilo) val zone = resourceSilo.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, resourceSilo.GUID, 49, 0) + VehicleAction.PlanetsideAttribute(resourceSilo.GUID, 49, 0) ) 0 }) * 0.9f diff --git a/src/main/scala/net/psforever/objects/serverobject/terminals/ProximityTerminalControl.scala b/src/main/scala/net/psforever/objects/serverobject/terminals/ProximityTerminalControl.scala index d96f0d4c7..3db74a369 100644 --- a/src/main/scala/net/psforever/objects/serverobject/terminals/ProximityTerminalControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/terminals/ProximityTerminalControl.scala @@ -26,7 +26,6 @@ import net.psforever.objects.serverobject.structures.{Building, PoweredAmenityCo import net.psforever.objects.vital.{HealFromTerminal, RepairFromTerminal, Vitality} import net.psforever.objects.zones.ZoneAware import net.psforever.packet.game.InventoryStateMessage -import net.psforever.services.Service import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} @@ -379,7 +378,7 @@ object ProximityTerminalControl { val zone = target.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, target.GUID, 0, target.Health) + VehicleAction.PlanetsideAttribute(target.GUID, 0, target.Health) ) } @@ -466,7 +465,7 @@ object ProximityTerminalControl { slots.foreach { slot => events ! VehicleServiceMessage( channel, - VehicleAction.SendResponse(Service.defaultPlayerGUID, InventoryStateMessage(slot.Box.GUID, weapon.GUID, slot.Box.Capacity)) + VehicleAction.SendResponse(InventoryStateMessage(slot.Box.GUID, weapon.GUID, slot.Box.Capacity)) ) } } diff --git a/src/main/scala/net/psforever/objects/serverobject/terminals/implant/ImplantTerminalMechControl.scala b/src/main/scala/net/psforever/objects/serverobject/terminals/implant/ImplantTerminalMechControl.scala index c03709e69..04cab01a4 100644 --- a/src/main/scala/net/psforever/objects/serverobject/terminals/implant/ImplantTerminalMechControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/terminals/implant/ImplantTerminalMechControl.scala @@ -149,7 +149,7 @@ class ImplantTerminalMechControl(mech: ImplantTerminalMech) case player => seat.unmount(player) player.VehicleSeated = None - events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, 4, unk2=false, guid)) + events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(4, unk2=false, guid)) } ) } @@ -277,7 +277,7 @@ class ImplantTerminalMechControl(mech: ImplantTerminalMech) case player if test(player.Faction) => seat.unmount(player) player.VehicleSeated = None - events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, 4, unk2 = false, guid)) + events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(4, unk2 = false, guid)) } ) } diff --git a/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala b/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala index 24f1bdea4..75f2f1aee 100644 --- a/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala @@ -13,7 +13,6 @@ import net.psforever.objects.serverobject.turret.auto.AutomatedTurret.Target import net.psforever.objects.serverobject.turret.auto.{AffectedByAutomaticTurretFire, AutomatedTurret, AutomatedTurretBehavior} import net.psforever.objects.vital.interaction.DamageResult import net.psforever.packet.game.{ChangeFireModeMessage, HackState1} -import net.psforever.services.Service import net.psforever.services.vehicle.support.TurretUpgrader import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.types.{BailType, PlanetSideEmpire, PlanetSideGUID} @@ -179,7 +178,7 @@ class FacilityTurretControl(turret: FacilityTurret) seat.unmount(player) player.VehicleSeated = None if (player.HasGUID) { - events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, 4, unk2=false, guid)) + events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(4, unk2=false, guid)) } case None => () } @@ -239,7 +238,7 @@ class FacilityTurretControl(turret: FacilityTurret) weapon.FireModeIndex = 0 events ! VehicleServiceMessage( zoneid, - VehicleAction.SendResponse(Service.defaultPlayerGUID, ChangeFireModeMessage(weapon.GUID, 0)) + VehicleAction.SendResponse(ChangeFireModeMessage(weapon.GUID, 0)) ) } } @@ -341,7 +340,7 @@ class FacilityTurretControl(turret: FacilityTurret) case player => seat.unmount(player) player.VehicleSeated = None - events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, seat_num, unk2=true, guid)) + events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(seat_num, unk2=true, guid)) } } captureTerminalChanges(terminal, super.captureTerminalIsHacked, actionDelays = 3000L) diff --git a/src/main/scala/net/psforever/objects/serverobject/turret/WeaponTurrets.scala b/src/main/scala/net/psforever/objects/serverobject/turret/WeaponTurrets.scala index 4d6db7e1b..510fc7416 100644 --- a/src/main/scala/net/psforever/objects/serverobject/turret/WeaponTurrets.scala +++ b/src/main/scala/net/psforever/objects/serverobject/turret/WeaponTurrets.scala @@ -7,8 +7,8 @@ import net.psforever.objects.{Player, Tool, TurretDeployable} import net.psforever.packet.game.{HackMessage, HackState, HackState1, HackState7, InventoryStateMessage} import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.local.{LocalAction, LocalServiceMessage} -import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.support.TurretUpgrader +import net.psforever.services.vehicle.{TurretMessage, VehicleAction, VehicleServiceMessage} import net.psforever.types.PlanetSideGUID object WeaponTurrets { @@ -44,7 +44,7 @@ object WeaponTurrets { * @see `TurretUpgrade` * @see `TurretUpgrader.AddTask` * @see `TurretUpgrader.ClearSpecific` - * @see `VehicleServiceMessage.TurretUpgrade` + * @see `TurretMessage` * @param target the facility turret being upgraded * @param upgrade the upgrade being applied to the turret (usually, it's weapon system) */ @@ -52,8 +52,8 @@ object WeaponTurrets { log.info(s"Manned wall turret weapon being converted to $upgrade") val zone = target.Zone val events = zone.VehicleEvents - events ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.ClearSpecific(List(target), zone)) - events ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.AddTask(target, zone, upgrade)) + events ! TurretMessage(TurretUpgrader.ClearSpecific(List(target), zone)) + events ! TurretMessage(TurretUpgrader.AddTask(target, zone, upgrade)) } /** @@ -106,7 +106,8 @@ object WeaponTurrets { player.VehicleSeated = None zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.KickPassenger(player.GUID, 4, unk2 = false, target.GUID) + player.GUID, + VehicleAction.KickPassenger(4, unk2 = false, target.GUID) ) } } diff --git a/src/main/scala/net/psforever/objects/vehicles/AntTransferBehavior.scala b/src/main/scala/net/psforever/objects/vehicles/AntTransferBehavior.scala index 10efab816..1dd9643e9 100644 --- a/src/main/scala/net/psforever/objects/vehicles/AntTransferBehavior.scala +++ b/src/main/scala/net/psforever/objects/vehicles/AntTransferBehavior.scala @@ -10,7 +10,6 @@ import net.psforever.objects.serverobject.structures.WarpGate import net.psforever.objects.serverobject.transfer.{TransferBehavior, TransferContainer} import net.psforever.objects.{NtuContainer, _} import net.psforever.types.DriveState -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import akka.actor.typed.scaladsl.adapter._ import net.psforever.objects.serverobject.transfer.TransferContainer.TransferMaterial @@ -35,7 +34,7 @@ trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior { val zone = obj.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 52, 1L) + VehicleAction.PlanetsideAttribute(vehicle.GUID, 52, 1L) ) // panel glow on } @@ -45,7 +44,7 @@ trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior { val zone = obj.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 49, 1L) + VehicleAction.PlanetsideAttribute(vehicle.GUID, 49, 1L) ) // orb particle effect on } @@ -54,7 +53,7 @@ trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior { val display = vehicle.NtuCapacitorScaled.toLong vehicle.Zone.VehicleEvents ! VehicleServiceMessage( vehicle.Actor.toString, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 45, display) + VehicleAction.PlanetsideAttribute(vehicle.GUID, 45, display) ) } } @@ -160,16 +159,16 @@ trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior { if (transferEvent == TransferBehavior.Event.Charging) { events ! VehicleServiceMessage( zoneId, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vguid, 52, 0L) + VehicleAction.PlanetsideAttribute(vguid, 52, 0L) ) // panel glow off events ! VehicleServiceMessage( zoneId, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vguid, 49, 0L) + VehicleAction.PlanetsideAttribute(vguid, 49, 0L) ) // orb particle effect off } else if (transferEvent == TransferBehavior.Event.Discharging) { events ! VehicleServiceMessage( zoneId, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vguid, 52, 0L) + VehicleAction.PlanetsideAttribute(vguid, 52, 0L) ) // panel glow off } } diff --git a/src/main/scala/net/psforever/objects/vehicles/BfrTransferBehavior.scala b/src/main/scala/net/psforever/objects/vehicles/BfrTransferBehavior.scala index 24aa6d9c2..96bd4ed86 100644 --- a/src/main/scala/net/psforever/objects/vehicles/BfrTransferBehavior.scala +++ b/src/main/scala/net/psforever/objects/vehicles/BfrTransferBehavior.scala @@ -118,7 +118,7 @@ trait BfrTransferBehavior case equip: NtuSiphon => vehicle.Zone.VehicleEvents ! VehicleServiceMessage( vehicle.Actor.toString, - VehicleAction.InventoryState2(PlanetSideGUID(0), equip.storageGUID, siphon.GUID, siphon.NtuCapacitor.toInt) + VehicleAction.InventoryState2(equip.storageGUID, siphon.GUID, siphon.NtuCapacitor.toInt) ) case _ => ; } diff --git a/src/main/scala/net/psforever/objects/vehicles/CarrierBehavior.scala b/src/main/scala/net/psforever/objects/vehicles/CarrierBehavior.scala index 59f83f942..9883ea11e 100644 --- a/src/main/scala/net/psforever/objects/vehicles/CarrierBehavior.scala +++ b/src/main/scala/net/psforever/objects/vehicles/CarrierBehavior.scala @@ -207,11 +207,11 @@ object CarrierBehavior { cargo.Velocity = None zone.VehicleEvents ! VehicleServiceMessage( s"${cargo.Actor}", - VehicleAction.SendResponse(PlanetSideGUID(0), PlanetsideAttributeMessage(cargoGUID, 0, cargo.Health)) + VehicleAction.SendResponse(PlanetsideAttributeMessage(cargoGUID, 0, cargo.Health)) ) zone.VehicleEvents ! VehicleServiceMessage( s"${cargo.Actor}", - VehicleAction.SendResponse(PlanetSideGUID(0), PlanetsideAttributeMessage(cargoGUID, cargo.Definition.shieldUiAttribute, cargo.Shields)) + VehicleAction.SendResponse(PlanetsideAttributeMessage(cargoGUID, cargo.Definition.shieldUiAttribute, cargo.Shields)) ) CargoMountBehaviorForAll(carrier, cargo, mountPoint) zone.actor ! ZoneActor.RemoveFromBlockMap(cargo) @@ -225,9 +225,8 @@ object CarrierBehavior { val cargoDriverGUID = cargo.Seats(0).occupant.get.GUID zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.SendResponse( - cargoDriverGUID, - CargoMountPointStatusMessage( + cargoDriverGUID, + VehicleAction.SendResponse(CargoMountPointStatusMessage( carrierGUID, PlanetSideGUID(0), PlanetSideGUID(0), @@ -235,8 +234,7 @@ object CarrierBehavior { mountPoint, CargoStatus.Empty, 0 - ) - ) + )) ) false //sending packet to the cargo vehicle's client results in player being lock in own vehicle @@ -327,9 +325,8 @@ object CarrierBehavior { val cargoDriverGUID = cargo.Seats(0).occupant.get.GUID zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.SendResponse( - cargoDriverGUID, - CargoMountPointStatusMessage( + cargoDriverGUID, + VehicleAction.SendResponse(CargoMountPointStatusMessage( carrierGUID, PlanetSideGUID(0), PlanetSideGUID(0), @@ -337,8 +334,7 @@ object CarrierBehavior { mountPoint, CargoStatus.Empty, 0 - ) - ) + )) ) false //sending packet to the cargo vehicle's client results in player being lock in own vehicle @@ -453,11 +449,11 @@ object CarrierBehavior { val cargoActor = cargo.Actor events ! VehicleServiceMessage( s"$cargoActor", - VehicleAction.SendResponse(GUID0, PlanetsideAttributeMessage(cargoGUID, 0, cargo.Health)) + VehicleAction.SendResponse(PlanetsideAttributeMessage(cargoGUID, 0, cargo.Health)) ) events ! VehicleServiceMessage( s"$cargoActor", - VehicleAction.SendResponse(GUID0, PlanetsideAttributeMessage(cargoGUID, cargo.Definition.shieldUiAttribute, cargo.Shields)) + VehicleAction.SendResponse(PlanetsideAttributeMessage(cargoGUID, cargo.Definition.shieldUiAttribute, cargo.Shields)) ) zone.actor ! ZoneActor.AddToBlockMap(cargo, carrier.Position) if (carrier.isFlying) { @@ -467,9 +463,9 @@ object CarrierBehavior { val detachCargoMsg = ObjectDetachMessage(carrierGUID, cargoGUID, cargoHoldPosition - Vector3.z(1), rotation) val resetCargoMsg = CargoMountPointStatusMessage(carrierGUID, GUID0, GUID0, cargoGUID, mountPoint, CargoStatus.Empty, 0) - events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, ejectCargoMsg)) - events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, detachCargoMsg)) - events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, resetCargoMsg)) + events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(ejectCargoMsg)) + events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(detachCargoMsg)) + events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(resetCargoMsg)) log.debug(s"HandleVehicleCargoDismount: eject - $ejectCargoMsg, detach - $detachCargoMsg") if (driverOpt.isEmpty) { //TODO cargo should drop like a rock like normal; until then, deconstruct it @@ -482,18 +478,18 @@ object CarrierBehavior { CargoMountPointStatusMessage(carrierGUID, GUID0, cargoGUID, GUID0, mountPoint, CargoStatus.InProgress, 0) val cargoDetachMessage = ObjectDetachMessage(carrierGUID, cargoGUID, cargoHoldPosition + Vector3.z(1f), rotation) - events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, cargoStatusMessage)) - events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, cargoDetachMessage)) + events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(cargoStatusMessage)) + events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(cargoDetachMessage)) driverOpt match { case Some(driver) => events ! VehicleServiceMessage( s"${driver.Name}", - VehicleAction.KickCargo(GUID0, cargo, cargo.Definition.AutoPilotSpeed2, 2500) + VehicleAction.KickCargo(cargo, cargo.Definition.AutoPilotSpeed2, 2500) ) case None => val resetCargoMsg = CargoMountPointStatusMessage(carrierGUID, GUID0, GUID0, cargoGUID, mountPoint, CargoStatus.Empty, 0) - events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, resetCargoMsg)) //lazy + events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(resetCargoMsg)) //lazy //TODO cargo should back out like normal; until then, deconstruct it cargoActor ! Vehicle.Deconstruct() } @@ -609,8 +605,8 @@ object CarrierBehavior { attachMessage: ObjectAttachMessage, mountPointStatusMessage: CargoMountPointStatusMessage ): Unit = { - zone.VehicleEvents ! VehicleServiceMessage(zone.id, VehicleAction.SendResponse(exclude, attachMessage)) - zone.VehicleEvents ! VehicleServiceMessage(zone.id, VehicleAction.SendResponse(exclude, mountPointStatusMessage)) + zone.VehicleEvents ! VehicleServiceMessage(zone.id, exclude, VehicleAction.SendResponse(attachMessage)) + zone.VehicleEvents ! VehicleServiceMessage(zone.id, exclude, VehicleAction.SendResponse(mountPointStatusMessage)) } /** @@ -632,11 +628,11 @@ object CarrierBehavior { val msgs @ (attachMessage, mountPointStatusMessage) = CargoMountMessages(carrier, cargo, mountPoint) zone.VehicleEvents ! VehicleServiceMessage( zoneId, - VehicleAction.SendResponse(Service.defaultPlayerGUID, attachMessage) + VehicleAction.SendResponse(attachMessage) ) zone.VehicleEvents ! VehicleServiceMessage( zoneId, - VehicleAction.SendResponse(Service.defaultPlayerGUID, mountPointStatusMessage) + VehicleAction.SendResponse(mountPointStatusMessage) ) msgs } diff --git a/src/main/scala/net/psforever/objects/vehicles/control/AmsControl.scala b/src/main/scala/net/psforever/objects/vehicles/control/AmsControl.scala index ccb69f2fe..d3d77a588 100644 --- a/src/main/scala/net/psforever/objects/vehicles/control/AmsControl.scala +++ b/src/main/scala/net/psforever/objects/vehicles/control/AmsControl.scala @@ -2,7 +2,6 @@ package net.psforever.objects.vehicles.control import net.psforever.objects._ -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.types.DriveState @@ -29,8 +28,8 @@ class AmsControl(vehicle: Vehicle) case None => "" } val events = zone.VehicleEvents - events ! VehicleServiceMessage.AMSDeploymentChange(zone) - events ! VehicleServiceMessage(driverChannel, VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 81, 1)) + events ! VehicleServiceMessage(zone.id, VehicleAction.AMSDeploymentChange(zone)) + events ! VehicleServiceMessage(driverChannel, VehicleAction.PlanetsideAttribute(vehicle.GUID, 81, 1)) case _ => ; } } @@ -49,8 +48,8 @@ class AmsControl(vehicle: Vehicle) case None => "" } val events = zone.VehicleEvents - events ! VehicleServiceMessage.AMSDeploymentChange(zone) - events ! VehicleServiceMessage(driverChannel, VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 81, 0)) + events ! VehicleServiceMessage(zone.id, VehicleAction.AMSDeploymentChange(zone)) + events ! VehicleServiceMessage(driverChannel, VehicleAction.PlanetsideAttribute(vehicle.GUID, 81, 0)) case _ => ; } } diff --git a/src/main/scala/net/psforever/objects/vehicles/control/ApcControl.scala b/src/main/scala/net/psforever/objects/vehicles/control/ApcControl.scala index c08b7a432..c11dfa2d6 100644 --- a/src/main/scala/net/psforever/objects/vehicles/control/ApcControl.scala +++ b/src/main/scala/net/psforever/objects/vehicles/control/ApcControl.scala @@ -54,15 +54,12 @@ class ApcControl(vehicle: Vehicle) //cause the emp events ! VehicleServiceMessage( zone.id, - VehicleAction.SendResponse( - GUID0, - TriggerEffectMessage( + VehicleAction.SendResponse(TriggerEffectMessage( GUID0, s"apc_explosion_emp_${faction.toString.toLowerCase}", None, Some(TriggeredEffectLocation(pos, obj.Orientation)) - ) - ) + )) ) //resolve what targets are affected by the emp Zone.serverSideDamage( diff --git a/src/main/scala/net/psforever/objects/vehicles/control/BfrControl.scala b/src/main/scala/net/psforever/objects/vehicles/control/BfrControl.scala index 4f956351b..b9f62726f 100644 --- a/src/main/scala/net/psforever/objects/vehicles/control/BfrControl.scala +++ b/src/main/scala/net/psforever/objects/vehicles/control/BfrControl.scala @@ -271,7 +271,7 @@ class BfrControl(vehicle: Vehicle) val zone = vehicle.Zone zone.VehicleEvents ! VehicleServiceMessage( s"${zone.id}", - VehicleAction.SendResponse(PlanetSideGUID(0), GenericObjectActionMessage(vehicle.GUID, 45)) + VehicleAction.SendResponse(GenericObjectActionMessage(vehicle.GUID, 45)) ) } @@ -285,7 +285,7 @@ class BfrControl(vehicle: Vehicle) val zone = vehicle.Zone zone.VehicleEvents ! VehicleServiceMessage( s"${zone.id}", - VehicleAction.SendResponse(PlanetSideGUID(0), GenericObjectActionMessage(vehicle.GUID, 44)) + VehicleAction.SendResponse(GenericObjectActionMessage(vehicle.GUID, 44)) ) } @@ -336,7 +336,7 @@ class BfrControl(vehicle: Vehicle) val shields = vehicle.Shields zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vguid, vehicle.Definition.shieldUiAttribute, shields) + VehicleAction.PlanetsideAttribute(vguid, vehicle.Definition.shieldUiAttribute, shields) ) } @@ -416,7 +416,8 @@ class BfrControl(vehicle: Vehicle) val zone = vehicle.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.GenericObjectAction(doNotSendTo, useThisGuid, action) + doNotSendTo, + VehicleAction.GenericObjectAction(useThisGuid, action) ) case _ => () } @@ -565,15 +566,12 @@ class BfrControl(vehicle: Vehicle) //TODO this is the apc emp effect; is there an ntu siphon emp effect? events ! VehicleServiceMessage( zone.id, - VehicleAction.SendResponse( - GUID0, - TriggerEffectMessage( + VehicleAction.SendResponse(TriggerEffectMessage( GUID0, s"apc_explosion_emp_${faction.toString.toLowerCase}", None, Some(TriggeredEffectLocation(pos, obj.Orientation)) - ) - ) + )) ) //resolve what targets are affected by the emp Zone.serverSideDamage( @@ -590,10 +588,7 @@ class BfrControl(vehicle: Vehicle) //it does not even dispatch the packet before that, making it rare if this precautionary message is seen events ! VehicleServiceMessage( obj.Seats(0).occupant.get.Name, - VehicleAction.SendResponse( - GUID0, - ChatMsg(ChatMessageType.UNK_225, wideContents = false, "", s"@TimeUntilNextUse^${30000 - elapsedWait}", None) - ) + VehicleAction.SendResponse(ChatMsg(ChatMessageType.UNK_225, wideContents = false, "", s"@TimeUntilNextUse^${30000 - elapsedWait}", None)) ) } case _ => () diff --git a/src/main/scala/net/psforever/objects/vehicles/control/VehicleCapacitance.scala b/src/main/scala/net/psforever/objects/vehicles/control/VehicleCapacitance.scala index 2b84932a9..4c54fce31 100644 --- a/src/main/scala/net/psforever/objects/vehicles/control/VehicleCapacitance.scala +++ b/src/main/scala/net/psforever/objects/vehicles/control/VehicleCapacitance.scala @@ -3,7 +3,6 @@ package net.psforever.objects.vehicles.control import akka.actor.{Actor, Cancellable} import net.psforever.objects._ -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import scala.concurrent.ExecutionContext.Implicits.global @@ -61,7 +60,7 @@ trait VehicleCapacitance { val obj = CapacitanceObject obj.Zone.VehicleEvents ! VehicleServiceMessage( self.toString(), - VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 113, obj.Capacitor) + VehicleAction.PlanetsideAttribute(obj.GUID, 113, obj.Capacitor) ) } diff --git a/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala b/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala index 3f40c8ce0..a32836c17 100644 --- a/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala +++ b/src/main/scala/net/psforever/objects/vehicles/control/VehicleControl.scala @@ -213,7 +213,7 @@ class VehicleControl(vehicle: Vehicle) }) .flatMap { _.getMessage(vehicle) } .foreach { pkt => - events ! VehicleServiceMessage(toChannel, VehicleAction.SendResponse(guid0, pkt)) + events ! VehicleServiceMessage(toChannel, VehicleAction.SendResponse(pkt)) } case FactionAffinity.ConvertFactionAffinity(faction) => @@ -332,7 +332,7 @@ class VehicleControl(vehicle: Vehicle) val zone = vehicle.Zone zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.UnloadVehicle(Service.defaultPlayerGUID, vehicle, vehicle.GUID) + VehicleAction.UnloadVehicle(vehicle, vehicle.GUID) ) zone.Transport.tell(Zone.Vehicle.Despawn(vehicle), zone.Transport) //notify target spawner that the vehicle has despawned if this is a VR Shooting Range zone @@ -451,7 +451,7 @@ class VehicleControl(vehicle: Vehicle) zone.actor ! ZoneActor.AddToBlockMap(player, vehicle.Position) } if (player.HasGUID) { - events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, 4, unk2 = true, guid)) + events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(4, unk2 = true, guid)) } } } @@ -535,7 +535,7 @@ class VehicleControl(vehicle: Vehicle) val zone = ContainerObject.Zone zone.VehicleEvents ! VehicleServiceMessage( self.toString, - VehicleAction.UnstowEquipment(Service.defaultPlayerGUID, item.GUID) + VehicleAction.UnstowEquipment(item.GUID) ) } @@ -550,22 +550,19 @@ class VehicleControl(vehicle: Vehicle) events ! VehicleServiceMessage( //TODO when a new weapon, the equipment slot ui goes blank, but the weapon functions; remount vehicle to correct it if (obj.VisibleSlots.contains(slot)) zone.id else channel, - VehicleAction.SendResponse( - Service.defaultPlayerGUID, - OCM.detailed(item, ObjectCreateMessageParent(oguid, slot)) - ) + VehicleAction.SendResponse(OCM.detailed(item, ObjectCreateMessageParent(oguid, slot))) ) item match { case box: AmmoBox => events ! VehicleServiceMessage( channel, - VehicleAction.InventoryState2(Service.defaultPlayerGUID, iguid, oguid, box.Capacity) + VehicleAction.InventoryState2(iguid, oguid, box.Capacity) ) case weapon: Tool => weapon.AmmoSlots.map { slot => slot.Box }.foreach { box => events ! VehicleServiceMessage( channel, - VehicleAction.InventoryState2(Service.defaultPlayerGUID, box.GUID, iguid, box.Capacity) + VehicleAction.InventoryState2(box.GUID, iguid, box.Capacity) ) } case _ => () @@ -641,7 +638,7 @@ class VehicleControl(vehicle: Vehicle) vehicle.Shields = vehicle.Shields + amount vehicle.Zone.VehicleEvents ! VehicleServiceMessage( s"${vehicle.Actor}", - VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), vehicle.GUID, vehicle.Definition.shieldUiAttribute, vehicle.Shields) + VehicleAction.PlanetsideAttribute(vehicle.GUID, vehicle.Definition.shieldUiAttribute, vehicle.Shields) ) } } @@ -696,7 +693,8 @@ class VehicleControl(vehicle: Vehicle) log.info(s"$dname changed ${vehicle.Definition.Name}'s access permission $group to $allow") zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.SeatPermissions(dguid, vguid, attribute, value) + dguid, + VehicleAction.SeatPermissions(vguid, attribute, value) ) //kick players who should not be seated in the vehicle due to permission changes if (allow == VehicleLockState.Locked) { //TODO only important permission atm @@ -709,7 +707,8 @@ class VehicleControl(vehicle: Vehicle) tplayer.VehicleSeated = None zone.VehicleEvents ! VehicleServiceMessage( zone.id, - VehicleAction.KickPassenger(tplayer.GUID, 4, unk2 = false, vguid) + tplayer.GUID, + VehicleAction.KickPassenger(4, unk2 = false, vguid) ) } case _ => () // No player seated @@ -761,7 +760,7 @@ class VehicleControl(vehicle: Vehicle) messages.foreach { pkt => events ! VehicleServiceMessage( zoneid, - VehicleAction.SendResponse(guid0, pkt) + VehicleAction.SendResponse(pkt) ) } } diff --git a/src/main/scala/net/psforever/objects/zones/MapInfo.scala b/src/main/scala/net/psforever/objects/zones/MapInfo.scala index 31e648aa3..a6edd6b7a 100644 --- a/src/main/scala/net/psforever/objects/zones/MapInfo.scala +++ b/src/main/scala/net/psforever/objects/zones/MapInfo.scala @@ -700,10 +700,7 @@ object MapEnvironment { case v: Vehicle => v.Zone.VehicleEvents ! VehicleServiceMessage( v.Actor.toString(), - VehicleAction.SendResponse( - Service.defaultPlayerGUID, - OffshoreVehicleMessage(v.Seats(0).occupant.get.GUID, v.GUID, msg) - ) + VehicleAction.SendResponse(OffshoreVehicleMessage(v.Seats(0).occupant.get.GUID, v.GUID, msg)) ) case _ => ; } diff --git a/src/main/scala/net/psforever/objects/zones/ZoneVehicleActor.scala b/src/main/scala/net/psforever/objects/zones/ZoneVehicleActor.scala index 29dacff8d..be767c726 100644 --- a/src/main/scala/net/psforever/objects/zones/ZoneVehicleActor.scala +++ b/src/main/scala/net/psforever/objects/zones/ZoneVehicleActor.scala @@ -9,7 +9,6 @@ import net.psforever.objects.serverobject.structures.WarpGate import net.psforever.objects.vital.InGameHistory import net.psforever.objects.{Default, GlobalDefinitions, Vehicle} import net.psforever.packet.game.ChatMsg -import net.psforever.services.Service import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.types.{ChatMessageType, DriveState, PlanetSideEmpire, Vector3} @@ -206,7 +205,7 @@ object ZoneVehicleActor { msgOpt.foreach { msg => zone.VehicleEvents ! VehicleServiceMessage( vehicle.Seats.headOption.flatMap(_._2.occupant).map(_.Name).getOrElse(""), - VehicleAction.SendResponse(Service.defaultPlayerGUID, ChatMsg(ChatMessageType.UNK_227, msg)) + VehicleAction.SendResponse(ChatMsg(ChatMessageType.UNK_227, msg)) ) } msgOpt.isDefined diff --git a/src/main/scala/net/psforever/services/avatar/AvatarService.scala b/src/main/scala/net/psforever/services/avatar/AvatarService.scala index 7b8fb1e6b..dad3e9070 100644 --- a/src/main/scala/net/psforever/services/avatar/AvatarService.scala +++ b/src/main/scala/net/psforever/services/avatar/AvatarService.scala @@ -27,7 +27,7 @@ class AvatarService(zone: Zone) busName = "Avatar", eventSupportServices = List(CorpseRemovalSupport, ItemRemoverSupport) ) { - protected def compose(msg: GenericMessageEnvelope): AvatarServiceResponse = { + protected def composeResponseEnvelope(msg: GenericMessageEnvelope): AvatarServiceResponse = { AvatarServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response()) } } diff --git a/src/main/scala/net/psforever/services/base/GenericEventService.scala b/src/main/scala/net/psforever/services/base/GenericEventService.scala index 0ec9aa690..913914b2c 100644 --- a/src/main/scala/net/psforever/services/base/GenericEventService.scala +++ b/src/main/scala/net/psforever/services/base/GenericEventService.scala @@ -22,18 +22,18 @@ abstract class GenericEventService[OUT <: GenericResponseEnvelope](busName: Stri extends Actor { protected lazy val log: Logger = org.log4s.getLogger(getClass.getSimpleName) - protected val eventBus: GenericEventBus[OUT] = setupEventBus() + protected val eventBus: GenericEventBus[OUT] = new GenericEventBus[OUT] def BusName: String = busName - def commonJoinBehavior: Receive = { + private def commonJoinBehavior: Receive = { case Service.Join(channel) => val path = formatChannelOnBusName(channel) val who = sender() eventBus.subscribe(who, path) } - def commonLeaveBehavior: Receive = { + private def commonLeaveBehavior: Receive = { case Service.Leave(None) => eventBus.unsubscribe(sender()) @@ -54,25 +54,11 @@ abstract class GenericEventService[OUT <: GenericResponseEnvelope](busName: Stri log.warn(s"Unhandled message $msg from ${sender()}") } - private def handleMessage(msg: GenericMessageEnvelope): Unit = { - eventBus.publish(compose(msg)) + protected def handleMessage(msg: GenericMessageEnvelope): Unit = { + eventBus.publish(composeResponseEnvelope(msg)) } - protected def setupEventBus(): GenericEventBus[OUT] = { - new GenericEventBus[OUT] - } + protected def composeResponseEnvelope(@unused msg: GenericMessageEnvelope): OUT - protected def compose(@unused msg: GenericMessageEnvelope): OUT - - def formatChannelOnBusName(channel: String): String = GenericEventService.BusOnChannelFormat(busName)(channel) -} - -object GenericEventService { - final def BusOnChannelFormat(busName: String)(channel: String): String = { - if (channel.trim.isEmpty) { - s"/$busName" - } else { - s"/$channel/$busName" - } - } + protected def formatChannelOnBusName(channel: String): String = s"/$channel/$busName" } diff --git a/src/main/scala/net/psforever/services/base/GenericEventServiceWithSupport.scala b/src/main/scala/net/psforever/services/base/GenericEventServiceWithSupport.scala index c40368389..508086d4b 100644 --- a/src/main/scala/net/psforever/services/base/GenericEventServiceWithSupport.scala +++ b/src/main/scala/net/psforever/services/base/GenericEventServiceWithSupport.scala @@ -3,7 +3,6 @@ package net.psforever.services.base import akka.actor.{ActorContext, ActorRef} import net.psforever.services.Service -import net.psforever.services.base.bus.{GenericEventBus, GenericEventBusResponseToSupport, GenericEventBusWithSupport} import net.psforever.types.PlanetSideGUID import scala.annotation.unused @@ -49,20 +48,15 @@ abstract class GenericEventServiceWithSupport[OUT <: GenericResponseEnvelope] } } - override protected def setupEventBus(): GenericEventBus[OUT] = { - new GenericEventBus[OUT] with GenericEventBusWithSupport[OUT] { - override def publish(event: OUT): Unit = publishingWithSupport(event) - - override def forwardToExternalSupport(msg: GenericEventBusResponseToSupport): Unit = { - msg match { - case supportMessage: GenericMessageToSupportEnvelope => forwardToExternal(supportMessage) - case _ => () - } - } - - private def forwardToExternal(msg: GenericMessageToSupportEnvelope): Unit = { + override protected def handleMessage(event: GenericMessageEnvelope): Unit = { + event match { + case msg: GenericMessageToSupportEnvelopeOnly => forwardToSupport(msg) - } + case msg: GenericMessageToSupportEnvelope => + forwardToSupport(msg) + eventBus.publish(composeResponseEnvelope(event)) + case _ => + eventBus.publish(composeResponseEnvelope(event)) } } } diff --git a/src/main/scala/net/psforever/services/base/bus/GenericEventBus.scala b/src/main/scala/net/psforever/services/base/bus/GenericEventBus.scala index faaa81490..a025726d1 100644 --- a/src/main/scala/net/psforever/services/base/bus/GenericEventBus.scala +++ b/src/main/scala/net/psforever/services/base/bus/GenericEventBus.scala @@ -31,6 +31,10 @@ class GenericEventBus[A <: GenericEventBusResponse] subscriber ! event } + override def publish(event: Event): Unit = { + truePublish(event) + } + def truePublish(event: Event): Unit = { super[SubchannelClassification].publish(event) } diff --git a/src/main/scala/net/psforever/services/base/bus/GenericEventBusWithSupport.scala b/src/main/scala/net/psforever/services/base/bus/GenericEventBusWithSupport.scala index 34381ccb1..4b0ccd890 100644 --- a/src/main/scala/net/psforever/services/base/bus/GenericEventBusWithSupport.scala +++ b/src/main/scala/net/psforever/services/base/bus/GenericEventBusWithSupport.scala @@ -16,7 +16,7 @@ trait GenericEventBusResponseToSupportOnly trait GenericEventBusWithSupport[T <: GenericEventBusResponse] { bus: GenericEventBus[T] => - def publishingWithSupport(event: T): Unit = { + def handleMessageWithSupport(event: T): Unit = { event match { case msg: GenericEventBusResponseToSupportOnly => forwardToExternalSupport(msg) diff --git a/src/main/scala/net/psforever/services/galaxy/GalaxyService.scala b/src/main/scala/net/psforever/services/galaxy/GalaxyService.scala index 65d15b2cd..b38b68776 100644 --- a/src/main/scala/net/psforever/services/galaxy/GalaxyService.scala +++ b/src/main/scala/net/psforever/services/galaxy/GalaxyService.scala @@ -5,7 +5,15 @@ import net.psforever.services.base.{GenericEventService, GenericMessageEnvelope} class GalaxyService extends GenericEventService[GalaxyServiceResponse](busName = "Galaxy") { - protected def compose(msg: GenericMessageEnvelope): GalaxyServiceResponse = { + protected def composeResponseEnvelope(msg: GenericMessageEnvelope): GalaxyServiceResponse = { GalaxyServiceResponse(formatChannelOnBusName(msg.channel), msg.msg.response()) } + + override protected def formatChannelOnBusName(channel: String): String = { + if (channel.trim.isEmpty) { + s"/$BusName" + } else { + s"/$channel/$BusName" + } + } } diff --git a/src/main/scala/net/psforever/services/local/LocalService.scala b/src/main/scala/net/psforever/services/local/LocalService.scala index e7ee464a8..37f112cc5 100644 --- a/src/main/scala/net/psforever/services/local/LocalService.scala +++ b/src/main/scala/net/psforever/services/local/LocalService.scala @@ -44,7 +44,7 @@ class LocalService(zone: Zone) busName = "Local", eventSupportServices = List(DoorCloserSupport, HackClearSupport, HackCaptureSupport, CaptureFlagSupport(zone)) ) { - protected def compose(msg: GenericMessageEnvelope): LocalServiceResponse = { + protected def composeResponseEnvelope(msg: GenericMessageEnvelope): LocalServiceResponse = { LocalServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response()) } } diff --git a/src/main/scala/net/psforever/services/vehicle/VehicleAction.scala b/src/main/scala/net/psforever/services/vehicle/VehicleAction.scala new file mode 100644 index 000000000..dcc3535be --- /dev/null +++ b/src/main/scala/net/psforever/services/vehicle/VehicleAction.scala @@ -0,0 +1,196 @@ +// Copyright (c) 2017-2026 PSForever +package net.psforever.services.vehicle + +import net.psforever.objects.{PlanetSideGameObject, Vehicle} +import net.psforever.objects.equipment.Equipment +import net.psforever.objects.inventory.InventoryItem +import net.psforever.objects.serverobject.tube.SpawnTube +import net.psforever.objects.zones.Zone +import net.psforever.packet.PlanetSideGamePacket +import net.psforever.packet.game.ObjectCreateMessage +import net.psforever.packet.game.objectcreate.{ConstructorData, ObjectCreateMessageParent} +import net.psforever.services.base.{EventMessage, EventResponse, SelfResponseMessage} +import net.psforever.types.{BailType, DriveState, PlanetSideGUID, Vector3} + +object VehicleAction { + trait Action extends EventMessage { + def response(): EventResponse = null + } + + final case class ChangeAmmo( + weapon_guid: PlanetSideGUID, + weapon_slot: Int, + old_ammo_guid: PlanetSideGUID, + ammo_id: Int, + ammo_guid: PlanetSideGUID, + ammo_data: ConstructorData + ) extends SelfResponseMessage + + final case class ChangeFireState_Start(weapon_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class ChangeFireState_Stop(weapon_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class ChildObjectState(object_guid: PlanetSideGUID, pitch: Float, yaw: Float) extends SelfResponseMessage + + final case class ConcealPlayer(player_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class DeployRequest( + object_guid: PlanetSideGUID, + state: DriveState.Value, + unk1: Int, + unk2: Boolean, + pos: Vector3 + ) extends SelfResponseMessage + + final case class DismountVehicle(bailType: BailType.Value, unk2: Boolean) extends SelfResponseMessage + + final case class EquipmentCreatedInSlot(pkt: ObjectCreateMessage) extends EventResponse + + final case class EquipmentInSlot(target_guid: PlanetSideGUID, slot: Int, equipment: Equipment) extends EventMessage { + override def response(): EventResponse = { + val definition = equipment.Definition + val pkt = ObjectCreateMessage( + definition.ObjectId, + equipment.GUID, + ObjectCreateMessageParent(target_guid, slot), + definition.Packet.ConstructorData(equipment).get + ) + ObjectCreateMessageParent(target_guid, slot) + VehicleAction.EquipmentCreatedInSlot(pkt) + } + } + + final case class FrameVehicleState( + vehicle_guid: PlanetSideGUID, + unk1: Int, + pos: Vector3, + orient: Vector3, + vel: Option[Vector3], + unk2: Boolean, + unk3: Int, + unk4: Int, + is_crouched: Boolean, + unk6: Boolean, + unk7: Boolean, + unk8: Int, + unk9: Long, + unkA: Long + ) extends SelfResponseMessage + + final case class GenericObjectAction(guid: PlanetSideGUID, action: Int) extends SelfResponseMessage + + final case class HitHint(source_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class InventoryState( + obj: PlanetSideGameObject, + parent_guid: PlanetSideGUID, + start: Int, + con_data: ConstructorData + ) extends SelfResponseMessage + + final case class InventoryState2(obj_guid: PlanetSideGUID, parent_guid: PlanetSideGUID, value: Int) extends SelfResponseMessage + + final case class KickPassenger(unk1: Int, unk2: Boolean, vehicle_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class LoadVehicle( + vehicle: Vehicle, + vtype: Int, + vguid: PlanetSideGUID, + vdata: ConstructorData + ) extends SelfResponseMessage + + final case class MountVehicle(object_guid: PlanetSideGUID, seat: Int) extends SelfResponseMessage + + final case class ObjectDelete(guid: PlanetSideGUID) extends SelfResponseMessage + + final case class Ownership(vehicle_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class LoseOwnership(owner_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class PlanetsideAttribute( + target_guid: PlanetSideGUID, + attribute_type: Int, + attribute_value: Long + ) extends SelfResponseMessage + + final case class Reload(weapon_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class RevealPlayer(player_guid: PlanetSideGUID) extends EventResponse + + final case class SeatPermissions(vehicle_guid: PlanetSideGUID, seat_group: Int, permission: Long) extends SelfResponseMessage + + final case class StowCreatedEquipment( + vehicle_guid: PlanetSideGUID, + slot: Int, + itype: Int, + iguid: PlanetSideGUID, + idata: ConstructorData + ) extends EventResponse + + final case class StowEquipment(vehicle_guid: PlanetSideGUID, slot: Int, item: Equipment) extends SelfResponseMessage + + final case class UnloadVehicle(vehicle: Vehicle, vehicle_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class UnstowEquipment(item_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class WeaponDryFire(weapon_guid: PlanetSideGUID) extends SelfResponseMessage + + final case class VehicleState( + vehicle_guid: PlanetSideGUID, + unk1: Int, + pos: Vector3, + ang: Vector3, + vel: Option[Vector3], + unk2: Option[Int], + unk3: Int, + unk4: Int, + wheel_direction: Int, + unk5: Boolean, + unk6: Boolean + ) extends SelfResponseMessage + + final case class SendResponse(msg: PlanetSideGamePacket) extends SelfResponseMessage + + final case class UpdateAmsSpawnList(list: List[SpawnTube]) extends EventResponse + + final case class UpdateAmsSpawnPoint(zone: Zone) extends EventMessage { + override def response(): EventResponse = { + VehicleAction.UpdateAmsSpawnList(AmsSpawnPoints(zone)) + } + } + + final case class AMSDeploymentChange(zone: Zone) extends EventMessage { + override def response(): EventResponse = { + VehicleAction.UpdateAmsSpawnList(AmsSpawnPoints(zone)) + } + } + + final case class TransferPassengerChannel( + temp_channel: String, + new_channel: String, + vehicle: Vehicle, + vehicle_to_delete: PlanetSideGUID + ) extends SelfResponseMessage + + final case class KickCargo(cargo: Vehicle, speed: Int, delay: Long) extends SelfResponseMessage + + final case class ChangeLoadout( + target_guid: PlanetSideGUID, + removed_weapons: List[(Equipment, PlanetSideGUID)], + new_weapons: List[InventoryItem], + old_inventory: List[(Equipment, PlanetSideGUID)], + new_inventory: List[InventoryItem] + ) extends SelfResponseMessage + + import net.psforever.objects.serverobject.tube.SpawnTube + private def AmsSpawnPoints(zone: Zone): List[SpawnTube] = { + import net.psforever.objects.vehicles.UtilityType + import net.psforever.objects.GlobalDefinitions + zone.Vehicles + .filter(veh => + veh.Health > 0 && veh.Definition == GlobalDefinitions.ams && veh.DeploymentState == DriveState.Deployed + ) + .flatMap(veh => veh.Utilities.values.filter(util => util.UtilType == UtilityType.ams_respawn_tube)) + .map(util => util().asInstanceOf[SpawnTube]) + } +} diff --git a/src/main/scala/net/psforever/services/vehicle/VehicleService.scala b/src/main/scala/net/psforever/services/vehicle/VehicleService.scala index 0116f278a..47af9487a 100644 --- a/src/main/scala/net/psforever/services/vehicle/VehicleService.scala +++ b/src/main/scala/net/psforever/services/vehicle/VehicleService.scala @@ -1,443 +1,25 @@ // Copyright (c) 2017 PSForever package net.psforever.services.vehicle -import akka.actor.{Actor, ActorRef, Props} -import net.psforever.objects.serverobject.pad.VehicleSpawnPad +import akka.actor.{ActorContext, ActorRef, Props} import net.psforever.objects.zones.Zone -import net.psforever.packet.game.ObjectCreateMessage -import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent +import net.psforever.services.base.{EventServiceSupport, GenericEventServiceWithSupport, GenericMessageEnvelope} import net.psforever.services.vehicle.support.TurretUpgrader -import net.psforever.types.DriveState -import net.psforever.services.Service -import net.psforever.services.base.bus.GenericEventBus -class VehicleService(zone: Zone) extends Actor { - private val turretUpgrade: ActorRef = context.actorOf(Props[TurretUpgrader](), s"${zone.id}-turret-upgrade-agent") - private[this] val log = org.log4s.getLogger - - val VehicleEvents = new GenericEventBus[VehicleServiceResponse] - - def receive: Receive = { - case Service.Join(channel) => - val path = s"/$channel/Vehicle" - VehicleEvents.subscribe(sender(), path) - - case Service.Leave(None) => - VehicleEvents.unsubscribe(sender()) - - case Service.Leave(Some(channel)) => - val path = s"/$channel/Vehicle" - VehicleEvents.unsubscribe(sender(), path) - - case Service.LeaveAll() => - VehicleEvents.unsubscribe(sender()) - - case VehicleServiceMessage(forChannel, action) => - action match { - case VehicleAction.ChangeAmmo(player_guid, weapon_guid, weapon_slot, old_ammo_guid, ammo_id, ammo_guid, ammo_data) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.ChangeAmmo(weapon_guid, weapon_slot, old_ammo_guid, ammo_id, ammo_guid, ammo_data) - ) - ) - case VehicleAction.ChangeFireState_Start(player_guid, weapon_guid) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.ChangeFireState_Start(weapon_guid) - ) - ) - case VehicleAction.ChangeFireState_Stop(player_guid, weapon_guid) => - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.ChangeFireState_Stop(weapon_guid)) - ) - case VehicleAction.ChildObjectState(player_guid, object_guid, pitch, yaw) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.ChildObjectState(object_guid, pitch, yaw) - ) - ) - case VehicleAction.DeployRequest(player_guid, object_guid, state, unk1, unk2, pos) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.DeployRequest(object_guid, state, unk1, unk2, pos) - ) - ) - case VehicleAction.DismountVehicle(player_guid, bailType, unk2) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.DismountVehicle(bailType, unk2) - ) - ) - case VehicleAction.EquipmentInSlot(player_guid, target_guid, slot, equipment) => - val definition = equipment.Definition - val pkt = ObjectCreateMessage( - definition.ObjectId, - equipment.GUID, - ObjectCreateMessageParent(target_guid, slot), - definition.Packet.ConstructorData(equipment).get - ) - ObjectCreateMessageParent(target_guid, slot) - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.EquipmentInSlot(pkt)) - ) - case VehicleAction.FrameVehicleState( - player_guid, - vehicle_guid, - unk1, - pos, - orient, - vel, - unk2, - unk3, - unk4, - is_crouched, - unk6, - unk7, - unk8, - unk9, - unkA - ) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.FrameVehicleState( - vehicle_guid, - unk1, - pos, - orient, - vel, - unk2, - unk3, - unk4, - is_crouched, - unk6, - unk7, - unk8, - unk9, - unkA - ) - ) - ) - case VehicleAction.GenericObjectAction(player_guid, guid, code) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.GenericObjectAction(guid, code) - ) - ) - case VehicleAction.InventoryState(player_guid, obj, parent_guid, start, con_data) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.InventoryState(obj, parent_guid, start, con_data) - ) - ) - case VehicleAction.InventoryState2(player_guid, obj_guid, parent_guid, value) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.InventoryState2(obj_guid, parent_guid, value) - ) - ) - case VehicleAction.KickPassenger(player_guid, seat_num, kickedByDriver, vehicle_guid) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.KickPassenger(seat_num, kickedByDriver, vehicle_guid) - ) - ) - case VehicleAction.ObjectDelete(guid) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.ObjectDelete(guid) - ) - ) - case VehicleAction.LoadVehicle(player_guid, vehicle, vtype, vguid, vdata) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.LoadVehicle(vehicle, vtype, vguid, vdata) - ) - ) - case VehicleAction.MountVehicle(player_guid, vehicle_guid, seat) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.MountVehicle(vehicle_guid, seat) - ) - ) - case VehicleAction.LoseOwnership(owner_guid, vehicle_guid) => - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", Service.defaultPlayerGUID, VehicleResponse.LoseOwnership(owner_guid, vehicle_guid)) - ) - case VehicleAction.Ownership(player_guid, vehicle_guid) => - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.Ownership(vehicle_guid)) - ) - case VehicleAction.PlanetsideAttribute(exclude_guid, target_guid, attribute_type, attribute_value) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - exclude_guid, - VehicleResponse.PlanetsideAttribute(target_guid, attribute_type, attribute_value) - ) - ) - - case VehicleAction.Reload(player_guid, weapon_guid) => - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.Reload(weapon_guid)) - ) - case VehicleAction.SeatPermissions(player_guid, vehicle_guid, seat_group, permission) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.SeatPermissions(vehicle_guid, seat_group, permission) - ) - ) - case VehicleAction.StowEquipment(player_guid, vehicle_guid, slot, item) => - val definition = item.Definition - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.StowEquipment( - vehicle_guid, - slot, - definition.ObjectId, - item.GUID, - definition.Packet.DetailedConstructorData(item).get - ) - ) - ) - case VehicleAction.WeaponDryFire(player_guid, weapon_guid) => - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.WeaponDryFire(weapon_guid)) - ) - case VehicleAction.UnloadVehicle(player_guid, vehicle, vehicle_guid) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.UnloadVehicle(vehicle, vehicle_guid) - ) - ) - case VehicleAction.UnstowEquipment(player_guid, item_guid) => - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.UnstowEquipment(item_guid)) - ) - case VehicleAction.VehicleState( - player_guid, - vehicle_guid, - unk1, - pos, - ang, - vel, - unk2, - unk3, - unk4, - wheel_direction, - unk5, - unk6 - ) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.VehicleState( - vehicle_guid, - unk1, - pos, - ang, - vel, - unk2, - unk3, - unk4, - wheel_direction, - unk5, - unk6 - ) - ) - ) - case VehicleAction.SendResponse(player_guid, msg) => - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.SendResponse(msg)) - ) - - //unlike other messages, just return to sender, don't publish - case VehicleAction.UpdateAmsSpawnPoint(zone: Zone) => - sender() ! VehicleServiceResponse( - s"/$forChannel/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.UpdateAmsSpawnPoint(AmsSpawnPoints(zone)) - ) - - case VehicleAction.TransferPassengerChannel( - player_guid, - old_channel, - temp_channel, - vehicle, - vehicle_to_delete - ) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - player_guid, - VehicleResponse.TransferPassengerChannel(old_channel, temp_channel, vehicle, vehicle_to_delete) - ) - ) - case VehicleAction.KickCargo(player_guid, cargo, speed, delay) => - VehicleEvents.publish( - VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.KickCargo(cargo, speed, delay)) - ) - - case VehicleAction.ChangeLoadout(target_guid, removed_weapons, new_weapons, old_inventory, new_inventory) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$forChannel/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.ChangeLoadout(target_guid, removed_weapons, new_weapons, old_inventory, new_inventory) - ) - ) - case _ => ; - } - - //message to TurretUpgrader - case VehicleServiceMessage.TurretUpgrade(msg) => - turretUpgrade forward msg - - //from VehicleSpawnControl, etc. - case VehicleSpawnPad.ConcealPlayer(player_guid) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/${zone.id}/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.ConcealPlayer(player_guid) - ) - ) - - case VehicleSpawnPad.AttachToRails(vehicle, pad) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/${zone.id}/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.AttachToRails(vehicle.GUID, pad.GUID) - ) - ) - - case VehicleSpawnPad.StartPlayerSeatedInVehicle(driver_name, vehicle, pad) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$driver_name/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.StartPlayerSeatedInVehicle(vehicle, pad) - ) - ) - - case VehicleSpawnPad.PlayerSeatedInVehicle(driver_name, vehicle, pad) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$driver_name/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.PlayerSeatedInVehicle(vehicle, pad) - ) - ) - - case VehicleSpawnPad.ServerVehicleOverrideStart(driver_name, vehicle, pad) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$driver_name/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.ServerVehicleOverrideStart(vehicle, pad) - ) - ) - - case VehicleSpawnPad.ServerVehicleOverrideEnd(driver_name, vehicle, pad) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$driver_name/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.ServerVehicleOverrideEnd(vehicle, pad) - ) - ) - - case VehicleSpawnPad.DetachFromRails(vehicle, pad) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/${zone.id}/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.DetachFromRails(vehicle.GUID, pad.GUID, pad.Position, pad.Orientation.z) - ) - ) - case VehicleSpawnPad.ResetSpawnPad(pad) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/${zone.id}/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.ResetSpawnPad(pad.GUID) - ) - ) - - case VehicleSpawnPad.RevealPlayer(player_guid) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/${zone.id}/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.RevealPlayer(player_guid) - ) - ) - - case VehicleSpawnPad.PeriodicReminder(to, reason, data) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/$to/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.PeriodicReminder(reason, data) - ) - ) - - //correspondence from WorldSessionActor - case VehicleServiceMessage.AMSDeploymentChange(_) => - VehicleEvents.publish( - VehicleServiceResponse( - s"/${zone.id}/Vehicle", - Service.defaultPlayerGUID, - VehicleResponse.UpdateAmsSpawnPoint(AmsSpawnPoints(zone)) - ) - ) - - case msg => - log.warn(s"Unhandled message $msg from ${sender()}") - } - - import net.psforever.objects.serverobject.tube.SpawnTube - def AmsSpawnPoints(zone: Zone): List[SpawnTube] = { - import net.psforever.objects.vehicles.UtilityType - import net.psforever.objects.GlobalDefinitions - zone.Vehicles - .filter(veh => - veh.Health > 0 && veh.Definition == GlobalDefinitions.ams && veh.DeploymentState == DriveState.Deployed - ) - .flatMap(veh => veh.Utilities.values.filter(util => util.UtilType == UtilityType.ams_respawn_tube)) - .map(util => util().asInstanceOf[SpawnTube]) +case object TurretUpgradeSupport + extends EventServiceSupport { + def label: String = "turretUpgrader" + def constructor(context: ActorContext): ActorRef = { + context.actorOf(Props[TurretUpgrader](), name = "TurretUpgrader") + } +} + +class VehicleService(zone: Zone) + extends GenericEventServiceWithSupport[VehicleServiceResponse]( + busName = "Vehicle", + eventSupportServices = List(TurretUpgradeSupport) + ) { + protected def composeResponseEnvelope(msg: GenericMessageEnvelope): VehicleServiceResponse = { + VehicleServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response()) } } diff --git a/src/main/scala/net/psforever/services/vehicle/VehicleServiceMessage.scala b/src/main/scala/net/psforever/services/vehicle/VehicleServiceMessage.scala index 54f6d4e96..1eb35fd26 100644 --- a/src/main/scala/net/psforever/services/vehicle/VehicleServiceMessage.scala +++ b/src/main/scala/net/psforever/services/vehicle/VehicleServiceMessage.scala @@ -1,157 +1,19 @@ // Copyright (c) 2017 PSForever package net.psforever.services.vehicle -import net.psforever.objects.{PlanetSideGameObject, Vehicle} -import net.psforever.objects.equipment.Equipment -import net.psforever.objects.inventory.InventoryItem -import net.psforever.objects.zones.Zone -import net.psforever.packet.PlanetSideGamePacket -import net.psforever.packet.game.objectcreate.ConstructorData -import net.psforever.services.base.{EventMessage, EventResponse} -import net.psforever.types.{BailType, DriveState, PlanetSideGUID, Vector3} +import net.psforever.services.Service +import net.psforever.services.base.{EventMessage, GenericMessageEnvelope, GenericMessageToSupportEnvelopeOnly} +import net.psforever.types.PlanetSideGUID -final case class VehicleServiceMessage(forChannel: String, actionMessage: VehicleAction.Action) +final case class VehicleServiceMessage(channel: String, filter: PlanetSideGUID, msg: EventMessage) + extends GenericMessageEnvelope + +final case class TurretMessage(supportMessage: Any) + extends GenericMessageToSupportEnvelopeOnly { + def supportLabel: String = "turretUpgrader" +} object VehicleServiceMessage { - final case class GiveActorControl(vehicle: Vehicle, actorName: String) - final case class RevokeActorControl(vehicle: Vehicle) - - final case class TurretUpgrade(msg: Any) - - final case class AMSDeploymentChange(zone: Zone) -} - -object VehicleAction { - trait Action extends EventMessage { - def response(): EventResponse = null - } - - final case class ChangeAmmo( - player_guid: PlanetSideGUID, - weapon_guid: PlanetSideGUID, - weapon_slot: Int, - old_ammo_guid: PlanetSideGUID, - ammo_id: Int, - ammo_guid: PlanetSideGUID, - ammo_data: ConstructorData - ) extends Action - final case class ChangeFireState_Start(player_guid: PlanetSideGUID, weapon_guid: PlanetSideGUID) extends Action - final case class ChangeFireState_Stop(player_guid: PlanetSideGUID, weapon_guid: PlanetSideGUID) extends Action - final case class ChildObjectState(player_guid: PlanetSideGUID, object_guid: PlanetSideGUID, pitch: Float, yaw: Float) - extends Action - final case class DeployRequest( - player_guid: PlanetSideGUID, - object_guid: PlanetSideGUID, - state: DriveState.Value, - unk1: Int, - unk2: Boolean, - pos: Vector3 - ) extends Action - final case class DismountVehicle(player_guid: PlanetSideGUID, bailType: BailType.Value, unk2: Boolean) extends Action - final case class EquipmentInSlot( - player_guid: PlanetSideGUID, - target_guid: PlanetSideGUID, - slot: Int, - equipment: Equipment - ) extends Action - final case class FrameVehicleState( - player_guid: PlanetSideGUID, - vehicle_guid: PlanetSideGUID, - unk1: Int, - pos: Vector3, - orient: Vector3, - vel: Option[Vector3], - unk2: Boolean, - unk3: Int, - unk4: Int, - is_crouched: Boolean, - unk6: Boolean, - unk7: Boolean, - unk8: Int, - unk9: Long, - unkA: Long - ) extends Action - final case class GenericObjectAction(player_guid: PlanetSideGUID, guid: PlanetSideGUID, action: Int) extends Action - final case class InventoryState( - player_guid: PlanetSideGUID, - obj: PlanetSideGameObject, - parent_guid: PlanetSideGUID, - start: Int, - con_data: ConstructorData - ) extends Action - final case class InventoryState2( - player_guid: PlanetSideGUID, - obj_guid: PlanetSideGUID, - parent_guid: PlanetSideGUID, - value: Int - ) extends Action - final case class KickPassenger(player_guid: PlanetSideGUID, unk1: Int, unk2: Boolean, vehicle_guid: PlanetSideGUID) - extends Action - final case class LoadVehicle( - player_guid: PlanetSideGUID, - vehicle: Vehicle, - vtype: Int, - vguid: PlanetSideGUID, - vdata: ConstructorData - ) extends Action - final case class MountVehicle(player_guid: PlanetSideGUID, object_guid: PlanetSideGUID, seat: Int) extends Action - final case class ObjectDelete(guid: PlanetSideGUID) extends Action - final case class LoseOwnership(owner_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID) extends Action - final case class Ownership(player_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID) extends Action - final case class PlanetsideAttribute( - player_guid: PlanetSideGUID, - target_guid: PlanetSideGUID, - attribute_type: Int, - attribute_value: Long - ) extends Action - final case class Reload(player_guid: PlanetSideGUID, weapon_guid: PlanetSideGUID) extends Action - final case class SeatPermissions( - player_guid: PlanetSideGUID, - vehicle_guid: PlanetSideGUID, - seat_group: Int, - permission: Long - ) extends Action - final case class StowEquipment(player_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID, slot: Int, item: Equipment) - extends Action - final case class UnloadVehicle( - player_guid: PlanetSideGUID, - vehicle: Vehicle, - vehicle_guid: PlanetSideGUID - ) extends Action - final case class UnstowEquipment(player_guid: PlanetSideGUID, item_guid: PlanetSideGUID) extends Action - final case class VehicleState( - player_guid: PlanetSideGUID, - vehicle_guid: PlanetSideGUID, - unk1: Int, - pos: Vector3, - ang: Vector3, - vel: Option[Vector3], - unk2: Option[Int], - unk3: Int, - unk4: Int, - wheel_direction: Int, - unk5: Boolean, - unk6: Boolean - ) extends Action - final case class SendResponse(player_guid: PlanetSideGUID, msg: PlanetSideGamePacket) extends Action - final case class WeaponDryFire(player_guid: PlanetSideGUID, weapon_guid: PlanetSideGUID) extends Action - final case class UpdateAmsSpawnPoint(zone: Zone) extends Action - - final case class TransferPassengerChannel( - player_guid: PlanetSideGUID, - temp_channel: String, - new_channel: String, - vehicle: Vehicle, - vehicle_to_delete: PlanetSideGUID - ) extends Action - - final case class KickCargo(player_guid: PlanetSideGUID, cargo: Vehicle, speed: Int, delay: Long) extends Action - - final case class ChangeLoadout( - target_guid: PlanetSideGUID, - removed_weapons: List[(Equipment, PlanetSideGUID)], - new_weapons: List[InventoryItem], - old_inventory: List[(Equipment, PlanetSideGUID)], - new_inventory: List[InventoryItem] - ) extends Action + def apply(channel: String, actionMessage: EventMessage): VehicleServiceMessage = + VehicleServiceMessage(channel, Service.defaultPlayerGUID, actionMessage) } diff --git a/src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala b/src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala index dd052809f..f28b5652e 100644 --- a/src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala +++ b/src/main/scala/net/psforever/services/vehicle/VehicleServiceResponse.scala @@ -1,141 +1,11 @@ // Copyright (c) 2017 PSForever package net.psforever.services.vehicle -import net.psforever.objects.equipment.Equipment -import net.psforever.objects.inventory.InventoryItem -import net.psforever.objects.serverobject.pad.VehicleSpawnPad -import net.psforever.objects.serverobject.pad.VehicleSpawnPad.Reminders -import net.psforever.objects.{PlanetSideGameObject, Vehicle} -import net.psforever.objects.serverobject.tube.SpawnTube -import net.psforever.packet.PlanetSideGamePacket -import net.psforever.packet.game.objectcreate.ConstructorData -import net.psforever.packet.game.ObjectCreateMessage -import net.psforever.types.{BailType, DriveState, PlanetSideGUID, Vector3} -import net.psforever.services.base.EventResponse -import net.psforever.services.base.bus.GenericEventBusResponse +import net.psforever.types.PlanetSideGUID +import net.psforever.services.base.{EventResponse, GenericResponseEnvelope} final case class VehicleServiceResponse( channel: String, filter: PlanetSideGUID, - reply: VehicleResponse.Response - ) extends GenericEventBusResponse - -object VehicleResponse { - trait Response extends EventResponse - - final case class ChangeAmmo( - weapon_guid: PlanetSideGUID, - weapon_slot: Int, - old_ammo_guid: PlanetSideGUID, - ammo_id: Int, - ammo_guid: PlanetSideGUID, - ammo_data: ConstructorData - ) extends Response - final case class ChangeFireState_Start(weapon_guid: PlanetSideGUID) extends Response - final case class ChangeFireState_Stop(weapon_guid: PlanetSideGUID) extends Response - final case class ChildObjectState(object_guid: PlanetSideGUID, pitch: Float, yaw: Float) extends Response - final case class ConcealPlayer(player_guid: PlanetSideGUID) extends Response - final case class DeployRequest( - object_guid: PlanetSideGUID, - state: DriveState.Value, - unk1: Int, - unk2: Boolean, - pos: Vector3 - ) extends Response - final case class DismountVehicle(bailType: BailType.Value, unk2: Boolean) extends Response - final case class EquipmentInSlot(pkt: ObjectCreateMessage) extends Response - final case class FrameVehicleState( - vehicle_guid: PlanetSideGUID, - unk1: Int, - pos: Vector3, - orient: Vector3, - vel: Option[Vector3], - unk2: Boolean, - unk3: Int, - unk4: Int, - is_crouched: Boolean, - unk6: Boolean, - unk7: Boolean, - unk8: Int, - unk9: Long, - unkA: Long - ) extends Response - final case class GenericObjectAction(guid: PlanetSideGUID, action: Int) extends Response - final case class HitHint(source_guid: PlanetSideGUID) extends Response - final case class InventoryState( - obj: PlanetSideGameObject, - parent_guid: PlanetSideGUID, - start: Int, - con_data: ConstructorData - ) extends Response - final case class InventoryState2(obj_guid: PlanetSideGUID, parent_guid: PlanetSideGUID, value: Int) extends Response - final case class KickPassenger(seat_num: Int, kickedByDriver: Boolean, vehicle_guid: PlanetSideGUID) extends Response - final case class LoadVehicle(vehicle: Vehicle, vtype: Int, vguid: PlanetSideGUID, vdata: ConstructorData) - extends Response - final case class MountVehicle(object_guid: PlanetSideGUID, seat: Int) extends Response - final case class ObjectDelete(guid: PlanetSideGUID) extends Response - final case class Ownership(vehicle_guid: PlanetSideGUID) extends Response - final case class LoseOwnership(owner_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID) - extends Response - final case class PlanetsideAttribute(vehicle_guid: PlanetSideGUID, attribute_type: Int, attribute_value: Long) - extends Response - final case class Reload(weapon_guid: PlanetSideGUID) extends Response - final case class RevealPlayer(player_guid: PlanetSideGUID) extends Response - final case class SeatPermissions(vehicle_guid: PlanetSideGUID, seat_group: Int, permission: Long) extends Response - final case class StowEquipment( - vehicle_guid: PlanetSideGUID, - slot: Int, - itype: Int, - iguid: PlanetSideGUID, - idata: ConstructorData - ) extends Response - final case class WeaponDryFire(weapon_guid: PlanetSideGUID) extends Response - final case class UnloadVehicle(vehicle: Vehicle, vehicle_guid: PlanetSideGUID) extends Response - final case class UnstowEquipment(item_guid: PlanetSideGUID) extends Response - final case class VehicleState( - vehicle_guid: PlanetSideGUID, - unk1: Int, - pos: Vector3, - ang: Vector3, - vel: Option[Vector3], - unk2: Option[Int], - unk3: Int, - unk4: Int, - wheel_direction: Int, - unk5: Boolean, - unk6: Boolean - ) extends Response - final case class SendResponse(msg: PlanetSideGamePacket) extends Response - final case class UpdateAmsSpawnPoint(list: List[SpawnTube]) extends Response - - final case class AttachToRails(vehicle_guid: PlanetSideGUID, rails_guid: PlanetSideGUID) extends Response - final case class StartPlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends Response - final case class PlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends Response - final case class DetachFromRails( - vehicle_guid: PlanetSideGUID, - rails_guid: PlanetSideGUID, - rails_pos: Vector3, - rails_rot: Float - ) extends Response - final case class ServerVehicleOverrideStart(vehicle: Vehicle, pad: VehicleSpawnPad) extends Response - final case class ServerVehicleOverrideEnd(vehicle: Vehicle, pad: VehicleSpawnPad) extends Response - final case class ResetSpawnPad(pad_guid: PlanetSideGUID) extends Response - final case class PeriodicReminder(reason: Reminders.Value, data: Option[Any] = None) extends Response - - final case class TransferPassengerChannel( - old_channel: String, - temp_channel: String, - vehicle: Vehicle, - vehicle_to_delete: PlanetSideGUID - ) extends Response - - final case class KickCargo(cargo: Vehicle, speed: Int, delay: Long) extends Response - - final case class ChangeLoadout( - target_guid: PlanetSideGUID, - removed_weapons: List[(Equipment, PlanetSideGUID)], - new_weapons: List[InventoryItem], - old_inventory: List[(Equipment, PlanetSideGUID)], - new_inventory: List[InventoryItem] - ) extends Response -} + reply: EventResponse + ) extends GenericResponseEnvelope diff --git a/src/main/scala/net/psforever/services/vehicle/support/TurretUpgrader.scala b/src/main/scala/net/psforever/services/vehicle/support/TurretUpgrader.scala index 96939203a..ac08220e4 100644 --- a/src/main/scala/net/psforever/services/vehicle/support/TurretUpgrader.scala +++ b/src/main/scala/net/psforever/services/vehicle/support/TurretUpgrader.scala @@ -161,7 +161,8 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] { if (tplayer.HasGUID) { context.parent ! VehicleServiceMessage( zoneId, - VehicleAction.KickPassenger(tplayer.GUID, 4, unk2=false, turretGUID) + tplayer.GUID, + VehicleAction.KickPassenger(4, unk2=false, turretGUID) ) } }) @@ -235,7 +236,7 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] { case (index, Some(tool: Tool)) => context.parent ! VehicleServiceMessage( zone.id, - VehicleAction.EquipmentInSlot(PlanetSideGUID(0), targetGUID, index, tool) + VehicleAction.EquipmentInSlot(targetGUID, index, tool) ) } } diff --git a/src/test/scala/objects/DamageableTest.scala b/src/test/scala/objects/DamageableTest.scala index bd2381fb9..aae4b98e6 100644 --- a/src/test/scala/objects/DamageableTest.scala +++ b/src/test/scala/objects/DamageableTest.scala @@ -24,9 +24,8 @@ import net.psforever.packet.game.DamageWithPositionMessage import net.psforever.types._ import net.psforever.services.Service import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} -import net.psforever.services.support.SupportActor -import net.psforever.services.vehicle.support.TurretUpgrader -import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} +import net.psforever.services.base.support.SupportActor +import net.psforever.services.vehicle.{TurretMessage, VehicleAction, VehicleServiceMessage} import org.specs2.mutable.Specification import scala.concurrent.duration._ @@ -831,7 +830,7 @@ class DamageableWeaponTurretDamageTest extends ActorTest { val msg4 = avatarProbe.receiveOne(500 milliseconds) assert( msg12 match { - case VehicleServiceMessage("test", VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(2), 0, _)) => true + case VehicleServiceMessage("test", _, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(2), 0, _)) => true case _ => false } ) @@ -933,6 +932,7 @@ class DamageableWeaponTurretJammerTest extends ActorTest { msg12.head match { case VehicleServiceMessage( "test", + _, VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(2), 27, 1) ) => true @@ -943,6 +943,7 @@ class DamageableWeaponTurretJammerTest extends ActorTest { msg12(1) match { case VehicleServiceMessage( "test", + _, VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(5), 27, 1) ) => true @@ -1085,17 +1086,17 @@ class DamageableWeaponTurretDestructionTest extends ActorTest { assert(false, s"DamageableWeaponTurretDestructionTest-3: player not dead - $msg3") } msg12_4(2) match { - case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(0), PlanetSideGUID(5), _)) => ; + case AvatarServiceMessage("test", _, AvatarAction.ObjectDelete(PlanetSideGUID(5), _)) => ; case _ => assert(false, s"DamageableWeaponTurretDestructionTest-4: ${msg12_4(2)}") } msg56.head match { - case VehicleServiceMessage.TurretUpgrade(SupportActor.ClearSpecific(List(t), _)) if turret eq t => ; + case TurretMessage(SupportActor.ClearSpecific(List(t), _)) if turret eq t => ; case _ => assert(false, s"DamageableWeaponTurretDestructionTest-5: ${msg56.head}") } msg56(1) match { - case VehicleServiceMessage.TurretUpgrade(TurretUpgrader.AddTask(t, _, TurretUpgrade.None, _)) if t eq turret => () + case TurretMessage(TurretUpgrader.AddTask(t, _, TurretUpgrade.None, _)) if t eq turret => () case _ => assert(false, s"DamageableWeaponTurretDestructionTest-6: ${msg56(1)}") } assert(turret.Health <= turret.Definition.DamageDestroysAt) @@ -1180,13 +1181,13 @@ class DamageableVehicleDamageTest extends ActorTest { val msg4 = avatarProbe.receiveOne(200 milliseconds) assert( msg12.head match { - case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 68, _)) => true + case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 68, _)) => true case _ => false } ) assert( msg12(1) match { - case VehicleServiceMessage("test", VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 0, _)) => true + case VehicleServiceMessage("test", _, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 0, _)) => true case _ => false } ) @@ -1316,11 +1317,11 @@ class DamageableVehicleDamageMountedTest extends FreedContextActorTest { val msg3 = activityProbe.receiveOne(500 milliseconds) val msg45 = avatarProbe.receiveN(2,500 milliseconds) msg12.head match { - case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 68, _)) => ; + case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 68, _)) => ; case _ => assert(false) } msg12(1) match { - case VehicleServiceMessage("test", VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 0, _)) => ; + case VehicleServiceMessage("test", _, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 0, _)) => ; case _ => assert(false) } msg3 match { @@ -1453,6 +1454,7 @@ class DamageableVehicleJammeringMountedTest extends FreedContextActorTest { msg12 match { case VehicleServiceMessage( "test", + _, VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 1) ) => true @@ -1754,6 +1756,7 @@ class DamageableVehicleDestroyTest extends ActorTest { // msg_vehicle.exists({ // case VehicleServiceMessage( // "test", +// _, // VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 0) // ) => // true @@ -1764,6 +1767,7 @@ class DamageableVehicleDestroyTest extends ActorTest { // msg_vehicle.exists({ // case VehicleServiceMessage( // "test", +// _, // VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(1), 68, 0) // ) => // true diff --git a/src/test/scala/objects/DeploymentTest.scala b/src/test/scala/objects/DeploymentTest.scala index 0b86da3f9..d723f0720 100644 --- a/src/test/scala/objects/DeploymentTest.scala +++ b/src/test/scala/objects/DeploymentTest.scala @@ -74,7 +74,8 @@ class DeploymentBehavior2Test extends ActorTest { reply2.head match { case VehicleServiceMessage( "test", - VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deploying, 0, false, Vector3.Zero) + _, + VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deploying, 0, false, Vector3.Zero) ) => () case _ => assert(false, "") } @@ -86,6 +87,7 @@ class DeploymentBehavior2Test extends ActorTest { reply2(1) match { case VehicleServiceMessage( "test", + _, VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deployed, 0, false, Vector3.Zero) ) => () case _ => assert(false, "") @@ -102,6 +104,7 @@ class DeploymentBehavior2Test extends ActorTest { reply4.head match { case VehicleServiceMessage( "test", + _, VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Undeploying, 0, false, Vector3.Zero) ) => () case _ => assert(false, "") @@ -114,6 +117,7 @@ class DeploymentBehavior2Test extends ActorTest { reply4(1) match { case VehicleServiceMessage( "test", + _, VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Mobile, 0, false, Vector3.Zero) ) => () case _ => assert(false, "") @@ -141,8 +145,9 @@ class DeploymentBehavior3Test extends ActorTest { } reply2.head match { case VehicleServiceMessage( - "test", - VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deploying, 0, false, Vector3.Zero) + "test", + _, + VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deploying, 0, false, Vector3.Zero) ) => () case _ => assert(false, "") } @@ -153,8 +158,9 @@ class DeploymentBehavior3Test extends ActorTest { } reply2(1) match { case VehicleServiceMessage( - "test", - VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deployed, 0, false, Vector3.Zero) + "test", + _, + VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deployed, 0, false, Vector3.Zero) ) => () case _ => assert(false, "") } @@ -169,8 +175,9 @@ class DeploymentBehavior3Test extends ActorTest { } reply4.head match { case VehicleServiceMessage( - "test", - VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Undeploying, 0, false, Vector3.Zero) + "test", + _, + VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Undeploying, 0, false, Vector3.Zero) ) => () case _ => assert(false, "") } @@ -181,8 +188,9 @@ class DeploymentBehavior3Test extends ActorTest { } reply4(1) match { case VehicleServiceMessage( - "test", - VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Mobile, 0, false, Vector3.Zero) + "test", + _, + VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Mobile, 0, false, Vector3.Zero) ) => () case _ => assert(false, "") } diff --git a/src/test/scala/objects/FacilityTurretTest.scala b/src/test/scala/objects/FacilityTurretTest.scala index 4fcc4f218..51a52c702 100644 --- a/src/test/scala/objects/FacilityTurretTest.scala +++ b/src/test/scala/objects/FacilityTurretTest.scala @@ -298,7 +298,7 @@ class FacilityTurretControlRestorationTest extends ActorTest { ) assert( msg4 match { - case VehicleServiceMessage("test", VehicleAction.EquipmentInSlot(_, PlanetSideGUID(2), 1, t)) + case VehicleServiceMessage("test", _, VehicleAction.EquipmentInSlot(_, PlanetSideGUID(2), 1, t)) if t eq turretWeapon => true case _ => false diff --git a/src/test/scala/objects/RepairableTest.scala b/src/test/scala/objects/RepairableTest.scala index 3d2c6fc38..fad1035e3 100644 --- a/src/test/scala/objects/RepairableTest.scala +++ b/src/test/scala/objects/RepairableTest.scala @@ -313,7 +313,7 @@ class RepairableTurretWeapon extends ActorTest { ) assert( msg4 match { - case VehicleServiceMessage("test", VehicleAction.EquipmentInSlot(_, PlanetSideGUID(2), 1, t)) + case VehicleServiceMessage("test", _, VehicleAction.EquipmentInSlot(_, PlanetSideGUID(2), 1, t)) if t eq turretWeapon => true case _ => false diff --git a/src/test/scala/objects/VehicleControlTest.scala b/src/test/scala/objects/VehicleControlTest.scala index 9b9b7ca79..119fab0b3 100644 --- a/src/test/scala/objects/VehicleControlTest.scala +++ b/src/test/scala/objects/VehicleControlTest.scala @@ -72,7 +72,7 @@ class VehicleControlPrepareForDeletionPassengerTest extends ActorTest { val vehicle_msg = vehicleProbe.receiveN(1, 500 milliseconds) vehicle_msg.head match { - case VehicleServiceMessage("test", VehicleAction.KickPassenger(PlanetSideGUID(2), 4, true, PlanetSideGUID(1))) => ; + case VehicleServiceMessage("test", _, VehicleAction.KickPassenger(PlanetSideGUID(2), 4, true, PlanetSideGUID(1))) => ; case _ => assert(false, s"VehicleControlPrepareForDeletionPassengerTest: ${vehicle_msg.head}") } @@ -136,32 +136,32 @@ class VehicleControlPrepareForDeletionPassengerTest extends ActorTest { // val vehicle_msg = vehicleProbe.receiveN(6, 1 minute) // //dismounting as cargo messages // vehicle_msg.head match { -// case VehicleServiceMessage("test", VehicleAction.KickPassenger(PlanetSideGUID(3), 4, true, PlanetSideGUID(1))) => ; +// case VehicleServiceMessage("test", _, VehicleAction.KickPassenger(PlanetSideGUID(3), 4, true, PlanetSideGUID(1))) => ; // case _ => // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-1: ${vehicle_msg.head}") // } // vehicle_msg(1) match { -// case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => ; +// case VehicleServiceMessage(_, _, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => ; // case _ => // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-2: ${vehicle_msg(1)}") // } // vehicle_msg(2) match { -// case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => ; +// case VehicleServiceMessage(_, _, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => ; // case _ => // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-3: ${vehicle_msg(2)}") // } // vehicle_msg(3) match { -// case VehicleServiceMessage("test", VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0))) => ; +// case VehicleServiceMessage("test", _, VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0))) => ; // case _ => // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-4: ${vehicle_msg(3)}") // } // vehicle_msg(4) match { -// case VehicleServiceMessage("test", VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))) => ; +// case VehicleServiceMessage("test", _, VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))) => ; // case _ => // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-5: ${vehicle_msg(4)}") // } // vehicle_msg(5) match { -// case VehicleServiceMessage("test", VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0))) => ; +// case VehicleServiceMessage("test", _, VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0))) => ; // case _ => // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-6: ${vehicle_msg(5)}") // } @@ -224,7 +224,7 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor val vehicleMsgs = eventsProbe.receiveN(6, 10.seconds) val cargoMsgs = cargoProbe.receiveN(1, 1.seconds) vehicleMsgs.head match { - case VehicleServiceMessage("test", VehicleAction.KickPassenger(PlanetSideGUID(4), 4, true, PlanetSideGUID(2))) => () + case VehicleServiceMessage("test", _, VehicleAction.KickPassenger(PlanetSideGUID(4), 4, true, PlanetSideGUID(2))) => () case _ => assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-1: ${vehicleMsgs.head}") } @@ -232,27 +232,27 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor assert(lodestar.Seats(0).occupant.isEmpty) //cargo dismounting messages vehicleMsgs(1) match { - case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => () + case VehicleServiceMessage(_, _, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => () case _ => assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-2: ${vehicleMsgs(1)}") } vehicleMsgs(2) match { - case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => () + case VehicleServiceMessage(_, _, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => () case _ => assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-3: ${vehicleMsgs(2)}") } vehicleMsgs(3) match { - case VehicleServiceMessage("test", VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0))) => ; + case VehicleServiceMessage("test", _, VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, PlanetSideGUID(1), _, 1, CargoStatus.InProgress, 0))) => ; case _ => assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-4: ${vehicleMsgs(3)}") } vehicleMsgs(4) match { - case VehicleServiceMessage("test", VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))) => () + case VehicleServiceMessage("test", _, VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))) => () case _ => assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-5: ${vehicleMsgs(4)}") } vehicleMsgs(5) match { - case VehicleServiceMessage("test", VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0))) => () + case VehicleServiceMessage("test", _, VehicleAction.SendResponse(_, CargoMountPointStatusMessage(PlanetSideGUID(2), _, _, PlanetSideGUID(1), 1, CargoStatus.Empty, 0))) => () case _ => assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-6: ${vehicleMsgs(5)}") } @@ -476,7 +476,7 @@ class VehicleControlShieldsChargingTest extends ActorTest { vehicle.Actor ! CommonMessages.ChargeShields(15, None) val msg = probe.receiveOne(500 milliseconds) assert(msg match { - case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(10), 68, 15)) => true + case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(10), 68, 15)) => true case _ => false }) assert(vehicle.Shields == 15) @@ -544,7 +544,7 @@ class VehicleControlShieldsNotChargingTooEarlyTest extends ActorTest { val msg = probe.receiveOne(200 milliseconds) //assert(msg.isInstanceOf[Vehicle.UpdateShieldsCharge]) assert(msg match { - case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(10), 68, 15)) => true + case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(10), 68, 15)) => true case _ => false }) assert(vehicle.Shields == 15) @@ -1004,7 +1004,7 @@ class VehicleControlInteractWithLavaTest extends ActorTest { msg_burn.foreach { msg => assert( msg match { - case VehicleServiceMessage("test-zone", VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(2), 0, _)) => true + case VehicleServiceMessage("test-zone", _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(2), 0, _)) => true case _ => false } ) @@ -1102,7 +1102,7 @@ class ApcControlCanChargeCapacitor extends FreedContextActorTest { do { val msg = vehicleProbe.receiveOne(3.seconds) msg match { - case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, capacitance)) => + case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, capacitance)) => assert(capacitance > 0) case _ => assert(false) @@ -1176,17 +1176,17 @@ class ApcControlCanEmp extends FreedContextActorTest { apc.Actor ! SpecialEmp.Burst() val vehicleMsgs = vehicleProbe.receiveN(2, 500.milliseconds) vehicleMsgs.head match { - case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, 0)) => ; + case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, 0)) => ; case _ => assert(false) } vehicleMsgs(1) match { case VehicleServiceMessage( - "test-zone", - VehicleAction.SendResponse( - _, - TriggerEffectMessage(_, "apc_explosion_emp_vs", None, Some(TriggeredEffectLocation(Vector3.Zero, Vector3.Zero))) - ) - ) => ; + "test-zone", + _, + VehicleAction.SendResponse(_, + TriggerEffectMessage(_, "apc_explosion_emp_vs", None, Some(TriggeredEffectLocation(Vector3.Zero, Vector3.Zero))) + ) + ) => ; case _ => assert(false) } assert(apc.Capacitor == 0) diff --git a/src/test/scala/service/VehicleServiceTest.scala b/src/test/scala/service/VehicleServiceTest.scala index 691780b58..deeb05930 100644 --- a/src/test/scala/service/VehicleServiceTest.scala +++ b/src/test/scala/service/VehicleServiceTest.scala @@ -79,9 +79,9 @@ class OwnershipTest extends ActorTest { "pass Awareness" in { val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service") service ! Service.Join("test") - service ! VehicleServiceMessage("test", VehicleAction.Ownership(PlanetSideGUID(10), PlanetSideGUID(11))) + service ! VehicleServiceMessage("test", PlanetSideGUID(10), VehicleAction.Ownership(PlanetSideGUID(11))) expectMsg( - VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.Ownership(PlanetSideGUID(11))) + VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleAction.Ownership(PlanetSideGUID(11))) ) } } @@ -96,13 +96,14 @@ class ChildObjectStateTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.ChildObjectState(PlanetSideGUID(10), PlanetSideGUID(11), 1.2f, 3.4f) + PlanetSideGUID(10), + VehicleAction.ChildObjectState(PlanetSideGUID(11), 1.2f, 3.4f) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.ChildObjectState(PlanetSideGUID(11), 1.2f, 3.4f) + VehicleAction.ChildObjectState(PlanetSideGUID(11), 1.2f, 3.4f) ) ) } @@ -118,20 +119,14 @@ class DeployRequestTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.DeployRequest( - PlanetSideGUID(10), - PlanetSideGUID(11), - DriveState.Mobile, - 0, - false, - Vector3(1.2f, 3.4f, 5.6f) - ) + PlanetSideGUID(10), + VehicleAction.DeployRequest(PlanetSideGUID(11), DriveState.Mobile, 0, false, Vector3(1.2f, 3.4f, 5.6f)) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.DeployRequest(PlanetSideGUID(11), DriveState.Mobile, 0, false, Vector3(1.2f, 3.4f, 5.6f)) + VehicleAction.DeployRequest(PlanetSideGUID(11), DriveState.Mobile, 0, false, Vector3(1.2f, 3.4f, 5.6f)) ) ) } @@ -145,12 +140,12 @@ class DismountVehicleTest extends ActorTest { "pass DismountVehicle" in { val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service") service ! Service.Join("test") - service ! VehicleServiceMessage("test", VehicleAction.DismountVehicle(PlanetSideGUID(10), BailType.Normal, false)) + service ! VehicleServiceMessage("test", PlanetSideGUID(10), VehicleAction.DismountVehicle(BailType.Normal, false)) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.DismountVehicle(BailType.Normal, false) + VehicleAction.DismountVehicle(BailType.Normal, false) ) ) } @@ -169,13 +164,14 @@ class InventoryStateTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.InventoryState(PlanetSideGUID(10), tool, PlanetSideGUID(11), 0, cdata) + PlanetSideGUID(10), + VehicleAction.InventoryState(tool, PlanetSideGUID(11), 0, cdata) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.InventoryState(tool, PlanetSideGUID(11), 0, cdata) + VehicleAction.InventoryState(tool, PlanetSideGUID(11), 0, cdata) ) ) } @@ -194,13 +190,14 @@ class InventoryState2Test extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.InventoryState2(PlanetSideGUID(10), PlanetSideGUID(11), PlanetSideGUID(12), 13) + PlanetSideGUID(10), + VehicleAction.InventoryState2(PlanetSideGUID(11), PlanetSideGUID(12), 13) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.InventoryState2(PlanetSideGUID(11), PlanetSideGUID(12), 13) + VehicleAction.InventoryState2(PlanetSideGUID(11), PlanetSideGUID(12), 13) ) ) } @@ -216,13 +213,14 @@ class KickPassengerTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.KickPassenger(PlanetSideGUID(10), 0, false, PlanetSideGUID(11)) + PlanetSideGUID(10), + VehicleAction.KickPassenger(0, false, PlanetSideGUID(11)) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.KickPassenger(0, false, PlanetSideGUID(11)) + VehicleAction.KickPassenger(0, false, PlanetSideGUID(11)) ) ) } @@ -241,13 +239,14 @@ class LoadVehicleTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.LoadVehicle(PlanetSideGUID(10), vehicle, 12, PlanetSideGUID(11), cdata) + PlanetSideGUID(10), + VehicleAction.LoadVehicle(vehicle, 12, PlanetSideGUID(11), cdata) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.LoadVehicle(vehicle, 12, PlanetSideGUID(11), cdata) + VehicleAction.LoadVehicle(vehicle, 12, PlanetSideGUID(11), cdata) ) ) } @@ -261,9 +260,9 @@ class MountVehicleTest extends ActorTest { "pass MountVehicle" in { val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service") service ! Service.Join("test") - service ! VehicleServiceMessage("test", VehicleAction.MountVehicle(PlanetSideGUID(10), PlanetSideGUID(11), 0)) + service ! VehicleServiceMessage("test", VehicleAction.MountVehicle(PlanetSideGUID(11), 0)) expectMsg( - VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.MountVehicle(PlanetSideGUID(11), 0)) + VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleAction.MountVehicle(PlanetSideGUID(11), 0)) ) } } @@ -278,13 +277,13 @@ class SeatPermissionsTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.SeatPermissions(PlanetSideGUID(10), PlanetSideGUID(11), 0, 12L) + VehicleAction.SeatPermissions(PlanetSideGUID(11), 0, 12L) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.SeatPermissions(PlanetSideGUID(11), 0, 12L) + VehicleAction.SeatPermissions(PlanetSideGUID(11), 0, 12L) ) ) } @@ -305,13 +304,14 @@ class StowEquipmentTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.StowEquipment(PlanetSideGUID(10), PlanetSideGUID(11), 0, tool) + PlanetSideGUID(10), + VehicleAction.StowEquipment(PlanetSideGUID(11), 0, tool) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.StowEquipment(PlanetSideGUID(11), 0, toolDef.ObjectId, tool.GUID, cdata) + VehicleAction.StowEquipment(PlanetSideGUID(11), 0, toolDef.ObjectId, tool.GUID, cdata) ) ) } @@ -325,9 +325,9 @@ class UnstowEquipmentTest extends ActorTest { "pass UnstowEquipment" in { val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service") service ! Service.Join("test") - service ! VehicleServiceMessage("test", VehicleAction.UnstowEquipment(PlanetSideGUID(10), PlanetSideGUID(11))) + service ! VehicleServiceMessage("test", PlanetSideGUID(10), VehicleAction.UnstowEquipment(PlanetSideGUID(11))) expectMsg( - VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.UnstowEquipment(PlanetSideGUID(11))) + VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleAction.UnstowEquipment(PlanetSideGUID(11))) ) } } @@ -342,26 +342,13 @@ class VehicleStateTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.VehicleState( - PlanetSideGUID(10), - PlanetSideGUID(11), - 0, - Vector3(1.2f, 3.4f, 5.6f), - Vector3(7.8f, 9.1f, 2.3f), - Some(Vector3(4.5f, 6.7f, 8.9f)), - Option(1), - 2, - 3, - 4, - false, - true - ) + VehicleAction.VehicleState(PlanetSideGUID(11), 0, Vector3(1.2f, 3.4f, 5.6f), Vector3(7.8f, 9.1f, 2.3f), Some(Vector3(4.5f, 6.7f, 8.9f)), Option(1), 2, 3, 4, false, true) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.VehicleState( + VehicleAction.VehicleState( PlanetSideGUID(11), 0, Vector3(1.2f, 3.4f, 5.6f), @@ -391,19 +378,14 @@ class TransferPassengerChannelTest extends ActorTest { service ! Service.Join("test") service ! VehicleServiceMessage( "test", - VehicleAction.TransferPassengerChannel( - PlanetSideGUID(10), - "old_channel", - "new_channel", - fury, - PlanetSideGUID(11) - ) + PlanetSideGUID(10), + VehicleAction.TransferPassengerChannel("old_channel", "new_channel", fury, PlanetSideGUID(11)) ) expectMsg( VehicleServiceResponse( "/test/Vehicle", PlanetSideGUID(10), - VehicleResponse.TransferPassengerChannel("old_channel", "new_channel", fury, PlanetSideGUID(11)) + VehicleAction.TransferPassengerChannel("old_channel", "new_channel", fury, PlanetSideGUID(11)) ) ) } @@ -418,7 +400,7 @@ class TransferPassengerChannelTest extends ActorTest { // val service = system.actorOf(Props[VehicleService], "v-service") // service ! Service.Join("test") // service ! VehicleServiceMessage("test", VehicleAction.TransferPassenger(PlanetSideGUID(10), "temp_channel", fury, PlanetSideGUID(11))) -// expectMsg(VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.TransferPassenger("temp_channel", fury, PlanetSideGUID(11)))) +// expectMsg(VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleAction.TransferPassenger("temp_channel", fury, PlanetSideGUID(11)))) // } // } //}