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

View file

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

View file

@ -15,7 +15,6 @@ import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret}
import net.psforever.objects.vehicles.AccessPermissionGroup
import net.psforever.objects.vital.InGameHistory
import net.psforever.packet.game.{ChatMsg, DelayedPathMountMsg, DismountVehicleCargoMsg, DismountVehicleMsg, GenericObjectActionMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectDetachMessage, PlanetsideAttributeMessage, PlayerStasisMessage, PlayerStateShiftMessage, ShiftState}
import net.psforever.services.Service
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.{BailType, ChatMessageType, DriveState, PlanetSideGUID, Vector3}
@ -215,7 +214,7 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
//DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages
events ! VehicleServiceMessage(
player.Name,
VehicleAction.SendResponse(Service.defaultPlayerGUID, PlayerStasisMessage(pguid)) //the stasis message
VehicleAction.SendResponse(PlayerStasisMessage(pguid)) //the stasis message
)
//when the player dismounts, they will be positioned where the shuttle was when it disappeared in the sky
//the player will fall to the ground and is perfectly vulnerable in this state
@ -223,14 +222,12 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
//having no in-game avatar target will throw us out of the map screen when deploying and cause softlock
events ! VehicleServiceMessage(
player.Name,
VehicleAction.SendResponse(
Service.defaultPlayerGUID,
PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay
)
VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)))
)
events ! VehicleServiceMessage(
continent.id,
VehicleAction.SendResponse(pguid, GenericObjectActionMessage(pguid, code=9)) //conceal the player
pguid,
VehicleAction.SendResponse(GenericObjectActionMessage(pguid, code=9)) //conceal the player
)
sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive
@ -258,7 +255,8 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
case Mountable.CanDismount(obj: Vehicle, seat_num, _) =>
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.KickPassenger(tplayer.GUID, seat_num, unk2=true, obj.GUID)
tplayer.GUID,
VehicleAction.KickPassenger(seat_num, unk2=true, obj.GUID)
)
case Mountable.CanDismount(obj: PlanetSideGameObject with PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) =>

View file

@ -78,8 +78,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
//
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
player.GUID,
VehicleAction.VehicleState(
player.GUID,
vehicle_guid,
unk1,
position,
@ -166,23 +166,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
obj.DeploymentState = if (is_crouched || !notMountedState) DriveState.Kneeling else DriveState.Mobile
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.FrameVehicleState(
player.GUID,
vehicle_guid,
unk1,
position,
angle,
velocity,
unk2,
unk3,
unk4,
is_crouched,
is_airborne,
ascending_flight,
flight_time,
unk9,
unkA
)
player.GUID,
VehicleAction.FrameVehicleState(vehicle_guid, unk1, position, angle, velocity, unk2, unk3, unk4, is_crouched, is_airborne, ascending_flight, flight_time, unk9, unkA)
)
sessionLogic.squad.updateSquad()
case (None, _) =>
@ -236,7 +221,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
player.Orientation = angle
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.ChildObjectState(player.GUID, object_guid, pitch, yaw)
player.GUID,
VehicleAction.ChildObjectState(object_guid, pitch, yaw)
)
}
//TODO status condition of "playing getting out of vehicle to allow for late packets without warning
@ -258,20 +244,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
obj.zoneInteractions()
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.VehicleState(
player.GUID,
vehicle_guid,
unk1,
pos,
ang,
obj.Velocity,
obj.Flying,
0,
0,
15,
unk5 = false,
obj.Cloaked
)
player.GUID,
VehicleAction.VehicleState(vehicle_guid, unk1, pos, ang, obj.Velocity, obj.Flying, 0, 0, 15, unk5 = false, obj.Cloaked)
)
}
}
@ -330,7 +304,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, unk3=false, Vector3.Zero))
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.DeployRequest(player.GUID, obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero)
player.GUID,
VehicleAction.DeployRequest(obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero)
)
}
}

View file

