csr-level commands for force dome manipulation

This commit is contained in:
Fate-JH 2026-01-04 14:05:12 -05:00
parent 73f352490c
commit ba266d0a3e
2 changed files with 40 additions and 2 deletions

View file

@ -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 =>

View file

@ -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 =>