diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index f57e2e046d..e57b4da227 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -250,6 +250,9 @@
target = safepick(view(3,target))
if(!target)
return
+ if(istype(target, /obj/machinery))
+ if (src.interface_action(target))
+ return
if(!target.Adjacent(src))
if(selected && selected.is_ranged())
selected.action(target)
@@ -259,6 +262,29 @@
src.melee_action(target)
return
+/obj/mecha/proc/interface_action(obj/machinery/target)
+ if(istype(target, /obj/machinery/access_button))
+ src.occupant_message("Interfacing with [target].")
+ src.log_message("Interfaced with [target].")
+ target.attack_hand(src.occupant)
+ return 1
+ if(istype(target, /obj/machinery/embedded_controller))
+ target.ui_interact(src.occupant)
+ return 1
+ return 0
+
+/obj/mecha/contents_nano_distance(var/src_object, var/mob/living/user)
+ . = user.shared_living_nano_distance(src_object) //allow them to interact with anything they can interact with normally.
+ if(. != STATUS_INTERACTIVE)
+ //Allow interaction with the mecha or anything that is part of the mecha
+ if(src_object == src || (src_object in src))
+ return STATUS_INTERACTIVE
+ if(src.Adjacent(src_object))
+ src.occupant_message("Interfacing with [src_object]...")
+ src.log_message("Interfaced with [src_object].")
+ return STATUS_INTERACTIVE
+ if(src_object in view(2, src))
+ return STATUS_UPDATE //if they're close enough, allow the occupant to see the screen through the viewport or whatever.
/obj/mecha/proc/melee_action(atom/target)
return
diff --git a/code/modules/nano/nanointeraction.dm b/code/modules/nano/nanointeraction.dm
index c8dfa630d6..5b0a7ec01a 100644
--- a/code/modules/nano/nanointeraction.dm
+++ b/code/modules/nano/nanointeraction.dm
@@ -78,6 +78,10 @@
return STATUS_UPDATE // update only (orange visibility)
return STATUS_INTERACTIVE
+//Some atoms such as vehicles might have special rules for how mobs inside them interact with NanoUI.
+/atom/proc/contents_nano_distance(var/src_object, var/mob/living/user)
+ return user.shared_living_nano_distance(src_object)
+
/mob/living/proc/shared_living_nano_distance(var/atom/movable/src_object)
if(!isturf(src_object.loc))
if(src_object.loc == src) // Item in the inventory
@@ -100,7 +104,10 @@
/mob/living/can_use_topic(var/src_object, var/datum/topic_state/custom_state)
. = shared_living_nano_interaction(src_object)
if(. == STATUS_INTERACTIVE && !(custom_state.flags & NANO_IGNORE_DISTANCE))
- . = shared_living_nano_distance(src_object)
+ if(loc)
+ . = loc.contents_nano_distance(src_object, src)
+ else
+ . = shared_living_nano_distance(src_object)
if(STATUS_INTERACTIVE)
return STATUS_UPDATE