working VehicleService based on GenericServiceEvent(WithSupport); manually corrected almost every message to VehicleService to ensure channel and filters are preserved

This commit is contained in:
Fate-JH 2026-02-01 09:46:15 -05:00
parent 5ece864bfd
commit 4838c991b3
70 changed files with 793 additions and 1406 deletions

View file

@ -77,4 +77,3 @@ ignore:
- "src/main/scala/net/psforever/services/hart/HartTimerActions.scala" - "src/main/scala/net/psforever/services/hart/HartTimerActions.scala"
- "src/main/scala/net/psforever/services/local/LocalAction.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/VehicleAction.scala"
- "src/main/scala/net/psforever/services/vehicle/VehicleResponse.scala"

View file

@ -82,11 +82,11 @@ class VehicleSpawnControl3Test extends ActorTest {
probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.ServerVehicleOverrideStart]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.ServerVehicleOverrideStart])
probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.ServerVehicleOverrideEnd]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.ServerVehicleOverrideEnd])
assert(probe.receiveOne(1 minute) match { assert(probe.receiveOne(1 minute) match {
case VehicleSpawnPad.PeriodicReminder(_, VehicleSpawnPad.Reminders.Blocked, _) => true case VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, _) => true
case _ => false case _ => false
}) })
assert(probe.receiveOne(1 minute) match { assert(probe.receiveOne(1 minute) match {
case VehicleSpawnPad.PeriodicReminder(_, VehicleSpawnPad.Reminders.Blocked, _) => true case VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, _) => true
case _ => false case _ => false
}) })
@ -139,7 +139,7 @@ class VehicleSpawnControl5Test extends ActorTest() {
probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.DetachFromRails]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.DetachFromRails])
probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer])
assert(probe.receiveOne(1 minute) match { assert(probe.receiveOne(1 minute) match {
case VehicleServiceMessage(_, VehicleAction.LoadVehicle(_, _, _, _, _)) => true case VehicleServiceMessage(_, _, VehicleAction.LoadVehicle(_, _, _, _, _)) => true
case _ => false case _ => false
}) })
assert(probe.receiveOne(1 minute) match { 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.DetachFromRails])
probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer])
assert(probe.receiveOne(1 minute) match { assert(probe.receiveOne(1 minute) match {
case VehicleServiceMessage(_, VehicleAction.LoadVehicle(_, _, _, _, _)) => true case VehicleServiceMessage(_, _, VehicleAction.LoadVehicle(_, _, _, _, _)) => true
case _ => false case _ => false
}) })
assert(probe.receiveOne(1 minute) match { 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.DetachFromRails])
probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer]) probe.expectMsgClass(1 minute, classOf[VehicleSpawnPad.RevealPlayer])
assert(probe.receiveOne(1 minute) match { assert(probe.receiveOne(1 minute) match {
case VehicleServiceMessage(_, VehicleAction.LoadVehicle(_, _, _, _, _)) => true case VehicleServiceMessage(_, _, VehicleAction.LoadVehicle(_, _, _, _, _)) => true
case _ => false case _ => false
}) })
assert(probe.receiveOne(1 minute) match { assert(probe.receiveOne(1 minute) match {

View file

@ -203,7 +203,7 @@ case object CustomerServiceRepresentativeMode extends PlayerMode {
data.sendResponse(PlanetsideAttributeMessage(guid, shieldsUi, maxShieldsOfVehicle)) data.sendResponse(PlanetsideAttributeMessage(guid, shieldsUi, maxShieldsOfVehicle))
data.continent.VehicleEvents ! VehicleServiceMessage( data.continent.VehicleEvents ! VehicleServiceMessage(
data.continent.id, 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.sendResponse(PlanetsideAttributeMessage(guid, 0, maxHealthOf))
data.continent.VehicleEvents ! VehicleServiceMessage( data.continent.VehicleEvents ! VehicleServiceMessage(
data.continent.id, data.continent.id,
VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), guid, 0, maxHealthOf) VehicleAction.PlanetsideAttribute(guid, 0, maxHealthOf)
) )
} }
} }

View file

@ -15,7 +15,6 @@ import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret}
import net.psforever.objects.vehicles.AccessPermissionGroup import net.psforever.objects.vehicles.AccessPermissionGroup
import net.psforever.objects.vital.InGameHistory 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.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.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.{BailType, ChatMessageType, DriveState, PlanetSideGUID, Vector3} 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 //DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
player.Name, 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 //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 //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 //having no in-game avatar target will throw us out of the map screen when deploying and cause softlock
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
player.Name, player.Name,
VehicleAction.SendResponse( VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)))
Service.defaultPlayerGUID,
PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay
)
) )
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
continent.id, 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 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, _) => case Mountable.CanDismount(obj: Vehicle, seat_num, _) =>
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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, _) => case Mountable.CanDismount(obj: PlanetSideGameObject with PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) =>

View file

@ -78,8 +78,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
// //
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
player.GUID,
VehicleAction.VehicleState( VehicleAction.VehicleState(
player.GUID,
vehicle_guid, vehicle_guid,
unk1, unk1,
position, 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 obj.DeploymentState = if (is_crouched || !notMountedState) DriveState.Kneeling else DriveState.Mobile
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.FrameVehicleState( player.GUID,
player.GUID, VehicleAction.FrameVehicleState(vehicle_guid, unk1, position, angle, velocity, unk2, unk3, unk4, is_crouched, is_airborne, ascending_flight, flight_time, unk9, unkA)
vehicle_guid,
unk1,
position,
angle,
velocity,
unk2,
unk3,
unk4,
is_crouched,
is_airborne,
ascending_flight,
flight_time,
unk9,
unkA
)
) )
sessionLogic.squad.updateSquad() sessionLogic.squad.updateSquad()
case (None, _) => case (None, _) =>
@ -236,7 +221,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
player.Orientation = angle player.Orientation = angle
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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 //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() obj.zoneInteractions()
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.VehicleState( player.GUID,
player.GUID, VehicleAction.VehicleState(vehicle_guid, unk1, pos, ang, obj.Velocity, obj.Flying, 0, 0, 15, unk5 = false, obj.Cloaked)
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)) sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, unk3=false, Vector3.Zero))
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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)
) )
} }
} }

View file

@ -16,7 +16,6 @@ import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret}
import net.psforever.objects.vehicles.AccessPermissionGroup import net.psforever.objects.vehicles.AccessPermissionGroup
import net.psforever.objects.vital.InGameHistory 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.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.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.{BailType, ChatMessageType, DriveState, PlanetSideGUID, Vector3} 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 //DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
player.Name, 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 //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 //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 //having no in-game avatar target will throw us out of the map screen when deploying and cause softlock
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
player.Name, player.Name,
VehicleAction.SendResponse( VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)))
Service.defaultPlayerGUID,
PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay
)
) )
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
continent.id, 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 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, _) => case Mountable.CanDismount(obj: Vehicle, seat_num, _) =>
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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, _) => case Mountable.CanDismount(obj: PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) =>

View file

@ -14,8 +14,9 @@ import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent 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.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.Service
import net.psforever.services.base.EventResponse
import net.psforever.services.local.support.CaptureFlagManager 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} import net.psforever.types.{BailType, ChatMessageType, PlanetSideGUID, Vector3}
object VehicleHandlerLogic { object VehicleHandlerLogic {
@ -38,7 +39,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
* @param guid na * @param guid na
* @param reply 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) { val resolvedPlayerGuid = if (player.HasGUID) {
player.GUID player.GUID
} else { } else {
@ -46,7 +47,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
} }
val isNotSameTarget = resolvedPlayerGuid != guid val isNotSameTarget = resolvedPlayerGuid != guid
reply match { reply match {
case VehicleResponse.VehicleState( case VehicleAction.VehicleState(
vehicleGuid, vehicleGuid,
unk1, unk1,
pos, pos,
@ -74,7 +75,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
} }
} }
case VehicleResponse.VehicleState( case VehicleAction.VehicleState(
vehicleGuid, vehicleGuid,
unk1, unk1,
pos, pos,
@ -90,23 +91,23 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
//player who is watching the vehicle from the outside //player who is watching the vehicle from the outside
sendResponse(VehicleStateMessage(vehicleGuid, unk1, pos, ang, vel, unk2, unk3, unk4, wheelDirection, unk5, unk6)) 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)) 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 => if isNotSameTarget =>
sendResponse(FrameVehicleStateMessage(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA)) 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)) sendResponse(ChangeFireStateMessage_Start(weaponGuid))
case VehicleResponse.ChangeFireState_Stop(weaponGuid) if isNotSameTarget => case VehicleAction.ChangeFireState_Stop(weaponGuid) if isNotSameTarget =>
sendResponse(ChangeFireStateMessage_Stop(weaponGuid)) sendResponse(ChangeFireStateMessage_Stop(weaponGuid))
case VehicleResponse.Reload(itemGuid) if isNotSameTarget => case VehicleAction.Reload(itemGuid) if isNotSameTarget =>
sendResponse(ReloadMessage(itemGuid, ammo_clip=1, unk1=0)) 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)) sendResponse(ObjectDetachMessage(weapon_guid, previous_guid, Vector3.Zero, 0))
//TODO? sendResponse(ObjectDeleteMessage(previousAmmoGuid, 0)) //TODO? sendResponse(ObjectDeleteMessage(previousAmmoGuid, 0))
sendResponse( sendResponse(
@ -119,7 +120,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
) )
sendResponse(ChangeAmmoMessage(weapon_guid, 1)) sendResponse(ChangeAmmoMessage(weapon_guid, 1))
case VehicleResponse.WeaponDryFire(weaponGuid) if isNotSameTarget => case VehicleAction.WeaponDryFire(weaponGuid) if isNotSameTarget =>
continent.GUID(weaponGuid).collect { continent.GUID(weaponGuid).collect {
case tool: Tool if tool.Magazine == 0 => case tool: Tool if tool.Magazine == 0 =>
// check that the magazine is still empty before sending WeaponDryFireMessage // 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)) sendResponse(WeaponDryFireMessage(weaponGuid))
} }
case VehicleResponse.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget => case VehicleAction.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget =>
sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver)) sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver))
case VehicleResponse.MountVehicle(vehicleGuid, seat) if isNotSameTarget => case VehicleAction.MountVehicle(vehicleGuid, seat) if isNotSameTarget =>
sendResponse(ObjectAttachMessage(vehicleGuid, guid, seat)) 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)) sendResponse(DeployRequestMessage(guid, objectGuid, state, unk1, unk2, pos))
case VehicleResponse.SendResponse(msg) => case VehicleAction.SendResponse(msg) =>
sendResponse(msg) sendResponse(msg)
case VehicleResponse.AttachToRails(vehicleGuid, padGuid) => case VehicleAction.EquipmentCreatedInSlot(pkt) if isNotSameTarget =>
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 =>
sendResponse(pkt) sendResponse(pkt)
case VehicleResponse.GenericObjectAction(objectGuid, action) if isNotSameTarget => case VehicleAction.GenericObjectAction(objectGuid, action) if isNotSameTarget =>
sendResponse(GenericObjectActionMessage(objectGuid, action)) sendResponse(GenericObjectActionMessage(objectGuid, action))
case VehicleResponse.HitHint(sourceGuid) if player.isAlive => case VehicleAction.HitHint(sourceGuid) if player.isAlive =>
sendResponse(HitHint(sourceGuid, player.GUID)) 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? //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?
val objGuid = obj.GUID val objGuid = obj.GUID
sendResponse(ObjectDeleteMessage(objGuid, unk1=0)) sendResponse(ObjectDeleteMessage(objGuid, unk1=0))
@ -176,7 +160,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
conData 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 //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 //but always seems to return 4 if user is kicked by mount permissions changing
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver)) 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!") log.info(s"${player.Name} has been kicked from $typeOfRide!")
player.WhichSide = OutsideOf 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 //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 //but always seems to return 4 if user is kicked by mount permissions changing
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver)) 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)) 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) //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)) sendResponse(ObjectCreateMessage(vtype, vguid, vdata))
Vehicles.ReloadAccessPermissions(vehicle, player.Name) Vehicles.ReloadAccessPermissions(vehicle, player.Name)
case VehicleResponse.ObjectDelete(itemGuid) if isNotSameTarget => case VehicleAction.ObjectDelete(itemGuid) if isNotSameTarget =>
sendResponse(ObjectDeleteMessage(itemGuid, unk1=0)) 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 //Only the player that owns this vehicle needs the ownership packet
avatarActor ! AvatarActor.SetVehicle(Some(vehicleGuid)) avatarActor ! AvatarActor.SetVehicle(Some(vehicleGuid))
sendResponse(PlanetsideAttributeMessage(resolvedPlayerGuid, attribute_type=21, vehicleGuid)) sendResponse(PlanetsideAttributeMessage(resolvedPlayerGuid, attribute_type=21, vehicleGuid))
case VehicleResponse.LoseOwnership(_, vehicleGuid) => case VehicleAction.LoseOwnership(_, vehicleGuid) =>
ops.announceAmsDecay(vehicleGuid,msg = "@ams_decaystarted") 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)) sendResponse(PlanetsideAttributeMessage(vehicleGuid, attributeType, attributeValue))
case VehicleResponse.ResetSpawnPad(padGuid) => case VehicleAction.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget =>
sendResponse(GenericObjectActionMessage(padGuid, code=23))
case VehicleResponse.RevealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=10))
case VehicleResponse.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget =>
sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission)) 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? //TODO prefer ObjectAttachMessage, but how to force ammo pools to update properly?
sendResponse(ObjectCreateDetailedMessage(itemType, itemGuid, ObjectCreateMessageParent(vehicleGuid, slot), itemData)) sendResponse(ObjectCreateDetailedMessage(itemType, itemGuid, ObjectCreateMessageParent(vehicleGuid, slot), itemData))
case VehicleResponse.UnloadVehicle(_, vehicleGuid) => case VehicleAction.UnloadVehicle(_, vehicleGuid) =>
sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1)) sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1))
if (sessionLogic.zoning.spawn.prevSpawnPoint.map(_.Owner).exists { if (sessionLogic.zoning.spawn.prevSpawnPoint.map(_.Owner).exists {
case ams: Vehicle => case ams: Vehicle =>
@ -243,22 +221,22 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
sendResponse(ChatMsg(ChatMessageType.UNK_229, "@ams_decayed")) 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? //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?
sendResponse(ObjectDeleteMessage(itemGuid, unk1=0)) 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.amsSpawnPoints = list.filter(tube => tube.Faction == player.Faction)
sessionLogic.zoning.spawn.DrawCurrentAmsSpawnPoint() 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.interstellarFerry = Some(vehicle)
sessionLogic.zoning.interstellarFerryTopLevelGUID = Some(vehicleToDelete) sessionLogic.zoning.interstellarFerryTopLevelGUID = Some(vehicleToDelete)
continent.VehicleEvents ! Service.Leave(Some(oldChannel)) //old vehicle-specific channel (was s"${vehicle.Actor}") continent.VehicleEvents ! Service.Leave(Some(oldChannel)) //old vehicle-specific channel (was s"${vehicle.Actor}")
galaxyService ! Service.Join(tempChannel) //temporary vehicle-specific channel galaxyService ! Service.Join(tempChannel) //temporary vehicle-specific channel
log.debug(s"TransferPassengerChannel: ${player.Name} now subscribed to $tempChannel for vehicle gating") 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 => if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive && speed > 0 =>
val strafe = 1 + Vehicles.CargoOrientation(vehicle) val strafe = 1 + Vehicles.CargoOrientation(vehicle)
val reverseSpeed = if (strafe > 1) { 0 } else { speed } val reverseSpeed = if (strafe > 1) { 0 } else { speed }
@ -281,75 +259,14 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
context.system.scheduler.scheduleOnce( context.system.scheduler.scheduleOnce(
delay milliseconds, delay milliseconds,
context.self, 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 => if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive =>
sessionLogic.vehicles.TotalDriverVehicleControl(cargo) sessionLogic.vehicles.TotalDriverVehicleControl(cargo)
case VehicleResponse.StartPlayerSeatedInVehicle(vehicle, _) case VehicleAction.ChangeLoadout(target, oldWeapons, addedWeapons, oldInventory, newInventory)
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)
if player.avatar.vehicle.contains(target) => if player.avatar.vehicle.contains(target) =>
//TODO when vehicle weapons can be changed without visual glitches, rewrite this //TODO when vehicle weapons can be changed without visual glitches, rewrite this
continent.GUID(target).collect { case vehicle: Vehicle => continent.GUID(target).collect { case vehicle: Vehicle =>
@ -373,7 +290,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory) changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory)
} }
case VehicleResponse.ChangeLoadout(target, oldWeapons, _, oldInventory, _) case VehicleAction.ChangeLoadout(target, oldWeapons, _, oldInventory, _)
if sessionLogic.general.accessedContainer.map(_.GUID).contains(target) => if sessionLogic.general.accessedContainer.map(_.GUID).contains(target) =>
//TODO when vehicle weapons can be changed without visual glitches, rewrite this //TODO when vehicle weapons can be changed without visual glitches, rewrite this
continent.GUID(target).collect { case vehicle: Vehicle => continent.GUID(target).collect { case vehicle: Vehicle =>
@ -382,12 +299,96 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory) 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 //TODO when vehicle weapons can be changed without visual glitches, rewrite this
continent.GUID(target).collect { case vehicle: Vehicle => continent.GUID(target).collect { case vehicle: Vehicle =>
changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory) 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 _ => () case _ => ()
} }
} }

View file

@ -77,8 +77,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
// //
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
player.GUID,
VehicleAction.VehicleState( VehicleAction.VehicleState(
player.GUID,
vehicle_guid, vehicle_guid,
unk1, unk1,
position, 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 obj.DeploymentState = if (is_crouched || !notMountedState) DriveState.Kneeling else DriveState.Mobile
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.FrameVehicleState( player.GUID,
player.GUID, VehicleAction.FrameVehicleState(vehicle_guid, unk1, position, angle, velocity, unk2, unk3, unk4, is_crouched, is_airborne, ascending_flight, flight_time, unk9, unkA)
vehicle_guid,
unk1,
position,
angle,
velocity,
unk2,
unk3,
unk4,
is_crouched,
is_airborne,
ascending_flight,
flight_time,
unk9,
unkA
)
) )
sessionLogic.squad.updateSquad() sessionLogic.squad.updateSquad()
case (None, _) => case (None, _) =>
@ -232,7 +217,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
player.Orientation = angle player.Orientation = angle
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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 //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() obj.zoneInteractions()
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.VehicleState( player.GUID,
player.GUID, VehicleAction.VehicleState(vehicle_guid, unk1, pos, ang, obj.Velocity, obj.Flying, 0, 0, 15, unk5 = false, obj.Cloaked)
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)) sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, unk3=false, Vector3.Zero))
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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" "; enforcing Mobile deployment state"
} else { } else {

View file

@ -12,7 +12,6 @@ import net.psforever.objects.serverobject.mount.Mountable
import net.psforever.objects.serverobject.terminals.implant.ImplantTerminalMech import net.psforever.objects.serverobject.terminals.implant.ImplantTerminalMech
import net.psforever.objects.vital.InGameHistory import net.psforever.objects.vital.InGameHistory
import net.psforever.packet.game.{DelayedPathMountMsg, DismountVehicleCargoMsg, DismountVehicleMsg, GenericObjectActionMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectDetachMessage, PlayerStasisMessage, PlayerStateShiftMessage, ShiftState} 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.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} 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 //DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
player.Name, 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 //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 //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 //having no in-game avatar target will throw us out of the map screen when deploying and cause softlock
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
player.Name, player.Name,
VehicleAction.SendResponse( VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)))
Service.defaultPlayerGUID,
PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay
)
) )
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
continent.id, 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) context.self ! SessionActor.SetMode(NormalMode)
sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive 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, _) => case Mountable.CanDismount(obj: Vehicle, seat_num, _) =>
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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, _) => case Mountable.CanDismount(obj: PlanetSideGameObject with PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) =>

