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 857c44dff..2f12efd95 100644 --- a/src/main/scala/net/psforever/actors/session/normal/LocalHandlerLogic.scala +++ b/src/main/scala/net/psforever/actors/session/normal/LocalHandlerLogic.scala @@ -195,7 +195,7 @@ class LocalHandlerLogic(val ops: SessionLocalHandlers, implicit val context: Act msg match { case m: GenericObjectActionMessage => // delay building virus alert if player is dead/respawning - if ((m.code == 58 || m.code == 60) && !sessionLogic.zoning.spawn.startEnqueueSquadMessages) { + if ((m.code == 58 || m.code == 60 || m.code == 61) && !sessionLogic.zoning.spawn.startEnqueueSquadMessages) { sessionLogic.zoning.spawn.enqueueNewActivity(ActivityQueuedTask( SpawnOperations.delaySendGenericObjectActionMessage(msg), 1)) } diff --git a/src/main/scala/net/psforever/objects/serverobject/hackable/GenericHackables.scala b/src/main/scala/net/psforever/objects/serverobject/hackable/GenericHackables.scala index b7cb50172..5933beb0d 100644 --- a/src/main/scala/net/psforever/objects/serverobject/hackable/GenericHackables.scala +++ b/src/main/scala/net/psforever/objects/serverobject/hackable/GenericHackables.scala @@ -190,6 +190,29 @@ object GenericHackables { } else { //install virus + val currVirus = building.virusId + //clear previous virus unlocks to prevent virus stacking + currVirus match { + case 0L => + if (virus != 0) { + building.HackableAmenities.filter(d => d.Definition == GlobalDefinitions.lock_external).foreach { iff => + zone.LocalEvents ! LocalServiceMessage( + zoneId, + LocalAction.ClearTemporaryHack(PlanetSideGUID(0), iff) + ) + } + } + case 4L => + if (virus != 4) { + building.HackableAmenities.filter(d => d.Definition == GlobalDefinitions.order_terminal).foreach { term => + zone.LocalEvents ! LocalServiceMessage( + zoneId, + LocalAction.ClearTemporaryHack(PlanetSideGUID(0), term) + ) + } + } + case _ => () + } val virusLength: Map[Long, Int] = Map( 0L -> 3600, 1L -> 900, @@ -217,6 +240,10 @@ object GenericHackables { LocalAction .HackTemporarily(pguid, zone, target, installedVirusDuration, hackClearValue, installedVirusDuration, unk2=hackState) ) + zone.LocalEvents ! LocalServiceMessage( + zone.id, + LocalAction.SendResponse(GenericObjectActionMessage(target.GUID, 61)) + ) zone.LocalEvents ! LocalServiceMessage( zone.id, LocalAction.SendResponse(GenericObjectActionMessage(target.GUID, 58)) diff --git a/src/main/scala/net/psforever/objects/serverobject/structures/participation/FacilityHackParticipation.scala b/src/main/scala/net/psforever/objects/serverobject/structures/participation/FacilityHackParticipation.scala index b454fcfb2..a4962f5a9 100644 --- a/src/main/scala/net/psforever/objects/serverobject/structures/participation/FacilityHackParticipation.scala +++ b/src/main/scala/net/psforever/objects/serverobject/structures/participation/FacilityHackParticipation.scala @@ -109,11 +109,13 @@ trait FacilityHackParticipation extends ParticipationLogic { import net.psforever.services.Service import net.psforever.services.avatar.{AvatarAction, AvatarServiceMessage} val mainTerm = building.Amenities.filter(x => x.isInstanceOf[Terminal] && x.Definition == GlobalDefinitions.main_terminal).head.GUID - val msg = AvatarAction.GenericObjectAction(Service.defaultPlayerGUID, mainTerm, 58) + val msg1 = AvatarAction.GenericObjectAction(Service.defaultPlayerGUID, mainTerm, 61) + val msg2 = AvatarAction.GenericObjectAction(Service.defaultPlayerGUID, mainTerm, 58) val events = building.Zone.AvatarEvents - list.foreach(p => - events ! AvatarServiceMessage(p.Name, msg) - ) + list.foreach { p => + events ! AvatarServiceMessage(p.Name, msg1) + events ! AvatarServiceMessage(p.Name, msg2) + } } } } diff --git a/src/main/scala/net/psforever/packet/game/GenericObjectActionMessage.scala b/src/main/scala/net/psforever/packet/game/GenericObjectActionMessage.scala index 71cc8cd2b..a7bee165e 100644 --- a/src/main/scala/net/psforever/packet/game/GenericObjectActionMessage.scala +++ b/src/main/scala/net/psforever/packet/game/GenericObjectActionMessage.scala @@ -51,6 +51,8 @@ import shapeless.{::, HNil} * 56 - Sets vehicle or player to be black ops
* 57 - Reverts player from black ops
* 58 - Virus installed, changes lighting in facility to green + * 60 - Virus purged + * 61 - Virus recently installed. Counts down from 2 minutes until a new virus can be uploaded *
* What are these values?
* 90? - for observed driven BFR's, model pitches up slightly and stops idle animation