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