View file

@ -7,8 +7,9 @@ import net.psforever.objects.{Tool, Vehicle, Vehicles}
import net.psforever.objects.equipment.Equipment import net.psforever.objects.equipment.Equipment
import net.psforever.objects.serverobject.pad.VehicleSpawnPad import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent 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.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.vehicle.{VehicleResponse, VehicleServiceResponse} import net.psforever.services.base.EventResponse
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse}
import net.psforever.types.{BailType, PlanetSideGUID, Vector3} import net.psforever.types.{BailType, PlanetSideGUID, Vector3}
object VehicleHandlerLogic { object VehicleHandlerLogic {
@ -31,7 +32,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
* @param guid na * @param guid na
* @param reply 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) { val resolvedPlayerGuid = if (player.HasGUID) {
player.GUID player.GUID
} else { } else {
@ -39,7 +40,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
} }
val isNotSameTarget = resolvedPlayerGuid != guid val isNotSameTarget = resolvedPlayerGuid != guid
reply match { reply match {
case VehicleResponse.VehicleState( case VehicleAction.VehicleState(
vehicleGuid, vehicleGuid,
unk1, unk1,
pos, pos,
@ -59,7 +60,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
player.Velocity = vel player.Velocity = vel
sessionLogic.updateLocalBlockMap(pos) sessionLogic.updateLocalBlockMap(pos)
case VehicleResponse.VehicleState( case VehicleAction.VehicleState(
vehicleGuid, vehicleGuid,
unk1, unk1,
pos, pos,
@ -75,23 +76,23 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
//player who is watching the vehicle from the outside //player who is watching the vehicle from the outside
sendResponse(VehicleStateMessage(vehicleGuid, unk1, pos, ang, vel, unk2, unk3, unk4, wheelDirection, unk5, unk6)) 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)) 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 => if isNotSameTarget =>
sendResponse(FrameVehicleStateMessage(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA)) 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)) sendResponse(ChangeFireStateMessage_Start(weaponGuid))
case VehicleResponse.ChangeFireState_Stop(weaponGuid) if isNotSameTarget => case VehicleAction.ChangeFireState_Stop(weaponGuid) if isNotSameTarget =>
sendResponse(ChangeFireStateMessage_Stop(weaponGuid)) sendResponse(ChangeFireStateMessage_Stop(weaponGuid))
case VehicleResponse.Reload(itemGuid) if isNotSameTarget => case VehicleAction.Reload(itemGuid) if isNotSameTarget =>
sendResponse(ReloadMessage(itemGuid, ammo_clip=1, unk1=0)) 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)) sendResponse(ObjectDetachMessage(weapon_guid, previous_guid, Vector3.Zero, 0))
//TODO? sendResponse(ObjectDeleteMessage(previousAmmoGuid, 0)) //TODO? sendResponse(ObjectDeleteMessage(previousAmmoGuid, 0))
sendResponse( sendResponse(
@ -104,7 +105,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
) )
sendResponse(ChangeAmmoMessage(weapon_guid, 1)) sendResponse(ChangeAmmoMessage(weapon_guid, 1))
case VehicleResponse.WeaponDryFire(weaponGuid) if isNotSameTarget => case VehicleAction.WeaponDryFire(weaponGuid) if isNotSameTarget =>
continent.GUID(weaponGuid).collect { continent.GUID(weaponGuid).collect {
case tool: Tool if tool.Magazine == 0 => case tool: Tool if tool.Magazine == 0 =>
// check that the magazine is still empty before sending WeaponDryFireMessage // 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)) sendResponse(WeaponDryFireMessage(weaponGuid))
} }
case VehicleResponse.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget => case VehicleAction.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget =>
sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver)) sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver))
case VehicleResponse.MountVehicle(vehicleGuid, seat) if isNotSameTarget => case VehicleAction.MountVehicle(vehicleGuid, seat) if isNotSameTarget =>
sendResponse(ObjectAttachMessage(vehicleGuid, guid, seat)) 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)) sendResponse(DeployRequestMessage(guid, objectGuid, state, unk1, unk2, pos))
case VehicleResponse.SendResponse(msg) => case VehicleAction.SendResponse(msg) =>
sendResponse(msg) sendResponse(msg)
case VehicleResponse.AttachToRails(vehicleGuid, padGuid) => case VehicleAction.EquipmentCreatedInSlot(pkt) if isNotSameTarget =>
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 =>
sendResponse(pkt) sendResponse(pkt)
case VehicleResponse.GenericObjectAction(objectGuid, action) if isNotSameTarget => case VehicleAction.GenericObjectAction(objectGuid, action) if isNotSameTarget =>
sendResponse(GenericObjectActionMessage(objectGuid, action)) 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? //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?
val objGuid = obj.GUID val objGuid = obj.GUID
sendResponse(ObjectDeleteMessage(objGuid, unk1=0)) sendResponse(ObjectDeleteMessage(objGuid, unk1=0))
@ -158,7 +142,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
conData 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 //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 //but always seems to return 4 if user is kicked by mount permissions changing
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver)) sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver))
@ -168,46 +152,40 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
case _ => () case _ => ()
} }
case VehicleResponse.KickPassenger(_, wasKickedByDriver, _) => case VehicleAction.KickPassenger(_, wasKickedByDriver, _) =>
//seat number (first field) seems to be correct if passenger is kicked manually by driver //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 //but always seems to return 4 if user is kicked by mount permissions changing
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver)) 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)) 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) //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)) sendResponse(ObjectCreateMessage(vtype, vguid, vdata))
Vehicles.ReloadAccessPermissions(vehicle, player.Name) Vehicles.ReloadAccessPermissions(vehicle, player.Name)
case VehicleResponse.ObjectDelete(itemGuid) if isNotSameTarget => case VehicleAction.ObjectDelete(itemGuid) if isNotSameTarget =>
sendResponse(ObjectDeleteMessage(itemGuid, unk1=0)) 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)) sendResponse(PlanetsideAttributeMessage(vehicleGuid, attributeType, attributeValue))
case VehicleResponse.ResetSpawnPad(padGuid) => case VehicleAction.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget =>
sendResponse(GenericObjectActionMessage(padGuid, code=23))
case VehicleResponse.RevealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=10))
case VehicleResponse.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget =>
sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission)) sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission))
case VehicleResponse.UnloadVehicle(_, vehicleGuid) => case VehicleAction.UnloadVehicle(_, vehicleGuid) =>
sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1)) 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? //TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?
sendResponse(ObjectDeleteMessage(itemGuid, unk1=0)) 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.amsSpawnPoints = list.filter(tube => tube.Faction == player.Faction)
sessionLogic.zoning.spawn.DrawCurrentAmsSpawnPoint() 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 => if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive && speed > 0 =>
val strafe = 1 + Vehicles.CargoOrientation(vehicle) val strafe = 1 + Vehicles.CargoOrientation(vehicle)
val reverseSpeed = if (strafe > 1) { 0 } else { speed } val reverseSpeed = if (strafe > 1) { 0 } else { speed }
@ -230,17 +208,40 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
context.system.scheduler.scheduleOnce( context.system.scheduler.scheduleOnce(
delay milliseconds, delay milliseconds,
context.self, 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 => if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive =>
sessionLogic.vehicles.TotalDriverVehicleControl(cargo) 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) 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 //TODO when vehicle weapons can be changed without visual glitches, rewrite this
continent.GUID(target).collect { case vehicle: Vehicle => continent.GUID(target).collect { case vehicle: Vehicle =>
changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory) changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory)

View file

@ -41,20 +41,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
obj.zoneInteractions() obj.zoneInteractions()
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.VehicleState( player.GUID,
player.GUID, VehicleAction.VehicleState(vehicle_guid, unk1, pos, ang, obj.Velocity, obj.Flying, 0, 0, 15, unk5 = false, obj.Cloaked)
vehicle_guid,
unk1,
pos,
ang,
obj.Velocity,
obj.Flying,
0,
0,
15,
unk5 = false,
obj.Cloaked
)
) )
case _ => () 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)) sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, unk3=false, Vector3.Zero))
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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" "; enforcing Mobile deployment state"
} else { } else {

View file

@ -1016,7 +1016,8 @@ class GeneralOperations(
obj.Seats(seatNum).unmount(tplayer) obj.Seats(seatNum).unmount(tplayer)
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.KickPassenger(tplayer.GUID, seatNum, unk2=false, obj.GUID) tplayer.GUID,
VehicleAction.KickPassenger(seatNum, unk2=false, obj.GUID)
) )
case _ => () case _ => ()
} }

View file

@ -569,7 +569,8 @@ class SessionData(
obj.Seats(seatNum).unmount(tplayer) obj.Seats(seatNum).unmount(tplayer)
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.KickPassenger(tplayer.GUID, seatNum, unk2=false, obj.GUID) tplayer.GUID,
VehicleAction.KickPassenger(seatNum, unk2=false, obj.GUID)
) )
case _ => () case _ => ()
} }

View file

@ -8,7 +8,6 @@ import net.psforever.objects.{PlanetSideGameObject, Tool, Vehicle}
import net.psforever.objects.vehicles.{CargoBehavior, MountableWeapons} import net.psforever.objects.vehicles.{CargoBehavior, MountableWeapons}
import net.psforever.objects.vital.InGameHistory import net.psforever.objects.vital.InGameHistory
import net.psforever.packet.game.{DismountVehicleCargoMsg, GenericObjectActionMessage, InventoryStateMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectAttachMessage, ObjectDetachMessage, PlanetsideAttributeMessage} 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.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.{BailType, PlanetSideGUID, Vector3} import net.psforever.types.{BailType, PlanetSideGUID, Vector3}
// //
@ -187,7 +186,8 @@ class SessionMountHandlers(
sendResponse(ObjectAttachMessage(objGuid, playerGuid, seatNum)) sendResponse(ObjectAttachMessage(objGuid, playerGuid, seatNum))
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.MountVehicle(playerGuid, objGuid, seatNum) playerGuid,
VehicleAction.MountVehicle(objGuid, seatNum)
) )
} }
@ -204,11 +204,11 @@ class SessionMountHandlers(
sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.SendResponse(Service.defaultPlayerGUID, PlanetsideAttributeMessage(obj.GUID, 81, 1)) VehicleAction.SendResponse(PlanetsideAttributeMessage(obj.GUID, 81, 1))
) )
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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 { else {
@ -225,20 +225,8 @@ class SessionMountHandlers(
v.Velocity = Vector3.Zero v.Velocity = Vector3.Zero
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.VehicleState( tplayer.GUID,
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)
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 _ => () case _ => ()
} }
@ -262,7 +250,8 @@ class SessionMountHandlers(
sendResponse(DismountVehicleMsg(playerGuid, bailType, wasKickedByDriver = false)) sendResponse(DismountVehicleMsg(playerGuid, bailType, wasKickedByDriver = false))
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.DismountVehicle(playerGuid, bailType, unk2 = false) playerGuid,
VehicleAction.DismountVehicle(bailType, unk2 = false)
) )
} }

View file

@ -5,13 +5,13 @@ import akka.actor.{ActorContext, ActorRef, typed}
import net.psforever.actors.session.AvatarActor import net.psforever.actors.session.AvatarActor
import net.psforever.objects.Vehicle import net.psforever.objects.Vehicle
import net.psforever.packet.game.ChatMsg 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} import net.psforever.types.{ChatMessageType, DriveState, PlanetSideGUID}
trait VehicleHandlerFunctions extends CommonSessionInterfacingFunctionality { trait VehicleHandlerFunctions extends CommonSessionInterfacingFunctionality {
def ops: SessionVehicleHandlers def ops: SessionVehicleHandlers
def handle(toChannel: String, guid: PlanetSideGUID, reply: VehicleResponse.Response): Unit def handle(toChannel: String, guid: PlanetSideGUID, reply: EventResponse): Unit
} }
class SessionVehicleHandlers( class SessionVehicleHandlers(

View file

@ -286,7 +286,8 @@ class WeaponAndProjectileOperations(
case _: Equipment => case _: Equipment =>
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.WeaponDryFire(player.GUID, weapon_guid) player.GUID,
VehicleAction.WeaponDryFire(weapon_guid)
) )
} }
.orElse { .orElse {
@ -1098,7 +1099,8 @@ class WeaponAndProjectileOperations(
} }
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.ChangeFireState_Start(player.GUID, itemGuid) player.GUID,
VehicleAction.ChangeFireState_Start(itemGuid)
) )
} }
@ -1138,7 +1140,8 @@ class WeaponAndProjectileOperations(
} }
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, 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 = { def reloadVehicleMessages(itemGuid: PlanetSideGUID): Unit = {
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.Reload(player.GUID, itemGuid) player.GUID,
VehicleAction.Reload(itemGuid)
) )
} }
@ -1478,13 +1482,8 @@ class WeaponAndProjectileOperations(
obj.Find(box).collect { index => obj.Find(box).collect { index =>
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
s"${obj.Actor}", s"${obj.Actor}",
VehicleAction.InventoryState( player.GUID,
player.GUID, VehicleAction.InventoryState(box, obj.GUID, index, box.Definition.Packet.DetailedConstructorData(box).get)
box,
obj.GUID,
index,
box.Definition.Packet.DetailedConstructorData(box).get
)
) )
} }
} }

