diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 143aba3fe4..cae9f5b742 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -76,7 +76,7 @@
circuit = /obj/item/circuitboard/computer/mining_shuttle
shuttleId = "mining"
possible_destinations = "mining_home;mining_away;landing_zone_dock;mining_public"
- no_destination_swap = 1
+ no_destination_swap = TRUE
var/static/list/dumb_rev_heads = list()
/obj/machinery/computer/shuttle/mining/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm
index 52fafb81be..99357d802a 100644
--- a/code/modules/security_levels/security_levels.dm
+++ b/code/modules/security_levels/security_levels.dm
@@ -86,7 +86,7 @@ GLOBAL_LIST_INIT(all_security_levels, list("green", "blue", "amber", "red", "del
if(is_station_level(FA.z))
FA.update_icon()
for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines)
- pod.admin_controlled = 0
+ pod.admin_controlled = 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)
@@ -102,7 +102,7 @@ GLOBAL_LIST_INIT(all_security_levels, list("green", "blue", "amber", "red", "del
if(is_station_level(FA.z))
FA.update_icon()
for(var/obj/machinery/computer/shuttle/pod/pod in GLOB.machines)
- pod.admin_controlled = 0
+ pod.admin_controlled = 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 cee83c5b23..518cfe5a70 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -5,62 +5,108 @@
icon_keyboard = "tech_key"
light_color = LIGHT_COLOR_CYAN
req_access = list( )
+ /// ID of the attached shuttle
var/shuttleId
+ /// Possible destinations of the attached shuttle
var/possible_destinations = ""
- var/admin_controlled
- var/no_destination_swap = 0
+ /// Variable dictating if the attached shuttle requires authorization from the admin staff to move
+ var/admin_controlled = FALSE
+ /// Variable dictating if the attached shuttle can change destinations mid-flight
+ var/no_destination_swap = FALSE
+ /// ID of the currently selected destination of the attached shuttle
+ var/destination
+ /// Authorization request cooldown to prevent request spam to admin staff
+ COOLDOWN_DECLARE(request_cooldown)
-/obj/machinery/computer/shuttle/ui_interact(mob/user)
- . = ..()
+/obj/machinery/computer/shuttle/ui_interact(mob/user, datum/tgui/ui)
+ ui = SStgui.try_update_ui(user, src, ui)
+ if(!ui)
+ ui = new(user, src, "ShuttleConsole", name)
+ ui.open()
+
+/obj/machinery/computer/shuttle/ui_data(mob/user)
+ var/list/data = list()
var/list/options = params2list(possible_destinations)
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
- var/dat = "Status: [M ? M.getStatusText() : "*Missing*"]
"
- if(M)
- var/destination_found
- for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
- if(!options.Find(S.id))
- continue
- if(!M.check_dock(S, silent=TRUE))
- continue
- destination_found = 1
- dat += "Send to [S.name]
"
- if(!destination_found)
- dat += "Shuttle Locked
"
- if(admin_controlled)
- dat += "Authorized personnel only
"
- dat += "Request Authorization
"
- dat += "Close"
+ data["docked_location"] = M ? M.get_status_text_tgui() : "Unknown"
+ data["status"] = M.mode == SHUTTLE_IGNITING ? "Igniting" : M.mode != SHUTTLE_IDLE ? "In Transit" : "Idle"
+ data["locations"] = list()
+ data["locked"] = FALSE
+ data["authorization_required"] = admin_controlled
+ data["timer_str"] = M ? M.getTimerStr() : "00:00"
+ data["destination"] = destination
+ if(admin_controlled)
+ data["status"] = "Unauthorized Access"
+ if(!M)
+ data["status"] = "Missing"
+ return data
+ for(var/obj/docking_port/stationary/S in SSshuttle.stationary)
+ if(!options.Find(S.id))
+ continue
+ if(!M.check_dock(S, silent = TRUE))
+ continue
+ var/list/location_data = list(
+ id = S.id,
+ name = S.name
+ )
+ data["locations"] += list(location_data)
+ if(length(data["locations"]) == 1)
+ for(var/location in data["locations"])
+ destination = location["id"]
+ data["destination"] = destination
+ if(!length(data["locations"]))
+ data["locked"] = TRUE
+ data["status"] = "Locked"
+ return data
- var/datum/browser/popup = new(user, "computer", M ? M.name : "shuttle", 300, 200)
- popup.set_content("
[dat]")
- popup.open()
-
-/obj/machinery/computer/shuttle/Topic(href, href_list)
- if(..())
+/obj/machinery/computer/shuttle/ui_act(action, params)
+ . = ..()
+ if(.)
return
- usr.set_machine(src)
- src.add_fingerprint(usr)
if(!allowed(usr))
to_chat(usr, "Access denied.")
return
- if(href_list["move"])
- var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
- if(M.launch_status == ENDGAME_LAUNCHED)
- to_chat(usr, "You've already escaped. Never going back to that place again!")
- return
- if(no_destination_swap)
- if(M.mode != SHUTTLE_IDLE)
- to_chat(usr, "Shuttle already in transit.")
+ switch(action)
+ if("move")
+ var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
+ if(M.launch_status == ENDGAME_LAUNCHED)
+ to_chat(usr, "You've already escaped. Never going back to that place again!")
return
- switch(SSshuttle.moveShuttle(shuttleId, href_list["move"], 1))
- if(0)
- say("Shuttle departing. Please stand away from the doors.")
- log_shuttle("[key_name(usr)] has sent shuttle \"[M]\" towards \"[href_list["move"]]\", using [src].")
- if(1)
- to_chat(usr, "Invalid shuttle requested.")
- else
- to_chat(usr, "Unable to comply.")
+ if(no_destination_swap)
+ if(M.mode == SHUTTLE_RECHARGING)
+ to_chat(usr, "Shuttle engines are not ready for use.")
+ return
+ if(M.mode != SHUTTLE_IDLE)
+ to_chat(usr, "Shuttle already in transit.")
+ return
+ var/list/options = params2list(possible_destinations)
+ if(!(params["shuttle_id"] in options))
+ log_admin("[usr] attempted to href dock exploit on [src] with target location \"[params["shuttle_id"]]\"")
+ message_admins("[usr] just attempted to href dock exploit on [src] with target location \"[params["shuttle_id"]]\"")
+ return
+ switch(SSshuttle.moveShuttle(shuttleId, params["shuttle_id"], 1))
+ if(0)
+ say("Shuttle departing. Please stand away from the doors.")
+ log_shuttle("[key_name(usr)] has sent shuttle \"[M]\" towards \"[params["shuttle_id"]]\", using [src].")
+ return TRUE
+ if(1)
+ to_chat(usr, "Invalid shuttle requested.")
+ else
+ to_chat(usr, "Unable to comply.")
+ if("set_destination")
+ var/target_destination = params["destination"]
+ if(target_destination)
+ destination = target_destination
+ return TRUE
+ if("request")
+ if(!COOLDOWN_FINISHED(src, request_cooldown))
+ to_chat(usr, "CentCom is still processing last authorization request!")
+ 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.")
+ 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 810cadcd2c..15f9b31302 100644
--- a/code/modules/shuttle/emergency.dm
+++ b/code/modules/shuttle/emergency.dm
@@ -528,7 +528,7 @@
/obj/machinery/computer/shuttle/pod
name = "pod control computer"
- admin_controlled = 1
+ admin_controlled = TRUE
possible_destinations = "pod_asteroid"
icon = 'icons/obj/terminals.dmi'
icon_state = "dorm_available"
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index 39bde5e541..892e135bdf 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -5,7 +5,6 @@
shuttleId = "ferry"
possible_destinations = "ferry_home;ferry_away"
req_access = list(ACCESS_CENT_GENERAL)
-
var/allow_silicons = FALSE
var/allow_emag = FALSE
@@ -24,17 +23,6 @@
/obj/machinery/computer/shuttle/ferry/request
name = "ferry console"
circuit = /obj/item/circuitboard/computer/ferry/request
- var/last_request //prevents spamming admins
- var/cooldown = 600
possible_destinations = "ferry_home;ferry_away"
req_access = list(ACCESS_CENT_GENERAL)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
-
-/obj/machinery/computer/shuttle/ferry/request/Topic(href, href_list)
- ..()
- if(href_list["request"])
- if(last_request && (last_request + cooldown > world.time))
- return
- last_request = world.time
- 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.")
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index d7a6d4a583..34275ed9c1 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -711,6 +711,26 @@
else
return "00:00"
+/**
+ * Gets shuttle location status in a form of string for tgui interfaces
+ */
+/obj/docking_port/mobile/proc/get_status_text_tgui()
+ var/obj/docking_port/stationary/dockedAt = get_docked()
+ var/docked_at = dockedAt?.name || "Unknown"
+ if(istype(dockedAt, /obj/docking_port/stationary/transit))
+ if(timeLeft() > 1 HOURS)
+ return "Hyperspace"
+ else
+ var/obj/docking_port/stationary/dst
+ if(mode == SHUTTLE_RECALL)
+ dst = previous
+ else
+ dst = destination
+ return "In transit towards [dst?.name || "unknown location"]"
+ else if(mode == SHUTTLE_RECHARGING)
+ return "[docked_at], recharging [getTimerStr()]"
+ else
+ return docked_at
/obj/docking_port/mobile/proc/getStatusText()
var/obj/docking_port/stationary/dockedAt = get_docked()
@@ -730,7 +750,6 @@
else
return docked_at
-
/obj/docking_port/mobile/proc/getDbgStatusText()
var/obj/docking_port/stationary/dockedAt = get_docked()
. = (dockedAt && dockedAt.name) ? dockedAt.name : "unknown"