diff --git a/src/main/scala/net/psforever/actors/session/normal/LocalHandlerLogic.scala b/src/main/scala/net/psforever/actors/session/normal/LocalHandlerLogic.scala index 8ddb6896b..896f9ea6a 100644 --- a/src/main/scala/net/psforever/actors/session/normal/LocalHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/LocalHandlerLogic.scala @@ -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)) diff --git a/src/main/scala/net/psforever/objects/global/GlobalDefinitionsImplant.scala b/src/main/scala/net/psforever/objects/global/GlobalDefinitionsImplant.scala index a64080e17..347c99b90 100644 --- a/src/main/scala/net/psforever/objects/global/GlobalDefinitionsImplant.scala +++ b/src/main/scala/net/psforever/objects/global/GlobalDefinitionsImplant.scala @@ -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 diff --git a/src/main/scala/net/psforever/objects/serverobject/deploy/Interference.scala b/src/main/scala/net/psforever/objects/serverobject/deploy/Interference.scala index 16ba67795..8b0cae70e 100644 --- a/src/main/scala/net/psforever/objects/serverobject/deploy/Interference.scala +++ b/src/main/scala/net/psforever/objects/serverobject/deploy/Interference.scala @@ -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 } diff --git a/src/main/scala/net/psforever/objects/serverobject/hackable/HackableBehavior.scala b/src/main/scala/net/psforever/objects/serverobject/hackable/HackableBehavior.scala index 39fd599cc..cd333ece0 100644 --- a/src/main/scala/net/psforever/objects/serverobject/hackable/HackableBehavior.scala +++ b/src/main/scala/net/psforever/objects/serverobject/hackable/HackableBehavior.scala @@ -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 + } } } diff --git a/src/main/scala/net/psforever/objects/serverobject/terminals/TerminalControl.scala b/src/main/scala/net/psforever/objects/serverobject/terminals/TerminalControl.scala index a020e8426..6cab6095c 100644 --- a/src/main/scala/net/psforever/objects/serverobject/terminals/TerminalControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/terminals/TerminalControl.scala @@ -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 = { diff --git a/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala b/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala index e0dec604c..e40369d9a 100644 --- a/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/turret/FacilityTurretControl.scala @@ -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)) + } } } }