@ -16,7 +16,6 @@ import net.psforever.objects.serverobject.turret.{FacilityTurret, WeaponTurret}
import net.psforever.objects.vehicles.AccessPermissionGroup
import net.psforever.objects.vital.InGameHistory
import net.psforever.packet.game.{ChatMsg, DelayedPathMountMsg, DismountVehicleCargoMsg, DismountVehicleMsg, GenericObjectActionMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectDetachMessage, PlanetsideAttributeMessage, PlayerStasisMessage, PlayerStateShiftMessage, ShiftState}
import net.psforever.services.Service
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.{BailType, ChatMessageType, DriveState, PlanetSideGUID, Vector3}
@ -251,7 +250,7 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
//DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages
events ! VehicleServiceMessage(
player.Name,
VehicleAction.SendResponse(Service.defaultPlayerGUID, PlayerStasisMessage(pguid)) //the stasis message
VehicleAction.SendResponse(PlayerStasisMessage(pguid)) //the stasis message
)
//when the player dismounts, they will be positioned where the shuttle was when it disappeared in the sky
//the player will fall to the ground and is perfectly vulnerable in this state
@ -259,14 +258,12 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
//having no in-game avatar target will throw us out of the map screen when deploying and cause softlock
events ! VehicleServiceMessage(
player.Name,
VehicleAction.SendResponse(
Service.defaultPlayerGUID,
PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay
)
VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)))
)
events ! VehicleServiceMessage(
continent.id,
VehicleAction.SendResponse(pguid, GenericObjectActionMessage(pguid, code=9)) //conceal the player
pguid,
VehicleAction.SendResponse(GenericObjectActionMessage(pguid, code=9)) //conceal the player
)
sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive
@ -295,7 +292,8 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
case Mountable.CanDismount(obj: Vehicle, seat_num, _) =>
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.KickPassenger(tplayer.GUID, seat_num, unk2=true, obj.GUID)
tplayer.GUID,
VehicleAction.KickPassenger(seat_num, unk2=true, obj.GUID)
)
case Mountable.CanDismount(obj: PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) =>

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.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChatMsg, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, HitHint, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage}
import net.psforever.services.Service
import net.psforever.services.base.EventResponse
import net.psforever.services.local.support.CaptureFlagManager
import net.psforever.services.vehicle.{VehicleResponse, VehicleServiceResponse}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse}
import net.psforever.types.{BailType, ChatMessageType, PlanetSideGUID, Vector3}
object VehicleHandlerLogic {
@ -38,7 +39,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
* @param guid na
* @param reply na
*/
def handle(toChannel: String, guid: PlanetSideGUID, reply: VehicleResponse.Response): Unit = {
def handle(toChannel: String, guid: PlanetSideGUID, reply: EventResponse): Unit = {
val resolvedPlayerGuid = if (player.HasGUID) {
player.GUID
} else {
@ -46,7 +47,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
}
val isNotSameTarget = resolvedPlayerGuid != guid
reply match {
case VehicleResponse.VehicleState(
case VehicleAction.VehicleState(
vehicleGuid,
unk1,
pos,
@ -74,7 +75,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
}
}
case VehicleResponse.VehicleState(
case VehicleAction.VehicleState(
vehicleGuid,
unk1,
pos,
@ -90,23 +91,23 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
//player who is watching the vehicle from the outside
sendResponse(VehicleStateMessage(vehicleGuid, unk1, pos, ang, vel, unk2, unk3, unk4, wheelDirection, unk5, unk6))
case VehicleResponse.ChildObjectState(objectGuid, pitch, yaw) if isNotSameTarget =>
case VehicleAction.ChildObjectState(objectGuid, pitch, yaw) if isNotSameTarget =>
sendResponse(ChildObjectStateMessage(objectGuid, pitch, yaw))
case VehicleResponse.FrameVehicleState(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA)
case VehicleAction.FrameVehicleState(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA)
if isNotSameTarget =>
sendResponse(FrameVehicleStateMessage(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA))
case VehicleResponse.ChangeFireState_Start(weaponGuid) if isNotSameTarget =>
case VehicleAction.ChangeFireState_Start(weaponGuid) if isNotSameTarget =>
sendResponse(ChangeFireStateMessage_Start(weaponGuid))
case VehicleResponse.ChangeFireState_Stop(weaponGuid) if isNotSameTarget =>
case VehicleAction.ChangeFireState_Stop(weaponGuid) if isNotSameTarget =>
sendResponse(ChangeFireStateMessage_Stop(weaponGuid))
case VehicleResponse.Reload(itemGuid) if isNotSameTarget =>
case VehicleAction.Reload(itemGuid) if isNotSameTarget =>
sendResponse(ReloadMessage(itemGuid, ammo_clip=1, unk1=0))
case VehicleResponse.ChangeAmmo(weapon_guid, weapon_slot, previous_guid, ammo_id, ammo_guid, ammo_data) if isNotSameTarget =>
case VehicleAction.ChangeAmmo(weapon_guid, weapon_slot, previous_guid, ammo_id, ammo_guid, ammo_data) if isNotSameTarget =>
sendResponse(ObjectDetachMessage(weapon_guid, previous_guid, Vector3.Zero, 0))
//TODO? sendResponse(ObjectDeleteMessage(previousAmmoGuid, 0))
sendResponse(
@ -119,7 +120,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
)
sendResponse(ChangeAmmoMessage(weapon_guid, 1))
case VehicleResponse.WeaponDryFire(weaponGuid) if isNotSameTarget =>
case VehicleAction.WeaponDryFire(weaponGuid) if isNotSameTarget =>
continent.GUID(weaponGuid).collect {
case tool: Tool if tool.Magazine == 0 =>
// check that the magazine is still empty before sending WeaponDryFireMessage
@ -127,45 +128,28 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
sendResponse(WeaponDryFireMessage(weaponGuid))
}
case VehicleResponse.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget =>
case VehicleAction.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget =>
sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver))
case VehicleResponse.MountVehicle(vehicleGuid, seat) if isNotSameTarget =>
case VehicleAction.MountVehicle(vehicleGuid, seat) if isNotSameTarget =>
sendResponse(ObjectAttachMessage(vehicleGuid, guid, seat))
case VehicleResponse.DeployRequest(objectGuid, state, unk1, unk2, pos) if isNotSameTarget =>
case VehicleAction.DeployRequest(objectGuid, state, unk1, unk2, pos) if isNotSameTarget =>
sendResponse(DeployRequestMessage(guid, objectGuid, state, unk1, unk2, pos))
case VehicleResponse.SendResponse(msg) =>
case VehicleAction.SendResponse(msg) =>
sendResponse(msg)
case VehicleResponse.AttachToRails(vehicleGuid, padGuid) =>
sendResponse(ObjectAttachMessage(padGuid, vehicleGuid, slot=3))
case VehicleResponse.ConcealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=9))
case VehicleResponse.DetachFromRails(vehicleGuid, padGuid, padPosition, padOrientationZ) =>
val pad = continent.GUID(padGuid).get.asInstanceOf[VehicleSpawnPad].Definition
sendResponse(
ObjectDetachMessage(
padGuid,
vehicleGuid,
padPosition + Vector3.z(pad.VehicleCreationZOffset),
padOrientationZ + pad.VehicleCreationZOrientOffset
)
)
case VehicleResponse.EquipmentInSlot(pkt) if isNotSameTarget =>
case VehicleAction.EquipmentCreatedInSlot(pkt) if isNotSameTarget =>
sendResponse(pkt)
case VehicleResponse.GenericObjectAction(objectGuid, action) if isNotSameTarget =>
case VehicleAction.GenericObjectAction(objectGuid, action) if isNotSameTarget =>
sendResponse(GenericObjectActionMessage(objectGuid, action))
case VehicleResponse.HitHint(sourceGuid) if player.isAlive =>
case VehicleAction.HitHint(sourceGuid) if player.isAlive =>
sendResponse(HitHint(sourceGuid, player.GUID))
case VehicleResponse.InventoryState(obj, parentGuid, start, conData) if isNotSameTarget =>
case VehicleAction.InventoryState(obj, parentGuid, start, conData) if isNotSameTarget =>
//TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?
val objGuid = obj.GUID
sendResponse(ObjectDeleteMessage(objGuid, unk1=0))
@ -176,7 +160,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
conData
))
case VehicleResponse.KickPassenger(_, wasKickedByDriver, vehicleGuid) if resolvedPlayerGuid == guid =>
case VehicleAction.KickPassenger(_, wasKickedByDriver, vehicleGuid) if resolvedPlayerGuid == guid =>
//seat number (first field) seems to be correct if passenger is kicked manually by driver
//but always seems to return 4 if user is kicked by mount permissions changing
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver))
@ -190,47 +174,41 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
log.info(s"${player.Name} has been kicked from $typeOfRide!")
player.WhichSide = OutsideOf
case VehicleResponse.KickPassenger(_, wasKickedByDriver, _) =>
case VehicleAction.KickPassenger(_, wasKickedByDriver, _) =>
//seat number (first field) seems to be correct if passenger is kicked manually by driver
//but always seems to return 4 if user is kicked by mount permissions changing
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver))
case VehicleResponse.InventoryState2(objGuid, parentGuid, value) if isNotSameTarget =>
case VehicleAction.InventoryState2(objGuid, parentGuid, value) if isNotSameTarget =>
sendResponse(InventoryStateMessage(objGuid, unk=0, parentGuid, value))
case VehicleResponse.LoadVehicle(vehicle, vtype, vguid, vdata) if isNotSameTarget =>
case VehicleAction.LoadVehicle(vehicle, vtype, vguid, vdata) if isNotSameTarget =>
//this is not be suitable for vehicles with people who are seated in it before it spawns (if that is possible)
sendResponse(ObjectCreateMessage(vtype, vguid, vdata))
Vehicles.ReloadAccessPermissions(vehicle, player.Name)
case VehicleResponse.ObjectDelete(itemGuid) if isNotSameTarget =>
case VehicleAction.ObjectDelete(itemGuid) if isNotSameTarget =>
sendResponse(ObjectDeleteMessage(itemGuid, unk1=0))
case VehicleResponse.Ownership(vehicleGuid) if resolvedPlayerGuid == guid =>
case VehicleAction.Ownership(vehicleGuid) if resolvedPlayerGuid == guid =>
//Only the player that owns this vehicle needs the ownership packet
avatarActor ! AvatarActor.SetVehicle(Some(vehicleGuid))
sendResponse(PlanetsideAttributeMessage(resolvedPlayerGuid, attribute_type=21, vehicleGuid))
case VehicleResponse.LoseOwnership(_, vehicleGuid) =>
case VehicleAction.LoseOwnership(_, vehicleGuid) =>
ops.announceAmsDecay(vehicleGuid,msg = "@ams_decaystarted")
case VehicleResponse.PlanetsideAttribute(vehicleGuid, attributeType, attributeValue) if isNotSameTarget =>
case VehicleAction.PlanetsideAttribute(vehicleGuid, attributeType, attributeValue) if isNotSameTarget =>
sendResponse(PlanetsideAttributeMessage(vehicleGuid, attributeType, attributeValue))
case VehicleResponse.ResetSpawnPad(padGuid) =>
sendResponse(GenericObjectActionMessage(padGuid, code=23))
case VehicleResponse.RevealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=10))
case VehicleResponse.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget =>
case VehicleAction.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget =>
sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission))
case VehicleResponse.StowEquipment(vehicleGuid, slot, itemType, itemGuid, itemData) if isNotSameTarget =>
case VehicleAction.StowCreatedEquipment(vehicleGuid, slot, itemType, itemGuid, itemData) if isNotSameTarget =>
//TODO prefer ObjectAttachMessage, but how to force ammo pools to update properly?
sendResponse(ObjectCreateDetailedMessage(itemType, itemGuid, ObjectCreateMessageParent(vehicleGuid, slot), itemData))
case VehicleResponse.UnloadVehicle(_, vehicleGuid) =>
case VehicleAction.UnloadVehicle(_, vehicleGuid) =>
sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1))
if (sessionLogic.zoning.spawn.prevSpawnPoint.map(_.Owner).exists {
case ams: Vehicle =>
@ -243,22 +221,22 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
sendResponse(ChatMsg(ChatMessageType.UNK_229, "@ams_decayed"))
}
case VehicleResponse.UnstowEquipment(itemGuid) if isNotSameTarget =>
case VehicleAction.UnstowEquipment(itemGuid) if isNotSameTarget =>
//TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?
sendResponse(ObjectDeleteMessage(itemGuid, unk1=0))
case VehicleResponse.UpdateAmsSpawnPoint(list) =>
case VehicleAction.UpdateAmsSpawnList(list) =>
sessionLogic.zoning.spawn.amsSpawnPoints = list.filter(tube => tube.Faction == player.Faction)
sessionLogic.zoning.spawn.DrawCurrentAmsSpawnPoint()
case VehicleResponse.TransferPassengerChannel(oldChannel, tempChannel, vehicle, vehicleToDelete) if isNotSameTarget =>
case VehicleAction.TransferPassengerChannel(oldChannel, tempChannel, vehicle, vehicleToDelete) if isNotSameTarget =>
sessionLogic.zoning.interstellarFerry = Some(vehicle)
sessionLogic.zoning.interstellarFerryTopLevelGUID = Some(vehicleToDelete)
continent.VehicleEvents ! Service.Leave(Some(oldChannel)) //old vehicle-specific channel (was s"${vehicle.Actor}")
galaxyService ! Service.Join(tempChannel) //temporary vehicle-specific channel
log.debug(s"TransferPassengerChannel: ${player.Name} now subscribed to $tempChannel for vehicle gating")
case VehicleResponse.KickCargo(vehicle, speed, delay)
case VehicleAction.KickCargo(vehicle, speed, delay)
if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive && speed > 0 =>
val strafe = 1 + Vehicles.CargoOrientation(vehicle)
val reverseSpeed = if (strafe > 1) { 0 } else { speed }
@ -281,75 +259,14 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
context.system.scheduler.scheduleOnce(
delay milliseconds,
context.self,
VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleResponse.KickCargo(vehicle, speed=0, delay))
VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleAction.KickCargo(vehicle, speed=0, delay))
)
case VehicleResponse.KickCargo(cargo, _, _)
case VehicleAction.KickCargo(cargo, _, _)
if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive =>
sessionLogic.vehicles.TotalDriverVehicleControl(cargo)
case VehicleResponse.StartPlayerSeatedInVehicle(vehicle, _)
if player.VisibleSlots.contains(player.DrawnSlot) =>
player.DrawnSlot = Player.HandsDownSlot
startPlayerSeatedInVehicle(vehicle)
case VehicleResponse.StartPlayerSeatedInVehicle(vehicle, _) =>
startPlayerSeatedInVehicle(vehicle)
case VehicleResponse.PlayerSeatedInVehicle(vehicle, _) =>
Vehicles.ReloadAccessPermissions(vehicle, player.Name)
sessionLogic.vehicles.ServerVehicleOverrideWithPacket(
vehicle,
ServerVehicleOverrideMsg(
lock_accelerator=true,
lock_wheel=true,
reverse=true,
unk4=false,
lock_vthrust=1,
lock_strafe=0,
movement_speed=0,
unk8=Some(0)
)
)
sessionLogic.vehicles.serverVehicleControlVelocity = Some(0)
case VehicleResponse.ServerVehicleOverrideStart(vehicle, _) =>
val vdef = vehicle.Definition
sessionLogic.vehicles.ServerVehicleOverrideWithPacket(
vehicle,
ServerVehicleOverrideMsg(
lock_accelerator=true,
lock_wheel=true,
reverse=false,
unk4=false,
lock_vthrust=if (GlobalDefinitions.isFlightVehicle(vdef)) { 1 } else { 0 },
lock_strafe=0,
movement_speed=vdef.AutoPilotSpeed1,
unk8=Some(0)
)
)
case VehicleResponse.ServerVehicleOverrideEnd(vehicle, _) =>
sessionLogic.vehicles.ServerVehicleOverrideStop(vehicle)
case VehicleResponse.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, data) =>
val str = s"${data.getOrElse("The vehicle spawn pad where you placed your order is blocked.")}"
val msg = if (str.contains("@")) {
ChatMsg(ChatMessageType.UNK_229, str)
} else {
ChatMsg(ChatMessageType.CMT_OPEN, wideContents = true, recipient = "", str, note = None)
}
sendResponse(msg)
case VehicleResponse.PeriodicReminder(_, data) =>
val (isType, flag, msg): (ChatMessageType, Boolean, String) = data match {
case Some(msg: String) if msg.startsWith("@") => (ChatMessageType.UNK_227, false, msg)
case Some(msg: String) => (ChatMessageType.CMT_OPEN, true, msg)
case _ => (ChatMessageType.CMT_OPEN, true, "Your vehicle order has been cancelled.")
}
sendResponse(ChatMsg(isType, flag, recipient="", msg, None))
case VehicleResponse.ChangeLoadout(target, oldWeapons, addedWeapons, oldInventory, newInventory)
case VehicleAction.ChangeLoadout(target, oldWeapons, addedWeapons, oldInventory, newInventory)
if player.avatar.vehicle.contains(target) =>
//TODO when vehicle weapons can be changed without visual glitches, rewrite this
continent.GUID(target).collect { case vehicle: Vehicle =>
@ -373,7 +290,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory)
}
case VehicleResponse.ChangeLoadout(target, oldWeapons, _, oldInventory, _)
case VehicleAction.ChangeLoadout(target, oldWeapons, _, oldInventory, _)
if sessionLogic.general.accessedContainer.map(_.GUID).contains(target) =>
//TODO when vehicle weapons can be changed without visual glitches, rewrite this
continent.GUID(target).collect { case vehicle: Vehicle =>
@ -382,12 +299,96 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory)
}
case VehicleResponse.ChangeLoadout(target, oldWeapons, _, oldInventory, _) =>
case VehicleAction.ChangeLoadout(target, oldWeapons, _, oldInventory, _) =>
//TODO when vehicle weapons can be changed without visual glitches, rewrite this
continent.GUID(target).collect { case vehicle: Vehicle =>
changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory)
}
case VehicleSpawnPad.AttachToRails(vehicle, pad) =>
sendResponse(ObjectAttachMessage(pad.GUID, vehicle.GUID, slot=3))
case VehicleSpawnPad.ConcealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=9))
case VehicleSpawnPad.DetachFromRails(vehicle, pad) =>
val padDefinition = pad.Definition
sendResponse(
ObjectDetachMessage(
pad.GUID,
vehicle.GUID,
pad.Position + Vector3.z(padDefinition.VehicleCreationZOffset),
pad.Orientation.z + padDefinition.VehicleCreationZOrientOffset
)
)
case VehicleSpawnPad.ResetSpawnPad(pad) =>
sendResponse(GenericObjectActionMessage(pad.GUID, code=23))
case VehicleSpawnPad.RevealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=10))
case VehicleSpawnPad.StartPlayerSeatedInVehicle(vehicle, _)
if player.VisibleSlots.contains(player.DrawnSlot) =>
player.DrawnSlot = Player.HandsDownSlot
startPlayerSeatedInVehicle(vehicle)
case VehicleSpawnPad.StartPlayerSeatedInVehicle(vehicle, _) =>
startPlayerSeatedInVehicle(vehicle)
case VehicleSpawnPad.PlayerSeatedInVehicle(vehicle, _) =>
Vehicles.ReloadAccessPermissions(vehicle, player.Name)
sessionLogic.vehicles.ServerVehicleOverrideWithPacket(
vehicle,
ServerVehicleOverrideMsg(
lock_accelerator=true,
lock_wheel=true,
reverse=true,
unk4=false,
lock_vthrust=1,
lock_strafe=0,
movement_speed=0,
unk8=Some(0)
)
)
sessionLogic.vehicles.serverVehicleControlVelocity = Some(0)
case VehicleSpawnPad.ServerVehicleOverrideStart(vehicle, _) =>
val vdef = vehicle.Definition
sessionLogic.vehicles.ServerVehicleOverrideWithPacket(
vehicle,
ServerVehicleOverrideMsg(
lock_accelerator=true,
lock_wheel=true,
reverse=false,
unk4=false,
lock_vthrust=if (GlobalDefinitions.isFlightVehicle(vdef)) { 1 } else { 0 },
lock_strafe=0,
movement_speed=vdef.AutoPilotSpeed1,
unk8=Some(0)
)
)
case VehicleSpawnPad.ServerVehicleOverrideEnd(vehicle, _) =>
sessionLogic.vehicles.ServerVehicleOverrideStop(vehicle)
case VehicleSpawnPad.PeriodicReminder(VehicleSpawnPad.Reminders.Blocked, data) =>
val str = s"${data.getOrElse("The vehicle spawn pad where you placed your order is blocked.")}"
val msg = if (str.contains("@")) {
ChatMsg(ChatMessageType.UNK_229, str)
} else {
ChatMsg(ChatMessageType.CMT_OPEN, wideContents = true, recipient = "", str, note = None)
}
sendResponse(msg)
case VehicleSpawnPad.PeriodicReminder(_, data) =>
val (isType, flag, msg): (ChatMessageType, Boolean, String) = data match {
case Some(msg: String) if msg.startsWith("@") => (ChatMessageType.UNK_227, false, msg)
case Some(msg: String) => (ChatMessageType.CMT_OPEN, true, msg)
case _ => (ChatMessageType.CMT_OPEN, true, "Your vehicle order has been cancelled.")
}
sendResponse(ChatMsg(isType, flag, recipient="", msg, None))
case _ => ()
}
}

