PSF-BotServer/src/main/scala/net/psforever/objects/FieldTurretDeployable.scala
Fate-JH 593caec8cf
Hijacking Turrets (#1207)
* omft jacking functional; omft shields have been wired but remain disabled

* breaking up classes related to different kinds of turret deployables
2024-07-01 11:19:39 -04:00

90 lines
3.7 KiB
Scala

// Copyright (c) 2024 PSForever
package net.psforever.objects
import akka.actor.{ActorContext, Props}
import net.psforever.objects.ce.{Deployable, DeployedItem}
import net.psforever.objects.definition.WithShields
import net.psforever.objects.serverobject.affinity.FactionAffinity
import net.psforever.objects.serverobject.hackable.GenericHackables
import net.psforever.objects.serverobject.mount.{Mountable, MountableBehavior}
import net.psforever.objects.serverobject.turret.{MountableTurret, WeaponTurrets}
import net.psforever.objects.serverobject.{CommonMessages, PlanetSideServerObject}
import net.psforever.objects.sourcing.SourceEntry
import net.psforever.objects.vital.{InGameActivity, ShieldCharge}
import net.psforever.services.vehicle.{VehicleAction, VehicleServiceMessage}
import net.psforever.types.PlanetSideGUID
/** definition */
class FieldTurretDeployableDefinition(private val objectId: Int)
extends TurretDeployableDefinition(objectId) {
override def Initialize(obj: Deployable, context: ActorContext): Unit = {
obj.Actor = context.actorOf(Props(classOf[FieldTurretControl], obj), PlanetSideServerObject.UniqueActorName(obj))
}
}
object FieldTurretDeployableDefinition {
def apply(dtype: DeployedItem.Value): FieldTurretDeployableDefinition = {
new FieldTurretDeployableDefinition(dtype.id)
}
}
/** control actor */
class FieldTurretControl(turret: TurretDeployable)
extends TurretDeployableControl
with MountableBehavior {
def TurretObject: TurretDeployable = turret
def DeployableObject: TurretDeployable = turret
def JammableObject: TurretDeployable = turret
def FactionObject: TurretDeployable = turret
def DamageableObject: TurretDeployable = turret
def RepairableObject: TurretDeployable = turret
def AffectedObject: TurretDeployable = turret
def MountableObject: TurretDeployable = turret
def receive: Receive =
commonBehavior
.orElse(mountBehavior)
.orElse(dismountBehavior)
.orElse {
case CommonMessages.Use(player, Some(item: SimpleItem))
if item.Definition == GlobalDefinitions.remote_electronics_kit &&
turret.Faction != player.Faction =>
sender() ! CommonMessages.Progress(
GenericHackables.GetHackSpeed(player, turret),
WeaponTurrets.FinishHackingTurretDeployable(turret, player),
GenericHackables.HackingTickAction(progressType = 1, player, turret, item.GUID)
)
case CommonMessages.ChargeShields(amount, motivator) =>
chargeShields(amount, motivator.collect { case o: PlanetSideGameObject with FactionAffinity => SourceEntry(o) })
case _ => ()
}
override protected def mountTest(
obj: PlanetSideServerObject with Mountable,
seatNumber: Int,
player: Player
): Boolean = MountableTurret.MountTest(TurretObject, player)
//make certain vehicles don't charge shields too quickly
private def canChargeShields: Boolean = {
val func: InGameActivity => Boolean = WithShields.LastShieldChargeOrDamage(System.currentTimeMillis(), turret.Definition)
turret.Health > 0 && turret.Shields < turret.MaxShields &&
turret.History.findLast(func).isEmpty
}
private def chargeShields(amount: Int, motivator: Option[SourceEntry]): Unit = {
if (canChargeShields) {
turret.LogActivity(ShieldCharge(amount, motivator))
turret.Shields = turret.Shields + amount
turret.Zone.VehicleEvents ! VehicleServiceMessage(
s"${turret.Actor}",
VehicleAction.PlanetsideAttribute(PlanetSideGUID(0), turret.GUID, turret.Definition.shieldUiAttribute, turret.Shields)
)
}
}
}