mirror of
https://github.com/psforever/PSF-LoginServer.git
synced 2026-01-19 18:44:45 +00:00
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:
parent
5990f247c9
commit
955fa8ba0a
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue