created generic progress messages and moved their creation into the specific control agencies that would utilize them; this moves code out from WSA and restores the original purpose of CommonMessages.Hack (#349)

This commit is contained in:
Fate-JH 2020-04-16 18:52:31 -04:00 committed by GitHub
parent b1cc871467
commit c80bb2836f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 106 additions and 150 deletions

View file

@ -2,14 +2,11 @@
package net.psforever.objects.avatar
import akka.actor.Actor
import net.psforever.objects.{DefaultCancellable, ImplantSlot, Player}
import net.psforever.objects.{DefaultCancellable, GlobalDefinitions, ImplantSlot, Player, Players, Tool}
import net.psforever.objects.ballistics.{PlayerSource, ResolvedProjectile, SourceEntry}
import net.psforever.objects.definition.ImplantDefinition
import net.psforever.objects.equipment.{JammableBehavior, JammableUnit}
import net.psforever.objects.vital.{PlayerSuicide, Vitality}
import net.psforever.objects.{GlobalDefinitions, Player, Tool}
import net.psforever.objects.ballistics.{PlayerSource, ResolvedProjectile}
import net.psforever.objects.equipment.{Ammo, JammableBehavior, JammableUnit}
import net.psforever.objects.vital.{PlayerSuicide, Vitality}
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.damage.Damageable
import net.psforever.objects.serverobject.mount.Mountable
@ -17,8 +14,7 @@ import net.psforever.objects.serverobject.repair.Repairable
import net.psforever.objects.vital._
import net.psforever.objects.zones.Zone
import net.psforever.packet.game._
import net.psforever.types.{ExoSuitType, ImplantType, PlanetSideGUID}
import net.psforever.types.{ExoSuitType, Vector3}
import net.psforever.types.{ExoSuitType, ImplantType, PlanetSideGUID, Vector3}
import services.Service
import services.avatar.{AvatarAction, AvatarServiceMessage}
@ -167,7 +163,11 @@ class PlayerControl(player : Player) extends Actor
if(user != player && user.isAlive && !user.isMoving &&
!player.isBackpack &&
item.Magazine >= 25) {
sender ! CommonMessages.Use(player, Some((item, user)))
sender ! CommonMessages.Progress(
4,
Players.FinishRevivingPlayer(player, user.Name),
Players.RevivingTickAction(player, user, item)
)
}
case CommonMessages.Use(user, Some(item : Tool)) if item.Definition == GlobalDefinitions.bank =>

View file

@ -10,4 +10,17 @@ object CommonMessages {
final case class Unuse(player : Player, data : Option[Any] = None)
final case class Hack(player : Player, obj : PlanetSideServerObject with Hackable, data : Option[Any] = None)
final case class ClearHack()
/**
* The message that initializes a process -
* some form of user-driven activity with a certain eventual outcome and potential feedback per cycle.
* The feedback is usually only known to the individual attempting the process.
* @param delta how much the progress value changes each tick, which will be treated as a percentage;
* must be a positive value
* @param completionAction a finalizing action performed once the progress reaches 100(%)
* @param tickAction an action that is performed for each increase of progress
*/
final case class Progress(delta : Float, completionAction : ()=>Unit, tickAction : Float=>Boolean) {
assert(delta > 0, s"progress activity change value must be positive number - $delta")
}
}

View file

@ -9,7 +9,7 @@ import net.psforever.objects.serverobject.mount.{Mountable, MountableBehavior}
import net.psforever.objects.serverobject.affinity.FactionAffinityBehavior
import net.psforever.objects.serverobject.damage.Damageable.Target
import net.psforever.objects.serverobject.damage.{Damageable, DamageableEntity, DamageableMountable}
import net.psforever.objects.serverobject.hackable.HackableBehavior
import net.psforever.objects.serverobject.hackable.{GenericHackables, HackableBehavior}
import net.psforever.objects.serverobject.repair.RepairableEntity
import net.psforever.objects.serverobject.structures.Building
@ -41,7 +41,11 @@ class ImplantTerminalMechControl(mech : ImplantTerminalMech) extends Actor
//TODO setup certifications check
mech.Owner match {
case b : Building if (b.Faction != player.Faction || b.CaptureConsoleIsHacked) && mech.HackedBy.isEmpty =>
sender ! CommonMessages.Hack(player, mech, Some(item))
sender ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, mech),
GenericHackables.FinishHacking(mech, player, 3212836864L),
GenericHackables.HackingTickAction(progressType = 1, player, mech, item.GUID)
)
case _ => ;
}
case _ => ;

View file

