mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-28 10:31:59 +00:00
* 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. * Admin controlled shuttles improvements Co-authored-by: Arkatos1 <43862960+Arkatos1@users.noreply.github.com>
132 lines
4.9 KiB
Plaintext
132 lines
4.9 KiB
Plaintext
/obj/machinery/computer/shuttle
|
|
name = "shuttle console"
|
|
desc = "A shuttle control computer."
|
|
icon_screen = "shuttle"
|
|
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 = ""
|
|
/// Variable dictating if the attached shuttle requires authorization from the admin staff to move
|
|
var/admin_controlled = FALSE
|
|
/// Variable dictating if the attached shuttle is forbidden to change destinations mid-flight
|
|
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)
|
|
|
|
/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)
|
|
data["docked_location"] = M ? M.get_status_text_tgui() : "Unknown"
|
|
data["locations"] = list()
|
|
data["locked"] = locked
|
|
data["authorization_required"] = admin_controlled
|
|
data["timer_str"] = M ? M.getTimerStr() : "00:00"
|
|
data["destination"] = destination
|
|
if(!M)
|
|
data["status"] = "Missing"
|
|
return data
|
|
if(admin_controlled)
|
|
data["status"] = "Unauthorized Access"
|
|
else if(locked)
|
|
data["status"] = "Locked"
|
|
else
|
|
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
|
|
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
|
|
|
|
/obj/machinery/computer/shuttle/ui_act(action, params)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
if(!allowed(usr))
|
|
to_chat(usr, "<span class='danger'>Access denied.</span>")
|
|
return
|
|
|
|
switch(action)
|
|
if("move")
|
|
var/obj/docking_port/mobile/M = SSshuttle.getShuttle(shuttleId)
|
|
if(M.launch_status == ENDGAME_LAUNCHED)
|
|
to_chat(usr, "<span class='warning'>You've already escaped. Never going back to that place again!</span>")
|
|
return
|
|
if(no_destination_swap)
|
|
if(M.mode == SHUTTLE_RECHARGING)
|
|
to_chat(usr, "<span class='warning'>Shuttle engines are not ready for use.</span>")
|
|
return
|
|
if(M.mode != SHUTTLE_IDLE)
|
|
to_chat(usr, "<span class='warning'>Shuttle already in transit.</span>")
|
|
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, "<span class='warning'>Invalid shuttle requested.</span>")
|
|
else
|
|
to_chat(usr, "<span class='warning'>Unable to comply.</span>")
|
|
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, "<span class='warning'>CentCom is still processing last authorization request!</span>")
|
|
return
|
|
COOLDOWN_START(src, request_cooldown, 1 MINUTES)
|
|
to_chat(usr, "<span class='notice'>Your request has been received by CentCom.</span>")
|
|
to_chat(GLOB.admins, "<b>SHUTTLE: <font color='#3d5bc3'>[ADMIN_LOOKUPFLW(usr)] (<A HREF='?_src_=holder;[HrefToken()];move_shuttle=[shuttleId]'>Move Shuttle</a>)(<A HREF='?_src_=holder;[HrefToken()];unlock_shuttle=[REF(src)]'>Lock/Unlock Shuttle</a>)</b> is requesting to move or unlock the shuttle.</font>")
|
|
return TRUE
|
|
|
|
/obj/machinery/computer/shuttle/emag_act(mob/user)
|
|
if(obj_flags & EMAGGED)
|
|
return
|
|
req_access = list()
|
|
obj_flags |= EMAGGED
|
|
to_chat(user, "<span class='notice'>You fried the consoles ID checking system.</span>")
|
|
|
|
/obj/machinery/computer/shuttle/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock, idnum, override=FALSE)
|
|
if(port && (shuttleId == initial(shuttleId) || override))
|
|
shuttleId = port.id
|