Code Style Improvements (#1016)

* code style improvements for SessionData file

* refactored and simplified methods; added GenericAction case enum for smoother GenericActionMessage behavior; fixed timers for MAX unit

* 10 -> 11; suffixes for actions that are 'received' from the client
This commit is contained in:
Fate-JH 2023-02-10 23:40:16 -05:00 committed by GitHub
parent 335c4b2099
commit 40cf783f18
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 1792 additions and 1980 deletions

View file

@ -1415,7 +1415,11 @@ class AvatarActor(
updatePurchaseTimer( updatePurchaseTimer(
name, name,
cooldown.toSeconds, cooldown.toSeconds,
item.isInstanceOf[VehicleDefinition] item match {
case t: ToolDefinition => GlobalDefinitions.isMaxArms(t)
case _: VehicleDefinition => true
case _ => false
}
) )
case _ => ; case _ => ;
} }
@ -2574,13 +2578,17 @@ class AvatarActor(
avatar.cooldowns.purchase.find { case (name, _) => name.equals(key) } match { avatar.cooldowns.purchase.find { case (name, _) => name.equals(key) } match {
case Some((name, purchaseTime)) => case Some((name, purchaseTime)) =>
val secondsSincePurchase = Seconds.secondsBetween(purchaseTime, LocalDateTime.now()).getSeconds val secondsSincePurchase = Seconds.secondsBetween(purchaseTime, LocalDateTime.now()).getSeconds
Avatar.purchaseCooldowns.find(_._1.Name == name) match { Avatar.purchaseCooldowns.find(_._1.Name.equals(name)) match {
case Some((obj, cooldown)) if cooldown.toSeconds - secondsSincePurchase > 0 => case Some((obj, cooldown)) if cooldown.toSeconds - secondsSincePurchase > 0 =>
val (_, name) = AvatarActor.resolvePurchaseTimeName(avatar.faction, obj) val (_, name) = AvatarActor.resolvePurchaseTimeName(avatar.faction, obj)
updatePurchaseTimer( updatePurchaseTimer(
name, name,
cooldown.toSeconds - secondsSincePurchase, cooldown.toSeconds - secondsSincePurchase,
DefinitionUtil.fromString(name).isInstanceOf[VehicleDefinition] obj match {
case t: ToolDefinition => GlobalDefinitions.isMaxArms(t)
case _: VehicleDefinition => true
case _ => false
}
) )
case _ => case _ =>
@ -2595,9 +2603,9 @@ class AvatarActor(
} }
} }
def updatePurchaseTimer(name: String, time: Long, isActuallyAVehicle: Boolean): Unit = { def updatePurchaseTimer(name: String, time: Long, isActuallyAMachine: Boolean): Unit = {
sessionActor ! SessionActor.SendResponse( sessionActor ! SessionActor.SendResponse(
AvatarVehicleTimerMessage(session.get.player.GUID, name, time, isActuallyAVehicle) AvatarVehicleTimerMessage(session.get.player.GUID, name, time, isActuallyAMachine)
) )
} }

View file

@ -256,10 +256,10 @@ class SessionActor(middlewareActor: typed.ActorRef[MiddlewareActor.Command], con
sessionFuncs.zoning.spawn.performAvatarAwardMessageDelivery(pkts, delay) sessionFuncs.zoning.spawn.performAvatarAwardMessageDelivery(pkts, delay)
case CommonMessages.Progress(rate, finishedAction, stepAction) => case CommonMessages.Progress(rate, finishedAction, stepAction) =>
sessionFuncs.SetupProgressChange(rate, finishedAction, stepAction) sessionFuncs.setupProgressChange(rate, finishedAction, stepAction)
case SessionActor.ProgressEvent(delta, finishedAction, stepAction, tick) => case SessionActor.ProgressEvent(delta, finishedAction, stepAction, tick) =>
sessionFuncs.HandleProgressChange(delta, finishedAction, stepAction, tick) sessionFuncs.handleProgressChange(delta, finishedAction, stepAction, tick)
case CavernRotationService.CavernRotationServiceKey.Listing(listings) => case CavernRotationService.CavernRotationServiceKey.Listing(listings) =>
listings.head ! SendCavernRotationUpdates(context.self) listings.head ! SendCavernRotationUpdates(context.self)

View file

@ -114,7 +114,7 @@ class SessionAvatarHandlers(
sendResponse(DestroyMessage(victim, killer, weapon, pos)) sendResponse(DestroyMessage(victim, killer, weapon, pos))
case AvatarResponse.DestroyDisplay(killer, victim, method, unk) => case AvatarResponse.DestroyDisplay(killer, victim, method, unk) =>
sendResponse(sessionData.DestroyDisplayMessage(killer, victim, method, unk)) sendResponse(sessionData.destroyDisplayMessage(killer, victim, method, unk))
// TODO Temporary thing that should go somewhere else and use proper xp values // TODO Temporary thing that should go somewhere else and use proper xp values
if (killer.CharId == avatar.id && killer.Faction != victim.Faction) { if (killer.CharId == avatar.id && killer.Faction != victim.Faction) {
avatarActor ! AvatarActor.AwardBep((1000 * Config.app.game.bepRate).toLong) avatarActor ! AvatarActor.AwardBep((1000 * Config.app.game.bepRate).toLong)
@ -143,7 +143,7 @@ class SessionAvatarHandlers(
} }
case AvatarResponse.DropSpecialItem() => case AvatarResponse.DropSpecialItem() =>
sessionData.DropSpecialSlotItem() sessionData.dropSpecialSlotItem()
case AvatarResponse.Killed(mount) => case AvatarResponse.Killed(mount) =>
val cause = (player.LastDamage match { val cause = (player.LastDamage match {
@ -162,8 +162,8 @@ class SessionAvatarHandlers(
DropEquipmentFromInventory(player)(item) DropEquipmentFromInventory(player)(item)
case None => ; case None => ;
} }
sessionData.DropSpecialSlotItem() sessionData.dropSpecialSlotItem()
sessionData.ToggleMaxSpecialState(enable = false) sessionData.toggleMaxSpecialState(enable = false)
if (player.LastDamage match { if (player.LastDamage match {
case Some(damage) => damage.interaction.cause match { case Some(damage) => damage.interaction.cause match {
case cause: ExplodingEntityReason => cause.entity.isInstanceOf[VehicleSpawnPad] case cause: ExplodingEntityReason => cause.entity.isInstanceOf[VehicleSpawnPad]
@ -181,10 +181,10 @@ class SessionAvatarHandlers(
case Some(obj: Vehicle) => case Some(obj: Vehicle) =>
sessionData.vehicles.ConditionalDriverVehicleControl(obj) sessionData.vehicles.ConditionalDriverVehicleControl(obj)
sessionData.vehicles.serverVehicleControlVelocity = None sessionData.vehicles.serverVehicleControlVelocity = None
sessionData.UnaccessContainer(obj) sessionData.unaccessContainer(obj)
case _ => ; case _ => ;
} }
sessionData.PlayerActionsToCancel() sessionData.playerActionsToCancel()
sessionData.terminals.CancelAllProximityUnits() sessionData.terminals.CancelAllProximityUnits()
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel") sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel")
if (sessionData.shooting.shotsWhileDead > 0) { if (sessionData.shooting.shotsWhileDead > 0) {
@ -504,7 +504,7 @@ class SessionAvatarHandlers(
slot = 0 slot = 0
)) ))
} }
sessionData.ApplyPurchaseTimersBeforePackingLoadout(player, player, holsters ++ inventory) sessionData.applyPurchaseTimersBeforePackingLoadout(player, player, holsters ++ inventory)
DropLeftovers(player)(drops) DropLeftovers(player)(drops)
} else { } else {
//happening to some other player //happening to some other player

View file

@ -30,7 +30,7 @@ class SessionLocalHandlers(
} }
case LocalResponse.DeployableUIFor(item) => case LocalResponse.DeployableUIFor(item) =>
sessionData.UpdateDeployableUIElements(avatar.deployables.UpdateUIElement(item)) sessionData.updateDeployableUIElements(avatar.deployables.UpdateUIElement(item))
case LocalResponse.Detonate(dguid, _: BoomerDeployable) => case LocalResponse.Detonate(dguid, _: BoomerDeployable) =>
sendResponse(TriggerEffectMessage(dguid, "detonate_boomer")) sendResponse(TriggerEffectMessage(dguid, "detonate_boomer"))
@ -160,7 +160,7 @@ class SessionLocalHandlers(
sendResponse(ChatMsg(ChatMessageType.UNK_229, wideContents=false, "", msg, None)) sendResponse(ChatMsg(ChatMessageType.UNK_229, wideContents=false, "", msg, None))
case LocalResponse.RouterTelepadTransport(passenger_guid, src_guid, dest_guid) => case LocalResponse.RouterTelepadTransport(passenger_guid, src_guid, dest_guid) =>
sessionData.UseRouterTelepadEffect(passenger_guid, src_guid, dest_guid) sessionData.useRouterTelepadEffect(passenger_guid, src_guid, dest_guid)
case LocalResponse.SendResponse(msg) => case LocalResponse.SendResponse(msg) =>
sendResponse(msg) sendResponse(msg)
@ -189,7 +189,7 @@ class SessionLocalHandlers(
sendResponse(VehicleStateMessage(sguid, 0, pos, orient, None, Some(state), 0, 0, 15, is_decelerating=false, is_cloaked=false)) sendResponse(VehicleStateMessage(sguid, 0, pos, orient, None, Some(state), 0, 0, 15, is_decelerating=false, is_cloaked=false))
case LocalResponse.ToggleTeleportSystem(router, system_plan) => case LocalResponse.ToggleTeleportSystem(router, system_plan) =>
sessionData.ToggleTeleportSystem(router, system_plan) sessionData.toggleTeleportSystem(router, system_plan)
case LocalResponse.TriggerEffect(target_guid, effect, effectInfo, triggerLocation) => case LocalResponse.TriggerEffect(target_guid, effect, effectInfo, triggerLocation) =>
sendResponse(TriggerEffectMessage(target_guid, effect, effectInfo, triggerLocation)) sendResponse(TriggerEffectMessage(target_guid, effect, effectInfo, triggerLocation))

View file

@ -36,14 +36,14 @@ class SessionMountHandlers(
log.info(s"${player.Name} mounts an implant terminal") log.info(s"${player.Name} mounts an implant terminal")
sessionData.terminals.CancelAllProximityUnits() sessionData.terminals.CancelAllProximityUnits()
MountingAction(tplayer, obj, seat_number) MountingAction(tplayer, obj, seat_number)
sessionData.keepAliveFunc = sessionData.KeepAlivePersistence sessionData.keepAliveFunc = sessionData.keepAlivePersistence
case Mountable.CanMount(obj: Vehicle, seat_number, _) if obj.Definition == GlobalDefinitions.orbital_shuttle => case Mountable.CanMount(obj: Vehicle, seat_number, _) if obj.Definition == GlobalDefinitions.orbital_shuttle =>
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount") sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount")
log.info(s"${player.Name} mounts the orbital shuttle") log.info(s"${player.Name} mounts the orbital shuttle")
sessionData.terminals.CancelAllProximityUnits() sessionData.terminals.CancelAllProximityUnits()
MountingAction(tplayer, obj, seat_number) MountingAction(tplayer, obj, seat_number)
sessionData.keepAliveFunc = sessionData.KeepAlivePersistence sessionData.keepAliveFunc = sessionData.keepAlivePersistence
case Mountable.CanMount(obj: Vehicle, seat_number, _) => case Mountable.CanMount(obj: Vehicle, seat_number, _) =>
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount") sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount")
@ -72,10 +72,10 @@ class SessionMountHandlers(
} }
sendResponse(GenericObjectActionMessage(obj_guid, 11)) sendResponse(GenericObjectActionMessage(obj_guid, 11))
} else if (obj.WeaponControlledFromSeat(seat_number).isEmpty) { } else if (obj.WeaponControlledFromSeat(seat_number).isEmpty) {
sessionData.keepAliveFunc = sessionData.KeepAlivePersistence sessionData.keepAliveFunc = sessionData.keepAlivePersistence
} }
sessionData.AccessContainer(obj) sessionData.accessContainer(obj)
sessionData.UpdateWeaponAtSeatPosition(obj, seat_number) sessionData.updateWeaponAtSeatPosition(obj, seat_number)
MountingAction(tplayer, obj, seat_number) MountingAction(tplayer, obj, seat_number)
case Mountable.CanMount(obj: FacilityTurret, seat_number, _) => case Mountable.CanMount(obj: FacilityTurret, seat_number, _) =>
@ -86,7 +86,7 @@ class SessionMountHandlers(
obj.Zone.LocalEvents ! LocalServiceMessage(obj.Zone.id, LocalAction.SetEmpire(obj.GUID, player.Faction)) obj.Zone.LocalEvents ! LocalServiceMessage(obj.Zone.id, LocalAction.SetEmpire(obj.GUID, player.Faction))
} }
sendResponse(PlanetsideAttributeMessage(obj.GUID, 0, obj.Health)) sendResponse(PlanetsideAttributeMessage(obj.GUID, 0, obj.Health))
sessionData.UpdateWeaponAtSeatPosition(obj, seat_number) sessionData.updateWeaponAtSeatPosition(obj, seat_number)
MountingAction(tplayer, obj, seat_number) MountingAction(tplayer, obj, seat_number)
} else { } else {
log.warn( log.warn(
@ -98,7 +98,7 @@ class SessionMountHandlers(
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount") sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount")
log.info(s"${player.Name} mounts the ${obj.Definition.asInstanceOf[BasicDefinition].Name}") log.info(s"${player.Name} mounts the ${obj.Definition.asInstanceOf[BasicDefinition].Name}")
sendResponse(PlanetsideAttributeMessage(obj.GUID, 0, obj.Health)) sendResponse(PlanetsideAttributeMessage(obj.GUID, 0, obj.Health))
sessionData.UpdateWeaponAtSeatPosition(obj, seat_number) sessionData.updateWeaponAtSeatPosition(obj, seat_number)
MountingAction(tplayer, obj, seat_number) MountingAction(tplayer, obj, seat_number)
case Mountable.CanMount(obj: Mountable, _, _) => case Mountable.CanMount(obj: Mountable, _, _) =>
@ -152,7 +152,7 @@ class SessionMountHandlers(
case Mountable.CanDismount(obj: Vehicle, seat_num, _) if obj.Definition == GlobalDefinitions.droppod => case Mountable.CanDismount(obj: Vehicle, seat_num, _) if obj.Definition == GlobalDefinitions.droppod =>
log.info(s"${tplayer.Name} has landed on ${continent.id}") log.info(s"${tplayer.Name} has landed on ${continent.id}")
sessionData.UnaccessContainer(obj) sessionData.unaccessContainer(obj)
DismountAction(tplayer, obj, seat_num) DismountAction(tplayer, obj, seat_num)
obj.Actor ! Vehicle.Deconstruct() obj.Actor ! Vehicle.Deconstruct()
@ -168,7 +168,7 @@ class SessionMountHandlers(
} }
}") }")
sessionData.vehicles.ConditionalDriverVehicleControl(obj) sessionData.vehicles.ConditionalDriverVehicleControl(obj)
sessionData.UnaccessContainer(obj) sessionData.unaccessContainer(obj)
DismountAction(tplayer, obj, seat_num) DismountAction(tplayer, obj, seat_num)
} else { } else {
continent.VehicleEvents ! VehicleServiceMessage( continent.VehicleEvents ! VehicleServiceMessage(
@ -213,7 +213,7 @@ class SessionMountHandlers(
def MountingAction(tplayer: Player, obj: PlanetSideGameObject with Mountable, seatNum: Int): Unit = { def MountingAction(tplayer: Player, obj: PlanetSideGameObject with Mountable, seatNum: Int): Unit = {
val player_guid: PlanetSideGUID = tplayer.GUID val player_guid: PlanetSideGUID = tplayer.GUID
val obj_guid: PlanetSideGUID = obj.GUID val obj_guid: PlanetSideGUID = obj.GUID
sessionData.PlayerActionsToCancel() sessionData.playerActionsToCancel()
avatarActor ! AvatarActor.DeactivateActiveImplants() avatarActor ! AvatarActor.DeactivateActiveImplants()
avatarActor ! AvatarActor.SuspendStaminaRegeneration(3 seconds) avatarActor ! AvatarActor.SuspendStaminaRegeneration(3 seconds)
sendResponse(ObjectAttachMessage(obj_guid, player_guid, seatNum)) sendResponse(ObjectAttachMessage(obj_guid, player_guid, seatNum))

View file

@ -46,7 +46,6 @@ class SessionSquadHandlers(
* Upon leaving or disbanding a squad, this value is made false. * Upon leaving or disbanding a squad, this value is made false.
* Control switching between the `Avatar`-local and the `WorldSessionActor`-local variable is contingent on `squadUI` being populated. * Control switching between the `Avatar`-local and the `WorldSessionActor`-local variable is contingent on `squadUI` being populated.
*/ */
private[support] var lfsm: Boolean = false
private[support] var squadSetup: () => Unit = FirstTimeSquadSetup private[support] var squadSetup: () => Unit = FirstTimeSquadSetup
private var squadUpdateCounter: Int = 0 private var squadUpdateCounter: Int = 0
private val queuedSquadActions: Seq[() => Unit] = Seq(SquadUpdates, NoSquadUpdates, NoSquadUpdates, NoSquadUpdates) private val queuedSquadActions: Seq[() => Unit] = Seq(SquadUpdates, NoSquadUpdates, NoSquadUpdates, NoSquadUpdates)
@ -263,7 +262,6 @@ class SessionSquadHandlers(
GiveSquadColorsToSelf(value = 0) GiveSquadColorsToSelf(value = 0)
sendResponse(PlanetsideAttributeMessage(playerGuid, 32, 0)) //disassociate with member position in squad? sendResponse(PlanetsideAttributeMessage(playerGuid, 32, 0)) //disassociate with member position in squad?
sendResponse(PlanetsideAttributeMessage(playerGuid, 34, 4294967295L)) //unknown, perhaps unrelated? sendResponse(PlanetsideAttributeMessage(playerGuid, 34, 4294967295L)) //unknown, perhaps unrelated?
lfsm = false
avatarActor ! AvatarActor.SetLookingForSquad(false) avatarActor ! AvatarActor.SetLookingForSquad(false)
//a finalization? what does this do? //a finalization? what does this do?
sendResponse(SquadDefinitionActionMessage(PlanetSideGUID(0), 0, SquadAction.Unknown(18))) sendResponse(SquadDefinitionActionMessage(PlanetSideGUID(0), 0, SquadAction.Unknown(18)))
@ -291,9 +289,8 @@ class SessionSquadHandlers(
case SquadResponse.PromoteMember(squad, promotedPlayer, from_index) => case SquadResponse.PromoteMember(squad, promotedPlayer, from_index) =>
if (promotedPlayer != player.CharId) { if (promotedPlayer != player.CharId) {
//demoted from leader; no longer lfsm //demoted from leader; no longer lfsm
if (lfsm) { if (player.avatar.lookingForSquad) {
lfsm = false avatarActor ! AvatarActor.SetLookingForSquad(false)
AvatarActor.displayLookingForSquad(session, state = 0)
} }
} }
sendResponse(SquadMemberEvent(MemberEvent.Promote, squad.GUID.guid, promotedPlayer, position = 0)) sendResponse(SquadMemberEvent(MemberEvent.Promote, squad.GUID.guid, promotedPlayer, position = 0))

View file

@ -107,7 +107,7 @@ class SessionVehicleHandlers(
if (tplayer_guid == guid) { if (tplayer_guid == guid) {
val typeOfRide = continent.GUID(vehicle_guid) match { val typeOfRide = continent.GUID(vehicle_guid) match {
case Some(obj: Vehicle) => case Some(obj: Vehicle) =>
sessionData.UnaccessContainer(obj) sessionData.unaccessContainer(obj)
s"the ${obj.Definition.Name}'s seat by ${obj.OwnerName.getOrElse("the pilot")}" s"the ${obj.Definition.Name}'s seat by ${obj.OwnerName.getOrElse("the pilot")}"
case _ => case _ =>
s"${player.Sex.possessive} ride" s"${player.Sex.possessive} ride"
@ -236,7 +236,7 @@ class SessionVehicleHandlers(
case VehicleResponse.StartPlayerSeatedInVehicle(vehicle, _) => case VehicleResponse.StartPlayerSeatedInVehicle(vehicle, _) =>
val vehicle_guid = vehicle.GUID val vehicle_guid = vehicle.GUID
sessionData.PlayerActionsToCancel() sessionData.playerActionsToCancel()
sessionData.vehicles.serverVehicleControlVelocity = Some(0) sessionData.vehicles.serverVehicleControlVelocity = Some(0)
sessionData.terminals.CancelAllProximityUnits() sessionData.terminals.CancelAllProximityUnits()
if (player.VisibleSlots.contains(player.DrawnSlot)) { if (player.VisibleSlots.contains(player.DrawnSlot)) {
@ -298,7 +298,7 @@ class SessionVehicleHandlers(
sendResponse(ObjectDeleteMessage(eguid, 0)) sendResponse(ObjectDeleteMessage(eguid, 0))
TaskWorkflow.execute(GUIDTask.unregisterEquipment(continent.GUID, obj)) TaskWorkflow.execute(GUIDTask.unregisterEquipment(continent.GUID, obj))
} }
sessionData.ApplyPurchaseTimersBeforePackingLoadout(player, vehicle, added_weapons ++ new_inventory) sessionData.applyPurchaseTimersBeforePackingLoadout(player, vehicle, added_weapons ++ new_inventory)
//jammer or unjamm new weapons based on vehicle status //jammer or unjamm new weapons based on vehicle status
val vehicleJammered = vehicle.Jammed val vehicleJammered = vehicle.Jammed
added_weapons added_weapons
@ -320,7 +320,7 @@ class SessionVehicleHandlers(
(old_weapons ++ old_inventory).foreach { (old_weapons ++ old_inventory).foreach {
case (_, eguid) => sendResponse(ObjectDeleteMessage(eguid, 0)) case (_, eguid) => sendResponse(ObjectDeleteMessage(eguid, 0))
} }
sessionData.UpdateWeaponAtSeatPosition(vehicle, seatNum) sessionData.updateWeaponAtSeatPosition(vehicle, seatNum)
case None => case None =>
//observer: observe changes to external equipment //observer: observe changes to external equipment
old_weapons.foreach { case (_, eguid) => sendResponse(ObjectDeleteMessage(eguid, 0)) } old_weapons.foreach { case (_, eguid) => sendResponse(ObjectDeleteMessage(eguid, 0)) }

View file

@ -99,7 +99,7 @@ class VehicleOperations(
case _ => ; case _ => ;
} }
if (player.death_by == -1) { if (player.death_by == -1) {
sessionData.KickedByAdministration() sessionData.kickedByAdministration()
} }
} }
@ -197,7 +197,7 @@ class VehicleOperations(
case _ => ; case _ => ;
} }
if (player.death_by == -1) { if (player.death_by == -1) {
sessionData.KickedByAdministration() sessionData.kickedByAdministration()
} }
} }
@ -231,13 +231,13 @@ class VehicleOperations(
} }
//TODO status condition of "playing getting out of vehicle to allow for late packets without warning //TODO status condition of "playing getting out of vehicle to allow for late packets without warning
if (player.death_by == -1) { if (player.death_by == -1) {
sessionData.KickedByAdministration() sessionData.kickedByAdministration()
} }
} }
def handleVehicleSubState(pkt: VehicleSubStateMessage): Unit = { def handleVehicleSubState(pkt: VehicleSubStateMessage): Unit = {
val VehicleSubStateMessage(vehicle_guid, _, pos, ang, vel, unk1, _) = pkt val VehicleSubStateMessage(vehicle_guid, _, pos, ang, vel, unk1, _) = pkt
sessionData.ValidObject(vehicle_guid, decorator = "VehicleSubState") match { sessionData.validObject(vehicle_guid, decorator = "VehicleSubState") match {
case Some(obj: Vehicle) => case Some(obj: Vehicle) =>
import net.psforever.login.WorldSession.boolToInt import net.psforever.login.WorldSession.boolToInt
obj.Position = pos obj.Position = pos
@ -268,7 +268,7 @@ class VehicleOperations(
def handleMountVehicle(pkt: MountVehicleMsg): Unit = { def handleMountVehicle(pkt: MountVehicleMsg): Unit = {
val MountVehicleMsg(_, mountable_guid, entry_point) = pkt val MountVehicleMsg(_, mountable_guid, entry_point) = pkt
sessionData.ValidObject(mountable_guid, decorator = "MountVehicle") match { sessionData.validObject(mountable_guid, decorator = "MountVehicle") match {
case Some(obj: Mountable) => case Some(obj: Mountable) =>
obj.Actor ! Mountable.TryMount(player, entry_point) obj.Actor ! Mountable.TryMount(player, entry_point)
case Some(_) => case Some(_) =>
@ -341,8 +341,8 @@ class VehicleOperations(
case Some(obj_guid) => case Some(obj_guid) =>
( (
( (
sessionData.ValidObject(obj_guid, decorator = "DismountVehicle/Vehicle"), sessionData.validObject(obj_guid, decorator = "DismountVehicle/Vehicle"),
sessionData.ValidObject(player_guid, decorator = "DismountVehicle/Player") sessionData.validObject(player_guid, decorator = "DismountVehicle/Player")
) match { ) match {
case (vehicle @ Some(obj: Vehicle), tplayer) => case (vehicle @ Some(obj: Vehicle), tplayer) =>
if (obj.MountedIn.isEmpty) (vehicle, tplayer) else (None, None) if (obj.MountedIn.isEmpty) (vehicle, tplayer) else (None, None)

View file

@ -106,7 +106,7 @@ private[support] class WeaponAndProjectileOperations(
def handleChangeFireStateStart(pkt: ChangeFireStateMessage_Start)(implicit context: ActorContext): Unit = { def handleChangeFireStateStart(pkt: ChangeFireStateMessage_Start)(implicit context: ActorContext): Unit = {
val ChangeFireStateMessage_Start(item_guid) = pkt val ChangeFireStateMessage_Start(item_guid) = pkt
if (shooting.isEmpty) { if (shooting.isEmpty) {
sessionData.FindEquipment(item_guid) match { sessionData.findEquipment(item_guid) match {
case Some(tool: Tool) => case Some(tool: Tool) =>
if (tool.FireMode.RoundsPerShot == 0 || tool.Magazine > 0 || prefire.contains(item_guid)) { if (tool.FireMode.RoundsPerShot == 0 || tool.Magazine > 0 || prefire.contains(item_guid)) {
prefire -= item_guid prefire -= item_guid
@ -156,7 +156,7 @@ private[support] class WeaponAndProjectileOperations(
shootingStop += item_guid -> System.currentTimeMillis() shootingStop += item_guid -> System.currentTimeMillis()
shooting -= item_guid shooting -= item_guid
val pguid = player.GUID val pguid = player.GUID
sessionData.FindEquipment(item_guid) match { sessionData.findEquipment(item_guid) match {
case Some(tool: Tool) => case Some(tool: Tool) =>
//the decimator does not send a ChangeFireState_Start on the last shot; heaven knows why //the decimator does not send a ChangeFireState_Start on the last shot; heaven knows why
if ( if (
@ -259,7 +259,7 @@ private[support] class WeaponAndProjectileOperations(
def handleChangeAmmo(pkt: ChangeAmmoMessage): Unit = { def handleChangeAmmo(pkt: ChangeAmmoMessage): Unit = {
val ChangeAmmoMessage(item_guid, _) = pkt val ChangeAmmoMessage(item_guid, _) = pkt
val (thing, equipment) = sessionData.FindContainedEquipment() val (thing, equipment) = sessionData.findContainedEquipment()
if (equipment.isEmpty) { if (equipment.isEmpty) {
log.warn(s"ChangeAmmo: either can not find $item_guid or the object found was not Equipment") log.warn(s"ChangeAmmo: either can not find $item_guid or the object found was not Equipment")
} else { } else {
@ -286,7 +286,7 @@ private[support] class WeaponAndProjectileOperations(
def handleChangeFireMode(pkt: ChangeFireModeMessage): Unit = { def handleChangeFireMode(pkt: ChangeFireModeMessage): Unit = {
val ChangeFireModeMessage(item_guid, _/*fire_mode*/) = pkt val ChangeFireModeMessage(item_guid, _/*fire_mode*/) = pkt
sessionData.FindEquipment(item_guid) match { sessionData.findEquipment(item_guid) match {
case Some(obj: PlanetSideGameObject with FireModeSwitch[_]) => case Some(obj: PlanetSideGameObject with FireModeSwitch[_]) =>
val originalModeIndex = obj.FireModeIndex val originalModeIndex = obj.FireModeIndex
if (obj match { if (obj match {
@ -376,7 +376,7 @@ private[support] class WeaponAndProjectileOperations(
(hit_info match { (hit_info match {
case Some(hitInfo) => case Some(hitInfo) =>
val hitPos = hitInfo.hit_pos val hitPos = hitInfo.hit_pos
sessionData.ValidObject(hitInfo.hitobject_guid, decorator = "Hit/hitInfo") match { sessionData.validObject(hitInfo.hitobject_guid, decorator = "Hit/hitInfo") match {
case _ if projectile.profile == GlobalDefinitions.flail_projectile => case _ if projectile.profile == GlobalDefinitions.flail_projectile =>
val radius = projectile.profile.DamageRadius * projectile.profile.DamageRadius val radius = projectile.profile.DamageRadius * projectile.profile.DamageRadius
val targets = Zone.findAllTargets(hitPos)(continent, player, projectile.profile) val targets = Zone.findAllTargets(hitPos)(continent, player, projectile.profile)
@ -410,7 +410,7 @@ private[support] class WeaponAndProjectileOperations(
) => ) =>
ResolveProjectileInteraction(proj, DamageResolution.Hit, target, hitPos) match { ResolveProjectileInteraction(proj, DamageResolution.Hit, target, hitPos) match {
case Some(resprojectile) => case Some(resprojectile) =>
sessionData.HandleDealingDamage(target, resprojectile) sessionData.handleDealingDamage(target, resprojectile)
case None => ; case None => ;
} }
case _ => ; case _ => ;
@ -443,24 +443,24 @@ private[support] class WeaponAndProjectileOperations(
(DamageResolution.Splash, DamageResolution.Splash) (DamageResolution.Splash, DamageResolution.Splash)
} }
//direct_victim_uid //direct_victim_uid
sessionData.ValidObject(direct_victim_uid, decorator = "SplashHit/direct_victim") match { sessionData.validObject(direct_victim_uid, decorator = "SplashHit/direct_victim") match {
case Some(target: PlanetSideGameObject with FactionAffinity with Vitality) => case Some(target: PlanetSideGameObject with FactionAffinity with Vitality) =>
CheckForHitPositionDiscrepancy(projectile_guid, target.Position, target) CheckForHitPositionDiscrepancy(projectile_guid, target.Position, target)
ResolveProjectileInteraction(projectile, resolution1, target, target.Position) match { ResolveProjectileInteraction(projectile, resolution1, target, target.Position) match {
case Some(_projectile) => case Some(_projectile) =>
sessionData.HandleDealingDamage(target, _projectile) sessionData.handleDealingDamage(target, _projectile)
case None => ; case None => ;
} }
case _ => ; case _ => ;
} }
//other victims //other victims
targets.foreach(elem => { targets.foreach(elem => {
sessionData.ValidObject(elem.uid, decorator = "SplashHit/other_victims") match { sessionData.validObject(elem.uid, decorator = "SplashHit/other_victims") match {
case Some(target: PlanetSideGameObject with FactionAffinity with Vitality) => case Some(target: PlanetSideGameObject with FactionAffinity with Vitality) =>
CheckForHitPositionDiscrepancy(projectile_guid, explosion_pos, target) CheckForHitPositionDiscrepancy(projectile_guid, explosion_pos, target)
ResolveProjectileInteraction(projectile, resolution2, target, explosion_pos) match { ResolveProjectileInteraction(projectile, resolution2, target, explosion_pos) match {
case Some(_projectile) => case Some(_projectile) =>
sessionData.HandleDealingDamage(target, _projectile) sessionData.handleDealingDamage(target, _projectile)
case None => ; case None => ;
} }
case _ => ; case _ => ;
@ -495,12 +495,12 @@ private[support] class WeaponAndProjectileOperations(
def handleLashHit(pkt: LashMessage): Unit = { def handleLashHit(pkt: LashMessage): Unit = {
val LashMessage(_, _, victim_guid, projectile_guid, hit_pos, _) = pkt val LashMessage(_, _, victim_guid, projectile_guid, hit_pos, _) = pkt
sessionData.ValidObject(victim_guid, decorator = "Lash") match { sessionData.validObject(victim_guid, decorator = "Lash") match {
case Some(target: PlanetSideGameObject with FactionAffinity with Vitality) => case Some(target: PlanetSideGameObject with FactionAffinity with Vitality) =>
CheckForHitPositionDiscrepancy(projectile_guid, hit_pos, target) CheckForHitPositionDiscrepancy(projectile_guid, hit_pos, target)
ResolveProjectileInteraction(projectile_guid, DamageResolution.Lash, target, hit_pos) match { ResolveProjectileInteraction(projectile_guid, DamageResolution.Lash, target, hit_pos) match {
case Some(projectile) => case Some(projectile) =>
sessionData.HandleDealingDamage(target, projectile) sessionData.handleDealingDamage(target, projectile)
case None => ; case None => ;
} }
case _ => ; case _ => ;
@ -606,7 +606,7 @@ private[support] class WeaponAndProjectileOperations(
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_fire") sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_fire")
if (player.isShielded) { if (player.isShielded) {
// Cancel NC MAX shield if it's active // Cancel NC MAX shield if it's active
sessionData.ToggleMaxSpecialState(enable = false) sessionData.toggleMaxSpecialState(enable = false)
} }
val (o, tools) = FindContainedWeapon val (o, tools) = FindContainedWeapon
val (_, enabledTools) = FindEnabledWeaponsToHandleWeaponFireAccountability(o, tools) val (_, enabledTools) = FindEnabledWeaponsToHandleWeaponFireAccountability(o, tools)
@ -909,7 +909,7 @@ private[support] class WeaponAndProjectileOperations(
case Some(_) => case Some(_) =>
stowFunc(previousBox) stowFunc(previousBox)
case None => case None =>
sessionData.NormalItemDrop(player, continent)(previousBox) sessionData.normalItemDrop(player, continent)(previousBox)
} }
AmmoBox.Split(previousBox) match { AmmoBox.Split(previousBox) match {
case Nil | List(_) => ; //done (the former case is technically not possible) case Nil | List(_) => ; //done (the former case is technically not possible)
@ -935,7 +935,7 @@ private[support] class WeaponAndProjectileOperations(
*/ */
def FindDetectedProjectileTargets(targets: Iterable[PlanetSideGUID]): Iterable[String] = { def FindDetectedProjectileTargets(targets: Iterable[PlanetSideGUID]): Iterable[String] = {
targets targets
.map { sessionData.ValidObject(_, decorator="FindDetectedProjectileTargets") } .map { sessionData.validObject(_, decorator="FindDetectedProjectileTargets") }
.flatMap { .flatMap {
case Some(obj: Vehicle) if !obj.Cloaked => case Some(obj: Vehicle) if !obj.Cloaked =>
//TODO hint: vehicleService ! VehicleServiceMessage(s"${obj.Actor}", VehicleAction.ProjectileAutoLockAwareness(mode)) //TODO hint: vehicleService ! VehicleServiceMessage(s"${obj.Actor}", VehicleAction.ProjectileAutoLockAwareness(mode))
@ -1179,7 +1179,7 @@ private[support] class WeaponAndProjectileOperations(
* the second value is an `Tool` object in the former * the second value is an `Tool` object in the former
*/ */
def FindContainedWeapon: (Option[PlanetSideGameObject with Container], Set[Tool]) = { def FindContainedWeapon: (Option[PlanetSideGameObject with Container], Set[Tool]) = {
sessionData.FindContainedEquipment() match { sessionData.findContainedEquipment() match {
case (container, equipment) => case (container, equipment) =>
(container, equipment collect { case t: Tool => t }) (container, equipment collect { case t: Tool => t })
case _ => case _ =>

View file

@ -436,7 +436,7 @@ class ZoningOperations(
//the router won't work if it doesn't completely deploy //the router won't work if it doesn't completely deploy
sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Deploying, 0, unk3=false, Vector3.Zero)) sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Deploying, 0, unk3=false, Vector3.Zero))
sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Deployed, 0, unk3=false, Vector3.Zero)) sendResponse(DeployRequestMessage(player.GUID, obj.GUID, DriveState.Deployed, 0, unk3=false, Vector3.Zero))
sessionData.ToggleTeleportSystem(obj, TelepadLike.AppraiseTeleportationSystem(obj, continent)) sessionData.toggleTeleportSystem(obj, TelepadLike.AppraiseTeleportationSystem(obj, continent))
} }
ServiceManager.serviceManager ServiceManager.serviceManager
.ask(Lookup("hart"))(Timeout(2 seconds)) .ask(Lookup("hart"))(Timeout(2 seconds))
@ -709,9 +709,9 @@ class ZoningOperations(
} }
val previousZoningType = ztype val previousZoningType = ztype
CancelZoningProcess() CancelZoningProcess()
sessionData.PlayerActionsToCancel() sessionData.playerActionsToCancel()
sessionData.terminals.CancelAllProximityUnits() sessionData.terminals.CancelAllProximityUnits()
sessionData.DropSpecialSlotItem() sessionData.dropSpecialSlotItem()
continent.Population ! Zone.Population.Release(avatar) continent.Population ! Zone.Population.Release(avatar)
spawn.resolveZoningSpawnPointLoad(response, previousZoningType) spawn.resolveZoningSpawnPointLoad(response, previousZoningType)
} }
@ -812,13 +812,13 @@ class ZoningOperations(
zoningStatus = Zoning.Status.Request zoningStatus = Zoning.Status.Request
beginZoningCountdown(() => { beginZoningCountdown(() => {
log.info(s"Good-bye, ${player.Name}") log.info(s"Good-bye, ${player.Name}")
sessionData.ImmediateDisconnect() sessionData.immediateDisconnect()
}) })
} }
def handleSetZone(zoneId: String, position: Vector3): Unit = { def handleSetZone(zoneId: String, position: Vector3): Unit = {
if (sessionData.vehicles.serverVehicleControlVelocity.isEmpty) { if (sessionData.vehicles.serverVehicleControlVelocity.isEmpty) {
sessionData.PlayerActionsToCancel() sessionData.playerActionsToCancel()
continent.GUID(player.VehicleSeated) match { continent.GUID(player.VehicleSeated) match {
case Some(vehicle: Vehicle) if vehicle.MountedIn.isEmpty => case Some(vehicle: Vehicle) if vehicle.MountedIn.isEmpty =>
vehicle.PassengerInSeat(player) match { vehicle.PassengerInSeat(player) match {
@ -1092,13 +1092,13 @@ class ZoningOperations(
//sync hack state //sync hack state
amenity.Definition match { amenity.Definition match {
case GlobalDefinitions.capture_terminal => case GlobalDefinitions.capture_terminal =>
sessionData.SendPlanetsideAttributeMessage( sessionData.sendPlanetsideAttributeMessage(
amenity.GUID, amenity.GUID,
PlanetsideAttributeEnum.ControlConsoleHackUpdate, PlanetsideAttributeEnum.ControlConsoleHackUpdate,
HackCaptureActor.GetHackUpdateAttributeValue(amenity.asInstanceOf[CaptureTerminal], isResecured = false) HackCaptureActor.GetHackUpdateAttributeValue(amenity.asInstanceOf[CaptureTerminal], isResecured = false)
) )
case _ => case _ =>
sessionData.HackObject(amenity.GUID, 1114636288L, 8L) //generic hackable object sessionData.hackObject(amenity.GUID, 1114636288L, 8L) //generic hackable object
} }
// sync capture flags // sync capture flags
@ -1284,7 +1284,7 @@ class ZoningOperations(
ICS.FindZone(_.id == zoneId, context.self) ICS.FindZone(_.id == zoneId, context.self)
)) ))
} else { } else {
sessionData.UnaccessContainer(vehicle) sessionData.unaccessContainer(vehicle)
LoadZoneCommonTransferActivity() LoadZoneCommonTransferActivity()
player.VehicleSeated = vehicle.GUID player.VehicleSeated = vehicle.GUID
player.Continent = zoneId //forward-set the continent id to perform a test player.Continent = zoneId //forward-set the continent id to perform a test
@ -1430,7 +1430,7 @@ class ZoningOperations(
} }
avatarActor ! AvatarActor.SetVehicle(None) avatarActor ! AvatarActor.SetVehicle(None)
} }
sessionData.RemoveBoomerTriggersFromInventory().foreach(obj => { sessionData.removeBoomerTriggersFromInventory().foreach(obj => {
TaskWorkflow.execute(GUIDTask.unregisterObject(continent.GUID, obj)) TaskWorkflow.execute(GUIDTask.unregisterObject(continent.GUID, obj))
}) })
Deployables.Disown(continent, avatar, context.self) Deployables.Disown(continent, avatar, context.self)
@ -1452,7 +1452,7 @@ class ZoningOperations(
if (currentZone == Zones.sanctuaryZoneNumber(tplayer.Faction)) { if (currentZone == Zones.sanctuaryZoneNumber(tplayer.Faction)) {
log.error(s"RequestSanctuaryZoneSpawn: ${player.Name} is already in faction sanctuary zone.") log.error(s"RequestSanctuaryZoneSpawn: ${player.Name} is already in faction sanctuary zone.")
sendResponse(DisconnectMessage("RequestSanctuaryZoneSpawn: player is already in sanctuary.")) sendResponse(DisconnectMessage("RequestSanctuaryZoneSpawn: player is already in sanctuary."))
sessionData.ImmediateDisconnect() sessionData.immediateDisconnect()
} else { } else {
continent.GUID(player.VehicleSeated) match { continent.GUID(player.VehicleSeated) match {
case Some(obj: Vehicle) if !obj.Destroyed => case Some(obj: Vehicle) if !obj.Destroyed =>
@ -1485,7 +1485,7 @@ class ZoningOperations(
def LoadZoneLaunchDroppod(zone: Zone, spawnPosition: Vector3): Unit = { def LoadZoneLaunchDroppod(zone: Zone, spawnPosition: Vector3): Unit = {
log.info(s"${player.Name} is launching to ${zone.id} in ${player.Sex.possessive} droppod") log.info(s"${player.Name} is launching to ${zone.id} in ${player.Sex.possessive} droppod")
CancelZoningProcess() CancelZoningProcess()
sessionData.PlayerActionsToCancel() sessionData.playerActionsToCancel()
sessionData.terminals.CancelAllProximityUnits() sessionData.terminals.CancelAllProximityUnits()
//droppod action //droppod action
val droppod = Vehicle(GlobalDefinitions.droppod) val droppod = Vehicle(GlobalDefinitions.droppod)
@ -1780,7 +1780,7 @@ class ZoningOperations(
) match { ) match {
case (_, Some(p)) if p.death_by == -1 => case (_, Some(p)) if p.death_by == -1 =>
//player is not allowed //player is not allowed
sessionData.KickedByAdministration() sessionData.kickedByAdministration()
case (Some(a), Some(p)) if p.isAlive => case (Some(a), Some(p)) if p.isAlive =>
//rejoin current avatar/player //rejoin current avatar/player
@ -1831,7 +1831,7 @@ class ZoningOperations(
def handleLoginCanNot(name: String, reason: PlayerToken.DeniedLoginReason.Value): Unit = { def handleLoginCanNot(name: String, reason: PlayerToken.DeniedLoginReason.Value): Unit = {
log.warn(s"LoginInfo: $name is denied login for reason - $reason") log.warn(s"LoginInfo: $name is denied login for reason - $reason")
reason match { reason match {
case PlayerToken.DeniedLoginReason.Kicked => sessionData.KickedByAdministration() case PlayerToken.DeniedLoginReason.Kicked => sessionData.kickedByAdministration()
case _ => sendResponse(DisconnectMessage("You will be logged out.")) case _ => sendResponse(DisconnectMessage("You will be logged out."))
} }
} }
@ -1870,9 +1870,9 @@ class ZoningOperations(
} }
val previousZoningType = ztype val previousZoningType = ztype
CancelZoningProcess() CancelZoningProcess()
sessionData.PlayerActionsToCancel() sessionData.playerActionsToCancel()
sessionData.terminals.CancelAllProximityUnits() sessionData.terminals.CancelAllProximityUnits()
sessionData.DropSpecialSlotItem() sessionData.dropSpecialSlotItem()
continent.Population ! Zone.Population.Release(avatar) continent.Population ! Zone.Population.Release(avatar)
resolveZoningSpawnPointLoad(response, previousZoningType) resolveZoningSpawnPointLoad(response, previousZoningType)
} }
@ -1995,7 +1995,7 @@ class ZoningOperations(
* @param zone na * @param zone na
*/ */
def HandleReleaseAvatar(tplayer: Player, zone: Zone): Unit = { def HandleReleaseAvatar(tplayer: Player, zone: Zone): Unit = {
sessionData.keepAliveFunc = sessionData.KeepAlivePersistence sessionData.keepAliveFunc = sessionData.keepAlivePersistence
tplayer.Release tplayer.Release
tplayer.VehicleSeated match { tplayer.VehicleSeated match {
case None => case None =>
@ -2010,7 +2010,7 @@ class ZoningOperations(
def handleSetPosition(position: Vector3): Unit = { def handleSetPosition(position: Vector3): Unit = {
if (sessionData.vehicles.serverVehicleControlVelocity.isEmpty) { if (sessionData.vehicles.serverVehicleControlVelocity.isEmpty) {
sessionData.PlayerActionsToCancel() sessionData.playerActionsToCancel()
continent.GUID(player.VehicleSeated) match { continent.GUID(player.VehicleSeated) match {
case Some(vehicle: Vehicle) if vehicle.MountedIn.isEmpty => case Some(vehicle: Vehicle) if vehicle.MountedIn.isEmpty =>
vehicle.PassengerInSeat(player) match { vehicle.PassengerInSeat(player) match {
@ -2178,8 +2178,8 @@ class ZoningOperations(
sendResponse(ObjectCreateDetailedMessage(pdef.ObjectId, pguid, pdata)) sendResponse(ObjectCreateDetailedMessage(pdef.ObjectId, pguid, pdata))
if (seat == 0 || vehicle.WeaponControlledFromSeat(seat).nonEmpty) { if (seat == 0 || vehicle.WeaponControlledFromSeat(seat).nonEmpty) {
sendResponse(ObjectAttachMessage(vguid, pguid, seat)) sendResponse(ObjectAttachMessage(vguid, pguid, seat))
sessionData.AccessContainer(vehicle) sessionData.accessContainer(vehicle)
sessionData.UpdateWeaponAtSeatPosition(vehicle, seat) sessionData.updateWeaponAtSeatPosition(vehicle, seat)
} else { } else {
interimUngunnedVehicle = Some(vguid) interimUngunnedVehicle = Some(vguid)
interimUngunnedVehicleSeat = Some(seat) interimUngunnedVehicleSeat = Some(seat)
@ -2253,8 +2253,8 @@ class ZoningOperations(
log.debug(s"AvatarRejoin: ${player.Name} - $pguid -> $pdata") log.debug(s"AvatarRejoin: ${player.Name} - $pguid -> $pdata")
if (seat == 0 || vehicle.WeaponControlledFromSeat(seat).nonEmpty) { if (seat == 0 || vehicle.WeaponControlledFromSeat(seat).nonEmpty) {
sendResponse(ObjectAttachMessage(vguid, pguid, seat)) sendResponse(ObjectAttachMessage(vguid, pguid, seat))
sessionData.AccessContainer(vehicle) sessionData.accessContainer(vehicle)
sessionData.UpdateWeaponAtSeatPosition(vehicle, seat) sessionData.updateWeaponAtSeatPosition(vehicle, seat)
} else { } else {
interimUngunnedVehicle = Some(vguid) interimUngunnedVehicle = Some(vguid)
interimUngunnedVehicleSeat = Some(seat) interimUngunnedVehicleSeat = Some(seat)
@ -2322,7 +2322,7 @@ class ZoningOperations(
case Some(_) | None => ; case Some(_) | None => ;
} }
}) })
sessionData.RemoveBoomerTriggersFromInventory().foreach(trigger => { sessionData.NormalItemDrop(obj, continent)(trigger) }) sessionData.removeBoomerTriggersFromInventory().foreach(trigger => { sessionData.normalItemDrop(obj, continent)(trigger) })
} }
} }
@ -2647,7 +2647,7 @@ class ZoningOperations(
sessionData.keepAliveFunc = sessionData.vehicles.GetMountableAndSeat(None, player, continent) match { sessionData.keepAliveFunc = sessionData.vehicles.GetMountableAndSeat(None, player, continent) match {
case (Some(v: Vehicle), Some(seatNumber)) case (Some(v: Vehicle), Some(seatNumber))
if seatNumber > 0 && v.WeaponControlledFromSeat(seatNumber).isEmpty => if seatNumber > 0 && v.WeaponControlledFromSeat(seatNumber).isEmpty =>
sessionData.KeepAlivePersistence sessionData.keepAlivePersistence
case _ => case _ =>
NormalKeepAlive NormalKeepAlive
} }
@ -2674,7 +2674,7 @@ class ZoningOperations(
log.trace(s"HandleSetCurrentAvatar - ${tplayer.Name}") log.trace(s"HandleSetCurrentAvatar - ${tplayer.Name}")
session = session.copy(player = tplayer) session = session.copy(player = tplayer)
val guid = tplayer.GUID val guid = tplayer.GUID
sessionData.UpdateDeployableUIElements(Deployables.InitializeDeployableUIElements(avatar)) sessionData.updateDeployableUIElements(Deployables.InitializeDeployableUIElements(avatar))
sendResponse(PlanetsideAttributeMessage(PlanetSideGUID(0), 75, 0)) sendResponse(PlanetsideAttributeMessage(PlanetSideGUID(0), 75, 0))
sendResponse(SetCurrentAvatarMessage(guid, 0, 0)) sendResponse(SetCurrentAvatarMessage(guid, 0, 0))
sendResponse(ChatMsg(ChatMessageType.CMT_EXPANSIONS, wideContents=true, "", "1 on", None)) //CC on //TODO once per respawn? sendResponse(ChatMsg(ChatMessageType.CMT_EXPANSIONS, wideContents=true, "", "1 on", None)) //CC on //TODO once per respawn?
@ -2717,7 +2717,7 @@ class ZoningOperations(
) //TODO will not always be "on" like this ) //TODO will not always be "on" like this
sendResponse(AvatarDeadStateMessage(DeadState.Alive, 0, 0, tplayer.Position, player.Faction, unk5 = true)) sendResponse(AvatarDeadStateMessage(DeadState.Alive, 0, 0, tplayer.Position, player.Faction, unk5 = true))
//looking for squad (members) //looking for squad (members)
if (tplayer.avatar.lookingForSquad || sessionData.squad.lfsm) { if (tplayer.avatar.lookingForSquad) {
sendResponse(PlanetsideAttributeMessage(guid, 53, 1)) sendResponse(PlanetsideAttributeMessage(guid, 53, 1))
continent.AvatarEvents ! AvatarServiceMessage(continent.id, AvatarAction.PlanetsideAttribute(guid, 53, 1)) continent.AvatarEvents ! AvatarServiceMessage(continent.id, AvatarAction.PlanetsideAttribute(guid, 53, 1))
} }
@ -3010,8 +3010,8 @@ class ZoningOperations(
case (Some(vehicle: Vehicle), Some(vguid), Some(seat)) => case (Some(vehicle: Vehicle), Some(vguid), Some(seat)) =>
//sit down //sit down
sendResponse(ObjectAttachMessage(vguid, pguid, seat)) sendResponse(ObjectAttachMessage(vguid, pguid, seat))
sessionData.AccessContainer(vehicle) sessionData.accessContainer(vehicle)
sessionData.keepAliveFunc = sessionData.KeepAlivePersistence sessionData.keepAliveFunc = sessionData.keepAlivePersistence
case _ => ; case _ => ;
//we can't find a vehicle? and we're still here? that's bad //we can't find a vehicle? and we're still here? that's bad
player.VehicleSeated = None player.VehicleSeated = None

View file

@ -1,6 +1,7 @@
// Copyright (c) 2017 PSForever // Copyright (c) 2017 PSForever
package net.psforever.objects.avatar package net.psforever.objects.avatar
import net.psforever.actors.session.AvatarActor
import net.psforever.objects.definition.{AvatarDefinition, BasicDefinition} import net.psforever.objects.definition.{AvatarDefinition, BasicDefinition}
import net.psforever.objects.equipment.{EquipmentSize, EquipmentSlot} import net.psforever.objects.equipment.{EquipmentSize, EquipmentSlot}
import net.psforever.objects.inventory.LocallyRegisteredInventory import net.psforever.objects.inventory.LocallyRegisteredInventory
@ -144,7 +145,8 @@ case class Avatar(
cooldowns: Map[BasicDefinition, FiniteDuration], cooldowns: Map[BasicDefinition, FiniteDuration],
definition: BasicDefinition definition: BasicDefinition
): Option[Duration] = { ): Option[Duration] = {
times.get(definition.Name) match { val (_, resolvedName) = AvatarActor.resolvePurchaseTimeName(faction, definition)
times.get(resolvedName) match {
case Some(purchaseTime) => case Some(purchaseTime) =>
val secondsSincePurchase = Seconds.secondsBetween(purchaseTime, LocalDateTime.now()) val secondsSincePurchase = Seconds.secondsBetween(purchaseTime, LocalDateTime.now())
cooldowns.get(definition) match { cooldowns.get(definition) match {

View file

@ -7,12 +7,12 @@ import scodec.Codec
import scodec.codecs._ import scodec.codecs._
/** /**
* @param player_guid player guid ! * @param player_guid player guid
* @param text name of the item or vehicle name (ex : medkit, fury ...) * @param text internal name of the item or vehicle name, e.g., medkit, fury, trhev_antipersonnel
* @param time in seconds * @param time cooldown/delay in seconds
* @param unk1 NA - Seems to be false when it's for medkit, true for vehicles * @param unk `true` for vehicles and max exo-suits; `false` for other items
*/ */
final case class AvatarVehicleTimerMessage(player_guid: PlanetSideGUID, text: String, time: Long, unk1: Boolean) final case class AvatarVehicleTimerMessage(player_guid: PlanetSideGUID, text: String, time: Long, unk: Boolean)
extends PlanetSideGamePacket { extends PlanetSideGamePacket {
type Packet = AvatarVehicleTimerMessage type Packet = AvatarVehicleTimerMessage
def opcode = GamePacketOpcode.AvatarVehicleTimerMessage def opcode = GamePacketOpcode.AvatarVehicleTimerMessage
@ -24,6 +24,6 @@ object AvatarVehicleTimerMessage extends Marshallable[AvatarVehicleTimerMessage]
("player_guid" | PlanetSideGUID.codec) :: ("player_guid" | PlanetSideGUID.codec) ::
("text" | PacketHelpers.encodedString) :: ("text" | PacketHelpers.encodedString) ::
("time" | uint32L) :: ("time" | uint32L) ::
("unk1" | bool) ("unk" | bool)
).as[AvatarVehicleTimerMessage] ).as[AvatarVehicleTimerMessage]
} }

View file

@ -2,76 +2,69 @@
package net.psforever.packet.game package net.psforever.packet.game
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket} import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
import enumeratum.values.{IntEnum, IntEnumEntry}
import scodec.Codec import scodec.Codec
import scodec.codecs._ import scodec.codecs._
sealed abstract class GenericAction(val value: Int) extends IntEnumEntry
object GenericAction extends IntEnum[GenericAction] {
val values: IndexedSeq[GenericAction] = findValues
final case object ShowMosquitoRadar extends GenericAction(value = 3)
final case object HideMosquitoRadar extends GenericAction(value = 4)
final case object MissileLock extends GenericAction(value = 7)
final case object WaspMissileLock extends GenericAction(value = 8)
final case object TRekLock extends GenericAction(value = 9)
final case object DropSpecialItem extends GenericAction(value = 11)
final case object FacilityCaptureFanfare extends GenericAction(value = 12)
final case object NewCharacterBasicTrainingPrompt extends GenericAction(value = 14)
final case object MaxAnchorsExtend_RCV extends GenericAction(value = 15)
final case object MaxAnchorsRelease_RCV extends GenericAction(value = 16)
final case object MaxSpecialEffect_RCV extends GenericAction(value = 20)
final case object StopMaxSpecialEffect_RCV extends GenericAction(value = 21)
final case object CavernFacilityCapture extends GenericAction(value = 22)
final case object CavernFacilityKill extends GenericAction(value = 23)
final case object Imprinted extends GenericAction(value = 24)
final case object NoLongerImprinted extends GenericAction(value = 25)
final case object PurchaseTimersReset extends GenericAction(value = 27)
final case object LeaveWarpQueue_RCV extends GenericAction(value = 28)
final case object AwayFromKeyboard_RCV extends GenericAction(value = 29)
final case object BackInGame_RCV extends GenericAction(value = 30)
final case object FirstPersonViewWithEffect extends GenericAction(value = 31)
final case object FirstPersonViewFailToDeconstruct extends GenericAction(value = 32)
final case object FailToDeconstruct extends GenericAction(value = 33)
final case object LookingForSquad_RCV extends GenericAction(value = 36)
final case object NotLookingForSquad_RCV extends GenericAction(value = 37)
final case object Unknown45 extends GenericAction(value = 45)
final case class Unknown(override val value: Int) extends GenericAction(value)
}
/** /**
* Reports that something has happened, or makes something happen.<br> * Reports that something has happened, or makes something happen.
* <br>
* When sent from the server to a client, there are twenty-seven individual actions caused by this packet.
* They are only vaguely organized by behavior and some numbers may not be associated with an action.
* When sent by the client to the server, an unknown number of actions are available.
* The highest known action is a server-sent 45.<br>
* <br>
* Actions (when sent from server):<br>
* 03 - symbol: show Mosquito radar<br>
* 04 - symbol: hide Mosquito radar<br>
* 07 - warning: missile lock<br>
* 08 - warning: Wasp missile lock<br>
* 09 - warning: T-REK lock<br>
* 11 - Drop special item e.g. LLU<br>
* 12 - sound: base captured fanfare<br>
* 14 - prompt: new character basic training<br>
* 15 - MAX Deploy<br>
* 16 - MAX Undeploy<br>
* 22 - message: awarded a cavern capture (updates cavern capture status)<br>
* 23 - award a cavern kill<br>
* 24 - message: you have been imprinted (updates imprinted status)<br>
* 25 - message: you are no longer imprinted (updates imprinted status)<br>
* 27 - event: purchase timers reset (does it?)<br>
* 31 - forced into first person view;
* in third person view, player character sinks into the ground; green deconstruction particle effect under feet<br>
* 32 - forced into first person view, attempt to deconstruct but fail;
* event: fail to deconstruct due to having a "parent vehicle"<br>
* 33 - event: fail to deconstruct<br>
* 43 - prompt: friendly fire in virtual reality zone<br>
* 45 - ?<br>
* <br>
* Actions (when sent from client):<br>
* 15 - Max anchor
* 16 - Max unanchor
* 20 - Client requests MAX special effect (NC shield and TR overdrive. VS jump jets are handled by the jump_thrust boolean on PlayerStateMessageUpstream)
* 21 - Disable MAX special effect (NC shield)
* 28 - Cancel warp queue (see: `DroppodLaunchResponseMessage`)<br>
* 29 - AFK<br>
* 30 - back in game<br>
* 36 - turn on "Looking for Squad"<br>
* 37 - turn off "Looking for Squad"
*
* @param action what this packet does * @param action what this packet does
*/ */
final case class GenericActionMessage(action: Int) extends PlanetSideGamePacket { final case class GenericActionMessage(action: GenericAction) extends PlanetSideGamePacket {
type Packet = GenericActionMessage type Packet = GenericActionMessage
def opcode = GamePacketOpcode.GenericActionMessage def opcode = GamePacketOpcode.GenericActionMessage
def encode = GenericActionMessage.encode(this) def encode = GenericActionMessage.encode(this)
} }
object GenericActionMessage extends Marshallable[GenericActionMessage] { object GenericActionMessage extends Marshallable[GenericActionMessage] {
def apply(action: GenericActionEnum.GenericActionEnum): GenericActionMessage = { def apply(i: Int): GenericActionMessage = {
GenericActionMessage(action.id) GenericActionMessage(GenericAction.values.find { _.value == i } match {
case Some(enum) => enum
case None => GenericAction.Unknown(i)
})
} }
implicit val codec: Codec[GenericActionMessage] = ( private val genericActionCodec = uint(bits = 6).xmap[GenericAction]({
"action" | uint(6) i => GenericAction.values.find { _.value == i } match {
).as[GenericActionMessage] case Some(enum) => enum
} case None => GenericAction.Unknown(i)
}
object GenericActionEnum extends Enumeration { }, enum => enum.value)
type GenericActionEnum = Value
implicit val codec: Codec[GenericActionMessage] = ("action" | genericActionCodec).as[GenericActionMessage]
/** Drop special item e.g. LLU */
val DropSpecialItem = Value(11)
/** Plays the base capture fanfare sound */
val BaseCaptureFanfare = Value(12)
} }

View file

@ -11,10 +11,9 @@ import net.psforever.objects.vehicles.Utility
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
import net.psforever.objects.{PlanetSideGameObject, TelepadDeployable, Vehicle} import net.psforever.objects.{PlanetSideGameObject, TelepadDeployable, Vehicle}
import net.psforever.packet.PlanetSideGamePacket import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.GenericActionEnum.GenericActionEnum
import net.psforever.packet.game.GenericObjectActionEnum.GenericObjectActionEnum import net.psforever.packet.game.GenericObjectActionEnum.GenericObjectActionEnum
import net.psforever.packet.game.PlanetsideAttributeEnum.PlanetsideAttributeEnum import net.psforever.packet.game.PlanetsideAttributeEnum.PlanetsideAttributeEnum
import net.psforever.packet.game.{ChatMsg, DeployableInfo, DeploymentAction, TriggeredSound} import net.psforever.packet.game.{ChatMsg, DeployableInfo, DeploymentAction, GenericAction, TriggeredSound}
import net.psforever.services.hart.HartTimer.OrbitalShuttleEvent import net.psforever.services.hart.HartTimer.OrbitalShuttleEvent
import net.psforever.types.{PlanetSideEmpire, PlanetSideGUID, Vector3} import net.psforever.types.{PlanetSideEmpire, PlanetSideGUID, Vector3}
@ -82,7 +81,7 @@ object LocalAction {
final case class SendGenericActionMessage( final case class SendGenericActionMessage(
player_guid: PlanetSideGUID, player_guid: PlanetSideGUID,
action_number: GenericActionEnum action_number: GenericAction
) extends Action ) extends Action
final case class RouterTelepadMessage(msg: String) extends Action final case class RouterTelepadMessage(msg: String) extends Action
final case class RouterTelepadTransport( final case class RouterTelepadTransport(

View file

@ -6,7 +6,6 @@ import net.psforever.objects.{PlanetSideGameObject, TelepadDeployable, Vehicle}
import net.psforever.objects.ce.{Deployable, DeployedItem} import net.psforever.objects.ce.{Deployable, DeployedItem}
import net.psforever.objects.serverobject.terminals.{ProximityUnit, Terminal} import net.psforever.objects.serverobject.terminals.{ProximityUnit, Terminal}
import net.psforever.objects.vehicles.Utility import net.psforever.objects.vehicles.Utility
import net.psforever.packet.game.GenericActionEnum.GenericActionEnum
import net.psforever.packet.game.GenericObjectActionEnum.GenericObjectActionEnum import net.psforever.packet.game.GenericObjectActionEnum.GenericObjectActionEnum
import net.psforever.packet.game.PlanetsideAttributeEnum.PlanetsideAttributeEnum import net.psforever.packet.game.PlanetsideAttributeEnum.PlanetsideAttributeEnum
import net.psforever.packet.PlanetSideGamePacket import net.psforever.packet.PlanetSideGamePacket
@ -44,7 +43,7 @@ object LocalResponse {
final case class SendGenericObjectActionMessage(target_guid: PlanetSideGUID, action_number: GenericObjectActionEnum) final case class SendGenericObjectActionMessage(target_guid: PlanetSideGUID, action_number: GenericObjectActionEnum)
extends Response extends Response
final case class SendChatMsg(msg: ChatMsg) extends Response final case class SendChatMsg(msg: ChatMsg) extends Response
final case class SendGenericActionMessage(action_num: GenericActionEnum) extends Response final case class SendGenericActionMessage(action_num: GenericAction) extends Response
final case class LluSpawned(llu: CaptureFlag) extends Response final case class LluSpawned(llu: CaptureFlag) extends Response
final case class LluDespawned(llu: CaptureFlag) extends Response final case class LluDespawned(llu: CaptureFlag) extends Response

View file

@ -9,7 +9,7 @@ import net.psforever.objects.serverobject.structures.Building
import net.psforever.objects.serverobject.terminals.capture.CaptureTerminal import net.psforever.objects.serverobject.terminals.capture.CaptureTerminal
import net.psforever.objects.zones.Zone import net.psforever.objects.zones.Zone
import net.psforever.objects.{Default, GlobalDefinitions} import net.psforever.objects.{Default, GlobalDefinitions}
import net.psforever.packet.game.{GenericActionEnum, PlanetsideAttributeEnum} import net.psforever.packet.game.{GenericAction, PlanetsideAttributeEnum}
import net.psforever.services.local.{LocalAction, LocalServiceMessage} import net.psforever.services.local.{LocalAction, LocalServiceMessage}
import net.psforever.types.{PlanetSideEmpire, PlanetSideGUID} import net.psforever.types.{PlanetSideEmpire, PlanetSideGUID}
@ -212,7 +212,7 @@ class HackCaptureActor extends Actor {
building.Actor! BuildingActor.SetFaction(hackedByFaction) building.Actor! BuildingActor.SetFaction(hackedByFaction)
// todo: This should probably only go to those within the captured SOI who belong to the capturing faction // todo: This should probably only go to those within the captured SOI who belong to the capturing faction
building.Zone.LocalEvents ! LocalServiceMessage(building.Zone.id, LocalAction.SendGenericActionMessage(PlanetSideGUID(-1), GenericActionEnum.BaseCaptureFanfare)) building.Zone.LocalEvents ! LocalServiceMessage(building.Zone.id, LocalAction.SendGenericActionMessage(PlanetSideGUID(-1), GenericAction.FacilityCaptureFanfare))
} else { } else {
log.info("Base hack completed, but base was out of NTU.") log.info("Base hack completed, but base was out of NTU.")
} }

View file

@ -12,14 +12,14 @@ class GenericActionMessageTest extends Specification {
"decode" in { "decode" in {
PacketCoding.decodePacket(string).require match { PacketCoding.decodePacket(string).require match {
case GenericActionMessage(action) => case GenericActionMessage(action) =>
action mustEqual 37 action mustEqual GenericAction.NotLookingForSquad_RCV
case _ => case _ =>
ko ko
} }
} }
"encode" in { "encode" in {
val msg = GenericActionMessage(37) val msg = GenericActionMessage(GenericAction.NotLookingForSquad_RCV)
val pkt = PacketCoding.encodePacket(msg).require.toByteVector val pkt = PacketCoding.encodePacket(msg).require.toByteVector
pkt mustEqual string pkt mustEqual string