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."))