From b40e58f342f8d2b7f54b78ea71e723f8cd81d37d Mon Sep 17 00:00:00 2001
From: Arkatos1 <43862960+Arkatos1@users.noreply.github.com>
Date: Tue, 1 Sep 2020 09:37:50 +0200
Subject: [PATCH] Admin controlled shuttles improvements (#53237)
This PR improves options for admin controlled shuttles - all shuttle controls can be admin-locked, and players must request authorization so the shuttle can move or for controls to unlock. Before this PR, authorization request always redirected admin staff to control the CentCom ferry, even if request came from a shuttle elsewhere, which was a little odd.
Authorization request will now properly prompt the staff to control that specific shuttle, and now they also have quick option to unlock/lock the shuttle. Could come handy in events to restrict player movement.
Last change, escape pods no longer start as admin controlled, as they cannot be launched without atleast code red anyway. They instead properly state they are just locked.
---
code/modules/admin/topic.dm | 19 +++++++++++++++++++
.../security_levels/security_levels.dm | 4 ++--
code/modules/shuttle/computer.dm | 16 +++++++++++++---
code/modules/shuttle/emergency.dm | 2 +-
4 files changed, 35 insertions(+), 6 deletions(-)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index a3a995bb28a..c80d5d4315d 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -246,6 +246,25 @@
usr.client.trigger_centcom_recall()
+ else if(href_list["move_shuttle"])
+ if(!check_rights(R_ADMIN))
+ return
+
+ var/obj/docking_port/mobile/shuttle = SSshuttle.getShuttle(href_list["move_shuttle"])
+ if(!shuttle)
+ return
+ shuttle.admin_fly_shuttle(usr)
+
+ else if(href_list["unlock_shuttle"])
+ if(!check_rights(R_ADMIN))
+ return
+
+ var/obj/machinery/computer/shuttle/shuttle_console = locate(href_list["unlock_shuttle"])
+ if(!shuttle_console)
+ return
+ shuttle_console.admin_controlled = !shuttle_console.admin_controlled
+ to_chat(usr, "[shuttle_console] was [shuttle_console.admin_controlled ? "locked" : "unlocked"].", confidential = TRUE)
+
else if(href_list["toggle_continuous"])
if(!check_rights(R_ADMIN))
return
diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm
index 882d93e891f..3a17b3dab11 100644
--- a/code/modules/security_levels/security_levels.dm
+++ b/code/modules/security_levels/security_levels.dm
@@ -60,7 +60,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
if(is_station_level(FA.z))
FA.update_icon()
for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines)
- pod.admin_controlled = FALSE
+ pod.locked = FALSE
if(SEC_LEVEL_DELTA)
minor_announce(CONFIG_GET(string/alert_delta), "Attention! Delta security level reached!",1)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
@@ -73,7 +73,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
if(is_station_level(FA.z))
FA.update_icon()
for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines)
- pod.admin_controlled = FALSE
+ pod.locked = FALSE
if(level >= SEC_LEVEL_RED)
for(var/obj/machinery/door/D in GLOB.machines)
if(D.red_alert_access)
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 6dfdd8fbb8e..d0dbf15d56c 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -15,6 +15,8 @@
var/no_destination_swap = FALSE
/// ID of the currently selected destination of the attached shuttle
var/destination
+ /// If the console controls are locked
+ var/locked = FALSE
/// Authorization request cooldown to prevent request spam to admin staff
COOLDOWN_DECLARE(request_cooldown)
@@ -30,7 +32,7 @@
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
data["docked_location"] = M ? M.get_status_text_tgui() : "Unknown"
data["locations"] = list()
- data["locked"] = FALSE
+ data["locked"] = locked
data["authorization_required"] = admin_controlled
data["timer_str"] = M ? M.getTimerStr() : "00:00"
data["destination"] = destination
@@ -39,8 +41,16 @@
return data
if(admin_controlled)
data["status"] = "Unauthorized Access"
+ else if(locked)
+ data["status"] = "Locked"
else
- data["status"] = M.mode == SHUTTLE_IGNITING ? "Igniting" : M.mode != SHUTTLE_IDLE ? "In Transit" : "Idle"
+ switch(M.mode)
+ if(SHUTTLE_IGNITING)
+ data["status"] = "Igniting"
+ if(SHUTTLE_IDLE)
+ data["status"] = "Idle"
+ else
+ data["status"] = "In Transit"
for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
if(!options.Find(S.id))
continue
@@ -106,7 +116,7 @@
return
COOLDOWN_START(src, request_cooldown, 1 MINUTES)
to_chat(usr, "Your request has been received by CentCom.")
- to_chat(GLOB.admins, "FERRY: [ADMIN_LOOKUPFLW(usr)] (Move Ferry) is requesting to move the transport ferry to CentCom.")
+ to_chat(GLOB.admins, "SHUTTLE: [ADMIN_LOOKUPFLW(usr)] (Move Shuttle)(Lock/Unlock Shuttle) is requesting to move or unlock the shuttle.")
return TRUE
/obj/machinery/computer/shuttle/emag_act(mob/user)
diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm
index 0f532aec134..636f6fc3274 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -465,7 +465,7 @@
/obj/machinery/computer/shuttle/pod
name = "pod control computer"
- admin_controlled = TRUE
+ locked = TRUE
possible_destinations = "pod_asteroid"
icon = 'icons/obj/terminals.dmi'
icon_state = "dorm_available"