diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index b47118223d3..e50655697df 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -108,6 +108,13 @@ #define istable(S) (istype(S, /obj/structure/table)) +GLOBAL_LIST_INIT(placeable_surface_types, typecacheof(list( + /obj/structure/table, + /obj/structure/rack, + /obj/structure/shelf,))) + +#define is_surface(W) (is_type_in_typecache(W, GLOB.placeable_surface_types)) + GLOBAL_LIST_INIT(pointed_types, typecacheof(list( /obj/item/pen, /obj/item/screwdriver, diff --git a/code/game/objects/items/devices/gasanalyzer.dm b/code/game/objects/items/devices/gasanalyzer.dm index d44309d4228..dcfa16d643c 100644 --- a/code/game/objects/items/devices/gasanalyzer.dm +++ b/code/game/objects/items/devices/gasanalyzer.dm @@ -106,10 +106,10 @@ /obj/item/analyzer/interact_with_atom(atom/target, mob/living/user, list/modifiers) ..() - if(!isturf(target.loc)) + if(!isturf(target.loc) && !isturf(target)) return NONE - if(isstorage(target)) + if(isstorage(target) || is_surface(target)) return NONE if(target.return_analyzable_air()) diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm index 047d721bd9b..9a3b41a3528 100644 --- a/code/game/objects/items/devices/laserpointer.dm +++ b/code/game/objects/items/devices/laserpointer.dm @@ -51,7 +51,7 @@ if(!isturf(target.loc)) return NONE - if(isstorage(target)) + if(isstorage(target) || is_surface(target)) return NONE laser_act(target, user, modifiers) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index ee0d4c71c8c..fc430220c39 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -217,10 +217,7 @@ /obj/item/lightreplacer/proc/CanUse(mob/living/user) add_fingerprint(user) - if(uses > 0) - return 1 - else - return 0 + return (uses > 0) /obj/item/lightreplacer/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(..()) @@ -233,6 +230,9 @@ return ITEM_INTERACT_COMPLETE return ..() + if(is_surface(target)) + return NONE + var/turf/replace_turf = get_turf(target) if(!istype(replace_turf)) return ITEM_INTERACT_COMPLETE diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index dbdd778a2c8..44fe2617da9 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -96,6 +96,8 @@ SLIME SCANNER /obj/item/reagent_scanner/interact_with_atom(atom/target, mob/living/user, list/modifiers) . = ..() + if(isstorage(target) || is_surface(target)) + return NONE do_scan(target, user) return ITEM_INTERACT_COMPLETE @@ -185,6 +187,8 @@ SLIME SCANNER /obj/item/slime_scanner/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(user.incapacitated() || user.AmountBlinded()) return ..() + if(isstorage(target) || is_surface(target)) + return NONE if(!isslime(target)) to_chat(user, SPAN_WARNING("This device can only scan slimes!")) return ITEM_INTERACT_COMPLETE diff --git a/code/game/objects/items/soap.dm b/code/game/objects/items/soap.dm index 4cd7bf5281d..a0f81065ef7 100644 --- a/code/game/objects/items/soap.dm +++ b/code/game/objects/items/soap.dm @@ -25,7 +25,7 @@ /obj/item/soap/interact_with_atom(atom/target, mob/living/user, list/modifiers) if(!ismob(target)) // if it's a storage item and it isn't dirty, just put the soap in the storage - if(isstorage(target) && !target.is_dirty()) + if((isstorage(target) || is_surface(target)) && !target.is_dirty()) return ..() target.cleaning_act(user, src, cleanspeed) return ITEM_INTERACT_COMPLETE diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index af2b9aba16d..dbd78cc6979 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -32,7 +32,7 @@ /obj/item/reagent_containers/spray/normal_act(atom/A, mob/living/user) . = TRUE - if(isstorage(A) || ismodcontrol(A) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack) || istype(A, /obj/structure/closet) \ + if(isstorage(A) || ismodcontrol(A) || is_surface(A) || istype(A, /obj/structure/closet) \ || istype(A, /obj/item/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics)) return FALSE