View file

@ -549,7 +549,7 @@ class ZoningOperations(
} }
//spawn point update request //spawn point update request
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, player.Name,
VehicleAction.UpdateAmsSpawnPoint(continent) VehicleAction.UpdateAmsSpawnPoint(continent)
) )
spawn.upstreamMessageCount = 0 spawn.upstreamMessageCount = 0
@ -1353,7 +1353,8 @@ class ZoningOperations(
val topLevel = interstellarFerryTopLevelGUID.getOrElse(vehicle.GUID) val topLevel = interstellarFerryTopLevelGUID.getOrElse(vehicle.GUID)
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
s"${vehicle.Actor}", s"${vehicle.Actor}",
VehicleAction.TransferPassengerChannel(pguid, s"${vehicle.Actor}", toChannel, vehicle, topLevel) pguid,
VehicleAction.TransferPassengerChannel(s"${vehicle.Actor}", toChannel, vehicle, topLevel)
) )
manifest.cargo.foreach { manifest.cargo.foreach {
case ManifestPassengerEntry("MISSING_DRIVER", index) => case ManifestPassengerEntry("MISSING_DRIVER", index) =>
@ -1366,7 +1367,8 @@ class ZoningOperations(
val cargo = vehicle.CargoHolds(entry.mount).occupant.get val cargo = vehicle.CargoHolds(entry.mount).occupant.get
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
entry.name, 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 //do not delete if vehicle has passengers or cargo
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
continent.id, continent.id,
VehicleAction.UnloadVehicle(pguid, vehicle, topLevel) pguid,
VehicleAction.UnloadVehicle(vehicle, topLevel)
) )
None None
} else { } else {
@ -2595,7 +2598,8 @@ class ZoningOperations(
.foreach { _.MountedIn = vguid } .foreach { _.MountedIn = vguid }
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneid, zoneid,
VehicleAction.LoadVehicle(player.GUID, vehicle, vObjectId, vguid, data) player.GUID,
VehicleAction.LoadVehicle(vehicle, vObjectId, vguid, data)
) )
carrierInfo match { carrierInfo match {
case (Some(carrier), Some((index, _))) => case (Some(carrier), Some((index, _))) =>
@ -2622,7 +2626,8 @@ class ZoningOperations(
val zone = vehicle.PreviousGatingManifest().get.origin val zone = vehicle.PreviousGatingManifest().get.origin
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.UnloadVehicle(player.GUID, vehicle, vehicleToDelete) player.GUID,
VehicleAction.UnloadVehicle(vehicle, vehicleToDelete)
) )
log.debug( log.debug(
s"AvatarCreate: cleaning up ghost of transitioning vehicle ${vehicle.Definition.Name}@${vehicleToDelete.guid} in zone ${zone.id}" 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 vehicle.OwnerGuid = guid
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
s"${tplayer.Faction}", s"${tplayer.Faction}",
VehicleAction.Ownership(guid, vehicle.GUID) guid,
VehicleAction.Ownership(vehicle.GUID)
) )
case _ => case _ =>
avatarActor ! AvatarActor.SetVehicle(None) avatarActor ! AvatarActor.SetVehicle(None)

View file

@ -13,7 +13,6 @@ import net.psforever.objects.sourcing.{PlayerSource, SourceEntry, TurretSource}
import net.psforever.objects.vital.{DismountingActivity, InGameActivity, MountingActivity, ShieldCharge} import net.psforever.objects.vital.{DismountingActivity, InGameActivity, MountingActivity, ShieldCharge}
import net.psforever.packet.game.HackState1 import net.psforever.packet.game.HackState1
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.PlanetSideGUID
import scala.annotation.unused import scala.annotation.unused
@ -100,7 +99,7 @@ class FieldTurretControl(turret: TurretDeployable)
turret.Shields = turret.Shields + amount turret.Shields = turret.Shields + amount
turret.Zone.VehicleEvents ! VehicleServiceMessage( turret.Zone.VehicleEvents ! VehicleServiceMessage(
s"${turret.Actor}", s"${turret.Actor}",
VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), turret.GUID, turret.Definition.shieldUiAttribute, turret.Shields) VehicleAction.PlanetsideAttribute(turret.GUID, turret.Definition.shieldUiAttribute, turret.Shields)
) )
} }
} }

View file

@ -77,7 +77,7 @@ class SensorDeployableControl(sensor: SensorDeployable)
case obj: PlanetSideServerObject if !jammedSound => case obj: PlanetSideServerObject if !jammedSound =>
obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.VehicleEvents ! VehicleServiceMessage(
obj.Zone.id, obj.Zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 54, 1) VehicleAction.PlanetsideAttribute(obj.GUID, 54, 1)
) )
super.StartJammeredSound(obj, dur) super.StartJammeredSound(obj, dur)
case _ => ; case _ => ;
@ -101,7 +101,7 @@ class SensorDeployableControl(sensor: SensorDeployable)
val zone = obj.Zone val zone = obj.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 54, 0) VehicleAction.PlanetsideAttribute(obj.GUID, 54, 0)
) )
case _ => ; case _ => ;
} }

View file

@ -14,7 +14,6 @@ import net.psforever.objects.serverobject.repair.RepairableEntity
import net.psforever.objects.vital.interaction.DamageResult import net.psforever.objects.vital.interaction.DamageResult
import net.psforever.objects.vital.resolution.ResolutionCalculations import net.psforever.objects.vital.resolution.ResolutionCalculations
import net.psforever.types.PlanetSideGUID import net.psforever.types.PlanetSideGUID
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
class ShieldGeneratorDeployable(cdef: ShieldGeneratorDefinition) class ShieldGeneratorDeployable(cdef: ShieldGeneratorDefinition)
@ -22,12 +21,12 @@ class ShieldGeneratorDeployable(cdef: ShieldGeneratorDefinition)
with Hackable with Hackable
with JammableUnit with JammableUnit
class ShieldGeneratorDefinition extends DeployableDefinition(240) class ShieldGeneratorDefinition extends DeployableDefinition(objectId = 240)
with WithShields { with WithShields {
Packet = new ShieldGeneratorConverter Packet = new ShieldGeneratorConverter
DeployCategory = DeployableCategory.ShieldGenerators DeployCategory = DeployableCategory.ShieldGenerators
override def Initialize(obj: Deployable, context: ActorContext) = { override def Initialize(obj: Deployable, context: ActorContext): Unit = {
obj.Actor = obj.Actor =
context.actorOf(Props(classOf[ShieldGeneratorControl], obj), PlanetSideServerObject.UniqueActorName(obj)) context.actorOf(Props(classOf[ShieldGeneratorControl], obj), PlanetSideServerObject.UniqueActorName(obj))
} }
@ -39,10 +38,10 @@ class ShieldGeneratorControl(gen: ShieldGeneratorDeployable)
with JammableBehavior with JammableBehavior
with DamageableEntity with DamageableEntity
with RepairableEntity { with RepairableEntity {
def DeployableObject = gen def DeployableObject: ShieldGeneratorDeployable = gen
def JammableObject = gen def JammableObject: ShieldGeneratorDeployable = gen
def DamageableObject = gen def DamageableObject: ShieldGeneratorDeployable = gen
def RepairableObject = gen def RepairableObject: ShieldGeneratorDeployable = gen
deletionType = 1 //from DeployableBehavior deletionType = 1 //from DeployableBehavior
override def postStop(): Unit = { override def postStop(): Unit = {
@ -127,7 +126,7 @@ class ShieldGeneratorControl(gen: ShieldGeneratorDeployable)
case obj: PlanetSideServerObject with JammableUnit => case obj: PlanetSideServerObject with JammableUnit =>
obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.VehicleEvents ! VehicleServiceMessage(
obj.Zone.id, obj.Zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 1) VehicleAction.PlanetsideAttribute(obj.GUID, 27, 1)
) )
super.StartJammeredStatus(obj, dur) super.StartJammeredStatus(obj, dur)
case _ => ; case _ => ;
@ -140,7 +139,7 @@ class ShieldGeneratorControl(gen: ShieldGeneratorDeployable)
case obj: PlanetSideServerObject with JammableUnit if obj.Jammed => case obj: PlanetSideServerObject with JammableUnit if obj.Jammed =>
obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.VehicleEvents ! VehicleServiceMessage(
obj.Zone.id, obj.Zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 0) VehicleAction.PlanetsideAttribute(obj.GUID, 27, 0)
) )
case _ => ; case _ => ;
} }
@ -162,7 +161,7 @@ object ShieldGeneratorControl {
val zone = target.Zone val zone = target.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, target.GUID, 68, target.Shields) VehicleAction.PlanetsideAttribute(target.GUID, 68, target.Shields)
) )
} }
} }

View file

@ -111,7 +111,8 @@ abstract class TurretDeployableControl
player.VehicleSeated = None player.VehicleSeated = None
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.KickPassenger(player.GUID, 4, wasKickedByDriver, TurretObject.GUID) player.GUID,
VehicleAction.KickPassenger(4, wasKickedByDriver, TurretObject.GUID)
) )
} }
} }

View file

@ -47,7 +47,8 @@ object Vehicles {
Vehicles.ReloadAccessPermissions(vehicle, tplayer.Faction.toString) Vehicles.ReloadAccessPermissions(vehicle, tplayer.Faction.toString)
vehicle.Zone.VehicleEvents ! VehicleServiceMessage( vehicle.Zone.VehicleEvents ! VehicleServiceMessage(
vehicle.Zone.id, vehicle.Zone.id,
VehicleAction.Ownership(tplayer.GUID, vehicle.GUID) tplayer.GUID,
VehicleAction.Ownership(vehicle.GUID)
) )
Some(vehicle) Some(vehicle)
case None => case None =>
@ -138,13 +139,14 @@ object Vehicles {
val pguid = player.GUID val pguid = player.GUID
if (vehicle.OwnerGuid.contains(pguid)) { if (vehicle.OwnerGuid.contains(pguid)) {
vehicle.AssignOwnership(None) 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 vguid = vehicle.GUID
val empire = VehicleLockState.Empire.id val empire = VehicleLockState.Empire.id
(0 to 2).foreach(group => { (0 to 2).foreach(group => {
vehicle.PermissionGroup(group, empire) vehicle.PermissionGroup(group, empire)
/*vehicle.Zone.VehicleEvents ! VehicleServiceMessage( /*vehicle.Zone.VehicleEvents ! VehicleServiceMessage(
s"${vehicle.Faction}", s"${vehicle.Faction}",
pguid,
VehicleAction.SeatPermissions(pguid, vguid, group, empire) VehicleAction.SeatPermissions(pguid, vguid, group, empire)
)*/ )*/
}) })
@ -252,10 +254,7 @@ object Vehicles {
val previousOwnerName = target.OwnerName.getOrElse("") val previousOwnerName = target.OwnerName.getOrElse("")
vehicleEvents ! VehicleServiceMessage( vehicleEvents ! VehicleServiceMessage(
zoneid, zoneid,
VehicleAction.SendResponse( VehicleAction.SendResponse(HackMessage(HackState1.Unk2, tGuid, hGuid, 100, 0f, HackState.Hacked, HackState7.Unk8))
Service.defaultPlayerGUID,
HackMessage(HackState1.Unk2, tGuid, hGuid, 100, 0f, HackState.Hacked, HackState7.Unk8)
)
) )
target.Actor ! CommonMessages.Hack(hacker, target) target.Actor ! CommonMessages.Hack(hacker, target)
// Forcefully dismount any cargo // Forcefully dismount any cargo
@ -272,7 +271,8 @@ object Vehicles {
player.VehicleSeated = None player.VehicleSeated = None
vehicleEvents ! VehicleServiceMessage( vehicleEvents ! VehicleServiceMessage(
zoneid, 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 // In case BFR is occupied and may or may not be crouched
@ -345,15 +345,12 @@ object Vehicles {
util.Actor ! TelepadLike.Activate(util) util.Actor ! TelepadLike.Activate(util)
} }
case GlobalDefinitions.ams if target.DeploymentState == DriveState.Deployed => case GlobalDefinitions.ams if target.DeploymentState == DriveState.Deployed =>
vehicleEvents ! VehicleServiceMessage.AMSDeploymentChange(zone) vehicleEvents ! VehicleServiceMessage(zone.id, VehicleAction.AMSDeploymentChange(zone))
case _ => () case _ => ()
} }
vehicleEvents ! VehicleServiceMessage( vehicleEvents ! VehicleServiceMessage(
zoneid, zoneid,
VehicleAction.SendResponse( VehicleAction.SendResponse(HackMessage(HackState1.Unk2, tGuid, tGuid, 0, 1L, HackState.HackCleared, HackState7.Unk8))
Service.defaultPlayerGUID,
HackMessage(HackState1.Unk2, tGuid, tGuid, 0, 1L, HackState.HackCleared, HackState7.Unk8)
)
) )
target.Actor ! CommonMessages.ClearHack() target.Actor ! CommonMessages.ClearHack()
} }

View file

@ -10,7 +10,6 @@ import net.psforever.objects.vital.RepairFromArmorSiphon
import net.psforever.objects.vital.etc.{ArmorSiphonModifiers, ArmorSiphonReason} import net.psforever.objects.vital.etc.{ArmorSiphonModifiers, ArmorSiphonReason}
import net.psforever.objects.vital.interaction.DamageInteraction import net.psforever.objects.vital.interaction.DamageInteraction
import net.psforever.packet.game.QuantityUpdateMessage import net.psforever.packet.game.QuantityUpdateMessage
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.PlanetSideGUID import net.psforever.types.PlanetSideGUID
@ -80,7 +79,7 @@ object ArmorSiphonBehavior {
val zone = obj.Zone val zone = obj.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 0, after) VehicleAction.PlanetsideAttribute(obj.GUID, 0, after)
) )
} }
case _ => ; case _ => ;
@ -99,7 +98,7 @@ object ArmorSiphonBehavior {
//update current charge level //update current charge level
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
obj.Actor.toString, 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( siphonRecharge.put(guid, context.system.scheduler.scheduleWithFixedDelay(
initialDelay = 3000 milliseconds, initialDelay = 3000 milliseconds,
@ -121,7 +120,7 @@ object ArmorSiphonBehavior {
if (after > before) { if (after > before) {
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
obj.Actor.toString, 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) { if (after == siphon.MaxMagazine) {
endSiphonRecharge(guid) endSiphonRecharge(guid)

View file

@ -9,7 +9,6 @@ import net.psforever.objects.vital.interaction.DamageResult
import net.psforever.objects.vital.projectile.ProjectileReason import net.psforever.objects.vital.projectile.ProjectileReason
import net.psforever.objects.zones.{Zone, ZoneAware} import net.psforever.objects.zones.{Zone, ZoneAware}
import net.psforever.types.Vector3 import net.psforever.types.Vector3
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import scala.collection.mutable import scala.collection.mutable
@ -245,7 +244,7 @@ trait JammableMountedWeapons extends JammableBehavior {
case obj: PlanetSideServerObject with MountedWeapons with JammableUnit if !jammedSound => case obj: PlanetSideServerObject with MountedWeapons with JammableUnit if !jammedSound =>
obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.VehicleEvents ! VehicleServiceMessage(
obj.Zone.id, obj.Zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 1) VehicleAction.PlanetsideAttribute(obj.GUID, 27, 1)
) )
super.StartJammeredSound(target, dur) super.StartJammeredSound(target, dur)
case _ => ; case _ => ;
@ -266,7 +265,7 @@ trait JammableMountedWeapons extends JammableBehavior {
case obj: PlanetSideServerObject if jammedSound => case obj: PlanetSideServerObject if jammedSound =>
obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.VehicleEvents ! VehicleServiceMessage(
obj.Zone.id, obj.Zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 27, 0) VehicleAction.PlanetsideAttribute(obj.GUID, 27, 0)
) )
case _ => ; case _ => ;
} }
@ -310,7 +309,7 @@ object JammableMountedWeapons {
target.Jammed = statusCode == 1 target.Jammed = statusCode == 1
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, target.GUID, 27, statusCode) VehicleAction.PlanetsideAttribute(target.GUID, 27, statusCode)
) )
} }
} }

