From 2a5768ef108b57c41a18d8637fcdc69504c20f0b Mon Sep 17 00:00:00 2001 From: theOOZ Date: Sun, 6 Jul 2025 20:01:57 +0200 Subject: [PATCH] Item which lets you remote control (some) shuttles (#91663) ## About The Pull Request Adds a remote which can be printed with sufficient research, or auto-linked by mapping the remote ontop of a nav console. Once linked it can send off or call the shuttle towards a home and away destination. These destinations can be changed with alt+rmb. ## Why It's Good For The Game Let people send and call their shuttle without being at the nav computer. Really useful for antags that arrive on a shuttle, so their shuttle can be safe in deepspace while they fuck about onstation. (Should pirates have this?) ![hsu5dytbs7561](https://github.com/user-attachments/assets/a0b968c5-a567-4891-b1d4-9029ad0a41d8) ## Changelog :cl: theOOZ, kittysmooch add: Adds the shuttle remote item unlocked with shuttle engineering research, it lets you remote control the whiteship or custom shuttles. /:cl: --- code/modules/research/designs/tool_designs.dm | 11 ++ .../research/techweb/nodes/engi_nodes.dm | 1 + code/modules/shuttle/misc/shuttle_remote.dm | 150 ++++++++++++++++++ .../variants/custom/custom_consoles.dm | 1 + .../shuttle_consoles/shuttle_console.dm | 4 + .../shuttle/shuttle_consoles/white_ship.dm | 1 + icons/obj/devices/remote.dmi | Bin 8994 -> 9501 bytes tgstation.dme | 1 + 8 files changed, 169 insertions(+) create mode 100644 code/modules/shuttle/misc/shuttle_remote.dm diff --git a/code/modules/research/designs/tool_designs.dm b/code/modules/research/designs/tool_designs.dm index fdd96513848..c0696568a58 100644 --- a/code/modules/research/designs/tool_designs.dm +++ b/code/modules/research/designs/tool_designs.dm @@ -435,3 +435,14 @@ build_path = /obj/item/shuttle_blueprints category = list(RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_ENGINEERING) departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_ENGINEERING | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/shuttle_remote + name = "Shuttle Remote Control" + desc = "A remote which can send away or try to dock shuttles once linked to a navigation console." + id = "shuttle_remote" + build_path = /obj/item/shuttle_remote + materials = list(/datum/material/gold = SHEET_MATERIAL_AMOUNT, /datum/material/bluespace = HALF_SHEET_MATERIAL_AMOUNT, /datum/material/iron = SMALL_MATERIAL_AMOUNT * 2, /datum/material/glass = SMALL_MATERIAL_AMOUNT) + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_CARGO | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_ENGINEERING diff --git a/code/modules/research/techweb/nodes/engi_nodes.dm b/code/modules/research/techweb/nodes/engi_nodes.dm index 3a0da339d2b..de731b02c6f 100644 --- a/code/modules/research/techweb/nodes/engi_nodes.dm +++ b/code/modules/research/techweb/nodes/engi_nodes.dm @@ -196,6 +196,7 @@ "shuttle_control", "shuttle_docker", "shuttlerods", + "shuttle_remote", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS) announce_channels = list(RADIO_CHANNEL_ENGINEERING, RADIO_CHANNEL_SCIENCE, RADIO_CHANNEL_SUPPLY) diff --git a/code/modules/shuttle/misc/shuttle_remote.dm b/code/modules/shuttle/misc/shuttle_remote.dm new file mode 100644 index 00000000000..795fe7fd2a1 --- /dev/null +++ b/code/modules/shuttle/misc/shuttle_remote.dm @@ -0,0 +1,150 @@ +/obj/item/shuttle_remote + name = "shuttle remote" + desc = "A remote to send away or call a shuttle." + icon = 'icons/obj/devices/remote.dmi' + icon_state = "shuttleremote" + w_class = WEIGHT_CLASS_SMALL + /// if the docks may be changed + var/may_change_docks = TRUE //if this is set to FALSE make sure the shuttle it will be linked to does NOT get to have multiple instances of itself + /// the port where the shuttle leaves to + var/shuttle_away_id = "whiteship_lavaland" + /// the port where the shuttle returns to + var/shuttle_home_id = "whiteship_home" + /// var which will hold the nav computer + var/datum/weakref/computer_ref + /// var which will hold the mobile port + var/obj/docking_port/mobile/our_port + +/obj/item/shuttle_remote/add_context(atom/source, list/context, obj/item/held_item, mob/user) + . = ..() + var/obj/machinery/computer/shuttle/our_computer = computer_ref?.resolve() + if(may_change_docks && our_computer) + context[SCREENTIP_CONTEXT_LMB] = "Use" + context[SCREENTIP_CONTEXT_ALT_RMB] = "Change Shuttle Docks" + +/obj/item/shuttle_remote/examine(mob/user) + . = ..() + var/obj/machinery/computer/shuttle/our_computer = computer_ref?.resolve() + if(may_change_docks && our_computer) + . += span_notice("You can change where the [get_area_name(SSshuttle.getShuttle(our_computer.shuttleId))] docks using [EXAMINE_HINT("alt-right-click")].") + +/obj/item/shuttle_remote/Initialize(mapload) + . = ..() + if(!mapload) + return + var/obj/machinery/computer/shuttle/computer = locate(/obj/machinery/computer/shuttle) in loc + if(!computer) + return + computer.remote_ref = WEAKREF(src) + computer_ref = WEAKREF(computer) + +/obj/item/shuttle_remote/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + var/obj/machinery/computer/shuttle/our_computer = computer_ref?.resolve() + if(!istype(interacting_with, /obj/machinery/computer/shuttle)) + return NONE + if(our_computer || our_port) + balloon_alert(user, "already linked!") + return ITEM_INTERACT_BLOCKING + var/obj/machinery/computer/shuttle/new_computer = interacting_with + if(new_computer.remote_ref || !new_computer.may_be_remote_controlled) + balloon_alert(user, "occupied signal!") + return ITEM_INTERACT_BLOCKING + new_computer.remote_ref = WEAKREF(src) + computer_ref = WEAKREF(new_computer) + our_port = SSshuttle.getShuttle(new_computer.shuttleId) + playsound(src, 'sound/machines/beep/beep.ogg', 30) + balloon_alert(user, "linked") + return ITEM_INTERACT_SUCCESS + +/obj/item/shuttle_remote/attack_self(mob/user) + var/obj/machinery/computer/shuttle/our_computer = computer_ref?.resolve() + if(!our_port) + our_port = SSshuttle.getShuttle(our_computer.shuttleId) //incase we were maploaded + if(!can_use(user)) + return + + var/obj/docking_port/home = SSshuttle.getDock(shuttle_home_id) + var/obj/docking_port/away = SSshuttle.getDock(shuttle_away_id) + var/obj/docking_port/dock = our_port.get_docked() + + var/send_off_text = "Are you sure you want to send off [get_area_name(SSshuttle.getShuttle(our_computer.shuttleId))] to [away.name]?" + var/list/send_off_options = list("Yes", "No") + var/destination = null + + if(home == dock || ("[our_computer.shuttleId]_custom" == dock.shuttle_id)) + switch(tgui_alert(user, send_off_text, "Send Off Shuttle?", send_off_options)) + if("Yes") + destination = away.shuttle_id + else if(away == dock) + send_off_text = "Are you sure you want to call [get_area_name(SSshuttle.getShuttle(our_computer.shuttleId))] to [home.name]?" + for(var/list/possible_destinations in our_computer.get_valid_destinations()) + if(LAZYACCESS(possible_destinations, "id") == "[our_computer.shuttleId]_custom") + send_off_text += "\n\nCustom location loaded, try to dock?" + send_off_options += "Send to custom" + break + switch(tgui_alert(user, send_off_text, "Call Shuttle?", send_off_options)) + if("Yes") + destination = home.shuttle_id + if("Send to custom") + destination = "[our_computer.shuttleId]_custom" + + if(!destination || !can_use(user)) + return + if(!our_port.canDock(SSshuttle.getDock(destination))) + balloon_alert(user, "destination occupied!") + return + transit_shuttle(user, destination) + +/obj/item/shuttle_remote/click_alt_secondary(mob/user) + var/obj/machinery/computer/shuttle/our_computer = computer_ref?.resolve() + if(!may_change_docks || !our_computer) + return NONE + var/list/destinations_list = our_computer.get_valid_destinations() + var/list/destination_names = list() + var/list/destination_ids = list() + for(var/list/destination_data in destinations_list) + if((destination_data["id"] == shuttle_away_id) || (destination_data["id"] == shuttle_home_id)) + continue //don't display ports that are already designated + if(destination_data["id"] == "[our_computer.shuttleId]_custom") + continue //we already handle custom docking + LAZYADD(destination_names, destination_data["name"]) + LAZYADDASSOC(destination_ids, destination_data["name"], destination_data["id"]) + if(destination_names.len < 1) + balloon_alert(user, "no valid destinations!") + return NONE + var/picked_home = tgui_input_list(user, "choose which dock to designate as the shuttle's home point...", "Choose Home Dock", destination_names) + var/picked_away = tgui_input_list(user, "choose which dock to designate as the shuttle's away point...", "Choose Away Dock", destination_names) + if(picked_home && can_use(user)) + shuttle_home_id = LAZYACCESS(destination_ids, picked_home) + if(picked_away && can_use(user)) + shuttle_away_id = LAZYACCESS(destination_ids, picked_away) + return CLICK_ACTION_SUCCESS + +/obj/item/shuttle_remote/proc/can_use(mob/user) + var/obj/machinery/computer/shuttle/our_computer = computer_ref?.resolve() + if(!user.can_perform_action(src)) + return FALSE + if(is_reserved_level(loc.z)) + balloon_alert(user, "can't use here!") + return FALSE + if(!our_computer) + balloon_alert(user, "no nav computer!") + return FALSE + if(our_computer.locked) + balloon_alert(user, "nav computer locked!") + return FALSE + if(our_port.mode != SHUTTLE_IDLE) + balloon_alert(user, "engines recharging!") + return FALSE + if(!our_port.canDock(SSshuttle.getDock(shuttle_home_id))) + balloon_alert(user, "home dock occupied!") + return FALSE + if(!our_port.canDock(SSshuttle.getDock(shuttle_away_id))) + balloon_alert(user, "away dock occupied!") + return FALSE + return TRUE + +/obj/item/shuttle_remote/proc/transit_shuttle(mob/user, destination) + var/obj/machinery/computer/shuttle/our_computer = computer_ref?.resolve() + our_computer.send_shuttle(destination, user) + our_computer.destination = destination diff --git a/code/modules/shuttle/mobile_port/variants/custom/custom_consoles.dm b/code/modules/shuttle/mobile_port/variants/custom/custom_consoles.dm index 15da8b8f6da..6632fe6ceaf 100644 --- a/code/modules/shuttle/mobile_port/variants/custom/custom_consoles.dm +++ b/code/modules/shuttle/mobile_port/variants/custom/custom_consoles.dm @@ -3,6 +3,7 @@ shuttleId = "" possible_destinations = "whiteship_home;" circuit = /obj/item/circuitboard/computer/shuttle/flight_control + may_be_remote_controlled = TRUE var/static/list/connections = list(COMSIG_TURF_ADDED_TO_SHUTTLE = PROC_REF(on_loc_added_to_shuttle)) /obj/machinery/computer/shuttle/custom_shuttle/on_construction(mob/user, from_flatpack = FALSE) diff --git a/code/modules/shuttle/shuttle_consoles/shuttle_console.dm b/code/modules/shuttle/shuttle_consoles/shuttle_console.dm index 66fa7071d13..141f5769db0 100644 --- a/code/modules/shuttle/shuttle_consoles/shuttle_console.dm +++ b/code/modules/shuttle/shuttle_consoles/shuttle_console.dm @@ -28,6 +28,10 @@ var/locked = FALSE /// List of head revs who have already clicked through the warning about not using the console var/static/list/dumb_rev_heads = list() + ///the remote control device linked + var/datum/weakref/remote_ref + ///may this console be remote controlled? + var/may_be_remote_controlled = FALSE /// Authorization request cooldown to prevent request spam to admin staff COOLDOWN_DECLARE(request_cooldown) diff --git a/code/modules/shuttle/shuttle_consoles/white_ship.dm b/code/modules/shuttle/shuttle_consoles/white_ship.dm index b222fde787b..bb22286c3d0 100644 --- a/code/modules/shuttle/shuttle_consoles/white_ship.dm +++ b/code/modules/shuttle/shuttle_consoles/white_ship.dm @@ -4,6 +4,7 @@ circuit = /obj/item/circuitboard/computer/white_ship shuttleId = "whiteship" possible_destinations = "whiteship_away;whiteship_home;whiteship_z4;whiteship_waystation;whiteship_lavaland;whiteship_custom" + may_be_remote_controlled = TRUE /// Console used on the whiteship bridge. Comes with GPS pre-baked. /obj/machinery/computer/shuttle/white_ship/bridge diff --git a/icons/obj/devices/remote.dmi b/icons/obj/devices/remote.dmi index e6a008bb6230cdf9b431f8867a4c53a6a2c39d08..25bf9fec656284bec86ece89d13ac833696c801c 100644 GIT binary patch literal 9501 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 literal 8994 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 diff --git a/tgstation.dme b/tgstation.dme index 001b81e54a4..9630cedd5c6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6093,6 +6093,7 @@ #include "code\modules\shuttle\misc\manipulator.dm" #include "code\modules\shuttle\misc\medisim.dm" #include "code\modules\shuttle\misc\ripple.dm" +#include "code\modules\shuttle\misc\shuttle_remote.dm" #include "code\modules\shuttle\misc\spaceship_navigation_beacon.dm" #include "code\modules\shuttle\misc\special.dm" #include "code\modules\shuttle\mobile_port\mobile_port.dm"