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"