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(
name,
cooldown.toSeconds,
item.isInstanceOf[VehicleDefinition]
item match {
case t: ToolDefinition => GlobalDefinitions.isMaxArms(t)
case _: VehicleDefinition => true
case _ => false
}
)
case _ => ;
}
@ -2574,13 +2578,17 @@ class AvatarActor(
avatar.cooldowns.purchase.find { case (name, _) => name.equals(key) } match {
case Some((name, purchaseTime)) =>
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 =>
val (_, name) = AvatarActor.resolvePurchaseTimeName(avatar.faction, obj)
updatePurchaseTimer(
name,
cooldown.toSeconds - secondsSincePurchase,
DefinitionUtil.fromString(name).isInstanceOf[VehicleDefinition]
obj match {
case t: ToolDefinition => GlobalDefinitions.isMaxArms(t)
case _: VehicleDefinition => true
case _ => false
}
)
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(
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)
case CommonMessages.Progress(rate, finishedAction, stepAction) =>
sessionFuncs.SetupProgressChange(rate, finishedAction, stepAction)
sessionFuncs.setupProgressChange(rate, finishedAction, stepAction)
case SessionActor.ProgressEvent(delta, finishedAction, stepAction, tick) =>
sessionFuncs.HandleProgressChange(delta, finishedAction, stepAction, tick)
sessionFuncs.handleProgressChange(delta, finishedAction, stepAction, tick)
case CavernRotationService.CavernRotationServiceKey.Listing(listings) =>
listings.head ! SendCavernRotationUpdates(context.self)

View file

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

View file

@ -30,7 +30,7 @@ class SessionLocalHandlers(
}
case LocalResponse.DeployableUIFor(item) =>
sessionData.UpdateDeployableUIElements(avatar.deployables.UpdateUIElement(item))
sessionData.updateDeployableUIElements(avatar.deployables.UpdateUIElement(item))
case LocalResponse.Detonate(dguid, _: BoomerDeployable) =>
sendResponse(TriggerEffectMessage(dguid, "detonate_boomer"))
@ -160,7 +160,7 @@ class SessionLocalHandlers(
sendResponse(ChatMsg(ChatMessageType.UNK_229, wideContents=false, "", msg, None))
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) =>
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))
case LocalResponse.ToggleTeleportSystem(router, system_plan) =>
sessionData.ToggleTeleportSystem(router, system_plan)
sessionData.toggleTeleportSystem(router, system_plan)
case LocalResponse.TriggerEffect(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")
sessionData.terminals.CancelAllProximityUnits()
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 =>
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount")
log.info(s"${player.Name} mounts the orbital shuttle")
sessionData.terminals.CancelAllProximityUnits()
MountingAction(tplayer, obj, seat_number)
sessionData.keepAliveFunc = sessionData.KeepAlivePersistence
sessionData.keepAliveFunc = sessionData.keepAlivePersistence
case Mountable.CanMount(obj: Vehicle, seat_number, _) =>
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount")
@ -72,10 +72,10 @@ class SessionMountHandlers(
}
sendResponse(GenericObjectActionMessage(obj_guid, 11))
} else if (obj.WeaponControlledFromSeat(seat_number).isEmpty) {
sessionData.keepAliveFunc = sessionData.KeepAlivePersistence
sessionData.keepAliveFunc = sessionData.keepAlivePersistence
}
sessionData.AccessContainer(obj)
sessionData.UpdateWeaponAtSeatPosition(obj, seat_number)
sessionData.accessContainer(obj)
sessionData.updateWeaponAtSeatPosition(obj, seat_number)
MountingAction(tplayer, obj, 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))
}
sendResponse(PlanetsideAttributeMessage(obj.GUID, 0, obj.Health))
sessionData.UpdateWeaponAtSeatPosition(obj, seat_number)
sessionData.updateWeaponAtSeatPosition(obj, seat_number)
MountingAction(tplayer, obj, seat_number)
} else {
log.warn(
@ -98,7 +98,7 @@ class SessionMountHandlers(
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_mount")
log.info(s"${player.Name} mounts the ${obj.Definition.asInstanceOf[BasicDefinition].Name}")
sendResponse(PlanetsideAttributeMessage(obj.GUID, 0, obj.Health))
sessionData.UpdateWeaponAtSeatPosition(obj, seat_number)
sessionData.updateWeaponAtSeatPosition(obj, seat_number)
MountingAction(tplayer, obj, seat_number)
case Mountable.CanMount(obj: Mountable, _, _) =>
@ -152,7 +152,7 @@ class SessionMountHandlers(
case Mountable.CanDismount(obj: Vehicle, seat_num, _) if obj.Definition == GlobalDefinitions.droppod =>
log.info(s"${tplayer.Name} has landed on ${continent.id}")
sessionData.UnaccessContainer(obj)
sessionData.unaccessContainer(obj)
DismountAction(tplayer, obj, seat_num)
obj.Actor ! Vehicle.Deconstruct()
@ -168,7 +168,7 @@ class SessionMountHandlers(
}
}")
sessionData.vehicles.ConditionalDriverVehicleControl(obj)
sessionData.UnaccessContainer(obj)
sessionData.unaccessContainer(obj)
DismountAction(tplayer, obj, seat_num)
} else {
continent.VehicleEvents ! VehicleServiceMessage(
@ -213,7 +213,7 @@ class SessionMountHandlers(
def MountingAction(tplayer: Player, obj: PlanetSideGameObject with Mountable, seatNum: Int): Unit = {
val player_guid: PlanetSideGUID = tplayer.GUID
val obj_guid: PlanetSideGUID = obj.GUID
sessionData.PlayerActionsToCancel()
sessionData.playerActionsToCancel()
avatarActor ! AvatarActor.DeactivateActiveImplants()
avatarActor ! AvatarActor.SuspendStaminaRegeneration(3 seconds)
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.
* 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 var squadUpdateCounter: Int = 0
private val queuedSquadActions: Seq[() => Unit] = Seq(SquadUpdates, NoSquadUpdates, NoSquadUpdates, NoSquadUpdates)
@ -263,7 +262,6 @@ class SessionSquadHandlers(
GiveSquadColorsToSelf(value = 0)
sendResponse(PlanetsideAttributeMessage(playerGuid, 32, 0)) //disassociate with member position in squad?
sendResponse(PlanetsideAttributeMessage(playerGuid, 34, 4294967295L)) //unknown, perhaps unrelated?
lfsm = false
avatarActor ! AvatarActor.SetLookingForSquad(false)
//a finalization? what does this do?
sendResponse(SquadDefinitionActionMessage(PlanetSideGUID(0), 0, SquadAction.Unknown(18)))
@ -291,9 +289,8 @@ class SessionSquadHandlers(
case SquadResponse.PromoteMember(squad, promotedPlayer, from_index) =>
if (promotedPlayer != player.CharId) {
//demoted from leader; no longer lfsm
if (lfsm) {
lfsm = false
AvatarActor.displayLookingForSquad(session, state = 0)
if (player.avatar.lookingForSquad) {
avatarActor ! AvatarActor.SetLookingForSquad(false)
}
}
sendResponse(SquadMemberEvent(MemberEvent.Promote, squad.GUID.guid, promotedPlayer, position = 0))

View file

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

View file

@ -99,7 +99,7 @@ class VehicleOperations(
case _ => ;
}
if (player.death_by == -1) {
sessionData.KickedByAdministration()
sessionData.kickedByAdministration()
}
}
@ -197,7 +197,7 @@ class VehicleOperations(
case _ => ;
}
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
if (player.death_by == -1) {
sessionData.KickedByAdministration()
sessionData.kickedByAdministration()
}
}
def handleVehicleSubState(pkt: VehicleSubStateMessage): Unit = {
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) =>
import net.psforever.login.WorldSession.boolToInt
obj.Position = pos
@ -268,7 +268,7 @@ class VehicleOperations(
def handleMountVehicle(pkt: MountVehicleMsg): Unit = {
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) =>
obj.Actor ! Mountable.TryMount(player, entry_point)
case Some(_) =>
@ -341,8 +341,8 @@ class VehicleOperations(
case Some(obj_guid) =>
(
(
sessionData.ValidObject(obj_guid, decorator = "DismountVehicle/Vehicle"),
sessionData.ValidObject(player_guid, decorator = "DismountVehicle/Player")
sessionData.validObject(obj_guid, decorator = "DismountVehicle/Vehicle"),
sessionData.validObject(player_guid, decorator = "DismountVehicle/Player")
) match {
case (vehicle @ Some(obj: Vehicle), tplayer) =>
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 = {
val ChangeFireStateMessage_Start(item_guid) = pkt
if (shooting.isEmpty) {
sessionData.FindEquipment(item_guid) match {
sessionData.findEquipment(item_guid) match {
case Some(tool: Tool) =>
if (tool.FireMode.RoundsPerShot == 0 || tool.Magazine > 0 || prefire.contains(item_guid)) {
prefire -= item_guid
@ -156,7 +156,7 @@ private[support] class WeaponAndProjectileOperations(
shootingStop += item_guid -> System.currentTimeMillis()
shooting -= item_guid
val pguid = player.GUID
sessionData.FindEquipment(item_guid) match {
sessionData.findEquipment(item_guid) match {
case Some(tool: Tool) =>
//the decimator does not send a ChangeFireState_Start on the last shot; heaven knows why
if (
@ -259,7 +259,7 @@ private[support] class WeaponAndProjectileOperations(
def handleChangeAmmo(pkt: ChangeAmmoMessage): Unit = {
val ChangeAmmoMessage(item_guid, _) = pkt
val (thing, equipment) = sessionData.FindContainedEquipment()
val (thing, equipment) = sessionData.findContainedEquipment()
if (equipment.isEmpty) {
log.warn(s"ChangeAmmo: either can not find $item_guid or the object found was not Equipment")
} else {
@ -286,7 +286,7 @@ private[support] class WeaponAndProjectileOperations(
def handleChangeFireMode(pkt: ChangeFireModeMessage): Unit = {
val ChangeFireModeMessage(item_guid, _/*fire_mode*/) = pkt
sessionData.FindEquipment(item_guid) match {
sessionData.findEquipment(item_guid) match {
case Some(obj: PlanetSideGameObject with FireModeSwitch[_]) =>
val originalModeIndex = obj.FireModeIndex
if (obj match {
@ -376,7 +376,7 @@ private[support] class WeaponAndProjectileOperations(
(hit_info match {
case Some(hitInfo) =>
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 =>
val radius = projectile.profile.DamageRadius * projectile.profile.DamageRadius
val targets = Zone.findAllTargets(hitPos)(continent, player, projectile.profile)
@ -410,7 +410,7 @@ private[support] class WeaponAndProjectileOperations(
) =>
ResolveProjectileInteraction(proj, DamageResolution.Hit, target, hitPos) match {
case Some(resprojectile) =>
sessionData.HandleDealingDamage(target, resprojectile)
sessionData.handleDealingDamage(target, resprojectile)
case None => ;
}
case _ => ;
@ -443,24 +443,24 @@ private[support] class WeaponAndProjectileOperations(
(DamageResolution.Splash, DamageResolution.Splash)
}
//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) =>
CheckForHitPositionDiscrepancy(projectile_guid, target.Position, target)
ResolveProjectileInteraction(projectile, resolution1, target, target.Position) match {
case Some(_projectile) =>
sessionData.HandleDealingDamage(target, _projectile)
sessionData.handleDealingDamage(target, _projectile)
case None => ;
}
case _ => ;
}
//other victims
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) =>
CheckForHitPositionDiscrepancy(projectile_guid, explosion_pos, target)
ResolveProjectileInteraction(projectile, resolution2, target, explosion_pos) match {
case Some(_projectile) =>
sessionData.HandleDealingDamage(target, _projectile)
sessionData.handleDealingDamage(target, _projectile)
case None => ;
}
case _ => ;
@ -495,12 +495,12 @@ private[support] class WeaponAndProjectileOperations(
def handleLashHit(pkt: LashMessage): Unit = {
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) =>
CheckForHitPositionDiscrepancy(projectile_guid, hit_pos, target)
ResolveProjectileInteraction(projectile_guid, DamageResolution.Lash, target, hit_pos) match {
case Some(projectile) =>
sessionData.HandleDealingDamage(target, projectile)
sessionData.handleDealingDamage(target, projectile)
case None => ;
}
case _ => ;
@ -606,7 +606,7 @@ private[support] class WeaponAndProjectileOperations(
sessionData.zoning.CancelZoningProcessWithDescriptiveReason("cancel_fire")
if (player.isShielded) {
// Cancel NC MAX shield if it's active
sessionData.ToggleMaxSpecialState(enable = false)
sessionData.toggleMaxSpecialState(enable = false)
}
val (o, tools) = FindContainedWeapon
val (_, enabledTools) = FindEnabledWeaponsToHandleWeaponFireAccountability(o, tools)
@ -909,7 +909,7 @@ private[support] class WeaponAndProjectileOperations(
case Some(_) =>
stowFunc(previousBox)
case None =>
sessionData.NormalItemDrop(player, continent)(previousBox)
sessionData.normalItemDrop(player, continent)(previousBox)
}
AmmoBox.Split(previousBox) match {
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] = {
targets
.map { sessionData.ValidObject(_, decorator="FindDetectedProjectileTargets") }
.map { sessionData.validObject(_, decorator="FindDetectedProjectileTargets") }
.flatMap {
case Some(obj: Vehicle) if !obj.Cloaked =>
//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
*/
def FindContainedWeapon: (Option[PlanetSideGameObject with Container], Set[Tool]) = {
sessionData.FindContainedEquipment() match {
sessionData.findContainedEquipment() match {
case (container, equipment) =>
(container, equipment collect { case t: Tool => t })
case _ =>

View file

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

View file

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

View file

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

View file

@ -2,76 +2,69 @@
package net.psforever.packet.game
import net.psforever.packet.{GamePacketOpcode, Marshallable, PlanetSideGamePacket}
import enumeratum.values.{IntEnum, IntEnumEntry}
import scodec.Codec
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>
* <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"
*
* Reports that something has happened, or makes something happen.
* @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
def opcode = GamePacketOpcode.GenericActionMessage
def encode = GenericActionMessage.encode(this)
}
object GenericActionMessage extends Marshallable[GenericActionMessage] {
def apply(action: GenericActionEnum.GenericActionEnum): GenericActionMessage = {
GenericActionMessage(action.id)
def apply(i: Int): GenericActionMessage = {
GenericActionMessage(GenericAction.values.find { _.value == i } match {
case Some(enum) => enum
case None => GenericAction.Unknown(i)
})
}
implicit val codec: Codec[GenericActionMessage] = (
"action" | uint(6)
).as[GenericActionMessage]
private val genericActionCodec = uint(bits = 6).xmap[GenericAction]({
i => GenericAction.values.find { _.value == i } match {
case Some(enum) => enum
case None => GenericAction.Unknown(i)
}
}, enum => enum.value)
object GenericActionEnum extends Enumeration {
type GenericActionEnum = Value
/** Drop special item e.g. LLU */
val DropSpecialItem = Value(11)
/** Plays the base capture fanfare sound */
val BaseCaptureFanfare = Value(12)
implicit val codec: Codec[GenericActionMessage] = ("action" | genericActionCodec).as[GenericActionMessage]
}

View file

@ -11,10 +11,9 @@ import net.psforever.objects.vehicles.Utility
import net.psforever.objects.zones.Zone
import net.psforever.objects.{PlanetSideGameObject, TelepadDeployable, Vehicle}
import net.psforever.packet.PlanetSideGamePacket
import net.psforever.packet.game.GenericActionEnum.GenericActionEnum
import net.psforever.packet.game.GenericObjectActionEnum.GenericObjectActionEnum
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.types.{PlanetSideEmpire, PlanetSideGUID, Vector3}
@ -82,7 +81,7 @@ object LocalAction {
final case class SendGenericActionMessage(
player_guid: PlanetSideGUID,
action_number: GenericActionEnum
action_number: GenericAction
) extends Action
final case class RouterTelepadMessage(msg: String) extends Action
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.serverobject.terminals.{ProximityUnit, Terminal}
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.PlanetsideAttributeEnum.PlanetsideAttributeEnum
import net.psforever.packet.PlanetSideGamePacket
@ -44,7 +43,7 @@ object LocalResponse {
final case class SendGenericObjectActionMessage(target_guid: PlanetSideGUID, action_number: GenericObjectActionEnum)
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 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.zones.Zone
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.types.{PlanetSideEmpire, PlanetSideGUID}
@ -212,7 +212,7 @@ class HackCaptureActor extends Actor {
building.Actor! BuildingActor.SetFaction(hackedByFaction)
// 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 {
log.info("Base hack completed, but base was out of NTU.")
}

View file

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