correctly clear the hack state of terminals when unpowered; turrets will no longer act like they have AI control if jammed when mounted; restore passive implants

This commit is contained in:
Fate-JH 2024-07-12 16:16:27 -04:00
parent 5990f247c9
commit 955fa8ba0a
6 changed files with 51 additions and 29 deletions

View file

@ -4,6 +4,8 @@ package net.psforever.actors.session.normal
import akka.actor.ActorContext
import net.psforever.actors.session.support.{LocalHandlerFunctions, SessionData, SessionLocalHandlers}
import net.psforever.objects.ce.Deployable
import net.psforever.objects.serverobject.doors.Door
import net.psforever.objects.serverobject.interior.Sidedness
import net.psforever.objects.vehicles.MountableWeapons
import net.psforever.objects.{BoomerDeployable, ExplosiveDeployable, TelepadDeployable, Tool, TurretDeployable}
import net.psforever.packet.game.{ChatMsg, DeployableObjectsInfoMessage, GenericActionMessage, GenericObjectActionMessage, GenericObjectStateMsg, HackMessage, HackState, InventoryStateMessage, ObjectAttachMessage, ObjectCreateMessage, ObjectDeleteMessage, ObjectDetachMessage, OrbitalShuttleTimeMsg, PadAndShuttlePair, PlanetsideAttributeMessage, ProximityTerminalUseMessage, SetEmpireMessage, TriggerEffectMessage, TriggerSoundMessage, TriggeredSound, VehicleStateMessage}
@ -66,10 +68,24 @@ class LocalHandlerLogic(val ops: SessionLocalHandlers, implicit val context: Act
log.warn(s"LocalResponse.Detonate: ${obj.Definition.Name} not configured to explode correctly")
case LocalResponse.DoorOpens(doorGuid) if isNotSameTarget =>
sendResponse(GenericObjectStateMsg(doorGuid, state=16))
val pos = player.Position.xy
val range = if (Sidedness.equals(player.WhichSide, Sidedness.InsideOf)) 100f
else if (sessionLogic.general.canSeeReallyFar) 800f
else 400f
val foundDoor = continent
.blockMap
.sector(pos, range)
.amenityList
.collect { case door: Door => door }
.find(_.GUID == doorGuid)
val doorExistsInRange: Boolean = foundDoor.nonEmpty
//lazy val doorReallyClose: Boolean = foundDoor.exists(door => Vector3.DistanceSquared(door.Position.xy, pos) < 10201f)
if (doorExistsInRange) {
sendResponse(GenericObjectStateMsg(doorGuid, state=16))
}
case LocalResponse.DoorCloses(doorGuid) => //door closes for everyone
sendResponse(GenericObjectStateMsg(doorGuid, state=17))
sendResponse(GenericObjectStateMsg(doorGuid, state = 17))
case LocalResponse.EliminateDeployable(obj: TurretDeployable, dguid, _, _) if obj.Destroyed =>
sendResponse(ObjectDeleteMessage(dguid, unk1=0))

View file

@ -18,6 +18,7 @@ object GlobalDefinitionsImplant {
targeting.Name = "targeting"
targeting.InitializationDuration = 60
targeting.Passive = true
audio_amplifier.Name = "audio_amplifier"
audio_amplifier.InitializationDuration = 60
@ -41,9 +42,11 @@ object GlobalDefinitionsImplant {
range_magnifier.Name = "range_magnifier"
range_magnifier.InitializationDuration = 60
range_magnifier.Passive = true
second_wind.Name = "second_wind"
second_wind.InitializationDuration = 180
second_wind.Passive = true
silent_run.Name = "silent_run"
silent_run.InitializationDuration = 90

View file

@ -77,7 +77,7 @@ object Interference {
val sector = zone.blockMap.sector(position, Interference.MaxRange)
val targets = (sector.deployableList ++ sector.vehicleList.filter(_.DeploymentState >= DriveState.Deploying))
.collect { case target: PlanetSideGameObject with FactionAffinity
if target.Faction != faction &&
if target.Faction == faction &&
(target.Definition.asInstanceOf[ObjectDefinition].interference ne Interference.AllowAll) =>
target
}

View file

@ -15,15 +15,18 @@ object HackableBehavior {
this: Actor =>
def HackableObject: Hackable
val hackableBehavior: Receive = {
case CommonMessages.Hack(player, _, _) =>
val obj = HackableObject
obj.HackedBy = player
sender() ! true
val clearHackBehavior: Receive = {
case CommonMessages.ClearHack() =>
val obj = HackableObject
obj.HackedBy = None
}
val hackableBehavior: Receive = clearHackBehavior
.orElse {
case CommonMessages.Hack(player, _, _) =>
val obj = HackableObject
obj.HackedBy = player
sender() ! true
}
}
}

View file

@ -4,12 +4,12 @@ package net.psforever.objects.serverobject.terminals
import akka.actor.ActorRef
import net.psforever.objects.{GlobalDefinitions, SimpleItem}
import net.psforever.objects.serverobject.CommonMessages
import net.psforever.objects.serverobject.affinity.FactionAffinityBehavior
import net.psforever.objects.serverobject.affinity.{FactionAffinity, FactionAffinityBehavior}
import net.psforever.objects.serverobject.damage.Damageable.Target
import net.psforever.objects.serverobject.damage.{Damageable, DamageableAmenity}
import net.psforever.objects.serverobject.hackable.{GenericHackables, HackableBehavior}
import net.psforever.objects.serverobject.hackable.{GenericHackables, Hackable, HackableBehavior}
import net.psforever.objects.serverobject.repair.{AmenityAutoRepair, RepairableAmenity}
import net.psforever.objects.serverobject.structures.{Building, PoweredAmenityControl}
import net.psforever.objects.serverobject.structures.{Amenity, Building, PoweredAmenityControl}
import net.psforever.objects.vital.interaction.DamageResult
import net.psforever.services.Service
import net.psforever.services.local.{LocalAction, LocalServiceMessage}
@ -25,11 +25,11 @@ class TerminalControl(term: Terminal)
with DamageableAmenity
with RepairableAmenity
with AmenityAutoRepair {
def FactionObject = term
def HackableObject = term
def DamageableObject = term
def RepairableObject = term
def AutoRepairObject = term
def FactionObject: FactionAffinity = term
def HackableObject: Hackable = term
def DamageableObject: Amenity = term
def RepairableObject: Amenity = term
def AutoRepairObject: Amenity = term
val commonBehavior: Receive = checkBehavior
.orElse(takesDamage)
@ -53,18 +53,19 @@ class TerminalControl(term: Terminal)
GenericHackables.FinishHacking(term, player, 3212836864L),
GenericHackables.HackingTickAction(progressType = 1, player, term, item.GUID)
)
case _ => ;
case _ => ()
}
case _ => ;
case _ => ()
}
def unpoweredStateLogic : Receive = commonBehavior
.orElse(clearHackBehavior)
.orElse {
case Terminal.Request(player, msg) =>
sender() ! Terminal.TerminalMessage(player, msg, Terminal.NoDeal())
case _ => ;
case _ => ()
}
override protected def DamageAwareness(target: Target, cause: DamageResult, amount: Any) : Unit = {

View file

@ -289,16 +289,15 @@ class FacilityTurretControl(turret: FacilityTurret)
}
override def TryJammerEffectActivate(target: Any, cause: DamageResult): Unit = {
val startsUnjammed = !JammableObject.Jammed
super.TryJammerEffectActivate(target, cause)
if (JammableObject.Jammed && AutomatedTurretObject.Definition.AutoFire.exists(_.retaliatoryDelay > 0)) {
if (startsUnjammed) {
AutomaticOperation = false
}
//look in direction of cause of jamming
val zone = JammableObject.Zone
AutomatedTurretBehavior.getAttackVectorFromCause(zone, cause).foreach { attacker =>
AutomatedTurretBehavior.startTracking(zone, zone.id, JammableObject.GUID, List(attacker.GUID))
if (JammableObject.Jammed) {
AutomaticOperation = false
if (!MountableObject.Seats.values.exists(_.isOccupied) && AutomatedTurretObject.Definition.AutoFire.exists(_.retaliatoryDelay > 0)) {
//look in direction of cause of jamming
val zone = JammableObject.Zone
AutomatedTurretBehavior.getAttackVectorFromCause(zone, cause).foreach { attacker =>
AutomatedTurretBehavior.startTracking(zone, zone.id, JammableObject.GUID, List(attacker.GUID))
}
}
}
}