diff --git a/src/main/scala/net/psforever/actors/session/csr/ChatLogic.scala b/src/main/scala/net/psforever/actors/session/csr/ChatLogic.scala index 55e947a8a..eee8cb565 100644 --- a/src/main/scala/net/psforever/actors/session/csr/ChatLogic.scala +++ b/src/main/scala/net/psforever/actors/session/csr/ChatLogic.scala @@ -8,6 +8,7 @@ import net.psforever.actors.session.support.{ChatFunctions, ChatOperations, Sess import net.psforever.objects.{GlobalDefinitions, PlanetSideGameObject, Session, TurretDeployable} import net.psforever.objects.ce.{Deployable, DeployableCategory} import net.psforever.objects.serverobject.affinity.FactionAffinity +import net.psforever.objects.serverobject.dome.ForceDomeControl import net.psforever.objects.serverobject.{CommonMessages, PlanetSideServerObject} import net.psforever.objects.serverobject.hackable.Hackable import net.psforever.objects.serverobject.structures.Building @@ -227,6 +228,7 @@ class ChatLogic(val ops: ChatOperations, implicit val context: ActorContext) ext case "sayspectator" => customCommandSpeakAsSpectator(params, message) case "setempire" => customCommandSetEmpire(params) case "weaponlock" => customCommandZoneWeaponUnlock(session, params) + case "forcedome" => customForceDomeCommand(session, params) case _ => // command was not handled sendResponse( @@ -509,6 +511,41 @@ class ChatLogic(val ops: ChatOperations, implicit val context: ActorContext) ext true } + private def customForceDomeCommand(session: Session, contents: Seq[String]): Boolean = { + //locate force dome + var postUsageMessage: Boolean = false + val locatedForceDomesInZone = session.zone.Buildings.values.flatMap(_.ForceDome) + if (locatedForceDomesInZone.nonEmpty) { + contents + .headOption + .map(_.toLowerCase()) + .collect { + case "on" | "o" | "" => + locatedForceDomesInZone.foreach(_.Actor ! ForceDomeControl.CustomExpand) + case "off" | "of" => + locatedForceDomesInZone.foreach(_.Actor ! ForceDomeControl.CustomCollapse) + case "protect" => + locatedForceDomesInZone.foreach(_.Actor ! ForceDomeControl.ApplyProtection) + case "normal" => + locatedForceDomesInZone.foreach(_.Actor ! ForceDomeControl.NormalBehavior) + case "purge" => + locatedForceDomesInZone.foreach(_.Actor ! ForceDomeControl.Purge) + case "help" | "usage" => + postUsageMessage = true + case token => + sendResponse(ChatMsg(ChatMessageType.UNK_227, s"unknown command - $token")) + postUsageMessage = true + } + if (postUsageMessage) { + sendResponse(ChatMsg(ChatMessageType.UNK_227, "!forcedome [o[n]|of[f]|protect|normal|purge]")) + } + } else { + //no force domes in zone + sendResponse(ChatMsg(ChatMessageType.UNK_227, "no capitol force dome(s) detected in zone")) + } + true + } + private def customCommandOnOffStateOrNone(stateOpt: Option[String]): Option[Boolean] = { stateOpt match { case None => diff --git a/src/main/scala/net/psforever/objects/serverobject/dome/ForceDomeControl.scala b/src/main/scala/net/psforever/objects/serverobject/dome/ForceDomeControl.scala index 53bec2242..ffbb7c745 100644 --- a/src/main/scala/net/psforever/objects/serverobject/dome/ForceDomeControl.scala +++ b/src/main/scala/net/psforever/objects/serverobject/dome/ForceDomeControl.scala @@ -396,8 +396,9 @@ class ForceDomeControl(dome: ForceDomePhysics) if customState.nonEmpty => customState = None ForceDomeControl.NormalDomeStateMessage(domeOwnerAsABuilding) - ForceDomeControl.AlignForceDomeStatusAndUpdate(domeOwnerAsABuilding, dome) - ForceDomeControl.ForceDomeKills(dome, perimeterSegments) + if (!blockedByCustomStateOr(ForceDomeControl.AlignForceDomeStatusAndUpdate)) { + ForceDomeControl.ForceDomeKills(dome, perimeterSegments) + } case ForceDomeControl.ApplyProtection if dome.Energized =>