mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
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:
parent
335c4b2099
commit
40cf783f18
|
|
@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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)) }
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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 _ =>
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in a new issue