diff --git a/code/_helpers/gender.dm b/code/_helpers/gender.dm index 17dbbd3eba..9ad5ac2526 100644 --- a/code/_helpers/gender.dm +++ b/code/_helpers/gender.dm @@ -49,7 +49,7 @@ return p_they(temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) /datum/proc/p_Theyre(temp_gender) - return p_they(temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) + return p_They(temp_gender) + "'" + copytext_char(p_are(temp_gender), 2) /datum/proc/p_s(temp_gender) return "s" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 9a71f57614..1e52a044c3 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -19,10 +19,19 @@ item/apply_hit_effect() can be overriden to do whatever you want. However "stand avoid code duplication. This includes items that may sometimes act as a standard weapon in addition to having other effects (e.g. stunbatons on harm intent). */ -// Called when the item is in the active hand, and clicked; alternately, there is an 'activate held object' verb or you can hit pagedown. +/** + * ## IF YOU ARE MAKING SOMETHING USE ATTACK SELF, ENSURE IT CALLS THE PARENT AND CHECKS FOR A TRUE RETURN VALUE, CANCELLING THE REST OF THE CHAIN IF SO. + * Called when the item is in the active hand and clicked + * alternately, there is an 'activate held object' verb or you can hit pagedown or Z in hotkey mode. + * returns TRUE if the attack was handled by a signal handler and no further processing should occur. + * returns FALSE if a signal handler did NOT handle it, resulting in the normal chain. +*/ /obj/item/proc/attack_self(mob/user) + SHOULD_CALL_PARENT(TRUE) + if(!user) + CRASH("attack_self was called without a user!") if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SELF, user) & COMPONENT_CANCEL_ATTACK_CHAIN) - return + return TRUE return /// Called when the item is in the active hand, and right-clicked. Intended for alternate or opposite functions, such as lowering reagent transfer amount. At the moment, there is no verb or hotkey. diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index 0402e65d9f..93af7cef66 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -81,7 +81,10 @@ qdel(src) return -/obj/item/tk_grab/attack_self(mob/user as mob) +/obj/item/tk_grab/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(focus) focus.attack_self_tk(user) diff --git a/code/datums/components/antags/changeling/changeling.dm b/code/datums/components/antags/changeling/changeling.dm index d749cdd666..89c9fb27c3 100644 --- a/code/datums/components/antags/changeling/changeling.dm +++ b/code/datums/components/antags/changeling/changeling.dm @@ -440,6 +440,9 @@ var/list/datum/power/changeling/powerinstances = list() attack_verb = list("attacked", "slashed", "stabbed", "sliced") /obj/item/changeling_debug/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.make_changeling() ///Changeling Panel diff --git a/code/datums/components/antags/changeling/powers/armor.dm b/code/datums/components/antags/changeling/powers/armor.dm index 55150f8196..0173d4540a 100644 --- a/code/datums/components/antags/changeling/powers/armor.dm +++ b/code/datums/components/antags/changeling/powers/armor.dm @@ -74,6 +74,9 @@ slowdown += 1 //It's already tied to a slowdown suit, 6 slowdown is huge. /obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(magpulse) item_flags &= ~NOSLIP magpulse = 0 diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index e51a03fde4..251a505f65 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -39,7 +39,30 @@ throw_speed = 3 throw_range = 15 attack_verb = list("HONKED") - var/spam_flag = 0 + var/honk_sound = 'sound/items/bikehorn.ogg' + var/cooldown = 0 + var/honk_text = FALSE + ///Var for attack_self chain + var/special_handling = FALSE + +/obj/item/bikehorn/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE + if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) + playsound(src, honk_sound, 50, 1) + add_fingerprint(user) + if(honk_text) + audible_message(span_maroon("[honk_text]")) + +/obj/item/bikehorn/Crossed(atom/movable/AM as mob|obj) + if(AM.is_incorporeal()) + return + if(isliving(AM)) + playsound(src, honk_sound, 50, 1) /obj/item/c_tube name = "cardboard tube" @@ -215,7 +238,10 @@ throw_speed = 4 throw_range = 20 -/obj/item/camera_bug/attack_self(mob/user as mob) +/obj/item/camera_bug/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(in_use) return diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index 88668f403a..d452fb27ae 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -113,6 +113,10 @@ var/datum/antagonist/wizard/wizards /obj/item/clothing var/wizard_garb = 0 + ///Var for attack_self chain + var/special_handling = FALSE + ///Var for attack_self chain as well + var/helmet_handling = FALSE // Does this clothing slot count as wizard garb? (Combines a few checks) /proc/is_wiz_garb(var/obj/item/clothing/C) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 10a1e2d075..1c15cdd504 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -191,6 +191,7 @@ GLOBAL_LIST_INIT(rnwords, list("ire","ego","nahlizet","certum","veri","jatkaa"," unique = 1 var/tomedat = "" var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri") + occult_tier = 1 tomedat = {" @@ -314,9 +315,14 @@ GLOBAL_LIST_INIT(rnwords, list("ire","ego","nahlizet","certum","veri","jatkaa"," to_chat(M, span_danger("You feel searing heat inside!")) -/obj/item/book/tome/attack_self(mob/living/user as mob) +/obj/item/book/tome/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(!user.canmove || user.stat || user.restrained()) return + if(occult_tier > 1) //This is a low tier book. If it's a higher tier, use ITS parent call instead of continuing. + return if(!GLOB.cultwords["travel"]) runerandom() @@ -435,8 +441,12 @@ GLOBAL_LIST_INIT(rnwords, list("ire","ego","nahlizet","certum","veri","jatkaa"," /obj/item/book/tome/imbued //admin tome, spawns working runes without waiting w_class = ITEMSIZE_SMALL + occult_tier = 2 var/cultistsonly = 1 -/obj/item/book/tome/imbued/attack_self(mob/user as mob) +/obj/item/book/tome/imbued/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(src.cultistsonly && !iscultist(user)) return if(!GLOB.cultwords["travel"]) diff --git a/code/game/gamemodes/cult/soulstone.dm b/code/game/gamemodes/cult/soulstone.dm index fa45054e82..71202d8c76 100644 --- a/code/game/gamemodes/cult/soulstone.dm +++ b/code/game/gamemodes/cult/soulstone.dm @@ -40,6 +40,9 @@ ///////////////////Options for using captured souls/////////////////////////////////////// /obj/item/soulstone/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if (!in_range(src, user)) return user.set_machine(src) diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm index 3f226d0c9c..d4b54558bd 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -4,7 +4,10 @@ var/uses = 0 info = "


" -/obj/item/paper/talisman/attack_self(mob/living/user as mob) +/obj/item/paper/talisman/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(iscultist(user)) var/delete = 1 // who the hell thought this was a good idea :( diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 7d27515efa..fa9f9a1d95 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -12,6 +12,10 @@ var/obj/item/disk/nuclear/the_disk = null var/active = 0 + ///TODO: Clear up click code entirely. This is used exclusively for attack_self + var/nuclear = FALSE + var/shuttle = FALSE + pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' @@ -20,13 +24,18 @@ STOP_PROCESSING(SSobj, src) return ..() -/obj/item/pinpointer/attack_self() +/obj/item/pinpointer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(nuclear || shuttle) + return if(!active) - active = 1 + active = TRUE START_PROCESSING(SSobj, src) to_chat(usr, span_notice("You activate the pinpointer")) else - active = 0 + active = FALSE STOP_PROCESSING(SSobj, src) icon_state = "pinoff" to_chat(usr, span_notice("You deactivate the pinpointer")) @@ -185,7 +194,10 @@ var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null -/obj/item/pinpointer/nukeop/attack_self(mob/user as mob) +/obj/item/pinpointer/nukeop/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!active) active = 1 START_PROCESSING(SSobj, src) @@ -271,7 +283,10 @@ var/shuttle_comp_id = null var/obj/machinery/computer/shuttle_control/our_shuttle = null -/obj/item/pinpointer/shuttle/attack_self(mob/user as mob) +/obj/item/pinpointer/shuttle/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!active) active = TRUE START_PROCESSING(SSobj, src) diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm index 392b0057ae..2692b1c885 100644 --- a/code/game/gamemodes/technomancer/catalog.dm +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -110,11 +110,14 @@ var/list/all_technomancer_assistance = subtypesof(/datum/technomancer/assistance // Parameters: 1 (user - the mob clicking on the catalog) // Description: Shows an HTML window, to buy equipment and spells, if the user is the legitimate owner. Otherwise it cannot be used. /obj/item/technomancer_catalog/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!user) - return 0 + return if(owner && user != owner) to_chat(user, span_danger("\The [src] knows that you're not the original owner, and has locked you out of it!")) - return 0 + return else if(!owner) bind_to_owner(user) diff --git a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm index a73c45b27b..4e2fa7017d 100644 --- a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm +++ b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm @@ -26,7 +26,10 @@ . = ..() . += "[uses] uses remaining." -/obj/item/disposable_teleporter/attack_self(mob/user as mob) +/obj/item/disposable_teleporter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!uses) to_chat(user, span_danger("\The [src] has ran out of uses, and is now useless to you!")) return diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm index b5330cac8c..ab61fdd960 100644 --- a/code/game/gamemodes/technomancer/devices/shield_armor.dm +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -74,6 +74,9 @@ return 0 // This shield does not block all damage, so returning 0 is needed to tell the game to apply the new damage. /obj/item/clothing/suit/armor/shield/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE active = !active to_chat(user, span_notice("You [active ? "" : "de"]activate \the [src].")) update_icon() diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm index c6e1ae3cc4..f6888495a7 100644 --- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -53,6 +53,9 @@ return 0 /obj/item/clothing/suit/armor/tesla/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE active = !active to_chat(user, span_notice("You [active ? "" : "de"]activate \the [src].")) update_icon() diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index 47d48a8289..251a628a52 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -191,6 +191,9 @@ attack_verb = list("beaten", "smashed", "struck", "whacked") /obj/item/scepter/attack_self(mob/living/carbon/human/user) + . = ..(user) + if(.) + return TRUE var/obj/item/item_to_test = user.get_other_hand(src) if(istype(item_to_test, /obj/item/spell)) var/obj/item/spell/S = item_to_test diff --git a/code/game/gamemodes/technomancer/spell_objs.dm b/code/game/gamemodes/technomancer/spell_objs.dm index 01ee1b55f3..28e92066eb 100644 --- a/code/game/gamemodes/technomancer/spell_objs.dm +++ b/code/game/gamemodes/technomancer/spell_objs.dm @@ -196,9 +196,11 @@ // Parameters: 1 (user - the Technomancer that invoked this proc) // Description: Tries to call on_use_cast() if it is allowed to do so. Don't override this, override on_use_cast() instead. /obj/item/spell/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(run_checks() && (cast_methods & CAST_USE)) on_use_cast(user) - ..() // Proc: attackby() // Parameters: 2 (W - the item this spell object is hitting, user - the technomancer who clicked the other object) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 4dd4ad02df..7008d01790 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1047,6 +1047,9 @@ . += span_notice("There's a little switch on the bottom. It's flipped up.") /obj/item/orion_ship/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(active) return diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 50f3789014..4149b75823 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -12,6 +12,7 @@ var/expiration_time = 0 var/expired = 0 var/reason = "NOT SPECIFIED" + special_handling = TRUE /obj/item/card/id/guest/update_icon() return @@ -44,6 +45,9 @@ return /obj/item/card/id/guest/attack_self(mob/living/user as mob) + . = ..(user) + if(.) + return TRUE if(user.a_intent == I_HURT) if(icon_state == "guest-invalid") to_chat(user, span_warning("This guest pass is already deactivated!")) @@ -57,7 +61,11 @@ update_icon() expiration_time = world.time expired = 1 - return ..() + else + user.visible_message("\The [user] shows you: [icon2html(src,viewers(src))] [src.name]. The assignment on the card: [src.assignment]",\ + "You flash your ID card: [icon2html(src, user.client)] [src.name]. The assignment on the card: [src.assignment]") + + src.add_fingerprint(user) /obj/item/card/id/guest/Initialize(mapload) . = ..() diff --git a/code/game/machinery/computer/timeclock_vr.dm b/code/game/machinery/computer/timeclock_vr.dm index ecea942976..59ae35728c 100644 --- a/code/game/machinery/computer/timeclock_vr.dm +++ b/code/game/machinery/computer/timeclock_vr.dm @@ -265,6 +265,13 @@ CHOMPedit end. */ /obj/item/card/id var/last_job_switch + ///Var for attack_self chain + var/special_handling = FALSE + + ///Var for event IDs + var/can_configure = FALSE + var/configured = FALSE + /obj/item/card/id/Initialize(mapload) . = ..() last_job_switch = world.time diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index cc097b51ac..0b714c1203 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -22,9 +22,12 @@ to_chat(user, span_notice("You remove the access restrictions on [src]!")) return 1 -/obj/item/airlock_electronics/attack_self(mob/user as mob) +/obj/item/airlock_electronics/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if (!ishuman(user) && !istype(user,/mob/living/silicon/robot)) - return ..(user) + return FALSE var/t1 = span_bold("Access control") + "
\n" diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index fb8ef26151..f0bf965c31 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -8,6 +8,9 @@ var/list/floor_light_cache = list() matter = list(MAT_STEEL = 2500, MAT_GLASS = 2750) /obj/item/floor_light/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/turf/T = get_turf(user) if(!T) to_chat(user, span_warning("You need to be on a floor to install this.")) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 4203134944..df00dc5431 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -149,6 +149,9 @@ Buildable meters set_dir(turn(dir, 45)) /obj/item/pipe/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE set_dir(turn(dir,-90)) fixdir() diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 7f75bc5e93..78fb4e3bef 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -11,7 +11,10 @@ name = "inactive supermatter supply beacon" deploy_path = /obj/machinery/power/supply_beacon/supermatter -/obj/item/supply_beacon/attack_self(var/mob/user) +/obj/item/supply_beacon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message(span_infoplain(span_bold("\The [user]") + " begins setting up \the [src].")) if(!do_after(user, deploy_time, target = src)) return diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index 1c17b2d05a..7d5c6e9bda 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -24,8 +24,10 @@ return ..() -/obj/item/frame/attack_self(mob/user as mob) - ..() +/obj/item/frame/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE update_type_list() var/datum/frame/frame_types/frame_type if(!build_machine_type && !build_wall_only) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 828ea2e26c..3f4a6b2eeb 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -250,6 +250,9 @@ w_class = ITEMSIZE_HUGE /obj/item/contraband/package/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/contraband = pick( /obj/item/reagent_containers/glass/beaker/vial/macrocillin, /obj/item/reagent_containers/glass/beaker/vial/microcillin, diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm index a1fd979f0e..b23f3f4733 100644 --- a/code/game/objects/effects/mines.dm +++ b/code/game/objects/effects/mines.dm @@ -319,7 +319,10 @@ var/list/allowed_gadgets = null -/obj/item/mine/attack_self(mob/user as mob) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times +/obj/item/mine/attack_self(mob/user) // You do not want to move or throw a land mine while priming it... Explosives + Sudden Movement = Bad Times + . = ..(user) + if(.) + return TRUE add_fingerprint(user) msg_admin_attack("[key_name_admin(user)] primed \a [src]") user.visible_message("[user] starts priming \the [src.name].", "You start priming \the [src.name]. Hold still!") diff --git a/code/game/objects/items/antag_spawners.dm b/code/game/objects/items/antag_spawners.dm index 2125bb98f3..a3e2d13906 100644 --- a/code/game/objects/items/antag_spawners.dm +++ b/code/game/objects/items/antag_spawners.dm @@ -56,6 +56,9 @@ ghost_query_type = /datum/ghost_query/apprentice /obj/item/antag_spawner/technomancer_apprentice/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("Teleporter attempting to lock on to your apprentice.")) request_player() @@ -102,6 +105,9 @@ var/drone_type = null /obj/item/antag_spawner/syndicate_drone/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("Teleporter attempting to lock on to an available unit.")) request_player() diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 1219515c91..eaa466c91f 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -43,9 +43,12 @@ var/can_expand_areas_into = AREA_SPACE // Can expand station areas only into space. var/can_rename_areas_in = AREA_STATION // Only station areas can be reanamed -/obj/item/blueprints/attack_self(mob/M as mob) - if (!ishuman(M)) - to_chat(M, "This stack of blue paper means nothing to you.") //monkeys cannot into projecting +/obj/item/blueprints/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(!ishuman(user)) + to_chat(user, "This stack of blue paper means nothing to you.") //monkeys cannot into projecting return interact() return diff --git a/code/game/objects/items/blueprints_vr.dm b/code/game/objects/items/blueprints_vr.dm index a5a02e172a..05c38df0a1 100644 --- a/code/game/objects/items/blueprints_vr.dm +++ b/code/game/objects/items/blueprints_vr.dm @@ -116,6 +116,9 @@ ..() /obj/item/areaeditor/attack_self(mob/user) //Convert this to TGUI some time. + . = ..(user) + if(.) + return TRUE add_fingerprint(user) . = "[src] \

[station_name()] [src.name]

" @@ -177,6 +180,9 @@ var/legend = 1 /obj/item/wire_reader/attack_self(mob/user) //Convert this to TGUI some time. + . = ..(user) + if(.) + return TRUE add_fingerprint(user) . = "[src] \

[station_name()] [src.name]

" @@ -247,7 +253,9 @@ /obj/item/areaeditor/blueprints/attack_self(mob/user) - . = ..() + . = ..(user) + if(. == 1) //I hate this so much. + return TRUE var/area/A = get_area(user) if(!legend) if(get_area_type() == AREA_STATION) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index c83e356951..f157201dc2 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -7,10 +7,39 @@ icon_state = "bodybag_folded" w_class = ITEMSIZE_SMALL + //Used for cryogenic bodybags + var/obj/item/reagent_containers/syringe/syringe + var/cryogenic = FALSE + var/robotic = FALSE + var/mass_grave = FALSE //CHOMPEdit + /obj/item/bodybag/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(mass_grave) //CHOMPedit - TODO, upport this. + return FALSE //CHOMPedit - TODO, upport this. + + if(cryogenic) + var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc) + R.add_fingerprint(user) + if(syringe) + R.syringe = syringe + syringe = null + qdel(src) + return + if(robotic) + var/obj/structure/closet/body_bag/cryobag/robobag/R = new /obj/structure/closet/body_bag/cryobag/robobag(user.loc) + R.add_fingerprint(user) + if(syringe) + R.syringe = syringe + syringe = null + qdel(src) + return var/obj/structure/closet/body_bag/R = new /obj/structure/closet/body_bag(user.loc) R.add_fingerprint(user) qdel(src) + return /obj/item/storage/box/bodybags @@ -38,8 +67,12 @@ desc = "A large folded bag designed for the storage and transportation of cadavers." icon = 'icons/obj/closets/bodybag_large.dmi' w_class = ITEMSIZE_LARGE + mass_grave = TRUE /obj/item/bodybag/large/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/obj/structure/closet/body_bag/large/R = new /obj/structure/closet/body_bag/large(user.loc) R.add_fingerprint(user) qdel(src) @@ -134,15 +167,7 @@ icon_state = "bodybag_folded" item_state = "bodybag_cryo_folded" origin_tech = list(TECH_BIO = 4) - var/obj/item/reagent_containers/syringe/syringe - -/obj/item/bodybag/cryobag/attack_self(mob/user) - var/obj/structure/closet/body_bag/cryobag/R = new /obj/structure/closet/body_bag/cryobag(user.loc) - R.add_fingerprint(user) - if(syringe) - R.syringe = syringe - syringe = null - qdel(src) + cryogenic = TRUE /obj/structure/closet/body_bag/cryobag name = "stasis bag" diff --git a/code/game/objects/items/contraband_vr.dm b/code/game/objects/items/contraband_vr.dm index 85faa40ce9..f047fc48d8 100644 --- a/code/game/objects/items/contraband_vr.dm +++ b/code/game/objects/items/contraband_vr.dm @@ -6,7 +6,10 @@ item_state = "table_parts" w_class = ITEMSIZE_HUGE -/obj/item/stolenpackage/attack_self(mob/user as mob) +/obj/item/stolenpackage/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE // Another way of doing this. Commented out because the other method is better for this application. /*var/spawn_chance = rand(1,100) switch(spawn_chance) @@ -106,5 +109,8 @@ icon = 'icons/obj/contraband_vr.dmi' w_class = ITEMSIZE_NORMAL -/obj/item/miscdisc/attack_self(mob/living/user as mob) +/obj/item/miscdisc/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE to_chat(user, "As you hold the large disc in your open palm, fingers cusped around the edge, the crystal embedded in the item begins to vibrate. It lifts itself from the disc a few cenimetres, before beginning to glow with a bright red light. The glow lasts for a few seconds, before the crystal embeds itself back into the disc with a quick snap.") diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index 1fe3fa99b9..b12340e2d8 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -42,7 +42,10 @@ colourName = "mime" uses = 0 -/obj/item/pen/crayon/mime/attack_self(mob/living/user as mob) //inversion +/obj/item/pen/crayon/mime/attack_self(mob/living/user) //inversion + . = ..(user) + if(.) + return TRUE if(colour != "#FFFFFF" && shadeColour != "#000000") colour = "#FFFFFF" shadeColour = "#000000" @@ -61,6 +64,9 @@ uses = 0 /obj/item/pen/crayon/rainbow/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE var/new_colour = tgui_color_picker(user, "Please select the main colour.", "Crayon colour", colour) if(new_colour) colour = new_colour @@ -192,6 +198,9 @@ uses = 0 /obj/item/pen/crayon/marker/mime/attack_self(mob/living/user) //inversion + . = ..(user) + if(.) + return TRUE if(colour != "#FFFFFF" && shadeColour != "#000000") colour = "#FFFFFF" shadeColour = "#000000" @@ -210,6 +219,9 @@ uses = 0 /obj/item/pen/crayon/marker/rainbow/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE var/new_colour = tgui_color_picker(user, "Please select the main colour.", "Marker colour", colour) if(new_colour) colour = new_colour @@ -234,6 +246,3 @@ qdel(src) else ..() - -/obj/item/pen/crayon/attack_self(var/mob/user) - return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 749c551eaf..7f00e0970a 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -22,6 +22,9 @@ to_chat(user, span_infoplain(span_bold("ERROR ERROR ERROR"))) /obj/item/aicard/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/aicard/tgui_interact(mob/user, datum/tgui/ui = null, datum/tgui_state/custom_state) diff --git a/code/game/objects/items/devices/binoculars.dm b/code/game/objects/items/devices/binoculars.dm index 347083aaac..66d31ae46b 100644 --- a/code/game/objects/items/devices/binoculars.dm +++ b/code/game/objects/items/devices/binoculars.dm @@ -14,6 +14,9 @@ //matter = list(MAT_STEEL = 50, MAT_GLASS = 50) /obj/item/binoculars/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE zoom() /obj/item/binoculars/spyglass diff --git a/code/game/objects/items/devices/body_snatcher_vr.dm b/code/game/objects/items/devices/body_snatcher_vr.dm index 568a518957..7b8f781f3d 100644 --- a/code/game/objects/items/devices/body_snatcher_vr.dm +++ b/code/game/objects/items/devices/body_snatcher_vr.dm @@ -104,6 +104,9 @@ else to_chat(user,span_warning(" A warning pops up on the LED display on the side of the device, informing you that the target is not able to have their mind swapped with!")) -/obj/item/bodysnatcher/attack_self(mob/living/user) - to_chat(user,span_warning(" A message pops up on the LED display, informing you that you that the mind transfer to yourself was successful... Wait, did that even do anything?")) - return +/obj/item/bodysnatcher/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + to_chat(user,span_warning(" A message pops up on the LED display, informing you that you that the mind transfer to yourself was successful... Wait, did that even do anything?")) + return diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index 9fc31b3830..d2d0f93105 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -29,6 +29,9 @@ ..() /obj/item/chameleon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE toggle(user) /obj/item/chameleon/afterattack(atom/target, mob/user, proximity) diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index d6612f82f8..6366a9445b 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -317,6 +317,9 @@ // Description: Makes an exonet datum if one does not exist, allocates an address for it, maintains the lists of all devies, clears the alert icon, and // finally makes NanoUI appear. /obj/item/communicator/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE initialize_exonet(user) alert_called = 0 update_icon() diff --git a/code/game/objects/items/devices/e_beacon.dm b/code/game/objects/items/devices/e_beacon.dm index ca8e200ddb..e19486bd08 100644 --- a/code/game/objects/items/devices/e_beacon.dm +++ b/code/game/objects/items/devices/e_beacon.dm @@ -24,6 +24,9 @@ gps_tag = "EMERGENCY BEACON" /obj/item/emergency_beacon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/T = user.loc if(!beacon_active) if(!isturf(T)) diff --git a/code/game/objects/items/devices/extrapolator.dm b/code/game/objects/items/devices/extrapolator.dm index 969bce8c55..fddffbce9e 100644 --- a/code/game/objects/items/devices/extrapolator.dm +++ b/code/game/objects/items/devices/extrapolator.dm @@ -62,7 +62,7 @@ return TRUE /obj/item/extrapolator/attack_self(mob/user) - . = ..() + . = ..(user) playsound(src, 'sound/machines/click.ogg', 50, TRUE) if(scan) icon_state = "extrapolator_sample" diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index f975280e35..231c33d483 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -28,6 +28,9 @@ /// If the flash can be repaired or not. var/can_repair = TRUE + /// If the flash can only be used once before breaking + var/one_use = FALSE + var/safe_flashes = 2 // How many flashes are kept in 1% breakchance? var/charge_only = FALSE // Does the flash run purely on charge? @@ -120,7 +123,7 @@ update_icon() // Returns true if the device can flash. -/obj/item/flash/proc/check_capacitor(var/mob/user) +/obj/item/flash/proc/check_capacitor(mob/user) //spamming the flash before it's fully charged (60 seconds) increases the chance of it breaking //It will never break on the first use. var/obj/item/cell/battery = power_supply @@ -130,6 +133,12 @@ if(times_used <= max_flashes && battery && battery.charge >= charge_cost) last_used = world.time + if(one_use) + broken = TRUE + if(user) + to_chat(user, span_warning("The bulb has burnt out!")) + update_icon() + return TRUE if(prob( max(0, times_used - safe_flashes) * 2 + (times_used >= safe_flashes)) && can_break) //if you use it 10 times in a minute it has a 30% chance to break. broken = TRUE if(user) @@ -243,7 +252,10 @@ return TRUE -/obj/item/flash/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) +/obj/item/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) + . = ..(user) + if(.) + return TRUE if(!user || !clown_check(user)) return user.setClickCooldown(user.get_attack_speed(src)) @@ -298,21 +310,7 @@ origin_tech = list(TECH_MAGNET = 2, TECH_COMBAT = 1) base_icon = "sflash" can_repair = FALSE - -//attack_as_weapon -/obj/item/flash/synthetic/attack(mob/living/M, mob/living/user, var/target_zone) - ..() - if(!broken) - broken = 1 - to_chat(user, span_warning("The bulb has burnt out!")) - update_icon() - -/obj/item/flash/synthetic/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) - ..() - if(!broken) - broken = 1 - to_chat(user, span_warning("The bulb has burnt out!")) - update_icon() + one_use = TRUE /obj/item/flash/robot name = "mounted flash" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 13eddb3904..5f292af016 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -1,3 +1,4 @@ +#define CAN_USE "can_use" /* * Contains: * Flashlights @@ -37,6 +38,9 @@ pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/flashlight/Initialize(mapload) . = ..() @@ -89,25 +93,30 @@ . += "It appears to have a high amount of power remaining." /obj/item/flashlight/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(flickering) to_chat(user, "The light is currently malfunctioning and you're unable to adjust it!") //To prevent some lighting anomalities. - return + return FALSE if(power_use) if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc].") //To prevent some lighting anomalities. - return 0 + return FALSE if(!cell || cell.charge == 0) to_chat(user, "You flick the switch on [src], but nothing happens.") - return 0 + return FALSE on = !on if(on && power_use) START_PROCESSING(SSobj, src) else if(power_use) STOP_PROCESSING(SSobj, src) - playsound(src, 'sound/weapons/empty.ogg', 15, 1, -3) // VOREStation Edit + playsound(src, 'sound/weapons/empty.ogg', 15, 1, -3) update_brightness() user.update_mob_action_buttons() - return 1 + return CAN_USE /obj/item/flashlight/attack(mob/living/M as mob, mob/living/user as mob) add_fingerprint(user) @@ -430,20 +439,20 @@ update_brightness() /obj/item/flashlight/flare/attack_self(mob/user) - + . = ..(user) + if(.) + return TRUE // Usual checks if(!fuel) to_chat(user, span_notice("It's out of fuel.")) return if(on) return - - . = ..() // All good, turn it on. - if(.) + if(. == CAN_USE) user.visible_message(span_notice("[user] activates the flare."), span_notice("You pull the cord on the flare, activating it!")) - src.force = on_damage - src.damtype = BURN + force = on_damage + damtype = BURN START_PROCESSING(SSobj, src) /obj/item/flashlight/flare/proc/ignite() //Used for flare launchers. @@ -488,15 +497,16 @@ update_brightness() /obj/item/flashlight/glowstick/attack_self(mob/user) - + . = ..(user) + if(.) + return TRUE if(!fuel) to_chat(user, span_notice("The glowstick has already been turned on.")) return if(on) return - . = ..() - if(.) + if(. == CAN_USE) user.visible_message(span_notice("[user] cracks and shakes \the [name]."), span_notice("You crack and shake \the [src], turning it on!")) START_PROCESSING(SSobj, src) @@ -537,3 +547,5 @@ light_range = 8 light_power = 0.1 light_color = "#49F37C" + +#undef CAN_USE diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index 644523f8cf..5604ce210e 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -106,7 +106,10 @@ new painting_decal(F, painting_dir, painting_colour) -/obj/item/floor_painter/attack_self(var/mob/user) +/obj/item/floor_painter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/choice = tgui_alert(user, "Do you wish to change the decal type, paint direction, or paint colour?", "Modify What?", list("Decal","Direction","Colour","Cancel")) if(choice == "Cancel") return diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 94f1aac862..21ae4bcbbe 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -12,6 +12,7 @@ var/scanning = 0 var/radiation_count = 0 var/datum/looping_sound/geiger/soundloop + var/mounted = FALSE pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' @@ -61,7 +62,12 @@ loop.last_radiation = radiation_count loop.start() -/obj/item/geiger/attack_self(var/mob/user) +/obj/item/geiger/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(mounted) + return scanning = !scanning if(scanning) START_PROCESSING(SSobj, src) @@ -109,6 +115,7 @@ var/number = 0 var/last_tick //used to delay the powercheck var/wiresexposed = 0 + mounted = TRUE /obj/item/geiger/wall/Initialize(mapload) START_PROCESSING(SSobj, src) @@ -120,7 +127,10 @@ QDEL_NULL(soundloop) return ..() -/obj/item/geiger/wall/attack_self(var/mob/user) +/obj/item/geiger/wall/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE scanning = !scanning update_icon() update_sound() diff --git a/code/game/objects/items/devices/gold_star_printer.dm b/code/game/objects/items/devices/gold_star_printer.dm index fbf9ec67fb..30f6d44852 100644 --- a/code/game/objects/items/devices/gold_star_printer.dm +++ b/code/game/objects/items/devices/gold_star_printer.dm @@ -12,7 +12,9 @@ drop_sound = 'sound/items/drop/device.ogg' /obj/item/gold_star_printer/attack_self(mob/user) - . = ..() + . = ..(user) + if(.) + return TRUE if(last_print + print_cooldown <= world.time) make_star(user) else diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 839b09502e..7d32631492 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -26,6 +26,9 @@ GLOBAL_LIST_EMPTY(GPS_list) pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/gps/Initialize(mapload) . = ..() compass = new(src) @@ -182,6 +185,11 @@ GLOBAL_LIST_EMPTY(GPS_list) add_overlay("working") /obj/item/gps/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE display(user) // Compiles all the data not available directly from the GPS diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index d3abdf1049..1518b915bc 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -23,7 +23,10 @@ . += span_notice("You have to go closer if you want to read it.") //hit yourself with it -/obj/item/holowarrant/attack_self(mob/living/user as mob) +/obj/item/holowarrant/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE active = null var/list/warrants = list() if(!isnull(GLOB.data_core.general)) diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 01f0219010..cb8c909abf 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -56,6 +56,9 @@ pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' + ///For attack_self chain + var/special_handling = FALSE + /obj/item/lightreplacer/Initialize(mapload) . = ..() failmsg = "The [name]'s refill light blinks red." @@ -129,6 +132,11 @@ to_chat(user, span_notice("You fill \the [src] with lights from \the [S].")) /obj/item/lightreplacer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE /* // This would probably be a bit OP. If you want it though, uncomment the code. if(isrobot(user)) var/mob/living/silicon/robot/R = user @@ -250,6 +258,9 @@ . += "It is currently coloring lights." /obj/item/lightpainter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!resetmode) resetmode = 1 diff --git a/code/game/objects/items/devices/locker_painter.dm b/code/game/objects/items/devices/locker_painter.dm index 141f9a6e25..a69eba55dd 100644 --- a/code/game/objects/items/devices/locker_painter.dm +++ b/code/game/objects/items/devices/locker_painter.dm @@ -119,7 +119,10 @@ to_chat(user, span_warning("\The [src] flashes an error light. You might need to reconfigure it.")) return -/obj/item/closet_painter/attack_self(var/mob/user) +/obj/item/closet_painter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/choice = tgui_alert(user, "Do you wish to change the regular closet color or the secure closet color?", "Color Selection", list("Regular Closet Colour","Cancel","Secure Closet Colour")) if(choice == "Regular Closet Colour") choose_colour() diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 8509096579..658c61f62d 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -42,7 +42,10 @@ else user.audible_message(span_infoplain(span_bold("[user.GetVoice()]") + "[user.GetAltName()] broadcasts, " + span_large("\"[message]\"")), runemessage = message) -/obj/item/megaphone/attack_self(var/mob/living/user) +/obj/item/megaphone/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/message = tgui_input_text(user, "Shout a message?", "Megaphone", null, MAX_MESSAGE_LEN) if(!message) return diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index b26bb1e4b0..d88b6ef31e 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -32,7 +32,22 @@ toolspeed = 1 tool_qualities = list(TOOL_MULTITOOL) + var/uplink = FALSE + /obj/item/multitool/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(uplink) + return + + if(selected_io) + selected_io = null + to_chat(user, span_notice("You clear the wired connection from the multitool.")) + update_icon() + return + + update_icon() var/choice = tgui_alert(user, "What do you want to do with \the [src]?", "Multitool Menu", list("Switch Mode", "Clear Buffers", "Cancel")) switch(choice) if("Clear Buffers") @@ -52,8 +67,6 @@ update_icon() - return ..() - /obj/item/multitool/proc/mode_switch(mob/living/user) if(mode_index + 1 > modes.len) mode_index = 1 diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 3bc9d2a39f..b796538da9 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -19,6 +19,9 @@ pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/paicard/relaymove(var/mob/user, var/direction) if(user.stat || user.stunned) return diff --git a/code/game/objects/items/devices/paicard_vr.dm b/code/game/objects/items/devices/paicard_vr.dm index 731784e35f..e9db9a1806 100644 --- a/code/game/objects/items/devices/paicard_vr.dm +++ b/code/game/objects/items/devices/paicard_vr.dm @@ -216,7 +216,12 @@ GLOBAL_LIST_EMPTY(paikeys) else to_chat(user, span_warning("You would need to remove the installed [I] first!")) -/obj/item/paicard/attack_self(mob/user) +/obj/item/paicard/attack_self(mob/user, callback) + . = ..(user) + if(.) + return TRUE + if(special_handling && !callback) + return FALSE if(!panel_open) access_screen(user) return diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 65cffc51b2..67dbf33731 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -25,7 +25,10 @@ P.change_color(GLOB.pipe_colors[mode]) -/obj/item/pipe_painter/attack_self(mob/user as mob) +/obj/item/pipe_painter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/new_mode = tgui_input_list(user, "Which colour do you want to use?", "Pipe painter", modes) if(!new_mode) return diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index 87c067ae80..3dd8f11a9e 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -34,8 +34,12 @@ GLOBAL_LIST_BOILERPLATE(all_beacons, /obj/item/radio/beacon) name = "suspicious beacon" desc = "A label on it reads: Activate to have a singularity beacon teleported to your location." origin_tech = list(TECH_BLUESPACE = 1, TECH_ILLEGAL = 7) + beacon = TRUE -/obj/item/radio/beacon/syndicate/attack_self(mob/user as mob) +/obj/item/radio/beacon/syndicate/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user) to_chat(user, span_notice("Locked In")) new /obj/machinery/power/singularity_beacon/syndicate( user.loc ) diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm index e07a5ef794..eec4a83b9f 100644 --- a/code/game/objects/items/devices/radio/electropack.dm +++ b/code/game/objects/items/devices/radio/electropack.dm @@ -14,6 +14,7 @@ matter = list(MAT_STEEL = 10000,MAT_GLASS = 2500) var/code = 2 + electric_pack = TRUE /obj/item/radio/electropack/attack_hand(mob/living/user as mob) if(src == user.back) @@ -104,8 +105,10 @@ master.receive_signal() return -/obj/item/radio/electropack/attack_self(mob/user as mob, flag1) - +/obj/item/radio/electropack/attack_self(mob/user, flag1) + . = ..(user) + if(.) + return TRUE if(!ishuman(user)) return user.set_machine(src) diff --git a/code/game/objects/items/devices/radio/jammer.dm b/code/game/objects/items/devices/radio/jammer.dm index da01a16e6b..ae064e9273 100644 --- a/code/game/objects/items/devices/radio/jammer.dm +++ b/code/game/objects/items/devices/radio/jammer.dm @@ -85,6 +85,9 @@ GLOBAL_LIST_EMPTY(active_radio_jammers) return ..() /obj/item/radio_jammer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(on) turn_off(user) else diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 1765e7a650..789331a1ca 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -44,6 +44,11 @@ var/datum/radio_frequency/radio_connection var/list/datum/radio_frequency/secure_radio_connections + ///If we're a syndicate beacon or not. + var/beacon = FALSE + var/electric_pack = FALSE + var/uplink = FALSE + /obj/item/radio/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) frequency = new_frequency @@ -115,7 +120,12 @@ /obj/item/radio/proc/recalculateChannels() return -/obj/item/radio/attack_self(mob/user as mob) +/obj/item/radio/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(beacon || electric_pack || uplink) + return interact(user) /obj/item/radio/interact(mob/user) diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/game/objects/items/devices/scanners/gas.dm index 29e07259a1..d1ce316a34 100644 --- a/code/game/objects/items/devices/scanners/gas.dm +++ b/code/game/objects/items/devices/scanners/gas.dm @@ -17,6 +17,9 @@ pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/analyzer/atmosanalyze(var/mob/user) var/air = user.return_air() if (!air) @@ -24,7 +27,12 @@ return atmosanalyzer_scan(src, air, user) -/obj/item/analyzer/attack_self(mob/user as mob) +/obj/item/analyzer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if (user.stat) return if (!user.IsAdvancedToolUser()) diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/game/objects/items/devices/scanners/mass_spectrometer.dm index d578560943..69e43daa8f 100644 --- a/code/game/objects/items/devices/scanners/mass_spectrometer.dm +++ b/code/game/objects/items/devices/scanners/mass_spectrometer.dm @@ -31,7 +31,10 @@ else icon_state = initial(icon_state) -/obj/item/mass_spectrometer/attack_self(mob/user as mob) +/obj/item/mass_spectrometer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if (user.stat) return if (!user.IsAdvancedToolUser()) diff --git a/code/game/objects/items/devices/scanners/sleevemate.dm b/code/game/objects/items/devices/scanners/sleevemate.dm index d3b29d94c1..9cba7de09e 100644 --- a/code/game/objects/items/devices/scanners/sleevemate.dm +++ b/code/game/objects/items/devices/scanners/sleevemate.dm @@ -102,6 +102,9 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob to_chat(user,span_warning("Not a compatible subject to work with!")) /obj/item/sleevemate/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(!stored_mind) to_chat(user,span_warning("No stored mind in \the [src].")) return diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index 04977ded8f..6b95136bfc 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -26,11 +26,13 @@ camera = new camtype(src) /obj/item/camerabug/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.a_intent == I_HURT) to_chat(user, span_notice("You crush the [src] under your foot, breaking it.")) visible_message(span_notice("[user.name] crushes the [src] under their foot, breaking it!")) new brokentype(get_turf(src)) - spawn(0) qdel(src) /* else radio.interact(user) @@ -170,7 +172,9 @@ radio = new(src) */ /obj/item/bug_monitor/attack_self(mob/user) -// radio.attack_self(user) + . = ..(user) + if(.) + return TRUE view_cameras(user) /obj/item/bug_monitor/attackby(obj/item/W as obj, mob/living/user as mob) diff --git a/code/game/objects/items/devices/starcaster_ch.dm b/code/game/objects/items/devices/starcaster_ch.dm index 3456b51c25..0c1d93e4ac 100644 --- a/code/game/objects/items/devices/starcaster_ch.dm +++ b/code/game/objects/items/devices/starcaster_ch.dm @@ -19,7 +19,9 @@ /obj/item/starcaster_news/attack_self(mob/user as mob) - + . = ..(user) + if(.) + return TRUE user.set_machine(src) tgui_interact(user) //Activates tgui. Bless tgui. return diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index ca77fa3bbb..99b009d17b 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -123,7 +123,10 @@ STOP_PROCESSING(SSobj, src) update_icon() -/obj/item/suit_cooling_unit/attack_self(var/mob/user) +/obj/item/suit_cooling_unit/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(cover_open && cell) if(ishuman(user)) user.put_in_hands(cell) diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index 6e5ec60570..dc9045d02c 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -25,6 +25,9 @@ icon_state = "t-ray[on]" /obj/item/t_scanner/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE set_active(!on) /obj/item/t_scanner/proc/set_active(var/active) diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index d2ff1a05d6..f0f665e4c4 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -351,6 +351,9 @@ /obj/item/taperecorder/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(recording || playing) stop() else @@ -396,6 +399,9 @@ ruin() /obj/item/rectape/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!ruined) to_chat(user, span_notice("You pull out all the tape!")) ruin() diff --git a/code/game/objects/items/devices/text_to_speech.dm b/code/game/objects/items/devices/text_to_speech.dm index 00f112f3d8..e2bd453949 100644 --- a/code/game/objects/items/devices/text_to_speech.dm +++ b/code/game/objects/items/devices/text_to_speech.dm @@ -6,7 +6,10 @@ w_class = ITEMSIZE_SMALL var/named -/obj/item/text_to_speech/attack_self(mob/user as mob) +/obj/item/text_to_speech/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.incapacitated(INCAPACITATION_KNOCKDOWN|INCAPACITATION_DISABLED)) // EDIT: We can use the device only if we are not in certain types of incapacitation. We don't want chairs stopping us from texting!! to_chat(user, "You cannot activate the device in your state.") return diff --git a/code/game/objects/items/devices/ticket_printer.dm b/code/game/objects/items/devices/ticket_printer.dm index 0d4f8b6416..d68d783dbe 100644 --- a/code/game/objects/items/devices/ticket_printer.dm +++ b/code/game/objects/items/devices/ticket_printer.dm @@ -11,7 +11,7 @@ w_class = ITEMSIZE_SMALL //CHOMP Add because something so small, trivial, and used for silly RP should not be practically gigantic. /obj/item/ticket_printer/attack_self(mob/user) - . = ..() + . = ..(user) if(last_print + print_cooldown <= world.time) print_a_ticket(user) else diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 9c75a312d5..646c91246a 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -32,7 +32,10 @@ effective or pretty fucking useless. pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' -/obj/item/batterer/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) +/obj/item/batterer/attack_self(mob/user, flag = 0, emp = 0) + . = ..(user) + if(.) + return TRUE if(!user) return if(times_used >= max_uses) to_chat(user, span_warning("The mind batterer has been burnt out!")) diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 6c3e6a2c61..c12587e493 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -71,6 +71,9 @@ sense_proximity(callback = TYPE_PROC_REF(/atom,HasProximity)) /obj/item/transfer_valve/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/transfer_valve/tgui_state(mob/user) diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm index ff6e9c2460..5066700d48 100644 --- a/code/game/objects/items/devices/translator.dm +++ b/code/game/objects/items/devices/translator.dm @@ -15,6 +15,9 @@ drop_sound = 'sound/items/drop/device.ogg' /obj/item/universal_translator/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!listening) //Turning ON langset = tgui_input_list(user,"Translate to which of your languages?","Language Selection", user.languages) if(langset) diff --git a/code/game/objects/items/devices/translocator_vr.dm b/code/game/objects/items/devices/translocator_vr.dm index ff5d969686..6c98ebee05 100644 --- a/code/game/objects/items/devices/translocator_vr.dm +++ b/code/game/objects/items/devices/translocator_vr.dm @@ -34,6 +34,9 @@ pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/perfect_tele/Initialize(mapload) . = ..() @@ -115,6 +118,11 @@ return TRUE /obj/item/perfect_tele/attack_self(mob/user, var/radial_menu_anchor = src) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(loc_network) for(var/obj/item/perfect_tele_beacon/stationary/nb in GLOB.premade_tele_beacons) if(nb.tele_network == loc_network) @@ -405,6 +413,9 @@ not carry this around."}, "OOC Warning", list("Take It","Leave It")) GLOBAL_LIST_BOILERPLATE(premade_tele_beacons, /obj/item/perfect_tele_beacon/stationary) /obj/item/perfect_tele_beacon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!isliving(user)) return var/mob/living/L = user diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index d556bbce46..2bc4440039 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -48,6 +48,9 @@ . = ..() /obj/item/tvcamera/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE add_fingerprint(user) user.set_machine(src) show_ui(user) @@ -176,6 +179,7 @@ var/obj/item/radio/bradio var/datum/weakref/showing var/showing_name + special_handling = TRUE /obj/item/clothing/accessory/bodycam/Initialize(mapload) . = ..() @@ -211,6 +215,9 @@ . = ..() /obj/item/clothing/accessory/bodycam/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE add_fingerprint(user) //user.set_machine(src) show_bodycam_ui(user) diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index c6ae8ee2bc..819713775c 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -217,20 +217,33 @@ // // Includes normal radio uplink, multitool uplink, // implant uplink (not the implant tool) and a preset headset uplink. + +/obj/item/radio/uplink + uplink = TRUE + /obj/item/radio/uplink/Initialize(mapload) . = ..() hidden_uplink = new(src) icon_state = "radio" -/obj/item/radio/uplink/attack_self(mob/user as mob) +/obj/item/radio/uplink/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(hidden_uplink) hidden_uplink.trigger(user) +/obj/item/multitool/uplink + uplink = TRUE + /obj/item/multitool/uplink/Initialize(mapload) . = ..() hidden_uplink = new(src) -/obj/item/multitool/uplink/attack_self(mob/user as mob) +/obj/item/multitool/uplink/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(hidden_uplink) hidden_uplink.trigger(user) diff --git a/code/game/objects/items/devices/vacpack.dm b/code/game/objects/items/devices/vacpack.dm index f7c20bfff9..00128f9e0f 100644 --- a/code/game/objects/items/devices/vacpack.dm +++ b/code/game/objects/items/devices/vacpack.dm @@ -23,7 +23,10 @@ var/vac_owner = null flags = NOBLUDGEON -/obj/item/vac_attachment/attack_self(mob/living/user) +/obj/item/vac_attachment/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/set_input = null if(!output_dest) set_input = "output destination" diff --git a/code/game/objects/items/devices/whistle.dm b/code/game/objects/items/devices/whistle.dm index 9581e9ad29..02f17762e4 100644 --- a/code/game/objects/items/devices/whistle.dm +++ b/code/game/objects/items/devices/whistle.dm @@ -31,7 +31,10 @@ to_chat(usr, "You configure the hailer to shout \"[use_message]\".") -/obj/item/hailer/attack_self(mob/living/carbon/user as mob) +/obj/item/hailer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if (spamcheck) return diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index 6a8b6613f2..74eb4d02e3 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -17,6 +17,11 @@ drop_sound = 'sound/items/drop/glass.ogg' pickup_sound = 'sound/items/pickup/glass.ogg' + ///If we can fill it with water + var/can_fill = FALSE + ///If we are filled with water. + var/filled = FALSE + /obj/item/glass_jar/Initialize(mapload) . = ..() update_icon() @@ -24,6 +29,16 @@ /obj/item/glass_jar/afterattack(var/atom/A, var/mob/user, var/proximity) if(!proximity || contains) return + if(can_fill && !filled) + if(istype(A, /obj/structure/sink) || istype(A, /turf/simulated/floor/water)) + if(contains && user.a_intent == I_HELP) + to_chat(user, span_warning("That probably isn't the best idea.")) + return + + to_chat(user, span_notice("You fill \the [src] with water!")) + filled = TRUE + update_icon() + return if(istype(A, /mob)) var/accept = 0 for(var/D in accept_mobs) @@ -47,7 +62,30 @@ update_icon() return -/obj/item/glass_jar/attack_self(var/mob/user) +/obj/item/glass_jar/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + + //For the fish jars + if(can_fill && filled) + if(contains == JAR_ANIMAL) + if(user.a_intent == I_HELP) + to_chat(user, span_notice("Maybe you shouldn't empty the water...")) + return + + else + filled = FALSE + user.visible_message(span_warning("[user] dumps out \the [src]'s water!")) + update_icon() + return + + else + user.visible_message(span_notice("[user] dumps \the [src]'s water.")) + filled = FALSE + update_icon() + return + switch(contains) if(JAR_MONEY) for(var/obj/O in src) @@ -111,13 +149,20 @@ /obj/item/glass_jar/update_icon() // Also updates name and desc underlays.Cut() cut_overlays() + + if(filled) + underlays += image(icon, "[icon_state]_water") + switch(contains) if(JAR_NOTHING) name = initial(name) desc = initial(desc) if(JAR_MONEY) - name = "tip jar" - desc = "A small jar with money inside." + if(can_fill) + name = "tip tank" + else + name = "tip jar" + desc = "A [name] with money inside." for(var/obj/item/spacecash/S in src) var/image/money = image(S.icon, S.icon_state) money.pixel_x = rand(-2, 3) @@ -125,31 +170,52 @@ money.transform *= 0.6 underlays += money if(JAR_ANIMAL) - for(var/mob/M in src) - var/image/victim = image(M.icon, M.icon_state) - victim.pixel_y = 6 - victim.color = M.color - if(M.plane == PLANE_LIGHTING_ABOVE) // This will only show up on the ground sprite, due to the HuD being over it, so we need both images. - var/image/victim_glow = image(M.icon, M.icon_state) - victim_glow.pixel_y = 6 - victim_glow.color = M.color - underlays += victim_glow - underlays += victim - name = "glass jar with [M]" - desc = "A small jar with [M] inside." + //tank + if(can_fill) + for(var/mob/M in src) + var/image/victim = image(M.icon, M.icon_state) + var/initial_x_scale = M.icon_scale_x + var/initial_y_scale = M.icon_scale_y + M.adjust_scale(0.7) + victim.appearance = M.appearance + M.adjust_scale(initial_x_scale, initial_y_scale) + victim.pixel_y = 4 + underlays += victim + name = "[name] with [M]" + desc = "A large [name] with [M] inside." + else + for(var/mob/M in src) + var/image/victim = image(M.icon, M.icon_state) + victim.pixel_y = 6 + victim.color = M.color + if(M.plane == PLANE_LIGHTING_ABOVE) // This will only show up on the ground sprite, due to the HuD being over it, so we need both images. + var/image/victim_glow = image(M.icon, M.icon_state) + victim_glow.pixel_y = 6 + victim_glow.color = M.color + underlays += victim_glow + underlays += victim + name = "glass jar with [M]" + desc = "A small jar with [M] inside." if(JAR_SPIDER) for(var/obj/effect/spider/spiderling/S in src) var/image/victim = image(S.icon, S.icon_state) underlays += victim - name = "glass jar with [S]" - desc = "A small jar with [S] inside." - return + if(can_fill) + name = "[name] with [S]" + desc = "A large tank with [S] inside." + else + name = "glass jar with [S]" + desc = "A small jar with [S] inside." + underlays += victim + + if(filled) + desc = "[desc] It contains water." /obj/item/glass_jar/fish name = "glass tank" desc = "A large glass tank." - var/filled = FALSE + can_fill = TRUE w_class = ITEMSIZE_NORMAL @@ -160,85 +226,6 @@ desc = "A large plastic tank." matter = list(MAT_PLASTIC = 4000) -/obj/item/glass_jar/fish/update_icon() // Also updates name and desc - underlays.Cut() - cut_overlays() - - if(filled) - underlays += image(icon, "[icon_state]_water") - - switch(contains) - if(JAR_NOTHING) - name = initial(name) - desc = initial(desc) - if(JAR_MONEY) - name = "tip tank" - desc = "A large [name] with money inside." - for(var/obj/item/spacecash/S in src) - var/image/money = image(S.icon, S.icon_state) - money.pixel_x = rand(-2, 3) - money.pixel_y = rand(-6, 6) - money.transform *= 0.6 - underlays += money - if(JAR_ANIMAL) - for(var/mob/M in src) - var/image/victim = image(M.icon, M.icon_state) - var/initial_x_scale = M.icon_scale_x - var/initial_y_scale = M.icon_scale_y - M.adjust_scale(0.7) - victim.appearance = M.appearance - M.adjust_scale(initial_x_scale, initial_y_scale) - victim.pixel_y = 4 - underlays += victim - name = "[name] with [M]" - desc = "A large [name] with [M] inside." - if(JAR_SPIDER) - for(var/obj/effect/spider/spiderling/S in src) - var/image/victim = image(S.icon, S.icon_state) - underlays += victim - name = "[name] with [S]" - desc = "A large tank with [S] inside." - - if(filled) - desc = "[desc] It contains water." - - return - -/obj/item/glass_jar/fish/afterattack(var/atom/A, var/mob/user, var/proximity) - if(!filled) - if(istype(A, /obj/structure/sink) || istype(A, /turf/simulated/floor/water)) - if(contains && user.a_intent == I_HELP) - to_chat(user, span_warning("That probably isn't the best idea.")) - return - - to_chat(user, span_notice("You fill \the [src] with water!")) - filled = TRUE - update_icon() - return - - return ..() - -/obj/item/glass_jar/fish/attack_self(var/mob/user) - if(filled) - if(contains == JAR_ANIMAL) - if(user.a_intent == I_HELP) - to_chat(user, span_notice("Maybe you shouldn't empty the water...")) - return - - else - filled = FALSE - user.visible_message(span_warning("[user] dumps out \the [src]'s water!")) - update_icon() - return - - else - user.visible_message(span_notice("[user] dumps \the [src]'s water.")) - filled = FALSE - update_icon() - return - - return ..() - #undef JAR_NOTHING #undef JAR_MONEY #undef JAR_ANIMAL diff --git a/code/game/objects/items/gunbox.dm b/code/game/objects/items/gunbox.dm index 96b049de49..dcf55cb99d 100644 --- a/code/game/objects/items/gunbox.dm +++ b/code/game/objects/items/gunbox.dm @@ -7,7 +7,14 @@ icon = 'icons/obj/storage.dmi' icon_state = "gunbox" w_class = ITEMSIZE_HUGE + ///If the gunbox has custom attack_self code + var/variant_gunbox = FALSE /obj/item/gunbox/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(variant_gunbox) + return var/list/options = list() options["M1911 (.45)"] = list(/obj/item/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber) options["MT Mk58 (.45)"] = list(/obj/item/gun/projectile/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45/rubber) @@ -30,7 +37,11 @@ /obj/item/gunbox/stun name = "non-lethal sidearm box" desc = "A secure box containing a non-lethal sidearm." + variant_gunbox = TRUE /obj/item/gunbox/stun/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE var/list/options = list() options["Stun Revolver"] = list(/obj/item/gun/energy/stunrevolver/detective, /obj/item/cell/device/weapon, /obj/item/cell/device/weapon) options["Taser"] = list(/obj/item/gun/energy/taser, /obj/item/cell/device/weapon, /obj/item/cell/device/weapon) @@ -52,7 +63,11 @@ name = "centcom sidearm box" desc = "A secure box containing a lethal sidearm used by Central Command." w_class = ITEMSIZE_HUGE + variant_gunbox = TRUE /obj/item/gunbox/centcom/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE var/list/options = list() options["Écureuil (10mm)"] = list(/obj/item/gun/projectile/ecureuil, /obj/item/ammo_magazine/m10mm/pistol, /obj/item/ammo_magazine/m10mm/pistol) options["Écureuil Olive (10mm)"] = list(/obj/item/gun/projectile/ecureuil/tac, /obj/item/ammo_magazine/m10mm/pistol, /obj/item/ammo_magazine/m10mm/pistol) diff --git a/code/game/objects/items/gunbox_vr.dm b/code/game/objects/items/gunbox_vr.dm index 3a9a2c4f25..bccdc379e5 100644 --- a/code/game/objects/items/gunbox_vr.dm +++ b/code/game/objects/items/gunbox_vr.dm @@ -6,8 +6,12 @@ desc = "A secure guncase containing the warden's beloved shotgun." icon = 'icons/obj/storage_vr.dmi' icon_state = "gunboxw" + variant_gunbox = TRUE /obj/item/gunbox/warden/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE var/list/options = list() options["Warden's combat shotgun"] = list(/obj/item/gun/projectile/shotgun/pump/combat/warden, /obj/item/ammo_magazine/ammo_box/b12g/beanbag) options["Warden's compact shotgun"] = list(/obj/item/gun/projectile/shotgun/compact/warden, /obj/item/ammo_magazine/ammo_box/b12g/beanbag) @@ -30,7 +34,11 @@ desc = "A secure box containing a sidearm befitting of the site manager. Includes both lethal and non-lethal munitions, beware what's loaded!" icon = 'icons/obj/storage.dmi' icon_state = "gunbox" + variant_gunbox = TRUE /obj/item/gunbox/captain/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE var/list/options = list() options["M1911 (.45)"] = list(/obj/item/gun/projectile/colt/detective, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45) options["MT Mk58 (.45)"] = list(/obj/item/gun/projectile/sec, /obj/item/ammo_magazine/m45/rubber, /obj/item/ammo_magazine/m45) diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 15663bc005..a03595558a 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -46,7 +46,7 @@ to_chat(user, span_notice("[src] is projecting at max capacity!")) /obj/item/holosign_creator/attack_self(mob/user) - . = ..() + . = ..(user) if(.) return if(signs.len) diff --git a/code/game/objects/items/leash.dm b/code/game/objects/items/leash.dm index fceabd4088..4930a436f0 100644 --- a/code/game/objects/items/leash.dm +++ b/code/game/objects/items/leash.dm @@ -98,6 +98,9 @@ //Called when the leash is used in hand //Tugs the pet closer /obj/item/leash/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(!leash_pet) //No pet, no tug. return //Yank the pet. Yank em in close. diff --git a/code/game/objects/items/magazine.dm b/code/game/objects/items/magazine.dm index bf8ba8264f..dcc51425df 100644 --- a/code/game/objects/items/magazine.dm +++ b/code/game/objects/items/magazine.dm @@ -85,6 +85,9 @@ to_chat(user, "The headline screams, \"[headline]\"") /obj/item/tabloid/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message(span_notice("\The [user] leafs idly through \the [src].")) if(headline) to_chat(user, "Most of it is the usual tabloid garbage, but the headline story, \"[headline]\", holds your attention for awhile.") diff --git a/code/game/objects/items/petrifier.dm b/code/game/objects/items/petrifier.dm index 0e976bef48..231302f5aa 100644 --- a/code/game/objects/items/petrifier.dm +++ b/code/game/objects/items/petrifier.dm @@ -17,8 +17,10 @@ . = ..() linked = to_link -/obj/item/petrifier/attack_self(var/mob/user) - . = ..() +/obj/item/petrifier/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if (!isturf(user.loc) && user.get_ultimate_mob() != target) to_chat(user, span_warning("The device beeps but does nothing.")) return diff --git a/code/game/objects/items/pizza_voucher_vr.dm b/code/game/objects/items/pizza_voucher_vr.dm index 182b6d32c0..6a6b33e234 100644 --- a/code/game/objects/items/pizza_voucher_vr.dm +++ b/code/game/objects/items/pizza_voucher_vr.dm @@ -21,6 +21,9 @@ desc = "A pocket-sized plastic slip with a button in the middle. \"[pick(descstrings)]\" is written on the back." /obj/item/pizzavoucher/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE add_fingerprint(user) if(!spent) user.visible_message(span_notice("[user] presses a button on [src]!")) diff --git a/code/game/objects/items/poi_items.dm b/code/game/objects/items/poi_items.dm index 27a4199087..6236558b79 100644 --- a/code/game/objects/items/poi_items.dm +++ b/code/game/objects/items/poi_items.dm @@ -210,8 +210,10 @@ return ..() -/obj/item/poi/broken_drone_circuit/attack_self(mob/living/user as mob) - +/obj/item/poi/broken_drone_circuit/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message(message = "[user] is studiously examining [src]", self_message = "You take your time to analyze the circuit...") var/message = "" @@ -240,7 +242,3 @@ if(do_after(user, delay = 5 SECONDS, target = src)) to_chat(user, message) - - - - ..() diff --git a/code/game/objects/items/robobag.dm b/code/game/objects/items/robobag.dm index 3a466f8cb2..340bb33e4f 100644 --- a/code/game/objects/items/robobag.dm +++ b/code/game/objects/items/robobag.dm @@ -7,14 +7,8 @@ icon_state = "bodybag_folded" item_state = "bodybag_cryo_folded" origin_tech = list(TECH_ENGINEERING = 3) - -/obj/item/bodybag/cryobag/robobag/attack_self(mob/user) - var/obj/structure/closet/body_bag/cryobag/robobag/R = new /obj/structure/closet/body_bag/cryobag/robobag(user.loc) - R.add_fingerprint(user) - if(syringe) - R.syringe = syringe - syringe = null - qdel(src) + robotic = TRUE + cryogenic = FALSE /obj/structure/closet/body_bag/cryobag/robobag name = "synthmorph bag" diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 4016ea7fca..ce0c459f72 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -55,7 +55,10 @@ item_state = "cyborg_upgrade" var/heldname = "default name" -/obj/item/borg/upgrade/utility/rename/attack_self(mob/user as mob) +/obj/item/borg/upgrade/utility/rename/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/new_name = tgui_input_text(user, "Enter new robot name", "Robot Reclassification", heldname, MAX_NAME_LEN) if(new_name) heldname = new_name diff --git a/code/game/objects/items/sahoc_ch.dm b/code/game/objects/items/sahoc_ch.dm index 39e37e4d02..e7ce50367a 100644 --- a/code/game/objects/items/sahoc_ch.dm +++ b/code/game/objects/items/sahoc_ch.dm @@ -17,6 +17,9 @@ capsuleowner = user /obj/item/buttonofnormal/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(colorindex) nonrandom() addtimer(CALLBACK(src, PROC_REF(do_size_effect), capsuleowner), 10, TIMER_DELETE_ME) @@ -79,6 +82,9 @@ ..() /obj/item/daredevice/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/capsuleowner = user playsound(src, 'sound/effects/splat.ogg', 30, 1) var/item = pick(winitems) diff --git a/code/game/objects/items/selectable_item_vr.dm b/code/game/objects/items/selectable_item_vr.dm index 31da60f391..b39fbaffc1 100644 --- a/code/game/objects/items/selectable_item_vr.dm +++ b/code/game/objects/items/selectable_item_vr.dm @@ -10,7 +10,10 @@ var/list/item_options = list("Gift" = /obj/item/a_gift, "Health Analyzer" = /obj/item/healthanalyzer) -/obj/item/selectable_item/attack_self(mob/user as mob) +/obj/item/selectable_item/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_alert(user, {"[preface_string]"}, preface_title) var/chosen_item = tgui_input_list(user, selection_string, selection_title, item_options) chosen_item = item_options[chosen_item] diff --git a/code/game/objects/items/stacks/marker_beacons.dm b/code/game/objects/items/stacks/marker_beacons.dm index 2265ebbfc9..e97f48ccd5 100644 --- a/code/game/objects/items/stacks/marker_beacons.dm +++ b/code/game/objects/items/stacks/marker_beacons.dm @@ -27,6 +27,7 @@ var/list/marker_beacon_colors = list( w_class = ITEMSIZE_SMALL var/icon_base = "marker" var/picked_color = "random" + custom_handling = TRUE /obj/item/stack/marker_beacon/ten amount = 10 @@ -50,6 +51,9 @@ var/list/marker_beacon_colors = list( icon_state = "[icon_base][lowertext(picked_color)]" /obj/item/stack/marker_beacon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!isturf(user.loc)) to_chat(user, span_warning("You need more space to place a [singular_name] here.")) return diff --git a/code/game/objects/items/stacks/sandbags.dm b/code/game/objects/items/stacks/sandbags.dm index f8f62ea090..28028c8670 100644 --- a/code/game/objects/items/stacks/sandbags.dm +++ b/code/game/objects/items/stacks/sandbags.dm @@ -128,6 +128,7 @@ pass_color = TRUE var/bag_material = MAT_CLOTH + custom_handling = TRUE /obj/item/stack/emptysandbag/Initialize(mapload, var/amt, var/bag_mat) . = ..(mapload, amt) @@ -138,7 +139,10 @@ return INITIALIZE_HINT_QDEL color = M.icon_colour -/obj/item/stack/emptysandbag/attack_self(var/mob/user) +/obj/item/stack/emptysandbag/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE while(do_after(user, 1 SECOND, target = src) && can_use(1) && istype(get_turf(src), /turf/simulated/floor/outdoors)) use(1) var/obj/item/stack/sandbags/SB = new (get_turf(src), 1, bag_material) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 8474233c10..312d53557b 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -31,6 +31,10 @@ var/strict_color_stacking = FALSE // Will the stack merge with other stacks that are different colors? (Dyed cloth, wood, etc) var/is_building = FALSE + var/custom_handling = FALSE + var/beacons = FALSE + var/sandbags = FALSE + /obj/item/stack/Initialize(mapload, var/starting_amount) . = ..() if(!stacktype) @@ -84,6 +88,11 @@ . += get_examine_string() /obj/item/stack/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(custom_handling) + return FALSE tgui_interact(user) /obj/item/stack/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index a7e73890dd..b8d4b6559d 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -9,6 +9,7 @@ max_amount = 240 origin_tech = list(TECH_MATERIAL = 6, TECH_BLUESPACE = 4) force = 1 //Needs a token force to ensure you can attack because for some reason you can't attack with 0 force things + custom_handling = TRUE /obj/item/stack/telecrystal/apply_hit_effect(mob/living/target, mob/living/user, var/hit_zone) if(amount >= 5) @@ -18,7 +19,10 @@ else to_chat(user, span_warning("There are not enough telecrystals to do that.")) -/obj/item/stack/telecrystal/attack_self(mob/user as mob) +/obj/item/stack/telecrystal/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.mind.accept_tcrystals) //Checks to see if antag type allows for tcrystals to_chat(user, span_notice("You use \the [src], adding [src.amount] to your balance.")) user.mind.tcrystals += amount diff --git a/code/game/objects/items/surplus_voucher_ch.dm b/code/game/objects/items/surplus_voucher_ch.dm index 7a7c269086..4177d6ab93 100644 --- a/code/game/objects/items/surplus_voucher_ch.dm +++ b/code/game/objects/items/surplus_voucher_ch.dm @@ -11,6 +11,9 @@ name = "Reward Surplus Voucher" desc = "A surplus voucher! This one is meant to reward valued employees! Activate it for your surplus delivery!" /obj/item/surplus_voucher/com/attack_self(mob/user as mob) + . = ..(user) + if(.) + return TRUE spawn_item(get_turf(src)) /obj/item/surplus_voucher/com/proc/spawn_item(var/turf/T) @@ -49,6 +52,9 @@ name = "Engineering Surplus Voucher" desc = "A surplus voucher! This one is meant to resupply engineering with tools! Activate it for your surplus delivery!" /obj/item/surplus_voucher/eng/attack_self(mob/user as mob) + . = ..(user) + if(.) + return TRUE spawn_item(get_turf(src)) /obj/item/surplus_voucher/eng/proc/spawn_item(var/turf/T) @@ -73,6 +79,9 @@ name = "Medical Surplus Voucher" desc = "A surplus voucher! This one is meant to resupply medical with chemicals and kits! Activate it for your surplus delivery!" /obj/item/surplus_voucher/med/attack_self(mob/user as mob) + . = ..(user) + if(.) + return TRUE spawn_item(get_turf(src)) /obj/item/surplus_voucher/med/proc/spawn_item(var/turf/T) @@ -103,6 +112,9 @@ name = "Science Surplus Voucher" desc = "A surplus voucher! This one is meant to supply science with a variety of miscellaneous items! Activate it for your surplus delivery!" /obj/item/surplus_voucher/sci/attack_self(mob/user as mob) + . = ..(user) + if(.) + return TRUE spawn_item(get_turf(src)) /obj/item/surplus_voucher/sci/proc/spawn_item(var/turf/T) @@ -133,6 +145,9 @@ name = "Security Surplus Voucher" desc = "A surplus voucher! This one is meant to resupply security with gear... and donuts! Activate it for your surplus delivery!" /obj/item/surplus_voucher/sec/attack_self(mob/user as mob) + . = ..(user) + if(.) + return TRUE spawn_item(get_turf(src)) /obj/item/surplus_voucher/sec/proc/spawn_item(var/turf/T) @@ -156,6 +171,9 @@ name = "Service Surplus Voucher" desc = "A surplus voucher! This one is meant to generally resupply service employees! Activate it for your surplus delivery!" /obj/item/surplus_voucher/ser/attack_self(mob/user as mob) + . = ..(user) + if(.) + return TRUE spawn_item(get_turf(src)) /obj/item/surplus_voucher/ser/proc/spawn_item(var/turf/T) diff --git a/code/game/objects/items/toys/fake_coin.dm b/code/game/objects/items/toys/fake_coin.dm index 63ff1dc387..87eb82f57b 100644 --- a/code/game/objects/items/toys/fake_coin.dm +++ b/code/game/objects/items/toys/fake_coin.dm @@ -106,7 +106,10 @@ desc = "Shiny green " + MAT_VERDANTIUM + ", pressed into a coin. It almost seems to glimmer under starlight." icon_state = "coin_verdantium" -/obj/item/fake_coin/attack_self(mob/user as mob) +/obj/item/fake_coin/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/result = rand(1, sides) var/comment = "" if(result == 1) diff --git a/code/game/objects/items/toys/mech_toys.dm b/code/game/objects/items/toys/mech_toys.dm index 3169b9ec1c..98b3b9557d 100644 --- a/code/game/objects/items/toys/mech_toys.dm +++ b/code/game/objects/items/toys/mech_toys.dm @@ -115,12 +115,13 @@ //all credit to skasi for toy mech fun ideas /obj/item/toy/mecha/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(timer < world.time) to_chat(user, span_notice("You play with [src].")) timer = world.time + cooldown playsound(user, 'sound/mecha/mechstep.ogg', 20, TRUE) - else - . = ..() /obj/item/toy/mecha/attack_hand(mob/user) . = ..() diff --git a/code/game/objects/items/toys/toys.dm b/code/game/objects/items/toys/toys.dm index 5c51e7fd27..7663735c13 100644 --- a/code/game/objects/items/toys/toys.dm +++ b/code/game/objects/items/toys/toys.dm @@ -163,20 +163,23 @@ w_class = ITEMSIZE_SMALL attack_verb = list("attacked", "struck", "hit") -/obj/item/toy/sword/attack_self(mob/user as mob) - src.active = !( src.active ) - if (src.active) +/obj/item/toy/sword/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + active = !active + if(active) to_chat(user, span_notice("You extend the plastic blade with a quick flick of your wrist.")) playsound(src, 'sound/weapons/saberon.ogg', 50, 1) - src.item_state = "[icon_state]_blade" - src.w_class = ITEMSIZE_LARGE + item_state = "[icon_state]_blade" + w_class = ITEMSIZE_LARGE else to_chat(user, span_notice("You push the plastic blade back down into the handle.")) playsound(src, 'sound/weapons/saberoff.ogg', 50, 1) - src.item_state = "[icon_state]" - src.w_class = ITEMSIZE_SMALL + item_state = "[icon_state]" + w_class = ITEMSIZE_SMALL update_icon() - src.add_fingerprint(user) + add_fingerprint(user) return /obj/item/toy/sword/update_icon() @@ -282,7 +285,10 @@ w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS | SLOT_HOLSTER -/obj/item/toy/bosunwhistle/attack_self(mob/user as mob) +/obj/item/toy/bosunwhistle/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(cooldown < world.time - 35) to_chat(user, span_notice("You blow on [src], creating an ear-splitting noise!")) playsound(src, 'sound/misc/boatswain.ogg', 20, 1) @@ -305,9 +311,12 @@ . = ..() desc = "A \"Space Life\" brand [name]" -/obj/item/toy/figure/attack_self(mob/user as mob) +/obj/item/toy/figure/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(cooldown < world.time) - cooldown = (world.time + 30) //3 second cooldown + cooldown = (world.time + 3 SECONDS) user.visible_message(span_notice("The [src] says \"[toysay]\".")) playsound(src, 'sound/machines/click.ogg', 20, 1) @@ -629,16 +638,12 @@ icon = 'icons/obj/toy.dmi' icon_state = "basecarp" attack_verb = list("bitten", "eaten", "fin slapped") - var/bitesound = 'sound/weapons/bite.ogg' + squeeze_sound = 'sound/weapons/bite.ogg' + cooldown_length = 1 SECOND // Attack mob /obj/item/toy/plushie/carp/attack(mob/M as mob, mob/user as mob) - playsound(src, bitesound, 20, 1) // Play bite sound in local area - return ..() - -// Attack self -/obj/item/toy/plushie/carp/attack_self(mob/user as mob) - playsound(src, bitesound, 20, 1) + playsound(src, squeeze_sound, 20, 1) // Play bite sound in local area return ..() @@ -810,6 +815,16 @@ //This should be used if a plushie can be made to say custom messages. Not currently required at the moment, but here just in case it'd added in the future. var/prevent_impersonation = FALSE + var/special_handling = TRUE + + ///The sound we make when squeezed + var/squeeze_sound = 'sound/items/drop/plushie.ogg' + + ///Timer to track how long until we can play a sound again + var/cooldown_timer + ///How long our cooldown timer is. Default 15 seconds + var/cooldown_length = 15 SECONDS + /obj/item/toy/plushie/Initialize(mapload) . = ..() adjusted_name = name @@ -821,7 +836,12 @@ if(in_range(user, src) && stored_item) . += span_italics("You can see something in there...") -/obj/item/toy/plushie/attack_self(mob/user as mob) +/obj/item/toy/plushie/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return if(stored_item && opened && !searching) searching = TRUE if(do_after(user, 1 SECOND, target = src)) @@ -843,7 +863,9 @@ user.visible_message(span_warning(span_bold("\The [user]") + " attempts to strangle [src]!"),span_warning("You attempt to strangle [src]!")) else user.visible_message(span_notice(span_bold("\The [user]") + " pokes [src]."),span_notice("You poke [src].")) - playsound(src, 'sound/items/drop/plushie.ogg', 25, 0) + if(cooldown_timer < world.time) + playsound(src, squeeze_sound, 25, 0) + cooldown_timer = world.time + cooldown_length if(pokephrase) //There was no indiciation you had to use disarm intent to make it speak...So now it speaks if you touch it at all! say_phrase() last_message = world.time @@ -1190,14 +1212,7 @@ icon = 'icons/obj/toy.dmi' icon_state = "plushie_tin" pokephrase = "Peep peep!" - var/cooldown = 0 - -/obj/item/toy/plushie/tinytin/attack_self(mob/user as mob) - if(!cooldown) - playsound(user, 'sound/voice/peep.ogg', 20, 0) - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 15 SECONDS, TIMER_DELETE_ME) - return ..() + squeeze_sound = 'sound/voice/peep.ogg' /obj/item/toy/plushie/tinytin_sec name = "officer tiny tin plushie" @@ -1206,14 +1221,7 @@ icon_state = "plushie_tinsec" bubble_icon = "security" pokephrase = "That means you fucked up!" - var/cooldown = 0 - -/obj/item/toy/plushie/tinytin_sec/attack_self(mob/user as mob) - if(!cooldown) - playsound(user, 'sound/voice/tinytin_fuckedup.ogg', 25, 0) - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 15 SECONDS, TIMER_DELETE_ME) - return ..() + squeeze_sound = 'sound/voice/tinytin_fuckedup.ogg' //Toy cult sword /obj/item/toy/cultsword @@ -1261,13 +1269,15 @@ var/cooldown = 0 var/list/possible_answers = list("Definitely.", "All signs point to yes.", "Most likely.", "Yes.", "Ask again later.", "Better not tell you now.", "Future unclear.", "Maybe.", "Doubtful.", "No.", "Don't count on it.", "Never.") -/obj/item/toy/eight_ball/attack_self(mob/user as mob) +/obj/item/toy/eight_ball/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!cooldown) var/answer = pick(possible_answers) user.visible_message(span_notice("[user] focuses on their question and [use_action]...")) user.visible_message(span_notice("The [src] says \"[answer]\"")) - spawn(30) - cooldown = 0 + VARSET_IN(src, cooldown, FALSE, 3 SECONDS) return /obj/item/toy/eight_ball/conch @@ -1324,26 +1334,7 @@ /obj/item/toy/character/voidone, /obj/item/toy/character/lich ) -/* VOREStation edit. Moved to toys_vr.dm -/obj/item/toy/AI - name = "toy AI" - desc = "A little toy model AI core!"// with real law announcing action!" //Alas, requires a rewrite of how ion laws work. - icon = 'icons/obj/toy.dmi' - icon_state = "AI" - w_class = ITEMSIZE_SMALL - var/cooldown = 0 -/obj/item/toy/AI/attack_self(mob/user) - if(!cooldown) //for the sanity of everyone - var/message = generate_ion_law() - to_chat(user, span_notice("You press the button on [src].")) - playsound(src, 'sound/machines/click.ogg', 20, 1) - visible_message(span_danger("[message]")) - cooldown = 1 - spawn(30) cooldown = 0 - return - ..() -*/ /obj/item/toy/owl name = "owl action figure" desc = "An action figure modeled after 'The Owl', defender of justice." @@ -1353,15 +1344,16 @@ var/cooldown = 0 /obj/item/toy/owl/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!cooldown) //for the sanity of everyone var/message = pick("You won't get away this time, Griffin!", "Stop right there, criminal!", "Hoot! Hoot!", "I am the night!") to_chat(user, span_notice("You pull the string on the [src].")) //playsound(src, 'sound/misc/hoot.ogg', 25, 1) visible_message(span_danger("[message]")) cooldown = 1 - spawn(30) cooldown = 0 - return - ..() + VARSET_IN(src, cooldown, FALSE, 3 SECONDS) /obj/item/toy/griffin name = "griffin action figure" @@ -1372,15 +1364,16 @@ var/cooldown = 0 /obj/item/toy/griffin/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!cooldown) //for the sanity of everyone var/message = pick("You can't stop me, Owl!", "My plan is flawless! The vault is mine!", "Caaaawwww!", "You will never catch me!") to_chat(user, span_notice("You pull the string on the [src].")) //playsound(src, 'sound/misc/caw.ogg', 25, 1) visible_message(span_danger("[message]")) cooldown = 1 - spawn(30) cooldown = 0 - return - ..() + VARSET_IN(src, cooldown, FALSE, 3 SECONDS) /* NYET. /obj/item/toddler diff --git a/code/game/objects/items/toys/toys_vr.dm b/code/game/objects/items/toys/toys_vr.dm index 1bd460cdde..5dfda340e4 100644 --- a/code/game/objects/items/toys/toys_vr.dm +++ b/code/game/objects/items/toys/toys_vr.dm @@ -185,17 +185,8 @@ icon = 'icons/obj/toy.dmi' icon_state = "plushie_vox" pokephrase = "Skreee!" - var/cooldown = FALSE + squeeze_sound = 'sound/voice/shriek1.ogg' -/obj/item/toy/plushie/vox/attack_self(mob/user as mob) - if(!cooldown) - playsound(user, 'sound/voice/shriek1.ogg', 10, 0) - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 15 SECONDS, TIMER_DELETE_ME) - return ..() - -/obj/item/toy/plushie/vox/proc/cooldownreset() - cooldown = 0 /obj/item/toy/plushie/ipc name = "IPC plushie" @@ -204,7 +195,7 @@ icon_state = "plushie_ipc" bubble_icon = "synthetic" pokephrase = "Ping!" - var/cooldown = 0 + squeeze_sound = 'sound/machines/ping.ogg' /obj/item/reagent_containers/food/snacks/slice/bread var/toasted = FALSE @@ -238,13 +229,6 @@ else return ..() -/obj/item/toy/plushie/ipc/attack_self(mob/user as mob) - if(!cooldown) - playsound(user, 'sound/machines/ping.ogg', 10, 0) - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 15 SECONDS, TIMER_DELETE_ME) - return ..() - /obj/item/toy/plushie/ipc/toaster name = "toaster plushie" desc = "A stuffed toy of a pleasant art-deco toaster. It has a small tag on it reading 'Bricker Home Appliances! All rights reserved, copyright 2298.' It's a tad heavy on account of containing a heating coil. Want to make toast?" @@ -252,13 +236,7 @@ attack_verb = list("toasted", "burnt") pokephrase = "Ding!" bubble_icon = "machine" - -/obj/item/toy/plushie/ipc/toaster/attack_self(mob/user as mob) - if(!cooldown) - playsound(user, 'sound/machines/ding.ogg', 10, 0) - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 15 SECONDS, TIMER_DELETE_ME) - return ..() + squeeze_sound = 'sound/machines/ding.ogg' /obj/item/toy/plushie/snakeplushie name = "snake plushie" @@ -281,18 +259,17 @@ desc = "An adorable plushie of NanoTrasen's Best Girl(TM) mascot. It smells faintly of paperwork." icon = 'icons/obj/toy.dmi' icon_state = "marketable_pip" - var/cooldown = FALSE + squeeze_sound = 'sound/effects/whistle.ogg' /obj/item/toy/plushie/marketable_pip/attackby(obj/item/I, mob/user) var/obj/item/card/id/id = I.GetID() - if(istype(id) && !cooldown) + if(istype(id) && cooldown_timer < world.time) var/responses = list("I'm not giving you all-access.", "Do you want an ID modification?", "Where are you swiping that!?", "Congratulations! You've been promoted to unemployed!") pokephrase = pick(responses) user.visible_message(span_notice("[user] swipes \the [I] against \the [src].")) playsound(user, 'sound/effects/whistle.ogg', 10, 0) say_phrase() - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 15 SECONDS, TIMER_DELETE_ME) + cooldown_timer = world.time + cooldown_length return ..() /obj/item/toy/plushie/marketable_pip/attack_self(mob/user as mob) @@ -311,17 +288,7 @@ icon = 'icons/obj/toy.dmi' icon_state = "moth" pokephrase = "Aaaaaaa." - var/cooldown = FALSE - -/obj/item/toy/plushie/moth/attack_self(mob/user as mob) - if(!cooldown) - playsound(user, 'sound/voice/moth/scream_moth.ogg', 10, 0) - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 15 SECONDS, TIMER_DELETE_ME) - return ..() - -/obj/item/toy/plushie/moth/proc/cooldownreset() - cooldown = 0 + squeeze_sound = 'sound/voice/moth/scream_moth.ogg' /obj/item/toy/plushie/crab name = "crab plushie" @@ -358,14 +325,7 @@ pokephrase = "Stab!" bubble_icon = "security" attack_verb = list("stabbed", "slashed") - var/cooldown = FALSE - -/obj/item/toy/plushie/sus/attack_self(mob/user as mob) - if(!cooldown) - playsound(user, 'sound/weapons/slice.ogg', 10, 0) - cooldown = TRUE - addtimer(VARSET_CALLBACK(src, cooldown, FALSE), 15 SECONDS, TIMER_DELETE_ME) - return ..() + squeeze_sound = 'sound/weapons/slice.ogg' /obj/item/toy/plushie/sus/blue name = "blue spaceman plushie" @@ -452,6 +412,9 @@ icon_state = "chewtoy_poly" /obj/item/toy/chewtoy/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE playsound(loc, 'sound/items/drop/plushie.ogg', 50, 1) user.visible_message(span_notice(span_bold("\The [user]") + " gnaws on [src]!"),span_notice("You gnaw on [src]!")) @@ -517,6 +480,9 @@ var/cooldown = 0 /obj/item/toy/redbutton/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(cooldown < world.time) cooldown = (world.time + 300) // Sets cooldown at 30 seconds user.visible_message(span_warning("[user] presses the big red button."), span_notice("You press the button, it plays a loud noise!"), span_notice("The button clicks loudly.")) @@ -548,7 +514,12 @@ var/cooldown = 0 var/list/possible_answers = null -/obj/item/toy/AI/attack_self(mob/user as mob) +/obj/item/toy/AI/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(cooldown > world.time) //No, I'm not allowing you to spamclick this to do a search over GLOB.player_list + return var/list/players = list() for(var/mob/living/carbon/human/player in GLOB.player_list) @@ -566,12 +537,6 @@ var/answer = pick(possible_answers) user.visible_message(span_notice("[user] asks the AI core to state laws.")) user.visible_message(span_notice("[src] says \"[answer]\"")) - cooldown = 1 - addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50) - return ..() - -/obj/item/toy/AI/proc/cooldownreset() - cooldown = 0 /* * Toy cuffs @@ -611,6 +576,9 @@ var/cooldown = 0 /obj/item/toy/nuke/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(cooldown < world.time) cooldown = world.time + 1800 //3 minutes user.visible_message(span_warning("[user] presses a button on [src]"), span_notice("You activate [src], it plays a loud noise!"), span_notice("You hear the click of a button.")) @@ -639,8 +607,14 @@ var/cooldown = 0 var/obj/stored_minature = null -/obj/item/toy/minigibber/attack_self(mob/user) +/obj/item/toy/minigibber/Destroy() + QDEL_NULL(stored_minature) + . = ..() +/obj/item/toy/minigibber/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(stored_minature) to_chat(user, span_danger("\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!")) playsound(src, 'sound/effects/splat.ogg', 50, 1) @@ -679,6 +653,9 @@ var/cooldown = 0 /obj/item/toy/toy_xeno/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(cooldown <= world.time) cooldown = (world.time + 50) //5 second cooldown user.visible_message(span_notice("[user] pulls back the string on [src].")) @@ -721,6 +698,9 @@ spin_cylinder() /obj/item/toy/russian_revolver/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!bullets_left) user.visible_message(span_warning("[user] loads a bullet into [src]'s cylinder before spinning it.")) spin_cylinder() @@ -811,12 +791,14 @@ attack_verb = list("sawed", "cut", "hacked", "carved", "cleaved", "butchered", "felled", "timbered") var/cooldown = 0 -/obj/item/toy/chainsaw/attack_self(mob/user as mob) +/obj/item/toy/chainsaw/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!cooldown) playsound(user, 'sound/weapons/chainsaw_startup.ogg', 10, 0) cooldown = 1 addtimer(CALLBACK(src, PROC_REF(cooldownreset)), 50) - return ..() /obj/item/toy/chainsaw/proc/cooldownreset() cooldown = 0 @@ -850,7 +832,10 @@ if(prob(0.1)) real = 1 -/obj/item/toy/snake_popper/attack_self(mob/user as mob) +/obj/item/toy/snake_popper/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!popped) to_chat(user, span_warning("A snake popped out of [src]!")) if(real == 0) @@ -1031,6 +1016,9 @@ return 1 /obj/item/toy/desk/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE activate(user) /obj/item/toy/desk/click_alt(mob/user) @@ -1099,7 +1087,10 @@ drop_sound = 'sound/items/drop/cardboardbox.ogg' pickup_sound = 'sound/items/pickup/cardboardbox.ogg' -/obj/item/toy/partypopper/attack_self(mob/user as mob) +/obj/item/toy/partypopper/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(icon_state == "partypopper") user.visible_message(span_notice("[user] pulls on the string, releasing a burst of confetti!"), span_notice("You pull on the string, releasing a burst of confetti!")) playsound(src, 'sound/effects/snap.ogg', 50, TRUE) @@ -1174,6 +1165,9 @@ var/registered_mob //On request, only one person is able to use it at a time. /obj/item/toy/acorn_branch/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.stat || !ishuman(user)) return if(world.time < next_use) @@ -1201,6 +1195,7 @@ icon = 'icons/obj/toy.dmi' icon_state = "reddragon" var/cooldown = FALSE + special_handling = TRUE /obj/item/toy/plushie/dragon/Initialize(mapload) . = ..() @@ -1208,6 +1203,9 @@ pokephrase = pick("ROAR!", "RAWR!", "GAWR!", "GRR!", "GROAR!", "GRAH!", "Weh!", "Merp!") /obj/item/toy/plushie/dragon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!cooldown) switch(pokephrase) if("Weh!") diff --git a/code/game/objects/items/weapons/AI_modules.dm b/code/game/objects/items/weapons/AI_modules.dm index f59f6fb602..b3d2013bde 100644 --- a/code/game/objects/items/weapons/AI_modules.dm +++ b/code/game/objects/items/weapons/AI_modules.dm @@ -144,8 +144,10 @@ AI MODULES desc = "A 'safeguard' AI module: 'Safeguard . Anyone threatening or attempting to harm is no longer to be considered a crew member, and is a threat which must be neutralized.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 4) -/obj/item/aiModule/safeguard/attack_self(var/mob/user as mob) - ..() +/obj/item/aiModule/safeguard/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/targName = tgui_input_text(user, "Please enter the name of the person to safeguard.", "Safeguard who?", user.name, MAX_MESSAGE_LEN) targetName = targName desc = text("A 'safeguard' AI module: 'Safeguard []. Anyone threatening or attempting to harm [] is no longer to be considered a crew member, and is a threat which must be neutralized.'", targetName, targetName) @@ -170,8 +172,10 @@ AI MODULES desc = "A 'one crew member' AI module: 'Only is a crew member.'" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) //made with diamonds! -/obj/item/aiModule/oneHuman/attack_self(var/mob/user as mob) - ..() +/obj/item/aiModule/oneHuman/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/targName = tgui_input_text(user, "Please enter the name of the person who is the only crew member.", "Who?", user.real_name, MAX_MESSAGE_LEN) targetName = targName desc = text("A 'one crew member' AI module: 'Only [] is a crew member.'", targetName) @@ -251,8 +255,10 @@ AI MODULES desc = "A 'freeform' AI module: ''" origin_tech = list(TECH_DATA = 4, TECH_MATERIAL = 4) -/obj/item/aiModule/freeform/attack_self(var/mob/user as mob) - ..() +/obj/item/aiModule/freeform/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/new_lawpos = tgui_input_number(user, "Please enter the priority for your new law. Can only write to law sectors 15 and above.", "Law Priority (15+)", lawpos) if(new_lawpos < MIN_SUPPLIED_LAW_NUMBER) return lawpos = min(new_lawpos, MAX_SUPPLIED_LAW_NUMBER) @@ -372,8 +378,10 @@ AI MODULES desc = "A 'freeform' Core AI module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6) -/obj/item/aiModule/freeformcore/attack_self(var/mob/user as mob) - ..() +/obj/item/aiModule/freeformcore/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/newlaw = "" var/targName = tgui_input_text(user, "Please enter a new core law for the AI.", "Freeform Law Entry", newlaw, MAX_MESSAGE_LEN) newFreeFormLaw = targName @@ -396,8 +404,10 @@ AI MODULES desc = "A hacked AI law module: ''" origin_tech = list(TECH_DATA = 3, TECH_MATERIAL = 6, TECH_ILLEGAL = 7) -/obj/item/aiModule/syndicate/attack_self(var/mob/user as mob) - ..() +/obj/item/aiModule/syndicate/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/newlaw = "" var/targName = tgui_input_text(user, "Please enter a new law for the AI.", "Freeform Law Entry", newlaw, MAX_MESSAGE_LEN) newFreeFormLaw = targName diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index 7e8d0e7635..c62718df72 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -67,8 +67,11 @@ return ..() */ // Changes which mode it is on. -/obj/item/rcd/attack_self(mob/living/user) -/* VOREStation Removal - Moved to VR +/*/obj/item/rcd/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + //VOREStation Removal - Moved to VR if(mode_index >= modes.len) // Shouldn't overflow unless someone messes with it in VV poorly but better safe than sorry. mode_index = 1 else diff --git a/code/game/objects/items/weapons/RCD_vr.dm b/code/game/objects/items/weapons/RCD_vr.dm index 9f943cf4b6..20392bf27f 100644 --- a/code/game/objects/items/weapons/RCD_vr.dm +++ b/code/game/objects/items/weapons/RCD_vr.dm @@ -110,7 +110,9 @@ /* CHOMPEdit - moved this block to modular_chomp\code\game\objects\items\weapons\rcd.dm /obj/item/rcd/attack_self(mob/living/user) - ..() + . = ..(user) + if(.) + return TRUE var/list/choices = list( "Airlock" = radial_image_airlock, "Deconstruct" = radial_image_decon, diff --git a/code/game/objects/items/weapons/RMS.dm b/code/game/objects/items/weapons/RMS.dm index 0edefe20fd..ebc146c078 100644 --- a/code/game/objects/items/weapons/RMS.dm +++ b/code/game/objects/items/weapons/RMS.dm @@ -241,6 +241,9 @@ var/list/RMS_random_malfunction = list(/obj/item/fbp_backup_cell, return /obj/item/rms/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/list/choices = list( "Steel" = radial_image_steel, "Glass" = radial_image_glass, @@ -277,7 +280,6 @@ var/list/RMS_random_malfunction = list(/obj/item/fbp_backup_cell, to_chat(user, span_notice("Changed mode to '[choice]'.")) playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - return ..() /obj/item/rms/attackby(obj/item/W, mob/user) if(W.has_tool_quality(TOOL_MULTITOOL)) diff --git a/code/game/objects/items/weapons/RPD_vr.dm b/code/game/objects/items/weapons/RPD_vr.dm index 2f22e2eb56..4d3bd4a1dc 100644 --- a/code/game/objects/items/weapons/RPD_vr.dm +++ b/code/game/objects/items/weapons/RPD_vr.dm @@ -65,6 +65,9 @@ return ..() /obj/item/pipe_dispenser/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/pipe_dispenser/ui_assets(mob/user) diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index a9d6fb91cd..783554f73a 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -65,7 +65,10 @@ GLOBAL_LIST_INIT(robot_glass_options, list( balloon_alert(user, "container chosen: [glass_choice]") glasstype_name = glass_choice -/obj/item/rsf/attack_self(mob/user as mob) +/obj/item/rsf/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/options = list( "card deck" = image(icon = 'icons/obj/playing_cards.dmi', icon_state = "deck"), "card deck (big)" = image(icon = 'icons/obj/playing_cards.dmi', icon_state = "deck"), diff --git a/code/game/objects/items/weapons/candle.dm b/code/game/objects/items/weapons/candle.dm index ca3f0b0956..ca755eb5cb 100644 --- a/code/game/objects/items/weapons/candle.dm +++ b/code/game/objects/items/weapons/candle.dm @@ -65,9 +65,12 @@ var/turf/T = loc T.hotspot_expose(700, 5) -/obj/item/flame/candle/attack_self(mob/user as mob) +/obj/item/flame/candle/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(lit) - lit = 0 + lit = FALSE update_icon() set_light(0) diff --git a/code/game/objects/items/weapons/canes.dm b/code/game/objects/items/weapons/canes.dm index 77580c6f1e..f56ca88b59 100644 --- a/code/game/objects/items/weapons/canes.dm +++ b/code/game/objects/items/weapons/canes.dm @@ -29,7 +29,10 @@ temp_blade.active = TRUE temp_blade.update_force() -/obj/item/cane/concealed/attack_self(var/mob/user) +/obj/item/cane/concealed/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(concealed_blade) user.visible_message(span_warning("[user] has unsheathed \a [concealed_blade] from [user.p_their()] [src]!"), "You unsheathe \the [concealed_blade] from \the [src].") // Calling drop/put in hands to properly call item drop/pickup procs @@ -40,8 +43,7 @@ user.update_inv_l_hand(0) user.update_inv_r_hand() concealed_blade = null - else - ..() + update_icon() /obj/item/cane/concealed/attackby(var/obj/item/material/butterfly/W, var/mob/user) if(!src.concealed_blade && istype(W)) @@ -92,7 +94,10 @@ force = 3 var/on = 0 -/obj/item/cane/white/collapsible/attack_self(mob/user as mob) +/obj/item/cane/white/collapsible/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE on = !on if(on) user.visible_message(span_infoplain(span_bold("\The [user]") + " extends the white cane."),\ diff --git a/code/game/objects/items/weapons/capture_crystal.dm b/code/game/objects/items/weapons/capture_crystal.dm index 51d09432db..c03bb417f4 100644 --- a/code/game/objects/items/weapons/capture_crystal.dm +++ b/code/game/objects/items/weapons/capture_crystal.dm @@ -20,6 +20,7 @@ var/full_icon = "full" var/spawn_mob_name = "A mob" var/capture_chance_modifier = 1 //So we can have special subtypes with different capture rates! + var/loadout = FALSE /obj/item/capture_crystal/Initialize(mapload) . = ..() @@ -228,6 +229,13 @@ //Tries to unleash or recall your stored mob /obj/item/capture_crystal/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(loadout && !bound_mob) + to_chat(user, span_notice("\The [src] emits an unpleasant tone... It is not ready yet.")) + playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1) + return if(bound_mob && !owner) if(bound_mob == user) to_chat(user, span_notice("\The [src] emits an unpleasant tone... It does not activate for you.")) @@ -869,6 +877,7 @@ /obj/item/capture_crystal/loadout active = TRUE + loadout = TRUE /obj/item/capture_crystal/loadout/attack(mob/living/M, mob/living/user) if(!bound_mob && M != user) @@ -877,12 +886,6 @@ return . = ..() -/obj/item/capture_crystal/loadout/attack_self(mob/living/user) - if(!bound_mob) - to_chat(user, span_notice("\The [src] emits an unpleasant tone... It is not ready yet.")) - playsound(src, 'sound/effects/capture-crystal-problem.ogg', 75, 1, -1) - return - . = ..() /obj/item/capture_crystal/loadout/capture_chance() return 0 diff --git a/code/game/objects/items/weapons/chewables.dm b/code/game/objects/items/weapons/chewables.dm index 0b72094bc0..dedfd11e59 100644 --- a/code/game/objects/items/weapons/chewables.dm +++ b/code/game/objects/items/weapons/chewables.dm @@ -13,6 +13,9 @@ var/wrapped = FALSE /obj/item/clothing/mask/chewable/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(wrapped) wrapped = FALSE to_chat(user, span_notice("You unwrap \the [name].")) diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 0781ce4665..73329b19fc 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -294,6 +294,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM zippomes = span_rose("With a flick of their wrist, USER lights their NAME with their FLAME.") weldermes = span_notice("USER casually lights the NAME with FLAME.") ignitermes = span_notice("USER fiddles with FLAME, and manages to light their NAME.") + special_handling = TRUE /obj/item/clothing/mask/smokable/cigarette/Initialize(mapload) . = ..() @@ -324,7 +325,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM else to_chat(user, span_notice("[src] is full.")) -/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user as mob) +/obj/item/clothing/mask/smokable/cigarette/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(lit == 1) if(user.a_intent == I_HURT) user.visible_message(span_notice("[user] drops and treads on the lit [src], putting it out instantly.")) @@ -333,7 +337,6 @@ CIGARETTE PACKETS ARE IN FANCY.DM else user.visible_message(span_notice("[user] puts out \the [src].")) quench() - return ..() //////////// // CIGARS // @@ -434,7 +437,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM . = ..() name = "empty [initial(name)]" -/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user as mob) +/obj/item/clothing/mask/smokable/pipe/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(lit == 1) if(user.a_intent == I_HURT) user.visible_message(span_notice("[user] empties the lit [src] on the floor!.")) @@ -561,14 +567,17 @@ CIGARETTE PACKETS ARE IN FANCY.DM qdel(G) /obj/item/reagent_containers/rollingpaper/attack_self(mob/living/user) - if(!src.reagents) //don't roll an empty joint + . = ..(user) + if(.) + return TRUE + if(!reagents) //don't roll an empty joint to_chat(user, span_warning("There is nothing in [src]. Add something to it first.")) return var/obj/item/clothing/mask/smokable/cigarette/J = new crafted_type() to_chat(user,span_notice("You roll the [src] into a blunt!")) J.add_fingerprint(user) - if(src.reagents) - src.reagents.trans_to_obj(J, src.reagents.total_volume) + if(reagents) + reagents.trans_to_obj(J, reagents.total_volume) user.drop_from_inventory(src) user.put_in_hands(J) qdel(src) @@ -613,6 +622,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM COLOR_ASSEMBLY_BLUE, COLOR_ASSEMBLY_PURPLE, COLOR_ASSEMBLY_HOT_PINK) + /// If we are a special variant (see: override attack_self) + var/special_variant = FALSE + /// Var used for detonator zippos + var/detonator_mode = 0 // TODO: Remove this path from POIs and loose maps (it's no longer needed) /obj/item/flame/lighter/random @@ -625,8 +638,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM add_overlay(I) /obj/item/flame/lighter/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(special_variant) + return FALSE + if(detonator_mode) + return FALSE if(!lit) - lit = 1 + lit = TRUE icon_state = "lighteron" playsound(src, activation_sound, 75, 1) user.visible_message(span_notice("After a few attempts, [user] manages to light the [src].")) @@ -635,7 +655,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM START_PROCESSING(SSobj, src) update_icon() else - lit = 0 + lit = FALSE icon_state = "lighter" playsound(src, deactivation_sound, 75, 1) user.visible_message(span_notice("[user] quietly shuts off the [src].")) @@ -682,16 +702,22 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = "zippo" activation_sound = 'sound/items/zippo_on.ogg' deactivation_sound = 'sound/items/zippo_off.ogg' + special_variant = TRUE /obj/item/flame/lighter/zippo/Initialize(mapload) . = ..() cut_overlays() //Prevents the Cheap Lighter overlay from appearing on this /obj/item/flame/lighter/zippo/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(detonator_mode) + return FALSE if(!base_state) base_state = icon_state if(!lit) - lit = 1 + lit = TRUE icon_state = "[base_state]on" item_state = "[base_state]on" playsound(src, activation_sound, 75, 1) @@ -700,7 +726,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM set_light(2, 0.5, "#FF9933") START_PROCESSING(SSobj, src) else - lit = 0 + lit = FALSE icon_state = "[base_state]" item_state = "[base_state]" playsound(src, deactivation_sound, 75, 1) @@ -781,6 +807,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = "SMzippo" activation_sound = 'sound/items/zippo_on_alt.ogg' deactivation_sound = 'sound/items/zippo_off.ogg' + special_variant = TRUE + ///Special supermatter var used for attack_self chain logic. + var/special_supermatter = FALSE /obj/item/flame/lighter/supermatter/syndismzippo name = "Phoron Supermatter Zippo" // Syndicate SM Lighter @@ -790,6 +819,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = "SyndiSMzippo" activation_sound = 'sound/items/zippo_on_alt.ogg' deactivation_sound = 'sound/items/zippo_off.ogg' + special_supermatter = TRUE /obj/item/flame/lighter/supermatter/expsmzippo name = "Experimental SM Lighter" // Dangerous WIP (admin/event only ATM) @@ -799,9 +829,15 @@ CIGARETTE PACKETS ARE IN FANCY.DM item_state = "ExpSMzippo" activation_sound = 'sound/items/button-open.ogg' deactivation_sound = 'sound/items/button-close.ogg' + special_supermatter = TRUE // safe smzippo /obj/item/flame/lighter/supermatter/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(special_supermatter) + return FALSE if(!base_state) base_state = icon_state if(!lit) @@ -873,6 +909,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM // syndicate smzippo /obj/item/flame/lighter/supermatter/syndismzippo/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(!base_state) base_state = icon_state if(!lit) @@ -944,6 +983,9 @@ CIGARETTE PACKETS ARE IN FANCY.DM // Experimental smzippo /obj/item/flame/lighter/supermatter/expsmzippo/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if (!base_state) base_state = icon_state if (!lit) diff --git a/code/game/objects/items/weapons/clown_items.dm b/code/game/objects/items/weapons/clown_items.dm index 512ea2f17d..7de50e538a 100644 --- a/code/game/objects/items/weapons/clown_items.dm +++ b/code/game/objects/items/weapons/clown_items.dm @@ -14,24 +14,3 @@ if(isliving(AM)) var/mob/living/M = AM M.slip("the [src.name]",4) - -/* - * Bike Horns - */ -/obj/item/bikehorn - var/honk_sound = 'sound/items/bikehorn.ogg' - -/obj/item/bikehorn/attack_self(mob/user as mob) - if(spam_flag == 0) - spam_flag = 1 - playsound(src, honk_sound, 50, 1) - src.add_fingerprint(user) - spawn(20) - spam_flag = 0 - return - -/obj/item/bikehorn/Crossed(atom/movable/AM as mob|obj) - if(AM.is_incorporeal()) - return - if(isliving(AM)) - playsound(src, honk_sound, 50, 1) diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm index 8e8f702668..6115f7deb1 100644 --- a/code/game/objects/items/weapons/cosmetics.dm +++ b/code/game/objects/items/weapons/cosmetics.dm @@ -31,7 +31,10 @@ colour = pick("red","purple","jade","black") name = "[colour] lipstick" -/obj/item/lipstick/attack_self(mob/user as mob) +/obj/item/lipstick/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("You twist \the [src] [open ? "closed" : "open"].")) open = !open if(open) @@ -76,6 +79,9 @@ icon_state = "purplecomb" /obj/item/haircomb/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE var/text = "person" if(ishuman(user)) var/mob/living/carbon/human/U = user @@ -104,7 +110,10 @@ . = ..() M = new(src, null) -/obj/item/makeover/attack_self(mob/living/carbon/user as mob) +/obj/item/makeover/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(ishuman(user)) to_chat(user, span_notice("You flip open \the [src] and begin to adjust your appearance.")) M.tgui_interact(user) diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 3fff2e6ef5..da6a66ffbd 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -118,17 +118,20 @@ update_icon() to_chat(user, span_notice("You insert [I] into [src].")) -/obj/item/clothing/mask/smokable/ecig/attack_self(mob/user as mob) - if (active) - active=0 +/obj/item/clothing/mask/smokable/ecig/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(active) + active = FALSE STOP_PROCESSING(SSobj, src) to_chat(user, span_notice("You turn off \the [src]. ")) update_icon() else - if (!ec_cartridge) + if(!ec_cartridge) to_chat(user, span_notice("You can't use it with no cartridge installed!.")) return - active=1 + active = TRUE START_PROCESSING(SSobj, src) to_chat(user, span_notice("You turn on \the [src]. ")) update_icon() diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index a99e639722..2d55205f8f 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -38,7 +38,10 @@ else ..() -/obj/item/plastique/attack_self(mob/user as mob) +/obj/item/plastique/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/newtime = tgui_input_number(user, "Please set the timer.", "Timer", 10, 60000, 10) if(user.get_active_hand() == src) newtime = CLAMP(newtime, 10, 60000) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 397b73f6b1..9d0689b8bf 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -63,7 +63,10 @@ if(get_dist(user, src) == 0) . += "[src] has [src.reagents.total_volume] units of foam left!" -/obj/item/extinguisher/attack_self(mob/user as mob) +/obj/item/extinguisher/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE safety = !safety icon_state = "[sprite_name][!safety]" desc = "The safety is [safety ? "on" : "off"]." diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 0f53b08d26..8e2a5ba5a5 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -155,7 +155,10 @@ ..() -/obj/item/flamethrower/attack_self(mob/user as mob) +/obj/item/flamethrower/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.stat || user.restrained() || user.lying) return tgui_interact(user) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index ff06b5cb8e..18a9281bf2 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -15,6 +15,8 @@ item_state = "gift1" drop_sound = 'sound/items/drop/cardboardbox.ogg' pickup_sound = 'sound/items/pickup/cardboardbox.ogg' + ///Var used for attack_hand chain. + var/special_handling = FALSE /obj/item/a_gift/Initialize(mapload) . = ..() @@ -25,7 +27,10 @@ else icon_state = "gift[pick(1, 2, 3)]" + "_[pick("g","r","b","y","p")]" -/obj/item/gift/attack_self(mob/user as mob) +/obj/item/gift/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.drop_item() playsound(src, 'sound/items/package_unwrap.ogg', 50,1) if(gift) @@ -59,7 +64,12 @@ qdel(src) -/obj/item/a_gift/attack_self(mob/M as mob) +/obj/item/a_gift/attack_self(mob/M) + . = ..(M) + if(.) + return TRUE + if(special_handling) + return FALSE var/gift_type = pick( /obj/item/storage/wallet, /obj/item/storage/photo_album, @@ -193,6 +203,7 @@ item_state = "chomp_present" plane = ABOVE_MOB_PLANE var/chaos + special_handling = TRUE /obj/item/a_gift/advanced/Initialize(mapload) . = ..() @@ -203,6 +214,9 @@ desc = "The casino dev messed up and gave you the wrong present! This one pulses with potential for good or evil!" /obj/item/a_gift/advanced/attack_self(mob/M) //WIP - ALWAYS add more items to list! - Jack + . = ..(M) + if(.) + return TRUE var/gift_type_advanced = pick( /obj/item/binoculars/spyglass, /obj/item/bodysnatcher, diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 1568604f52..5e3efc8aff 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -17,6 +17,7 @@ var/list/beakers = new/list() var/list/allowed_containers = list(/obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/glass/bottle) var/affected_area = 3 + special_handling = TRUE /obj/item/grenade/chem_grenade/Initialize(mapload) . = ..() @@ -27,7 +28,10 @@ QDEL_LIST_NULL(beakers) return ..() -/obj/item/grenade/chem_grenade/attack_self(mob/user as mob) +/obj/item/grenade/chem_grenade/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!stage || stage==1) if(detonator) // detonator.loc=src.loc diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 818933389e..439df2fdd9 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -16,6 +16,9 @@ var/hud_state = "grenade_he" // TGMC Ammo HUD Port var/hud_state_empty = "grenade_empty" // TGMC Ammo HUD Port + ///Var for special attack_self handling + var/special_handling = FALSE + pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' @@ -55,7 +58,12 @@ . += "\The [src] is set for instant detonation." -/obj/item/grenade/attack_self(mob/user as mob) +/obj/item/grenade/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(!active) if(clown_check(user)) to_chat(user, span_warning("You prime \the [name]! [det_time/10] seconds!")) diff --git a/code/game/objects/items/weapons/hydroponics.dm b/code/game/objects/items/weapons/hydroponics.dm index b2463cb19e..2bd8fa0fc2 100644 --- a/code/game/objects/items/weapons/hydroponics.dm +++ b/code/game/objects/items/weapons/hydroponics.dm @@ -15,6 +15,9 @@ var/list/item_quants = list() /obj/item/seedbag/attack_self(mob/user) + . = ..(user) //Not that this file is ticked, but who knows. + if(.) + return TRUE user.machine = src interact(user) diff --git a/code/game/objects/items/weapons/id cards/cards.dm b/code/game/objects/items/weapons/id cards/cards.dm index c40c9d56cb..8544313afb 100644 --- a/code/game/objects/items/weapons/id cards/cards.dm +++ b/code/game/objects/items/weapons/id cards/cards.dm @@ -202,7 +202,9 @@ icon = I /obj/item/card_fluff/attack_self(mob/user) - + . = ..(user) + if(.) + return TRUE var/choice = tgui_input_list(user, "What element would you like to customize?", "Customize Card", list("Band","Stamp","Reset")) if(!choice) return diff --git a/code/game/objects/items/weapons/id cards/id_stacks.dm b/code/game/objects/items/weapons/id cards/id_stacks.dm index b37342aae5..12cb2008a7 100644 --- a/code/game/objects/items/weapons/id cards/id_stacks.dm +++ b/code/game/objects/items/weapons/id cards/id_stacks.dm @@ -370,6 +370,7 @@ name = "Syndicate ID" initial_sprite_stack = list("base-stamp-dark", "top-syndicate", "stamp-s") rank = JOB_SYNDICATE + special_handling = TRUE /obj/item/card/id/syndicate/officer name = "Syndicate Officer ID" diff --git a/code/game/objects/items/weapons/id cards/station_ids.dm b/code/game/objects/items/weapons/id cards/station_ids.dm index d871d73164..b8d14d95ec 100644 --- a/code/game/objects/items/weapons/id cards/station_ids.dm +++ b/code/game/objects/items/weapons/id cards/station_ids.dm @@ -104,12 +104,18 @@ return data -/obj/item/card/id/attack_self(mob/user as mob) +/obj/item/card/id/attack_self(mob/user, show_id = FALSE) + . = ..(user) + if(.) + return TRUE + if(special_handling && !show_id) + return FALSE + if(can_configure && !configured) + return FALSE user.visible_message("\The [user] shows you: [icon2html(src,viewers(src))] [src.name]. The assignment on the card: [src.assignment]",\ "You flash your ID card: [icon2html(src, user.client)] [src.name]. The assignment on the card: [src.assignment]") src.add_fingerprint(user) - return /obj/item/card/id/GetAccess() return access @@ -338,15 +344,75 @@ //Event IDs /obj/item/card/id/event - var/configured = 0 + can_configure = TRUE var/accessset = 0 initial_sprite_stack = list() var/list/title_strings = list() var/preset_rank = FALSE + ///What type of polymorphic card we have. 0 = none. 1 = take our job state 2 = allow us to select an icon. + var/polymorphic_type = 0 + var/base_icon_state -/obj/item/card/id/event/attack_self(var/mob/user) - if(configured == 1) - return ..() +/obj/item/card/id/event/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(configured) + return FALSE + if(polymorphic_type == 1) + icon_state = user.job + base_icon_state = user.job + else if(polymorphic_type == 2) + var/list/jobs_to_icon = list( //ITG only has a few kinds of icons so we have to group them up! + JOB_PILOT = "itg", + JOB_ALT_VISITOR = "itg", + JOB_QUARTERMASTER = "itg", + JOB_CARGO_TECHNICIAN = "itg", + JOB_SHAFT_MINER = "itg", + JOB_INTERN = "itg", + JOB_TALON_PILOT = "itg", + JOB_TALON_MINER = "itg", + JOB_BARTENDER = "itg_green", + JOB_BOTANIST = "itg_green", + JOB_CHEF = "itg_green", + JOB_JANITOR = "itg_green", + JOB_CHAPLAIN = "itg_green", + JOB_ENTERTAINER = "itg_green", + JOB_LIBRARIAN = "itg_green", + JOB_WARDEN = "itg_red", + JOB_DETECTIVE = "itg_red", + JOB_SECURITY_OFFICER = "itg_red", + JOB_TALON_GUARD = "itg_red", + JOB_ROBOTICIST = "itg_purple", + JOB_SCIENTIST = "itg_purple", + JOB_XENOBIOLOGIST = "itg_purple", + JOB_XENOBOTANIST = "itg_purple", + JOB_PATHFINDER = "itg_purple", + JOB_EXPLORER = "itg_purple", + JOB_CHEMIST = "itg_white", + JOB_MEDICAL_DOCTOR = "itg_white", + JOB_PARAMEDIC = "itg_white", + JOB_PSYCHIATRIST = "itg_white", + JOB_FIELD_MEDIC = "itg_white", + JOB_TALON_DOCTOR = "itg_white", + JOB_ATMOSPHERIC_TECHNICIAN = "itg_orange", + JOB_ENGINEER = "itg_orange", + JOB_OFFDUTY_OFFICER = "itg_red", + JOB_OFFDUTY_ENGINEER = "itg_orange", + JOB_OFFDUTY_MEDIC = "itg_white", + JOB_OFFDUTY_SCIENTIST = "itg_purple", + JOB_OFFDUTY_CARGO = "itg", + JOB_OFFDUTY_EXPLORER = "itg_purple", + JOB_OFFDUTY_WORKER = "itg_green" + ) + var/guess = jobs_to_icon[user.job] + + if(!guess) + to_chat(user, span_notice("ITG Cards do not seem to be able to accept the access codes for your ID.")) + return + else + icon_state = guess + base_icon_state = guess if(!preset_rank) var/title @@ -361,10 +427,12 @@ if(title_strings.len) var/tempname = pick(title_strings) name = tempname + " ([assignment] Contractor)"//Chompedit: Suffix contractor IDs + else if(polymorphic_type == 2) + name = user.name + "'s ITG ID card" + " ([assignment])" else name = user.name + "'s ID card" + " ([assignment] Contractor)"//Chompedit: Suffix contractor IDs - configured = 1 + configured = TRUE to_chat(user, span_notice("Card settings set.")) /obj/item/card/id/event/attackby(obj/item/I, var/mob/user) @@ -511,7 +579,7 @@ icon_state = "pinkGold" /obj/item/card/id/event/polymorphic - var/base_icon_state + polymorphic_type = 1 /obj/item/card/id/event/polymorphic/digest_act(atom/movable/item_storage = null) var/gimmeicon = icon @@ -519,76 +587,13 @@ icon = gimmeicon icon_state = base_icon_state + "_digested" -/obj/item/card/id/event/polymorphic/altcard/attack_self(var/mob/user) - if(configured == 1) - return ..() - else - icon_state = user.job - base_icon_state = user.job - return ..() - /obj/item/card/id/event/polymorphic/altcard icon = 'icons/obj/card_alt.dmi' base_icon = 'icons/obj/card_alt.dmi' icon_state = "blank" name = "contractor identification card" desc = "An ID card typically used by contractors." - -/obj/item/card/id/event/polymorphic/itg/attack_self(var/mob/user) - if(!configured) - var/list/jobs_to_icon = list( //ITG only has a few kinds of icons so we have to group them up! - JOB_PILOT = "itg", - JOB_ALT_VISITOR = "itg", - JOB_QUARTERMASTER = "itg", - JOB_CARGO_TECHNICIAN = "itg", - JOB_SHAFT_MINER = "itg", - JOB_INTERN = "itg", - JOB_TALON_PILOT = "itg", - JOB_TALON_MINER = "itg", - JOB_BARTENDER = "itg_green", - JOB_BOTANIST = "itg_green", - JOB_CHEF = "itg_green", - JOB_JANITOR = "itg_green", - JOB_CHAPLAIN = "itg_green", - JOB_ENTERTAINER = "itg_green", - JOB_LIBRARIAN = "itg_green", - JOB_WARDEN = "itg_red", - JOB_DETECTIVE = "itg_red", - JOB_SECURITY_OFFICER = "itg_red", - JOB_TALON_GUARD = "itg_red", - JOB_ROBOTICIST = "itg_purple", - JOB_SCIENTIST = "itg_purple", - JOB_XENOBIOLOGIST = "itg_purple", - JOB_XENOBOTANIST = "itg_purple", - JOB_PATHFINDER = "itg_purple", - JOB_EXPLORER = "itg_purple", - JOB_CHEMIST = "itg_white", - JOB_MEDICAL_DOCTOR = "itg_white", - JOB_PARAMEDIC = "itg_white", - JOB_PSYCHIATRIST = "itg_white", - JOB_FIELD_MEDIC = "itg_white", - JOB_TALON_DOCTOR = "itg_white", - JOB_ATMOSPHERIC_TECHNICIAN = "itg_orange", - JOB_ENGINEER = "itg_orange", - JOB_OFFDUTY_OFFICER = "itg_red", - JOB_OFFDUTY_ENGINEER = "itg_orange", - JOB_OFFDUTY_MEDIC = "itg_white", - JOB_OFFDUTY_SCIENTIST = "itg_purple", - JOB_OFFDUTY_CARGO = "itg", - JOB_OFFDUTY_EXPLORER = "itg_purple", - JOB_OFFDUTY_WORKER = "itg_green" - ) - var/guess = jobs_to_icon[user.job] - - if(!guess) - to_chat(user, span_notice("ITG Cards do not seem to be able to accept the access codes for your ID.")) - return - else - icon_state = guess - base_icon_state = guess - . = ..() - name = user.name + "'s ITG ID card" + " ([assignment])" - + polymorphic_type = 1 /obj/item/card/id/event/polymorphic/itg/attackby(obj/item/I as obj, var/mob/user) if(istype(I, /obj/item/card/id) && !accessset) @@ -607,3 +612,4 @@ icon_state = "itg" name = "\improper ITG identification card" desc = "A small card designating affiliation with the Ironcrest Transport Group. It has a NanoTrasen insignia and a lot of very small print on the back to do with practices and regulations for contractors to use." + polymorphic_type = 2 diff --git a/code/game/objects/items/weapons/id cards/syndicate_ids.dm b/code/game/objects/items/weapons/id cards/syndicate_ids.dm index 2a86420566..82aa7bd849 100644 --- a/code/game/objects/items/weapons/id cards/syndicate_ids.dm +++ b/code/game/objects/items/weapons/id cards/syndicate_ids.dm @@ -33,7 +33,10 @@ if(player_is_antag(user.mind) || registered_user == user) to_chat(user, span_notice("The microscanner activates as you pass it over the ID, copying its access.")) -/obj/item/card/id/syndicate/attack_self(mob/user as mob) +/obj/item/card/id/syndicate/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE // We use the fact that registered_name is not unset should the owner be vaporized, to ensure the id doesn't magically become unlocked. if(!registered_user && register_user(user)) to_chat(user, span_notice("The microscanner marks you as its owner, preventing others from accessing its internals.")) @@ -44,9 +47,7 @@ if("Edit") agentcard_module.tgui_interact(user) if("Show") - ..() - else - ..() + ..(user, TRUE) /obj/item/card/id/syndicate/proc/register_user(var/mob/user) diff --git a/code/game/objects/items/weapons/implants/implant_vr.dm b/code/game/objects/items/weapons/implants/implant_vr.dm index adf7d1f88c..fcc0e53976 100644 --- a/code/game/objects/items/weapons/implants/implant_vr.dm +++ b/code/game/objects/items/weapons/implants/implant_vr.dm @@ -152,6 +152,7 @@ Due to the small chemical capacity of the implant, the life of the implant is re entities to perform espionage and in some parts of space are used off the books for interrogation. Most of the makers of these modified implants have put in \ safeties to prevent lethal or actively harmful commands from being input to lessen the severity of the crime if they are caught. This one has a golden stamp \ with the shape of a star on it, the letters 'KE' in black text on it." + special_handling = TRUE /obj/item/implanter/compliance/Initialize(mapload) . = ..() @@ -159,6 +160,9 @@ Due to the small chemical capacity of the implant, the life of the implant is re update() /obj/item/implanter/compliance/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(istype(imp,/obj/item/implant/compliance)) var/obj/item/implant/compliance/implant = imp var/newlaws = tgui_input_text(user, "Please Input Laws", "Compliance Laws", "", multiline = TRUE, prevent_enter = TRUE) diff --git a/code/game/objects/items/weapons/implants/implantcircuits.dm b/code/game/objects/items/weapons/implants/implantcircuits.dm index 4cdf8b497d..4c0d1be144 100644 --- a/code/game/objects/items/weapons/implants/implantcircuits.dm +++ b/code/game/objects/items/weapons/implants/implantcircuits.dm @@ -46,4 +46,7 @@ ..() /obj/item/implant/integrated_circuit/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE IC.attack_self(user) diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 509b0dfb39..065e3d40a7 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -9,8 +9,15 @@ matter = list(MAT_STEEL = 1000, MAT_GLASS = 1000) var/obj/item/implant/imp = null var/active = 1 + ///Var for attack_self chain + var/special_handling = FALSE -/obj/item/implanter/attack_self(var/mob/user) +/obj/item/implanter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE active = !active to_chat(user, span_notice("You [active ? "" : "de"]activate \the [src].")) update() diff --git a/code/game/objects/items/weapons/implants/implantpad.dm b/code/game/objects/items/weapons/implants/implantpad.dm index d07bfe2db6..85be596144 100644 --- a/code/game/objects/items/weapons/implants/implantpad.dm +++ b/code/game/objects/items/weapons/implants/implantpad.dm @@ -47,7 +47,10 @@ return -/obj/item/implantpad/attack_self(mob/user as mob) +/obj/item/implantpad/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.set_machine(src) var/dat = span_bold("Implant Mini-Computer:") + "
" if (src.case) diff --git a/code/game/objects/items/weapons/inducer_vr.dm b/code/game/objects/items/weapons/inducer_vr.dm index 73f58a6706..3bcfa5c4db 100644 --- a/code/game/objects/items/weapons/inducer_vr.dm +++ b/code/game/objects/items/weapons/inducer_vr.dm @@ -184,6 +184,9 @@ recharging = FALSE /obj/item/inducer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(opened && cell) user.visible_message(span_notice("[user] removes [cell] from [src]!"), span_notice("You remove [cell].")) cell.update_icon() diff --git a/code/game/objects/items/weapons/material/chainsaw.dm b/code/game/objects/items/weapons/material/chainsaw.dm index e3373d863c..3d2f0b9cd4 100644 --- a/code/game/objects/items/weapons/material/chainsaw.dm +++ b/code/game/objects/items/weapons/material/chainsaw.dm @@ -58,7 +58,10 @@ on = 0 update_icon() -/obj/item/chainsaw/attack_self(mob/user as mob) +/obj/item/chainsaw/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!on) turnOn(user) else diff --git a/code/game/objects/items/weapons/material/gravemarker.dm b/code/game/objects/items/weapons/material/gravemarker.dm index e12a53204e..57a8144931 100644 --- a/code/game/objects/items/weapons/material/gravemarker.dm +++ b/code/game/objects/items/weapons/material/gravemarker.dm @@ -56,6 +56,9 @@ ..() /obj/item/material/gravemarker/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE src.add_fingerprint(user) if(!isturf(user.loc)) diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index a855a324f0..ba61e72bb7 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -45,6 +45,9 @@ thrown_force_divisor = 0.2 // 4 when thrown with weight 20 (steel) /obj/item/material/butterfly/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE active = !active update_force() diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index 8974b3cd22..cd5a0908c3 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -85,7 +85,10 @@ w_class = ITEMSIZE_SMALL attack_verb = list("mushed", "splatted", "splooshed", "splushed") // Words that totally exist. -/obj/item/material/snow/snowball/attack_self(mob/user as mob) +/obj/item/material/snow/snowball/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.a_intent == I_HURT) to_chat(user, span_notice("You smash the snowball in your hand.")) var/atom/S = new /obj/item/stack/material/snow(user.loc) @@ -212,6 +215,9 @@ return /obj/item/material/whip/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message(span_warning("\The [user] cracks \the [src]!")) playsound(src, 'sound/effects/snap.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/medigun/linked_medigun.dm b/code/game/objects/items/weapons/medigun/linked_medigun.dm index 40c5fc8409..ef4862dd4a 100644 --- a/code/game/objects/items/weapons/medigun/linked_medigun.dm +++ b/code/game/objects/items/weapons/medigun/linked_medigun.dm @@ -29,6 +29,9 @@ return (medigun_base_unit.bcell && medigun_base_unit.bcell.checked_use(charge_amt)) /obj/item/bork_medigun/linked/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(medigun_base_unit.is_twohanded()) update_twohanding() if(busy) diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 2a6240f242..2d274871c9 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -23,6 +23,8 @@ slot_l_hand_str = 'icons/mob/items/lefthand_melee.dmi', slot_r_hand_str = 'icons/mob/items/righthand_melee.dmi', ) + ///Var for attack_self handling + var/special_handling = FALSE /obj/item/melee/energy/sword/green colorable = FALSE @@ -96,7 +98,12 @@ else . += span_warning("The blade does not have a power source installed.") -/obj/item/melee/energy/attack_self(mob/living/user as mob) +/obj/item/melee/energy/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(use_cell) if((!bcell || bcell.charge < hitcost) && !active) to_chat(user, span_notice("\The [src] does not seem to have power.")) @@ -438,6 +445,7 @@ var/datum/effect/effect/system/spark_spread/spark_system projectile_parry_chance = 60 lcolor = "#00FF00" + special_handling = TRUE /obj/item/melee/energy/blade/Initialize(mapload) . = ..() @@ -452,7 +460,10 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/melee/energy/blade/attack_self(mob/user as mob) +/obj/item/melee/energy/blade/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.drop_from_inventory(src) QDEL_IN(src, 1) diff --git a/code/game/objects/items/weapons/melee/misc.dm b/code/game/objects/items/weapons/melee/misc.dm index 950b6a61ca..0ecbcfe0ef 100644 --- a/code/game/objects/items/weapons/melee/misc.dm +++ b/code/game/objects/items/weapons/melee/misc.dm @@ -41,8 +41,11 @@ . = ..() update_icon() -/obj/item/melee/umbrella/attack_self() - src.toggle_umbrella() +/obj/item/melee/umbrella/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + toggle_umbrella() /obj/item/melee/umbrella/proc/toggle_umbrella() open = !open diff --git a/code/game/objects/items/weapons/melee/shock_maul.dm b/code/game/objects/items/weapons/melee/shock_maul.dm index 1b910e87c5..3c9bcb27d9 100644 --- a/code/game/objects/items/weapons/melee/shock_maul.dm +++ b/code/game/objects/items/weapons/melee/shock_maul.dm @@ -195,6 +195,9 @@ return ..() /obj/item/melee/shock_maul/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!user.IsAdvancedToolUser()) return if(!status && bcell && bcell.charge >= hitcost) diff --git a/code/game/objects/items/weapons/mop_deploy.dm b/code/game/objects/items/weapons/mop_deploy.dm index 2b8c602f00..48b33a21af 100644 --- a/code/game/objects/items/weapons/mop_deploy.dm +++ b/code/game/objects/items/weapons/mop_deploy.dm @@ -54,7 +54,10 @@ STOP_PROCESSING(SSobj, src) . = ..() -/obj/item/mop_deploy/attack_self(mob/user as mob) +/obj/item/mop_deploy/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.drop_from_inventory(src) spawn(1) if(!QDELETED(src)) qdel(src) diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index a2d318fcf0..507bb38dee 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -138,7 +138,10 @@ var/list/tape_roll_applications = list() update_icon() return ..() -/obj/item/taperoll/attack_self(mob/user as mob) +/obj/item/taperoll/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!start) start = get_turf(src) to_chat(user, span_notice("You place the first end of \the [src].")) diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 7d5c5f07cb..d89aa621e5 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -14,7 +14,10 @@ throw_range = 20 origin_tech = list(TECH_BLUESPACE = 4) -/obj/item/teleportation_scroll/attack_self(mob/user as mob) +/obj/item/teleportation_scroll/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if((user.mind && !wizards.is_antagonist(user.mind))) to_chat(user, span_warning("You stare at the scroll but cannot make sense of the markings!")) return diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm index cfb7323dd2..9d98bd8560 100644 --- a/code/game/objects/items/weapons/shields.dm +++ b/code/game/objects/items/weapons/shields.dm @@ -153,7 +153,10 @@ return (base_block_chance - round(damage / 3)) //block bullets and beams using the old block chance return base_block_chance -/obj/item/shield/energy/attack_self(mob/living/user as mob) +/obj/item/shield/energy/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if ((CLUMSY in user.mutations) && prob(50)) to_chat(user, span_warning("You beat yourself in the head with [src].")) user.take_organ_damage(5) @@ -238,6 +241,9 @@ return 0 */ /obj/item/shield/riot/tele/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE active = !active icon_state = "teleriot[active]" playsound(src, 'sound/weapons/empty.ogg', 50, 1) diff --git a/code/game/objects/items/weapons/shields_vr.dm b/code/game/objects/items/weapons/shields_vr.dm index 8c3417c888..962259f516 100644 --- a/code/game/objects/items/weapons/shields_vr.dm +++ b/code/game/objects/items/weapons/shields_vr.dm @@ -41,6 +41,9 @@ //POURPEL WHY U NO COVER /obj/item/shield/riot/explorer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(brightness_on) if(!isturf(user.loc)) to_chat(user, "You cannot turn the light on while in this [user.loc]") @@ -53,8 +56,6 @@ var/mob/living/carbon/human/H = user H.update_inv_l_hand() H.update_inv_r_hand() - else - return ..(user) /obj/item/shield/riot/explorer/proc/update_flashlight(var/mob/user = null) if(on && !light_applied) diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index ea777e9a5e..51c6d9f2bd 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -35,8 +35,12 @@ GLOBAL_LIST_INIT(bibleitemstates, list( var/deity_name = "Christ" use_sound = 'sound/bureaucracy/bookopen.ogg' drop_sound = 'sound/bureaucracy/bookclose.ogg' + special_handling = TRUE /obj/item/storage/bible/attack_self(mob/living/carbon/human/user) + . = ..(user) + if(.) + return TRUE if(user?.mind?.assigned_role != JOB_CHAPLAIN) return FALSE diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 88a68bedc0..307512d9dc 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -36,8 +36,10 @@ pickup_sound = 'sound/items/pickup/cardboardbox.ogg' // BubbleWrap - A box can be folded up to make card -/obj/item/storage/box/attack_self(mob/user as mob) - if(..()) return +/obj/item/storage/box/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE //try to fold it if(ispath(foldable)) diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm index 916964c1e9..340fb24684 100644 --- a/code/game/objects/items/weapons/storage/laundry_basket.dm +++ b/code/game/objects/items/weapons/storage/laundry_basket.dm @@ -36,11 +36,6 @@ return return ..() -/obj/item/storage/laundry_basket/attack_self(mob/user as mob) - var/turf/T = get_turf(user) - to_chat(user, span_notice("You dump the [src]'s contents onto \the [T].")) - return ..() - /obj/item/storage/laundry_basket/pickup(mob/user) var/obj/item/storage/laundry_basket/offhand/O = new(user) O.name = "[name] - second hand" diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm index d581644246..3633fe49ea 100644 --- a/code/game/objects/items/weapons/storage/mre.dm +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -21,6 +21,7 @@ MRE Stuff /obj/random/mre/sauce, /obj/item/material/kitchen/utensil/spoon/plastic ) + special_handling = TRUE /obj/item/storage/mre/examine(mob/user) . = ..() @@ -32,6 +33,9 @@ MRE Stuff . = ..() /obj/item/storage/mre/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE open(user) /obj/item/storage/mre/open(mob/user) @@ -222,6 +226,7 @@ MRE Stuff max_w_class = ITEMSIZE_SMALL var/opened = FALSE starts_with = list(/obj/item/reagent_containers/food/snacks/slice/meatpizza/filled) + special_handling = TRUE /obj/item/storage/mrebag/Initialize(mapload) . = ..() @@ -232,6 +237,9 @@ MRE Stuff . = ..() /obj/item/storage/mrebag/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE open(user) /obj/item/storage/mrebag/open(mob/user) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 814c8e0c82..d2fa5bebc3 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -27,6 +27,7 @@ max_w_class = ITEMSIZE_SMALL max_storage_space = ITEMSIZE_SMALL * 7 use_sound = 'sound/items/storage/briefcase.ogg' + special_handling = TRUE /obj/item/storage/secure/examine(mob/user) . = ..() @@ -92,7 +93,10 @@ src.add_fingerprint(user) return -/obj/item/storage/secure/attack_self(mob/user as mob) +/obj/item/storage/secure/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/storage/secure/tgui_interact(mob/user, datum/tgui/ui = null) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 0f8c75b64a..b244d9b26d 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -52,6 +52,8 @@ var/empty //Mapper override to spawn an empty version of a container that usually has stuff /// If you can use this storage while in a pocket var/pocketable = FALSE + /// Used for attack_self chain + var/special_handling = FALSE /obj/item/storage/Initialize(mapload) . = ..() @@ -703,11 +705,16 @@ total_storage_space += I.get_storage_cost() max_storage_space = max(total_storage_space,max_storage_space) //Prevents spawned containers from being too small for their contents. -/obj/item/storage/attack_self(mob/user as mob) +/obj/item/storage/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if((user.get_active_hand() == src) || (isrobot(user)) && allow_quick_empty) if(src.verbs.Find(/obj/item/storage/verb/quick_empty)) src.quick_empty() - return 1 + return TRUE //Returns the storage depth of an atom. This is the number of storage items the atom is contained in before reaching toplevel (the area). //Returns -1 if the atom was not found on container. @@ -793,6 +800,7 @@ ) var/open_state var/closed_state + special_handling = TRUE /obj/item/storage/trinketbox/update_icon() cut_overlays() @@ -819,10 +827,12 @@ closed_state = "[initial(icon_state)]" . = ..() -/obj/item/storage/trinketbox/attack_self() +/obj/item/storage/trinketbox/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE open = !open update_icon() - ..() /obj/item/storage/trinketbox/examine(mob/user) . = ..() diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index f415e20912..e292cd6b29 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -24,6 +24,9 @@ var/grip_safety = TRUE var/taped_safety = FALSE + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/melee/baton/Initialize(mapload) . = ..() update_icon() @@ -153,6 +156,11 @@ return ..() /obj/item/melee/baton/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(bcell && bcell.charge >= hitcost) status = !status to_chat(user, span_notice("[src] is now [status ? "on" : "off"].")) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 3457c08209..78324b394c 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -55,7 +55,10 @@ pickup_sound = 'sound/items/pickup/crowbar.ogg' var/on = 0 -/obj/item/melee/telebaton/attack_self(mob/user as mob) +/obj/item/melee/telebaton/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE on = !on if(on) user.visible_message(span_warning("With a flick of their wrist, [user] extends their telescopic baton."),\ diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index 0221ac5e18..69a31b59e9 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -78,16 +78,18 @@ /*Click it when closed to open, when open to bring up a prompt asking you if you want to close it or press the button.*/ /obj/item/flame/lighter/zippo/c4detonator - var/detonator_mode = 0 var/obj/item/syndie/c4explosive/bomb -/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user as mob) +/obj/item/flame/lighter/zippo/c4detonator/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!detonator_mode) - ..() + return FALSE - else if(!lit) + if(!lit) base_state = icon_state - lit = 1 + lit = TRUE icon_state = "[base_state]1" //item_state = "[base_state]on" user.visible_message(span_rose("Without even breaking stride, \the [user] flips open \the [src] in one smooth movement.")) @@ -97,13 +99,15 @@ if("Press the button.") to_chat(user, span_warning("You press the button.")) icon_state = "[base_state]click" - if(src.bomb) - src.bomb.detonate() - log_admin("[key_name(user)] has triggered [src.bomb] with [src].") - message_admins(span_danger("[key_name_admin(user)] has triggered [src.bomb] with [src].")) + if(bomb) + var/obj/item/syndie/c4explosive/bomb_to_explode = bomb + bomb = null //clear up our ref + bomb_to_explode.detonate() + log_admin("[key_name(user)] has triggered [bomb_to_explode] with [src].") + message_admins(span_danger("[key_name_admin(user)] has triggered [bomb_to_explode] with [src].")) if("Close the lighter.") - lit = 0 + lit = FALSE icon_state = "[base_state]" //item_state = "[base_state]" user.visible_message(span_rose("You hear a quiet click, as \the [user] shuts off \the [src] without even looking at what they're doing.")) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 99fc3c4408..7f8bf9db69 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -209,7 +209,10 @@ var/list/global/tank_gauge_cache = list() -/obj/item/tank/attack_self(mob/user as mob) +/obj/item/tank/attack_self(mob/user) + . = ..(user) + if(.) + return add_fingerprint(user) if (!(src.air_contents)) return diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 3010dac351..ed7b177424 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -135,6 +135,9 @@ overlays = W.overlays /obj/item/ducttape/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!stuck) return diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index 4543565523..4e817f381c 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -25,7 +25,10 @@ pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' -/obj/item/locator/attack_self(mob/user as mob) +/obj/item/locator/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.set_machine(src) var/dat if (src.temp) @@ -132,7 +135,10 @@ Frequency: matter = list(MAT_STEEL = 10000) preserve_item = 1 -/obj/item/hand_tele/attack_self(mob/user as mob) +/obj/item/hand_tele/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/turf/current_location = get_turf(user)//What turf is the user on? if(!current_location || (current_location.z in using_map.admin_levels) || current_location.block_tele)//If turf was not found or they're on z level 2 or >7 which does not currently exist. to_chat(user, span_notice("\The [src] is malfunctioning.")) diff --git a/code/game/objects/items/weapons/tools/combitool.dm b/code/game/objects/items/weapons/tools/combitool.dm index 45d4a93d96..8093e9b020 100644 --- a/code/game/objects/items/weapons/tools/combitool.dm +++ b/code/game/objects/items/weapons/tools/combitool.dm @@ -36,14 +36,16 @@ for(var/type in spawn_tools) tools |= new type(src) -/obj/item/combitool/attack_self(mob/user as mob) +/obj/item/combitool/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(++current_tool > tools.len) current_tool = 1 var/obj/item/tool = tools[current_tool] if(!tool) to_chat(user, "You can't seem to find any fittings in \the [src].") else to_chat(user, "You switch \the [src] to the [tool.name] fitting.") - return 1 /obj/item/combitool/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!M.Adjacent(user)) diff --git a/code/game/objects/items/weapons/tools/transforming.dm b/code/game/objects/items/weapons/tools/transforming.dm index 533c7ade99..32b92c0949 100644 --- a/code/game/objects/items/weapons/tools/transforming.dm +++ b/code/game/objects/items/weapons/tools/transforming.dm @@ -21,6 +21,9 @@ return welder /obj/item/tool/transforming/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!possible_tooltypes.len || possible_tooltypes.len < 2) return if(current_tooltype == possible_tooltypes.len) diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index e32f23c1ef..7d4311e8cf 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -170,6 +170,9 @@ if (istype(location, /turf)) location.hotspot_expose(700, 50, 1) /obj/item/weldingtool/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE setWelding(!welding, user) //Returns the amount of fuel in the welder diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index a30f8d7d8d..7212e074f1 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -21,7 +21,10 @@ if(slot_belt) sprite_sheets = list(SPECIES_TESHARI = 'icons/inventory/belt/mob_teshari.dmi') -/obj/item/towel/attack_self(mob/living/user as mob) +/obj/item/towel/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE user.visible_message(span_notice("[user] uses [src] to towel themselves off.")) playsound(src, 'sound/weapons/towelwipe.ogg', 25, 1) if(user.fire_stacks > 0) diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index a63d04b96e..8ca9e93d1e 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -34,8 +34,10 @@ /obj/item/beartrap/proc/can_use(mob/user) return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained()) -/obj/item/beartrap/attack_self(mob/user as mob) - ..() +/obj/item/beartrap/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!deployed && can_use(user)) user.visible_message( span_danger("[user] starts to deploy \the [src]."), @@ -218,8 +220,10 @@ else ..() -/obj/item/material/barbedwire/attack_self(mob/user as mob) - ..() +/obj/item/material/barbedwire/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!anchored && can_use(user)) user.visible_message( span_danger("[user] starts to deploy \the [src]."), diff --git a/code/game/objects/mail.dm b/code/game/objects/mail.dm index c5eb395765..239f3a3567 100644 --- a/code/game/objects/mail.dm +++ b/code/game/objects/mail.dm @@ -8,14 +8,14 @@ drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' mouse_drag_pointer = MOUSE_ACTIVE_POINTER - // Destination tagging for the mail sorter. + /// Destination tagging for the mail sorter. var/sortTag = 0 - // Who this mail is for and who can open it. + /// Who this mail is for and who can open it. var/datum/weakref/recipient_ref - // How many goodies this mail contains. + /// How many goodies this mail contains. var/goodie_count = 1 // Goodies which can be given to anyone. - // Weight sum will be 1000 + /// Weight sum will be 1000 var/list/generic_goodies = list( /obj/item/spacecash/c50 = 75, /obj/item/reagent_containers/food/drinks/cans/cola = 75, @@ -30,25 +30,28 @@ /obj/item/reagent_containers/food/drinks/bluespace_coffee = 5 ) // Overlays (pure fluff) - // Does the letter have the postmark overlay? + /// Does the letter have the postmark overlay? var/postmarked = TRUE - // Does the letter have a stamp overlay? + /// Does the letter have a stamp overlay? var/stamped = TRUE - // List of all stamp overlays on the letter. + /// List of all stamp overlays on the letter. var/list/stamps = list() - // Maximum number of stamps on the letter. + /// Maximum number of stamps on the letter. var/stamp_max = 1 - // Physical offset of stamps on the object. X direction. + /// Physical offset of stamps on the object. X direction. var/stamp_offset_x = 0 - // Physical offset of stamps on the object. Y direction. + /// Physical offset of stamps on the object. Y direction. var/stamp_offset_y = 2 - // If the mail is actively being opened right now + /// If the mail is actively being opened right now var/opening = FALSE - // If the mail has been scanned with a mail scanner + /// If the mail has been scanned with a mail scanner var/scanned - // Does it have a colored envelope? + /// Does it have a colored envelope? var/colored_envelope + ///Var for attack_self chainn + var/special_handling = FALSE + /obj/item/mail/container_resist(mob/living/M) if(istype(M, /mob/living/voice)) return if(isdisposalpacket(loc)) @@ -84,6 +87,7 @@ var/set_content = FALSE var/sealed = FALSE var/list/mail_recipients + special_handling = TRUE /obj/item/mail/blank/attackby(obj/item/W, mob/user) ..() @@ -137,13 +141,18 @@ desc = "A signed envelope, from [sender]." /obj/item/mail/blank/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!sealed) if(!do_after(user, 1.5 SECONDS, target = user)) sealed = FALSE sealed = TRUE description_info = "Shift Click to add the sender's name to the envelope, or attack with a pen to set a receiver." return - . = ..() + if(!unwrap(user)) + return FALSE + return after_unwrap(user) /obj/item/mail/update_icon() . = ..() @@ -191,8 +200,13 @@ return /obj/item/mail/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!unwrap(user)) return FALSE + if(special_handling) + return FALSE return after_unwrap(user) /obj/item/mail/proc/unwrap(mob/user) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 41ce5a4b47..5d631c292c 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -84,7 +84,9 @@ grid[x][y] = canvas_color /obj/item/canvas/attack_self(mob/user) - . = ..() + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/canvas/dropped(mob/user) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 174a4a6847..bbb2862f4c 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -18,6 +18,8 @@ LINEN BINS w_class = ITEMSIZE_SMALL drop_sound = 'sound/items/drop/clothing.ogg' pickup_sound = 'sound/items/pickup/clothing.ogg' + ///var used for attack_self chain + var/special_handling = FALSE /// Custom nouns to act as the subject of dreams //CHOMPEdit - Dreaming var/list/dream_messages = list("white") //CHOMPEdit - Dreaming @@ -26,7 +28,12 @@ LINEN BINS . = ..() AddElement(/datum/element/rotatable/onlyflip) -/obj/item/bedsheet/attack_self(mob/user as mob) +/obj/item/bedsheet/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE user.drop_item() if(layer == initial(layer)) layer = ABOVE_MOB_LAYER diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 4f00eea6e1..cc634dfcd6 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -6,8 +6,15 @@ drop_sound = 'sound/items/drop/rubber.ogg' w_class = ITEMSIZE_NORMAL var/deploy_path = /obj/structure/inflatable + ///Var used for attack_self chain + var/special_handling = FALSE /obj/item/inflatable/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE inflate(user,user.loc) /obj/item/inflatable/afterattack(var/atom/A, var/mob/user) @@ -246,8 +253,12 @@ desc = "A folded membrane which rapidly expands into a large cubical shape on activation. It is too torn to be usable." icon = 'icons/obj/inflatable.dmi' icon_state = "folded_wall_torn" + special_handling = TRUE /obj/item/inflatable/torn/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("The inflatable wall is too torn to be inflated!")) add_fingerprint(user) @@ -256,8 +267,12 @@ desc = "A folded membrane which rapidly expands into a simple door on activation. It is too torn to be usable." icon = 'icons/obj/inflatable.dmi' icon_state = "folded_door_torn" + special_handling = TRUE /obj/item/inflatable/door/torn/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("The inflatable door is too torn to be inflated!")) add_fingerprint(user) diff --git a/code/game/objects/structures/pillows.dm b/code/game/objects/structures/pillows.dm index 77cb0e7ecd..3f70987e95 100644 --- a/code/game/objects/structures/pillows.dm +++ b/code/game/objects/structures/pillows.dm @@ -8,8 +8,12 @@ slot_flags = 0 var/pile_type = "/obj/structure/bed/pillowpile" throw_range = 7 + special_handling = TRUE -/obj/item/bedsheet/pillow/attack_self(mob/user as mob) +/obj/item/bedsheet/pillow/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.drop_item() if(icon_state == initial(icon_state)) icon_state = "[icon_state]_placed" diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 065d934805..10949f927f 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -268,6 +268,9 @@ pickup_sound = 'sound/items/pickup/axe.ogg' /obj/item/roller/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/obj/structure/bed/roller/R = new bedtype(user.loc) R.add_fingerprint(user) qdel(src) @@ -303,8 +306,10 @@ . = ..() held = new /obj/item/roller(src) -/obj/item/roller_holder/attack_self(mob/user as mob) - +/obj/item/roller_holder/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!held) to_chat(user, span_notice("The rack is empty.")) return diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair_item.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair_item.dm index d18a9a88f1..ffc3e40eb3 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair_item.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair_item.dm @@ -8,6 +8,9 @@ var/unfolded_type = /obj/structure/bed/chair/wheelchair /obj/item/wheelchair/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/obj/structure/bed/chair/wheelchair/R = new unfolded_type(user.loc) R.add_fingerprint(user) R.name = src.name diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 1f02a0646d..f3701e18ec 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -312,18 +312,7 @@ slot_l_hand_str = 'icons/mob/items/lefthand.dmi', slot_r_hand_str = 'icons/mob/items/righthand.dmi', ) - honk_sound = 'sound/voice/quack.ogg' //VOREStation edit - var/honk_text = 0 - -/obj/item/bikehorn/rubberducky/attack_self(mob/user) - if(spam_flag == 0) - spam_flag = 1 - playsound(src, honk_sound, 50, 1) - if(honk_text) - audible_message(span_maroon("[honk_text]")) - src.add_fingerprint(user) - addtimer(VARSET_CALLBACK(src, spam_flag, 0), 20, TIMER_DELETE_ME) - return + honk_sound = 'sound/voice/quack.ogg' //Admin spawn duckies @@ -335,21 +324,24 @@ item_state = "rubberducky_red" honk_sound = 'sound/effects/adminhelp.ogg' var/honk_count = 0 + special_handling = TRUE /obj/item/bikehorn/rubberducky/red/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(honk_count >= 3) var/turf/epicenter = get_turf(src) explosion(epicenter, 0, 0, 1, 3) qdel(src) return - else if(spam_flag == 0) - spam_flag = 1 + else if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) playsound(src, honk_sound, 50, 1) - src.add_fingerprint(user) + add_fingerprint(user) if(honk_text) audible_message(span_maroon("[honk_text]")) - honk_count ++ - addtimer(VARSET_CALLBACK(src, spam_flag, 0), 20, TIMER_DELETE_ME) + honk_count++ return /obj/item/bikehorn/rubberducky/blue @@ -359,18 +351,20 @@ icon_state = "rubberducky_blue" item_state = "rubberducky_blue" honk_sound = 'sound/effects/bubbles.ogg' - var/honk_count = 0 + special_handling = TRUE /obj/item/bikehorn/rubberducky/blue/attack_self(mob/user) - if(spam_flag == 0) - var/turf/simulated/whereweare = get_turf(src) - whereweare.wet_floor(2) - spam_flag = 1 + . = ..(user) + if(.) + return TRUE + if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) playsound(src, honk_sound, 50, 1) + add_fingerprint(user) if(honk_text) audible_message(span_maroon("[honk_text]")) - src.add_fingerprint(user) - addtimer(VARSET_CALLBACK(src, spam_flag, 0), 20, TIMER_DELETE_ME) + var/turf/simulated/whereweare = get_turf(src) + whereweare.wet_floor(2) return /obj/item/bikehorn/rubberducky/pink @@ -380,23 +374,24 @@ icon_state = "rubberducky_pink" item_state = "rubberducky_pink" honk_sound = 'sound/vore/sunesound/pred/insertion_01.ogg' - var/honk_count = 0 + special_handling = TRUE /obj/item/bikehorn/rubberducky/pink/attack_self(mob/user) - if(spam_flag == 0) + . = ..(user) + if(.) + return TRUE + if(cooldown <= world.time) if(!user.devourable) to_chat(user, span_vnotice("You can't bring yourself to squeeze it...")) return - spam_flag = 1 + cooldown = (world.time + 2 SECONDS) playsound(src, honk_sound, 50, 1) + add_fingerprint(user) if(honk_text) audible_message(span_maroon("[honk_text]")) - src.add_fingerprint(user) user.drop_item() user.forceMove(src) to_chat(user, span_vnotice("You have been swallowed alive by the rubber ducky. Your entire body compacted up and squeezed into the tiny space that makes up the oddly realistic and not at all rubbery stomach. The walls themselves are kneading over you, grinding some sort of fluids into your trapped body. You can even hear the sound of bodily functions echoing around you...")) - addtimer(VARSET_CALLBACK(src, spam_flag, 0), 20, TIMER_DELETE_ME) - return /obj/item/bikehorn/rubberducky/pink/container_resist(var/mob/living/escapee) if(isdisposalpacket(loc)) @@ -412,23 +407,26 @@ icon_state = "rubberducky_grey" item_state = "rubberducky_grey" honk_sound = 'sound/effects/ghost.ogg' - var/honk_count = 0 + special_handling = TRUE /obj/item/bikehorn/rubberducky/grey/attack_self(mob/user) - if(spam_flag == 0) + . = ..(user) + if(.) + return TRUE + if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) + playsound(src, honk_sound, 50, 1) + add_fingerprint(user) + if(honk_text) + audible_message(span_maroon("[honk_text]")) for(var/obj/machinery/light/L in GLOB.machines) if(L.z != user.z || get_dist(user,L) > 10) continue else L.flicker(10) - spam_flag = 1 - playsound(src, honk_sound, 50, 1) - if(honk_text) - audible_message(span_maroon("[honk_text]")) - src.add_fingerprint(user) user.drop_item() var/turf/T = locate(rand(1, 140), rand(1, 140), user.z) - src.forceMove(T) + forceMove(T) return /obj/item/bikehorn/rubberducky/green @@ -438,7 +436,6 @@ icon_state = "rubberducky_green" item_state = "rubberducky_green" honk_sound = 'sound/arcade/mana.ogg' - var/honk_count = 0 var/list/flora = list(/obj/structure/flora/ausbushes, /obj/structure/flora/ausbushes/reedbush, /obj/structure/flora/ausbushes/leafybush, @@ -455,18 +452,21 @@ /obj/structure/flora/ausbushes/ppflowers, /obj/structure/flora/ausbushes/sparsegrass, /obj/structure/flora/ausbushes/fullgrass) + special_handling = TRUE /obj/item/bikehorn/rubberducky/green/attack_self(mob/user) - if(spam_flag == 0) + . = ..(user) + if(.) + return TRUE + if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) + playsound(src, honk_sound, 50, 1) + add_fingerprint(user) + if(honk_text) + audible_message(span_maroon("[honk_text]")) var/turf/simulated/whereweare = get_turf(src) var/obj/P = pick(flora) new P(whereweare) - spam_flag = 1 - playsound(src, honk_sound, 50, 1) - if(honk_text) - audible_message(span_maroon("[honk_text]")) - src.add_fingerprint(user) - addtimer(VARSET_CALLBACK(src, spam_flag, 0), 20, TIMER_DELETE_ME) return /obj/item/bikehorn/rubberducky/white @@ -476,16 +476,19 @@ icon_state = "rubberducky_white" item_state = "rubberducky_white" honk_sound = 'sound/effects/lightningshock.ogg' - var/honk_count = 0 + special_handling = TRUE /obj/item/bikehorn/rubberducky/white/attack_self(mob/user) - if(spam_flag == 0) - lightning_strike(get_turf(src), 1) - spam_flag = 1 + . = ..(user) + if(.) + return TRUE + if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) playsound(src, honk_sound, 50, 1) + add_fingerprint(user) if(honk_text) audible_message(span_maroon("[honk_text]")) - src.add_fingerprint(user) + lightning_strike(get_turf(src), 1) qdel(src) return @@ -505,11 +508,16 @@ icon_state = "rubberducky_gold" item_state = "rubberducky_gold" honk_sound = 'sound/voice/quack_reverb.ogg' + special_handling = TRUE /obj/item/bikehorn/rubberducky/gold/attack_self(mob/user) - if(spam_flag == 0) - spam_flag = 1 + . = ..(user) + if(.) + return TRUE + if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) playsound(src, honk_sound, 50, 1) + add_fingerprint(user) if(honk_text) audible_message(span_maroon("[honk_text]")) if(isliving(user)) @@ -527,16 +535,20 @@ item_state = "rubberducky_viking" honk_sound = 'sound/voice/scream_jelly_m1.ogg' honk_text = "DUK ROH DAH!" + special_handling = TRUE /obj/item/bikehorn/rubberducky/viking/attack_self(mob/user) - if(spam_flag == 0) - spam_flag = 1 + . = ..(user) + if(.) + return TRUE + if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) playsound(src, honk_sound, 50, 1) + add_fingerprint(user) if(honk_text) audible_message(span_maroon("[honk_text]")) user.drop_item() user.throw_at_random(FALSE,9,2) - addtimer(VARSET_CALLBACK(src, spam_flag, 0), 20, TIMER_DELETE_ME) return /obj/item/bikehorn/rubberducky/galaxy @@ -546,11 +558,16 @@ icon_state = "rubberducky_galaxy" item_state = "rubberducky_galaxy" honk_sound = 'sound/effects/teleport.ogg' + special_handling = TRUE /obj/item/bikehorn/rubberducky/galaxy/attack_self(mob/user) - if(spam_flag == 0) - spam_flag = 1 + . = ..(user) + if(.) + return TRUE + if(cooldown <= world.time) + cooldown = (world.time + 2 SECONDS) playsound(src, honk_sound, 50, 1) + add_fingerprint(user) if(honk_text) audible_message(span_maroon("[honk_text]")) var/list/possible_orbiters = list() @@ -560,7 +577,6 @@ possible_orbiters += M var/atom/movable/selected_orbiter = pick(possible_orbiters) selected_orbiter.orbit(user,32,TRUE,20,36) - addtimer(VARSET_CALLBACK(src, spam_flag, 0), 20, TIMER_DELETE_ME) return //////////////////////////////SINKS////////////////////////////// diff --git a/code/modules/artifice/deadringer.dm b/code/modules/artifice/deadringer.dm index 4b2c0dda7e..ff534ab18c 100644 --- a/code/modules/artifice/deadringer.dm +++ b/code/modules/artifice/deadringer.dm @@ -30,7 +30,10 @@ watchowner = null return -/obj/item/deadringer/attack_self(var/mob/living/user as mob) +/obj/item/deadringer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/H = src.loc if (!ishuman(H)) to_chat(H, span_blue("You have no clue what to do with this thing.")) diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 7de494a072..598e2119a3 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -24,6 +24,9 @@ var/const/WIRE_RADIO_RECEIVE = 8 //Allows Pulsed(1) to call Activate() var/const/WIRE_RADIO_PULSE = 16 //Allows Pulse(1) to send a radio message + ///var used for attack_self chain + var/special_handling = FALSE + /obj/item/assembly/proc/holder_movement() return @@ -89,11 +92,15 @@ else . += "\The [src] can be attached!" -/obj/item/assembly/attack_self(mob/user as mob) +/obj/item/assembly/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(!user) - return 0 + return FALSE tgui_interact(user) - return 1 /obj/item/assembly/tgui_state(mob/user) return GLOB.tgui_deep_inventory_state diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 8e40773b2c..4a4910ac18 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -125,8 +125,11 @@ else ..() -/obj/item/assembly_holder/attack_self(var/mob/user) - src.add_fingerprint(user) +/obj/item/assembly_holder/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + add_fingerprint(user) if(src.secured) if(!a_left || !a_right) to_chat(user, span_warning(" BUG:Assembly part missing, please report this!")) diff --git a/code/modules/assembly/igniter.dm b/code/modules/assembly/igniter.dm index 4e7dd81459..24de14dd3d 100644 --- a/code/modules/assembly/igniter.dm +++ b/code/modules/assembly/igniter.dm @@ -7,6 +7,7 @@ secured = 1 wires = WIRE_RECEIVE + special_handling = TRUE /obj/item/assembly/igniter/activate() if(!..()) @@ -32,7 +33,10 @@ return TRUE -/obj/item/assembly/igniter/attack_self(var/mob/user) +/obj/item/assembly/igniter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE activate() add_fingerprint(user) diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index b479ac8279..12358b20b3 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -5,6 +5,7 @@ origin_tech = list(TECH_COMBAT = 1) matter = list(MAT_STEEL = 100) var/armed = 0 + special_handling = TRUE /obj/item/assembly/mousetrap/examine(var/mob/user) @@ -49,7 +50,10 @@ update_icon() pulse(0) -/obj/item/assembly/mousetrap/attack_self(var/mob/living/user) +/obj/item/assembly/mousetrap/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(!armed) to_chat(user, span_notice("You arm [src].")) else diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index a7a60d26b1..49d64674a1 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -6,6 +6,7 @@ var/obj/item/radio/electropack/part2 = null var/status = 0 w_class = ITEMSIZE_HUGE + special_handling = TRUE /obj/item/assembly/shock_kit/Destroy() qdel(part1) @@ -33,7 +34,10 @@ add_fingerprint(user) return -/obj/item/assembly/shock_kit/attack_self(mob/user as mob) +/obj/item/assembly/shock_kit/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE part1.attack_self(user, status) part2.attack_self(user, status) add_fingerprint(user) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index 745525ea92..0f5666958a 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -6,6 +6,7 @@ matter = list(MAT_STEEL = 500, MAT_GLASS = 50) var/listening = 0 var/recorded //the activation message + special_handling = TRUE /obj/item/assembly/voice/hear_talk(mob/M, list/message_pieces, verb) var/msg = multilingual_to_message(message_pieces) @@ -27,6 +28,9 @@ /obj/item/assembly/voice/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!user) return FALSE activate() diff --git a/code/modules/blob2/core_chunk.dm b/code/modules/blob2/core_chunk.dm index 1c977255e0..5f2923b9f7 100644 --- a/code/modules/blob2/core_chunk.dm +++ b/code/modules/blob2/core_chunk.dm @@ -84,14 +84,16 @@ return -/obj/item/blobcore_chunk/attack_self(var/mob/user) +/obj/item/blobcore_chunk/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(blob_type && world.time > active_ability_cooldown + last_active_use) last_active_use = world.time to_chat(user, span_alien("[icon2html(src, user.client)] \The [src] gesticulates.")) blob_type.on_chunk_use(src, user) else to_chat(user, span_notice("\The [src] doesn't seem to respond.")) - ..() /obj/item/blobcore_chunk/process() if(blob_type && should_tick && world.time > passive_ability_cooldown + last_passive_use) diff --git a/code/modules/casino/casino.dm b/code/modules/casino/casino.dm index b001912852..0ac4359722 100644 --- a/code/modules/casino/casino.dm +++ b/code/modules/casino/casino.dm @@ -269,6 +269,9 @@ icon_state = "roulette_ball_glass" /obj/item/roulette_ball/hollow/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!trapped) to_chat(user, span_notice("\The [src] is empty!")) return diff --git a/code/modules/catalogue/cataloguer.dm b/code/modules/catalogue/cataloguer.dm index 8f7aa662e9..7dc6af2b47 100644 --- a/code/modules/catalogue/cataloguer.dm +++ b/code/modules/catalogue/cataloguer.dm @@ -239,6 +239,9 @@ GLOBAL_LIST_EMPTY(all_cataloguers) points_stored = max(0, points_stored += amount) /obj/item/cataloguer/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE interact(user) /obj/item/cataloguer/interact(mob/user) diff --git a/code/modules/clothing/accessories/accessory.dm b/code/modules/clothing/accessories/accessory.dm index 0024d3a66b..4fe5684204 100644 --- a/code/modules/clothing/accessories/accessory.dm +++ b/code/modules/clothing/accessories/accessory.dm @@ -493,6 +493,7 @@ var/breath_masked = FALSE var/obj/item/clothing/mask/breath/breathmask actions_types = list(/datum/action/item_action/pull_on_gaiter) + special_handling = TRUE /obj/item/clothing/accessory/gaiter/update_clothing_icon() . = ..() @@ -521,6 +522,9 @@ item_flags |= FLEXIBLEMATERIAL /obj/item/clothing/accessory/gaiter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/gaiterstring = "You pull [src] " if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]_up" diff --git a/code/modules/clothing/accessories/accessory_vr.dm b/code/modules/clothing/accessories/accessory_vr.dm index ccf69c79da..e83747b975 100644 --- a/code/modules/clothing/accessories/accessory_vr.dm +++ b/code/modules/clothing/accessories/accessory_vr.dm @@ -45,6 +45,9 @@ icon_state = "collar_blk" var/writtenon = 0 var/icon_previous_override + special_handling = TRUE + ///Var for attack_self chain + var/special_collar = FALSE //Forces different sprite sheet on equip /obj/item/clothing/accessory/collar/Initialize(mapload) @@ -132,7 +135,7 @@ return /obj/item/clothing/accessory/collar/bell/proc/jingledreset() - jingled = 0 + jingled = 0 /obj/item/clothing/accessory/collar/shock name = "Shock collar" @@ -144,6 +147,7 @@ var/frequency = AMAG_ELE_FREQ var/code = 2 var/datum/radio_frequency/radio_connection + special_collar = TRUE /obj/item/clothing/accessory/collar/shock/Initialize(mapload) . = ..() @@ -159,7 +163,10 @@ frequency = new_frequency radio_connection = SSradio.add_object(src, frequency, RADIO_CHAT) -/obj/item/clothing/accessory/collar/shock/attack_self(mob/user as mob, flag1) +/obj/item/clothing/accessory/collar/shock/attack_self(mob/user, flag1) + . = ..(user) + if(.) + return TRUE if(!ishuman(user)) return tgui_interact(user) @@ -280,7 +287,12 @@ /obj/item/clothing/accessory/collar/holo/indigestible/digest_act(var/atom/movable/item_storage = null) return FALSE -/obj/item/clothing/accessory/collar/attack_self(mob/user as mob) +/obj/item/clothing/accessory/collar/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_collar) + return FALSE if(istype(src,/obj/item/clothing/accessory/collar/holo)) to_chat(user,span_notice("[name]'s interface is projected onto your hand.")) else @@ -644,8 +656,14 @@ var/sentientprizeflavor = null //Description to show on the SPASM var/sentientprizeooc = null //OOC text to show on the SPASM var/sentientprizeitemtf = FALSE //Whether the person opted in to allowing themselves to be item TF'd as a prize + special_handling = TRUE + special_collar = TRUE -/obj/item/clothing/accessory/collar/casinosentientprize/attack_self(mob/user as mob) +/obj/item/clothing/accessory/collar/casinosentientprize/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + return TRUE //keeping it blank so people don't tag and reset collar status /obj/item/clothing/accessory/collar/casinosentientprize_fake @@ -708,6 +726,7 @@ icon_state = "roughcloak" item_state = "roughcloak" actions_types = list(/datum/action/item_action/adjust_cloak) + special_handling = TRUE /obj/item/clothing/accessory/poncho/roles/cloak/half/update_clothing_icon() . = ..() @@ -715,7 +734,10 @@ var/mob/M = src.loc M.update_inv_wear_suit() -/obj/item/clothing/accessory/poncho/roles/cloak/half/attack_self(mob/user as mob) +/obj/item/clothing/accessory/poncho/roles/cloak/half/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]_open" src.item_state = "[item_state]_open" @@ -979,6 +1001,7 @@ icon_state = "neo_ranger" item_state = "neo_ranger" actions_types = list(/datum/action/item_action/adjust_poncho) + special_handling = TRUE /obj/item/clothing/accessory/poncho/roles/neo_ranger/update_clothing_icon() . = ..() @@ -986,7 +1009,10 @@ var/mob/M = src.loc M.update_inv_wear_suit() -/obj/item/clothing/accessory/poncho/roles/neo_ranger/attack_self(mob/user as mob) +/obj/item/clothing/accessory/poncho/roles/neo_ranger/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]_open" src.item_state = "[item_state]_open" diff --git a/code/modules/clothing/accessories/badges.dm b/code/modules/clothing/accessories/badges.dm index a6bb3886d9..bb8a867b55 100644 --- a/code/modules/clothing/accessories/badges.dm +++ b/code/modules/clothing/accessories/badges.dm @@ -13,6 +13,12 @@ var/stored_name var/badge_string = "Corporate Security" + special_handling = TRUE + ///var for attack_self chain + var/sheriff_badge = FALSE + ///Another var for attack_self chain + var/fluff_badge = FALSE + var/holo = FALSE /obj/item/clothing/accessory/badge/proc/set_name(var/new_name) stored_name = new_name @@ -20,9 +26,20 @@ /obj/item/clothing/accessory/badge/proc/set_desc(var/mob/living/carbon/human/H) -/obj/item/clothing/accessory/badge/attack_self(mob/user as mob) +/obj/item/clothing/accessory/badge/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(sheriff_badge) + return FALSE + if(fluff_badge) + return FALSE if(!stored_name) - to_chat(user, "You polish your old badge fondly, shining up the surface.") + if(holo) + to_chat(user, "Waving around a holobadge before swiping an ID would be pretty pointless.") + return + else + to_chat(user, "You polish your old badge fondly, shining up the surface.") set_name(user.real_name) return @@ -81,17 +98,12 @@ icon_state = "holobadge" var/emagged //Emagging removes Sec check. var/valid_access = list(ACCESS_SECURITY) //Default access is security, to be overriden or expanded as desired + holo = TRUE /obj/item/clothing/accessory/badge/holo/cord icon_state = "holobadge-cord" slot_flags = SLOT_MASK | SLOT_TIE | SLOT_BELT -/obj/item/clothing/accessory/badge/holo/attack_self(mob/user as mob) - if(!stored_name) - to_chat(user, "Waving around a holobadge before swiping an ID would be pretty pointless.") - return - return ..() - /obj/item/clothing/accessory/badge/holo/emag_act(var/remaining_charges, var/mob/user) if (emagged) to_chat(user, span_danger("\The [src] is already cracked.")) @@ -188,8 +200,13 @@ desc = "This town ain't big enough for the two of us, pardner." icon_state = "sheriff_toy" item_state = "sheriff_toy" + special_handling = TRUE + sheriff_badge = TRUE -/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user as mob) +/obj/item/clothing/accessory/badge/sheriff/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message("[user] shows their sheriff badge. There's a new sheriff in town!",\ "You flash the sheriff badge to everyone around you!") diff --git a/code/modules/clothing/accessories/lockets.dm b/code/modules/clothing/accessories/lockets.dm index 3465f4f030..28344f3195 100644 --- a/code/modules/clothing/accessories/lockets.dm +++ b/code/modules/clothing/accessories/lockets.dm @@ -10,8 +10,12 @@ var/base_icon var/open var/obj/item/held //Item inside locket. + special_handling = TRUE /obj/item/clothing/accessory/locket/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!base_icon) base_icon = icon_state diff --git a/code/modules/clothing/accessories/permits.dm b/code/modules/clothing/accessories/permits.dm index fcd7570a58..59f33fef4d 100644 --- a/code/modules/clothing/accessories/permits.dm +++ b/code/modules/clothing/accessories/permits.dm @@ -8,8 +8,12 @@ w_class = ITEMSIZE_TINY slot = ACCESSORY_SLOT_MEDAL var/owner = 0 //To prevent people from just renaming the thing if they steal it + special_handling = TRUE -/obj/item/clothing/accessory/permit/attack_self(mob/user as mob) +/obj/item/clothing/accessory/permit/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(isliving(user)) if(!owner) set_name(user.name) diff --git a/code/modules/clothing/accessories/rings.dm b/code/modules/clothing/accessories/rings.dm index 6f1183332c..6fb1a1b928 100644 --- a/code/modules/clothing/accessories/rings.dm +++ b/code/modules/clothing/accessories/rings.dm @@ -27,8 +27,12 @@ name = "engagement ring" desc = "An engagement ring. It certainly looks expensive." icon_state = "diamond" + special_handling = TRUE /obj/item/clothing/accessory/ring/engagement/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message(span_warning("\The [user] gets down on one knee, presenting \the [src]."),span_warning("You get down on one knee, presenting \the [src].")) /obj/item/clothing/accessory/ring/cti @@ -97,8 +101,12 @@ desc = "A signet ring, for when you're too sophisticated to sign letters." icon_state = "seal-signet" var/nameset = FALSE + special_handling = TRUE /obj/item/clothing/accessory/ring/seal/signet/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(nameset) to_chat(user, span_notice("The [src] has already been claimed!")) return @@ -118,8 +126,12 @@ icon_state = "wedring_g" item_state = "wedring_g" var/partnername = "" + special_handling = TRUE /obj/item/clothing/accessory/ring/wedding/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/input = tgui_input_text(user, "Would you like to change the holoengraving on the ring?", "Name your spouse", "Bae", MAX_NAME_LEN) if(!input) return diff --git a/code/modules/clothing/accessories/storage.dm b/code/modules/clothing/accessories/storage.dm index be26aee936..5e954e3d97 100644 --- a/code/modules/clothing/accessories/storage.dm +++ b/code/modules/clothing/accessories/storage.dm @@ -10,6 +10,7 @@ w_class = ITEMSIZE_NORMAL on_rolled = list("down" = "none") var/hide_on_roll = FALSE + special_handling = TRUE /obj/item/clothing/accessory/storage/Initialize(mapload) . = ..() @@ -38,6 +39,9 @@ return hold.attackby(W, user) /obj/item/clothing/accessory/storage/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("You empty [src].")) var/turf/T = get_turf(src) hold.hide_from(user) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index dc54af152c..a8567d4b3e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -478,16 +478,20 @@ ) drop_sound = 'sound/items/drop/hat.ogg' pickup_sound = 'sound/items/pickup/hat.ogg' + helmet_handling = TRUE -/obj/item/clothing/head/attack_self(mob/user) +/obj/item/clothing/head/attack_self(mob/user, callback) + . = ..(user) + if(.) + return TRUE + if(special_handling && !callback) + return FALSE if(light_range) if(!isturf(user.loc)) to_chat(user, "You cannot toggle the light while in this [user.loc]") return update_flashlight(user) to_chat(user, "You [light_on ? "enable" : "disable"] the helmet light.") - else - return ..(user) /obj/item/clothing/head/proc/update_flashlight(var/mob/user = null) set_light_on(!light_on) @@ -863,7 +867,10 @@ var/mob/M = src.loc M.update_inv_shoes() -/obj/item/clothing/shoes/attack_self(var/mob/user) +/obj/item/clothing/shoes/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE for(var/mob/M in src) if(isvoice(M)) //Don't knock voices out! continue @@ -871,8 +878,6 @@ to_chat(M, span_warning("[user] shakes you out of \the [src]!")) to_chat(user, span_notice("You shake [M] out of \the [src]!")) - ..() - /obj/item/clothing/shoes/container_resist(mob/living/micro) var/mob/living/carbon/human/macro = loc if(isvoice(micro)) //Voices shouldn't be able to resist but we have this here just in case. diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 36da7ba864..93ca31250a 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -45,6 +45,8 @@ BLIND // can't see anything SPECIES_XENOCHIMERA = 'icons/inventory/eyes/mob_tajaran.dmi' ) var/glasses_layer_above = FALSE + ///Var for attack_self chain + var/specialty_goggles = FALSE /obj/item/clothing/glasses/update_clothing_icon() if (ismob(src.loc)) @@ -85,6 +87,11 @@ BLIND // can't see anything user.recalculate_vis() /obj/item/clothing/glasses/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(specialty_goggles) + return FALSE if(toggleable) if(!can_toggle(user)) to_chat(user, span_warning("You don't seem to be able to toggle \the [src] here.")) @@ -94,7 +101,6 @@ BLIND // can't see anything to_chat(user, span_notice("You activate the optical matrix on the [src].")) else to_chat(user, span_notice("You deactivate the optical matrix on the [src].")) - ..() /obj/item/clothing/glasses/meson name = "optical meson scanner" @@ -389,8 +395,12 @@ BLIND // can't see anything var/up = 0 flash_protection = FLASH_PROTECTION_MAJOR tint = TINT_HEAVY + specialty_goggles = TRUE -/obj/item/clothing/glasses/welding/attack_self() +/obj/item/clothing/glasses/welding/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE toggle() /obj/item/clothing/glasses/welding/verb/toggle() @@ -496,8 +506,12 @@ BLIND // can't see anything var/on = 1 toggleable = 1 activation_sound = 'sound/effects/pop.ogg' + specialty_goggles = TRUE /obj/item/clothing/glasses/sunglasses/sechud/aviator/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(toggleable && !user.incapacitated()) on = !on if(on) @@ -611,8 +625,12 @@ BLIND // can't see anything item_flags = AIRTIGHT body_parts_covered = EYES species_restricted = list(SPECIES_TESHARI) + specialty_goggles = TRUE -/obj/item/clothing/glasses/aerogelgoggles/attack_self() +/obj/item/clothing/glasses/aerogelgoggles/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE toggle() /obj/item/clothing/glasses/aerogelgoggles/verb/toggle() diff --git a/code/modules/clothing/glasses/glasses_vr.dm b/code/modules/clothing/glasses/glasses_vr.dm index 6849cc14e4..de94191fbd 100644 --- a/code/modules/clothing/glasses/glasses_vr.dm +++ b/code/modules/clothing/glasses/glasses_vr.dm @@ -90,7 +90,9 @@ ) /obj/item/clothing/glasses/sunglasses/sechud/tactical_sec_vis/attack_self(mob/user) - . = ..() + . = ..(user) + if(.) + return TRUE if(!istype(user) || user.incapacitated()) return @@ -103,7 +105,6 @@ user.update_inv_glasses() user.update_mob_action_buttons() to_chat(user, span_notice("Your [src] now displays [choice] .")) - return 1 /*---Tajaran-specific Eyewear---*/ diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index bd894f701f..690ae2a1b5 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -75,6 +75,8 @@ plane_slots = list(slot_glasses) var/ar_toggled = TRUE //Used for toggle_ar_planes() verb var/can_shade = TRUE + specialty_goggles = TRUE + var/hud_goggles = FALSE /obj/item/clothing/glasses/omnihud/Initialize(mapload) . = ..() @@ -130,8 +132,13 @@ icon_state = "[initial(icon_state)]" /obj/item/clothing/glasses/omnihud/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!ishuman(user)) - return + return FALSE + if(hud_goggles) + return FALSE var/mob/living/carbon/human/H = user if(!H.glasses || !(H.glasses == src)) @@ -283,11 +290,15 @@ vision_flags = SEE_TURFS //but they can spot breaches. Due to the way HUDs work, they don't provide darkvision up-close the way mesons do. flash_protection = 0 //it's an open, single-eye retinal projector. there's no way it protects your eyes from flashes or welders. can_shade = FALSE + specialty_goggles = TRUE + hud_goggles = TRUE /obj/item/clothing/glasses/omnihud/eng/meson/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!active) toggleprojector() - ..() /obj/item/clothing/glasses/omnihud/eng/meson/verb/toggleprojector() set name = "Toggle projector" diff --git a/code/modules/clothing/gloves/miscellaneous_vr.dm b/code/modules/clothing/gloves/miscellaneous_vr.dm index 894f348439..fd4e2996ea 100644 --- a/code/modules/clothing/gloves/miscellaneous_vr.dm +++ b/code/modules/clothing/gloves/miscellaneous_vr.dm @@ -1,3 +1,4 @@ +//CHOMPEdit Start??? Somehow wedding rigs were attributed to me from 9 years ago but is not upstream and is only on here, yet there's no chomp edits? /obj/item/clothing/gloves/weddingring name = "golden wedding ring" desc = "For showing your devotion to another person. It has a golden glimmer to it." @@ -5,8 +6,12 @@ item_state = "wedring_g" var/partnername = "" body_parts_covered = null + special_handling = TRUE /obj/item/clothing/gloves/weddingring/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE partnername = tgui_input_text(user, "Would you like to change the holoengraving on the ring?", "Name your betrothed", "Bae", MAX_NAME_LEN) name = "[initial(name)] - [partnername]" @@ -14,6 +19,7 @@ name = "silver wedding ring" icon_state = "wedring_s" item_state = "wedring_s" +//CHOMPEdit End??? /obj/item/clothing/gloves/color name = "gloves" diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index dab0fecde4..09d1c57146 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -65,14 +65,19 @@ siemens_coefficient = 0.7 valid_accessory_slots = null actions_types = list(/datum/action/item_action/toggle_visor) + special_handling = TRUE + var/name_descriptor = "riot helmet" //CHOMPEdit for visor toggle messages -/obj/item/clothing/head/helmet/riot/attack_self(mob/user as mob) +/obj/item/clothing/head/helmet/riot/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]up" - to_chat(user, "You raise the visor on the riot helmet.") + to_chat(user, "You raise the visor on the [name_descriptor].") //CHOMPEdit - Visor toggle messages else src.icon_state = initial(icon_state) - to_chat(user, "You lower the visor on the riot helmet.") + to_chat(user, "You lower the visor on the [name_descriptor].") //CHOMPEdit - Visor toggle messages update_clothing_icon() //so our mob-overlays update /obj/item/clothing/head/helmet/laserproof diff --git a/code/modules/clothing/head/helmet_vr.dm b/code/modules/clothing/head/helmet_vr.dm index afc6765288..b7a600b246 100644 --- a/code/modules/clothing/head/helmet_vr.dm +++ b/code/modules/clothing/head/helmet_vr.dm @@ -40,8 +40,12 @@ var/base_state var/up = FALSE + special_handling = TRUE -/obj/item/clothing/head/helmet/combat/bedevere/attack_self() +/obj/item/clothing/head/helmet/combat/bedevere/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE toggle() /obj/item/clothing/head/helmet/combat/bedevere/verb/toggle() @@ -93,8 +97,12 @@ var/base_state var/up = FALSE + special_handling = TRUE -/obj/item/clothing/head/helmet/combat/bedevere_costume/attack_self() +/obj/item/clothing/head/helmet/combat/bedevere_costume/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE toggle() /obj/item/clothing/head/helmet/combat/bedevere_costume/verb/toggle() diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index c863efcc8e..0a24eba9e1 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -31,8 +31,12 @@ tint = TINT_HEAVY drop_sound = 'sound/items/drop/helm.ogg' pickup_sound = 'sound/items/pickup/helm.ogg' + special_handling = TRUE -/obj/item/clothing/head/welding/attack_self() +/obj/item/clothing/head/welding/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE toggle() @@ -126,6 +130,7 @@ icon_state = "cake0" var/onfire = 0 body_parts_covered = HEAD + special_handling = TRUE /obj/item/clothing/head/cakehat/process() if(!onfire) @@ -141,7 +146,10 @@ if (istype(location, /turf)) location.hotspot_expose(700, 1) -/obj/item/clothing/head/cakehat/attack_self(mob/user as mob) +/obj/item/clothing/head/cakehat/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE onfire = !(onfire) if (onfire) force = 3 @@ -163,8 +171,12 @@ desc = "Perfect for those cold winter nights." icon_state = "ushankadown" flags_inv = HIDEEARS + special_handling = TRUE -/obj/item/clothing/head/ushanka/attack_self(mob/user as mob) +/obj/item/clothing/head/ushanka/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]up" to_chat(user, "You raise the ear flaps on the ushanka.") diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm index 9c3d092911..e658c80ad5 100644 --- a/code/modules/clothing/head/pilot_helmet.dm +++ b/code/modules/clothing/head/pilot_helmet.dm @@ -187,8 +187,12 @@ desc = "Standard pilot gear. Protects the head from impacts. This one has a retractable visor" icon_state = "pilot_helmet2" actions_types = list(/datum/action/item_action/toggle_visor) + special_handling = TRUE -/obj/item/clothing/head/pilot/alt/attack_self(mob/user as mob) +/obj/item/clothing/head/pilot/alt/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]up" to_chat(user, "You raise the visor on the pilot helmet.") diff --git a/code/modules/clothing/head/pilot_helmet_vr.dm b/code/modules/clothing/head/pilot_helmet_vr.dm index d57c30916a..0e5e5597b3 100644 --- a/code/modules/clothing/head/pilot_helmet_vr.dm +++ b/code/modules/clothing/head/pilot_helmet_vr.dm @@ -9,8 +9,12 @@ max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE w_class = ITEMSIZE_NORMAL actions_types = list(/datum/action/item_action/toggle_visor) + special_handling = TRUE -/obj/item/clothing/head/pilot_vr/attack_self(mob/user as mob) +/obj/item/clothing/head/pilot_vr/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(src.icon_state == initial(icon_state)) src.icon_state = "[icon_state]up" to_chat(user, "You raise the visor on the pilot helmet.") @@ -25,15 +29,6 @@ icon_state = "pilot2" actions_types = list(/datum/action/item_action/toggle_visor) -/obj/item/clothing/head/pilot_vr/alt/attack_self(mob/user as mob) - if(src.icon_state == initial(icon_state)) - src.icon_state = "[icon_state]up" - to_chat(user, "You raise the visor on the pilot helmet.") - else - src.icon_state = initial(icon_state) - to_chat(user, "You lower the visor on the pilot helmet.") - update_clothing_icon() //so our mob-overlays update - //////////Talon Pilot Headgear////////// /obj/item/clothing/head/pilot_vr/talon @@ -42,15 +37,6 @@ icon_state = "pilot3" actions_types = list(/datum/action/item_action/toggle_visor) -/obj/item/clothing/head/pilot_vr/talon/attack_self(mob/user as mob) - if(src.icon_state == initial(icon_state)) - src.icon_state = "[icon_state]up" - to_chat(user, "You raise the visor on the pilot helmet.") - else - src.icon_state = initial(icon_state) - to_chat(user, "You lower the visor on the pilot helmet.") - update_clothing_icon() //so our mob-overlays update - //////////Major Bill's Pilot Headgear////////// /obj/item/clothing/head/pilot_vr/mbill @@ -59,12 +45,3 @@ icon_state = "pilot3" catalogue_data = list(/datum/category_item/catalogue/information/organization/major_bills) actions_types = list(/datum/action/item_action/toggle_visor) - -/obj/item/clothing/head/pilot_vr/mbill/attack_self(mob/user as mob) - if(src.icon_state == initial(icon_state)) - src.icon_state = "[icon_state]up" - to_chat(user, "You raise the visor on the pilot helmet.") - else - src.icon_state = initial(icon_state) - to_chat(user, "You lower the visor on the pilot helmet.") - update_clothing_icon() //so our mob-overlays update diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 71ed3f64ca..73b39ca0ce 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -6,13 +6,17 @@ var/flipped = 0 siemens_coefficient = 0.9 body_parts_covered = 0 + special_handling = TRUE /obj/item/clothing/head/soft/dropped(mob/user) icon_state = initial(icon_state) - flipped=0 + flipped = FALSE ..() /obj/item/clothing/head/soft/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE flipped = !flipped if(flipped) icon_state = "[icon_state]_flipped" diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 4c4781b8a8..5d06eb3c49 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -12,6 +12,7 @@ actions_types = list(/datum/action/item_action/adjust_breath_mask) pickup_sound = 'sound/items/pickup/component.ogg' drop_sound = 'sound/items/drop/component.ogg' + special_handling = TRUE /obj/item/clothing/mask/breath/proc/adjust_mask(mob/user) @@ -32,6 +33,9 @@ update_clothing_icon() /obj/item/clothing/mask/breath/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE adjust_mask(user) /obj/item/clothing/mask/breath/verb/toggle() diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 60df8a8234..121b1485c9 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -92,6 +92,8 @@ filtered_gases = list(GAS_O2, GAS_N2O) var/mask_open = FALSE // Controls if the Vox can eat through this mask actions_types = list(/datum/action/item_action/toggle_feeding_port) + helmet_handling = TRUE + special_handling = TRUE /obj/item/clothing/mask/gas/swat/vox/proc/feeding_port(mob/user) if(user.canmove && !user.stat) @@ -105,8 +107,10 @@ return /obj/item/clothing/mask/gas/swat/vox/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE feeding_port(user) - ..() /obj/item/clothing/mask/gas/zaddat name = "Zaddat Veil" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 51c76b783a..e17860b0ca 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -324,6 +324,7 @@ icon_state = "papermask" actions_types = list(/datum/action/item_action/hands_free/redraw_design) var/list/papermask_designs = list() + special_handling = TRUE /obj/item/clothing/mask/paper/Initialize(mapload) . = ..() @@ -356,7 +357,9 @@ ) /obj/item/clothing/mask/paper/attack_self(mob/user) - . = ..() + . = ..(user) + if(.) + return TRUE if(!istype(user) || user.incapacitated()) return @@ -377,7 +380,6 @@ user.update_inv_wear_mask() user.update_mob_action_buttons() to_chat(user, span_notice("Your paper mask now is now [choice].")) - return 1 /obj/item/clothing/mask/emotions name = "emotional mask" @@ -387,6 +389,7 @@ icon_state = "joy" actions_types = list(/datum/action/item_action/hands_free/redraw_design) var/static/list/joymask_designs = list() + special_handling = TRUE /obj/item/clothing/mask/emotions/Initialize(mapload) @@ -399,7 +402,9 @@ ) /obj/item/clothing/mask/emotions/attack_self(mob/user) - . = ..() + . = ..(user) + if(.) + return TRUE if(!istype(user) || user.incapacitated()) return @@ -412,7 +417,6 @@ user.update_inv_wear_mask() user.update_mob_action_buttons() to_chat(user, span_notice("Your [src] now displays a [choice] emotion.")) - return 1 /obj/item/clothing/mask/mouthwheat name = "mouth wheat" diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 0f15ddc0e1..6f5b1f3c6b 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -111,8 +111,10 @@ icon_state = "orange" chained = null -/obj/item/clothing/shoes/orange/attack_self(mob/user as mob) - ..() +/obj/item/clothing/shoes/orange/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE remove_cuffs(user) /obj/item/clothing/shoes/orange/attackby(H as obj, mob/user as mob) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index b398eab2ad..7f8503e9cf 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -13,6 +13,12 @@ preserve_item = 1 var/magpulse = 0 var/icon_base = "magboots" + ///The message that gets shown when we enable the magboots. + var/mag_enable = "You enable the mag-pulse traction system." + ///The message that gets shown when we disable the magboots. + var/mag_disable = "You disable the mag-pulse traction system." + ///If the magboots can be removed when enabled or not. + var/unremovable_when_enabled = FALSE actions_types = list(/datum/action/item_action/toggle_magboots) step_volume_mod = 1.3 drop_sound = 'sound/items/drop/metalboots.ogg' @@ -24,21 +30,36 @@ slowdown += 3 /obj/item/clothing/shoes/magboots/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(magpulse) item_flags &= ~NOSLIP - magpulse = 0 + magpulse = FALSE set_slowdown() force = 3 if(icon_base) icon_state = "[icon_base]0" - to_chat(user, "You disable the mag-pulse traction system.") + to_chat(user, mag_disable) + if(unremovable_when_enabled) + canremove = TRUE else + //Checks to ensure if they're unremovable we're actually wearing them when we turn them on. + if(unremovable_when_enabled) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + if(H.shoes != src) + to_chat(user, "You will have to put on the [src] before you can do that.") + return + canremove = FALSE + item_flags |= NOSLIP - magpulse = 1 + magpulse = TRUE set_slowdown() force = 5 if(icon_base) icon_state = "[icon_base]1" playsound(src, 'sound/effects/magnetclamp.ogg', 20) - to_chat(user, "You enable the mag-pulse traction system.") + to_chat(user, mag_enable) user.update_inv_shoes() //so our mob-overlays update user.update_mob_action_buttons() @@ -91,33 +112,16 @@ name = "vox magclaws" item_state = "boots-vox" icon_state = "boots-vox" + icon_base = null + mag_enable = "You dig your claws deeply into the flooring, bracing yourself." + mag_disable = "You relax your deathgrip on the flooring." + unremovable_when_enabled = TRUE flags = PHORONGUARD species_restricted = list(SPECIES_VOX) armor = list (melee = 40, bullet = 10, laser = 10, energy = 20, bomb = 20, bio = 10, rad = 20) //values of workboots and heavy duty engineering gloves, it's the only option that will ever be taken so may as well give the turkeys some protection //ChompEdit actions_types = list(/datum/action/item_action/toggle_magclaws) -/obj/item/clothing/shoes/magboots/vox/attack_self(mob/user) - if(src.magpulse) - item_flags &= ~NOSLIP - magpulse = 0 - canremove = TRUE - to_chat(user, "You relax your deathgrip on the flooring.") - else - //make sure these can only be used when equipped. - if(!ishuman(user)) - return - var/mob/living/carbon/human/H = user - if (H.shoes != src) - to_chat(user, "You will have to put on the [src] before you can do that.") - return - - item_flags |= NOSLIP - magpulse = 1 - canremove = FALSE //kinda hard to take off magclaws when you are gripping them tightly. - to_chat(user, "You dig your claws deeply into the flooring, bracing yourself.") - user.update_mob_action_buttons() - //In case they somehow come off while enabled. /obj/item/clothing/shoes/magboots/vox/dropped(mob/user) ..(user) diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index ccaa57c8a8..17fde2ea80 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -173,6 +173,7 @@ blood_overlay_type = "armor" slowdown = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + special_handling = TRUE /obj/item/clothing/suit/armor/reactive/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(prob(50)) @@ -197,8 +198,11 @@ return PROJECTILE_FORCE_MISS return 0 -/obj/item/clothing/suit/armor/reactive/attack_self(mob/user as mob) - active = !( active ) +/obj/item/clothing/suit/armor/reactive/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + active = !active if (active) to_chat(user, span_blue("The reactive armor is now active.")) icon_state = "reactive" diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index c7c5a29ba0..37ea24745d 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -1059,24 +1059,29 @@ body_parts_covered = CHEST attack_verb = list("warned", "cautioned", "smashed") armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) + special_handling = TRUE -/obj/item/clothing/suit/caution/attack_self() - toggle() +/obj/item/clothing/suit/caution/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + toggle(user) -/obj/item/clothing/suit/caution/click_alt() - toggle() +/obj/item/clothing/suit/caution/click_alt(mob/user) + toggle(user) -/obj/item/clothing/suit/caution/proc/toggle() - if(!usr || usr.stat || usr.lying || usr.restrained() || !Adjacent(usr)) return - else if(src.icon_state == "caution") - src.icon_state = "caution_blinking" - src.item_state = "caution_blinking" - usr.show_message("You turn the wet floor sign on.") +/obj/item/clothing/suit/caution/proc/toggle(mob/user) + if(!user || user.stat || user.lying || user.restrained() || !Adjacent(user)) + return + else if(icon_state == "caution") + icon_state = "caution_blinking" + item_state = "caution_blinking" + user.show_message("You turn the wet floor sign on.") playsound(src.loc, 'sound/machines/button.ogg', 30, 1) else - src.icon_state = "caution" - src.item_state = "caution" - usr.show_message("You turn the wet floor sign off.") + icon_state = "caution" + item_state = "caution" + user.show_message("You turn the wet floor sign off.") update_clothing_icon() //Ruin Marine (Doom Marine) diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index c0f99555bf..ec65fbea6a 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -47,11 +47,16 @@ ///The cooldown itself of the reactive armor for when it can activate again. var/reactivearmor_cooldown = 0 + special_handling = TRUE + /obj/item/clothing/suit/armor/reactive/update_icon() . = ..() icon_state = "reactive[active ? null : "off"]" /obj/item/clothing/suit/armor/reactive/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE active = !active to_chat(user, span_notice("[src] is now [active ? "active" : "inactive"].")) update_icon() diff --git a/code/modules/clothing/suits/shibari.dm b/code/modules/clothing/suits/shibari.dm index 08786a5e2b..1074943b7e 100644 --- a/code/modules/clothing/suits/shibari.dm +++ b/code/modules/clothing/suits/shibari.dm @@ -13,6 +13,8 @@ var/rope_mode = SHIBARI_NONE + special_handling = TRUE + /obj/item/clothing/suit/shibari/attack_hand(mob/living/user as mob) if(ishuman(user)) @@ -23,6 +25,9 @@ ..() /obj/item/clothing/suit/shibari/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE rope_mode = tgui_input_list(user, "Which limbs would you like to restrain with the bindings?", "Shibari", list(SHIBARI_NONE, SHIBARI_ARMS, SHIBARI_LEGS, SHIBARI_BOTH)) if(!rope_mode) rope_mode = SHIBARI_NONE diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 10c8f83409..d906c5b122 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -9,6 +9,7 @@ w_class = ITEMSIZE_SMALL var/obj/item/stored_item = null + /obj/item/evidencebag/MouseDrop(var/obj/item/I) if (!ishuman(usr)) return @@ -72,8 +73,11 @@ return -/obj/item/evidencebag/attack_self(mob/user as mob) - if(contents.len) +/obj/item/evidencebag/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(LAZYLEN(contents)) var/obj/item/I = contents[1] user.visible_message("[user] takes [I] out of [src]", "You take [I] out of [src].",\ "You hear someone rustle around in a plastic bag, and remove something.") diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 74161bbb62..02f5314c30 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -28,6 +28,7 @@ var/on_fire = 0 var/burn_time = 20 //if the rag burns for too long it turns to ashes + special_handling = TRUE /obj/item/reagent_containers/glass/rag/Initialize(mapload) . = ..() @@ -37,7 +38,10 @@ STOP_PROCESSING(SSobj, src) //so we don't continue turning to ash while gc'd return ..() -/obj/item/reagent_containers/glass/rag/attack_self(mob/user as mob) +/obj/item/reagent_containers/glass/rag/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(on_fire) user.visible_message(span_warning("\The [user] stamps out [src]."), span_warning("You stamp out [src].")) user.unEquip(src) diff --git a/code/modules/detectivework/tools/sample_kits.dm b/code/modules/detectivework/tools/sample_kits.dm index 8284c28cd8..35eb5966cf 100644 --- a/code/modules/detectivework/tools/sample_kits.dm +++ b/code/modules/detectivework/tools/sample_kits.dm @@ -61,7 +61,10 @@ icon_state = "fingerprint0" item_state = "paper" -/obj/item/sample/print/attack_self(var/mob/user) +/obj/item/sample/print/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(evidence && evidence.len) return if(!ishuman(user)) diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index fec338a5d1..34a124b9e8 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -20,7 +20,10 @@ pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' -/obj/item/uv_light/attack_self(var/mob/user) +/obj/item/uv_light/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE on = !on if(on) set_light(range, 2, "#007fff") diff --git a/code/modules/economy/EFTPOS.dm b/code/modules/economy/EFTPOS.dm index 50feeb5c85..5cb147633a 100644 --- a/code/modules/economy/EFTPOS.dm +++ b/code/modules/economy/EFTPOS.dm @@ -73,7 +73,10 @@ D.wrapped = R D.name = "small parcel - 'EFTPOS access code'" -/obj/item/eftpos/attack_self(mob/user as mob) +/obj/item/eftpos/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(get_dist(src,user) <= 1) var/dat = span_bold("[eftpos_name]") + "
" dat += "This terminal is [machine_id]. Report this code when contacting IT Support
" diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index 4b49c7e963..15e13f86dc 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -18,6 +18,8 @@ var/worth = 0 drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' + ///Var for attack_self chain + var/special_handling = FALSE /obj/item/spacecash/Initialize(mapload) . = ..() @@ -84,6 +86,9 @@ return worth /obj/item/spacecash/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/amount = tgui_input_number(user, "How many [initial_name]s do you want to take? (0 to [src.worth])", "Take Money", 20, src.worth) if(!src || QDELETED(src)) return @@ -167,8 +172,12 @@ drop_sound = 'sound/items/drop/card.ogg' pickup_sound = 'sound/items/pickup/card.ogg' var/owner_name = "" //So the ATM can set it so the EFTPOS can put a valid name on transactions. + special_handling = TRUE -/obj/item/spacecash/ewallet/attack_self() return //Don't act +/obj/item/spacecash/ewallet/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE /obj/item/spacecash/ewallet/attackby() return //like actual /obj/item/spacecash/ewallet/update_icon() return //space cash diff --git a/code/modules/economy/casinocash.dm b/code/modules/economy/casinocash.dm index e00cba74ef..8a4943ad98 100644 --- a/code/modules/economy/casinocash.dm +++ b/code/modules/economy/casinocash.dm @@ -112,6 +112,9 @@ return worth /obj/item/spacecasinocash/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/amount = tgui_input_number(user, "How much credits worth of chips do you want to take? (0 to [src.worth])", "Take chips", 20, src.worth) if(!src || QDELETED(src)) return @@ -196,7 +199,10 @@ throw_range = 2 w_class = ITEMSIZE_SMALL -/obj/item/casino_platinum_chip/attack_self(mob/user as mob) +/obj/item/casino_platinum_chip/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/result = rand(1, sides) var/comment = "" if(result == 1) @@ -287,6 +293,9 @@ return worth /obj/item/spacecasinocash_fake/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/amount = tgui_input_number(user, "How much credits worth of chips do you want to take? (0 to [src.worth])", "Take chips", 20, src.worth) if(!src || QDELETED(src)) return diff --git a/code/modules/economy/coins.dm b/code/modules/economy/coins.dm index 027709ef1d..7deecd55b6 100644 --- a/code/modules/economy/coins.dm +++ b/code/modules/economy/coins.dm @@ -146,7 +146,10 @@ balloon_alert(user, "string detached") else ..() -/obj/item/coin/attack_self(mob/user as mob) +/obj/item/coin/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/result = rand(1, sides) var/comment = "" if(result == 1) diff --git a/code/modules/economy/coins_vr.dm b/code/modules/economy/coins_vr.dm index 33171cb69a..f4326d18a0 100644 --- a/code/modules/economy/coins_vr.dm +++ b/code/modules/economy/coins_vr.dm @@ -40,7 +40,10 @@ value = 20 -/obj/item/aliencoin/attack_self(mob/user as mob) +/obj/item/aliencoin/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/result = rand(1, sides) var/comment = "" if(result == 1) diff --git a/code/modules/economy/price_list.dm b/code/modules/economy/price_list.dm index 374bad10d3..081a2de8bd 100644 --- a/code/modules/economy/price_list.dm +++ b/code/modules/economy/price_list.dm @@ -768,9 +768,6 @@ /obj/item/reagent_containers/food/snacks/slice/vegetablepizza price_tag = 1 -/obj/item/reagent_containers/food/snacks/ - - // Baked Goods // /obj/item/reagent_containers/food/snacks/poppypretzel diff --git a/code/modules/economy/retail_scanner.dm b/code/modules/economy/retail_scanner.dm index ed906b7509..8c6df35d83 100644 --- a/code/modules/economy/retail_scanner.dm +++ b/code/modules/economy/retail_scanner.dm @@ -51,7 +51,10 @@ src.pixel_y = 0 -/obj/item/retail_scanner/attack_self(mob/user as mob) +/obj/item/retail_scanner/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.set_machine(src) interact(user) diff --git a/code/modules/entrepreneur/entrepreneur_items.dm b/code/modules/entrepreneur/entrepreneur_items.dm index 8b0e49067e..1d55a6646c 100644 --- a/code/modules/entrepreneur/entrepreneur_items.dm +++ b/code/modules/entrepreneur/entrepreneur_items.dm @@ -185,7 +185,10 @@ advice = pick(advice_list) pisces = "[stars] [prediction] [advice]" -/obj/item/entrepreneur/horoscope/attack_self(var/mob/user) +/obj/item/entrepreneur/horoscope/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/zodiac = tgui_input_list(user, "Which of todays zodiacs do you want to read?", "Zodiac", zodiacs) if(zodiac) switch(zodiac) @@ -289,7 +292,10 @@ icon = 'icons/obj/entrepreneur.dmi' icon_state = "dumbbell" -/obj/item/entrepreneur/dumbbell/attack_self(var/mob/user) +/obj/item/entrepreneur/dumbbell/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/M = user if(M.nutrition <= 100) to_chat(user, span_notice("You are too hungry to exercise right now.")) @@ -312,7 +318,10 @@ var/turf/last_used = 0 var/emf_change = 0 -/obj/item/entrepreneur/emf/attack_self(var/mob/user) +/obj/item/entrepreneur/emf/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!last_used) emf = rand(1,100) last_used = get_turf(user) diff --git a/code/modules/eventkit/generic_objects/generic_item.dm b/code/modules/eventkit/generic_objects/generic_item.dm index d60c7132da..b4a48f0a4f 100644 --- a/code/modules/eventkit/generic_objects/generic_item.dm +++ b/code/modules/eventkit/generic_objects/generic_item.dm @@ -18,6 +18,9 @@ var/icon_on = 0 /obj/item/generic_item/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(activatable_hand) if(!on) if(delay_time) @@ -87,7 +90,6 @@ if(user) user.visible_message(span_notice("[text_deactivated]")) update_icon() - return ..() /client/proc/generic_item() set category = "Fun.Event Kit" diff --git a/code/modules/fireworks/firework_stars.dm b/code/modules/fireworks/firework_stars.dm index 16072b591f..aa1257fddd 100644 --- a/code/modules/fireworks/firework_stars.dm +++ b/code/modules/fireworks/firework_stars.dm @@ -116,7 +116,10 @@ "a bottle", "a boat", "a spaceship", "Nanotrasen logo", "a geometric-looking letter S", "a dodecahedron") -/obj/item/firework_star/aesthetic/configurable/attack_self(var/mob/user) +/obj/item/firework_star/aesthetic/configurable/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/choice = tgui_alert(user, "What setting do you want to adjust?", "Firework Star", list("Color", "Shape", "Nothing")) if(src.loc != user) return diff --git a/code/modules/fishing/fishing_net.dm b/code/modules/fishing/fishing_net.dm index b34dfc352f..4773bae0f3 100644 --- a/code/modules/fishing/fishing_net.dm +++ b/code/modules/fishing/fishing_net.dm @@ -22,6 +22,9 @@ var/list/accepted_mobs = list(/mob/living/simple_mob/animal/passive/fish) + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/material/fishing_net/Initialize(mapload) . = ..() update_icon() @@ -58,7 +61,12 @@ return return ..() -/obj/item/material/fishing_net/attack_self(var/mob/user) +/obj/item/material/fishing_net/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE for(var/mob/M in src) M.forceMove(get_turf(src)) user.visible_message(span_notice("[user] releases [M] from \the [src]."), span_notice("You release [M] from \the [src].")) @@ -129,6 +137,8 @@ accepted_mobs = list(/mob/living/simple_mob/animal/sif/glitterfly, /mob/living/carbon/human) + special_handling = TRUE + /obj/item/material/fishing_net/butterfly_net/afterattack(var/atom/A, var/mob/user, var/proximity) if(get_dist(get_turf(src), A) > reach) return @@ -168,7 +178,10 @@ return return ..() -/obj/item/material/fishing_net/butterfly_net/attack_self(var/mob/user) +/obj/item/material/fishing_net/butterfly_net/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE for(var/mob/living/M in src) if(!user.get_inactive_hand()) //Check if the inactive hand is empty M.forceMove(get_turf(src)) diff --git a/code/modules/food/food/cans.dm b/code/modules/food/food/cans.dm index 927c9607dc..de18eef79f 100644 --- a/code/modules/food/food/cans.dm +++ b/code/modules/food/food/cans.dm @@ -6,8 +6,12 @@ pickup_sound = 'sound/items/pickup/soda.ogg' cant_chance = 1 //arbitrarily high for april fools; if it's not reverted in its entirety I suggest rolling it down to 2% or something var/shaken = 0 // How many times this can has been shaken. + is_can = TRUE /obj/item/reagent_containers/food/drinks/cans/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.a_intent == I_HURT && !is_open_container()) to_chat(user, span_warning("You shake [src].")) if(!shaken) @@ -16,7 +20,6 @@ return if(HAS_TRAIT(user, TRAIT_UNLUCKY) && prob(10)) // Because it's always funny shaken += 10 - . = ..() /obj/item/reagent_containers/food/drinks/cans/open(mob/user) . = ..() diff --git a/code/modules/food/food/condiment.dm b/code/modules/food/food/condiment.dm index fca908e44f..0977f1a4b5 100644 --- a/code/modules/food/food/condiment.dm +++ b/code/modules/food/food/condiment.dm @@ -19,9 +19,6 @@ /obj/item/reagent_containers/food/condiment/attackby(var/obj/item/W as obj, var/mob/user as mob) return -/obj/item/reagent_containers/food/condiment/attack_self(var/mob/user as mob) - return - /obj/item/reagent_containers/food/condiment/attack(var/mob/M as mob, var/mob/user as mob, var/def_zone) if(standard_feed_mob(user, M)) return diff --git a/code/modules/food/food/drinks.dm b/code/modules/food/food/drinks.dm index 324f517cea..f950b5e26b 100644 --- a/code/modules/food/food/drinks.dm +++ b/code/modules/food/food/drinks.dm @@ -16,9 +16,14 @@ var/cant_open = 0 var/cant_chance = 0 + var/is_can = FALSE + /// Yims food_can_insert_micro = TRUE + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/reagent_containers/food/drinks/Initialize(mapload) . = ..() if (prob(cant_chance)) @@ -127,8 +132,13 @@ /obj/item/reagent_containers/food/drinks/on_rag_wipe(var/obj/item/reagent_containers/glass/rag/R) wash(CLEAN_SCRUB) -/obj/item/reagent_containers/food/drinks/attack_self(mob/user as mob) - if(!is_open_container()) +/obj/item/reagent_containers/food/drinks/attack_self(mob/user, special_pass) + . = ..(user) + if(.) + return TRUE + if(special_handling && !special_pass) + return FALSE + if(!is_open_container() && !(is_can && user.a_intent == I_HURT)) open(user) /obj/item/reagent_containers/food/drinks/proc/open(mob/user) diff --git a/code/modules/food/food/drinks/bottle.dm b/code/modules/food/food/drinks/bottle.dm index 3658fbc291..b86ef2fd81 100644 --- a/code/modules/food/food/drinks/bottle.dm +++ b/code/modules/food/food/drinks/bottle.dm @@ -13,6 +13,7 @@ var/obj/item/reagent_containers/glass/rag/rag = null var/rag_underlay = "rag" var/violent_throw = FALSE + special_handling = TRUE /obj/item/reagent_containers/food/drinks/bottle/on_reagent_change() return // To suppress price updating. Bottles have their own price tags. @@ -120,11 +121,14 @@ return ..() -/obj/item/reagent_containers/food/drinks/bottle/attack_self(mob/user) +/obj/item/reagent_containers/food/drinks/bottle/attack_self(mob/user, special_pass) + . = ..(user) + if(.) + return TRUE if(rag) remove_rag(user) else - ..() + ..(user, TRUE) /obj/item/reagent_containers/food/drinks/bottle/proc/insert_rag(obj/item/reagent_containers/glass/rag/R, mob/user) if(!isGlass || rag) return diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 42b2a35b74..4551837457 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -51,6 +51,9 @@ /// Yems. food_can_insert_micro = TRUE + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/reagent_containers/food/snacks/Initialize(mapload) . = ..() if(nutriment_amt) @@ -111,7 +114,12 @@ //CHOMPAdd End qdel(src) -/obj/item/reagent_containers/food/snacks/attack_self(mob/user as mob) +/obj/item/reagent_containers/food/snacks/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(package && !user.incapacitated()) unpackage(user) @@ -1316,13 +1324,17 @@ desc = "The food of choice for the veteran. Do NOT overconsume." filling_color = "#6D6D00" heated_reagents = list(REAGENT_ID_DOCTORSDELIGHT = 5, REAGENT_ID_HYPERZINE = 0.75, REAGENT_ID_SYNAPTIZINE = 0.25) - var/has_been_heated = 0 + var/has_been_heated = FALSE + special_handling = TRUE /obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(has_been_heated) to_chat(user, span_notice("The heating chemicals have already been spent.")) return - has_been_heated = 1 + has_been_heated = TRUE user.visible_message(span_notice("[user] crushes \the [src] package."), "You crush \the [src] package and feel a comfortable heat build up. Now just to wait for it to be ready.") spawn(200) if(!QDELETED(src)) @@ -2017,12 +2029,16 @@ var/wrapped = 0 var/monkey_type = "Monkey" + special_handling = TRUE /obj/item/reagent_containers/food/snacks/monkeycube/Initialize(mapload) . = ..() reagents.add_reagent(REAGENT_ID_PROTEIN, 10) -/obj/item/reagent_containers/food/snacks/monkeycube/attack_self(mob/user as mob) +/obj/item/reagent_containers/food/snacks/monkeycube/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(wrapped) Unwrap(user) @@ -4253,8 +4269,10 @@ return ..() -/obj/item/pizzabox/attack_self( mob/user as mob ) - +/obj/item/pizzabox/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if( boxes.len > 0 ) return @@ -4265,7 +4283,7 @@ update_icon() -/obj/item/pizzabox/attackby( obj/item/I as obj, mob/user as mob ) +/obj/item/pizzabox/attackby(obj/item/I, mob/user) if( istype(I, /obj/item/pizzabox/) ) var/obj/item/pizzabox/box = I diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index a583203bf7..61fd804306 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -305,6 +305,9 @@ ..() /obj/item/deck/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE shuffle(user) @@ -388,7 +391,10 @@ pickup_sound = 'sound/items/pickup/paper.ogg' -/obj/item/pack/attack_self(var/mob/user as mob) +/obj/item/pack/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message(span_danger("[user] rips open \the [src]!")) var/obj/item/hand/H = new() @@ -451,7 +457,10 @@ if(!cards.len) qdel(src) -/obj/item/hand/attack_self(var/mob/user as mob) +/obj/item/hand/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE concealed = !concealed update_icon() user.visible_message(span_notice("\The [user] [concealed ? "conceals" : "reveals"] their hand.")) diff --git a/code/modules/games/dice.dm b/code/modules/games/dice.dm index dadf9f2fbc..12d7946407 100644 --- a/code/modules/games/dice.dm +++ b/code/modules/games/dice.dm @@ -92,6 +92,9 @@ result = 10 /obj/item/dice/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE rollDice(user, 0) /obj/item/dice/proc/rollDice(mob/user, silent = FALSE) @@ -194,8 +197,12 @@ can_hold = list( /obj/item/dice, ) + special_handling = TRUE /obj/item/storage/dicecup/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message(span_notice("[user] shakes [src]."), \ span_notice("You shake [src]."), \ span_notice("You hear dice rolling.")) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 548be2f94c..1b0134cd62 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -327,7 +327,10 @@ return TRUE return FALSE -/obj/item/holo/esword/attack_self(mob/living/user as mob) +/obj/item/holo/esword/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE active = !active if (active) force = 30 diff --git a/code/modules/holomap/mapper.dm b/code/modules/holomap/mapper.dm index 0b439d5baa..6668d11ca3 100644 --- a/code/modules/holomap/mapper.dm +++ b/code/modules/holomap/mapper.dm @@ -126,6 +126,9 @@ hide_device() /obj/item/mapping_unit/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.stat != CONSCIOUS) return @@ -414,6 +417,9 @@ icon_state = initial(icon_state) + in_list ? "_on" : "" /obj/item/holomap_beacon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!in_list) in_list = TRUE GLOB.mapping_beacons += src diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index ddcccf865f..ccdf3ac123 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -290,7 +290,10 @@ icon = 'icons/obj/apiary_bees_etc.dmi' icon_state = "apiary" -/obj/item/beehive_assembly/attack_self(var/mob/user) +/obj/item/beehive_assembly/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("You start assembling \the [src]...")) if(do_after(user, 3 SECONDS, target = src)) user.visible_message(span_notice("[user] constructs a beehive."), span_notice("You construct a beehive.")) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index e2706b5dc3..b76fa3f602 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -13,6 +13,7 @@ var/plantname var/datum/seed/seed var/potency = -1 + special_handling = TRUE /obj/item/reagent_containers/food/snacks/grown/Initialize(mapload, var/planttype) @@ -273,8 +274,10 @@ user.drop_from_inventory(src) qdel(src) -/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user as mob) - +/obj/item/reagent_containers/food/snacks/grown/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!seed) return diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 46b628eeed..56fbf5fcb9 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -13,8 +13,11 @@ pixel_x = rand(-5,5) pixel_y = rand(-5,5) -/obj/item/disk/botany/attack_self(var/mob/user as mob) - if(genes.len) +/obj/item/disk/botany/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(LAZYLEN(genes)) var/choice = tgui_alert(user, "Are you sure you want to wipe the disk?", "Xenobotany Data", list("No", "Yes")) if(src && user && genes && choice && choice == "Yes" && user.Adjacent(get_turf(src))) to_chat(user, span_filter_notice("You wipe the disk data.")) diff --git a/code/modules/hydroponics/trays/tray_tools.dm b/code/modules/hydroponics/trays/tray_tools.dm index 9c35bca89a..91e71c9e12 100644 --- a/code/modules/hydroponics/trays/tray_tools.dm +++ b/code/modules/hydroponics/trays/tray_tools.dm @@ -30,12 +30,16 @@ var/list/last_reagents pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' + special_handling = TRUE /obj/item/analyzer/plant_analyzer/Destroy() . = ..() QDEL_NULL(last_seed) /obj/item/analyzer/plant_analyzer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/analyzer/plant_analyzer/tgui_interact(mob/user, datum/tgui/ui) diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm index 36687db2af..7caa2ff468 100644 --- a/code/modules/instruments/items.dm +++ b/code/modules/instruments/items.dm @@ -36,11 +36,14 @@ return FALSE return TRUE -/obj/item/instrument/attack_self(mob/M) - if(!M.IsAdvancedToolUser()) +/obj/item/instrument/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(!user.IsAdvancedToolUser()) return - tgui_interact(M) + tgui_interact(user) /obj/item/instrument/tgui_interact(mob/user, datum/tgui/ui) return song.tgui_interact(user) diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index fe870e906b..bd4493f217 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -408,6 +408,9 @@ return ..() /obj/item/electronic_assembly/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!check_interactivity(user)) return if(opened) diff --git a/code/modules/integrated_electronics/core/assemblies/clothing.dm b/code/modules/integrated_electronics/core/assemblies/clothing.dm index 4106c2ac52..3fedc1e768 100644 --- a/code/modules/integrated_electronics/core/assemblies/clothing.dm +++ b/code/modules/integrated_electronics/core/assemblies/clothing.dm @@ -60,13 +60,18 @@ return IC.attackby(I, user) /obj/item/clothing/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE + if(helmet_handling) + return FALSE if(IC) if(IC.opened) IC.attack_self(user) else action_circuit.do_work() - else - ..() // Does most of the repeatative setup. /obj/item/clothing/proc/setup_integrated_circuit(new_type) diff --git a/code/modules/integrated_electronics/core/assemblies/device.dm b/code/modules/integrated_electronics/core/assemblies/device.dm index 6a2117ba4b..ca7ca3fe2b 100644 --- a/code/modules/integrated_electronics/core/assemblies/device.dm +++ b/code/modules/integrated_electronics/core/assemblies/device.dm @@ -6,6 +6,8 @@ var/obj/item/electronic_assembly/device/EA + special_handling = TRUE + /obj/item/assembly/electronic_assembly/Initialize(mapload) . = ..() EA = new(src) @@ -35,7 +37,10 @@ if(opened) icon_state = icon_state + "-open" -/obj/item/assembly/electronic_assembly/attack_self(mob/user as mob) +/obj/item/assembly/electronic_assembly/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(EA) EA.attack_self(user) diff --git a/code/modules/integrated_electronics/core/detailer.dm b/code/modules/integrated_electronics/core/detailer.dm index f4b06bdba6..9a44aac54a 100644 --- a/code/modules/integrated_electronics/core/detailer.dm +++ b/code/modules/integrated_electronics/core/detailer.dm @@ -63,6 +63,9 @@ return TRUE /obj/item/integrated_electronics/detailer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) // Leaving this commented out in case someone decides that this would be better as an "any color" selection system diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 0642d79da2..f2752ee342 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -124,7 +124,10 @@ dirty_items = TRUE return ..() -/obj/item/integrated_circuit_printer/attack_self(var/mob/user) +/obj/item/integrated_circuit_printer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/integrated_circuit_printer/tgui_state(mob/user) diff --git a/code/modules/integrated_electronics/core/tools.dm b/code/modules/integrated_electronics/core/tools.dm index ce60e16b2a..eec248e033 100644 --- a/code/modules/integrated_electronics/core/tools.dm +++ b/code/modules/integrated_electronics/core/tools.dm @@ -80,6 +80,9 @@ return /obj/item/integrated_electronics/wirer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE switch(mode) if(WIRE) mode = UNWIRE @@ -114,6 +117,9 @@ var/accepting_refs = 0 /obj/item/integrated_electronics/debugger/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/type_to_use = tgui_input_list(user, "Please choose a type to use.","[src] type setting", list("string","number","ref", "null")) if(!CanInteract(user, GLOB.tgui_physical_state)) return @@ -172,14 +178,6 @@ var/datum/integrated_io/selected_io = null var/mode = 0 -/obj/item/multitool/attack_self(mob/user) - if(selected_io) - selected_io = null - to_chat(user, span_notice("You clear the wired connection from the multitool.")) - else - ..() - update_icon() - /obj/item/multitool/update_icon() if(selected_io) if(buffer || connecting || connectable) diff --git a/code/modules/integrated_electronics/subtypes/manipulation.dm b/code/modules/integrated_electronics/subtypes/manipulation.dm index 50e4ecf7fb..2ebe73bfca 100644 --- a/code/modules/integrated_electronics/subtypes/manipulation.dm +++ b/code/modules/integrated_electronics/subtypes/manipulation.dm @@ -46,7 +46,10 @@ else ..() -/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user) +/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(installed_gun) installed_gun.forceMove(get_turf(src)) to_chat(user, span_notice("You slide \the [installed_gun] out of the firing mechanism.")) @@ -191,7 +194,10 @@ else ..() -/obj/item/integrated_circuit/manipulation/grenade/attack_self(var/mob/user) +/obj/item/integrated_circuit/manipulation/grenade/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(attached_grenade) user.visible_message(span_warning("\The [user] removes \an [attached_grenade] from \the [src]!"), span_notice("You remove \the [attached_grenade] from \the [src].")) user.put_in_any_hand_if_possible(attached_grenade) || attached_grenade.dropInto(loc) diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index 14286442d2..201f5e7d97 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -91,6 +91,9 @@ return /obj/item/integrated_circuit/memory/constant/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/datum/integrated_io/O = outputs[1] var/type_to_use = tgui_input_list(user, "Please choose a type to use.","[src] type setting", list("string","number","ref", "null")) if(!CanInteract(user, GLOB.tgui_physical_state)) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 7ecb025761..8ef7f2aae6 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -182,20 +182,30 @@ Book Cart End var/title // The real name of the book. var/carved = 0 // Has the book been hollowed out for use as a secret storage item? var/obj/item/store //What's in the book? + var/occult_tier = 0 //If the book is an occult book or not and how strong it is. Used for attack_self + ///Var for attack_self chain + var/special_handling = FALSE drop_sound = 'sound/items/drop/book.ogg' pickup_sound = 'sound/items/pickup/book.ogg' -/obj/item/book/attack_self(var/mob/user) +/obj/item/book/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(occult_tier) + return FALSE + if(special_handling) + return FALSE if(carved) if(store) to_chat(user, span_notice("[store] falls out of [title]!")) - store.loc = get_turf(src.loc) + store.forceMove(get_turf(src.loc)) store = null return else to_chat(user, span_notice("The pages of [title] have been cut out!")) return - if(src.dat) + if(dat) display_content(user) user.visible_message("[user] opens a book titled \"[src.title]\" and begins reading intently.") playsound(src, 'sound/bureaucracy/bookopen.ogg', 50, 1) @@ -310,6 +320,7 @@ Book Cart End /obj/item/book/bundle var/page = 1 //current page var/list/pages = list() //the contents of each page + special_handling = TRUE /obj/item/book/bundle/proc/show_content(mob/user) if(!pages.len) @@ -351,6 +362,9 @@ Book Cart End user << browse(dat, "window=[name]") /obj/item/book/bundle/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE src.show_content(user) add_fingerprint(user) update_icon() @@ -389,6 +403,9 @@ Book Cart End var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory /obj/item/barcodescanner/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE mode += 1 if(mode > 3) mode = 0 diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index a266a75b0f..5df7e92da3 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -11,6 +11,8 @@ var/static/list/codex_tree_keys = list() // static list linking codexes to the correct codex_tree. + special_handling = TRUE + /obj/item/book/codex/Initialize(mapload) tree = codex_tree_keys["[root_type]"] if(!tree) @@ -19,6 +21,9 @@ . = ..() /obj/item/book/codex/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!tree) tree = codex_tree_keys["[root_type]"] if(!tree) diff --git a/code/modules/maintenance_panels/maintpanel_stack.dm b/code/modules/maintenance_panels/maintpanel_stack.dm index 7b93ce1d61..c24c5ccd61 100644 --- a/code/modules/maintenance_panels/maintpanel_stack.dm +++ b/code/modules/maintenance_panels/maintpanel_stack.dm @@ -11,8 +11,12 @@ throw_range = 20 can_weld = TRUE no_variants = FALSE + custom_handling = TRUE -/obj/item/stack/tile/maintenance_panel/attack_self(var/mob/user) +/obj/item/stack/tile/maintenance_panel/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/turf/T = user.loc if(!user || (loc != user && !isrobot(user)) || user.stat || user.loc != T) return FALSE diff --git a/code/modules/makeup/nailpolish.dm b/code/modules/makeup/nailpolish.dm index 80322329fc..f5d61913a2 100644 --- a/code/modules/makeup/nailpolish.dm +++ b/code/modules/makeup/nailpolish.dm @@ -25,7 +25,10 @@ desc = "Nail polish, " + initial(desc) update_icon() -/obj/item/nailpolish/attack_self(var/mob/user) +/obj/item/nailpolish/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE open = !open to_chat(user, span_notice("You [open ? "open" : "close"] \the [src].")) update_icon() @@ -100,7 +103,10 @@ icon_state = "nailpolishremover" var/open = FALSE -/obj/item/nailpolish_remover/attack_self(var/mob/user) +/obj/item/nailpolish_remover/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE open = !open to_chat(user, span_notice("You [open ? "open" : "close"] \the [src].")) update_icon() diff --git a/code/modules/materials/sheets/_sheets.dm b/code/modules/materials/sheets/_sheets.dm index 1d21169f7e..28637c5ea9 100644 --- a/code/modules/materials/sheets/_sheets.dm +++ b/code/modules/materials/sheets/_sheets.dm @@ -21,6 +21,7 @@ var/apply_colour //temp pending icon rewrite drop_sound = 'sound/items/drop/axe.ogg' pickup_sound = 'sound/items/pickup/axe.ogg' + custom_handling = TRUE /obj/item/stack/material/Initialize(mapload) . = ..() @@ -90,9 +91,12 @@ M.update_strings() return transfer -/obj/item/stack/material/attack_self(var/mob/user) +/obj/item/stack/material/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!material.build_windows(user, src)) - ..() + tgui_interact(user) /obj/item/stack/material/attackby(var/obj/item/W, var/mob/user) if(istype(W,/obj/item/stack/cable_coil)) diff --git a/code/modules/materials/sheets/organic/animal_products.dm b/code/modules/materials/sheets/organic/animal_products.dm index dcb588954a..28369e6ad1 100644 --- a/code/modules/materials/sheets/organic/animal_products.dm +++ b/code/modules/materials/sheets/organic/animal_products.dm @@ -158,9 +158,13 @@ desc = "A collar made out of pliable material." icon_state = "collar_handmade" var/given_name + special_handling = TRUE /obj/item/clothing/glasses/sunglasses/blindfold/whiteblindfold/craftable name = "handmade blindfold" desc = "A handmade blindfold that covers the eyes, preventing sight." -/obj/item/clothing/accessory/collar/craftable/attack_self(mob/living/user) +/obj/item/clothing/accessory/collar/craftable/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE given_name = sanitizeSafe(tgui_input_text(user, "What would you like to label the collar?", "Collar Labelling", null, MAX_NAME_LEN, encode = FALSE), MAX_NAME_LEN) diff --git a/code/modules/media/walkpod.dm b/code/modules/media/walkpod.dm index c9070d796f..769119ea2e 100644 --- a/code/modules/media/walkpod.dm +++ b/code/modules/media/walkpod.dm @@ -75,12 +75,15 @@ else if(loc == L) // at least they're holding it to_chat(L, span_warning("Turn on the [src] first.")) -/obj/item/walkpod/attack_self(mob/living/L) - if(!istype(L) || loc != L) +/obj/item/walkpod/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(!istype(user) || loc != user) return if(!listener) - set_listener(L) - tgui_interact(L) + set_listener(user) + tgui_interact(user) // Process ticks to ensure our listener remains valid and we do music-ing /obj/item/walkpod/process() diff --git a/code/modules/mining/drilling/scanner.dm b/code/modules/mining/drilling/scanner.dm index bbc1eb0f43..274d9ae180 100644 --- a/code/modules/mining/drilling/scanner.dm +++ b/code/modules/mining/drilling/scanner.dm @@ -10,7 +10,10 @@ var/range = 2 var/exact = FALSE -/obj/item/mining_scanner/attack_self(mob/user as mob) +/obj/item/mining_scanner/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("You begin sweeping \the [src] about, scanning for metal deposits.")) playsound(src, 'sound/items/goggles_charge.ogg', 50, 1, -6) diff --git a/code/modules/mining/fulton.dm b/code/modules/mining/fulton.dm index 6e84da0777..253cb4d721 100644 --- a/code/modules/mining/fulton.dm +++ b/code/modules/mining/fulton.dm @@ -15,6 +15,9 @@ . += "It has [uses_left] use\s remaining." /obj/item/extraction_pack/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/list/possible_beacons = list() for(var/obj/structure/extraction_point/EP as anything in GLOB.total_extraction_beacons) if(EP.beacon_network in beacon_networks) @@ -143,6 +146,11 @@ icon_state = "extraction_pointoff" /obj/item/fulton_core/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + var/turf/T = get_turf(user) + var/outdoors = T.is_outdoors() if(do_after(user, 1.5 SECONDS, target = user) && !QDELETED(src)) new /obj/structure/extraction_point(get_turf(user)) qdel(src) diff --git a/code/modules/mining/kinetic_crusher.dm b/code/modules/mining/kinetic_crusher.dm index e315ea0f89..08e428f5b6 100644 --- a/code/modules/mining/kinetic_crusher.dm +++ b/code/modules/mining/kinetic_crusher.dm @@ -246,6 +246,9 @@ STOP_PROCESSING(SSprocessing, src) /obj/item/kinetic_crusher/machete/gauntlets/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE ready_toggle() /obj/item/kinetic_crusher/machete/gauntlets/process() diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 9126121077..4573f290de 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -210,6 +210,7 @@ icon = 'icons/obj/mining.dmi' var/upright = 0 var/base_state + custom_handling = TRUE /obj/item/stack/flag/Initialize(mapload) . = ..() @@ -251,7 +252,10 @@ else ..() -/obj/item/stack/flag/attack_self(mob/user as mob) +/obj/item/stack/flag/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/obj/item/stack/flag/F = locate() in get_turf(src) @@ -273,7 +277,7 @@ newflag.visible_message(span_infoplain(span_bold("[user]") + " plants [newflag] firmly in the ground.")) src.use(1) -// Lightpoles for lumber colony +// Lightpoles for lumber colony //CHOMPEdit Start /obj/item/stack/lightpole name = "Trailblazers" desc = "Some colourful trail lights." @@ -285,6 +289,7 @@ var/base_state var/on = 0 var/brightness_on = 4 //luminosity when on + custom_handling = TRUE /obj/item/stack/lightpole/Initialize(mapload) . = ..() @@ -318,7 +323,9 @@ ..() /obj/item/stack/lightpole/attack_self(mob/user as mob) - + . = ..(user) + if(.) + return TRUE var/obj/item/stack/lightpole/F = locate() in get_turf(src) var/turf/T = get_turf(src) @@ -340,3 +347,4 @@ newlightpole.icon_state = "[newlightpole.base_state]_on" newlightpole.visible_message("[user] plants [newlightpole] firmly in the ground.") src.use(1) +//CHOMPEdit End diff --git a/code/modules/mining/resonator.dm b/code/modules/mining/resonator.dm index 5c683ee953..d38491721e 100644 --- a/code/modules/mining/resonator.dm +++ b/code/modules/mining/resonator.dm @@ -85,6 +85,9 @@ fieldsactive-- /obj/item/resonator/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE switch(tgui_alert(user, "Change Detonation Time or toggle Cascading?","Setting", list("Toggle Cascade", "Resonance Time"))) if("Resonance Time") if(burst_time == 50) diff --git a/code/modules/mining/shelter_atoms_vr.dm b/code/modules/mining/shelter_atoms_vr.dm index a149ed515b..034a1b18ef 100644 --- a/code/modules/mining/shelter_atoms_vr.dm +++ b/code/modules/mining/shelter_atoms_vr.dm @@ -180,6 +180,9 @@ GLOBAL_LIST_EMPTY(unique_deployable) // CHOMPEdit Start /obj/item/survivalcapsule/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE //Can't grab when capsule is New() because templates aren't loaded then if(istype(get_area(user), /area/vr)) to_chat(user, span_danger("\The [src] does not appear to work in VR! This is useless to you!")) diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 020e2d2a36..3db9285061 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -20,6 +20,9 @@ var/obj/item/radio/headset/mmi_radio/radio = null//Let's give it a radio. var/mob/living/body_backup = null //add reforming + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/mmi/Initialize(mapload) . = ..() radio = new(src)//Spawns a radio inside the MMI. @@ -98,7 +101,12 @@ ..() //TODO: ORGAN REMOVAL UPDATE. Make the brain remain in the MMI so it doesn't lose organ data. -/obj/item/mmi/attack_self(mob/user as mob) +/obj/item/mmi/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(!brainmob) to_chat(user, span_warning("You upend the MMI, but there's nothing in it.")) else if(locked) @@ -187,6 +195,9 @@ mecha = null//This does not appear to be used outside of reference in mecha.dm. var/ghost_query_type = null var/datum/ghost_query/Q //This is used so we can unregister ourself. + special_handling = TRUE + ///Var for attack_self chain + var/is_digital_robot = FALSE /obj/item/mmi/digital/Initialize(mapload) . = ..() @@ -226,7 +237,12 @@ H.mind.transfer_to(brainmob) return -/obj/item/mmi/digital/attack_self(mob/user as mob) +/obj/item/mmi/digital/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(is_digital_robot) + return FALSE if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. to_chat(user, span_blue("You carefully locate the manual activation switch and start the [src]'s boot process.")) @@ -288,6 +304,7 @@ w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 3, TECH_DATA = 4) ghost_query_type = /datum/ghost_query/drone_brain + is_digital_robot = TRUE /obj/item/mmi/digital/robot/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index ac5337dcf1..a9c898f035 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -11,9 +11,13 @@ req_access = list(ACCESS_ROBOTICS) locked = 0 mecha = null//This does not appear to be used outside of reference in mecha.dm. + is_digital_robot = TRUE /obj/item/mmi/digital/posibrain/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(brainmob && !brainmob.key && searching == 0) //Start the process of searching for a new user. to_chat(user, span_blue("You carefully locate the manual activation switch and start the positronic brain's boot process.")) diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index 897138b2c0..ca37f689a3 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -5,6 +5,7 @@ icon_state = "mainboard" w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 3, TECH_DATA = 4) + is_digital_robot = TRUE /obj/item/mmi/digital/robot/Initialize(mapload) . = ..() @@ -18,6 +19,3 @@ brainmob.mind.assigned_role = JOB_ROBOTIC_INTELLIGENCE to_chat(brainmob, span_notify("You feel slightly disoriented. That's normal when you're little more than a complex circuit.")) return - -/obj/item/mmi/digital/robot/attack_self(mob/user) - return //This object is technically a brain, and should not be dumping brains out of itself like its parent object does. diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 230a6ffdb3..8295ea7e01 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -285,7 +285,7 @@ msg += "[p_Theyre()] very short!" if (src.stat || (status_flags & FAKEDEATH)) - msg += span_warning("[p_Theyre()] not responding to anything around [p_they()] and seems to be asleep.") + msg += span_warning("[p_Theyre()] not responding to anything around [p_them()] and seems to be asleep.") var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] if(((stat == DEAD || losebreath || !L || (status_flags & FAKEDEATH)) && get_dist(user, src) <= 3)) msg += span_warning("[p_They()] [user.p_do()] not appear to be breathing.") diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm index 70061a86a5..fd0111be9f 100644 --- a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm +++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm @@ -130,7 +130,10 @@ icon_state = "face" var/mob/living/homunculus = 0 -/obj/item/glamour_face/attack_self(var/mob/user) +/obj/item/glamour_face/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!homunculus) var/list/targets = list() for(var/mob/living/carbon/human/M in GLOB.mob_list) @@ -357,6 +360,9 @@ ) /obj/item/glamour_unstable/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/M = user if(!istype(M)) return diff --git a/code/modules/mob/living/silicon/robot/cloak.dm b/code/modules/mob/living/silicon/robot/cloak.dm index 75278638a6..89cac9d658 100644 --- a/code/modules/mob/living/silicon/robot/cloak.dm +++ b/code/modules/mob/living/silicon/robot/cloak.dm @@ -17,6 +17,9 @@ . = ..() /obj/item/borg/cloak/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE set_cloak_level(user) /obj/item/borg/cloak/item_ctrl_click(mob/user) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_defense_modules.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_defense_modules.dm index 1291279f98..2e1a6daf39 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_defense_modules.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_defense_modules.dm @@ -26,6 +26,9 @@ flags = NOBLUDGEON /obj/item/self_repair_system/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(repairing) return var/mob/living/silicon/robot/R = user diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm index 0f04491e27..e3952839a5 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules.dm @@ -11,6 +11,9 @@ flags = NOBLUDGEON //No more attack messages /obj/item/boop_module/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if (!( istype(user.loc, /turf) )) return @@ -135,6 +138,9 @@ flags = NOBLUDGEON //No more attack messages /obj/item/robot_tongue/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/silicon/robot/R = user if(R.emagged || R.emag_items) emagged = !emagged @@ -282,6 +288,9 @@ flags = NOBLUDGEON /obj/item/pupscrubber/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/silicon/robot/R = user if(!enabled) R.scrubbing = TRUE @@ -299,9 +308,12 @@ uses = 10 var/cooldown = 0 var/datum/matter_synth/glass = null + special_handling = TRUE /obj/item/lightreplacer/dogborg/attack_self(mob/user)//Recharger refill is so last season. Now we recycle without magic! - + . = ..(user) + if(.) + return TRUE var/choice = tgui_alert(user, "Do you wish to check the reserves or change the color?", "Selection List", list("Reserves", "Color")) if(!choice) return @@ -386,6 +398,9 @@ flags = NOBLUDGEON /obj/item/dogborg/pounce/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/silicon/robot/R = user R.leap(bluespace) diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm index ed542f47fb..3f091e7d85 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper.dm @@ -223,8 +223,9 @@ hound.cell.charge = hound.cell.charge - amt /obj/item/dogborg/sleeper/attack_self(mob/user) - if(..()) - return + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/dogborg/sleeper/tgui_state(mob/user) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index b22e1b4023..9031f56885 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -148,9 +148,13 @@ desc = "A black ink printing attachment with a paper naming mode." name = "Printing Pen" var/mode = 1 + special_handling = TRUE + /obj/item/pen/robopen/attack_self(mob/user) - + . = ..(user) + if(.) + return TRUE var/choice = tgui_alert(user, "Would you like to change colour or mode?", "Change What?", list("Colour","Mode","Cancel")) if(!choice || choice == "Cancel") return @@ -213,6 +217,9 @@ deploy_paper(user) /obj/item/form_printer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE deploy_paper(user) /obj/item/form_printer/proc/deploy_paper(mob/user) @@ -490,6 +497,9 @@ . = ..() /obj/item/borg/combat/shield/attack_self(var/mob/living/user) + . = ..(user) + if(.) + return TRUE set_shield_level() /obj/item/borg/combat/shield/process() @@ -562,6 +572,9 @@ . += "It is set to deploy [mode ? "doors" : "walls"]" /obj/item/inflatable_dispenser/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE mode = !mode to_chat(user, span_filter_notice("You set \the [src] to deploy [mode ? "doors" : "walls"].")) @@ -643,7 +656,7 @@ icon_state = "setup_device_box" /obj/item/robo_dice/attack_self(mob/user) - . = ..() + . = ..(user) var/DI = 'icons/obj/dice.dmi' var/dice_options = list( "roll a custom die" = image(icon = 'icons/obj/integrated_electronics/electronic_setups.dmi', icon_state = "setup_device_box"), diff --git a/code/modules/mob/living/silicon/robot/robot_simple_items.dm b/code/modules/mob/living/silicon/robot/robot_simple_items.dm index c7e9224eec..10384e2f36 100644 --- a/code/modules/mob/living/silicon/robot/robot_simple_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_simple_items.dm @@ -87,6 +87,9 @@ /obj/item/robotic_multibelt/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!cyborg_integrated_tools || !LAZYLEN(cyborg_integrated_tools)) to_chat(user, "Your multibelt is empty!") return @@ -107,8 +110,6 @@ cut_overlays() assume_selected_item(integrated_tools_by_name[choice]) - ..() - /obj/item/robotic_multibelt/proc/assume_selected_item(obj/item/chosen_item) if(!chosen_item) return @@ -219,8 +220,12 @@ matter = null uses_charge = 1 charge_costs = list(1) + custom_handling = TRUE /obj/item/stack/cable_coil/cyborg/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE set_colour(user) /obj/item/stack/cable_coil/cyborg/proc/set_colour(mob/user) @@ -560,6 +565,9 @@ pickup_sound = 'sound/items/pickup/device.ogg' drop_sound = 'sound/items/drop/device.ogg' + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/storage/internal/gripper max_w_class = ITEMSIZE_HUGE max_storage_space = ITEMSIZE_COST_HUGE @@ -662,6 +670,11 @@ photo_images["[pocket_to_check.name]" + "[pocket_content.name]"] = pocket_image /obj/item/gripper/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE var/busy = is_in_use() if(busy) to_chat(user, span_danger("[busy]")) @@ -1097,9 +1110,14 @@ can_hold = list(EXOSUIT_GRIPPER) + special_handling = TRUE + /obj/item/gripper/no_use //Used when you want to hold and put items in other things, but not able to 'use' the item -/obj/item/gripper/no_use/attack_self(mob/user as mob) +/obj/item/gripper/no_use/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE return /obj/item/gripper/no_use/loader //This is used to disallow building with metal. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother.dm index c36fdb85e5..0d50e2f6b0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/broodmother.dm @@ -172,7 +172,10 @@ origin_tech = list(TECH_BIO = 10) -/obj/item/royal_spider_egg/attack_self(mob/user as mob) +/obj/item/royal_spider_egg/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/response = tgui_alert(user, "Are you sure you want to release the royal spiderling right now? It appears ready to imprint the moment its born.", "Royal Spider Egg", list("Yes", "No")) if(response == "Yes") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm index 9cfe40f2e0..015be45c36 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm @@ -12,11 +12,14 @@ movement_cooldown = 5 universal_understand = 1 -/obj/item/holder/mouse/attack_self(var/mob/U) +/obj/item/holder/mouse/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE for(var/mob/living/simple_mob/M in contents) - if((I_HELP) && U.checkClickCooldown()) //a little snowflakey, but makes it use the same cooldown as interacting with non-inventory objects - U.setClickCooldown(U.get_attack_speed()) //if there's a cleaner way in baycode, I'll change this - U.visible_message(span_notice("[U] [M.response_help] \the [M].")) + if((I_HELP) && user.checkClickCooldown()) //a little snowflakey, but makes it use the same cooldown as interacting with non-inventory objects + user.setClickCooldown(user.get_attack_speed()) //if there's a cleaner way in baycode, I'll change this + user.visible_message(span_notice("[user] [M.response_help] \the [M].")) //Jank grabber that uses the 'attack_hand' insead of 'MouseDrop' /mob/living/simple_mob/animal/passive/mouse/attack_hand(mob/user) @@ -60,6 +63,9 @@ . = ..(mapload, TRUE) /obj/item/holder/mouse/attack_self(mob/living/carbon/user) + . = ..(user) + if(.) + return TRUE user.setClickCooldown(user.get_attack_speed()) for(var/L in contents) if(isanimal(L)) 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 2a985edf7e..d42f1e147a 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 @@ -277,7 +277,10 @@ var/list/_cat_default_emotes = list( icon_state = "box" var/cattype = /mob/living/simple_mob/animal/passive/cat -/obj/item/cat_box/attack_self(var/mob/user) +/obj/item/cat_box/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/turf/catturf = get_turf(src) to_chat(user, span_notice("You peek into \the [name]-- and a cat jumps out!")) new cattype(catturf) diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm b/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm index 056b4c6b0f..367fdbd4c5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/plants/pitcher.dm @@ -300,6 +300,7 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( w_class = ITEMSIZE_SMALL var/datum/seed/seed = null var/obj/item/seeds/pit = null + special_handling = TRUE /obj/item/reagent_containers/food/snacks/pitcher_fruit/Initialize(mapload) . = ..() @@ -324,6 +325,9 @@ GLOBAL_LIST_INIT(pitcher_plant_lure_messages, list( qdel(src) /obj/item/reagent_containers/food/snacks/pitcher_fruit/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("You plant the fruit.")) new /obj/machinery/portable_atmospherics/hydroponics/soil/invisible(get_turf(user),src.seed) GLOB.seed_planted_shift_roundstat++ diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 8867ccf584..a4b6421105 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -178,7 +178,10 @@ assailant.visible_message(span_warning("[assailant] sits on [target]'s face!")) //VOREStation Edit End -/obj/item/grab/attack_self() +/obj/item/grab/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE return s_click(hud) diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index d0f72e6739..7ecc9f7851 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -114,7 +114,10 @@ return ..() // On-click handling. Turns on the computer if it's off and opens the GUI. -/obj/item/modular_computer/attack_self(var/mob/user) +/obj/item/modular_computer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(enabled && screen_on) if(isliving(user) && HAS_TRAIT(user, TRAIT_UNLUCKY) && prob(5)) var/mob/living/unlucky_soul = user diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm index 2151b9e9a7..eca5f3820f 100644 --- a/code/modules/multiz/hoist.dm +++ b/code/modules/multiz/hoist.dm @@ -11,6 +11,9 @@ icon_state = "hoist_case" /obj/item/hoist_kit/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE new /obj/structure/hoist (get_turf(user), user.dir) user.visible_message(span_warning("[user] deploys the hoist kit!"), span_notice("You deploy the hoist kit!"), span_notice("You hear the sound of parts snapping into place.")) qdel(src) diff --git a/code/modules/news/new_newspaper.dm b/code/modules/news/new_newspaper.dm index 6cda84a3c8..83f5ecbb87 100644 --- a/code/modules/news/new_newspaper.dm +++ b/code/modules/news/new_newspaper.dm @@ -19,7 +19,10 @@ drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' -obj/item/newspaper/attack_self(mob/user) +/obj/item/newspaper/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/dat diff --git a/code/modules/news/newspaper.dm b/code/modules/news/newspaper.dm index 65afe4952c..13b1130e15 100644 --- a/code/modules/news/newspaper.dm +++ b/code/modules/news/newspaper.dm @@ -19,7 +19,10 @@ drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' -/obj/item/newspaper/attack_self(mob/user as mob) +/obj/item/newspaper/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/dat diff --git a/code/modules/nifsoft/nifsoft.dm b/code/modules/nifsoft/nifsoft.dm index e7280e2154..38d06497c2 100644 --- a/code/modules/nifsoft/nifsoft.dm +++ b/code/modules/nifsoft/nifsoft.dm @@ -267,6 +267,9 @@ ..(A,user,flag,params) /obj/item/disk/nifsoft/compliance/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/newlaws = tgui_input_text(user, "Please Input Laws", "Compliance Laws", laws, 2048, TRUE, prevent_enter = TRUE) if(newlaws) to_chat(user,span_filter_notice("You set the laws to:
" + span_notice("[newlaws]"))) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index 090305ae12..76460c52b0 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -47,6 +47,9 @@ var/list/organ_cache = list() var/meat_type // What does butchering, if possible, make? var/list/medical_issues = list() + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/organ/Destroy() handle_organ_mod_special(TRUE) @@ -482,7 +485,13 @@ var/list/organ_cache = list() user.put_in_active_hand(O) qdel(src) -/obj/item/organ/attack_self(mob/user as mob) +/obj/item/organ/attack_self(mob/user, callback) + . = ..(user) + if(.) + return TRUE + + if(special_handling && !callback) + return FALSE // Convert it to an edible form, yum yum. if(!(robotic >= ORGAN_ROBOT) && user.a_intent == I_HELP && user.zone_sel.selecting == O_MOUTH) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 2b4250bd7b..71787fbc28 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -87,6 +87,8 @@ // HUD element variable, see organ_icon.dm get_damage_hud_image() var/image/hud_damage_image + special_handling = TRUE + /obj/item/organ/external/Destroy() if(parent && parent.children) @@ -148,9 +150,12 @@ if(burn_damage) take_damage(0, burn_damage) -/obj/item/organ/external/attack_self(var/mob/living/user) +/obj/item/organ/external/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(!contents.len) - return ..() + return ..(user, TRUE) var/list/removable_objects = list() for(var/obj/item/organ/external/E in (contents + src)) if(!istype(E)) @@ -166,7 +171,7 @@ user.put_in_hands(I) user.visible_message(span_danger("\The [user] rips \the [I] out of \the [src]!")) return //no eating the limb until everything's been removed - return ..() + return ..(user, TRUE) /obj/item/organ/external/examine(mob/user) . = ..() diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 9c45771b1b..ac83f1a9c9 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -68,6 +68,9 @@ to_chat(user, span_notice("You clip the [P] onto \the [src].")) /obj/item/clipboard/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/dat = "Clipboard" if(haspen) dat += "Remove Pen

" diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index ea8257edac..14bb34053e 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -82,7 +82,10 @@ update_icon() to_chat(user, span_notice("You tuck the [P] into \the [src].")) -/obj/item/folder/attack_self(mob/user as mob) +/obj/item/folder/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/dat = "[name]" for(var/obj/item/paper/P in src) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 8b1fabe8a6..223e44802a 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -67,7 +67,10 @@ span_notice("You label [A] as [label].")) A.name = "[A.name] ([label])" -/obj/item/hand_labeler/attack_self(mob/user as mob) +/obj/item/hand_labeler/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE mode = !mode icon_state = "labeler[mode]" if(mode) diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 442756cc64..c9b916401f 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -36,6 +36,9 @@ var/age = 0 var/last_modified_ckey + ///Occult check. Used for do_after + var/occult = FALSE + var/was_maploaded = FALSE // This tracks if the paper was created on mapload. var/const/deffont = "Verdana" @@ -174,7 +177,12 @@ add_fingerprint(usr) return -/obj/item/paper/attack_self(mob/living/user as mob) +/obj/item/paper/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(occult) + return if(user.a_intent == I_HURT) if(icon_state == "scrap") user.show_message(span_warning("\The [src] is already crumpled.")) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index fb03276828..0492fdeb57 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -139,6 +139,9 @@ + "", "window=[name]") /obj/item/paper_bundle/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE src.show_content(user) add_fingerprint(user) update_icon() diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index e7acf13213..7b0e6cd866 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -45,6 +45,9 @@ add_overlay(stampoverlay) /obj/item/paperplane/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("You unfold [src].")) var/atom/movable/internal_paper_tmp = internalPaper internal_paper_tmp.forceMove(loc) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 2a94a46865..03024b71ec 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -31,10 +31,21 @@ pressure_resistance = 2 drop_sound = 'sound/items/drop/accessory.ogg' pickup_sound = 'sound/items/pickup/accessory.ogg' + var/can_click = TRUE -/obj/item/pen/attack_self(var/mob/user) + ///Var for attack_self chain + var/special_handling = FALSE + +/obj/item/pen/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(!user.checkClickCooldown()) return + if(!can_click) + return user.setClickCooldown(1 SECOND) to_chat(user, span_notice("Click.")) playsound(src, 'sound/items/penclick.ogg', 50, 1) @@ -99,6 +110,7 @@ desc = "It's a pen with multiple colors of ink!" var/selectedColor = 1 var/colors = list("black","blue","red") + special_handling = TRUE /obj/item/pen/click_alt(mob/user) if(!Adjacent(user)) @@ -107,6 +119,9 @@ playsound(src, 'sound/items/penclick.ogg', 50, 1) /obj/item/pen/multi/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(++selectedColor > 3) selectedColor = 1 @@ -270,8 +285,12 @@ */ /obj/item/pen/chameleon var/signature = "" + special_handling = TRUE /obj/item/pen/chameleon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE /* // Limit signatures to official crew members var/personnel_list[] = list() @@ -338,6 +357,8 @@ var/colourName = "red" //for updateIcon purposes drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' + can_click = FALSE + special_handling = TRUE /obj/item/pen/crayon/Initialize(mapload) . = ..() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 6aea67c920..e72dab954d 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -41,7 +41,10 @@ GLOBAL_VAR_INIT(photo_count, 0) . = ..() id = GLOB.photo_count++ -/obj/item/photo/attack_self(mob/user as mob) +/obj/item/photo/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.examinate(src) /obj/item/photo/attackby(obj/item/P as obj, mob/user as mob) @@ -148,7 +151,10 @@ GLOBAL_VAR_INIT(photo_count, 0) /obj/item/camera/attack(mob/living/carbon/human/M as mob, mob/user as mob) return -/obj/item/camera/attack_self(mob/user as mob) +/obj/item/camera/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE on = !on if(on) src.icon_state = icon_on diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index e8d16abe62..e32c3a75f3 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -102,7 +102,10 @@ icon_state = "stamp-zenghu" // Syndicate stamp to forge documents. -/obj/item/stamp/chameleon/attack_self(mob/user as mob) +/obj/item/stamp/chameleon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/list/stamp_types = typesof(/obj/item/stamp) - src.type // Get all stamp types except our own var/list/stamps = list() diff --git a/code/modules/pda/ai.dm b/code/modules/pda/ai.dm index 87addbd517..f1e703ffde 100644 --- a/code/modules/pda/ai.dm +++ b/code/modules/pda/ai.dm @@ -3,13 +3,14 @@ /obj/item/pda/ai icon_state = "NONE" ttone = "data" - detonate = 0 + detonate = FALSE touch_silent = TRUE programs = list( new/datum/data/pda/app/main_menu, new/datum/data/pda/app/notekeeper, new/datum/data/pda/app/news, new/datum/data/pda/app/messenger) + special_handling = TRUE /obj/item/pda/ai/proc/set_name_and_job(newname as text, newjob as text, newrank as null|text) owner = newname @@ -33,7 +34,10 @@ /obj/item/pda/ai/can_use() return 1 -/obj/item/pda/ai/attack_self(mob/user as mob) +/obj/item/pda/ai/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if ((honkamt > 0) && (prob(60)))//For clown virus. honkamt-- playsound(src, 'sound/items/bikehorn.ogg', 30, 1) diff --git a/code/modules/pda/cart_vr.dm b/code/modules/pda/cart_vr.dm index fd42bde4a1..6c39989d20 100644 --- a/code/modules/pda/cart_vr.dm +++ b/code/modules/pda/cart_vr.dm @@ -45,6 +45,9 @@ ..(over_object) /obj/item/cartridge/storage/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_notice("You empty [src].")) var/turf/T = get_turf(src) hold.hide_from(user) diff --git a/code/modules/pda/pda.dm b/code/modules/pda/pda.dm index 4a44a02790..7cbdfdd404 100644 --- a/code/modules/pda/pda.dm +++ b/code/modules/pda/pda.dm @@ -55,6 +55,9 @@ var/list/notifying_programs = list() var/retro_mode = 0 + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/pda/examine(mob/user) . = ..() if(Adjacent(user)) @@ -183,7 +186,12 @@ /obj/item/pda/proc/close(mob/user) SStgui.close_uis(src) -/obj/item/pda/attack_self(mob/user as mob) +/obj/item/pda/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(active_uplink_check(user)) return diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm index df147ffc10..7ad4206cdd 100644 --- a/code/modules/power/cells/device_cells.dm +++ b/code/modules/power/cells/device_cells.dm @@ -151,7 +151,10 @@ /obj/item/cell/device/weapon/recharge/alien/update_icon() return // No overlays please. -/obj/item/cell/device/weapon/recharge/alien/attack_self(var/mob/user) +/obj/item/cell/device/weapon/recharge/alien/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!swaps_to) return user.remove_from_mob(src) diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index 55293b41aa..154e24fec0 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -270,7 +270,10 @@ var/swaps_to = /obj/item/cell/device/weapon/recharge/alien robot_durability = 100 -/obj/item/cell/void/attack_self(var/mob/user) +/obj/item/cell/void/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.remove_from_mob(src) to_chat(user, span_notice("You swap [src] to 'device cell' mode.")) var/obj/item/cell/newcell = new swaps_to(null) diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 3439342c74..ef1548ebb4 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -173,6 +173,9 @@ // This dumps all the bullets right on the floor /obj/item/ammo_magazine/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(can_remove_ammo) if(!stored_ammo.len) to_chat(user, span_notice("[src] is already empty!")) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index db3a22c4b3..399c9b8b20 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -97,7 +97,6 @@ var/recoil_mode = 1 //If the gun will hurt micros if shot or not. Disabled on Virgo, used downstream. //CHOMPEDIT - Enabled var/mounted_gun = 0 //If the gun is mounted within a rigsuit or elsewhere. This makes it so the gun can be shot even if it's loc != a mob -//VOREStation Add - /tg/ icon system var/charge_sections = 4 var/shaded_charge = FALSE var/ammo_x_offset = 2 @@ -109,6 +108,9 @@ var/flight_x_offset = 0 var/flight_y_offset = 0 + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/gun/item_ctrl_click(mob/user) if(can_flashlight && ishuman(user) && loc == user && !user.incapacitated(INCAPACITATION_ALL)) toggle_flashlight() @@ -785,6 +787,11 @@ return new_mode /obj/item/gun/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE switch_firemodes(user) /* TGMC Ammo HUD Port Begin */ diff --git a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm index 00a8336591..f90c753a31 100644 --- a/code/modules/projectiles/guns/energy/bsharpoon_vr.dm +++ b/code/modules/projectiles/guns/energy/bsharpoon_vr.dm @@ -200,10 +200,13 @@ to_chat(M, span_vnotice("You materialize around [living_user] as they end up in your [belly_dest]!")) -/obj/item/bluespace_harpoon/attack_self(mob/living/user as mob) - return chande_fire_mode(user) +/obj/item/bluespace_harpoon/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + return change_fire_mode(user) -/obj/item/bluespace_harpoon/verb/chande_fire_mode(mob/user as mob) +/obj/item/bluespace_harpoon/verb/change_fire_mode(mob/user) set name = "Change Fire Mode" set category = "Object" set src in range(0) diff --git a/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm b/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm index 127d0853c3..a23e6f5f89 100644 --- a/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm +++ b/code/modules/projectiles/guns/energy/cell_loaded_vr/cell_loaded.dm @@ -28,6 +28,9 @@ var/max_charge = 0 charge_sections = 5 + special_handling = TRUE + special_weapon_handling = TRUE + /obj/item/gun/projectile/cell_loaded/consume_next_projectile() if(chambered && ammo_magazine) var/obj/item/ammo_casing/microbattery/batt = chambered @@ -71,6 +74,9 @@ M?.hud_used.update_ammo_hud(M, src) /obj/item/gun/projectile/cell_loaded/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!chambered) return diff --git a/code/modules/projectiles/guns/energy/cyborg.dm b/code/modules/projectiles/guns/energy/cyborg.dm index 8307fa1362..66a1784253 100644 --- a/code/modules/projectiles/guns/energy/cyborg.dm +++ b/code/modules/projectiles/guns/energy/cyborg.dm @@ -174,6 +174,9 @@ attack_verb = list("nibbled", "bit", "gnawed", "chomped", "nommed") var/emagged = 0 /obj/item/melee/robotic/jaws/small/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/silicon/robot/R = user if(R.emagged || R.emag_items) emagged = !emagged @@ -301,6 +304,9 @@ var/lcolor = "#38e541" /obj/item/melee/robotic/blade/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(active) //turning off playsound(src, 'sound/weapons/saberoff.ogg', 50, 1) force = 0 @@ -440,6 +446,9 @@ return /obj/item/melee/robotic/baton/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE status = !status to_chat(user, span_notice("[src] is now [status ? "on" : "off"].")) playsound(src, "sparks", 75, 1, -1) diff --git a/code/modules/projectiles/guns/energy/gunsword_vr.dm b/code/modules/projectiles/guns/energy/gunsword_vr.dm index c4f8cfca97..371c46fd5a 100644 --- a/code/modules/projectiles/guns/energy/gunsword_vr.dm +++ b/code/modules/projectiles/guns/energy/gunsword_vr.dm @@ -95,7 +95,10 @@ attack_verb = null -/obj/item/cell/device/weapon/gunsword/attack_self(mob/living/user as mob) +/obj/item/cell/device/weapon/gunsword/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if (active) if ((CLUMSY in user.mutations) && prob(50)) user.visible_message(span_danger("\The [user] accidentally cuts [user.p_themselves()] with \the [src]."),\ diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm index 14b51adba6..f190ed5316 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm @@ -727,6 +727,9 @@ desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color." /obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE bolt_color = tgui_color_picker(user,"","Choose Color",bolt_color) #undef KA_ENVIRO_TYPE_COLD diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm index 516599427b..b951265759 100644 --- a/code/modules/projectiles/guns/energy/pulse.dm +++ b/code/modules/projectiles/guns/energy/pulse.dm @@ -36,8 +36,12 @@ projectile_type=/obj/item/projectile/beam/pulse charge_cost = 120 fire_delay = 12 + special_handling = TRUE -/obj/item/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob) +/obj/item/gun/energy/pulse_rifle/destroyer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE to_chat(user, span_warning("[src.name] has three settings, and they are all DESTROY.")) /* diff --git a/code/modules/projectiles/guns/launcher/bows.dm b/code/modules/projectiles/guns/launcher/bows.dm index 4450354796..a4e1515962 100644 --- a/code/modules/projectiles/guns/launcher/bows.dm +++ b/code/modules/projectiles/guns/launcher/bows.dm @@ -46,6 +46,10 @@ release_force = 20 release_speed = 15 var/drawn = FALSE + is_bow = TRUE + + ///Var for attack_self chain + var/hardlight = FALSE /obj/item/gun/launcher/crossbow/bow/update_release_force(obj/item/projectile) return 0 @@ -78,6 +82,11 @@ return ..() /obj/item/gun/launcher/crossbow/bow/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(hardlight) + return FALSE if(drawn) user.visible_message(span_infoplain(span_bold("[user]") + " relaxes the tension on [src]'s string."),span_infoplain("You relax the tension on [src]'s string.")) drawn = FALSE @@ -127,7 +136,10 @@ QDEL_NULL(bolt) update_icon() -/obj/item/gun/launcher/crossbow/bow/hardlight/attack_self(mob/living/user) +/obj/item/gun/launcher/crossbow/bow/hardlight/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(drawn) user.visible_message(span_infoplain(span_bold("[user]") + " relaxes the tension on [src]'s string."),span_infoplain("You relax the tension on [src]'s string.")) drawn = FALSE diff --git a/code/modules/projectiles/guns/launcher/confetti.dm b/code/modules/projectiles/guns/launcher/confetti.dm index 55cffa4c3e..25d7c20ec2 100644 --- a/code/modules/projectiles/guns/launcher/confetti.dm +++ b/code/modules/projectiles/guns/launcher/confetti.dm @@ -13,6 +13,7 @@ var/confetti_charge = 0 var/max_confetti = 20 + special_handling = TRUE /obj/item/gun/launcher/confetti_cannon/examine(mob/user) . = ..() @@ -42,6 +43,9 @@ to_chat(user, span_red("The [src] is already loaded!")) /obj/item/gun/launcher/confetti_cannon/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE pump(user) /obj/item/gun/launcher/confetti_cannon/consume_next_projectile() diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index 5e44be2c2c..7486bc1ecf 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -68,6 +68,10 @@ var/current_user // Used to check if the crossbow has changed hands since being drawn. w_class = ITEMSIZE_HUGE //CHOMP Edit. + ///Var for attack_self chain + var/is_bow = FALSE + special_handling = TRUE + /obj/item/gun/launcher/crossbow/update_release_force() release_force = tension*release_speed @@ -83,7 +87,12 @@ update_icon() ..() -/obj/item/gun/launcher/crossbow/attack_self(mob/living/user as mob) +/obj/item/gun/launcher/crossbow/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE + if(is_bow) + return TRUE if(tension) if(bolt) user.visible_message("[user] relaxes the tension on [src]'s string and removes [bolt].","You relax the tension on [src]'s string and remove [bolt].") diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index 90c52e8e22..abc6e0e0cf 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -16,6 +16,8 @@ var/list/grenades = new/list() var/max_grenades = 5 //holds this + one in the chamber matter = list(MAT_STEEL = 2000) + special_handling = TRUE + var/underslung = FALSE //revolves the magazine, allowing players to choose between multiple grenade types /obj/item/gun/launcher/grenade/proc/pump(mob/user) @@ -66,6 +68,11 @@ to_chat(user, span_warning("[src] is empty.")) /obj/item/gun/launcher/grenade/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(underslung) + return FALSE pump(user) /obj/item/gun/launcher/grenade/attackby(obj/item/I, mob/user) @@ -98,9 +105,7 @@ w_class = ITEMSIZE_NORMAL force = 5 max_grenades = 0 - -/obj/item/gun/launcher/grenade/underslung/attack_self() - return + underslung = TRUE //load and unload directly into chambered /obj/item/gun/launcher/grenade/underslung/load(obj/item/grenade/G, mob/user) diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 722d673783..d216782b66 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -20,6 +20,8 @@ var/force_divisor = 400 // Force equates to speed. Speed/5 equates to a damage multiplier for whoever you hit. // For reference, a fully pressurized oxy tank at 50% gas release firing a health // analyzer with a force_divisor of 10 hit with a damage multiplier of 3000+. + special_handling = TRUE + /obj/item/gun/launcher/pneumatic/Initialize(mapload) . = ..() item_storage = new(src) @@ -72,7 +74,10 @@ else if(istype(W) && item_storage.can_be_inserted(W)) item_storage.handle_item_insertion(W) -/obj/item/gun/launcher/pneumatic/attack_self(mob/user as mob) +/obj/item/gun/launcher/pneumatic/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE eject_tank(user) /obj/item/gun/launcher/pneumatic/consume_next_projectile(mob/user=null) diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 3b11c41e3d..a4acc83582 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -28,6 +28,9 @@ update_icon() /obj/item/syringe_cartridge/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(syringe) to_chat(user, span_notice("You remove [syringe] from [src].")) playsound(src, 'sound/weapons/empty.ogg', 50, 1) @@ -81,6 +84,8 @@ var/max_darts = 1 var/obj/item/syringe_cartridge/next + special_handling = TRUE + /obj/item/gun/launcher/syringe/consume_next_projectile() if(next) next.prime() @@ -92,7 +97,10 @@ darts -= next next = null -/obj/item/gun/launcher/syringe/attack_self(mob/living/user as mob) +/obj/item/gun/launcher/syringe/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(next) user.visible_message("[user] unlatches and carefully relaxes the bolt on [src].", span_warning("You unlatch and carefully relax the bolt on [src], unloading the spring.")) next = null diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index fbed5c0315..02b8b1080d 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -33,6 +33,11 @@ var/random_start_ammo = FALSE //randomize amount of starting ammo + special_handling = TRUE + + ///Var for attack_self chain + var/special_weapon_handling = FALSE + /obj/item/gun/projectile/Initialize(mapload, var/starts_loaded = 1) . = ..() if(starts_loaded) @@ -227,7 +232,12 @@ ..() load_ammo(A, user) -/obj/item/gun/projectile/attack_self(mob/user as mob) +/obj/item/gun/projectile/attack_self(mob/user, callback) + . = ..(user) + if(.) + return TRUE + if(special_weapon_handling && !callback) + return FALSE if(firemodes.len > 1) switch_firemodes(user) else diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 76a83d0c45..2504110afc 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -310,6 +310,8 @@ list(mode_name="short bursts", burst=5,burst_delay=1 ,move_delay=3, burst_accuracy = list(0,-15,-15,-30,-30), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)) //CHOMPedit, firerate buff ) + special_weapon_handling = TRUE + /obj/item/gun/projectile/automatic/l6_saw/special_check(mob/user) if(cover_open) to_chat(user, span_warning("[src]'s cover is open! Close it before firing!")) @@ -322,11 +324,14 @@ update_icon() update_held_icon() -/obj/item/gun/projectile/automatic/l6_saw/attack_self(mob/user as mob) +/obj/item/gun/projectile/automatic/l6_saw/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(cover_open) toggle_cover(user) //close the cover else - return ..() //once closed, behave like normal + return ..(user, TRUE) //once closed, behave like normal /obj/item/gun/projectile/automatic/l6_saw/attack_hand(mob/user as mob) if(!cover_open && user.get_inactive_hand() == src) diff --git a/code/modules/projectiles/guns/projectile/contender.dm b/code/modules/projectiles/guns/projectile/contender.dm index 541330d87c..946d3b67e8 100644 --- a/code/modules/projectiles/guns/projectile/contender.dm +++ b/code/modules/projectiles/guns/projectile/contender.dm @@ -21,8 +21,12 @@ projectile_type = /obj/item/projectile/bullet/pistol/strong var/retracted_bolt = 0 load_method = SINGLE_CASING + special_handling = TRUE -/obj/item/gun/projectile/contender/attack_self(mob/user as mob) +/obj/item/gun/projectile/contender/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(chambered) chambered.loc = get_turf(src) chambered = null diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index e9833d4fe7..bdad9ef996 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -69,6 +69,7 @@ var/dart_reagent_amount = 15 var/container_type = /obj/item/reagent_containers/glass/beaker var/list/starting_chems = null + special_weapon_handling = TRUE /obj/item/gun/projectile/dartgun/Initialize(mapload) . = ..() @@ -134,6 +135,9 @@ B.reagents.trans_to_obj(dart, mix_amount) /obj/item/gun/projectile/dartgun/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.set_machine(src) var/dat = span_bold("[src] mixing control:") + "

" diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index fdea2ae864..4656ca0428 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -32,13 +32,18 @@ var/empty_sprite = 0 //This is just a dirty var so it doesn't fudge up. var/pump_animation = "shotgun-pump" //You put the reference to the animation in question here. Frees up namming. Ex: "shotgun_old_pump" or "sniper_cycle" + special_weapon_handling = TRUE + /obj/item/gun/projectile/shotgun/pump/consume_next_projectile() if(chambered) return chambered.BB return null -/obj/item/gun/projectile/shotgun/pump/attack_self(mob/living/user as mob) - if(world.time >= recentpump + 10) +/obj/item/gun/projectile/shotgun/pump/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(world.time >= recentpump + 1 SECOND) pump(user) recentpump = world.time diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index ce52872d9c..b6ed107cdf 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -22,6 +22,7 @@ scoped_accuracy = 75 one_handed_penalty = 90 bolt_open = 0 //CHOMP Edit + special_weapon_handling = TRUE /obj/item/gun/projectile/heavysniper/update_icon() if(bolt_open) @@ -29,7 +30,10 @@ else icon_state = "heavysniper" -/obj/item/gun/projectile/heavysniper/attack_self(mob/user as mob) +/obj/item/gun/projectile/heavysniper/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) bolt_open = !bolt_open if(bolt_open) diff --git a/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm b/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm index 698fb1e1b0..3165b127f0 100644 --- a/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper/collapsible_sniper.dm @@ -70,6 +70,9 @@ trigger_group = src /obj/item/sniper_rifle_part/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(part_count == 1) to_chat(user, span_warning("You can't disassemble this further!")) return diff --git a/code/modules/projectiles/guns/projectile_ch.dm b/code/modules/projectiles/guns/projectile_ch.dm index dcd4b228ed..e718fe3201 100644 --- a/code/modules/projectiles/guns/projectile_ch.dm +++ b/code/modules/projectiles/guns/projectile_ch.dm @@ -23,6 +23,7 @@ var/sound_ejectchamber = 'sound/weapons/ballistics/pistol_ejectchamber.ogg' var/sound_eject = 'sound/weapons/ballistics/pistol_eject.ogg' var/sound_chamber = 'sound/weapons/ballistics/pistol_chamber.ogg' + special_handling = TRUE /obj/item/gun/projectile/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0) if(fire_anim) @@ -67,6 +68,9 @@ bolt_toggle() /obj/item/gun/projectile/attack_self(mob/user as mob) + . = ..(user) + if(.) + return TRUE if(manual_chamber) if(do_after(user, 0.4 SECONDS, src)) bolt_handle(user) diff --git a/code/modules/projectiles/guns/toy.dm b/code/modules/projectiles/guns/toy.dm index af57e68e36..36f1143fb4 100644 --- a/code/modules/projectiles/guns/toy.dm +++ b/code/modules/projectiles/guns/toy.dm @@ -236,8 +236,12 @@ recoil = null handle_casings = null fire_sound = 'sound/items/syringeproj.ogg' //CHOMPedit + special_weapon_handling = TRUE -/obj/item/gun/projectile/cyborgtoy/attack_self(var/mob/user) +/obj/item/gun/projectile/cyborgtoy/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE cleanup = !cleanup to_chat(user, "The [src] is now on [cleanup ? "cleanup" : "battle"] mode.") diff --git a/code/modules/reagents/machinery/dispenser/cartridge.dm b/code/modules/reagents/machinery/dispenser/cartridge.dm index d9e30df8e4..cd5d587c92 100644 --- a/code/modules/reagents/machinery/dispenser/cartridge.dm +++ b/code/modules/reagents/machinery/dispenser/cartridge.dm @@ -53,8 +53,10 @@ name = initial(name) /obj/item/reagent_containers/chem_disp_cartridge/attack_self(mob/user) - ..() - if (is_open_container()) + . = ..(user) + if(.) + return TRUE + if(is_open_container()) to_chat(user, span_notice("You put the cap on \the [src].")) flags ^= OPENCONTAINER else diff --git a/code/modules/reagents/reagent_containers/_reagent_containers.dm b/code/modules/reagents/reagent_containers/_reagent_containers.dm index df217d4d59..688470624d 100644 --- a/code/modules/reagents/reagent_containers/_reagent_containers.dm +++ b/code/modules/reagents/reagent_containers/_reagent_containers.dm @@ -34,9 +34,6 @@ WARNING("[src]([src.type]) starts with more reagents than it has total volume") starts_with = null // it should gc, since it's just strings and numbers -/obj/item/reagent_containers/attack_self(mob/user as mob) - return - /obj/item/reagent_containers/afterattack(obj/target, mob/user, flag) return diff --git a/code/modules/reagents/reagent_containers/blood_pack_vr.dm b/code/modules/reagents/reagent_containers/blood_pack_vr.dm index b2c73a41b2..661ef06f09 100644 --- a/code/modules/reagents/reagent_containers/blood_pack_vr.dm +++ b/code/modules/reagents/reagent_containers/blood_pack_vr.dm @@ -1,4 +1,7 @@ -/obj/item/reagent_containers/blood/attack_self(mob/living/user as mob) +/obj/item/reagent_containers/blood/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(user.a_intent == I_HURT) if(reagents.total_volume && volume) var/remove_volume = volume* 0.1 //10% of what the bloodpack can hold. diff --git a/code/modules/reagents/reagent_containers/borghypo.dm b/code/modules/reagents/reagent_containers/borghypo.dm index a71bad8cf3..7a63813a0b 100644 --- a/code/modules/reagents/reagent_containers/borghypo.dm +++ b/code/modules/reagents/reagent_containers/borghypo.dm @@ -180,7 +180,10 @@ balloon_alert(M, "you feel a tiny prick!") return -/obj/item/reagent_containers/borghypo/attack_self(mob/user as mob) //Change the mode +/obj/item/reagent_containers/borghypo/attack_self(mob/user) //Change the mode + . = ..(user) + if(.) + return TRUE tgui_interact(user) return diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 71bf0d3c19..abbab434f6 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -56,6 +56,9 @@ ) //CHOMP Addition for feeder in the above list. I am paranoid about comments within lists so this is outside. + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/reagent_containers/glass/Initialize(mapload) . = ..() if(LAZYLEN(prefill)) @@ -77,7 +80,11 @@ . += span_notice("Airtight lid seals it completely.") /obj/item/reagent_containers/glass/attack_self(mob/user) - ..() + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(is_open_container()) balloon_alert(user, "lid put on \the [src]") flags ^= OPENCONTAINER diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index ab81542091..214b114029 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -69,7 +69,7 @@ return /* -/obj/item/reagent_containers/spray/attack_self(var/mob/user) //Now done via alt-click instead +/obj/item/reagent_containers/spray/attack_self(mob/user) //Now done via alt-click instead if(!max_transfer_amount) return amount_per_transfer_from_this = next_in_list(amount_per_transfer_from_this, possible_transfer_amounts) @@ -137,7 +137,10 @@ if(Adjacent(user)) . += "The safety is [safety ? "on" : "off"]." -/obj/item/reagent_containers/spray/pepper/attack_self(var/mob/user) +/obj/item/reagent_containers/spray/pepper/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE safety = !safety balloon_alert(user, "safety [safety ? "on" : "off"].") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index e448a098d9..4a86e87d7e 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -64,7 +64,10 @@ ..() update_icon() -/obj/item/reagent_containers/syringe/attack_self(mob/user as mob) +/obj/item/reagent_containers/syringe/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE switch(mode) if(SYRINGE_CAPPED) mode = SYRINGE_DRAW diff --git a/code/modules/recycling/destination_tagger.dm b/code/modules/recycling/destination_tagger.dm index f0738ae174..3ccf1dd97b 100644 --- a/code/modules/recycling/destination_tagger.dm +++ b/code/modules/recycling/destination_tagger.dm @@ -40,7 +40,10 @@ return data -/obj/item/destTagger/attack_self(mob/user as mob) +/obj/item/destTagger/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/destTagger/tgui_act(action, params, datum/tgui/ui) diff --git a/code/modules/recycling/disposal_mail.dm b/code/modules/recycling/disposal_mail.dm index 419477e17c..92d212e6aa 100644 --- a/code/modules/recycling/disposal_mail.dm +++ b/code/modules/recycling/disposal_mail.dm @@ -134,9 +134,12 @@ var/nameset = 0 var/tag_x -/obj/item/smallDelivery/attack_self(mob/user as mob) - if (src.wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 - wrapped.loc = user.loc +/obj/item/smallDelivery/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if (wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 + wrapped.forceMove(user.loc) if(ishuman(user)) user.put_in_hands(wrapped) else diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm index 14214aa23b..85474342de 100644 --- a/code/modules/research/anomaly/anomaly_core.dm +++ b/code/modules/research/anomaly/anomaly_core.dm @@ -5,6 +5,7 @@ var/anomaly_type = /obj/effect/anomaly var/worth = 250 // Pricey... Should be hard-ish to obtain. + special_handling = TRUE /obj/item/assembly/signaler/anomaly/Initialize(mapload) . = ..() @@ -21,6 +22,9 @@ return TRUE /obj/item/assembly/signaler/anomaly/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE return /obj/item/assembly/signaler/anomaly/attackby(obj/item/W, mob/user, params) diff --git a/code/modules/resleeving/computers.dm b/code/modules/resleeving/computers.dm index 5c16d397b2..2aae982344 100644 --- a/code/modules/resleeving/computers.dm +++ b/code/modules/resleeving/computers.dm @@ -504,12 +504,15 @@ icon_state = "cmoemergency" item_state = "card-id" -/obj/item/cmo_disk_holder/attack_self(var/mob/attacker) +/obj/item/cmo_disk_holder/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE playsound(src, 'sound/items/poster_ripped.ogg', 50) - to_chat(attacker, span_warning("You tear open \the [name].")) - attacker.unEquip(src) + to_chat(user, span_warning("You tear open \the [name].")) + user.unEquip(src) var/obj/item/disk/transcore/newdisk = new(get_turf(src)) - attacker.put_in_any_hand_if_possible(newdisk) + user.put_in_any_hand_if_possible(newdisk) qdel(src) /obj/item/disk/transcore diff --git a/code/modules/resleeving/implant.dm b/code/modules/resleeving/implant.dm index 39d9e75282..11bebbf4c3 100644 --- a/code/modules/resleeving/implant.dm +++ b/code/modules/resleeving/implant.dm @@ -78,7 +78,10 @@ icon_state = "[initial(icon_state)][imps.len]" germ_level = 0 -/obj/item/backup_implanter/attack_self(mob/user as mob) +/obj/item/backup_implanter/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!istype(user)) return diff --git a/code/modules/resleeving/sleevecard.dm b/code/modules/resleeving/sleevecard.dm index 32ee751c93..3fa313ad6c 100644 --- a/code/modules/resleeving/sleevecard.dm +++ b/code/modules/resleeving/sleevecard.dm @@ -6,6 +6,7 @@ show_messages = 0 var/emagged = FALSE matter = list(MAT_STEEL = 4000, MAT_GLASS = 4000) + special_handling = TRUE /obj/item/paicard/sleevecard/attack_ghost(mob/user as mob) return @@ -66,6 +67,9 @@ return 0 /obj/item/paicard/sleevecard/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE add_fingerprint(user) if(!pai) @@ -73,7 +77,7 @@ else if(!emagged) to_chat(user,span_notice("\The [src] displays the name '[pai]'.")) - else ..() + else ..(user, TRUE) /mob/living/silicon/pai/infomorph name = "sleevecard" //Has the same name as the card for consistency, but this is the MOB in the card. diff --git a/code/modules/samples/samples.dm b/code/modules/samples/samples.dm index 7ceba17f5e..ee73722405 100644 --- a/code/modules/samples/samples.dm +++ b/code/modules/samples/samples.dm @@ -130,6 +130,9 @@ M.apply_damage(rand(min_damage,max_damage), BURN, null, used_weapon=src) /obj/item/research_sample/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/mob/living/M = user if(!istype(M)) return diff --git a/code/modules/shieldgen/directional_shield.dm b/code/modules/shieldgen/directional_shield.dm index da73c5aaa1..3b7350b956 100644 --- a/code/modules/shieldgen/directional_shield.dm +++ b/code/modules/shieldgen/directional_shield.dm @@ -98,6 +98,9 @@ var/high_color = "#0099FF" // Color the shield will be when at max health. A light blue. var/low_color = "#FF0000" // Color the shield will drift towards as health is lowered. Deep red. + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/shield_projector/Initialize(mapload) START_PROCESSING(SSobj, src) AddComponent(/datum/component/recursive_move) @@ -186,7 +189,12 @@ for(var/obj/effect/directional_shield/S in active_shields) S.update_color(new_color) -/obj/item/shield_projector/attack_self(var/mob/living/user) +/obj/item/shield_projector/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(active) if(always_on) to_chat(user, span_warning("You can't seem to deactivate \the [src].")) @@ -362,6 +370,7 @@ var/obj/mecha/my_mecha = null var/obj/item/mecha_parts/mecha_equipment/combat_shield/my_tool = null + special_handling = TRUE /obj/item/shield_projector/line/exosuit/process() ..() @@ -378,7 +387,10 @@ else my_tool.set_ready_state(TRUE) -/obj/item/shield_projector/line/exosuit/attack_self(var/mob/living/user) +/obj/item/shield_projector/line/exosuit/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(active) if(always_on) to_chat(user, span_warning("You can't seem to deactivate \the [src].")) diff --git a/code/modules/shieldgen/handheld_defuser.dm b/code/modules/shieldgen/handheld_defuser.dm index d2e47e0823..3ad925f197 100644 --- a/code/modules/shieldgen/handheld_defuser.dm +++ b/code/modules/shieldgen/handheld_defuser.dm @@ -44,6 +44,9 @@ icon_state = "hdiffuser_off" /obj/item/shield_diffuser/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE enabled = !enabled update_icon() if(enabled) diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 5c56d0fc2f..87fca935af 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -169,7 +169,10 @@ light_color = "#3728ff" var/active -/obj/item/spaceflare/attack_self(var/mob/user) +/obj/item/spaceflare/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!active) visible_message(span_notice("[user] pulls the cord, activating the [src].")) activate() diff --git a/code/modules/spells/artifacts.dm b/code/modules/spells/artifacts.dm index 2cee6f6fbc..3631b2552e 100644 --- a/code/modules/spells/artifacts.dm +++ b/code/modules/spells/artifacts.dm @@ -12,7 +12,10 @@ force = 10 hitsound = 'sound/items/welder2.ogg' -/obj/item/scrying/attack_self(mob/user as mob) +/obj/item/scrying/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if((user.mind && !wizards.is_antagonist(user.mind))) to_chat(user, span_warning("You stare into the orb and see nothing but your own reflection.")) return diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index 6401b1a00a..0405617733 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -11,7 +11,15 @@ var/max_uses = 5 var/op = 1 + ///Var for attack_self chain + var/special_handling = FALSE + /obj/item/spellbook/attack_self(mob/user = usr) + . = ..(user) + if(.) + return TRUE + if(special_handling) + return FALSE if(!user) return if((user.mind && !wizards.is_antagonist(user.mind))) @@ -250,12 +258,16 @@ uses = 1 max_uses = 1 desc = "This template spellbook was never meant for the eyes of man..." + special_handling = TRUE /obj/item/spellbook/oneuse/Initialize(mapload) . = ..() name += spellname -/obj/item/spellbook/oneuse/attack_self(mob/user as mob) +/obj/item/spellbook/oneuse/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/spell/S = new spell(user) for(var/spell/knownspell in user.spell_list) if(knownspell.type == S.type) diff --git a/code/modules/telesci/bscyrstal.dm b/code/modules/telesci/bscyrstal.dm index b63dba5d6c..c931d4e6d9 100644 --- a/code/modules/telesci/bscyrstal.dm +++ b/code/modules/telesci/bscyrstal.dm @@ -15,6 +15,9 @@ pixel_y = rand(-5, 5) /obj/item/bluespace_crystal/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.balloon_alert_visible("[user] crushes [src]!", "Crushed [src]!") // CHOMPEdit - Balloon alert var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() s.set_up(5, 1, get_turf(src)) diff --git a/code/modules/telesci/gps_advanced.dm b/code/modules/telesci/gps_advanced.dm index 9686f7a12d..4375102d5d 100644 --- a/code/modules/telesci/gps_advanced.dm +++ b/code/modules/telesci/gps_advanced.dm @@ -14,6 +14,8 @@ gps_tag = "COM0" emped = 0 + special_handling = TRUE + /obj/item/gps/advanced/Initialize(mapload) . = ..() add_overlay("working") @@ -27,7 +29,10 @@ cut_overlay("emp") add_overlay("working") -/obj/item/gps/advanced/attack_self(mob/user as mob) +/obj/item/gps/advanced/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/obj/item/gps/advanced/t = "" if(emped) diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm index 89675a77ae..360db936c2 100644 --- a/code/modules/vore/eating/leave_remains_vr.dm +++ b/code/modules/vore/eating/leave_remains_vr.dm @@ -149,7 +149,10 @@ icon_scale_y = prey.size_multiplier update_transform() -/obj/item/digestion_remains/attack_self(var/mob/user) +/obj/item/digestion_remains/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.a_intent == I_HURT) to_chat(user,span_warning("As you squeeze the [name], it crumbles into dust and falls apart into nothing!")) qdel(src) diff --git a/code/modules/vore/fluffstuff/custom_clothes_vr.dm b/code/modules/vore/fluffstuff/custom_clothes_vr.dm index 530ec9b67b..272c3a8bd8 100644 --- a/code/modules/vore/fluffstuff/custom_clothes_vr.dm +++ b/code/modules/vore/fluffstuff/custom_clothes_vr.dm @@ -669,6 +669,7 @@ light_system = MOVABLE_LIGHT actions_types = list(/datum/action/item_action/toggle_pom_pom) + special_handling = TRUE /obj/item/clothing/head/fluff/pompom/digest_act(var/atom/movable/item_storage = null) return FALSE @@ -677,6 +678,9 @@ return FALSE /obj/item/clothing/head/fluff/pompom/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE //if(!isturf(user.loc)) -- doesn't seem to cause problems to allow this and it's silly not to // to_chat(user, "You cannot turn the light on while in this [user.loc]") // return @@ -1252,12 +1256,10 @@ Departamental Swimsuits, for general use if(unbuttoned) icon_state = "[initial(icon_state)]" - item_state = "[initial(item_state)]" unbuttoned = FALSE to_chat(usr, "You button up the coat.") else icon_state = "[initial(icon_state)]_open" - item_state = "[initial(item_state)]_open" unbuttoned = TRUE to_chat(usr, "You unbutton the coat.") usr.update_inv_wear_suit() @@ -1931,7 +1933,10 @@ Departamental Swimsuits, for general use translocator_unequip(translocator, user) /obj/item/clothing/head/fluff/nikki/attack_self(mob/user) - ..() + . = ..(user) + if(.) + return TRUE + ..(user, TRUE) if (translocator) translocator.attack_self(user, user) return diff --git a/code/modules/vore/fluffstuff/custom_items_vr.dm b/code/modules/vore/fluffstuff/custom_items_vr.dm index 564497a1b3..e97e373154 100644 --- a/code/modules/vore/fluffstuff/custom_items_vr.dm +++ b/code/modules/vore/fluffstuff/custom_items_vr.dm @@ -223,9 +223,13 @@ icon_state = "joanbadge" registered_name = "Joan Risu" assignment = "Centcom Officer" + special_handling = TRUE -/obj/item/card/id/centcom/station/fluff/joanbadge/attack_self(mob/user as mob) +/obj/item/card/id/centcom/station/fluff/joanbadge/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(isliving(user)) user.visible_message(span_warning("[user] flashes their golden security badge.\nIt reads:NT Security."),span_warning("You display the faded badge.\nIt reads: NT Security.")) @@ -293,7 +297,10 @@ icon_override = 'icons/vore/custom_items_vr.dmi' item_state = "Flag_Nanotrasen_mob" -/obj/item/flag/attack_self(mob/user as mob) +/obj/item/flag/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(isliving(user)) user.visible_message(span_warning("[user] waves their Banner around!"),span_warning("You wave your Banner around.")) @@ -414,16 +421,19 @@ /obj/item/card/id/centcom/station/fluff/aronai registered_name = "CONFIGURE ME" assignment = "CC Medical" - var/configured = 0 + can_configure = TRUE -/obj/item/card/id/centcom/station/fluff/aronai/attack_self(mob/user as mob) +/obj/item/card/id/centcom/station/fluff/aronai/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(configured) - return ..() + return user.set_id_info(src) if(user.mind && user.mind.initial_account) associated_account_number = user.mind.initial_account.account_number - configured = 1 + configured = TRUE to_chat(user, span_notice("Card settings set.")) //Swat43:Fortune Bloise @@ -546,6 +556,7 @@ var/mob/owner = null var/client/owner_c = null //They'll be dead when we message them probably. var/state = 0 //0 - New, 1 - Paired, 2 - Breaking, 3 - Broken (same as iconstates) + special_collar = TRUE /obj/item/clothing/accessory/collar/khcrystal/Initialize(mapload) . = ..() @@ -561,7 +572,10 @@ if((state > 1) || !owner) STOP_PROCESSING(SSobj, src) -/obj/item/clothing/accessory/collar/khcrystal/attack_self(mob/user as mob) +/obj/item/clothing/accessory/collar/khcrystal/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(state > 0) //Can't re-pair, one time only, for security reasons. to_chat(user, span_notice("The [name] doesn't do anything.")) return 0 @@ -769,7 +783,10 @@ icon_state = "dragor_dot" w_class = ITEMSIZE_SMALL -/obj/item/fluff/dragor_dot/attack_self(mob/user as mob) +/obj/item/fluff/dragor_dot/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(user.ckey == "pontifexminimus") add_verb(user, /mob/living/carbon/human/proc/shapeshifter_select_gender) else @@ -849,6 +866,7 @@ icon = 'icons/vore/custom_items_vr.dmi' icon_state = "hisstective_badge" //slot_flags = SLOT_TIE | SLOT_BELT + fluff_badge = TRUE /obj/item/clothing/accessory/badge/holo/detective/ruda/attack(mob/living/carbon/human/M, mob/living/user) if(isliving(user)) @@ -856,8 +874,10 @@ user.do_attack_animation(M) user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) //to prevent spam -/obj/item/clothing/accessory/badge/holo/detective/ruda/attack_self(mob/user as mob) - +/obj/item/clothing/accessory/badge/holo/detective/ruda/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!stored_name) to_chat(user, "You huff along the front of your badge, then rub your sleeve on it to polish it up.") set_name(user.real_name) @@ -947,6 +967,7 @@ //Two Handed var/wielded = 0 var/base_name = "stunstaff" + special_handling = TRUE /obj/item/melee/baton/fluff/stunstaff/Initialize(mapload) . = ..() @@ -990,6 +1011,9 @@ update_held_icon() /obj/item/melee/baton/fluff/stunstaff/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(bcell && bcell.charge > hitcost) status = !status to_chat(user, span_notice("[src] is now [status ? "on" : "off"].")) @@ -1058,7 +1082,10 @@ edge = initial(edge) w_class = initial(w_class) -/obj/item/melee/fluffstuff/attack_self(mob/living/user as mob) +/obj/item/melee/fluffstuff/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if (active) if ((CLUMSY in user.mutations) && prob(50)) user.visible_message(span_danger("\The [user] accidentally cuts \himself with \the [src]."),\ @@ -1309,6 +1336,9 @@ var/owner = "vitoras" /obj/item/fluff/verie/attack_self(mob/living/carbon/human/user) + . = ..(user) + if(.) + return TRUE if (istype(user)) // It's only made for Verie's chassis silly! if (user.ckey != owner) @@ -1531,8 +1561,12 @@ End CHOMP Removal*/ icon_state = "pandorba" pokephrase = "Gecker!" attack_verb = list("fluffed", "fwomped", "fuwa'd", "squirmshed") + special_handling = TRUE -/obj/item/toy/plushie/fluff/seona_mofuorb/attack_self(mob/user as mob) +/obj/item/toy/plushie/fluff/seona_mofuorb/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(stored_item && opened && !searching) searching = TRUE if(do_after(user, 1 SECOND, target = src)) diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm index 2ab5bc080c..385aed2c1e 100644 --- a/code/modules/vore/mouseray.dm +++ b/code/modules/vore/mouseray.dm @@ -24,7 +24,9 @@ ) /obj/item/gun/energy/mouseray/attack_self(mob/user) - . = ..() + . = ..(user) + if(.) + return TRUE if(tf_allow_select) pick_type(user) diff --git a/code/modules/vore/resizing/holder_micro_vr.dm b/code/modules/vore/resizing/holder_micro_vr.dm index 47107ce945..4cb425f8a0 100644 --- a/code/modules/vore/resizing/holder_micro_vr.dm +++ b/code/modules/vore/resizing/holder_micro_vr.dm @@ -57,6 +57,9 @@ O.show_inventory_panel(usr, state = GLOB.tgui_deep_inventory_state) /obj/item/holder/micro/attack_self(mob/living/carbon/user) //reworked so it works w/ nonhumans + . = ..(user) + if(.) + return TRUE user.setClickCooldown(user.get_attack_speed()) for(var/L in contents) if(ishuman(L)) diff --git a/code/modules/vore/resizing/sizegun_slow_vr.dm b/code/modules/vore/resizing/sizegun_slow_vr.dm index b3bcff2ba2..08f0f7750b 100644 --- a/code/modules/vore/resizing/sizegun_slow_vr.dm +++ b/code/modules/vore/resizing/sizegun_slow_vr.dm @@ -170,6 +170,9 @@ delete_box(box_segments, user.client) /obj/item/slow_sizegun/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE if(busy) busy = !busy else diff --git a/code/modules/vore/resizing/sizegun_vr.dm b/code/modules/vore/resizing/sizegun_vr.dm index f79db7a82c..30e8b5f594 100644 --- a/code/modules/vore/resizing/sizegun_vr.dm +++ b/code/modules/vore/resizing/sizegun_vr.dm @@ -29,7 +29,9 @@ verbs += /obj/item/gun/energy/sizegun/proc/spin_dial /obj/item/gun/energy/sizegun/attack_self(mob/user) - . = ..() + . = ..(user) + if(.) + return TRUE select_size(user) /obj/item/gun/energy/sizegun/proc/spin_dial() diff --git a/code/modules/vore/smoleworld/smoleworld_vr.dm b/code/modules/vore/smoleworld/smoleworld_vr.dm index 67cd47ba24..284fb1acf0 100644 --- a/code/modules/vore/smoleworld/smoleworld_vr.dm +++ b/code/modules/vore/smoleworld/smoleworld_vr.dm @@ -397,15 +397,7 @@ icon_state = "tether_trash" name = "tether" desc = "Its a tiny bit of plastic in the shape of the tether. There seems to be a small button on top." - -/obj/item/bikehorn/tinytether/attack_self(mob/user as mob) - if(spam_flag == 0) - spam_flag = 1 - playsound(src, 'sound/items/tinytether.ogg', 30, 1, volume_channel = VOLUME_CHANNEL_MASTER) - src.add_fingerprint(user) - spawn(20) - spam_flag = 0 - return + honk_sound = 'sound/items/tinytether.ogg' /obj/item/reagent_containers/food/snacks/snackplanet/moon name = "moon" diff --git a/code/modules/xenoarcheaology/finds/Weapons/archeo_melee.dm b/code/modules/xenoarcheaology/finds/Weapons/archeo_melee.dm index 7b80197867..d0c4710191 100644 --- a/code/modules/xenoarcheaology/finds/Weapons/archeo_melee.dm +++ b/code/modules/xenoarcheaology/finds/Weapons/archeo_melee.dm @@ -160,8 +160,11 @@ last_touched = user START_PROCESSING(SSobj, src) -/obj/item/melee/artifact_blade/attack_self(mob/user as mob) - if(last_special > world.time - 120) +/obj/item/melee/artifact_blade/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE + if(last_special > world.time - 12 SECONDS) to_chat(user, span_cult("The blade does not respond to your attempts, having recently performed an action!")) return last_special = world.time diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm index 6d995fe23c..9d0083bfe5 100644 --- a/code/modules/xenoarcheaology/sampling.dm +++ b/code/modules/xenoarcheaology/sampling.dm @@ -154,7 +154,10 @@ else to_chat(user, span_warning("You are unable to take a sample of [item_to_sample].")) -/obj/item/core_sampler/attack_self(var/mob/living/user) +/obj/item/core_sampler/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(filled_bag) to_chat(user, span_notice("You eject the full sample bag.")) var/success = 0 diff --git a/code/modules/xenoarcheaology/tools/ano_device_battery.dm b/code/modules/xenoarcheaology/tools/ano_device_battery.dm index 8f9c6a0122..6ac7a95e4b 100644 --- a/code/modules/xenoarcheaology/tools/ano_device_battery.dm +++ b/code/modules/xenoarcheaology/tools/ano_device_battery.dm @@ -88,7 +88,10 @@ else return ..() -/obj/item/anodevice/attack_self(var/mob/user as mob) +/obj/item/anodevice/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE return tgui_interact(user) /obj/item/anodevice/tgui_state(mob/user) diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index c61fe29f54..6890b9d7e1 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -46,10 +46,13 @@ var/last_repopulation_time = 0 var/repopulation_delay = 600 //Anti spam. -/obj/item/ano_scanner/attack_self(var/mob/living/user) +/obj/item/ano_scanner/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE interact(user) -/obj/item/ano_scanner/interact(var/mob/living/user) +/obj/item/ano_scanner/interact(mob/user) if(world.time - last_scan_time >= scan_delay) last_scan_time = world.time @@ -154,7 +157,10 @@ to_chat(user, span_notice("[icon2html(src, user.client)] [src] pings [pick("madly","wildly","excitedly","crazily")]!")) -/obj/item/depth_scanner/attack_self(var/mob/living/user) +/obj/item/depth_scanner/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE tgui_interact(user) /obj/item/depth_scanner/tgui_state(mob/user) @@ -277,6 +283,9 @@ icon_state = "pinoff" /obj/item/beacon_locator/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE return tgui_interact(user) /obj/item/beacon_locator/tgui_state(mob/user) @@ -336,7 +345,10 @@ anomaly_scanner = new/obj/item/ano_scanner(src) depth_scanner = new/obj/item/depth_scanner(src) -/obj/item/xenoarch_multi_tool/attack_self(var/mob/living/user) +/obj/item/xenoarch_multi_tool/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE depth_scanner.tgui_interact(user) /obj/item/xenoarch_multi_tool/verb/swap_settings() diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm index fdcff894e8..c5c585f736 100644 --- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm @@ -173,7 +173,10 @@ w_class = 2 attack_verb = list("drilled") -/obj/item/pickaxe/excavationdrill/attack_self(mob/user as mob) +/obj/item/pickaxe/excavationdrill/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/depth = tgui_input_number(user, "Put the desired depth (1-60 centimeters).", "Set Depth", excavation_amount, 60, 1) if(depth>60 || depth<1) to_chat(user, span_notice("Invalid depth.")) diff --git a/code/modules/xenobio/items/slime_objects.dm b/code/modules/xenobio/items/slime_objects.dm index fa1506c07f..f11ae61155 100644 --- a/code/modules/xenobio/items/slime_objects.dm +++ b/code/modules/xenobio/items/slime_objects.dm @@ -7,7 +7,10 @@ description_info = "Use in your hand to attempt to create a Promethean. It functions similarly to a positronic brain, in that a ghost is needed to become the Promethean." var/searching = 0 -/obj/item/slime_cube/attack_self(mob/user as mob) +/obj/item/slime_cube/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!searching) to_chat(user, span_warning("You stare at the slimy cube, watching as some activity occurs.")) icon_state = "slime cube active" @@ -85,6 +88,9 @@ qdel(src) /obj/item/slime_crystal/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE user.visible_message(span_warning("\The [user] teleports themselves with \the [src]!")) safe_blink(user, 14) qdel(src) @@ -142,7 +148,8 @@ light_range = 6 on = 1 //Bio-luminesence has one setting, on. power_use = 0 - light_system = STATIC_LIGHT + light_system = STATIC_LIGHT //CHOMPEdit + special_handling = TRUE /obj/item/flashlight/slime/Initialize(mapload) . = ..() @@ -151,10 +158,6 @@ /obj/item/flashlight/slime/update_brightness() return -/obj/item/flashlight/slime/attack_self(mob/user) - return //Bio-luminescence does not toggle. - - //Radiation Emitter /obj/item/slime_irradiator diff --git a/code/modules/xenobio/items/weapons_vr.dm b/code/modules/xenobio/items/weapons_vr.dm index 64b76cc82f..ce3f973518 100644 --- a/code/modules/xenobio/items/weapons_vr.dm +++ b/code/modules/xenobio/items/weapons_vr.dm @@ -36,7 +36,10 @@ return 1 ..() -/obj/item/xenobio/attack_self(mob/living/user as mob) +/obj/item/xenobio/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(loaded_item) user.put_in_hands(loaded_item) user.visible_message(span_notice("[user] removes [loaded_item] from [src]."), span_notice("You remove [loaded_item] from [src].")) diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index e63c762007..70dce3cdd8 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -21,6 +21,9 @@ var/genesource = "unknown" /obj/item/disk/xenobio/attack_self(var/mob/user as mob) + . = ..(user) + if(.) + return TRUE if(genes.len) var/choice = tgui_alert(user, "Are you sure you want to wipe the disk?", "Xenobiological Data", list("No", "Yes")) if(src && user && genes && choice && choice == "Yes" && user.Adjacent(get_turf(src))) diff --git a/code/modules/xenobio2/mob/slime/slime_monkey.dm b/code/modules/xenobio2/mob/slime/slime_monkey.dm index 228b4fa171..43929d7db0 100644 --- a/code/modules/xenobio2/mob/slime/slime_monkey.dm +++ b/code/modules/xenobio2/mob/slime/slime_monkey.dm @@ -8,7 +8,10 @@ Slime cube lives here. icon_state = "slime cube" var/searching = 0 -/obj/item/slime_cube/attack_self(mob/user as mob) +/obj/item/slime_cube/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE if(!searching) to_chat(user, span_warning("You stare at the slimy cube, watching as some activity occurs.")) request_player() diff --git a/code/modules/xenobio2/tools/xeno_trait_scanner.dm b/code/modules/xenobio2/tools/xeno_trait_scanner.dm index 2a11693b7e..f7311b85e9 100644 --- a/code/modules/xenobio2/tools/xeno_trait_scanner.dm +++ b/code/modules/xenobio2/tools/xeno_trait_scanner.dm @@ -31,7 +31,10 @@ user.visible_message("\The [src] spits out a piece of paper.") return -/obj/item/analyzer/xeno_analyzer/attack_self(mob/user as mob) +/obj/item/analyzer/xeno_analyzer/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE print_report(user) return 0 diff --git a/maps/redgate/facility_items.dm b/maps/redgate/facility_items.dm index 21215269cc..759fda6773 100644 --- a/maps/redgate/facility_items.dm +++ b/maps/redgate/facility_items.dm @@ -5,6 +5,7 @@ initial_sprite_stack = list() light_color = "#0099ff" access = list(801) + special_handling = TRUE /obj/item/card/id/keycard/update_icon() return @@ -12,9 +13,6 @@ /obj/item/card/id/keycard/read() to_chat(usr, span_notice("It is a red keycard, it must unlock something.")) -/obj/item/card/id/keycard/attack_self(mob/living/user as mob) - return - /obj/item/card/id/keycard/blue icon_state = "keycard-blue" access = list(802) diff --git a/maps/redgate/fantasy_items.dm b/maps/redgate/fantasy_items.dm index 5e581f6ed9..6ab38d0bdf 100644 --- a/maps/redgate/fantasy_items.dm +++ b/maps/redgate/fantasy_items.dm @@ -472,6 +472,7 @@ beacons_left = 3 cell_type = /obj/item/cell/device origin_tech = list(TECH_MAGNET = 5, TECH_BLUESPACE = 5) + special_handling = TRUE /obj/item/perfect_tele_beacon/magic name = "teleportation page" @@ -480,6 +481,9 @@ icon_state = "page" /obj/item/perfect_tele/magic/attack_self(mob/user, var/radial_menu_anchor = src) + . = ..(user, radial_menu_anchor) + if(.) + return TRUE if(loc_network) for(var/obj/item/perfect_tele_beacon/stationary/nb in GLOB.premade_tele_beacons) if(nb.tele_network == loc_network) diff --git a/maps/submaps/pois_vr/debris_field/debrisfield_things.dm b/maps/submaps/pois_vr/debris_field/debrisfield_things.dm index eabd3dfb4a..dd14f41643 100644 --- a/maps/submaps/pois_vr/debris_field/debrisfield_things.dm +++ b/maps/submaps/pois_vr/debris_field/debrisfield_things.dm @@ -149,7 +149,10 @@ icon_state = "egg_slimeglob" origin_tech = list(TECH_BIO = 10) -/obj/item/space_spider_egg/attack_self(mob/user as mob) +/obj/item/space_spider_egg/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/turf/drop_loc = user.loc to_chat(user, span_warning("The egg cracks open, splattering disgusting goop at your feet...\n \ Whatever life laid within shall never awaken, if it was even alive.")) diff --git a/modular_chomp/code/game/objects/items/contraband.dm b/modular_chomp/code/game/objects/items/contraband.dm index 53e777e37a..a21c4ce20b 100644 --- a/modular_chomp/code/game/objects/items/contraband.dm +++ b/modular_chomp/code/game/objects/items/contraband.dm @@ -7,6 +7,9 @@ w_class = ITEMSIZE_HUGE /obj/item/contraband/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE var/contraband = pick( /obj/item/reagent_containers/glass/beaker/vial/macrocillin, /obj/item/reagent_containers/glass/beaker/vial/microcillin, diff --git a/modular_chomp/code/game/objects/items/devices/mind_binder.dm b/modular_chomp/code/game/objects/items/devices/mind_binder.dm index 9a1eeff536..65b33065e0 100644 --- a/modular_chomp/code/game/objects/items/devices/mind_binder.dm +++ b/modular_chomp/code/game/objects/items/devices/mind_binder.dm @@ -17,9 +17,6 @@ usr.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) return -/obj/item/mindbinder/attack_self(mob/living/user) - return - /obj/item/mindbinder/proc/toggle_self_bind() if(possessed_voice.len == 1) to_chat(usr,span_warning("The device beeps a warning that there is already a mind loaded!")) diff --git a/modular_chomp/code/game/objects/items/gunbox.dm b/modular_chomp/code/game/objects/items/gunbox.dm index 781885b0bf..302a8f3f2a 100644 --- a/modular_chomp/code/game/objects/items/gunbox.dm +++ b/modular_chomp/code/game/objects/items/gunbox.dm @@ -1,8 +1,12 @@ /obj/item/gunbox/sec_officer name = "lethal armament box" desc = "A secure box containing a non-lethal sidearm." + variant_gunbox = TRUE /obj/item/gunbox/sec_officer/attack_self(mob/living/user) + . = ..(user) + if(.) + return TRUE var/list/options = list() options["Laser Pistol"] = list(/obj/item/gun/energy/gun, /obj/item/cell/device/weapon, /obj/item/cell/device/weapon) options["Normal Pistol"] = list(/obj/item/gun/projectile/pistol, /obj/item/ammo_magazine/m9mm/compact, /obj/item/ammo_magazine/m9mm/compact, /obj/item/ammo_magazine/m9mm/compact, /obj/item/ammo_magazine/m9mm/compact) diff --git a/modular_chomp/code/modules/clothing/accessories/accessory.dm b/modular_chomp/code/modules/clothing/accessories/accessory.dm index e652f1951d..0ce2ca288f 100644 --- a/modular_chomp/code/modules/clothing/accessories/accessory.dm +++ b/modular_chomp/code/modules/clothing/accessories/accessory.dm @@ -14,9 +14,7 @@ var/slaveckey = null //Ckey for system to check who is the person and ensure no abuse of system or errors var/slaveflavor = null //Description to show on the SPASM var/slaveooc = null //OOC text to show on the SPASM - -/obj/item/clothing/accessory/collar/casinoslave/attack_self(mob/user as mob) - //keeping it blank so people don't tag and reset collar status + special_collar = TRUE /obj/item/clothing/accessory/collar/holo/casinoslave_fake name = "a Sentient Prize Collar" diff --git a/modular_chomp/code/modules/clothing/accessories/modular_armor.dm b/modular_chomp/code/modules/clothing/accessories/modular_armor.dm index f2c07d3188..501f35df0b 100644 --- a/modular_chomp/code/modules/clothing/accessories/modular_armor.dm +++ b/modular_chomp/code/modules/clothing/accessories/modular_armor.dm @@ -218,17 +218,8 @@ default_worn_icon = "groinpadU" ///helmet - -/obj/item/clothing/head/helmet/riot/modarm/attack_self(mob/user) - if(icon_state == src::icon_state) - icon_state = "modhelmup" - item_state = "modhelmup" - to_chat(user, span_notice("You raise the visor on the visored helmet.")) - else - icon_state = src::icon_state - item_state = src::item_state - to_chat(user, span_notice("You lower the visor on the visored helmet.")) - update_clothing_icon() +/obj/item/clothing/head/helmet/riot/modarm + name_descriptor = "visored helmet" /obj/item/clothing/head/helmet/riot/modarm/killa name = "striped visored helmet" @@ -236,18 +227,6 @@ icon_state = "modhelm_killa" item_state = "modhelm_killa" -/obj/item/clothing/head/helmet/riot/modarm/killa/attack_self(mob/user) - if(icon_state == src::icon_state) - icon_state = "modhelm_killaup" - item_state = "modhelm_killaup" - to_chat(user, span_notice("You raise the visor on the visored helmet.")) - else - icon_state = src::icon_state - item_state = src::item_state - to_chat(user, span_notice("You lower the visor on the visored helmet.")) - update_clothing_icon() - - ///presets /obj/item/clothing/suit/armor/pcarrier/modarm/full diff --git a/modular_chomp/code/modules/clothing/spacesuits/rig/modules/specific/defib.dm b/modular_chomp/code/modules/clothing/spacesuits/rig/modules/specific/defib.dm index 9f05ba155d..678281f19e 100644 --- a/modular_chomp/code/modules/clothing/spacesuits/rig/modules/specific/defib.dm +++ b/modular_chomp/code/modules/clothing/spacesuits/rig/modules/specific/defib.dm @@ -19,6 +19,9 @@ /obj/item/shockpaddles/standalone/rig/checked_use(var/charge_amt) return 1 -/obj/item/shockpaddles/standalone/rig/attack_self() +/obj/item/shockpaddles/standalone/rig/attack_self(mob/user) + . = ..(user) + if(.) + return TRUE use_on_synthetic = !use_on_synthetic to_chat(usr, span_notice("You switch the [src] to [use_on_synthetic ? "FBP" : "organic"] compatibility."))