@ -5,7 +5,7 @@ import akka.actor.Actor
import net.psforever.objects.{GlobalDefinitions, SimpleItem}
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffinityBehavior}
import net.psforever.objects.serverobject.hackable.HackableBehavior
import net.psforever.objects.serverobject.hackable.{GenericHackables, HackableBehavior}
/**
* An `Actor` that handles messages being dispatched to a specific `IFFLock`.
@ -20,8 +20,19 @@ class IFFLockControl(lock : IFFLock) extends Actor with FactionAffinityBehavior.
.orElse(hackableBehavior)
.orElse {
case CommonMessages.Use(player, Some(item : SimpleItem)) if item.Definition == GlobalDefinitions.remote_electronics_kit =>
if((lock.Faction != player.Faction && lock.HackedBy.isEmpty) || (lock.Faction == player.Faction && lock.HackedBy.nonEmpty)) {
sender ! CommonMessages.Hack(player, lock, Some(item))
if(lock.Faction != player.Faction && lock.HackedBy.isEmpty) {
sender ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, lock),
GenericHackables.FinishHacking(lock, player, 1114636288L),
GenericHackables.HackingTickAction(progressType = 1, player, lock, item.GUID)
)
}
else if(lock.Faction == player.Faction && lock.HackedBy.nonEmpty) {
sender ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, lock),
IFFLocks.FinishResecuringIFFLock(lock),
GenericHackables.HackingTickAction(progressType = 1, player, lock, item.GUID)
)
}
else {
val log = org.log4s.getLogger

View file

@ -5,7 +5,7 @@ import akka.actor.Actor
import net.psforever.objects.{GlobalDefinitions, SimpleItem}
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffinityBehavior}
import net.psforever.objects.serverobject.hackable.HackableBehavior
import net.psforever.objects.serverobject.hackable.{GenericHackables, HackableBehavior}
/**
* An `Actor` that handles messages being dispatched to a specific `Locker`.
@ -21,7 +21,11 @@ class LockerControl(locker : Locker) extends Actor with FactionAffinityBehavior.
case CommonMessages.Use(player, Some(item : SimpleItem)) if item.Definition == GlobalDefinitions.remote_electronics_kit =>
//TODO setup certifications check
if(locker.Faction != player.Faction && locker.HackedBy.isEmpty) {
sender ! CommonMessages.Hack(player, locker, Some(item))
sender ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, locker),
GenericHackables.FinishHacking(locker, player, 3212836864L),
GenericHackables.HackingTickAction(progressType = 1, player, locker, item.GUID)
)
}
case _ => ;
}

View file

@ -5,7 +5,7 @@ import akka.actor.Actor
import net.psforever.objects.{GlobalDefinitions, SimpleItem}
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffinityBehavior}
import net.psforever.objects.serverobject.hackable.HackableBehavior
import net.psforever.objects.serverobject.hackable.{GenericHackables, HackableBehavior}
class CaptureTerminalControl(terminal : CaptureTerminal) extends Actor with FactionAffinityBehavior.Check with HackableBehavior.GenericHackable {
@ -21,7 +21,11 @@ class CaptureTerminalControl(terminal : CaptureTerminal) extends Actor with Fact
case _ => terminal.Faction != player.Faction
}
if(canHack) {
sender ! CommonMessages.Hack(player, terminal, Some(item))
sender ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, terminal),
CaptureTerminals.FinishHackingCaptureConsole(terminal, player, 3212836864L),
GenericHackables.HackingTickAction(progressType = 1, player, terminal, item.GUID)
)
}
case _ => ; //no default message

View file

@ -6,7 +6,7 @@ import net.psforever.objects._
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.affinity.FactionAffinityBehavior
import net.psforever.objects.serverobject.damage.DamageableAmenity
import net.psforever.objects.serverobject.hackable.HackableBehavior
import net.psforever.objects.serverobject.hackable.{GenericHackables, HackableBehavior}
import net.psforever.objects.serverobject.repair.RepairableAmenity
import net.psforever.objects.serverobject.structures.Building
@ -43,7 +43,11 @@ class ProximityTerminalControl(term : Terminal with ProximityUnit) extends Actor
//TODO setup certifications check
term.Owner match {
case b : Building if (b.Faction != player.Faction || b.CaptureConsoleIsHacked) && term.HackedBy.isEmpty =>
sender ! CommonMessages.Hack(player, term, Some(item))
sender ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, term),
GenericHackables.FinishHacking(term, player, 3212836864L),
GenericHackables.HackingTickAction(progressType = 1, player, term, item.GUID)
)
case _ => ;
}

View file

@ -6,7 +6,7 @@ import net.psforever.objects.{GlobalDefinitions, SimpleItem}
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.affinity.FactionAffinityBehavior
import net.psforever.objects.serverobject.damage.DamageableAmenity
import net.psforever.objects.serverobject.hackable.HackableBehavior
import net.psforever.objects.serverobject.hackable.{GenericHackables, HackableBehavior}
import net.psforever.objects.serverobject.repair.RepairableAmenity
import net.psforever.objects.serverobject.structures.Building
@ -36,7 +36,11 @@ class TerminalControl(term : Terminal) extends Actor
//TODO setup certifications check
term.Owner match {
case b : Building if (b.Faction != player.Faction || b.CaptureConsoleIsHacked) && term.HackedBy.isEmpty =>
sender ! CommonMessages.Hack(player, term, Some(item))
sender ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, term),
GenericHackables.FinishHacking(term, player, 3212836864L),
GenericHackables.HackingTickAction(progressType = 1, player, term, item.GUID)
)
case _ => ;
}
case _ => ;

View file

@ -3,11 +3,13 @@ package net.psforever.objects.serverobject.turret
import akka.actor.Actor
import net.psforever.objects.ballistics.ResolvedProjectile
import net.psforever.objects.{GlobalDefinitions, Player}
import net.psforever.objects.equipment.JammableMountedWeapons
import net.psforever.objects.{GlobalDefinitions, Player, Tool}
import net.psforever.objects.equipment.{Ammo, JammableMountedWeapons}
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.mount.MountableBehavior
import net.psforever.objects.serverobject.affinity.FactionAffinityBehavior
import net.psforever.objects.serverobject.damage.DamageableWeaponTurret
import net.psforever.objects.serverobject.hackable.GenericHackables
import net.psforever.objects.serverobject.repair.Repairable.Target
import net.psforever.objects.serverobject.repair.RepairableWeaponTurret
import services.avatar.{AvatarAction, AvatarServiceMessage}
@ -49,6 +51,20 @@ class FacilityTurretControl(turret : FacilityTurret) extends Actor
.orElse(takesDamage)
.orElse(canBeRepairedByNanoDispenser)
.orElse {
case CommonMessages.Use(player, Some((item : Tool, upgradeValue : Int)))
if player.Faction == turret.Faction &&
item.Definition == GlobalDefinitions.nano_dispenser && item.AmmoType == Ammo.upgrade_canister &&
item.Magazine > 0 && turret.Seats.values.forall(!_.isOccupied) =>
TurretUpgrade.values.find(_.id == upgradeValue) match {
case Some(upgrade) if turret.Upgrade != upgrade && turret.Definition.Weapons.values.flatMap( _.keySet).exists(_ == upgrade) =>
sender ! CommonMessages.Progress(
1.25f,
WeaponTurrets.FinishUpgradingMannedTurret(turret, player, item, upgrade),
GenericHackables.HackingTickAction(progressType = 2, player, turret, item.GUID)
)
case _ => ;
}
case FacilityTurret.RechargeAmmo() =>
val weapon = turret.ControlledWeapon(1).get.asInstanceOf[net.psforever.objects.Tool]
// recharge when last shot fired 3s delay, +1, 200ms interval

View file

@ -2,7 +2,7 @@
package net.psforever.objects.vehicles
import akka.actor.{Actor, ActorRef}
import net.psforever.objects.{GlobalDefinitions, SimpleItem, Vehicle}
import net.psforever.objects.{GlobalDefinitions, SimpleItem, Vehicle, Vehicles}
import net.psforever.objects.ballistics.{ResolvedProjectile, VehicleSource}
import net.psforever.objects.equipment.JammableMountedWeapons
import net.psforever.objects.serverobject.CommonMessages
@ -10,6 +10,7 @@ import net.psforever.objects.serverobject.mount.{Mountable, MountableBehavior}
import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffinityBehavior}
import net.psforever.objects.serverobject.damage.DamageableVehicle
import net.psforever.objects.serverobject.deploy.DeploymentBehavior
import net.psforever.objects.serverobject.hackable.GenericHackables
import net.psforever.objects.serverobject.repair.RepairableVehicle
import net.psforever.objects.vital.VehicleShieldCharge
import net.psforever.types.{ExoSuitType, PlanetSideGUID}
@ -86,7 +87,11 @@ class VehicleControl(vehicle : Vehicle) extends Actor
case CommonMessages.Use(player, Some(item : SimpleItem)) if item.Definition == GlobalDefinitions.remote_electronics_kit =>
//TODO setup certifications check
if(vehicle.Faction != player.Faction) {
sender ! CommonMessages.Hack(player, vehicle, Some(item))
sender ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, vehicle),
Vehicles.FinishHackingVehicle(vehicle, player,3212836864L),
GenericHackables.HackingTickAction(progressType = 1, player, vehicle, item.GUID)
)
}
case Vehicle.PrepareForDeletion() =>