View file

@ -77,8 +77,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
//
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
player.GUID,
VehicleAction.VehicleState(
player.GUID,
vehicle_guid,
unk1,
position,
@ -164,23 +164,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
obj.DeploymentState = if (is_crouched || !notMountedState) DriveState.Kneeling else DriveState.Mobile
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.FrameVehicleState(
player.GUID,
vehicle_guid,
unk1,
position,
angle,
velocity,
unk2,
unk3,
unk4,
is_crouched,
is_airborne,
ascending_flight,
flight_time,
unk9,
unkA
)
player.GUID,
VehicleAction.FrameVehicleState(vehicle_guid, unk1, position, angle, velocity, unk2, unk3, unk4, is_crouched, is_airborne, ascending_flight, flight_time, unk9, unkA)
)
sessionLogic.squad.updateSquad()
case (None, _) =>
@ -232,7 +217,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
player.Orientation = angle
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.ChildObjectState(player.GUID, object_guid, pitch, yaw)
player.GUID,
VehicleAction.ChildObjectState(object_guid, pitch, yaw)
)
}
//TODO status condition of "playing getting out of vehicle to allow for late packets without warning
@ -254,20 +240,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
obj.zoneInteractions()
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.VehicleState(
player.GUID,
vehicle_guid,
unk1,
pos,
ang,
obj.Velocity,
obj.Flying,
0,
0,
15,
unk5 = false,
obj.Cloaked
)
player.GUID,
VehicleAction.VehicleState(vehicle_guid, unk1, pos, ang, obj.Velocity, obj.Flying, 0, 0, 15, unk5 = false, obj.Cloaked)
)
}
}
@ -348,7 +322,8 @@ class VehicleLogic(val ops: VehicleOperations, implicit val context: ActorContex
sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Mobile, 0, unk3=false, Vector3.Zero))
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.DeployRequest(player.GUID, obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero)
player.GUID,
VehicleAction.DeployRequest(obj.GUID, DriveState.Mobile, 0, unk2=false, Vector3.Zero)
)
"; enforcing Mobile deployment state"
} else {

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.vital.InGameHistory
import net.psforever.packet.game.{DelayedPathMountMsg, DismountVehicleCargoMsg, DismountVehicleMsg, GenericObjectActionMessage, MountVehicleCargoMsg, MountVehicleMsg, ObjectDetachMessage, PlayerStasisMessage, PlayerStateShiftMessage, ShiftState}
import net.psforever.services.Service
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
@ -78,7 +77,7 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
//DismountAction(...) uses vehicle service, so use that service to coordinate the remainder of the messages
events ! VehicleServiceMessage(
player.Name,
VehicleAction.SendResponse(Service.defaultPlayerGUID, PlayerStasisMessage(pguid)) //the stasis message
VehicleAction.SendResponse(PlayerStasisMessage(pguid)) //the stasis message
)
//when the player dismounts, they will be positioned where the shuttle was when it disappeared in the sky
//the player will fall to the ground and is perfectly vulnerable in this state
@ -86,14 +85,12 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
//having no in-game avatar target will throw us out of the map screen when deploying and cause softlock
events ! VehicleServiceMessage(
player.Name,
VehicleAction.SendResponse(
Service.defaultPlayerGUID,
PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)) //cower in the shuttle bay
)
VehicleAction.SendResponse(PlayerStateShiftMessage(ShiftState(unk=0, obj.Position, obj.Orientation.z, vel=None)))
)
events ! VehicleServiceMessage(
continent.id,
VehicleAction.SendResponse(pguid, GenericObjectActionMessage(pguid, code=9)) //conceal the player
pguid,
VehicleAction.SendResponse(GenericObjectActionMessage(pguid, code=9)) //conceal the player
)
context.self ! SessionActor.SetMode(NormalMode)
sessionLogic.keepAliveFunc = sessionLogic.zoning.NormalKeepAlive
@ -113,7 +110,8 @@ class MountHandlerLogic(val ops: SessionMountHandlers, implicit val context: Act
case Mountable.CanDismount(obj: Vehicle, seat_num, _) =>
continent.VehicleEvents ! VehicleServiceMessage(
continent.id,
VehicleAction.KickPassenger(tplayer.GUID, seat_num, unk2=true, obj.GUID)
tplayer.GUID,
VehicleAction.KickPassenger(seat_num, unk2=true, obj.GUID)
)
case Mountable.CanDismount(obj: PlanetSideGameObject with PlanetSideGameObject with Mountable with FactionAffinity with InGameHistory, seatNum, _) =>

View file

@ -7,8 +7,9 @@ import net.psforever.objects.{Tool, Vehicle, Vehicles}
import net.psforever.objects.equipment.Equipment
import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent
import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, HitHint, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage}
import net.psforever.services.vehicle.{VehicleResponse, VehicleServiceResponse}
import net.psforever.packet.game.{ChangeAmmoMessage, ChangeFireStateMessage_Start, ChangeFireStateMessage_Stop, ChildObjectStateMessage, DeadState, DeployRequestMessage, DismountVehicleMsg, FrameVehicleStateMessage, GenericObjectActionMessage, InventoryStateMessage, ObjectAttachMessage, ObjectCreateDetailedMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, PlanetsideAttributeMessage, ReloadMessage, ServerVehicleOverrideMsg, VehicleStateMessage, WeaponDryFireMessage}
import net.psforever.services.base.EventResponse
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceResponse}
import net.psforever.types.{BailType, PlanetSideGUID, Vector3}
object VehicleHandlerLogic {
@ -31,7 +32,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
* @param guid na
* @param reply na
*/
def handle(toChannel: String, guid: PlanetSideGUID, reply: VehicleResponse.Response): Unit = {
def handle(toChannel: String, guid: PlanetSideGUID, reply: EventResponse): Unit = {
val resolvedPlayerGuid = if (player.HasGUID) {
player.GUID
} else {
@ -39,7 +40,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
}
val isNotSameTarget = resolvedPlayerGuid != guid
reply match {
case VehicleResponse.VehicleState(
case VehicleAction.VehicleState(
vehicleGuid,
unk1,
pos,
@ -59,7 +60,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
player.Velocity = vel
sessionLogic.updateLocalBlockMap(pos)
case VehicleResponse.VehicleState(
case VehicleAction.VehicleState(
vehicleGuid,
unk1,
pos,
@ -75,23 +76,23 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
//player who is watching the vehicle from the outside
sendResponse(VehicleStateMessage(vehicleGuid, unk1, pos, ang, vel, unk2, unk3, unk4, wheelDirection, unk5, unk6))
case VehicleResponse.ChildObjectState(objectGuid, pitch, yaw) if isNotSameTarget =>
case VehicleAction.ChildObjectState(objectGuid, pitch, yaw) if isNotSameTarget =>
sendResponse(ChildObjectStateMessage(objectGuid, pitch, yaw))
case VehicleResponse.FrameVehicleState(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA)
case VehicleAction.FrameVehicleState(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA)
if isNotSameTarget =>
sendResponse(FrameVehicleStateMessage(vguid, u1, pos, oient, vel, u2, u3, u4, is_crouched, u6, u7, u8, u9, uA))
case VehicleResponse.ChangeFireState_Start(weaponGuid) if isNotSameTarget =>
case VehicleAction.ChangeFireState_Start(weaponGuid) if isNotSameTarget =>
sendResponse(ChangeFireStateMessage_Start(weaponGuid))
case VehicleResponse.ChangeFireState_Stop(weaponGuid) if isNotSameTarget =>
case VehicleAction.ChangeFireState_Stop(weaponGuid) if isNotSameTarget =>
sendResponse(ChangeFireStateMessage_Stop(weaponGuid))
case VehicleResponse.Reload(itemGuid) if isNotSameTarget =>
case VehicleAction.Reload(itemGuid) if isNotSameTarget =>
sendResponse(ReloadMessage(itemGuid, ammo_clip=1, unk1=0))
case VehicleResponse.ChangeAmmo(weapon_guid, weapon_slot, previous_guid, ammo_id, ammo_guid, ammo_data) if isNotSameTarget =>
case VehicleAction.ChangeAmmo(weapon_guid, weapon_slot, previous_guid, ammo_id, ammo_guid, ammo_data) if isNotSameTarget =>
sendResponse(ObjectDetachMessage(weapon_guid, previous_guid, Vector3.Zero, 0))
//TODO? sendResponse(ObjectDeleteMessage(previousAmmoGuid, 0))
sendResponse(
@ -104,7 +105,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
)
sendResponse(ChangeAmmoMessage(weapon_guid, 1))
case VehicleResponse.WeaponDryFire(weaponGuid) if isNotSameTarget =>
case VehicleAction.WeaponDryFire(weaponGuid) if isNotSameTarget =>
continent.GUID(weaponGuid).collect {
case tool: Tool if tool.Magazine == 0 =>
// check that the magazine is still empty before sending WeaponDryFireMessage
@ -112,42 +113,25 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
sendResponse(WeaponDryFireMessage(weaponGuid))
}
case VehicleResponse.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget =>
case VehicleAction.DismountVehicle(bailType, wasKickedByDriver) if isNotSameTarget =>
sendResponse(DismountVehicleMsg(guid, bailType, wasKickedByDriver))
case VehicleResponse.MountVehicle(vehicleGuid, seat) if isNotSameTarget =>
case VehicleAction.MountVehicle(vehicleGuid, seat) if isNotSameTarget =>
sendResponse(ObjectAttachMessage(vehicleGuid, guid, seat))
case VehicleResponse.DeployRequest(objectGuid, state, unk1, unk2, pos) if isNotSameTarget =>
case VehicleAction.DeployRequest(objectGuid, state, unk1, unk2, pos) if isNotSameTarget =>
sendResponse(DeployRequestMessage(guid, objectGuid, state, unk1, unk2, pos))
case VehicleResponse.SendResponse(msg) =>
case VehicleAction.SendResponse(msg) =>
sendResponse(msg)
case VehicleResponse.AttachToRails(vehicleGuid, padGuid) =>
sendResponse(ObjectAttachMessage(padGuid, vehicleGuid, slot=3))
case VehicleResponse.ConcealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=9))
case VehicleResponse.DetachFromRails(vehicleGuid, padGuid, padPosition, padOrientationZ) =>
val pad = continent.GUID(padGuid).get.asInstanceOf[VehicleSpawnPad].Definition
sendResponse(
ObjectDetachMessage(
padGuid,
vehicleGuid,
padPosition + Vector3.z(pad.VehicleCreationZOffset),
padOrientationZ + pad.VehicleCreationZOrientOffset
)
)
case VehicleResponse.EquipmentInSlot(pkt) if isNotSameTarget =>
case VehicleAction.EquipmentCreatedInSlot(pkt) if isNotSameTarget =>
sendResponse(pkt)
case VehicleResponse.GenericObjectAction(objectGuid, action) if isNotSameTarget =>
case VehicleAction.GenericObjectAction(objectGuid, action) if isNotSameTarget =>
sendResponse(GenericObjectActionMessage(objectGuid, action))
case VehicleResponse.InventoryState(obj, parentGuid, start, conData) if isNotSameTarget =>
case VehicleAction.InventoryState(obj, parentGuid, start, conData) if isNotSameTarget =>
//TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?
val objGuid = obj.GUID
sendResponse(ObjectDeleteMessage(objGuid, unk1=0))
@ -158,7 +142,7 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
conData
))
case VehicleResponse.KickPassenger(_, wasKickedByDriver, vehicleGuid) if resolvedPlayerGuid == guid =>
case VehicleAction.KickPassenger(_, wasKickedByDriver, vehicleGuid) if resolvedPlayerGuid == guid =>
//seat number (first field) seems to be correct if passenger is kicked manually by driver
//but always seems to return 4 if user is kicked by mount permissions changing
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver))
@ -168,46 +152,40 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
case _ => ()
}
case VehicleResponse.KickPassenger(_, wasKickedByDriver, _) =>
case VehicleAction.KickPassenger(_, wasKickedByDriver, _) =>
//seat number (first field) seems to be correct if passenger is kicked manually by driver
//but always seems to return 4 if user is kicked by mount permissions changing
sendResponse(DismountVehicleMsg(guid, BailType.Kicked, wasKickedByDriver))
case VehicleResponse.InventoryState2(objGuid, parentGuid, value) if isNotSameTarget =>
case VehicleAction.InventoryState2(objGuid, parentGuid, value) if isNotSameTarget =>
sendResponse(InventoryStateMessage(objGuid, unk=0, parentGuid, value))
case VehicleResponse.LoadVehicle(vehicle, vtype, vguid, vdata) if isNotSameTarget =>
case VehicleAction.LoadVehicle(vehicle, vtype, vguid, vdata) if isNotSameTarget =>
//this is not be suitable for vehicles with people who are seated in it before it spawns (if that is possible)
sendResponse(ObjectCreateMessage(vtype, vguid, vdata))
Vehicles.ReloadAccessPermissions(vehicle, player.Name)
case VehicleResponse.ObjectDelete(itemGuid) if isNotSameTarget =>
case VehicleAction.ObjectDelete(itemGuid) if isNotSameTarget =>
sendResponse(ObjectDeleteMessage(itemGuid, unk1=0))
case VehicleResponse.PlanetsideAttribute(vehicleGuid, attributeType, attributeValue) if isNotSameTarget =>
case VehicleAction.PlanetsideAttribute(vehicleGuid, attributeType, attributeValue) if isNotSameTarget =>
sendResponse(PlanetsideAttributeMessage(vehicleGuid, attributeType, attributeValue))
case VehicleResponse.ResetSpawnPad(padGuid) =>
sendResponse(GenericObjectActionMessage(padGuid, code=23))
case VehicleResponse.RevealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=10))
case VehicleResponse.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget =>
case VehicleAction.SeatPermissions(vehicleGuid, seatGroup, permission) if isNotSameTarget =>
sendResponse(PlanetsideAttributeMessage(vehicleGuid, seatGroup, permission))
case VehicleResponse.UnloadVehicle(_, vehicleGuid) =>
case VehicleAction.UnloadVehicle(_, vehicleGuid) =>
sendResponse(ObjectDeleteMessage(vehicleGuid, unk1=1))
case VehicleResponse.UnstowEquipment(itemGuid) if isNotSameTarget =>
case VehicleAction.UnstowEquipment(itemGuid) if isNotSameTarget =>
//TODO prefer ObjectDetachMessage, but how to force ammo pools to update properly?
sendResponse(ObjectDeleteMessage(itemGuid, unk1=0))
case VehicleResponse.UpdateAmsSpawnPoint(list) =>
case VehicleAction.UpdateAmsSpawnList(list) =>
sessionLogic.zoning.spawn.amsSpawnPoints = list.filter(tube => tube.Faction == player.Faction)
sessionLogic.zoning.spawn.DrawCurrentAmsSpawnPoint()
case VehicleResponse.KickCargo(vehicle, speed, delay)
case VehicleAction.KickCargo(vehicle, speed, delay)
if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive && speed > 0 =>
val strafe = 1 + Vehicles.CargoOrientation(vehicle)
val reverseSpeed = if (strafe > 1) { 0 } else { speed }
@ -230,17 +208,40 @@ class VehicleHandlerLogic(val ops: SessionVehicleHandlers, implicit val context:
context.system.scheduler.scheduleOnce(
delay milliseconds,
context.self,
VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleResponse.KickCargo(vehicle, speed=0, delay))
VehicleServiceResponse(toChannel, PlanetSideGUID(0), VehicleAction.KickCargo(vehicle, speed=0, delay))
)
case VehicleResponse.KickCargo(cargo, _, _)
case VehicleAction.KickCargo(cargo, _, _)
if player.VehicleSeated.nonEmpty && sessionLogic.zoning.spawn.deadState == DeadState.Alive =>
sessionLogic.vehicles.TotalDriverVehicleControl(cargo)
case VehicleResponse.ServerVehicleOverrideEnd(vehicle, _) =>
case VehicleSpawnPad.AttachToRails(vehicle, pad) =>
sendResponse(ObjectAttachMessage(pad.GUID, vehicle.GUID, slot=3))
case VehicleSpawnPad.ConcealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=9))
case VehicleSpawnPad.DetachFromRails(vehicle, pad) =>
val padDefinition = pad.Definition
sendResponse(
ObjectDetachMessage(
pad.GUID,
vehicle.GUID,
pad.Position + Vector3.z(padDefinition.VehicleCreationZOffset),
pad.Orientation.z + padDefinition.VehicleCreationZOrientOffset
)
)
case VehicleSpawnPad.ResetSpawnPad(pad) =>
sendResponse(GenericObjectActionMessage(pad.GUID, code=23))
case VehicleSpawnPad.RevealPlayer(playerGuid) =>
sendResponse(GenericObjectActionMessage(playerGuid, code=10))
case VehicleSpawnPad.ServerVehicleOverrideEnd(vehicle, _) =>
sessionLogic.vehicles.ServerVehicleOverrideStop(vehicle)
case VehicleResponse.ChangeLoadout(target, oldWeapons, _, oldInventory, _) =>
case VehicleAction.ChangeLoadout(target, oldWeapons, _, oldInventory, _) =>
//TODO when vehicle weapons can be changed without visual glitches, rewrite this
continent.GUID(target).collect { case vehicle: Vehicle =>
changeLoadoutDeleteOldEquipment(vehicle, oldWeapons, oldInventory)

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

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.packet.game.HackState1
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.PlanetSideGUID
import scala.annotation.unused
@ -100,7 +99,7 @@ class FieldTurretControl(turret: TurretDeployable)
turret.Shields = turret.Shields + amount
turret.Zone.VehicleEvents ! VehicleServiceMessage(
s"${turret.Actor}",
VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), turret.GUID, turret.Definition.shieldUiAttribute, turret.Shields)
VehicleAction.PlanetsideAttribute(turret.GUID, turret.Definition.shieldUiAttribute, turret.Shields)
)
}
}

