diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 6081882582f..220e27e0be8 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -18,8 +18,8 @@
/obj/machinery/computer/New()
overlay_layer = layer
- ..()
-
+ ..()
+
/obj/machinery/computer/initialize()
power_change()
update_icon()
@@ -79,7 +79,7 @@
overlays += image(icon,"[icon_state]_broken",overlay_layer)
else
overlays += image(icon,icon_screen,overlay_layer)
-
+
if(icon_keyboard)
overlays += image(icon, icon_keyboard ,overlay_layer)
@@ -134,6 +134,11 @@
return
/obj/machinery/computer/attack_alien(mob/living/user)
+ if(isalien(user) && user.a_intent == I_HELP)
+ var/mob/living/carbon/alien/humanoid/xeno = user
+ if(xeno.has_fine_manipulation)
+ return attack_hand(user)
+
user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
if(circuit)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 0d046868bb8..5d90d407c69 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -341,10 +341,11 @@ Class Procs:
return 1
if(user.lying || user.stat)
return 1
- if ( ! (istype(usr, /mob/living/carbon/human) || \
- istype(usr, /mob/living/silicon)))
- usr << "\red You don't have the dexterity to do this!"
+
+ if(!user.IsAdvancedToolUser())
+ user << "\red You don't have the dexterity to do this!"
return 1
+
/*
//distance checks are made by atom/proc/DblClick
if ((get_dist(src, user) > 1 || !istype(src.loc, /turf)) && !istype(user, /mob/living/silicon))
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index 4e1a5843f60..ef8cba90463 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -183,7 +183,7 @@ obj/item/device/flashlight/lamp/bananalamp
update_brightness(U)
else
update_brightness(null)
-
+
/obj/item/device/flashlight/flare/update_brightness(var/mob/user = null)
..()
if(on)
@@ -207,7 +207,7 @@ obj/item/device/flashlight/lamp/bananalamp
src.force = on_damage
src.damtype = "fire"
processing_objects += src
-
+
/obj/item/device/flashlight/flare/torch
name = "torch"
desc = "A torch fashioned from some leaves and a log."
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 976fed562c0..89d235999c6 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -384,7 +384,7 @@ REAGENT SCANNER
if (crit_fail)
user << "\red This device has critically failed and is no longer functional!"
return
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
user << "\red You don't have the dexterity to do this!"
return
if(reagents.total_volume)
@@ -441,7 +441,7 @@ REAGENT SCANNER
/obj/item/device/reagent_scanner/afterattack(obj/O, mob/user as mob)
if (user.stat)
return
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
user << "\red You don't have the dexterity to do this!"
return
if(!istype(O))
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 4f83c7bd2ac..62214dd86c2 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -15,7 +15,7 @@
user << "\The [src] cannot be applied to [M]!"
return 1
- if (!(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)))
+ if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return 1
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 29aeace7ea7..ffae91a70ce 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -169,8 +169,8 @@
afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
if (flag)
return
- if (!(istype(usr, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
- usr << "\red You don't have the dexterity to do this!"
+ if (!user.IsAdvancedToolUser())
+ user << "\red You don't have the dexterity to do this!"
return
src.add_fingerprint(user)
if (src.bullets < 1)
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 51c2a3d2b3a..82379c9defd 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -287,7 +287,7 @@
/turf/simulated/wall/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
user.changeNext_move(CLICK_CD_MELEE)
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 04ef0fdf73f..09656143c3c 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -36,7 +36,7 @@
/turf/simulated/wall/r_wall/attackby(obj/item/W as obj, mob/user as mob, params)
user.changeNext_move(CLICK_CD_MELEE)
- if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey")
+ if (!user.IsAdvancedToolUser())
user << "You don't have the dexterity to do this!"
return
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 1b1964a000f..0194aeea7f3 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1758,11 +1758,9 @@
return (health <= config.health_threshold_crit && stat == UNCONSCIOUS)
-/mob/living/carbon/human/IsAdvancedToolUser(var/silent)
+/mob/living/carbon/human/IsAdvancedToolUser()
if(species.has_fine_manipulation)
return 1
- if(!silent)
- src << "You don't have the dexterity to use that!"
return 0
/mob/living/carbon/human/get_permeability_protection()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index ad3146b2527..c78721f8357 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -18,23 +18,23 @@
var/speak_exclamation = "declares"
var/speak_query = "queries"
var/pose //Yes, now AIs can pose too.
-
+
var/sensor_mode = 0 //Determines the current HUD.
-
+
var/next_alarm_notice
var/list/datum/alarm/queued_alarms = new()
-
+
#define SEC_HUD 1 //Security HUD mode
#define MED_HUD 2 //Medical HUD mode
var/local_transmit //If set, can only speak to others of the same type within a short range.
var/obj/item/device/radio/common_radio
-
+
/mob/living/silicon/New()
silicon_mob_list |= src
..()
add_language("Galactic Common")
init_subsystems()
-
+
/mob/living/silicon/Destroy()
silicon_mob_list -= src
for(var/datum/alarm_handler/AH in alarm_handlers)
@@ -43,8 +43,8 @@
/mob/living/silicon/proc/SetName(pickedName as text)
real_name = pickedName
- name = real_name
-
+ name = real_name
+
/mob/living/silicon/proc/show_laws()
return
@@ -267,9 +267,6 @@
sensor_mode = 0
src << "Sensor augmentations disabled."
-/mob/living/silicon/IsAdvancedToolUser()
- return 1
-
/mob/living/silicon/proc/receive_alarm(var/datum/alarm_handler/alarm_handler, var/datum/alarm/alarm, was_raised)
if(!next_alarm_notice)
next_alarm_notice = world.time + SecondsToTicks(10)
@@ -310,7 +307,7 @@
reported = 1
src << "--- [AH.category] Cleared ---"
src << "\The [A.alarm_name()]."
-
+
if(alarm_raised)
src << "\[Show Alerts\]"
@@ -326,4 +323,3 @@
for(var/obj/machinery/camera/C in A.cameras())
cameratext += "[(cameratext == "")? "" : "|"][C.c_tag]"
src << "[A.alarm_name()]! ([(cameratext)? cameratext : "No Camera"])"
-
\ No newline at end of file
diff --git a/code/modules/nano/interaction/default.dm b/code/modules/nano/interaction/default.dm
index deaae348d30..9b5b2e5da91 100644
--- a/code/modules/nano/interaction/default.dm
+++ b/code/modules/nano/interaction/default.dm
@@ -102,3 +102,10 @@
. = min(., shared_living_nano_distance(src_object))
if(. == STATUS_UPDATE && (TK in mutations)) // If we have telekinesis and remain close enough, allow interaction.
return STATUS_INTERACTIVE
+
+/mob/living/carbon/alien/default_can_use_topic(var/src_object)
+ . = shared_nano_interaction(src_object)
+ if(. != STATUS_CLOSE)
+ . = min(., shared_living_nano_distance(src_object))
+ if(!IsAdvancedToolUser())
+ . = STATUS_UPDATE
\ No newline at end of file