View file

@ -144,21 +144,21 @@ trait DamageableVehicle
if (damageToShields > 0) { if (damageToShields > 0) {
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
shieldChannel, shieldChannel,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, targetGUID, obj.Definition.shieldUiAttribute, obj.Shields) VehicleAction.PlanetsideAttribute(targetGUID, obj.Definition.shieldUiAttribute, obj.Shields)
) )
announceConfrontation = true announceConfrontation = true
} }
if (damageToHealth > 0) { if (damageToHealth > 0) {
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
healthChannel, healthChannel,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, targetGUID, 0, obj.Health) VehicleAction.PlanetsideAttribute(targetGUID, 0, obj.Health)
) )
announceConfrontation = true announceConfrontation = true
} }
} }
if (announceConfrontation) { if (announceConfrontation) {
if (showAsAggravated) { if (showAsAggravated) {
val msg = VehicleAction.SendResponse(Service.defaultPlayerGUID, DamageWithPositionMessage(totalDamage, Vector3.Zero)) val msg = VehicleAction.SendResponse(DamageWithPositionMessage(totalDamage, Vector3.Zero))
obj.Seats.values obj.Seats.values
.collect { case seat if seat.occupant.nonEmpty => seat.occupant.get.Name } .collect { case seat if seat.occupant.nonEmpty => seat.occupant.get.Name }
.foreach { channel => .foreach { channel =>
@ -219,7 +219,7 @@ trait DamageableVehicle
obj.Shields = 0 obj.Shields = 0
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, target.GUID, obj.Definition.shieldUiAttribute, 0) VehicleAction.PlanetsideAttribute(target.GUID, obj.Definition.shieldUiAttribute, 0)
) )
} }
//database entry //database entry
@ -252,13 +252,13 @@ trait DamageableVehicle
val guid = obj.GUID val guid = obj.GUID
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneid, zoneid,
VehicleAction.PlanetsideAttribute(guid0, guid, 0, 1) VehicleAction.PlanetsideAttribute(guid, 0, 1)
) )
if (obj.Shields > 0) { if (obj.Shields > 0) {
obj.Shields = 0 obj.Shields = 0
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, obj.Definition.shieldUiAttribute, 0) VehicleAction.PlanetsideAttribute(obj.GUID, obj.Definition.shieldUiAttribute, 0)
) )
} }
//aggravation cancel //aggravation cancel

View file

