From fc71bbfd2aebb8bea8b4df7853136fce340d4991 Mon Sep 17 00:00:00 2001 From: Mazo Date: Sat, 26 May 2018 17:13:24 +0100 Subject: [PATCH] Shut down base power if NTU runs out, and restore it once refilled. --- .../resourcesilo/ResourceSiloControl.scala | 15 +++++++++++++-- .../packet/game/PlanetsideAttributeMessage.scala | 2 +- .../scala/services/galaxy/GalaxyService.scala | 1 - pslogin/src/main/scala/WorldSessionActor.scala | 9 +++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/common/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala b/common/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala index 20d9b5e4..a92713a0 100644 --- a/common/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala +++ b/common/src/main/scala/net/psforever/objects/serverobject/resourcesilo/ResourceSiloControl.scala @@ -46,13 +46,14 @@ class ResourceSiloControl(resourceSilo : ResourceSilo) extends Actor with Factio avatarService ! AvatarServiceMessage(resourceSilo.Owner.asInstanceOf[Building].Zone.Id, AvatarAction.PlanetsideAttribute(PlanetSideGUID(resourceSilo.Owner.asInstanceOf[Building].ModelId), 47, resourceSilo.LowNtuWarningOn)) case ResourceSilo.UpdateChargeLevel(amount: Int) => + val siloChargeBeforeChange = resourceSilo.ChargeLevel + // Increase if positive passed in or decrease charge level if negative number is passed in resourceSilo.ChargeLevel += amount if(resourceSilo.ChargeLevel > 0) { log.trace(s"UpdateChargeLevel: Silo ${resourceSilo.GUID} set to ${resourceSilo.ChargeLevel}") } - val ntuIsLow = resourceSilo.ChargeLevel.toFloat / resourceSilo.MaximumCharge.toFloat < 0.2f val ntuBarLevel = scala.math.round((resourceSilo.ChargeLevel.toFloat / resourceSilo.MaximumCharge.toFloat) * 10).toInt // Only send updated capacitor display value to all clients if it has actually changed @@ -63,13 +64,23 @@ class ResourceSiloControl(resourceSilo : ResourceSilo) extends Actor with Factio avatarService ! AvatarServiceMessage(resourceSilo.Owner.asInstanceOf[Building].Zone.Id, AvatarAction.PlanetsideAttribute(resourceSilo.GUID, 45, resourceSilo.CapacitorDisplay)) } + val ntuIsLow = resourceSilo.ChargeLevel.toFloat / resourceSilo.MaximumCharge.toFloat < 0.2f if(resourceSilo.LowNtuWarningOn == 1 && !ntuIsLow){ self ! ResourceSilo.LowNtuWarning(0) } else if (resourceSilo.LowNtuWarningOn == 0 && ntuIsLow) { self ! ResourceSilo.LowNtuWarning(1) } - //todo: Shut down base power and make base neutral if silo hits zero NTU + + if(resourceSilo.ChargeLevel == 0 && siloChargeBeforeChange > 0) { + // Oops, someone let the base run out of power. Shut it all down. + //todo: Make base neutral if silo hits zero NTU + avatarService ! AvatarServiceMessage(resourceSilo.Owner.asInstanceOf[Building].Zone.Id, AvatarAction.PlanetsideAttribute(PlanetSideGUID(resourceSilo.Owner.asInstanceOf[Building].ModelId), 48, 1)) + } else if (siloChargeBeforeChange == 0 && resourceSilo.ChargeLevel > 0) { + // Power restored. Reactor Online. Sensors Online. Weapons Online. All systems nominal. + //todo: Check generator is online before starting up + avatarService ! AvatarServiceMessage(resourceSilo.Owner.asInstanceOf[Building].Zone.Id, AvatarAction.PlanetsideAttribute(PlanetSideGUID(resourceSilo.Owner.asInstanceOf[Building].ModelId), 48, 0)) + } case _ => ; } diff --git a/common/src/main/scala/net/psforever/packet/game/PlanetsideAttributeMessage.scala b/common/src/main/scala/net/psforever/packet/game/PlanetsideAttributeMessage.scala index 60bc85ba..3f6705a5 100644 --- a/common/src/main/scala/net/psforever/packet/game/PlanetsideAttributeMessage.scala +++ b/common/src/main/scala/net/psforever/packet/game/PlanetsideAttributeMessage.scala @@ -106,7 +106,7 @@ import scodec.codecs._ * `43 - Info on avatar name : 0 = Nothing, 1 = "(LD)" message`
* `45 - NTU charge bar 0-10, 5 = 50% full. Seems to apply to both ANT and NTU Silo (possibly siphons?)`
* 47 - Sets base NTU level to CRITICAL. MUST use base modelId not base GUID - * 48 - Send base power loss message & turns on red warning lights throughout base. MUST use base modelId not base GUID + * 48 - Set to 1 to send base power loss message & turns on red warning lights throughout base. MUST use base modelId not base GUID * 49 - Vehicle texture effects state? (>0 turns on ANT panel glow or ntu silo panel glow + orbs) (bit?) * `52 - Vehicle particle effects? (>0 turns on orbs going towards ANT. Doesn't affect silo) (bit?) * `53 - LFS. Value is 1 to flag LFS`
diff --git a/common/src/main/scala/services/galaxy/GalaxyService.scala b/common/src/main/scala/services/galaxy/GalaxyService.scala index 2e83802e..262d64b4 100644 --- a/common/src/main/scala/services/galaxy/GalaxyService.scala +++ b/common/src/main/scala/services/galaxy/GalaxyService.scala @@ -38,7 +38,6 @@ class GalaxyService extends Actor { case GalaxyServiceMessage(action) => action match { case GalaxyAction.MapUpdate(msg: BuildingInfoUpdateMessage) => - log.warn(s"Publishing msg ${msg}") GalaxyEvents.publish( GalaxyServiceResponse(s"/Galaxy", GalaxyResponse.MapUpdate(msg)) ) diff --git a/pslogin/src/main/scala/WorldSessionActor.scala b/pslogin/src/main/scala/WorldSessionActor.scala index 0e02bb44..82aa40c2 100644 --- a/pslogin/src/main/scala/WorldSessionActor.scala +++ b/pslogin/src/main/scala/WorldSessionActor.scala @@ -4380,8 +4380,13 @@ class WorldSessionActor extends Actor with MDCContextAware { amenity.Definition match { case GlobalDefinitions.resource_silo => // Synchronise warning light & silo capacity - sendResponse(PlanetsideAttributeMessage(amenityId, 45, amenity.asInstanceOf[ResourceSilo].CapacitorDisplay)) - sendResponse(PlanetsideAttributeMessage(amenityId, 47, amenity.asInstanceOf[ResourceSilo].LowNtuWarningOn)) + var silo = amenity.asInstanceOf[ResourceSilo] + sendResponse(PlanetsideAttributeMessage(amenityId, 45, silo.CapacitorDisplay)) + sendResponse(PlanetsideAttributeMessage(amenityId, 47, silo.LowNtuWarningOn)) + + if(silo.ChargeLevel == 0) { + sendResponse(PlanetsideAttributeMessage(PlanetSideGUID(silo.Owner.asInstanceOf[Building].ModelId), 48, 1)) + } case _ => ; } })