View file

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

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

View file

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

View file

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -5,6 +5,7 @@ import net.psforever.objects.serverobject.interior.Sidedness
import net.psforever.objects.{Player, Vehicle}
import net.psforever.objects.serverobject.structures.Amenity
import net.psforever.objects.serverobject.terminals.Terminal
import net.psforever.services.base.SelfResponseMessage
import net.psforever.types.PlanetSideGUID
/**
@ -25,7 +26,6 @@ class VehicleSpawnPad(spDef: VehicleSpawnPadDefinition) extends Amenity {
}
object VehicleSpawnPad {
/**
* Message to the spawn pad to enqueue the following vehicle order.
* This is the entry point to vehicle spawn pad functionality.
@ -39,14 +39,14 @@ object VehicleSpawnPad {
* @see `GenericObjectActionMessage`
* @param player_guid the player
*/
final case class ConcealPlayer(player_guid: PlanetSideGUID)
final case class ConcealPlayer(player_guid: PlanetSideGUID) extends SelfResponseMessage
/**
* Message is intended to undo the effects of the above message, `ConcealPlayer`.
* @see `ConcealPlayer`
* @param player_guid the player
*/
final case class RevealPlayer(player_guid: PlanetSideGUID)
final case class RevealPlayer(player_guid: PlanetSideGUID) extends SelfResponseMessage
/**
* Message to attach the vehicle to the spawn pad's lifting platform ("put on rails").
@ -55,7 +55,7 @@ object VehicleSpawnPad {
* @param vehicle the vehicle being spawned
* @param pad the spawn pad
*/
final case class AttachToRails(vehicle: Vehicle, pad: VehicleSpawnPad)
final case class AttachToRails(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage
/**
* Message to detach the vehicle from the spawn pad's lifting platform ("put on rails").
@ -63,72 +63,64 @@ object VehicleSpawnPad {
* @param vehicle the vehicle being spawned
* @param pad the spawn pad
*/
final case class DetachFromRails(vehicle: Vehicle, pad: VehicleSpawnPad)
final case class DetachFromRails(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage
/**
* Message that resets the spawn pad for its next order fulfillment operation by lowering the lifting platform.
* @see `GenericObjectActionMessage`
* @param pad the spawn pad
*/
final case class ResetSpawnPad(pad: VehicleSpawnPad)
final case class ResetSpawnPad(pad: VehicleSpawnPad) extends SelfResponseMessage
/**
* Message that acts as callback to the driver that the process of sitting in the driver mount will be initiated soon.
* This information should only be communicated to the driver's client only.
* @param driver_name the person who will drive the vehicle
* @param vehicle the vehicle being spawned
* @param pad the spawn pad
*/
final case class StartPlayerSeatedInVehicle(driver_name: String, vehicle: Vehicle, pad: VehicleSpawnPad)
final case class StartPlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage
/**
* Message that acts as callback to the driver that the process of sitting in the driver mount should be finished.
* This information should only be communicated to the driver's client only.
* @param driver_name the person who will drive the vehicle
* @param vehicle the vehicle being spawned
* @param pad the spawn pad
*/
final case class PlayerSeatedInVehicle(
driver_name: String,
vehicle: Vehicle,
pad: VehicleSpawnPad
) //TODO while using fake rails
//TODO while using fake rails (later edit: what does this mean?)
final case class PlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage
/**
* Message that starts the newly-spawned vehicle to begin driving away from the spawn pad.
* Information about the driving process is available on the vehicle itself.
* This information should only be communicated to the driver's client only.
* @see `VehicleDefinition`
* @param driver_name the person who will drive the vehicle
* @param vehicle the vehicle
* @param pad the spawn pad
*/
final case class ServerVehicleOverrideStart(driver_name: String, vehicle: Vehicle, pad: VehicleSpawnPad)
final case class ServerVehicleOverrideStart(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage
/**
* Message that transitions the newly-spawned vehicle into a cancellable auto-drive state.
* Information about the driving process is available on the vehicle itself.
* This information should only be communicated to the driver's client only.
* @see `VehicleDefinition`
* @param driver_name the person who will drive the vehicle
* @param vehicle the vehicle
* @param pad the spawn pad
*/
final case class ServerVehicleOverrideEnd(driver_name: String, vehicle: Vehicle, pad: VehicleSpawnPad)
final case class ServerVehicleOverrideEnd(vehicle: Vehicle, pad: VehicleSpawnPad) extends SelfResponseMessage
/**
* Message to initiate the process of properly disposing of the vehicle that may have been or was spawned into the game world.
* @param vehicle the vehicle
*/
final case class DisposeVehicle(vehicle: Vehicle)
final case class DisposeVehicle(vehicle: Vehicle) extends SelfResponseMessage
/**
* Message to send targeted messages to the clients of specific users.
* @param driver_name the person who will drive the vehicle
* @param reason the nature of the message
* @param data optional information for rendering the message to the client
*/
final case class PeriodicReminder(driver_name: String, reason: Reminders.Value, data: Option[Any] = None)
final case class PeriodicReminder(reason: Reminders.Value, data: Option[Any] = None) extends SelfResponseMessage
/**
* An `Enumeration` of reasons for sending a periodic reminder to the user.

View file

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

View file

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

View file

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

View file

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

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

View file

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

View file

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

View file

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

View file

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

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.zones.ZoneAware
import net.psforever.packet.game.InventoryStateMessage
import net.psforever.services.Service
import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage}
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
@ -379,7 +378,7 @@ object ProximityTerminalControl {
val zone = target.Zone
zone.VehicleEvents ! VehicleServiceMessage(
zone.id,
VehicleAction.PlanetsideAttribute(Service.defaultPlayerGUID, target.GUID, 0, target.Health)
VehicleAction.PlanetsideAttribute(target.GUID, 0, target.Health)
)
}
@ -466,7 +465,7 @@ object ProximityTerminalControl {
slots.foreach { slot =>
events ! VehicleServiceMessage(
channel,
VehicleAction.SendResponse(Service.defaultPlayerGUID, InventoryStateMessage(slot.Box.GUID, weapon.GUID, slot.Box.Capacity))
VehicleAction.SendResponse(InventoryStateMessage(slot.Box.GUID, weapon.GUID, slot.Box.Capacity))
)
}
}

View file

@ -149,7 +149,7 @@ class ImplantTerminalMechControl(mech: ImplantTerminalMech)
case player =>
seat.unmount(player)
player.VehicleSeated = None
events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, 4, unk2=false, guid))
events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(4, unk2=false, guid))
}
)
}
@ -277,7 +277,7 @@ class ImplantTerminalMechControl(mech: ImplantTerminalMech)
case player if test(player.Faction) =>
seat.unmount(player)
player.VehicleSeated = None
events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, 4, unk2 = false, guid))
events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(4, unk2 = false, guid))
}
)
}

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.vital.interaction.DamageResult
import net.psforever.packet.game.{ChangeFireModeMessage, HackState1}
import net.psforever.services.Service
import net.psforever.services.vehicle.support.TurretUpgrader
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.{BailType, PlanetSideEmpire, PlanetSideGUID}
@ -179,7 +178,7 @@ class FacilityTurretControl(turret: FacilityTurret)
seat.unmount(player)
player.VehicleSeated = None
if (player.HasGUID) {
events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, 4, unk2=false, guid))
events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(4, unk2=false, guid))
}
case None => ()
}
@ -239,7 +238,7 @@ class FacilityTurretControl(turret: FacilityTurret)
weapon.FireModeIndex = 0
events ! VehicleServiceMessage(
zoneid,
VehicleAction.SendResponse(Service.defaultPlayerGUID, ChangeFireModeMessage(weapon.GUID, 0))
VehicleAction.SendResponse(ChangeFireModeMessage(weapon.GUID, 0))
)
}
}
@ -341,7 +340,7 @@ class FacilityTurretControl(turret: FacilityTurret)
case player =>
seat.unmount(player)
player.VehicleSeated = None
events ! VehicleServiceMessage(zoneId, VehicleAction.KickPassenger(player.GUID, seat_num, unk2=true, guid))
events ! VehicleServiceMessage(zoneId, player.GUID, VehicleAction.KickPassenger(seat_num, unk2=true, guid))
}
}
captureTerminalChanges(terminal, super.captureTerminalIsHacked, actionDelays = 3000L)

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

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -27,7 +27,7 @@ class AvatarService(zone: Zone)
busName = "Avatar",
eventSupportServices = List(CorpseRemovalSupport, ItemRemoverSupport)
) {
protected def compose(msg: GenericMessageEnvelope): AvatarServiceResponse = {
protected def composeResponseEnvelope(msg: GenericMessageEnvelope): AvatarServiceResponse = {
AvatarServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response())
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -44,7 +44,7 @@ class LocalService(zone: Zone)
busName = "Local",
eventSupportServices = List(DoorCloserSupport, HackClearSupport, HackCaptureSupport, CaptureFlagSupport(zone))
) {
protected def compose(msg: GenericMessageEnvelope): LocalServiceResponse = {
protected def composeResponseEnvelope(msg: GenericMessageEnvelope): LocalServiceResponse = {
LocalServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response())
}
}

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
package net.psforever.services.vehicle
import akka.actor.{Actor, ActorRef, Props}
import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import akka.actor.{ActorContext, ActorRef, Props}
import net.psforever.objects.zones.Zone
import net.psforever.packet.game.ObjectCreateMessage
import net.psforever.packet.game.objectcreate.ObjectCreateMessageParent
import net.psforever.services.base.{EventServiceSupport, GenericEventServiceWithSupport, GenericMessageEnvelope}
import net.psforever.services.vehicle.support.TurretUpgrader
import net.psforever.types.DriveState
import net.psforever.services.Service
import net.psforever.services.base.bus.GenericEventBus
class VehicleService(zone: Zone) extends Actor {
private val turretUpgrade: ActorRef = context.actorOf(Props[TurretUpgrader](), s"${zone.id}-turret-upgrade-agent")
private[this] val log = org.log4s.getLogger
val VehicleEvents = new GenericEventBus[VehicleServiceResponse]
def receive: Receive = {
case Service.Join(channel) =>
val path = s"/$channel/Vehicle"
VehicleEvents.subscribe(sender(), path)
case Service.Leave(None) =>
VehicleEvents.unsubscribe(sender())
case Service.Leave(Some(channel)) =>
val path = s"/$channel/Vehicle"
VehicleEvents.unsubscribe(sender(), path)
case Service.LeaveAll() =>
VehicleEvents.unsubscribe(sender())
case VehicleServiceMessage(forChannel, action) =>
action match {
case VehicleAction.ChangeAmmo(player_guid, weapon_guid, weapon_slot, old_ammo_guid, ammo_id, ammo_guid, ammo_data) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.ChangeAmmo(weapon_guid, weapon_slot, old_ammo_guid, ammo_id, ammo_guid, ammo_data)
)
)
case VehicleAction.ChangeFireState_Start(player_guid, weapon_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.ChangeFireState_Start(weapon_guid)
)
)
case VehicleAction.ChangeFireState_Stop(player_guid, weapon_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.ChangeFireState_Stop(weapon_guid))
)
case VehicleAction.ChildObjectState(player_guid, object_guid, pitch, yaw) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.ChildObjectState(object_guid, pitch, yaw)
)
)
case VehicleAction.DeployRequest(player_guid, object_guid, state, unk1, unk2, pos) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.DeployRequest(object_guid, state, unk1, unk2, pos)
)
)
case VehicleAction.DismountVehicle(player_guid, bailType, unk2) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.DismountVehicle(bailType, unk2)
)
)
case VehicleAction.EquipmentInSlot(player_guid, target_guid, slot, equipment) =>
val definition = equipment.Definition
val pkt = ObjectCreateMessage(
definition.ObjectId,
equipment.GUID,
ObjectCreateMessageParent(target_guid, slot),
definition.Packet.ConstructorData(equipment).get
)
ObjectCreateMessageParent(target_guid, slot)
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.EquipmentInSlot(pkt))
)
case VehicleAction.FrameVehicleState(
player_guid,
vehicle_guid,
unk1,
pos,
orient,
vel,
unk2,
unk3,
unk4,
is_crouched,
unk6,
unk7,
unk8,
unk9,
unkA
) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.FrameVehicleState(
vehicle_guid,
unk1,
pos,
orient,
vel,
unk2,
unk3,
unk4,
is_crouched,
unk6,
unk7,
unk8,
unk9,
unkA
)
)
)
case VehicleAction.GenericObjectAction(player_guid, guid, code) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.GenericObjectAction(guid, code)
)
)
case VehicleAction.InventoryState(player_guid, obj, parent_guid, start, con_data) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.InventoryState(obj, parent_guid, start, con_data)
)
)
case VehicleAction.InventoryState2(player_guid, obj_guid, parent_guid, value) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.InventoryState2(obj_guid, parent_guid, value)
)
)
case VehicleAction.KickPassenger(player_guid, seat_num, kickedByDriver, vehicle_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.KickPassenger(seat_num, kickedByDriver, vehicle_guid)
)
)
case VehicleAction.ObjectDelete(guid) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.ObjectDelete(guid)
)
)
case VehicleAction.LoadVehicle(player_guid, vehicle, vtype, vguid, vdata) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.LoadVehicle(vehicle, vtype, vguid, vdata)
)
)
case VehicleAction.MountVehicle(player_guid, vehicle_guid, seat) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.MountVehicle(vehicle_guid, seat)
)
)
case VehicleAction.LoseOwnership(owner_guid, vehicle_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", Service.defaultPlayerGUID, VehicleResponse.LoseOwnership(owner_guid, vehicle_guid))
)
case VehicleAction.Ownership(player_guid, vehicle_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.Ownership(vehicle_guid))
)
case VehicleAction.PlanetsideAttribute(exclude_guid, target_guid, attribute_type, attribute_value) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
exclude_guid,
VehicleResponse.PlanetsideAttribute(target_guid, attribute_type, attribute_value)
)
)
case VehicleAction.Reload(player_guid, weapon_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.Reload(weapon_guid))
)
case VehicleAction.SeatPermissions(player_guid, vehicle_guid, seat_group, permission) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.SeatPermissions(vehicle_guid, seat_group, permission)
)
)
case VehicleAction.StowEquipment(player_guid, vehicle_guid, slot, item) =>
val definition = item.Definition
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.StowEquipment(
vehicle_guid,
slot,
definition.ObjectId,
item.GUID,
definition.Packet.DetailedConstructorData(item).get
)
)
)
case VehicleAction.WeaponDryFire(player_guid, weapon_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.WeaponDryFire(weapon_guid))
)
case VehicleAction.UnloadVehicle(player_guid, vehicle, vehicle_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.UnloadVehicle(vehicle, vehicle_guid)
)
)
case VehicleAction.UnstowEquipment(player_guid, item_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.UnstowEquipment(item_guid))
)
case VehicleAction.VehicleState(
player_guid,
vehicle_guid,
unk1,
pos,
ang,
vel,
unk2,
unk3,
unk4,
wheel_direction,
unk5,
unk6
) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.VehicleState(
vehicle_guid,
unk1,
pos,
ang,
vel,
unk2,
unk3,
unk4,
wheel_direction,
unk5,
unk6
)
)
)
case VehicleAction.SendResponse(player_guid, msg) =>
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.SendResponse(msg))
)
//unlike other messages, just return to sender, don't publish
case VehicleAction.UpdateAmsSpawnPoint(zone: Zone) =>
sender() ! VehicleServiceResponse(
s"/$forChannel/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.UpdateAmsSpawnPoint(AmsSpawnPoints(zone))
)
case VehicleAction.TransferPassengerChannel(
player_guid,
old_channel,
temp_channel,
vehicle,
vehicle_to_delete
) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
player_guid,
VehicleResponse.TransferPassengerChannel(old_channel, temp_channel, vehicle, vehicle_to_delete)
)
)
case VehicleAction.KickCargo(player_guid, cargo, speed, delay) =>
VehicleEvents.publish(
VehicleServiceResponse(s"/$forChannel/Vehicle", player_guid, VehicleResponse.KickCargo(cargo, speed, delay))
)
case VehicleAction.ChangeLoadout(target_guid, removed_weapons, new_weapons, old_inventory, new_inventory) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$forChannel/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.ChangeLoadout(target_guid, removed_weapons, new_weapons, old_inventory, new_inventory)
)
)
case _ => ;
}
//message to TurretUpgrader
case VehicleServiceMessage.TurretUpgrade(msg) =>
turretUpgrade forward msg
//from VehicleSpawnControl, etc.
case VehicleSpawnPad.ConcealPlayer(player_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/${zone.id}/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.ConcealPlayer(player_guid)
)
)
case VehicleSpawnPad.AttachToRails(vehicle, pad) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/${zone.id}/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.AttachToRails(vehicle.GUID, pad.GUID)
)
)
case VehicleSpawnPad.StartPlayerSeatedInVehicle(driver_name, vehicle, pad) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$driver_name/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.StartPlayerSeatedInVehicle(vehicle, pad)
)
)
case VehicleSpawnPad.PlayerSeatedInVehicle(driver_name, vehicle, pad) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$driver_name/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.PlayerSeatedInVehicle(vehicle, pad)
)
)
case VehicleSpawnPad.ServerVehicleOverrideStart(driver_name, vehicle, pad) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$driver_name/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.ServerVehicleOverrideStart(vehicle, pad)
)
)
case VehicleSpawnPad.ServerVehicleOverrideEnd(driver_name, vehicle, pad) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$driver_name/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.ServerVehicleOverrideEnd(vehicle, pad)
)
)
case VehicleSpawnPad.DetachFromRails(vehicle, pad) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/${zone.id}/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.DetachFromRails(vehicle.GUID, pad.GUID, pad.Position, pad.Orientation.z)
)
)
case VehicleSpawnPad.ResetSpawnPad(pad) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/${zone.id}/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.ResetSpawnPad(pad.GUID)
)
)
case VehicleSpawnPad.RevealPlayer(player_guid) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/${zone.id}/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.RevealPlayer(player_guid)
)
)
case VehicleSpawnPad.PeriodicReminder(to, reason, data) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/$to/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.PeriodicReminder(reason, data)
)
)
//correspondence from WorldSessionActor
case VehicleServiceMessage.AMSDeploymentChange(_) =>
VehicleEvents.publish(
VehicleServiceResponse(
s"/${zone.id}/Vehicle",
Service.defaultPlayerGUID,
VehicleResponse.UpdateAmsSpawnPoint(AmsSpawnPoints(zone))
)
)
case msg =>
log.warn(s"Unhandled message $msg from ${sender()}")
}
import net.psforever.objects.serverobject.tube.SpawnTube
def AmsSpawnPoints(zone: Zone): List[SpawnTube] = {
import net.psforever.objects.vehicles.UtilityType
import net.psforever.objects.GlobalDefinitions
zone.Vehicles
.filter(veh =>
veh.Health > 0 && veh.Definition == GlobalDefinitions.ams && veh.DeploymentState == DriveState.Deployed
)
.flatMap(veh => veh.Utilities.values.filter(util => util.UtilType == UtilityType.ams_respawn_tube))
.map(util => util().asInstanceOf[SpawnTube])
case object TurretUpgradeSupport
extends EventServiceSupport {
def label: String = "turretUpgrader"
def constructor(context: ActorContext): ActorRef = {
context.actorOf(Props[TurretUpgrader](), name = "TurretUpgrader")
}
}
class VehicleService(zone: Zone)
extends GenericEventServiceWithSupport[VehicleServiceResponse](
busName = "Vehicle",
eventSupportServices = List(TurretUpgradeSupport)
) {
protected def composeResponseEnvelope(msg: GenericMessageEnvelope): VehicleServiceResponse = {
VehicleServiceResponse(formatChannelOnBusName(msg.channel), msg.filter, msg.msg.response())
}
}

View file

@ -1,157 +1,19 @@
// Copyright (c) 2017 PSForever
package net.psforever.services.vehicle
import net.psforever.objects.{PlanetSideGameObject, Vehicle}
import net.psforever.objects.equipment.Equipment
import net.psforever.objects.inventory.InventoryItem
import net.psforever.objects.zones.Zone
import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.objectcreate.ConstructorData
import net.psforever.services.base.{EventMessage, EventResponse}
import net.psforever.types.{BailType, DriveState, PlanetSideGUID, Vector3}
import net.psforever.services.Service
import net.psforever.services.base.{EventMessage, GenericMessageEnvelope, GenericMessageToSupportEnvelopeOnly}
import net.psforever.types.PlanetSideGUID
final case class VehicleServiceMessage(forChannel: String, actionMessage: VehicleAction.Action)
final case class VehicleServiceMessage(channel: String, filter: PlanetSideGUID, msg: EventMessage)
extends GenericMessageEnvelope
final case class TurretMessage(supportMessage: Any)
extends GenericMessageToSupportEnvelopeOnly {
def supportLabel: String = "turretUpgrader"
}
object VehicleServiceMessage {
final case class GiveActorControl(vehicle: Vehicle, actorName: String)
final case class RevokeActorControl(vehicle: Vehicle)
final case class TurretUpgrade(msg: Any)
final case class AMSDeploymentChange(zone: Zone)
}
object VehicleAction {
trait Action extends EventMessage {
def response(): EventResponse = null
}
final case class ChangeAmmo(
player_guid: PlanetSideGUID,
weapon_guid: PlanetSideGUID,
weapon_slot: Int,
old_ammo_guid: PlanetSideGUID,
ammo_id: Int,
ammo_guid: PlanetSideGUID,
ammo_data: ConstructorData
) extends Action
final case class ChangeFireState_Start(player_guid: PlanetSideGUID, weapon_guid: PlanetSideGUID) extends Action
final case class ChangeFireState_Stop(player_guid: PlanetSideGUID, weapon_guid: PlanetSideGUID) extends Action
final case class ChildObjectState(player_guid: PlanetSideGUID, object_guid: PlanetSideGUID, pitch: Float, yaw: Float)
extends Action
final case class DeployRequest(
player_guid: PlanetSideGUID,
object_guid: PlanetSideGUID,
state: DriveState.Value,
unk1: Int,
unk2: Boolean,
pos: Vector3
) extends Action
final case class DismountVehicle(player_guid: PlanetSideGUID, bailType: BailType.Value, unk2: Boolean) extends Action
final case class EquipmentInSlot(
player_guid: PlanetSideGUID,
target_guid: PlanetSideGUID,
slot: Int,
equipment: Equipment
) extends Action
final case class FrameVehicleState(
player_guid: PlanetSideGUID,
vehicle_guid: PlanetSideGUID,
unk1: Int,
pos: Vector3,
orient: Vector3,
vel: Option[Vector3],
unk2: Boolean,
unk3: Int,
unk4: Int,
is_crouched: Boolean,
unk6: Boolean,
unk7: Boolean,
unk8: Int,
unk9: Long,
unkA: Long
) extends Action
final case class GenericObjectAction(player_guid: PlanetSideGUID, guid: PlanetSideGUID, action: Int) extends Action
final case class InventoryState(
player_guid: PlanetSideGUID,
obj: PlanetSideGameObject,
parent_guid: PlanetSideGUID,
start: Int,
con_data: ConstructorData
) extends Action
final case class InventoryState2(
player_guid: PlanetSideGUID,
obj_guid: PlanetSideGUID,
parent_guid: PlanetSideGUID,
value: Int
) extends Action
final case class KickPassenger(player_guid: PlanetSideGUID, unk1: Int, unk2: Boolean, vehicle_guid: PlanetSideGUID)
extends Action
final case class LoadVehicle(
player_guid: PlanetSideGUID,
vehicle: Vehicle,
vtype: Int,
vguid: PlanetSideGUID,
vdata: ConstructorData
) extends Action
final case class MountVehicle(player_guid: PlanetSideGUID, object_guid: PlanetSideGUID, seat: Int) extends Action
final case class ObjectDelete(guid: PlanetSideGUID) extends Action
final case class LoseOwnership(owner_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID) extends Action
final case class Ownership(player_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID) extends Action
final case class PlanetsideAttribute(
player_guid: PlanetSideGUID,
target_guid: PlanetSideGUID,
attribute_type: Int,
attribute_value: Long
) extends Action
final case class Reload(player_guid: PlanetSideGUID, weapon_guid: PlanetSideGUID) extends Action
final case class SeatPermissions(
player_guid: PlanetSideGUID,
vehicle_guid: PlanetSideGUID,
seat_group: Int,
permission: Long
) extends Action
final case class StowEquipment(player_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID, slot: Int, item: Equipment)
extends Action
final case class UnloadVehicle(
player_guid: PlanetSideGUID,
vehicle: Vehicle,
vehicle_guid: PlanetSideGUID
) extends Action
final case class UnstowEquipment(player_guid: PlanetSideGUID, item_guid: PlanetSideGUID) extends Action
final case class VehicleState(
player_guid: PlanetSideGUID,
vehicle_guid: PlanetSideGUID,
unk1: Int,
pos: Vector3,
ang: Vector3,
vel: Option[Vector3],
unk2: Option[Int],
unk3: Int,
unk4: Int,
wheel_direction: Int,
unk5: Boolean,
unk6: Boolean
) extends Action
final case class SendResponse(player_guid: PlanetSideGUID, msg: PlanetSideGamePacket) extends Action
final case class WeaponDryFire(player_guid: PlanetSideGUID, weapon_guid: PlanetSideGUID) extends Action
final case class UpdateAmsSpawnPoint(zone: Zone) extends Action
final case class TransferPassengerChannel(
player_guid: PlanetSideGUID,
temp_channel: String,
new_channel: String,
vehicle: Vehicle,
vehicle_to_delete: PlanetSideGUID
) extends Action
final case class KickCargo(player_guid: PlanetSideGUID, cargo: Vehicle, speed: Int, delay: Long) extends Action
final case class ChangeLoadout(
target_guid: PlanetSideGUID,
removed_weapons: List[(Equipment, PlanetSideGUID)],
new_weapons: List[InventoryItem],
old_inventory: List[(Equipment, PlanetSideGUID)],
new_inventory: List[InventoryItem]
) extends Action
def apply(channel: String, actionMessage: EventMessage): VehicleServiceMessage =
VehicleServiceMessage(channel, Service.defaultPlayerGUID, actionMessage)
}

View file

@ -1,141 +1,11 @@
// Copyright (c) 2017 PSForever
package net.psforever.services.vehicle
import net.psforever.objects.equipment.Equipment
import net.psforever.objects.inventory.InventoryItem
import net.psforever.objects.serverobject.pad.VehicleSpawnPad
import net.psforever.objects.serverobject.pad.VehicleSpawnPad.Reminders
import net.psforever.objects.{PlanetSideGameObject, Vehicle}
import net.psforever.objects.serverobject.tube.SpawnTube
import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.objectcreate.ConstructorData
import net.psforever.packet.game.ObjectCreateMessage
import net.psforever.types.{BailType, DriveState, PlanetSideGUID, Vector3}
import net.psforever.services.base.EventResponse
import net.psforever.services.base.bus.GenericEventBusResponse
import net.psforever.types.PlanetSideGUID
import net.psforever.services.base.{EventResponse, GenericResponseEnvelope}
final case class VehicleServiceResponse(
channel: String,
filter: PlanetSideGUID,
reply: VehicleResponse.Response
) extends GenericEventBusResponse
object VehicleResponse {
trait Response extends EventResponse
final case class ChangeAmmo(
weapon_guid: PlanetSideGUID,
weapon_slot: Int,
old_ammo_guid: PlanetSideGUID,
ammo_id: Int,
ammo_guid: PlanetSideGUID,
ammo_data: ConstructorData
) extends Response
final case class ChangeFireState_Start(weapon_guid: PlanetSideGUID) extends Response
final case class ChangeFireState_Stop(weapon_guid: PlanetSideGUID) extends Response
final case class ChildObjectState(object_guid: PlanetSideGUID, pitch: Float, yaw: Float) extends Response
final case class ConcealPlayer(player_guid: PlanetSideGUID) extends Response
final case class DeployRequest(
object_guid: PlanetSideGUID,
state: DriveState.Value,
unk1: Int,
unk2: Boolean,
pos: Vector3
) extends Response
final case class DismountVehicle(bailType: BailType.Value, unk2: Boolean) extends Response
final case class EquipmentInSlot(pkt: ObjectCreateMessage) extends Response
final case class FrameVehicleState(
vehicle_guid: PlanetSideGUID,
unk1: Int,
pos: Vector3,
orient: Vector3,
vel: Option[Vector3],
unk2: Boolean,
unk3: Int,
unk4: Int,
is_crouched: Boolean,
unk6: Boolean,
unk7: Boolean,
unk8: Int,
unk9: Long,
unkA: Long
) extends Response
final case class GenericObjectAction(guid: PlanetSideGUID, action: Int) extends Response
final case class HitHint(source_guid: PlanetSideGUID) extends Response
final case class InventoryState(
obj: PlanetSideGameObject,
parent_guid: PlanetSideGUID,
start: Int,
con_data: ConstructorData
) extends Response
final case class InventoryState2(obj_guid: PlanetSideGUID, parent_guid: PlanetSideGUID, value: Int) extends Response
final case class KickPassenger(seat_num: Int, kickedByDriver: Boolean, vehicle_guid: PlanetSideGUID) extends Response
final case class LoadVehicle(vehicle: Vehicle, vtype: Int, vguid: PlanetSideGUID, vdata: ConstructorData)
extends Response
final case class MountVehicle(object_guid: PlanetSideGUID, seat: Int) extends Response
final case class ObjectDelete(guid: PlanetSideGUID) extends Response
final case class Ownership(vehicle_guid: PlanetSideGUID) extends Response
final case class LoseOwnership(owner_guid: PlanetSideGUID, vehicle_guid: PlanetSideGUID)
extends Response
final case class PlanetsideAttribute(vehicle_guid: PlanetSideGUID, attribute_type: Int, attribute_value: Long)
extends Response
final case class Reload(weapon_guid: PlanetSideGUID) extends Response
final case class RevealPlayer(player_guid: PlanetSideGUID) extends Response
final case class SeatPermissions(vehicle_guid: PlanetSideGUID, seat_group: Int, permission: Long) extends Response
final case class StowEquipment(
vehicle_guid: PlanetSideGUID,
slot: Int,
itype: Int,
iguid: PlanetSideGUID,
idata: ConstructorData
) extends Response
final case class WeaponDryFire(weapon_guid: PlanetSideGUID) extends Response
final case class UnloadVehicle(vehicle: Vehicle, vehicle_guid: PlanetSideGUID) extends Response
final case class UnstowEquipment(item_guid: PlanetSideGUID) extends Response
final case class VehicleState(
vehicle_guid: PlanetSideGUID,
unk1: Int,
pos: Vector3,
ang: Vector3,
vel: Option[Vector3],
unk2: Option[Int],
unk3: Int,
unk4: Int,
wheel_direction: Int,
unk5: Boolean,
unk6: Boolean
) extends Response
final case class SendResponse(msg: PlanetSideGamePacket) extends Response
final case class UpdateAmsSpawnPoint(list: List[SpawnTube]) extends Response
final case class AttachToRails(vehicle_guid: PlanetSideGUID, rails_guid: PlanetSideGUID) extends Response
final case class StartPlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends Response
final case class PlayerSeatedInVehicle(vehicle: Vehicle, pad: VehicleSpawnPad) extends Response
final case class DetachFromRails(
vehicle_guid: PlanetSideGUID,
rails_guid: PlanetSideGUID,
rails_pos: Vector3,
rails_rot: Float
) extends Response
final case class ServerVehicleOverrideStart(vehicle: Vehicle, pad: VehicleSpawnPad) extends Response
final case class ServerVehicleOverrideEnd(vehicle: Vehicle, pad: VehicleSpawnPad) extends Response
final case class ResetSpawnPad(pad_guid: PlanetSideGUID) extends Response
final case class PeriodicReminder(reason: Reminders.Value, data: Option[Any] = None) extends Response
final case class TransferPassengerChannel(
old_channel: String,
temp_channel: String,
vehicle: Vehicle,
vehicle_to_delete: PlanetSideGUID
) extends Response
final case class KickCargo(cargo: Vehicle, speed: Int, delay: Long) extends Response
final case class ChangeLoadout(
target_guid: PlanetSideGUID,
removed_weapons: List[(Equipment, PlanetSideGUID)],
new_weapons: List[InventoryItem],
old_inventory: List[(Equipment, PlanetSideGUID)],
new_inventory: List[InventoryItem]
) extends Response
}
reply: EventResponse
) extends GenericResponseEnvelope

View file

@ -161,7 +161,8 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] {
if (tplayer.HasGUID) {
context.parent ! VehicleServiceMessage(
zoneId,
VehicleAction.KickPassenger(tplayer.GUID, 4, unk2=false, turretGUID)
tplayer.GUID,
VehicleAction.KickPassenger(4, unk2=false, turretGUID)
)
}
})
@ -235,7 +236,7 @@ class TurretUpgrader extends SupportActor[TurretUpgrader.Entry] {
case (index, Some(tool: Tool)) =>
context.parent ! VehicleServiceMessage(
zone.id,
VehicleAction.EquipmentInSlot(PlanetSideGUID(0), targetGUID, index, tool)
VehicleAction.EquipmentInSlot(targetGUID, index, tool)
)
}
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -79,9 +79,9 @@ class OwnershipTest extends ActorTest {
"pass Awareness" in {
val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service")
service ! Service.Join("test")
service ! VehicleServiceMessage("test", VehicleAction.Ownership(PlanetSideGUID(10), PlanetSideGUID(11)))
service ! VehicleServiceMessage("test", PlanetSideGUID(10), VehicleAction.Ownership(PlanetSideGUID(11)))
expectMsg(
VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.Ownership(PlanetSideGUID(11)))
VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleAction.Ownership(PlanetSideGUID(11)))
)
}
}
@ -96,13 +96,14 @@ class ChildObjectStateTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.ChildObjectState(PlanetSideGUID(10), PlanetSideGUID(11), 1.2f, 3.4f)
PlanetSideGUID(10),
VehicleAction.ChildObjectState(PlanetSideGUID(11), 1.2f, 3.4f)
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.ChildObjectState(PlanetSideGUID(11), 1.2f, 3.4f)
VehicleAction.ChildObjectState(PlanetSideGUID(11), 1.2f, 3.4f)
)
)
}
@ -118,20 +119,14 @@ class DeployRequestTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.DeployRequest(
PlanetSideGUID(10),
PlanetSideGUID(11),
DriveState.Mobile,
0,
false,
Vector3(1.2f, 3.4f, 5.6f)
)
PlanetSideGUID(10),
VehicleAction.DeployRequest(PlanetSideGUID(11), DriveState.Mobile, 0, false, Vector3(1.2f, 3.4f, 5.6f))
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.DeployRequest(PlanetSideGUID(11), DriveState.Mobile, 0, false, Vector3(1.2f, 3.4f, 5.6f))
VehicleAction.DeployRequest(PlanetSideGUID(11), DriveState.Mobile, 0, false, Vector3(1.2f, 3.4f, 5.6f))
)
)
}
@ -145,12 +140,12 @@ class DismountVehicleTest extends ActorTest {
"pass DismountVehicle" in {
val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service")
service ! Service.Join("test")
service ! VehicleServiceMessage("test", VehicleAction.DismountVehicle(PlanetSideGUID(10), BailType.Normal, false))
service ! VehicleServiceMessage("test", PlanetSideGUID(10), VehicleAction.DismountVehicle(BailType.Normal, false))
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.DismountVehicle(BailType.Normal, false)
VehicleAction.DismountVehicle(BailType.Normal, false)
)
)
}
@ -169,13 +164,14 @@ class InventoryStateTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.InventoryState(PlanetSideGUID(10), tool, PlanetSideGUID(11), 0, cdata)
PlanetSideGUID(10),
VehicleAction.InventoryState(tool, PlanetSideGUID(11), 0, cdata)
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.InventoryState(tool, PlanetSideGUID(11), 0, cdata)
VehicleAction.InventoryState(tool, PlanetSideGUID(11), 0, cdata)
)
)
}
@ -194,13 +190,14 @@ class InventoryState2Test extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.InventoryState2(PlanetSideGUID(10), PlanetSideGUID(11), PlanetSideGUID(12), 13)
PlanetSideGUID(10),
VehicleAction.InventoryState2(PlanetSideGUID(11), PlanetSideGUID(12), 13)
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.InventoryState2(PlanetSideGUID(11), PlanetSideGUID(12), 13)
VehicleAction.InventoryState2(PlanetSideGUID(11), PlanetSideGUID(12), 13)
)
)
}
@ -216,13 +213,14 @@ class KickPassengerTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.KickPassenger(PlanetSideGUID(10), 0, false, PlanetSideGUID(11))
PlanetSideGUID(10),
VehicleAction.KickPassenger(0, false, PlanetSideGUID(11))
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.KickPassenger(0, false, PlanetSideGUID(11))
VehicleAction.KickPassenger(0, false, PlanetSideGUID(11))
)
)
}
@ -241,13 +239,14 @@ class LoadVehicleTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.LoadVehicle(PlanetSideGUID(10), vehicle, 12, PlanetSideGUID(11), cdata)
PlanetSideGUID(10),
VehicleAction.LoadVehicle(vehicle, 12, PlanetSideGUID(11), cdata)
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.LoadVehicle(vehicle, 12, PlanetSideGUID(11), cdata)
VehicleAction.LoadVehicle(vehicle, 12, PlanetSideGUID(11), cdata)
)
)
}
@ -261,9 +260,9 @@ class MountVehicleTest extends ActorTest {
"pass MountVehicle" in {
val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service")
service ! Service.Join("test")
service ! VehicleServiceMessage("test", VehicleAction.MountVehicle(PlanetSideGUID(10), PlanetSideGUID(11), 0))
service ! VehicleServiceMessage("test", VehicleAction.MountVehicle(PlanetSideGUID(11), 0))
expectMsg(
VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.MountVehicle(PlanetSideGUID(11), 0))
VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleAction.MountVehicle(PlanetSideGUID(11), 0))
)
}
}
@ -278,13 +277,13 @@ class SeatPermissionsTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.SeatPermissions(PlanetSideGUID(10), PlanetSideGUID(11), 0, 12L)
VehicleAction.SeatPermissions(PlanetSideGUID(11), 0, 12L)
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.SeatPermissions(PlanetSideGUID(11), 0, 12L)
VehicleAction.SeatPermissions(PlanetSideGUID(11), 0, 12L)
)
)
}
@ -305,13 +304,14 @@ class StowEquipmentTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.StowEquipment(PlanetSideGUID(10), PlanetSideGUID(11), 0, tool)
PlanetSideGUID(10),
VehicleAction.StowEquipment(PlanetSideGUID(11), 0, tool)
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.StowEquipment(PlanetSideGUID(11), 0, toolDef.ObjectId, tool.GUID, cdata)
VehicleAction.StowEquipment(PlanetSideGUID(11), 0, toolDef.ObjectId, tool.GUID, cdata)
)
)
}
@ -325,9 +325,9 @@ class UnstowEquipmentTest extends ActorTest {
"pass UnstowEquipment" in {
val service = system.actorOf(Props(classOf[VehicleService], Zone.Nowhere), "v-service")
service ! Service.Join("test")
service ! VehicleServiceMessage("test", VehicleAction.UnstowEquipment(PlanetSideGUID(10), PlanetSideGUID(11)))
service ! VehicleServiceMessage("test", PlanetSideGUID(10), VehicleAction.UnstowEquipment(PlanetSideGUID(11)))
expectMsg(
VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.UnstowEquipment(PlanetSideGUID(11)))
VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleAction.UnstowEquipment(PlanetSideGUID(11)))
)
}
}
@ -342,26 +342,13 @@ class VehicleStateTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.VehicleState(
PlanetSideGUID(10),
PlanetSideGUID(11),
0,
Vector3(1.2f, 3.4f, 5.6f),
Vector3(7.8f, 9.1f, 2.3f),
Some(Vector3(4.5f, 6.7f, 8.9f)),
Option(1),
2,
3,
4,
false,
true
)
VehicleAction.VehicleState(PlanetSideGUID(11), 0, Vector3(1.2f, 3.4f, 5.6f), Vector3(7.8f, 9.1f, 2.3f), Some(Vector3(4.5f, 6.7f, 8.9f)), Option(1), 2, 3, 4, false, true)
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.VehicleState(
VehicleAction.VehicleState(
PlanetSideGUID(11),
0,
Vector3(1.2f, 3.4f, 5.6f),
@ -391,19 +378,14 @@ class TransferPassengerChannelTest extends ActorTest {
service ! Service.Join("test")
service ! VehicleServiceMessage(
"test",
VehicleAction.TransferPassengerChannel(
PlanetSideGUID(10),
"old_channel",
"new_channel",
fury,
PlanetSideGUID(11)
)
PlanetSideGUID(10),
VehicleAction.TransferPassengerChannel("old_channel", "new_channel", fury, PlanetSideGUID(11))
)
expectMsg(
VehicleServiceResponse(
"/test/Vehicle",
PlanetSideGUID(10),
VehicleResponse.TransferPassengerChannel("old_channel", "new_channel", fury, PlanetSideGUID(11))
VehicleAction.TransferPassengerChannel("old_channel", "new_channel", fury, PlanetSideGUID(11))
)
)
}
@ -418,7 +400,7 @@ class TransferPassengerChannelTest extends ActorTest {
// val service = system.actorOf(Props[VehicleService], "v-service")
// service ! Service.Join("test")
// service ! VehicleServiceMessage("test", VehicleAction.TransferPassenger(PlanetSideGUID(10), "temp_channel", fury, PlanetSideGUID(11)))
// expectMsg(VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleResponse.TransferPassenger("temp_channel", fury, PlanetSideGUID(11))))
// expectMsg(VehicleServiceResponse("/test/Vehicle", PlanetSideGUID(10), VehicleAction.TransferPassenger("temp_channel", fury, PlanetSideGUID(11))))
// }
// }
//}