@ -9,10 +9,10 @@ import net.psforever.objects.vital.interaction.DamageResult
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
import net.psforever.packet.game.DamageWithPositionMessage import net.psforever.packet.game.DamageWithPositionMessage
import net.psforever.types.Vector3 import net.psforever.types.Vector3
import net.psforever.services.Service
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} 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.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. * The "control" `Actor` mixin for damage-handling code for `WeaponTurret` objects.
@ -64,14 +64,14 @@ trait DamageableWeaponTurret
DamageableMountable.DamageAwareness(DamageableObject, cause, damageToHealth) DamageableMountable.DamageAwareness(DamageableObject, cause, damageToHealth)
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneId, zoneId,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, targetGUID, 0, obj.Health) VehicleAction.PlanetsideAttribute(targetGUID, 0, obj.Health)
) )
announceConfrontation = true announceConfrontation = true
} }
} }
if (announceConfrontation) { if (announceConfrontation) {
if (aggravated) { if (aggravated) {
val msg = VehicleAction.SendResponse(Service.defaultPlayerGUID, DamageWithPositionMessage(damageToHealth, Vector3.Zero)) val msg = VehicleAction.SendResponse(DamageWithPositionMessage(damageToHealth, Vector3.Zero))
obj.Seats.values obj.Seats.values
.collect { case seat if seat.occupant.nonEmpty => seat.occupant.get.Name } .collect { case seat if seat.occupant.nonEmpty => seat.occupant.get.Name }
.foreach { channel => .foreach { channel =>
@ -112,7 +112,7 @@ object DamageableWeaponTurret {
* @see `TurretUpgrader.AddTask` * @see `TurretUpgrader.AddTask`
* @see `TurretUpgrader.ClearSpecific` * @see `TurretUpgrader.ClearSpecific`
* @see `WeaponTurret` * @see `WeaponTurret`
* @see `VehicleServiceMessage.TurretUpgrade` * @see `TurretMessage`
* @see `Zone.AvatarEvents` * @see `Zone.AvatarEvents`
* @see `Zone.VehicleEvents` * @see `Zone.VehicleEvents`
* @param target the entity being destroyed; * @param target the entity being destroyed;
@ -137,8 +137,8 @@ object DamageableWeaponTurret {
case turret: WeaponTurret => case turret: WeaponTurret =>
if (turret.Upgrade != TurretUpgrade.None) { if (turret.Upgrade != TurretUpgrade.None) {
val vehicleEvents = zone.VehicleEvents val vehicleEvents = zone.VehicleEvents
vehicleEvents ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.ClearSpecific(List(turret), zone)) vehicleEvents ! TurretMessage(SupportActor.ClearSpecific(List(turret), zone))
vehicleEvents ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.AddTask(turret, zone, TurretUpgrade.None)) vehicleEvents ! TurretMessage(TurretUpgrader.AddTask(turret, zone, TurretUpgrade.None))
} }
case _ => case _ =>
} }

View file

@ -106,7 +106,7 @@ trait DeploymentBehavior {
obj.Velocity = Some(Vector3.Zero) //no velocity obj.Velocity = Some(Vector3.Zero) //no velocity
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zoneChannel, zoneChannel,
VehicleAction.DeployRequest(GUID0, guid, state, 0, unk2=false, Vector3.Zero) VehicleAction.DeployRequest(guid, state, 0, unk2=false, Vector3.Zero)
) )
deploymentTimer.cancel() deploymentTimer.cancel()
deploymentTimer = context.system.scheduler.scheduleOnce(obj.DeployTime.milliseconds)({ deploymentTimer = context.system.scheduler.scheduleOnce(obj.DeployTime.milliseconds)({
@ -117,7 +117,7 @@ trait DeploymentBehavior {
obj.Velocity = Some(Vector3.Zero) //no velocity obj.Velocity = Some(Vector3.Zero) //no velocity
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zoneChannel, zoneChannel,
VehicleAction.DeployRequest(GUID0, guid, state, 0, unk2=false, Vector3.Zero) VehicleAction.DeployRequest(guid, state, 0, unk2=false, Vector3.Zero)
) )
state state
} else { } else {
@ -138,7 +138,7 @@ trait DeploymentBehavior {
if (state == DriveState.Undeploying) { if (state == DriveState.Undeploying) {
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zoneChannel, 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 import scala.concurrent.ExecutionContext.Implicits.global
deploymentTimer.cancel() deploymentTimer.cancel()
@ -149,7 +149,7 @@ trait DeploymentBehavior {
} else if (state == DriveState.Mobile) { } else if (state == DriveState.Mobile) {
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zoneChannel, zoneChannel,
VehicleAction.DeployRequest(GUID0, guid, state, 0, unk2=false, Vector3.Zero) VehicleAction.DeployRequest(guid, state, 0, unk2=false, Vector3.Zero)
) )
state state
} else { } else {

View file

@ -11,6 +11,7 @@ import net.psforever.objects.sourcing.AmenitySource
import net.psforever.objects.vital.TerminalUsedActivity import net.psforever.objects.vital.TerminalUsedActivity
import net.psforever.objects.zones.{Zone, ZoneAware, Zoning} import net.psforever.objects.zones.{Zone, ZoneAware, Zoning}
import net.psforever.objects.{Default, PlanetSideGameObject, Player, Vehicle} import net.psforever.objects.{Default, PlanetSideGameObject, Player, Vehicle}
import net.psforever.services.vehicle.VehicleServiceMessage
import net.psforever.types.{PlanetSideGUID, TransactionType, Vector3} import net.psforever.types.{PlanetSideGUID, TransactionType, Vector3}
import scala.annotation.tailrec import scala.annotation.tailrec
@ -128,7 +129,7 @@ class VehicleSpawnControl(pad: VehicleSpawnPad)
} }
trackedOrder = None trackedOrder = None
handleOrderFunc = NewTasking 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 self ! akka.actor.Kill //should cause the actor to restart, which will abort any trapped messages
case _ => () case _ => ()
@ -164,19 +165,17 @@ class VehicleSpawnControl(pad: VehicleSpawnPad)
//first queued order //first queued order
orders = List(order) orders = List(order)
queueManagementTask() queueManagementTask()
pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( pad.Zone.VehicleEvents ! VehicleServiceMessage(
name, name,
VehicleSpawnPad.Reminders.Queue, VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_PositionInQueue^2~^2~"))
Some(s"@SVCP_PositionInQueue^2~^2~")
) )
case -1 => case -1 =>
//new order //new order
orders = orders :+ order orders = orders :+ order
val size = orders.size + 1 val size = orders.size + 1
pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( pad.Zone.VehicleEvents ! VehicleServiceMessage(
name, name,
VehicleSpawnPad.Reminders.Queue, VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_PositionInQueue^$size~^$size~"))
Some(s"@SVCP_PositionInQueue^$size~^$size~")
) )
case n if orders(n).vehicle.Definition ne order.vehicle.Definition => case n if orders(n).vehicle.Definition ne order.vehicle.Definition =>
//replace existing order with new order //replace existing order with new order
@ -185,10 +184,9 @@ class VehicleSpawnControl(pad: VehicleSpawnPad)
val originalVehicle = originalOrder.vehicle.Definition.Name val originalVehicle = originalOrder.vehicle.Definition.Name
orders = (orders.take(n) :+ order) ++ orders.drop(n+1) orders = (orders.take(n) :+ order) ++ orders.drop(n+1)
VehicleSpawnControl.DisposeVehicle(originalOrder.vehicle, zone) VehicleSpawnControl.DisposeVehicle(originalOrder.vehicle, zone)
zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( zone.VehicleEvents ! VehicleServiceMessage(
name, name,
VehicleSpawnPad.Reminders.Queue, VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_ReplacedVehicleWithVehicle^@$originalVehicle~^@${order.vehicle.Definition.Name}~"))
Some(s"@SVCP_ReplacedVehicleWithVehicle^@$originalVehicle~^@${order.vehicle.Definition.Name}~")
) )
case _ => case _ =>
//order is the duplicate of an existing order; do nothing to the queue //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) val newOrder = VehicleSpawnControl.Order(driver, vehicle)
recursiveOrderReminder(orders.iterator, size) recursiveOrderReminder(orders.iterator, size)
trace(s"processing next order - a ${vehicle.Definition.Name} for $name") trace(s"processing next order - a ${vehicle.Definition.Name} for $name")
pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( pad.Zone.VehicleEvents ! VehicleServiceMessage(
name, name,
VehicleSpawnPad.Reminders.Queue, VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_PositionInQueue^1~^$size~"))
Some(s"@SVCP_PositionInQueue^1~^$size~")
) )
trackedOrder = Some(newOrder) //guard on trackedOrder = Some(newOrder) //guard on
context.system.scheduler.scheduleOnce(2000 milliseconds, concealPlayer, newOrder) 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 = { private def CancelOrder(vehicle: Vehicle, player: Player, msg: Option[String]): Unit = {
if (vehicle.Seats.values.count(_.isOccupied) == 0) { if (vehicle.Seats.values.count(_.isOccupied) == 0) {
VehicleSpawnControl.DisposeSpawnedVehicle(vehicle, player, pad.Zone) 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, entry: VehicleSpawnPad.VehicleOrder,
cause: Option[Any] cause: Option[Any]
): Unit = { ): Unit = {
pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( pad.Zone.VehicleEvents ! VehicleServiceMessage(
entry.player.Name, entry.player.Name,
VehicleSpawnPad.Reminders.Blocked, VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, cause)
cause
) )
} }
@ -465,10 +464,9 @@ class VehicleSpawnControl(pad: VehicleSpawnPad)
): Unit = { ): Unit = {
if (iter.hasNext) { if (iter.hasNext) {
val recipient = iter.next() val recipient = iter.next()
pad.Zone.VehicleEvents ! VehicleSpawnPad.PeriodicReminder( pad.Zone.VehicleEvents ! VehicleServiceMessage(
recipient.player.Name, recipient.player.Name,
VehicleSpawnPad.Reminders.Queue, VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Queue, Some(s"@SVCP_PositionInQueue^$position~^$size~"))
Some(s"@SVCP_PositionInQueue^$position~^$size~")
) )
recursiveOrderReminder(iter, size, position + 1) recursiveOrderReminder(iter, size, position + 1)
} }
@ -564,7 +562,7 @@ object VehicleSpawnControl {
*/ */
private def DisposeSpawnedVehicle(vehicle: Vehicle, player: Player, zone: Zone): Unit = { private def DisposeSpawnedVehicle(vehicle: Vehicle, player: Player, zone: Zone): Unit = {
DisposeVehicle(vehicle, zone) DisposeVehicle(vehicle, zone)
zone.VehicleEvents ! VehicleSpawnPad.RevealPlayer(player.GUID) zone.VehicleEvents ! VehicleServiceMessage(zone.id, VehicleSpawnPad.RevealPlayer(player.GUID))
} }
/** /**

View file

@ -5,6 +5,7 @@ import net.psforever.objects.serverobject.interior.Sidedness
import net.psforever.objects.{Player, Vehicle} import net.psforever.objects.{Player, Vehicle}
import net.psforever.objects.serverobject.structures.Amenity import net.psforever.objects.serverobject.structures.Amenity
import net.psforever.objects.serverobject.terminals.Terminal import net.psforever.objects.serverobject.terminals.Terminal
import net.psforever.services.base.SelfResponseMessage
import net.psforever.types.PlanetSideGUID import net.psforever.types.PlanetSideGUID
/** /**
@ -25,7 +26,6 @@ class VehicleSpawnPad(spDef: VehicleSpawnPadDefinition) extends Amenity {
} }
object VehicleSpawnPad { object VehicleSpawnPad {
/** /**
* Message to the spawn pad to enqueue the following vehicle order. * Message to the spawn pad to enqueue the following vehicle order.
* This is the entry point to vehicle spawn pad functionality. * This is the entry point to vehicle spawn pad functionality.
@ -39,14 +39,14 @@ object VehicleSpawnPad {
* @see `GenericObjectActionMessage` * @see `GenericObjectActionMessage`
* @param player_guid the player * @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`. * Message is intended to undo the effects of the above message, `ConcealPlayer`.
* @see `ConcealPlayer` * @see `ConcealPlayer`
* @param player_guid the player * @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"). * 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 vehicle the vehicle being spawned
* @param pad the spawn pad * @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"). * 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 vehicle the vehicle being spawned
* @param pad the spawn pad * @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. * Message that resets the spawn pad for its next order fulfillment operation by lowering the lifting platform.
* @see `GenericObjectActionMessage` * @see `GenericObjectActionMessage`
* @param pad the spawn pad * @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. * 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. * 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 vehicle the vehicle being spawned
* @param pad the spawn pad * @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. * 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. * 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 vehicle the vehicle being spawned
* @param pad the spawn pad * @param pad the spawn pad
*/ */
final case class PlayerSeatedInVehicle( //TODO while using fake rails (later edit: what does this mean?)
driver_name: String, final case class PlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage
vehicle: Vehicle,
pad: VehicleSpawnPad
) //TODO while using fake rails
/** /**
* Message that starts the newly-spawned vehicle to begin driving away from the spawn pad. * 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. * Information about the driving process is available on the vehicle itself.
* This information should only be communicated to the driver's client only. * This information should only be communicated to the driver's client only.
* @see `VehicleDefinition` * @see `VehicleDefinition`
* @param driver_name the person who will drive the vehicle
* @param vehicle the vehicle * @param vehicle the vehicle
* @param pad the spawn pad * @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. * Message that transitions the newly-spawned vehicle into a cancellable auto-drive state.
* Information about the driving process is available on the vehicle itself. * Information about the driving process is available on the vehicle itself.
* This information should only be communicated to the driver's client only. * This information should only be communicated to the driver's client only.
* @see `VehicleDefinition` * @see `VehicleDefinition`
* @param driver_name the person who will drive the vehicle
* @param vehicle the vehicle * @param vehicle the vehicle
* @param pad the spawn pad * @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. * 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 * @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. * 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 reason the nature of the message
* @param data optional information for rendering the message to the client * @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. * An `Enumeration` of reasons for sending a periodic reminder to the user.

View file

@ -3,6 +3,7 @@ package net.psforever.objects.serverobject.pad.process
import akka.actor.Props import akka.actor.Props
import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad}
import net.psforever.services.vehicle.VehicleServiceMessage
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._ import scala.concurrent.duration._
@ -28,7 +29,7 @@ class VehicleSpawnControlConcealPlayer(pad: VehicleSpawnPad) extends VehicleSpaw
case order @ VehicleSpawnControl.Order(driver, vehicle) => case order @ VehicleSpawnControl.Order(driver, vehicle) =>
if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty) { if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty) {
trace(s"hiding ${driver.Name}") 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) context.system.scheduler.scheduleOnce(2000 milliseconds, loadVehicle, order)
} else { } else {
trace(s"integral component lost; abort order fulfillment") trace(s"integral component lost; abort order fulfillment")

View file

@ -3,6 +3,7 @@ package net.psforever.objects.serverobject.pad.process
import akka.actor.Props import akka.actor.Props
import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad}
import net.psforever.services.vehicle.VehicleServiceMessage
/** /**
* An `Actor` that handles vehicle spawning orders for a `VehicleSpawnPad`. * 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) => case order @ VehicleSpawnControl.Order(driver, vehicle) =>
trace(s"returning control of ${vehicle.Definition.Name} to its current driver") trace(s"returning control of ${vehicle.Definition.Name} to its current driver")
if (vehicle.PassengerInSeat(driver).nonEmpty) { 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 finalClear ! order

View file

@ -4,7 +4,7 @@ package net.psforever.objects.serverobject.pad.process
import akka.actor.Cancellable import akka.actor.Cancellable
import net.psforever.objects.Default import net.psforever.objects.Default
import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} 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 net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
@ -37,13 +37,7 @@ class VehicleSpawnControlFinalClearance(pad: VehicleSpawnPad) extends VehicleSpa
val definition = vehicle.Definition val definition = vehicle.Definition
pad.Zone.VehicleEvents ! VehicleServiceMessage( pad.Zone.VehicleEvents ! VehicleServiceMessage(
s"${pad.Continent}", s"${pad.Continent}",
VehicleAction.LoadVehicle( VehicleAction.LoadVehicle(vehicle, definition.ObjectId, vehicle.GUID, definition.Packet.ConstructorData(vehicle).get)
PlanetSideGUID(0),
vehicle,
definition.ObjectId,
vehicle.GUID,
definition.Packet.ConstructorData(vehicle).get
)
) )
} }
context.parent ! VehicleSpawnControl.ProcessControl.Reminder context.parent ! VehicleSpawnControl.ProcessControl.Reminder
@ -70,7 +64,7 @@ class VehicleSpawnControlFinalClearance(pad: VehicleSpawnPad) extends VehicleSpa
} }
case VehicleSpawnControlFinalClearance.NextOrder => case VehicleSpawnControlFinalClearance.NextOrder =>
pad.Zone.VehicleEvents ! VehicleSpawnPad.ResetSpawnPad(pad) pad.Zone.VehicleEvents ! VehicleServiceMessage(pad.Zone.id, VehicleSpawnPad.ResetSpawnPad(pad))
context.parent ! VehicleSpawnControl.ProcessControl.GetNewOrder context.parent ! VehicleSpawnControl.ProcessControl.GetNewOrder
case _ => () case _ => ()

View file

@ -7,7 +7,6 @@ import akka.util.Timeout
import net.psforever.objects.GlobalDefinitions import net.psforever.objects.GlobalDefinitions
import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad}
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.Vector3 import net.psforever.types.Vector3
import net.psforever.zones.Zones import net.psforever.zones.Zones
@ -70,7 +69,7 @@ class VehicleSpawnControlLoadVehicle(pad: VehicleSpawnPad) extends VehicleSpawnC
val vdata = definition.Packet.ConstructorData(v).get val vdata = definition.Packet.ConstructorData(v).get
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.LoadVehicle(Service.defaultPlayerGUID, v, vtype, vguid, vdata) VehicleAction.LoadVehicle(v, vtype, vguid, vdata)
) )
railJack ! temp.get railJack ! temp.get
temp = None temp = None

View file

@ -11,6 +11,7 @@ import net.psforever.objects.vital.interaction.{DamageInteraction, DamageResult}
import net.psforever.objects.vital.prop.DamageProperties import net.psforever.objects.vital.prop.DamageProperties
import net.psforever.objects.vital.Vitality import net.psforever.objects.vital.Vitality
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
import net.psforever.services.vehicle.VehicleServiceMessage
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._ import scala.concurrent.duration._
@ -40,7 +41,7 @@ class VehicleSpawnControlRailJack(pad: VehicleSpawnPad) extends VehicleSpawnCont
pad.Definition.killBox(pad, vehicle.Definition.CanFly), pad.Definition.killBox(pad, vehicle.Definition.CanFly),
Zone.findAllTargets 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) context.system.scheduler.scheduleOnce(10 milliseconds, seatDriver, order)
case msg @ (VehicleSpawnControl.ProcessControl.Reminder | VehicleSpawnControl.ProcessControl.GetNewOrder) => case msg @ (VehicleSpawnControl.ProcessControl.Reminder | VehicleSpawnControl.ProcessControl.GetNewOrder) =>

View file

@ -4,6 +4,7 @@ package net.psforever.objects.serverobject.pad.process
import akka.actor.{ActorRef, Props} import akka.actor.{ActorRef, Props}
import net.psforever.objects.{Default, Vehicle} import net.psforever.objects.{Default, Vehicle}
import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad}
import net.psforever.services.vehicle.VehicleServiceMessage
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._ import scala.concurrent.duration._
@ -46,7 +47,7 @@ class VehicleSpawnControlSeatDriver(pad: VehicleSpawnPad) extends VehicleSpawnCo
vehicle.Actor ! Vehicle.Deconstruct(Some(pad.Definition.VehicleCreationDeconstructTime.seconds)) vehicle.Actor ! Vehicle.Deconstruct(Some(pad.Definition.VehicleCreationDeconstructTime.seconds))
if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty) { if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty) {
trace("driver to be made seated in vehicle") 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 { } else {
trace("driver lost; vehicle stranded on pad") trace("driver lost; vehicle stranded on pad")
} }
@ -58,7 +59,7 @@ class VehicleSpawnControlSeatDriver(pad: VehicleSpawnPad) extends VehicleSpawnCo
if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty && if (VehicleSpawnControl.validateOrderCredentials(pad, driver, vehicle).isEmpty &&
entry.vehicle.PassengerInSeat(entry.driver).contains(0)) { entry.vehicle.PassengerInSeat(entry.driver).contains(0)) {
trace(s"driver ${entry.driver.Name} has taken the wheel") 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 { } else {
trace("driver lost, but operations can continue") trace("driver lost, but operations can continue")
} }

View file

@ -3,6 +3,7 @@ package net.psforever.objects.serverobject.pad.process
import akka.actor.Props import akka.actor.Props
import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad} import net.psforever.objects.serverobject.pad.{VehicleSpawnControl, VehicleSpawnPad}
import net.psforever.services.vehicle.VehicleServiceMessage
import net.psforever.types.Vector3 import net.psforever.types.Vector3
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
@ -31,18 +32,18 @@ class VehicleSpawnControlServerVehicleOverride(pad: VehicleSpawnPad) extends Veh
val driverFailState = val driverFailState =
!driver.isAlive || driver.Continent != pad.Continent || !vehicle.PassengerInSeat(driver).contains(0) !driver.isAlive || driver.Continent != pad.Continent || !vehicle.PassengerInSeat(driver).contains(0)
vehicle.MountedIn = None 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 || driverFailState) {
if (vehicleFailState) { if (vehicleFailState) {
trace(s"vehicle was already destroyed") trace(s"vehicle was already destroyed")
} else { } else {
trace(s"driver is not ready") 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 driverControl ! order
} else { } else {
trace(s"telling ${driver.Name} that the server is assuming control of the ${vehicle.Definition.Name}") 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) context.system.scheduler.scheduleOnce(4000 milliseconds, driverControl, order)
} }

View file

@ -5,7 +5,6 @@ import net.psforever.objects.Tool
import net.psforever.objects.equipment.EquipmentSlot import net.psforever.objects.equipment.EquipmentSlot
import net.psforever.objects.serverobject.turret.WeaponTurret import net.psforever.objects.serverobject.turret.WeaponTurret
import net.psforever.objects.vehicles.MountedWeapons import net.psforever.objects.vehicles.MountedWeapons
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
/** /**
@ -48,7 +47,7 @@ object RepairableWeaponTurret {
case (index: Int, Some(tool: Tool)) => case (index: Int, Some(tool: Tool)) =>
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneId, zoneId,
VehicleAction.EquipmentInSlot(Service.defaultPlayerGUID, tguid, index, tool) VehicleAction.EquipmentInSlot(tguid, index, tool)
) )
} }
} }

View file

@ -233,7 +233,7 @@ class ResourceSiloControl(resourceSilo: ResourceSilo)
val zone = resourceSilo.Zone val zone = resourceSilo.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, resourceSilo.GUID, 49, 1) VehicleAction.PlanetsideAttribute(resourceSilo.GUID, 49, 1)
) )
math.min(resourceSilo.MaxNtuCapacitor - currentlyHas, trigger) math.min(resourceSilo.MaxNtuCapacitor - currentlyHas, trigger)
} else if (trigger < 0) { } else if (trigger < 0) {
@ -244,7 +244,7 @@ class ResourceSiloControl(resourceSilo: ResourceSilo)
val zone = resourceSilo.Zone val zone = resourceSilo.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, resourceSilo.GUID, 49, 0) VehicleAction.PlanetsideAttribute(resourceSilo.GUID, 49, 0)
) )
0 0
}) * 0.9f }) * 0.9f

View file

@ -26,7 +26,6 @@ import net.psforever.objects.serverobject.structures.{Building, PoweredAmenityCo
import net.psforever.objects.vital.{HealFromTerminal, RepairFromTerminal, Vitality} import net.psforever.objects.vital.{HealFromTerminal, RepairFromTerminal, Vitality}
import net.psforever.objects.zones.ZoneAware import net.psforever.objects.zones.ZoneAware
import net.psforever.packet.game.InventoryStateMessage import net.psforever.packet.game.InventoryStateMessage
import net.psforever.services.Service
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
@ -379,7 +378,7 @@ object ProximityTerminalControl {
val zone = target.Zone val zone = target.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, 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 => slots.foreach { slot =>
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
channel, 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))
) )
} }
} }

View file

@ -149,7 +149,7 @@ class ImplantTerminalMechControl(mech: ImplantTerminalMech)
case player => case player =>
seat.unmount(player) seat.unmount(player)
player.VehicleSeated = None 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) => case player if test(player.Faction) =>
seat.unmount(player) seat.unmount(player)
player.VehicleSeated = None 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))
} }
) )
} }

View file

@ -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.serverobject.turret.auto.{AffectedByAutomaticTurretFire, AutomatedTurret, AutomatedTurretBehavior}
import net.psforever.objects.vital.interaction.DamageResult import net.psforever.objects.vital.interaction.DamageResult
import net.psforever.packet.game.{ChangeFireModeMessage, HackState1} import net.psforever.packet.game.{ChangeFireModeMessage, HackState1}
import net.psforever.services.Service
import net.psforever.services.vehicle.support.TurretUpgrader import net.psforever.services.vehicle.support.TurretUpgrader
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.{BailType, PlanetSideEmpire, PlanetSideGUID} import net.psforever.types.{BailType, PlanetSideEmpire, PlanetSideGUID}
@ -179,7 +178,7 @@ class FacilityTurretControl(turret: FacilityTurret)
seat.unmount(player) seat.unmount(player)
player.VehicleSeated = None player.VehicleSeated = None
if (player.HasGUID) { 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 => () case None => ()
} }
@ -239,7 +238,7 @@ class FacilityTurretControl(turret: FacilityTurret)
weapon.FireModeIndex = 0 weapon.FireModeIndex = 0
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneid, 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 => case player =>
seat.unmount(player) seat.unmount(player)
player.VehicleSeated = None 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) captureTerminalChanges(terminal, super.captureTerminalIsHacked, actionDelays = 3000L)

View file

@ -7,8 +7,8 @@ import net.psforever.objects.{Player, Tool, TurretDeployable}
import net.psforever.packet.game.{HackMessage, HackState, HackState1, HackState7, InventoryStateMessage} import net.psforever.packet.game.{HackMessage, HackState, HackState1, HackState7, InventoryStateMessage}
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import net.psforever.services.local.{LocalAction, LocalServiceMessage} 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.support.TurretUpgrader
import net.psforever.services.vehicle.{TurretMessage, VehicleAction, VehicleServiceMessage}
import net.psforever.types.PlanetSideGUID import net.psforever.types.PlanetSideGUID
object WeaponTurrets { object WeaponTurrets {
@ -44,7 +44,7 @@ object WeaponTurrets {
* @see `TurretUpgrade` * @see `TurretUpgrade`
* @see `TurretUpgrader.AddTask` * @see `TurretUpgrader.AddTask`
* @see `TurretUpgrader.ClearSpecific` * @see `TurretUpgrader.ClearSpecific`
* @see `VehicleServiceMessage.TurretUpgrade` * @see `TurretMessage`
* @param target the facility turret being upgraded * @param target the facility turret being upgraded
* @param upgrade the upgrade being applied to the turret (usually, it's weapon system) * @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") log.info(s"Manned wall turret weapon being converted to $upgrade")
val zone = target.Zone val zone = target.Zone
val events = zone.VehicleEvents val events = zone.VehicleEvents
events ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.ClearSpecific(List(target), zone)) events ! TurretMessage(TurretUpgrader.ClearSpecific(List(target), zone))
events ! VehicleServiceMessage.TurretUpgrade(TurretUpgrader.AddTask(target, zone, upgrade)) events ! TurretMessage(TurretUpgrader.AddTask(target, zone, upgrade))
} }
/** /**
@ -106,7 +106,8 @@ object WeaponTurrets {
player.VehicleSeated = None player.VehicleSeated = None
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.KickPassenger(player.GUID, 4, unk2 = false, target.GUID) player.GUID,
VehicleAction.KickPassenger(4, unk2 = false, target.GUID)
) )
} }
} }

View file

@ -10,7 +10,6 @@ import net.psforever.objects.serverobject.structures.WarpGate
import net.psforever.objects.serverobject.transfer.{TransferBehavior, TransferContainer} import net.psforever.objects.serverobject.transfer.{TransferBehavior, TransferContainer}
import net.psforever.objects.{NtuContainer, _} import net.psforever.objects.{NtuContainer, _}
import net.psforever.types.DriveState import net.psforever.types.DriveState
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import akka.actor.typed.scaladsl.adapter._ import akka.actor.typed.scaladsl.adapter._
import net.psforever.objects.serverobject.transfer.TransferContainer.TransferMaterial import net.psforever.objects.serverobject.transfer.TransferContainer.TransferMaterial
@ -35,7 +34,7 @@ trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior {
val zone = obj.Zone val zone = obj.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 52, 1L) VehicleAction.PlanetsideAttribute(vehicle.GUID, 52, 1L)
) // panel glow on ) // panel glow on
} }
@ -45,7 +44,7 @@ trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior {
val zone = obj.Zone val zone = obj.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 49, 1L) VehicleAction.PlanetsideAttribute(vehicle.GUID, 49, 1L)
) // orb particle effect on ) // orb particle effect on
} }
@ -54,7 +53,7 @@ trait AntTransferBehavior extends TransferBehavior with NtuStorageBehavior {
val display = vehicle.NtuCapacitorScaled.toLong val display = vehicle.NtuCapacitorScaled.toLong
vehicle.Zone.VehicleEvents ! VehicleServiceMessage( vehicle.Zone.VehicleEvents ! VehicleServiceMessage(
vehicle.Actor.toString, 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) { if (transferEvent == TransferBehavior.Event.Charging) {
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneId, zoneId,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vguid, 52, 0L) VehicleAction.PlanetsideAttribute(vguid, 52, 0L)
) // panel glow off ) // panel glow off
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneId, zoneId,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vguid, 49, 0L) VehicleAction.PlanetsideAttribute(vguid, 49, 0L)
) // orb particle effect off ) // orb particle effect off
} else if (transferEvent == TransferBehavior.Event.Discharging) { } else if (transferEvent == TransferBehavior.Event.Discharging) {
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneId, zoneId,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vguid, 52, 0L) VehicleAction.PlanetsideAttribute(vguid, 52, 0L)
) // panel glow off ) // panel glow off
} }
} }

View file

@ -118,7 +118,7 @@ trait BfrTransferBehavior
case equip: NtuSiphon => case equip: NtuSiphon =>
vehicle.Zone.VehicleEvents ! VehicleServiceMessage( vehicle.Zone.VehicleEvents ! VehicleServiceMessage(
vehicle.Actor.toString, vehicle.Actor.toString,
VehicleAction.InventoryState2(PlanetSideGUID(0), equip.storageGUID, siphon.GUID, siphon.NtuCapacitor.toInt) VehicleAction.InventoryState2(equip.storageGUID, siphon.GUID, siphon.NtuCapacitor.toInt)
) )
case _ => ; case _ => ;
} }

View file

@ -207,11 +207,11 @@ object CarrierBehavior {
cargo.Velocity = None cargo.Velocity = None
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
s"${cargo.Actor}", s"${cargo.Actor}",
VehicleAction.SendResponse(PlanetSideGUID(0), PlanetsideAttributeMessage(cargoGUID, 0, cargo.Health)) VehicleAction.SendResponse(PlanetsideAttributeMessage(cargoGUID, 0, cargo.Health))
) )
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
s"${cargo.Actor}", 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) CargoMountBehaviorForAll(carrier, cargo, mountPoint)
zone.actor ! ZoneActor.RemoveFromBlockMap(cargo) zone.actor ! ZoneActor.RemoveFromBlockMap(cargo)
@ -225,9 +225,8 @@ object CarrierBehavior {
val cargoDriverGUID = cargo.Seats(0).occupant.get.GUID val cargoDriverGUID = cargo.Seats(0).occupant.get.GUID
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.SendResponse( cargoDriverGUID,
cargoDriverGUID, VehicleAction.SendResponse(CargoMountPointStatusMessage(
CargoMountPointStatusMessage(
carrierGUID, carrierGUID,
PlanetSideGUID(0), PlanetSideGUID(0),
PlanetSideGUID(0), PlanetSideGUID(0),
@ -235,8 +234,7 @@ object CarrierBehavior {
mountPoint, mountPoint,
CargoStatus.Empty, CargoStatus.Empty,
0 0
) ))
)
) )
false false
//sending packet to the cargo vehicle's client results in player being lock in own vehicle //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 val cargoDriverGUID = cargo.Seats(0).occupant.get.GUID
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.SendResponse( cargoDriverGUID,
cargoDriverGUID, VehicleAction.SendResponse(CargoMountPointStatusMessage(
CargoMountPointStatusMessage(
carrierGUID, carrierGUID,
PlanetSideGUID(0), PlanetSideGUID(0),
PlanetSideGUID(0), PlanetSideGUID(0),
@ -337,8 +334,7 @@ object CarrierBehavior {
mountPoint, mountPoint,
CargoStatus.Empty, CargoStatus.Empty,
0 0
) ))
)
) )
false false
//sending packet to the cargo vehicle's client results in player being lock in own vehicle //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 val cargoActor = cargo.Actor
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
s"$cargoActor", s"$cargoActor",
VehicleAction.SendResponse(GUID0, PlanetsideAttributeMessage(cargoGUID, 0, cargo.Health)) VehicleAction.SendResponse(PlanetsideAttributeMessage(cargoGUID, 0, cargo.Health))
) )
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
s"$cargoActor", 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) zone.actor ! ZoneActor.AddToBlockMap(cargo, carrier.Position)
if (carrier.isFlying) { if (carrier.isFlying) {
@ -467,9 +463,9 @@ object CarrierBehavior {
val detachCargoMsg = ObjectDetachMessage(carrierGUID, cargoGUID, cargoHoldPosition - Vector3.z(1), rotation) val detachCargoMsg = ObjectDetachMessage(carrierGUID, cargoGUID, cargoHoldPosition - Vector3.z(1), rotation)
val resetCargoMsg = val resetCargoMsg =
CargoMountPointStatusMessage(carrierGUID, GUID0, GUID0, cargoGUID, mountPoint, CargoStatus.Empty, 0) CargoMountPointStatusMessage(carrierGUID, GUID0, GUID0, cargoGUID, mountPoint, CargoStatus.Empty, 0)
events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, ejectCargoMsg)) events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(ejectCargoMsg))
events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, detachCargoMsg)) events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(detachCargoMsg))
events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, resetCargoMsg)) events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(resetCargoMsg))
log.debug(s"HandleVehicleCargoDismount: eject - $ejectCargoMsg, detach - $detachCargoMsg") log.debug(s"HandleVehicleCargoDismount: eject - $ejectCargoMsg, detach - $detachCargoMsg")
if (driverOpt.isEmpty) { if (driverOpt.isEmpty) {
//TODO cargo should drop like a rock like normal; until then, deconstruct it //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) CargoMountPointStatusMessage(carrierGUID, GUID0, cargoGUID, GUID0, mountPoint, CargoStatus.InProgress, 0)
val cargoDetachMessage = val cargoDetachMessage =
ObjectDetachMessage(carrierGUID, cargoGUID, cargoHoldPosition + Vector3.z(1f), rotation) ObjectDetachMessage(carrierGUID, cargoGUID, cargoHoldPosition + Vector3.z(1f), rotation)
events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, cargoStatusMessage)) events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(cargoStatusMessage))
events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(GUID0, cargoDetachMessage)) events ! VehicleServiceMessage(zoneId, VehicleAction.SendResponse(cargoDetachMessage))
driverOpt match { driverOpt match {
case Some(driver) => case Some(driver) =>
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
s"${driver.Name}", s"${driver.Name}",
VehicleAction.KickCargo(GUID0, cargo, cargo.Definition.AutoPilotSpeed2, 2500) VehicleAction.KickCargo(cargo, cargo.Definition.AutoPilotSpeed2, 2500)
) )
case None => case None =>
val resetCargoMsg = val resetCargoMsg =
CargoMountPointStatusMessage(carrierGUID, GUID0, GUID0, cargoGUID, mountPoint, CargoStatus.Empty, 0) 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 //TODO cargo should back out like normal; until then, deconstruct it
cargoActor ! Vehicle.Deconstruct() cargoActor ! Vehicle.Deconstruct()
} }
@ -609,8 +605,8 @@ object CarrierBehavior {
attachMessage: ObjectAttachMessage, attachMessage: ObjectAttachMessage,
mountPointStatusMessage: CargoMountPointStatusMessage mountPointStatusMessage: CargoMountPointStatusMessage
): Unit = { ): Unit = {
zone.VehicleEvents ! VehicleServiceMessage(zone.id, VehicleAction.SendResponse(exclude, attachMessage)) zone.VehicleEvents ! VehicleServiceMessage(zone.id, exclude, VehicleAction.SendResponse(attachMessage))
zone.VehicleEvents ! VehicleServiceMessage(zone.id, VehicleAction.SendResponse(exclude, mountPointStatusMessage)) zone.VehicleEvents ! VehicleServiceMessage(zone.id, exclude, VehicleAction.SendResponse(mountPointStatusMessage))
} }
/** /**
@ -632,11 +628,11 @@ object CarrierBehavior {
val msgs @ (attachMessage, mountPointStatusMessage) = CargoMountMessages(carrier, cargo, mountPoint) val msgs @ (attachMessage, mountPointStatusMessage) = CargoMountMessages(carrier, cargo, mountPoint)
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zoneId, zoneId,
VehicleAction.SendResponse(Service.defaultPlayerGUID, attachMessage) VehicleAction.SendResponse(attachMessage)
) )
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zoneId, zoneId,
VehicleAction.SendResponse(Service.defaultPlayerGUID, mountPointStatusMessage) VehicleAction.SendResponse(mountPointStatusMessage)
) )
msgs msgs
} }

View file

@ -2,7 +2,6 @@
package net.psforever.objects.vehicles.control package net.psforever.objects.vehicles.control
import net.psforever.objects._ import net.psforever.objects._
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.DriveState import net.psforever.types.DriveState
@ -29,8 +28,8 @@ class AmsControl(vehicle: Vehicle)
case None => "" case None => ""
} }
val events = zone.VehicleEvents val events = zone.VehicleEvents
events ! VehicleServiceMessage.AMSDeploymentChange(zone) events ! VehicleServiceMessage(zone.id, VehicleAction.AMSDeploymentChange(zone))
events ! VehicleServiceMessage(driverChannel, VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 81, 1)) events ! VehicleServiceMessage(driverChannel, VehicleAction.PlanetsideAttribute(vehicle.GUID, 81, 1))
case _ => ; case _ => ;
} }
} }
@ -49,8 +48,8 @@ class AmsControl(vehicle: Vehicle)
case None => "" case None => ""
} }
val events = zone.VehicleEvents val events = zone.VehicleEvents
events ! VehicleServiceMessage.AMSDeploymentChange(zone) events ! VehicleServiceMessage(zone.id, VehicleAction.AMSDeploymentChange(zone))
events ! VehicleServiceMessage(driverChannel, VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, vehicle.GUID, 81, 0)) events ! VehicleServiceMessage(driverChannel, VehicleAction.PlanetsideAttribute(vehicle.GUID, 81, 0))
case _ => ; case _ => ;
} }
} }

View file

@ -54,15 +54,12 @@ class ApcControl(vehicle: Vehicle)
//cause the emp //cause the emp
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.SendResponse( VehicleAction.SendResponse(TriggerEffectMessage(
GUID0,
TriggerEffectMessage(
GUID0, GUID0,
s"apc_explosion_emp_${faction.toString.toLowerCase}", s"apc_explosion_emp_${faction.toString.toLowerCase}",
None, None,
Some(TriggeredEffectLocation(pos, obj.Orientation)) Some(TriggeredEffectLocation(pos, obj.Orientation))
) ))
)
) )
//resolve what targets are affected by the emp //resolve what targets are affected by the emp
Zone.serverSideDamage( Zone.serverSideDamage(

View file

@ -271,7 +271,7 @@ class BfrControl(vehicle: Vehicle)
val zone = vehicle.Zone val zone = vehicle.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
s"${zone.id}", 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 val zone = vehicle.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
s"${zone.id}", 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 val shields = vehicle.Shields
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, 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 val zone = vehicle.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.GenericObjectAction(doNotSendTo, useThisGuid, action) doNotSendTo,
VehicleAction.GenericObjectAction(useThisGuid, action)
) )
case _ => () case _ => ()
} }
@ -565,15 +566,12 @@ class BfrControl(vehicle: Vehicle)
//TODO this is the apc emp effect; is there an ntu siphon emp effect? //TODO this is the apc emp effect; is there an ntu siphon emp effect?
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.SendResponse( VehicleAction.SendResponse(TriggerEffectMessage(
GUID0,
TriggerEffectMessage(
GUID0, GUID0,
s"apc_explosion_emp_${faction.toString.toLowerCase}", s"apc_explosion_emp_${faction.toString.toLowerCase}",
None, None,
Some(TriggeredEffectLocation(pos, obj.Orientation)) Some(TriggeredEffectLocation(pos, obj.Orientation))
) ))
)
) )
//resolve what targets are affected by the emp //resolve what targets are affected by the emp
Zone.serverSideDamage( 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 //it does not even dispatch the packet before that, making it rare if this precautionary message is seen
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
obj.Seats(0).occupant.get.Name, obj.Seats(0).occupant.get.Name,
VehicleAction.SendResponse( VehicleAction.SendResponse(ChatMsg(ChatMessageType.UNK_225, wideContents = false, "", s"@TimeUntilNextUse^${30000 - elapsedWait}", None))
GUID0,
ChatMsg(ChatMessageType.UNK_225, wideContents = false, "", s"@TimeUntilNextUse^${30000 - elapsedWait}", None)
)
) )
} }
case _ => () case _ => ()

View file

@ -3,7 +3,6 @@ package net.psforever.objects.vehicles.control
import akka.actor.{Actor, Cancellable} import akka.actor.{Actor, Cancellable}
import net.psforever.objects._ import net.psforever.objects._
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.ExecutionContext.Implicits.global
@ -61,7 +60,7 @@ trait VehicleCapacitance {
val obj = CapacitanceObject val obj = CapacitanceObject
obj.Zone.VehicleEvents ! VehicleServiceMessage( obj.Zone.VehicleEvents ! VehicleServiceMessage(
self.toString(), self.toString(),
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, obj.GUID, 113, obj.Capacitor) VehicleAction.PlanetsideAttribute(obj.GUID, 113, obj.Capacitor)
) )
} }

View file

@ -213,7 +213,7 @@ class VehicleControl(vehicle: Vehicle)
}) })
.flatMap { _.getMessage(vehicle) } .flatMap { _.getMessage(vehicle) }
.foreach { pkt => .foreach { pkt =>
events ! VehicleServiceMessage(toChannel, VehicleAction.SendResponse(guid0, pkt)) events ! VehicleServiceMessage(toChannel, VehicleAction.SendResponse(pkt))
} }
case FactionAffinity.ConvertFactionAffinity(faction) => case FactionAffinity.ConvertFactionAffinity(faction) =>
@ -332,7 +332,7 @@ class VehicleControl(vehicle: Vehicle)
val zone = vehicle.Zone val zone = vehicle.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.UnloadVehicle(Service.defaultPlayerGUID, vehicle, vehicle.GUID) VehicleAction.UnloadVehicle(vehicle, vehicle.GUID)
) )
zone.Transport.tell(Zone.Vehicle.Despawn(vehicle), zone.Transport) 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 //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) zone.actor ! ZoneActor.AddToBlockMap(player, vehicle.Position)
} }
if (player.HasGUID) { 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 val zone = ContainerObject.Zone
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
self.toString, self.toString,
VehicleAction.UnstowEquipment(Service.defaultPlayerGUID, item.GUID) VehicleAction.UnstowEquipment(item.GUID)
) )
} }
@ -550,22 +550,19 @@ class VehicleControl(vehicle: Vehicle)
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
//TODO when a new weapon, the equipment slot ui goes blank, but the weapon functions; remount vehicle to correct it //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, if (obj.VisibleSlots.contains(slot)) zone.id else channel,
VehicleAction.SendResponse( VehicleAction.SendResponse(OCM.detailed(item, ObjectCreateMessageParent(oguid, slot)))
Service.defaultPlayerGUID,
OCM.detailed(item, ObjectCreateMessageParent(oguid, slot))
)
) )
item match { item match {
case box: AmmoBox => case box: AmmoBox =>
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
channel, channel,
VehicleAction.InventoryState2(Service.defaultPlayerGUID, iguid, oguid, box.Capacity) VehicleAction.InventoryState2(iguid, oguid, box.Capacity)
) )
case weapon: Tool => case weapon: Tool =>
weapon.AmmoSlots.map { slot => slot.Box }.foreach { box => weapon.AmmoSlots.map { slot => slot.Box }.foreach { box =>
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
channel, channel,
VehicleAction.InventoryState2(Service.defaultPlayerGUID, box.GUID, iguid, box.Capacity) VehicleAction.InventoryState2(box.GUID, iguid, box.Capacity)
) )
} }
case _ => () case _ => ()
@ -641,7 +638,7 @@ class VehicleControl(vehicle: Vehicle)
vehicle.Shields = vehicle.Shields + amount vehicle.Shields = vehicle.Shields + amount
vehicle.Zone.VehicleEvents ! VehicleServiceMessage( vehicle.Zone.VehicleEvents ! VehicleServiceMessage(
s"${vehicle.Actor}", 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") log.info(s"$dname changed ${vehicle.Definition.Name}'s access permission $group to $allow")
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, 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 //kick players who should not be seated in the vehicle due to permission changes
if (allow == VehicleLockState.Locked) { //TODO only important permission atm if (allow == VehicleLockState.Locked) { //TODO only important permission atm
@ -709,7 +707,8 @@ class VehicleControl(vehicle: Vehicle)
tplayer.VehicleSeated = None tplayer.VehicleSeated = None
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.KickPassenger(tplayer.GUID, 4, unk2 = false, vguid) tplayer.GUID,
VehicleAction.KickPassenger(4, unk2 = false, vguid)
) )
} }
case _ => () // No player seated case _ => () // No player seated
@ -761,7 +760,7 @@ class VehicleControl(vehicle: Vehicle)
messages.foreach { pkt => messages.foreach { pkt =>
events ! VehicleServiceMessage( events ! VehicleServiceMessage(
zoneid, zoneid,
VehicleAction.SendResponse(guid0, pkt) VehicleAction.SendResponse(pkt)
) )
} }
} }

View file

@ -700,10 +700,7 @@ object MapEnvironment {
case v: Vehicle => case v: Vehicle =>
v.Zone.VehicleEvents ! VehicleServiceMessage( v.Zone.VehicleEvents ! VehicleServiceMessage(
v.Actor.toString(), v.Actor.toString(),
VehicleAction.SendResponse( VehicleAction.SendResponse(OffshoreVehicleMessage(v.Seats(0).occupant.get.GUID, v.GUID, msg))
Service.defaultPlayerGUID,
OffshoreVehicleMessage(v.Seats(0).occupant.get.GUID, v.GUID, msg)
)
) )
case _ => ; case _ => ;
} }

View file

@ -9,7 +9,6 @@ import net.psforever.objects.serverobject.structures.WarpGate
import net.psforever.objects.vital.InGameHistory import net.psforever.objects.vital.InGameHistory
import net.psforever.objects.{Default, GlobalDefinitions, Vehicle} import net.psforever.objects.{Default, GlobalDefinitions, Vehicle}
import net.psforever.packet.game.ChatMsg import net.psforever.packet.game.ChatMsg
import net.psforever.services.Service
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage} import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.{ChatMessageType, DriveState, PlanetSideEmpire, Vector3} import net.psforever.types.{ChatMessageType, DriveState, PlanetSideEmpire, Vector3}
@ -206,7 +205,7 @@ object ZoneVehicleActor {
msgOpt.foreach { msg => msgOpt.foreach { msg =>
zone.VehicleEvents ! VehicleServiceMessage( zone.VehicleEvents ! VehicleServiceMessage(
vehicle.Seats.headOption.flatMap(_._2.occupant).map(_.Name).getOrElse(""), 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 msgOpt.isDefined

View file

@ -27,7 +27,7 @@ class AvatarService(zone: Zone)
busName = "Avatar", busName = "Avatar",
eventSupportServices = List(CorpseRemovalSupport, ItemRemoverSupport) 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()) AvatarServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response())
} }
} }

View file

@ -22,18 +22,18 @@ abstract class GenericEventService[OUT <: GenericResponseEnvelope](busName: Stri
extends Actor { extends Actor {
protected lazy val log: Logger = org.log4s.getLogger(getClass.getSimpleName) 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 BusName: String = busName
def commonJoinBehavior: Receive = { private def commonJoinBehavior: Receive = {
case Service.Join(channel) => case Service.Join(channel) =>
val path = formatChannelOnBusName(channel) val path = formatChannelOnBusName(channel)
val who = sender() val who = sender()
eventBus.subscribe(who, path) eventBus.subscribe(who, path)
} }
def commonLeaveBehavior: Receive = { private def commonLeaveBehavior: Receive = {
case Service.Leave(None) => case Service.Leave(None) =>
eventBus.unsubscribe(sender()) eventBus.unsubscribe(sender())
@ -54,25 +54,11 @@ abstract class GenericEventService[OUT <: GenericResponseEnvelope](busName: Stri
log.warn(s"Unhandled message $msg from ${sender()}") log.warn(s"Unhandled message $msg from ${sender()}")
} }
private def handleMessage(msg: GenericMessageEnvelope): Unit = { protected def handleMessage(msg: GenericMessageEnvelope): Unit = {
eventBus.publish(compose(msg)) eventBus.publish(composeResponseEnvelope(msg))
} }
protected def setupEventBus(): GenericEventBus[OUT] = { protected def composeResponseEnvelope(@unused msg: GenericMessageEnvelope): OUT
new GenericEventBus[OUT]
}
protected def compose(@unused msg: GenericMessageEnvelope): OUT protected def formatChannelOnBusName(channel: String): String = s"/$channel/$busName"
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"
}
}
} }

View file

@ -3,7 +3,6 @@ package net.psforever.services.base
import akka.actor.{ActorContext, ActorRef} import akka.actor.{ActorContext, ActorRef}
import net.psforever.services.Service import net.psforever.services.Service
import net.psforever.services.base.bus.{GenericEventBus, GenericEventBusResponseToSupport, GenericEventBusWithSupport}
import net.psforever.types.PlanetSideGUID import net.psforever.types.PlanetSideGUID
import scala.annotation.unused import scala.annotation.unused
@ -49,20 +48,15 @@ abstract class GenericEventServiceWithSupport[OUT <: GenericResponseEnvelope]
} }
} }
override protected def setupEventBus(): GenericEventBus[OUT] = { override protected def handleMessage(event: GenericMessageEnvelope): Unit = {
new GenericEventBus[OUT] with GenericEventBusWithSupport[OUT] { event match {
override def publish(event: OUT): Unit = publishingWithSupport(event) case msg: GenericMessageToSupportEnvelopeOnly =>
override def forwardToExternalSupport(msg: GenericEventBusResponseToSupport): Unit = {
msg match {
case supportMessage: GenericMessageToSupportEnvelope => forwardToExternal(supportMessage)
case _ => ()
}
}
private def forwardToExternal(msg: GenericMessageToSupportEnvelope): Unit = {
forwardToSupport(msg) forwardToSupport(msg)
} case msg: GenericMessageToSupportEnvelope =>
forwardToSupport(msg)
eventBus.publish(composeResponseEnvelope(event))
case _ =>
eventBus.publish(composeResponseEnvelope(event))
} }
} }
} }

View file

@ -31,6 +31,10 @@ class GenericEventBus[A <: GenericEventBusResponse]
subscriber ! event subscriber ! event
} }
override def publish(event: Event): Unit = {
truePublish(event)
}
def truePublish(event: Event): Unit = { def truePublish(event: Event): Unit = {
super[SubchannelClassification].publish(event) super[SubchannelClassification].publish(event)
} }

View file

@ -16,7 +16,7 @@ trait GenericEventBusResponseToSupportOnly
trait GenericEventBusWithSupport[T <: GenericEventBusResponse] { trait GenericEventBusWithSupport[T <: GenericEventBusResponse] {
bus: GenericEventBus[T] => bus: GenericEventBus[T] =>
def publishingWithSupport(event: T): Unit = { def handleMessageWithSupport(event: T): Unit = {
event match { event match {
case msg: GenericEventBusResponseToSupportOnly => case msg: GenericEventBusResponseToSupportOnly =>
forwardToExternalSupport(msg) forwardToExternalSupport(msg)

View file

@ -5,7 +5,15 @@ import net.psforever.services.base.{GenericEventService, GenericMessageEnvelope}
class GalaxyService class GalaxyService
extends GenericEventService[GalaxyServiceResponse](busName = "Galaxy") { extends GenericEventService[GalaxyServiceResponse](busName = "Galaxy") {
protected def compose(msg: GenericMessageEnvelope): GalaxyServiceResponse = { protected def composeResponseEnvelope(msg: GenericMessageEnvelope): GalaxyServiceResponse = {
GalaxyServiceResponse(formatChannelOnBusName(msg.channel), msg.msg.response()) GalaxyServiceResponse(formatChannelOnBusName(msg.channel), msg.msg.response())
} }
override protected def formatChannelOnBusName(channel: String): String = {
if (channel.trim.isEmpty) {
s"/$BusName"
} else {
s"/$channel/$BusName"
}
}
} }

View file

@ -44,7 +44,7 @@ class LocalService(zone: Zone)
busName = "Local", busName = "Local",
eventSupportServices = List(DoorCloserSupport, HackClearSupport, HackCaptureSupport, CaptureFlagSupport(zone)) 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()) LocalServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response())
} }
} }

View file

@ -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])
}
}

View file

@ -1,443 +1,25 @@
// Copyright (c) 2017 PSForever // Copyright (c) 2017 PSForever
package net.psforever.services.vehicle package net.psforever.services.vehicle
import akka.actor.{Actor, ActorRef, Props} import akka.actor.{ActorContext, ActorRef, Props}
import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
import net.psforever.packet.game.ObjectCreateMessage import net.psforever.services.base.{EventServiceSupport, GenericEventServiceWithSupport, GenericMessageEnvelope}
import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent
import net.psforever.services.vehicle.support.TurretUpgrader 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 { case object TurretUpgradeSupport
private val turretUpgrade: ActorRef = context.actorOf(Props[TurretUpgrader](), s"${zone.id}-turret-upgrade-agent") extends EventServiceSupport {
private[this] val log = org.log4s.getLogger def label: String = "turretUpgrader"
def constructor(context: ActorContext): ActorRef = {
val VehicleEvents = new GenericEventBus[VehicleServiceResponse] context.actorOf(Props[TurretUpgrader](), name = "TurretUpgrader")
}
def receive: Receive = { }
case Service.Join(channel) =>
val path = s"/$channel/Vehicle" class VehicleService(zone: Zone)
VehicleEvents.subscribe(sender(), path) extends GenericEventServiceWithSupport[VehicleServiceResponse](
busName = "Vehicle",
case Service.Leave(None) => eventSupportServices = List(TurretUpgradeSupport)
VehicleEvents.unsubscribe(sender()) ) {
protected def composeResponseEnvelope(msg: GenericMessageEnvelope): VehicleServiceResponse = {
case Service.Leave(Some(channel)) => VehicleServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response())
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])
} }
} }

View file

@ -1,157 +1,19 @@
// Copyright (c) 2017 PSForever // Copyright (c) 2017 PSForever
package net.psforever.services.vehicle package net.psforever.services.vehicle
import net.psforever.objects.{PlanetSideGameObject, Vehicle} import net.psforever.services.Service
import net.psforever.objects.equipment.Equipment import net.psforever.services.base.{EventMessage, GenericMessageEnvelope, GenericMessageToSupportEnvelopeOnly}
import net.psforever.objects.inventory.InventoryItem import net.psforever.types.PlanetSideGUID
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}
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 { object VehicleServiceMessage {
final case class GiveActorControl(vehicle: Vehicle, actorName: String) def apply(channel: String, actionMessage: EventMessage): VehicleServiceMessage =
final case class RevokeActorControl(vehicle: Vehicle) VehicleServiceMessage(channel, Service.defaultPlayerGUID, actionMessage)
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
} }

View file

@ -1,141 +1,11 @@
// Copyright (c) 2017 PSForever // Copyright (c) 2017 PSForever
package net.psforever.services.vehicle package net.psforever.services.vehicle
import net.psforever.objects.equipment.Equipment import net.psforever.types.PlanetSideGUID
import net.psforever.objects.inventory.InventoryItem import net.psforever.services.base.{EventResponse, GenericResponseEnvelope}
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
final case class VehicleServiceResponse( final case class VehicleServiceResponse(
channel: String, channel: String,
filter: PlanetSideGUID, filter: PlanetSideGUID,
reply: VehicleResponse.Response reply: EventResponse
) extends GenericEventBusResponse ) extends GenericResponseEnvelope
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
}

View file

@ -161,7 +161,8 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] {
if (tplayer.HasGUID) { if (tplayer.HasGUID) {
context.parent ! VehicleServiceMessage( context.parent ! VehicleServiceMessage(
zoneId, 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)) => case (index, Some(tool: Tool)) =>
context.parent ! VehicleServiceMessage( context.parent ! VehicleServiceMessage(
zone.id, zone.id,
VehicleAction.EquipmentInSlot(PlanetSideGUID(0), targetGUID, index, tool) VehicleAction.EquipmentInSlot(targetGUID, index, tool)
) )
} }
} }

View file

@ -24,9 +24,8 @@ import net.psforever.packet.game.DamageWithPositionMessage
import net.psforever.types._ import net.psforever.types._
import net.psforever.services.Service import net.psforever.services.Service
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import net.psforever.services.support.SupportActor import net.psforever.services.base.support.SupportActor
import net.psforever.services.vehicle.support.TurretUpgrader import net.psforever.services.vehicle.{TurretMessage, VehicleAction, VehicleServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import org.specs2.mutable.Specification import org.specs2.mutable.Specification
import scala.concurrent.duration._ import scala.concurrent.duration._
@ -831,7 +830,7 @@ class DamageableWeaponTurretDamageTest extends ActorTest {
val msg4 = avatarProbe.receiveOne(500 milliseconds) val msg4 = avatarProbe.receiveOne(500 milliseconds)
assert( assert(
msg12 match { 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 case _ => false
} }
) )
@ -933,6 +932,7 @@ class DamageableWeaponTurretJammerTest extends ActorTest {
msg12.head match { msg12.head match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
_,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(2), 27, 1) VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(2), 27, 1)
) => ) =>
true true
@ -943,6 +943,7 @@ class DamageableWeaponTurretJammerTest extends ActorTest {
msg12(1) match { msg12(1) match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
_,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(5), 27, 1) VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(5), 27, 1)
) => ) =>
true true
@ -1085,17 +1086,17 @@ class DamageableWeaponTurretDestructionTest extends ActorTest {
assert(false, s"DamageableWeaponTurretDestructionTest-3: player not dead - $msg3") assert(false, s"DamageableWeaponTurretDestructionTest-3: player not dead - $msg3")
} }
msg12_4(2) match { msg12_4(2) match {
case AvatarServiceMessage("test", AvatarAction.ObjectDelete(PlanetSideGUID(0), PlanetSideGUID(5), _)) => ; case AvatarServiceMessage("test", _, AvatarAction.ObjectDelete(PlanetSideGUID(5), _)) => ;
case _ => case _ =>
assert(false, s"DamageableWeaponTurretDestructionTest-4: ${msg12_4(2)}") assert(false, s"DamageableWeaponTurretDestructionTest-4: ${msg12_4(2)}")
} }
msg56.head match { 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 _ => case _ =>
assert(false, s"DamageableWeaponTurretDestructionTest-5: ${msg56.head}") assert(false, s"DamageableWeaponTurretDestructionTest-5: ${msg56.head}")
} }
msg56(1) match { 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)}") case _ => assert(false, s"DamageableWeaponTurretDestructionTest-6: ${msg56(1)}")
} }
assert(turret.Health <= turret.Definition.DamageDestroysAt) assert(turret.Health <= turret.Definition.DamageDestroysAt)
@ -1180,13 +1181,13 @@ class DamageableVehicleDamageTest extends ActorTest {
val msg4 = avatarProbe.receiveOne(200 milliseconds) val msg4 = avatarProbe.receiveOne(200 milliseconds)
assert( assert(
msg12.head match { 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 case _ => false
} }
) )
assert( assert(
msg12(1) match { 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 case _ => false
} }
) )
@ -1316,11 +1317,11 @@ class DamageableVehicleDamageMountedTest extends FreedContextActorTest {
val msg3 = activityProbe.receiveOne(500 milliseconds) val msg3 = activityProbe.receiveOne(500 milliseconds)
val msg45 = avatarProbe.receiveN(2,500 milliseconds) val msg45 = avatarProbe.receiveN(2,500 milliseconds)
msg12.head match { msg12.head match {
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 68, _)) => ; case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), PlanetSideGUID(1), 68, _)) => ;
case _ => assert(false) case _ => assert(false)
} }
msg12(1) match { 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) case _ => assert(false)
} }
msg3 match { msg3 match {
@ -1453,6 +1454,7 @@ class DamageableVehicleJammeringMountedTest extends FreedContextActorTest {
msg12 match { msg12 match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
_,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 1) VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 1)
) => ) =>
true true
@ -1754,6 +1756,7 @@ class DamageableVehicleDestroyTest extends ActorTest {
// msg_vehicle.exists({ // msg_vehicle.exists({
// case VehicleServiceMessage( // case VehicleServiceMessage(
// "test", // "test",
// _,
// VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 0) // VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(4), 27, 0)
// ) => // ) =>
// true // true
@ -1764,6 +1767,7 @@ class DamageableVehicleDestroyTest extends ActorTest {
// msg_vehicle.exists({ // msg_vehicle.exists({
// case VehicleServiceMessage( // case VehicleServiceMessage(
// "test", // "test",
// _,
// VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(1), 68, 0) // VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, PlanetSideGUID(1), 68, 0)
// ) => // ) =>
// true // true

View file

@ -74,7 +74,8 @@ class DeploymentBehavior2Test extends ActorTest {
reply2.head match { reply2.head match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deploying, 0, false, Vector3.Zero) _,
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deploying, 0, false, Vector3.Zero)
) => () ) => ()
case _ => assert(false, "") case _ => assert(false, "")
} }
@ -86,6 +87,7 @@ class DeploymentBehavior2Test extends ActorTest {
reply2(1) match { reply2(1) match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
_,
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deployed, 0, false, Vector3.Zero) VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deployed, 0, false, Vector3.Zero)
) => () ) => ()
case _ => assert(false, "") case _ => assert(false, "")
@ -102,6 +104,7 @@ class DeploymentBehavior2Test extends ActorTest {
reply4.head match { reply4.head match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
_,
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Undeploying, 0, false, Vector3.Zero) VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Undeploying, 0, false, Vector3.Zero)
) => () ) => ()
case _ => assert(false, "") case _ => assert(false, "")
@ -114,6 +117,7 @@ class DeploymentBehavior2Test extends ActorTest {
reply4(1) match { reply4(1) match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
_,
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Mobile, 0, false, Vector3.Zero) VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Mobile, 0, false, Vector3.Zero)
) => () ) => ()
case _ => assert(false, "") case _ => assert(false, "")
@ -141,8 +145,9 @@ class DeploymentBehavior3Test extends ActorTest {
} }
reply2.head match { reply2.head match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deploying, 0, false, Vector3.Zero) _,
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deploying, 0, false, Vector3.Zero)
) => () ) => ()
case _ => assert(false, "") case _ => assert(false, "")
} }
@ -153,8 +158,9 @@ class DeploymentBehavior3Test extends ActorTest {
} }
reply2(1) match { reply2(1) match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deployed, 0, false, Vector3.Zero) _,
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Deployed, 0, false, Vector3.Zero)
) => () ) => ()
case _ => assert(false, "") case _ => assert(false, "")
} }
@ -169,8 +175,9 @@ class DeploymentBehavior3Test extends ActorTest {
} }
reply4.head match { reply4.head match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Undeploying, 0, false, Vector3.Zero) _,
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Undeploying, 0, false, Vector3.Zero)
) => () ) => ()
case _ => assert(false, "") case _ => assert(false, "")
} }
@ -181,8 +188,9 @@ class DeploymentBehavior3Test extends ActorTest {
} }
reply4(1) match { reply4(1) match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test", "test",
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Mobile, 0, false, Vector3.Zero) _,
VehicleAction.DeployRequest(_, PlanetSideGUID(1), DriveState.Mobile, 0, false, Vector3.Zero)
) => () ) => ()
case _ => assert(false, "") case _ => assert(false, "")
} }

View file

@ -298,7 +298,7 @@ class FacilityTurretControlRestorationTest extends ActorTest {
) )
assert( assert(
msg4 match { msg4 match {
case VehicleServiceMessage("test", VehicleAction.EquipmentInSlot(_, PlanetSideGUID(2), 1, t)) case VehicleServiceMessage("test", _, VehicleAction.EquipmentInSlot(_, PlanetSideGUID(2), 1, t))
if t eq turretWeapon => if t eq turretWeapon =>
true true
case _ => false case _ => false

View file

@ -313,7 +313,7 @@ class RepairableTurretWeapon extends ActorTest {
) )
assert( assert(
msg4 match { msg4 match {
case VehicleServiceMessage("test", VehicleAction.EquipmentInSlot(_, PlanetSideGUID(2), 1, t)) case VehicleServiceMessage("test", _, VehicleAction.EquipmentInSlot(_, PlanetSideGUID(2), 1, t))
if t eq turretWeapon => if t eq turretWeapon =>
true true
case _ => false case _ => false

View file

@ -72,7 +72,7 @@ class VehicleControlPrepareForDeletionPassengerTest extends ActorTest {
val vehicle_msg = vehicleProbe.receiveN(1, 500 milliseconds) val vehicle_msg = vehicleProbe.receiveN(1, 500 milliseconds)
vehicle_msg.head match { 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 _ => case _ =>
assert(false, s"VehicleControlPrepareForDeletionPassengerTest: ${vehicle_msg.head}") assert(false, s"VehicleControlPrepareForDeletionPassengerTest: ${vehicle_msg.head}")
} }
@ -136,32 +136,32 @@ class VehicleControlPrepareForDeletionPassengerTest extends ActorTest {
// val vehicle_msg = vehicleProbe.receiveN(6, 1 minute) // val vehicle_msg = vehicleProbe.receiveN(6, 1 minute)
// //dismounting as cargo messages // //dismounting as cargo messages
// vehicle_msg.head match { // 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 _ => // case _ =>
// assert(false, s"VehicleControlPrepareForDeletionMountedInTest-1: ${vehicle_msg.head}") // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-1: ${vehicle_msg.head}")
// } // }
// vehicle_msg(1) match { // vehicle_msg(1) match {
// case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => ; // case VehicleServiceMessage(_, _, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => ;
// case _ => // case _ =>
// assert(false, s"VehicleControlPrepareForDeletionMountedInTest-2: ${vehicle_msg(1)}") // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-2: ${vehicle_msg(1)}")
// } // }
// vehicle_msg(2) match { // vehicle_msg(2) match {
// case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => ; // case VehicleServiceMessage(_, _, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => ;
// case _ => // case _ =>
// assert(false, s"VehicleControlPrepareForDeletionMountedInTest-3: ${vehicle_msg(2)}") // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-3: ${vehicle_msg(2)}")
// } // }
// vehicle_msg(3) match { // 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 _ => // case _ =>
// assert(false, s"VehicleControlPrepareForDeletionMountedInTest-4: ${vehicle_msg(3)}") // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-4: ${vehicle_msg(3)}")
// } // }
// vehicle_msg(4) match { // 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 _ => // case _ =>
// assert(false, s"VehicleControlPrepareForDeletionMountedInTest-5: ${vehicle_msg(4)}") // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-5: ${vehicle_msg(4)}")
// } // }
// vehicle_msg(5) match { // 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 _ => // case _ =>
// assert(false, s"VehicleControlPrepareForDeletionMountedInTest-6: ${vehicle_msg(5)}") // assert(false, s"VehicleControlPrepareForDeletionMountedInTest-6: ${vehicle_msg(5)}")
// } // }
@ -224,7 +224,7 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
val vehicleMsgs = eventsProbe.receiveN(6, 10.seconds) val vehicleMsgs = eventsProbe.receiveN(6, 10.seconds)
val cargoMsgs = cargoProbe.receiveN(1, 1.seconds) val cargoMsgs = cargoProbe.receiveN(1, 1.seconds)
vehicleMsgs.head match { 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 _ => case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-1: ${vehicleMsgs.head}") assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-1: ${vehicleMsgs.head}")
} }
@ -232,27 +232,27 @@ class VehicleControlPrepareForDeletionMountedCargoTest extends FreedContextActor
assert(lodestar.Seats(0).occupant.isEmpty) assert(lodestar.Seats(0).occupant.isEmpty)
//cargo dismounting messages //cargo dismounting messages
vehicleMsgs(1) match { vehicleMsgs(1) match {
case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => () case VehicleServiceMessage(_, _, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 0, _))) => ()
case _ => case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-2: ${vehicleMsgs(1)}") assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-2: ${vehicleMsgs(1)}")
} }
vehicleMsgs(2) match { vehicleMsgs(2) match {
case VehicleServiceMessage(_, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => () case VehicleServiceMessage(_, _, VehicleAction.SendResponse(_, PlanetsideAttributeMessage(PlanetSideGUID(1), 68, _))) => ()
case _ => case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-3: ${vehicleMsgs(2)}") assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-3: ${vehicleMsgs(2)}")
} }
vehicleMsgs(3) match { 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 _ => case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-4: ${vehicleMsgs(3)}") assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-4: ${vehicleMsgs(3)}")
} }
vehicleMsgs(4) match { vehicleMsgs(4) match {
case VehicleServiceMessage("test", VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))) => () case VehicleServiceMessage("test", _, VehicleAction.SendResponse(_, ObjectDetachMessage(PlanetSideGUID(2), PlanetSideGUID(1), _, _, _, _))) => ()
case _ => case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-5: ${vehicleMsgs(4)}") assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-5: ${vehicleMsgs(4)}")
} }
vehicleMsgs(5) match { 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 _ => case _ =>
assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-6: ${vehicleMsgs(5)}") assert(false, s"VehicleControlPrepareForDeletionMountedCargoTest-6: ${vehicleMsgs(5)}")
} }
@ -476,7 +476,7 @@ class VehicleControlShieldsChargingTest extends ActorTest {
vehicle.Actor ! CommonMessages.ChargeShields(15, None) vehicle.Actor ! CommonMessages.ChargeShields(15, None)
val msg = probe.receiveOne(500 milliseconds) val msg = probe.receiveOne(500 milliseconds)
assert(msg match { assert(msg match {
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(10), 68, 15)) => true case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(10), 68, 15)) => true
case _ => false case _ => false
}) })
assert(vehicle.Shields == 15) assert(vehicle.Shields == 15)
@ -544,7 +544,7 @@ class VehicleControlShieldsNotChargingTooEarlyTest extends ActorTest {
val msg = probe.receiveOne(200 milliseconds) val msg = probe.receiveOne(200 milliseconds)
//assert(msg.isInstanceOf[Vehicle.UpdateShieldsCharge]) //assert(msg.isInstanceOf[Vehicle.UpdateShieldsCharge])
assert(msg match { assert(msg match {
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(10), 68, 15)) => true case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(10), 68, 15)) => true
case _ => false case _ => false
}) })
assert(vehicle.Shields == 15) assert(vehicle.Shields == 15)
@ -1004,7 +1004,7 @@ class VehicleControlInteractWithLavaTest extends ActorTest {
msg_burn.foreach { msg => msg_burn.foreach { msg =>
assert( assert(
msg match { msg match {
case VehicleServiceMessage("test-zone", VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(2), 0, _)) => true case VehicleServiceMessage("test-zone", _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(2), 0, _)) => true
case _ => false case _ => false
} }
) )
@ -1102,7 +1102,7 @@ class ApcControlCanChargeCapacitor extends FreedContextActorTest {
do { do {
val msg = vehicleProbe.receiveOne(3.seconds) val msg = vehicleProbe.receiveOne(3.seconds)
msg match { msg match {
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, capacitance)) => case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, capacitance)) =>
assert(capacitance > 0) assert(capacitance > 0)
case _ => case _ =>
assert(false) assert(false)
@ -1176,17 +1176,17 @@ class ApcControlCanEmp extends FreedContextActorTest {
apc.Actor ! SpecialEmp.Burst() apc.Actor ! SpecialEmp.Burst()
val vehicleMsgs = vehicleProbe.receiveN(2, 500.milliseconds) val vehicleMsgs = vehicleProbe.receiveN(2, 500.milliseconds)
vehicleMsgs.head match { vehicleMsgs.head match {
case VehicleServiceMessage(_, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, 0)) => ; case VehicleServiceMessage(_, _, VehicleAction.PlanetsideAttribute(_, PlanetSideGUID(1), 113, 0)) => ;
case _ => assert(false) case _ => assert(false)
} }
vehicleMsgs(1) match { vehicleMsgs(1) match {
case VehicleServiceMessage( case VehicleServiceMessage(
"test-zone", "test-zone",
VehicleAction.SendResponse( _,
_, VehicleAction.SendResponse(_,
TriggerEffectMessage(_, "apc_explosion_emp_vs", None, Some(TriggeredEffectLocation(Vector3.Zero, Vector3.Zero))) TriggerEffectMessage(_, "apc_explosion_emp_vs", None, Some(TriggeredEffectLocation(Vector3.Zero, Vector3.Zero)))
) )
) => ; ) => ;
case _ => assert(false) case _ => assert(false)
} }
assert(apc.Capacitor == 0) assert(apc.Capacitor == 0)

View file

@ -79,9 +79,9 @@ class OwnershipTest extends ActorTest {
"pass Awareness" in { "pass Awareness" in {
val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service") val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service")
service ! Service.Join("test") service ! Service.Join("test")
service ! VehicleServiceMessage("test", VehicleAction.Ownership(PlanetSideGUID(10), PlanetSideGUID(11))) service ! VehicleServiceMessage("test", PlanetSideGUID(10), VehicleAction.Ownership(PlanetSideGUID(11)))
expectMsg( 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.ChildObjectState(PlanetSideGUID(10), PlanetSideGUID(11), 1.2f, 3.4f) PlanetSideGUID(10),
VehicleAction.ChildObjectState(PlanetSideGUID(11), 1.2f, 3.4f)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.DeployRequest( PlanetSideGUID(10),
PlanetSideGUID(10), VehicleAction.DeployRequest(PlanetSideGUID(11), DriveState.Mobile, 0, false, Vector3(1.2f, 3.4f, 5.6f))
PlanetSideGUID(11),
DriveState.Mobile,
0,
false,
Vector3(1.2f, 3.4f, 5.6f)
)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 { "pass DismountVehicle" in {
val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service") val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service")
service ! Service.Join("test") 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( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.InventoryState(PlanetSideGUID(10), tool, PlanetSideGUID(11), 0, cdata) PlanetSideGUID(10),
VehicleAction.InventoryState(tool, PlanetSideGUID(11), 0, cdata)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.InventoryState2(PlanetSideGUID(10), PlanetSideGUID(11), PlanetSideGUID(12), 13) PlanetSideGUID(10),
VehicleAction.InventoryState2(PlanetSideGUID(11), PlanetSideGUID(12), 13)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.KickPassenger(PlanetSideGUID(10), 0, false, PlanetSideGUID(11)) PlanetSideGUID(10),
VehicleAction.KickPassenger(0, false, PlanetSideGUID(11))
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.LoadVehicle(PlanetSideGUID(10), vehicle, 12, PlanetSideGUID(11), cdata) PlanetSideGUID(10),
VehicleAction.LoadVehicle(vehicle, 12, PlanetSideGUID(11), cdata)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 { "pass MountVehicle" in {
val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service") val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service")
service ! Service.Join("test") service ! Service.Join("test")
service ! VehicleServiceMessage("test", VehicleAction.MountVehicle(PlanetSideGUID(10), PlanetSideGUID(11), 0)) service ! VehicleServiceMessage("test", VehicleAction.MountVehicle(PlanetSideGUID(11), 0))
expectMsg( 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.SeatPermissions(PlanetSideGUID(10), PlanetSideGUID(11), 0, 12L) VehicleAction.SeatPermissions(PlanetSideGUID(11), 0, 12L)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.StowEquipment(PlanetSideGUID(10), PlanetSideGUID(11), 0, tool) PlanetSideGUID(10),
VehicleAction.StowEquipment(PlanetSideGUID(11), 0, tool)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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 { "pass UnstowEquipment" in {
val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service") val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service")
service ! Service.Join("test") service ! Service.Join("test")
service ! VehicleServiceMessage("test", VehicleAction.UnstowEquipment(PlanetSideGUID(10), PlanetSideGUID(11))) service ! VehicleServiceMessage("test", PlanetSideGUID(10), VehicleAction.UnstowEquipment(PlanetSideGUID(11)))
expectMsg( 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 ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.VehicleState( 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)
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
)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), PlanetSideGUID(10),
VehicleResponse.VehicleState( VehicleAction.VehicleState(
PlanetSideGUID(11), PlanetSideGUID(11),
0, 0,
Vector3(1.2f, 3.4f, 5.6f), Vector3(1.2f, 3.4f, 5.6f),
@ -391,19 +378,14 @@ class TransferPassengerChannelTest extends ActorTest {
service ! Service.Join("test") service ! Service.Join("test")
service ! VehicleServiceMessage( service ! VehicleServiceMessage(
"test", "test",
VehicleAction.TransferPassengerChannel( PlanetSideGUID(10),
PlanetSideGUID(10), VehicleAction.TransferPassengerChannel("old_channel", "new_channel", fury, PlanetSideGUID(11))
"old_channel",
"new_channel",
fury,
PlanetSideGUID(11)
)
) )
expectMsg( expectMsg(
VehicleServiceResponse( VehicleServiceResponse(
"/test/Vehicle", "/test/Vehicle",
PlanetSideGUID(10), 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") // val service = system.actorOf(Props[VehicleService], "v-service")
// service ! Service.Join("test") // service ! Service.Join("test")
// service ! VehicleServiceMessage("test", VehicleAction.TransferPassenger(PlanetSideGUID(10), "temp_channel", fury, PlanetSideGUID(11))) // 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))))
// } // }
// } // }
//} //}