diff --git a/code/__defines/traits/declarations.dm b/code/__defines/traits/declarations.dm index 928a7dce91d..afb1fbb9367 100644 --- a/code/__defines/traits/declarations.dm +++ b/code/__defines/traits/declarations.dm @@ -57,3 +57,5 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_ELECTROVORE_OBLIGATE "electrovore_obligate" // adds wet stacks when licking someone #define TRAIT_SLOBBER "slobber" +// Owner will be considered a tiny mob for some interactions, such as airlocks not opening unless they have a client, or being vacuumed up by the vacpack +#define TRAIT_AMBIENT_PEST_MOB "ambient_pest_mob" diff --git a/code/_global_vars/traits/_traits.dm b/code/_global_vars/traits/_traits.dm index f99323c8d6f..ac7f9f30618 100644 --- a/code/_global_vars/traits/_traits.dm +++ b/code/_global_vars/traits/_traits.dm @@ -28,6 +28,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_NO_EXTINGUISH" = TRAIT_NO_EXTINGUISH, "TRAIT_TESLA_SHOCKIMMUNE" = TRAIT_TESLA_SHOCKIMMUNE, "TRAIT_MADNESS_IMMUNE" = TRAIT_MADNESS_IMMUNE, + "TRAIT_AMBIENT_PEST_MOB" = TRAIT_AMBIENT_PEST_MOB, ), /obj = list( "TRAIT_CLIMBABLE" = TRAIT_CLIMBABLE, diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 255a5bbb4fd..c42baca7e02 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -631,7 +631,7 @@ GLOBAL_LIST_INIT(advance_cures, list( if(H.get_species() == SPECIES_UNATHI || H.get_species() == SPECIES_TAJARAN) prefixes += list("Vermin ", "Zoo", "Maintenance ") bodies += list("Rat", "Maint") - if(ismouse(diseasesource) && !istype(diseasesource, /mob/living/simple_mob/animal/passive/mouse/white/virology)) + if(HAS_TRAIT(diseasesource, TRAIT_AMBIENT_PEST_MOB) && !istype(diseasesource, /mob/living/simple_mob/animal/passive/mouse/white/virology)) prefixes += list("Vermin ", "Zoo", "Maintenance ") bodies += list("Rat", "Maint") else switch(diseasesource.type) diff --git a/code/datums/elements/rotatable.dm b/code/datums/elements/rotatable.dm index a1d7f650964..4148f95ddc4 100644 --- a/code/datums/elements/rotatable.dm +++ b/code/datums/elements/rotatable.dm @@ -23,23 +23,23 @@ return ..() // Core rotation proc, override me to add conditions to object rotations or update_icons/state after! -/atom/movable/proc/handle_rotation_verbs(angle) - if(isobserver(usr)) +/atom/movable/proc/handle_rotation_verbs(angle, mob/user) + if(isobserver(user)) if(!ghosts_can_use_rotate_verbs()) return FALSE else - if(usr.incapacitated()) + if(user.incapacitated()) return FALSE - if(ismouse(usr)) - to_chat(usr, span_notice("You are too tiny to do that!")) + if(HAS_TRAIT(user, TRAIT_AMBIENT_PEST_MOB)) + to_chat(user, span_notice("You are too tiny to do that!")) return FALSE if(anchored && !can_use_rotate_verbs_while_anchored()) - to_chat(usr, span_notice("It is fastened to the floor!")) + to_chat(user, span_notice("It is fastened to the floor!")) return FALSE set_dir(turn(dir, angle)) - to_chat(usr, span_notice("You rotate \the [src] to face [dir2text(dir)]!")) + to_chat(user, span_notice("You rotate \the [src] to face [dir2text(dir)]!")) return TRUE // Overrides for customization @@ -55,18 +55,18 @@ set name = "Rotate Clockwise" set category = "Object" set src in view(1) - return handle_rotation_verbs(270) + return handle_rotation_verbs(270, usr) /atom/movable/proc/rotate_counterclockwise() SHOULD_NOT_OVERRIDE(TRUE) set name = "Rotate Counter Clockwise" set category = "Object" set src in view(1) - return handle_rotation_verbs(90) + return handle_rotation_verbs(90, usr) /atom/movable/proc/turn_around() SHOULD_NOT_OVERRIDE(TRUE) set name = "Turn Around" set category = "Object" set src in view(1) - return handle_rotation_verbs(180) + return handle_rotation_verbs(180, usr) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 15aa7c1c68d..e3176880fcc 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -131,8 +131,8 @@ M.last_bumped = world.time if(M.restrained() && !check_access(null)) return - else if(istype(M, /mob/living/simple_mob/animal/passive/mouse) && !(M.ckey)) //VOREStation Edit: Make wild mice - return //VOREStation Edit: unable to open doors + else if(HAS_TRAIT(M, TRAIT_AMBIENT_PEST_MOB) && !(M.ckey)) + return else bumpopen(M) return diff --git a/code/game/objects/items/devices/vacpack.dm b/code/game/objects/items/devices/vacpack.dm index b10230e3d52..490012ed613 100644 --- a/code/game/objects/items/devices/vacpack.dm +++ b/code/game/objects/items/devices/vacpack.dm @@ -154,7 +154,7 @@ if(L.size_multiplier < 0.5 || vac_power >= 6) suckables += L continue - if(istype(L,/mob/living/simple_mob/animal/passive/mouse) || istype(L,/mob/living/simple_mob/animal/passive/lizard) || istype(L,/mob/living/simple_mob/animal/passive/cockroach)) + if(HAS_TRAIT(L, TRAIT_AMBIENT_PEST_MOB)) suckables += L if(LAZYLEN(suckables)) if(vac_power == 7) @@ -166,7 +166,7 @@ auto_setting = min(I.w_class, 5) if(isliving(F)) var/mob/living/L = F - if(L.size_multiplier < 0.5 || istype(L,/mob/living/simple_mob/animal/passive/mouse) || istype(L,/mob/living/simple_mob/animal/passive/lizard) || istype(L,/mob/living/simple_mob/animal/passive/cockroach)) + if(L.size_multiplier < 0.5 || HAS_TRAIT(L, TRAIT_AMBIENT_PEST_MOB)) if(auto_setting < 3) auto_setting = 3 else @@ -246,7 +246,7 @@ if(L.anchored || !L.devourable || L == user || L.buckled || !L.can_be_drop_prey) return if(vac_power >= 3) - if(L.size_multiplier > 0.5 || istype(L,/mob/living/simple_mob/animal/passive/mouse) || istype(L,/mob/living/simple_mob/animal/passive/lizard)) + if(L.size_multiplier > 0.5 || HAS_TRAIT(L, TRAIT_AMBIENT_PEST_MOB)) valid_to_suck = TRUE auto_setting = 3 if(vac_power >= 6) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index eb0f772103a..4bc1c61b7a8 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -133,8 +133,8 @@ if (WEST) add_overlay(image(icon, src, "[icon_modifier]mcorneroverlay", pixel_y = 32)) -/obj/structure/railing/handle_rotation_verbs(angle) - if(!can_touch(usr)) +/obj/structure/railing/handle_rotation_verbs(angle, mob/user) + if(!can_touch(user)) return FALSE . = ..() if(.) @@ -148,7 +148,7 @@ if(usr.incapacitated()) return 0 - if (!can_touch(usr) || ismouse(usr)) + if (!can_touch(usr) || HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB)) return if(anchored) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index c92fe269ff6..f8bba46e629 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -271,7 +271,7 @@ name = "near finished " name += "[secure ? "secure " : ""]windoor assembly[created_name ? " ([created_name])" : ""]" -/obj/structure/windoor_assembly/handle_rotation_verbs(angle) +/obj/structure/windoor_assembly/handle_rotation_verbs(angle, mob/user) if(state != "01") update_nearby_tiles(need_rebuild=1) //Compel updates before . = ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index e4c3dcebd0e..cdf59985790 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -349,7 +349,7 @@ take_damage(damage) return -/obj/structure/window/handle_rotation_verbs(angle) +/obj/structure/window/handle_rotation_verbs(angle, mob/user) if(is_fulltile()) return FALSE update_nearby_tiles(need_rebuild=1) //Compel updates before diff --git a/code/modules/casino/casino.dm b/code/modules/casino/casino.dm index 7f0f6dfaa28..869769cea35 100644 --- a/code/modules/casino/casino.dm +++ b/code/modules/casino/casino.dm @@ -103,7 +103,7 @@ return if(usr.stat || usr.restrained()) return - if(ismouse(usr) || (isobserver(usr))) + if(HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB) || (isobserver(usr))) return if(busy) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 66cb6bad9df..9c0dacbfe6b 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -28,7 +28,7 @@ var/grabbed_something = 0 for(var/mob/M in T) - if(istype(M,/mob/living/simple_mob/animal/passive/lizard) || istype(M,/mob/living/simple_mob/animal/passive/mouse)) + if(HAS_TRAIT(M, TRAIT_AMBIENT_PEST_MOB)) src.loc.visible_message(span_danger("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise."),span_danger("It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.")) new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) qdel(M) diff --git a/code/modules/mob/living/silicon/robot/drone/swarm_items.dm b/code/modules/mob/living/silicon/robot/drone/swarm_items.dm index b748802f5e2..460143722ee 100644 --- a/code/modules/mob/living/silicon/robot/drone/swarm_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/swarm_items.dm @@ -22,7 +22,7 @@ var/grabbed_something = FALSE for(var/mob/M in T) - if(istype(M,/mob/living/simple_mob/animal/passive/lizard) || istype(M,/mob/living/simple_mob/animal/passive/mouse)) + if(HAS_TRAIT(M, TRAIT_AMBIENT_PEST_MOB)) src.loc.visible_message(span_danger("[src.loc] sucks [M] into its decompiler. There's a horrible crunching noise."),span_danger("It's a bit of a struggle, but you manage to suck [M] into your decompiler. It makes a series of visceral crunching noises.")) new/obj/effect/decal/cleanable/blood/splatter(get_turf(src)) qdel(M) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm index 345cae7bcc4..a24e331afd4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/cockroach.dm @@ -43,6 +43,10 @@ var/squish_chance = 25 +/mob/living/simple_mob/animal/passive/cockroach/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_AMBIENT_PEST_MOB, ROUNDSTART_TRAIT) + //Deletes the body upon death /mob/living/simple_mob/animal/passive/cockroach/death() new /obj/effect/decal/cleanable/bug_remains(src.loc) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm index 4c6974ef631..8900372057c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/lizard.dm @@ -44,6 +44,8 @@ else desc = "A cute, tiny, [body_color] lizard." + ADD_TRAIT(src, TRAIT_AMBIENT_PEST_MOB, ROUNDSTART_TRAIT) + /mob/living/simple_mob/animal/passive/lizard/large desc = "A cute, big lizard." maxHealth = 20 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index dc2445e3d90..b731d875a6c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -66,6 +66,8 @@ add_verb(src, /mob/living/proc/ventcrawl) add_verb(src, /mob/living/proc/hide) + ADD_TRAIT(src, TRAIT_AMBIENT_PEST_MOB, ROUNDSTART_TRAIT) + if(!keep_parent_data && name == initial(name)) name = "[name] ([rand(1, 1000)])" real_name = name diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 7da1c60bf3e..efd78de3c04 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -91,8 +91,8 @@ GLOBAL_LIST_INIT(cat_default_emotes, list( . = ..() - if(.) // We're pals, but they might be a dirty mouse... - if(ismouse(L)) + if(.) // We're pals, but they might be a dirty mouse (or any other small fun to kill pest)... + if(HAS_TRAIT(L, TRAIT_AMBIENT_PEST_MOB)) return FALSE // Cats and mice can never get along. /mob/living/simple_mob/animal/passive/cat/verb/become_friends() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm index 2bbbb0ef5cf..6996457f091 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/fox_vr.dm @@ -102,8 +102,8 @@ . = ..() - if(.) // We're pals, but they might be a dirty mouse... - if(ismouse(L)) + if(.) // We're pals, but they might be a dirty mouse (or any other small fun to kill pest)... + if(HAS_TRAIT(L, TRAIT_AMBIENT_PEST_MOB)) return FALSE // Cats and mice can never get along. /mob/living/simple_mob/animal/passive/fox/renault/verb/become_friends() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm index 227207f5665..fa16d3c0f0d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/frostfly.dm @@ -79,6 +79,8 @@ add_verb(src, /mob/living/proc/ventcrawl) add_verb(src, /mob/living/proc/hide) + ADD_TRAIT(src, TRAIT_AMBIENT_PEST_MOB, ROUNDSTART_TRAIT) + /datum/say_list/frostfly speak = list("Zzzz.", "Kss.", "Zzt?") emote_see = list("flutters its wings","looks around", "rubs its mandibles") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm index d3f2d0bc5f9..610107fb4a1 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/glitterfly.dm @@ -73,6 +73,8 @@ adjust_scale(round(rand(90, 105) / 100)) + ADD_TRAIT(src, TRAIT_AMBIENT_PEST_MOB, ROUNDSTART_TRAIT) + /mob/living/simple_mob/animal/sif/glitterfly/rare name = "sparkling glitterfly" desc = "A large, incredibly shiny butterfly!" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm index 454ce1879dd..08c59af8f8d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/leech.dm @@ -112,6 +112,8 @@ add_verb(src, /mob/living/proc/ventcrawl) add_verb(src, /mob/living/proc/hide) + ADD_TRAIT(src, TRAIT_AMBIENT_PEST_MOB, ROUNDSTART_TRAIT) + /mob/living/simple_mob/animal/sif/leech/get_status_tab_items() . = ..() . += "Chemicals: [chemicals]" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm index d07d4af7d86..84ee605e7bb 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/swoopie.dm @@ -47,9 +47,6 @@ var/static/list/crew_creatures = list( /mob/living/simple_mob/protean_blob, /mob/living/simple_mob/slime/promethean) - var/static/list/pest_creatures = list( /mob/living/simple_mob/animal/passive/mouse, - /mob/living/simple_mob/animal/passive/lizard, - /mob/living/simple_mob/animal/passive/cockroach) var/obj/item/vac_attachment/swoopie/Vac /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/Initialize(mapload) @@ -65,7 +62,7 @@ /mob/living/simple_mob/vore/aggressive/corrupthound/swoopie/IIsAlly(mob/living/L) . = ..() - if(L?.type in pest_creatures) // If they're a pest, swoop no matter what! + if(L && HAS_TRAIT(L, TRAIT_AMBIENT_PEST_MOB)) // If they're a pest, swoop no matter what! return FALSE if(!.) // Outside the faction and not in friends, are they crew return L?.type in crew_creatures diff --git a/code/modules/tables/flipping.dm b/code/modules/tables/flipping.dm index 5ebd2cd5b5d..0574f9b069f 100644 --- a/code/modules/tables/flipping.dm +++ b/code/modules/tables/flipping.dm @@ -18,7 +18,8 @@ set category = "Object" set src in oview(1) - if (!can_touch(usr) || ismouse(usr)) + + if (!can_touch(usr) || HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB)) return if(flipped < 0 || !flip(get_cardinal_dir(usr,src))) diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 980e21a0db1..3ca96bab187 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -66,7 +66,7 @@ set category = "Vehicle" set src in view(0) - if(!isliving(usr) || ismouse(usr)) + if(!isliving(usr) || HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB)) return if(usr.incapacitated()) return @@ -89,7 +89,7 @@ set category = "Vehicle" set src in view(0) - if(!isliving(usr) || ismouse(usr)) + if(!isliving(usr) || HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB)) return if(usr.incapacitated()) return diff --git a/code/modules/vore/smoleworld/smoleworld_vr.dm b/code/modules/vore/smoleworld/smoleworld_vr.dm index f9cc2ba6972..ceb6f4a4544 100644 --- a/code/modules/vore/smoleworld/smoleworld_vr.dm +++ b/code/modules/vore/smoleworld/smoleworld_vr.dm @@ -119,7 +119,7 @@ /obj/structure/smoletrack/attack_hand(mob/user) if(user.a_intent == I_DISARM) - if(ismouse(user) || (isobserver(user) && !CONFIG_GET(flag/ghost_interaction))) + if(HAS_TRAIT(user, TRAIT_AMBIENT_PEST_MOB) || (isobserver(user) && !CONFIG_GET(flag/ghost_interaction))) return to_chat(user, span_notice("[src] was dismantaled into bricks.")) playsound(src, 'sound/items/smolesmallbuild.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) @@ -136,7 +136,7 @@ set name = "Use Color Pieces" set category = "Object" set src in oview(1) - if(ismouse(usr) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) + if(HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) return var/new_color = tgui_color_picker(usr, "Please select color.", "Paint Color", color) color = new_color @@ -148,7 +148,7 @@ set name = "Take Road Apart" set category = "Object" set src in oview(1) - if(ismouse(usr) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) + if(HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) return playsound(src, 'sound/items/smolesmallbuild.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) var/turf/simulated/floor/F = get_turf(src) @@ -202,7 +202,7 @@ //makes it so buildings can be dismaintaled or GodZilla style attacked /obj/structure/smolebuilding/attack_hand(mob/user) if(user.a_intent == I_DISARM) - if(ismouse(user) || (isobserver(user) && !CONFIG_GET(flag/ghost_interaction))) + if(HAS_TRAIT(user, TRAIT_AMBIENT_PEST_MOB) || (isobserver(user) && !CONFIG_GET(flag/ghost_interaction))) return to_chat(user, span_notice("[src] was dismantaled into bricks.")) playsound(src, 'sound/items/smolesmallbuild.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) @@ -213,7 +213,7 @@ else if (user.a_intent == I_HURT) - if(ismouse(user) || (isobserver(user) && !CONFIG_GET(flag/ghost_interaction))) + if(HAS_TRAIT(user, TRAIT_AMBIENT_PEST_MOB) || (isobserver(user) && !CONFIG_GET(flag/ghost_interaction))) return take_damage() @@ -265,7 +265,7 @@ //get material from ruins /obj/structure/smoleruins/attack_hand(mob/user) if(user.a_intent == I_DISARM) - if(ismouse(user) || (isobserver(user) && !CONFIG_GET(flag/ghost_interaction))) + if(HAS_TRAIT(user, TRAIT_AMBIENT_PEST_MOB) || (isobserver(user) && !CONFIG_GET(flag/ghost_interaction))) return to_chat(user, span_notice("[src] was dismantaled into bricks.")) playsound(src, 'sound/items/smolelargeunbuild.ogg', 50, 1, volume_channel = VOLUME_CHANNEL_MASTER) @@ -296,7 +296,7 @@ set name = "Use Color Pieces" set category = "Object" set src in oview(1) - if(ismouse(usr) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) + if(HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) return var/new_color = tgui_color_picker(usr, "Please select color.", "Paint Color", color) color = new_color @@ -307,7 +307,7 @@ set name = "Take Building Apart" set category = "Object" set src in oview(1) - if(ismouse(usr) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) + if(HAS_TRAIT(usr, TRAIT_AMBIENT_PEST_MOB) || (isobserver(usr) && !CONFIG_GET(flag/ghost_interaction))) return playsound(src, 'sound/items/smolesmallbuild.ogg', 50, 1, -1, volume_channel = VOLUME_CHANNEL_MASTER) if(!isnull(loc))