diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index 359e717dcd5..89ff98b5429 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -332,14 +332,6 @@ GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
/// Calculates the new armour value after armour penetration. Can return negative values, and those must be caught.
#define PENETRATE_ARMOUR(armour, penetration) (penetration == 100 ? 0 : 100 * (armour - penetration) / (100 - penetration))
-/// Return values used in item/melee/baton/baton_attack.
-/// Does a normal item attack.
-#define BATON_DO_NORMAL_ATTACK 1
-/// The attack has been stopped. Either because the user was clumsy or the attack was blocked.
-#define BATON_ATTACK_DONE 2
-/// The baton attack is still going. baton_effect() is called.
-#define BATON_ATTACKING 3
-
// Defines for combo attack component
/// LMB Attack
#define LEFT_ATTACK "Left Attack"
@@ -379,3 +371,46 @@ GLOBAL_LIST_INIT(leg_zones, list(BODY_ZONE_R_LEG, BODY_ZONE_L_LEG))
/// Calculates the amount of burn force when applying this much energy to a mob via electrocution from an energy source.
#define ELECTROCUTE_DAMAGE(energy) (energy >= 1 KILO JOULES ? clamp(20 + round(energy / JOULES_PER_DAMAGE), 20, 195) + rand(-5,5) : 0)
BUBBERSTATION CHANGE END */
+
+// Attack chain attack_modifier modifiers
+/// Sets the weapon's base force to this. Use carefully (as multiple overrides may collide). Set via [SET_ATTACK_FORCE]
+#define FORCE_OVERRIDE "force_override"
+/// Flat addition or subtration to the weapon's force. Set via [MODIFY_ATTACK_FORCE]
+#define FORCE_MODIFIER "force_modifier"
+/// Multiplication of the weapon's force. Applied AFTER [FORCE_MODIFIER]. Set via [MODIFY_ATTACK_FORCE_MULTIPLIER]
+#define FORCE_MULTIPLIER "force_multiplier"
+/// If set in modifiers, default messages ("You hit the thing with the thing") are silenced
+#define SILENCE_DEFAULT_MESSAGES "silence_default_messages"
+/// If set in modifiers, default hitsound is silenced
+#define SILENCE_HITSOUND "silence_hitsound"
+
+/// Used in attack chain to set the force of the attack without changing the base force of the item.
+#define SET_ATTACK_FORCE(atk_mods, value) \
+ if(!islist(atk_mods)) { atk_mods = list() }; \
+ atk_mods[FORCE_OVERRIDE] = value;
+
+/// Used in attack chain to add or remove force from the attack without changing the base force of the item.
+#define MODIFY_ATTACK_FORCE(atk_mods, amount) \
+ if(!islist(atk_mods)) { atk_mods = list() }; \
+ atk_mods[FORCE_MODIFIER] += amount;
+
+/// Used in attack chain to multiply the force of the attack without changing the base force of the item.
+#define MODIFY_ATTACK_FORCE_MULTIPLIER(atk_mods, amount) \
+ if(!islist(atk_mods)) { atk_mods = list() }; \
+ if(!(FORCE_MULTIPLIER in atk_mods)) { atk_mods[FORCE_MULTIPLIER] = 1 }; \
+ atk_mods[FORCE_MULTIPLIER] *= amount;
+
+/// Used in attack chain to prevent hitsounds on attack (to allow for custom sounds)
+#define MUTE_ATTACK_HITSOUND(atk_mods) \
+ if(!islist(atk_mods)) { atk_mods = list() }; \
+ atk_mods[SILENCE_HITSOUND] = TRUE;
+
+/// Used in attack chain to prevent default visible messages from being sent (to allow for custom messages)
+#define HIDE_ATTACK_MESSAGES(atk_mods) \
+ if(!islist(atk_mods)) { atk_mods = list() }; \
+ atk_mods[SILENCE_DEFAULT_MESSAGES] = TRUE;
+
+/// Calculates the final force of some item based on atk_mods
+/// Needs to have support for force overrides and multipliers of 0 (hence why we ternaries are used over 'or's)
+#define CALCULATE_FORCE(some_item, atk_mods) \
+ ((((FORCE_OVERRIDE in atk_mods) ? atk_mods[FORCE_OVERRIDE] : some_item.force) + (atk_mods?[FORCE_MODIFIER] || 0)) * ((FORCE_MULTIPLIER in atk_mods) ? atk_mods[FORCE_MULTIPLIER] : 1))
diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
index 4f0665e0bae..978b02413ca 100644
--- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
+++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
@@ -194,7 +194,7 @@
#define COMSIG_TABLE_SLAMMED "table_slammed"
///from base of atom/attack_hand(): (mob/user, modifiers)
#define COMSIG_MOB_ATTACK_HAND "mob_attack_hand"
-///from base of /obj/item/attack(): (mob/M, mob/user, list/modifiers)
+///from base of /obj/item/attack(): (mob/M, mob/user, list/modifiers, list/attack_modifiers)
#define COMSIG_MOB_ITEM_ATTACK "mob_item_attack"
///from base of mob/RangedAttack(): (atom/A, modifiers)
#define COMSIG_MOB_ATTACK_RANGED "mob_attack_ranged"
diff --git a/code/__DEFINES/dcs/signals/signals_object.dm b/code/__DEFINES/dcs/signals/signals_object.dm
index a11aa288557..a113f0b88e8 100644
--- a/code/__DEFINES/dcs/signals/signals_object.dm
+++ b/code/__DEFINES/dcs/signals/signals_object.dm
@@ -133,7 +133,7 @@
#define COMSIG_ITEM_ON_GRIND "on_grind"
///from base of obj/item/on_juice(): ()
#define COMSIG_ITEM_ON_JUICE "on_juice"
-///from /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, list/modifiers) when an object is used as compost: (mob/user)
+///from /obj/machinery/hydroponics/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers) when an object is used as compost: (mob/user)
#define COMSIG_ITEM_ON_COMPOSTED "on_composted"
///Called when an item is dried by a drying rack
#define COMSIG_ITEM_DRIED "item_dried"
@@ -461,7 +461,7 @@
/// Prevents click from happening.
#define COMPONENT_CANCEL_EQUIPMENT_CLICK (1<<0)
-///from base of /obj/item/attack(): (mob/living, mob/living, list/modifiers)
+///from base of /obj/item/attack(): (mob/living, mob/living, list/modifiers, list/attack_modifiers)
#define COMSIG_ITEM_ATTACK "item_attack"
///from base of obj/item/attack_self(): (/mob)
#define COMSIG_ITEM_ATTACK_SELF "item_attack_self"
@@ -471,12 +471,12 @@
#define COMSIG_ITEM_ATTACK_ATOM "item_attack_atom"
///from base of obj/item/pre_attack(): (atom/target, mob/user, list/modifiers)
#define COMSIG_ITEM_PRE_ATTACK "item_pre_attack"
-/// From base of [/obj/item/proc/pre_attack_secondary()]: (atom/target, mob/user, list/modifiers)
+/// From base of [/obj/item/proc/pre_attack_secondary()]: (atom/target, mob/user, list/modifiers, list/attack_modifiers)
#define COMSIG_ITEM_PRE_ATTACK_SECONDARY "item_pre_attack_secondary"
#define COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN (1<<0)
#define COMPONENT_SECONDARY_CONTINUE_ATTACK_CHAIN (1<<1)
#define COMPONENT_SECONDARY_CALL_NORMAL_ATTACK_CHAIN (1<<2)
-/// From base of [/obj/item/proc/attack_secondary()]: (atom/target, mob/user, list/modifiers)
+/// From base of [/obj/item/proc/attack_secondary()]: (atom/target, mob/user, list/modifiers, list/attack_modifiers)
#define COMSIG_ITEM_ATTACK_SECONDARY "item_attack_secondary"
///from base of [obj/item/attack()]: (atom/target, mob/user, proximity_flag, list/modifiers)
#define COMSIG_ITEM_AFTERATTACK "item_afterattack"
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 57c1af477d5..bfe605247bc 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -1,17 +1,31 @@
/**
- * This is the proc that handles the order of an item_attack.
+ * THIS IS THE ROOT OF ALL EVIL (I mean the root of all item-on-atom interactions)
*
- * The order of procs called is:
- * * [/atom/proc/tool_act] on the target. If it returns ITEM_INTERACT_SUCCESS or ITEM_INTERACT_BLOCKING, the chain will be stopped.
- * * [/obj/item/proc/pre_attack] on src. If this returns TRUE, the chain will be stopped.
- * * [/atom/proc/attackby] on the target. If it returns TRUE, the chain will be stopped.
- * * [/obj/item/proc/afterattack]. The return value does not matter.
+ * Implementation details
+ *
+ * [obj/item/proc/base_item_interaction] handles all non-combat interactions of an item with an atom.
+ * This calls [atom/proc/tool_act], among others.
+ *
+ * [obj/item/proc/pre_attack] is called before an attack is made, before we even check for block.
+ * Use pre attack to cancel attacks early based on conditions ("You cant attack with this unless you're a pacifist!")
+ * After pre-attack we go into [atom/proc/attackby] which is where individual atoms handle what happens when being hit
+ * Objects use [obj/item/proc/attack_atom], mobs use [obj/item/proc/attack].
+ * You GENERALLY should never override attack, like ever. (On-attack effects go in afterattack)
+ * Regardless, we go BACK to the atom to call [atom/proc/attacked_by], which is where the damage is actually applied.
+ * Finally we call [obj/item/proc/afterattack] after damage is dealt, to handle special item interacts after an attack occurs.
+ * Use afterattack for stuff like "My stick stuns when it hits people".
+ *
+ * Arguments
+ * * mob/living/user - The mob using src on something
+ * * atom/target - The atom being clicked on with src
+ * * list/modifiers - click params such as alt/shift and x/y, etc
+ * * list/attack_modifiers - attack modifiers such as force, damage type, etc. Only used in attacks
*/
-/obj/item/proc/melee_attack_chain(mob/user, atom/target, list/modifiers)
+/obj/item/proc/melee_attack_chain(mob/user, atom/target, list/modifiers, list/attack_modifiers = list())
//Proxy replaces src cause it returns an atom that will attack the target on our behalf
var/obj/item/source_atom = get_proxy_attacker_for(target, user)
if(source_atom != src) //if we are someone else then call that attack chain else we can proceed with the usual stuff
- return source_atom.melee_attack_chain(user, target, modifiers)
+ return source_atom.melee_attack_chain(user, target, modifiers, attack_modifiers)
var/is_right_clicking = LAZYACCESS(modifiers, RIGHT_CLICK)
@@ -25,9 +39,9 @@
var/pre_attack_result
if (is_right_clicking)
- switch (pre_attack_secondary(target, user, modifiers))
+ switch (pre_attack_secondary(target, user, modifiers, attack_modifiers))
if (SECONDARY_ATTACK_CALL_NORMAL)
- pre_attack_result = pre_attack(target, user, modifiers)
+ pre_attack_result = pre_attack(target, user, modifiers, attack_modifiers)
if (SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return TRUE
if (SECONDARY_ATTACK_CONTINUE_CHAIN)
@@ -35,7 +49,7 @@
else
CRASH("pre_attack_secondary must return an SECONDARY_ATTACK_* define, please consult code/__DEFINES/combat.dm")
else
- pre_attack_result = pre_attack(target, user, modifiers)
+ pre_attack_result = pre_attack(target, user, modifiers, attack_modifiers)
if(pre_attack_result)
return TRUE
@@ -44,9 +58,9 @@
var/attackby_result
if (is_right_clicking)
- switch (target.attackby_secondary(src, user, modifiers))
+ switch (target.attackby_secondary(src, user, modifiers, attack_modifiers))
if (SECONDARY_ATTACK_CALL_NORMAL)
- attackby_result = target.attackby(src, user, modifiers)
+ attackby_result = target.attackby(src, user, modifiers, attack_modifiers)
if (SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return TRUE
if (SECONDARY_ATTACK_CONTINUE_CHAIN)
@@ -54,7 +68,7 @@
else
CRASH("attackby_secondary must return an SECONDARY_ATTACK_* define, please consult code/__DEFINES/combat.dm")
else
- attackby_result = target.attackby(src, user, modifiers)
+ attackby_result = target.attackby(src, user, modifiers, attack_modifiers)
if (attackby_result)
// This means the attack failed or was handled for whatever reason
@@ -89,11 +103,12 @@
* * atom/target - The atom about to be hit
* * mob/living/user - The mob doing the htting
* * list/modifiers - click params such as alt/shift etc
- *
+ * * attack_modifiers - attack modifiers such as force, damage type, etc
+
* See: [/obj/item/proc/melee_attack_chain]
*/
-/obj/item/proc/pre_attack(atom/target, mob/living/user, list/modifiers) //do stuff before attackby!
- if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, target, user, modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN)
+/obj/item/proc/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) //do stuff before attackby!
+ if(SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK, target, user, modifiers, attack_modifiers) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
return FALSE //return TRUE to avoid calling attackby after this proc does stuff
@@ -104,11 +119,12 @@
* * atom/target - The atom about to be hit
* * mob/living/user - The mob doing the htting
* * list/modifiers - click params such as alt/shift etc
+ * * list/attack_modifiers - attack modifiers such as force, damage type, etc
*
* See: [/obj/item/proc/melee_attack_chain]
*/
-/obj/item/proc/pre_attack_secondary(atom/target, mob/living/user, list/modifiers)
- var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK_SECONDARY, target, user, modifiers)
+/obj/item/proc/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
+ var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_PRE_ATTACK_SECONDARY, target, user, modifiers, attack_modifiers)
if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
@@ -124,12 +140,13 @@
* Arguments:
* * obj/item/attacking_item - The item hitting this atom
* * mob/user - The wielder of this item
- * * params - click params such as alt/shift etc
+ * * list/modifiers - click params such as alt/shift etc
+ * * list/attack_modifiers - attack modifiers such as force, damage type, etc
*
* See: [/obj/item/proc/melee_attack_chain]
*/
-/atom/proc/attackby(obj/item/attacking_item, mob/user, list/modifiers)
- if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY, attacking_item, user, modifiers) & COMPONENT_NO_AFTERATTACK)
+/atom/proc/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
+ if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY, attacking_item, user, modifiers, attack_modifiers) & COMPONENT_NO_AFTERATTACK)
return TRUE
return FALSE
@@ -139,12 +156,13 @@
* Arguments:
* * obj/item/weapon - The item hitting this atom
* * mob/user - The wielder of this item
- * * params - click params such as alt/shift etc
+ * * list/modifiers - click params such as alt/shift etc
+ * * list/attack_modifiers - attack modifiers such as force, damage type, etc
*
* See: [/obj/item/proc/melee_attack_chain]
*/
-/atom/proc/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
- var/signal_result = SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY_SECONDARY, weapon, user, modifiers)
+/atom/proc/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
+ var/signal_result = SEND_SIGNAL(src, COMSIG_ATOM_ATTACKBY_SECONDARY, weapon, user, modifiers, attack_modifiers)
if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
@@ -154,12 +172,12 @@
return SECONDARY_ATTACK_CALL_NORMAL
-/obj/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(..())
return TRUE
if(!(obj_flags & CAN_BE_HIT))
return FALSE
- return attacking_item.attack_atom(src, user, modifiers)
+ return attacking_item.attack_atom(src, user, modifiers, attack_modifiers)
/mob/living/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
for(var/datum/surgery/operation as anything in surgeries)
@@ -172,14 +190,14 @@
return NONE
-/mob/living/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/mob/living/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(..())
return TRUE
user.changeNext_move(attacking_item.attack_speed)
- return attacking_item.attack(src, user, modifiers)
+ return attacking_item.attack(src, user, modifiers, attack_modifiers)
-/mob/living/attackby_secondary(obj/item/weapon, mob/living/user, list/modifiers)
- var/result = weapon.attack_secondary(src, user, modifiers)
+/mob/living/attackby_secondary(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
+ var/result = weapon.attack_secondary(src, user, modifiers, attack_modifiers)
// Normal attackby updates click cooldown, so we have to make up for it
if (result != SECONDARY_ATTACK_CALL_NORMAL)
@@ -196,10 +214,11 @@
* Arguments:
* * mob/living/target_mob - The mob being hit by this item
* * mob/living/user - The mob hitting with this item
- * * params - Click params of this attack
+ * * modifiers - click modifiers such as alt/shift or x/y
+ * * attack_modifiers - attack modifiers such as force, damage type, etc
*/
-/obj/item/proc/attack(mob/living/target_mob, mob/living/user, list/modifiers)
- var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target_mob, user, modifiers) || SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, target_mob, user, modifiers)
+/obj/item/proc/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
+ var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, target_mob, user, modifiers, attack_modifiers) || SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, target_mob, user, modifiers, attack_modifiers)
if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
if(signal_return & COMPONENT_SKIP_ATTACK)
@@ -208,37 +227,39 @@
if(item_flags & NOBLUDGEON)
return FALSE
- if(damtype != STAMINA && force && HAS_TRAIT(user, TRAIT_PACIFISM))
+ var/final_force = CALCULATE_FORCE(src, attack_modifiers)
+ if(damtype != STAMINA && final_force && HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, span_warning("You don't want to harm other living beings!"))
return FALSE
- if(!force && !HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND))
- playsound(src, 'sound/items/weapons/tap.ogg', get_clamped_volume(), TRUE, -1)
- else if(hitsound)
- playsound(src, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0)
+ if(!LAZYACCESS(attack_modifiers, SILENCE_HITSOUND))
+ if(!final_force && !HAS_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND))
+ playsound(src, 'sound/items/weapons/tap.ogg', get_clamped_volume(), TRUE, -1)
+ else if(hitsound)
+ playsound(src, hitsound, get_clamped_volume(), TRUE, extrarange = stealthy_audio ? SILENCED_SOUND_EXTRARANGE : -1, falloff_distance = 0)
target_mob.lastattacker = user.real_name
target_mob.lastattackerckey = user.ckey
- if(force && target_mob == user && user.client)
+ if(final_force && target_mob == user && user.client)
user.client.give_award(/datum/award/achievement/misc/selfouch, user)
if(get(src, /mob/living) == user) // telekinesis.
user.do_attack_animation(target_mob)
- if(!target_mob.attacked_by(src, user))
+ if(!target_mob.attacked_by(src, user, modifiers, attack_modifiers))
return TRUE
- SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target_mob, user, modifiers)
- SEND_SIGNAL(target_mob, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, modifiers)
- afterattack(target_mob, user, modifiers)
-
- log_combat(user, target_mob, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)])")
+ SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target_mob, user, modifiers, attack_modifiers)
+ SEND_SIGNAL(target_mob, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, modifiers, attack_modifiers)
+ afterattack(target_mob, user, modifiers, attack_modifiers)
+ if(final_force > 0)
+ log_combat(user, target_mob, "attacked", src.name, "(COMBAT MODE: [uppertext(user.combat_mode)]) (DAMTYPE: [uppertext(damtype)])")
add_fingerprint(user)
return FALSE // unhandled
/// The equivalent of [/obj/item/proc/attack] but for alternate attacks, AKA right clicking
-/obj/item/proc/attack_secondary(mob/living/victim, mob/living/user, list/modifiers)
- var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SECONDARY, victim, user, modifiers)
+/obj/item/proc/attack_secondary(mob/living/victim, mob/living/user, list/modifiers, list/attack_modifiers)
+ var/signal_result = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_SECONDARY, victim, user, modifiers, attack_modifiers)
if(signal_result & COMPONENT_SECONDARY_CANCEL_ATTACK_CHAIN)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
@@ -249,8 +270,8 @@
return SECONDARY_ATTACK_CALL_NORMAL
/// The equivalent of the standard version of [/obj/item/proc/attack] but for non mob targets.
-/obj/item/proc/attack_atom(atom/attacked_atom, mob/living/user, list/modifiers)
- var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_ATOM, attacked_atom, user) | SEND_SIGNAL(user, COMSIG_LIVING_ATTACK_ATOM, attacked_atom)
+/obj/item/proc/attack_atom(atom/attacked_atom, mob/living/user, list/modifiers, list/attack_modifiers)
+ var/signal_return = SEND_SIGNAL(src, COMSIG_ITEM_ATTACK_ATOM, attacked_atom, user, modifiers, attack_modifiers) | SEND_SIGNAL(user, COMSIG_LIVING_ATTACK_ATOM, attacked_atom, modifiers, attack_modifiers)
if(signal_return & COMPONENT_SKIP_ATTACK)
return TRUE
if(signal_return & COMPONENT_CANCEL_ATTACK_CHAIN)
@@ -260,30 +281,32 @@
user.changeNext_move(attack_speed)
if(get(src, /mob/living) == user) // telekinesis.
user.do_attack_animation(attacked_atom)
- attacked_atom.attacked_by(src, user)
- SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, attacked_atom, user, modifiers)
- SEND_SIGNAL(attacked_atom, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, modifiers)
- afterattack(attacked_atom, user, modifiers)
+ attacked_atom.attacked_by(src, user, modifiers, attack_modifiers)
+ SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, attacked_atom, user, modifiers, attack_modifiers)
+ SEND_SIGNAL(attacked_atom, COMSIG_ATOM_AFTER_ATTACKEDBY, src, user, modifiers, attack_modifiers)
+ afterattack(attacked_atom, user, modifiers, attack_modifiers)
return FALSE // unhandled
/// Called from [/obj/item/proc/attack_atom] and [/obj/item/proc/attack] if the attack succeeds
-/atom/proc/attacked_by(obj/item/attacking_item, mob/living/user)
+/atom/proc/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(!uses_integrity)
CRASH("attacked_by() was called on an object that doesn't use integrity!")
- if(!attacking_item.force)
- return
+ var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers)
+ if(final_force <= 0)
+ return 0
- var/damage = take_damage(attacking_item.force, attacking_item.damtype, MELEE, 1, get_dir(src, user))
+ var/damage = take_damage(final_force, attacking_item.damtype, MELEE, 1, get_dir(src, user))
//only witnesses close by and the victim see a hit message.
user.visible_message(span_danger("[user] hits [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), \
span_danger("You hit [src] with [attacking_item][damage ? "." : ", without leaving a mark!"]"), null, COMBAT_MESSAGE_RANGE)
log_combat(user, src, "attacked", attacking_item)
+ return damage
-/area/attacked_by(obj/item/attacking_item, mob/living/user)
+/area/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
CRASH("areas are NOT supposed to have attacked_by() called on them!")
-/mob/living/attacked_by(obj/item/attacking_item, mob/living/user)
+/mob/living/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
var/targeting = check_zone(user.zone_selected)
if(user != src)
@@ -293,7 +316,8 @@
targeting = get_random_valid_zone(targeting, zone_hit_chance)
var/targeting_human_readable = parse_zone_with_bodypart(targeting)
- send_item_attack_message(attacking_item, user, targeting_human_readable, targeting)
+ if(!LAZYACCESS(attack_modifiers, SILENCE_DEFAULT_MESSAGES))
+ send_item_attack_message(attacking_item, user, targeting_human_readable, targeting)
var/armor_block = min(run_armor_check(
def_zone = targeting,
@@ -304,9 +328,9 @@
weak_against_armour = attacking_item.weak_against_armour,
), ARMOR_MAX_BLOCK)
- var/damage = attacking_item.force
+ var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers)
if(mob_biotypes & MOB_ROBOTIC)
- damage *= attacking_item.get_demolition_modifier(src)
+ final_force *= attacking_item.get_demolition_modifier(src)
var/wounding = attacking_item.wound_bonus
if((attacking_item.item_flags & SURGICAL_TOOL) && !user.combat_mode && body_position == LYING_DOWN && (LAZYLEN(surgeries) > 0))
@@ -314,20 +338,20 @@
if(user != src)
// This doesn't factor in armor, or most damage modifiers (physiology). Your mileage may vary
- if(check_block(attacking_item, damage, "\the [attacking_item]", MELEE_ATTACK, attacking_item.armour_penetration, attacking_item.damtype))
- return FALSE
+ if(check_block(attacking_item, final_force, "\the [attacking_item]", MELEE_ATTACK, attacking_item.armour_penetration, attacking_item.damtype))
+ return 0
SEND_SIGNAL(attacking_item, COMSIG_ITEM_ATTACK_ZONE, src, user, targeting)
- if(damage <= 0)
- return TRUE
+ if(final_force <= 0)
+ return 1 // Pretend like we did 1 damage so afterattack still runs
if(ishuman(src) || client) // istype(src) is kinda bad, but it's to avoid spamming the blackbox
SSblackbox.record_feedback("nested tally", "item_used_for_combat", 1, list("[attacking_item.force]", "[attacking_item.type]"))
SSblackbox.record_feedback("tally", "zone_targeted", 1, targeting_human_readable)
var/damage_done = apply_damage(
- damage = damage,
+ damage = final_force,
damagetype = attacking_item.damtype,
def_zone = targeting,
blocked = armor_block,
@@ -340,7 +364,7 @@
attack_effects(damage_done, targeting, armor_block, attacking_item, user)
- return TRUE
+ return damage_done
/**
* Called when we take damage, used to cause effects such as a blood splatter.
@@ -436,7 +460,7 @@
* * proximity_flag - is 1 if this afterattack was called on something adjacent, in your square, or on your person.
* * click_parameters - is the params string from byond [/atom/proc/Click] code, see that documentation.
*/
-/obj/item/proc/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/proc/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
PROTECTED_PROC(TRUE)
return
diff --git a/code/datums/components/alternative_sharpness.dm b/code/datums/components/alternative_sharpness.dm
index 4518f708c0b..5709103d1eb 100644
--- a/code/datums/components/alternative_sharpness.dm
+++ b/code/datums/components/alternative_sharpness.dm
@@ -32,14 +32,14 @@
/datum/component/alternative_sharpness/RegisterWithParent()
RegisterSignal(parent, COMSIG_ITEM_PRE_ATTACK_SECONDARY, PROC_REF(on_secondary_attack))
-/datum/component/alternative_sharpness/proc/on_secondary_attack(obj/item/source, atom/target, mob/user, list/modifiers)
+/datum/component/alternative_sharpness/proc/on_secondary_attack(obj/item/source, atom/target, mob/user, list/modifiers, list/attack_modifiers)
SIGNAL_HANDLER
if (alt_attacking || (required_trait && !HAS_TRAIT(source, required_trait)))
return
alt_attacking = TRUE
- source.force += force_mod
+ MODIFY_ATTACK_FORCE(attack_modifiers, force_mod)
base_sharpness = source.sharpness
source.sharpness = alt_sharpness
if (!isnull(verbs_continuous))
@@ -54,7 +54,6 @@
/datum/component/alternative_sharpness/proc/disable_alt_attack()
var/obj/item/weapon = parent
alt_attacking = FALSE
- weapon.force -= force_mod
weapon.attack_verb_continuous = base_continuous
weapon.attack_verb_simple = base_simple
weapon.sharpness = base_sharpness
diff --git a/code/datums/components/focused_attacker.dm b/code/datums/components/focused_attacker.dm
index 12432414f77..23d88a9f5a6 100644
--- a/code/datums/components/focused_attacker.dm
+++ b/code/datums/components/focused_attacker.dm
@@ -3,6 +3,8 @@
* Not compatible with any other component or status effect which modifies attack damage
*/
/datum/component/focused_attacker
+ /// Current attack bonus
+ VAR_FINAL/current_gain
/// Amount of damage we gain per attack
var/gain_per_attack
/// Maximum amount by which we can increase our attack power
@@ -48,14 +50,14 @@
register_new_target(target)
/// Before an item attacks, try increasing its attack power
-/datum/component/focused_attacker/proc/pre_item_attack(obj/item/weapon, atom/target, mob/user, list/modifiers)
+/datum/component/focused_attacker/proc/pre_item_attack(obj/item/weapon, atom/target, mob/user, list/modifiers, list/attack_modifiers)
SIGNAL_HANDLER
if (target == last_target)
- if (weapon.force - initial(weapon.force) < maximum_gain)
- weapon.force += gain_per_attack
+ current_gain += gain_per_attack
+ MODIFY_ATTACK_FORCE(attack_modifiers, current_gain)
return
- weapon.force = initial(weapon.force)
+ current_gain = 0
register_new_target(target)
/// Register a new target
diff --git a/code/datums/components/trapdoor.dm b/code/datums/components/trapdoor.dm
index 73f24e6578c..87b80ebfdc9 100644
--- a/code/datums/components/trapdoor.dm
+++ b/code/datums/components/trapdoor.dm
@@ -339,7 +339,7 @@
internals.forceMove(get_turf(src))
internals = null
-/obj/item/trapdoor_remote/attackby(obj/item/assembly/trapdoor/assembly, mob/living/user, list/modifiers)
+/obj/item/trapdoor_remote/attackby(obj/item/assembly/trapdoor/assembly, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(. || !istype(assembly))
return
diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm
index 6236d708e9e..1f36421c14f 100644
--- a/code/datums/holocall.dm
+++ b/code/datums/holocall.dm
@@ -232,7 +232,7 @@
QDEL_NULL(record)
return ..()
-/obj/item/disk/holodisk/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/disk/holodisk/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/disk/holodisk))
var/obj/item/disk/holodisk/holodiskOriginal = item
if (holodiskOriginal.record)
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 70cf1a6071c..3bc463dbb72 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -271,7 +271,7 @@
icon_state = inhand_icon_state = "[base_icon_state][HAS_TRAIT(src, TRAIT_WIELDED)]"
return ..()
-/obj/item/staff/bostaff/attack(mob/target, mob/living/user, list/modifiers)
+/obj/item/staff/bostaff/attack(mob/target, mob/living/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if((HAS_TRAIT(user, TRAIT_CLUMSY)) && prob(50))
to_chat(user, span_warning("You club yourself over the head with [src]."))
diff --git a/code/datums/memory/tattoo_kit.dm b/code/datums/memory/tattoo_kit.dm
index da23f12634f..6ae053b3163 100644
--- a/code/datums/memory/tattoo_kit.dm
+++ b/code/datums/memory/tattoo_kit.dm
@@ -17,7 +17,7 @@
. += span_notice("This kit has enough ink for [uses] use\s.")
. += span_boldnotice("You can use a toner cartridge to refill this.")
-/obj/item/tattoo_kit/attackby(obj/item/toner/ink_cart, mob/living/tattoo_artist, list/modifiers)
+/obj/item/tattoo_kit/attackby(obj/item/toner/ink_cart, mob/living/tattoo_artist, list/modifiers, list/attack_modifiers)
. = ..()
if(!istype(ink_cart))
return
@@ -29,7 +29,7 @@
qdel(ink_cart)
balloon_alert(tattoo_artist, "added tattoo ink")
-/obj/item/tattoo_kit/attack(mob/living/tattoo_holder, mob/living/tattoo_artist, list/modifiers)
+/obj/item/tattoo_kit/attack(mob/living/tattoo_holder, mob/living/tattoo_artist, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return TRUE
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 7c5dca1cd29..c8497112101 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -109,7 +109,7 @@
power_change()
return ITEM_INTERACT_SUCCESS
-/obj/machinery/pdapainter/attackby(obj/item/O, mob/living/user, list/modifiers)
+/obj/machinery/pdapainter/attackby(obj/item/O, mob/living/user, list/modifiers, list/attack_modifiers)
if(machine_stat & BROKEN)
if(O.tool_behaviour == TOOL_WELDER && !user.combat_mode)
if(!O.tool_start_check(user, amount=1))
diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index f5afeb98f5f..501535d2590 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -804,13 +804,13 @@
return attack_robot(user)
return _try_interact(user)
-/obj/machinery/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
update_last_used(user)
-/obj/machinery/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
diff --git a/code/game/machinery/bank_machine.dm b/code/game/machinery/bank_machine.dm
index 056e7299ee0..de874b70003 100644
--- a/code/game/machinery/bank_machine.dm
+++ b/code/game/machinery/bank_machine.dm
@@ -43,7 +43,7 @@
synced_bank_account = null
return ..()
-/obj/machinery/computer/bank_machine/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/computer/bank_machine/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
var/value = 0
if(istype(weapon, /obj/item/stack/spacecash))
var/obj/item/stack/spacecash/inserted_cash = weapon
diff --git a/code/game/machinery/camera/camera_construction.dm b/code/game/machinery/camera/camera_construction.dm
index 95c08a85409..3b3fec8cd5d 100644
--- a/code/game/machinery/camera/camera_construction.dm
+++ b/code/game/machinery/camera/camera_construction.dm
@@ -119,7 +119,7 @@
return ITEM_INTERACT_SUCCESS
return ..()
-/obj/machinery/camera/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/camera/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(camera_construction_state != CAMERA_STATE_FINISHED || panel_open)
if(attacking_item.tool_behaviour == TOOL_ANALYZER)
if(!isXRay(TRUE)) //don't reveal it was already upgraded if was done via MALF AI Upgrade Camera Network ability
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index a232bf09204..6d3a59688d0 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -43,7 +43,7 @@
update_appearance()
return ITEM_INTERACT_SUCCESS
-/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/stock_parts/power_store/cell) && !panel_open)
if(machine_stat & BROKEN)
to_chat(user, span_warning("[src] is broken!"))
diff --git a/code/game/machinery/civilian_bounties.dm b/code/game/machinery/civilian_bounties.dm
index 913223fded7..b463ea45c21 100644
--- a/code/game/machinery/civilian_bounties.dm
+++ b/code/game/machinery/civilian_bounties.dm
@@ -47,7 +47,7 @@
///Typecast of an inserted, scanned ID card inside the console, as bounties are held within the ID card.
var/obj/item/card/id/inserted_scan_id
-/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/machinery/computer/piratepad_control/civilian/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(isidcard(I))
if(id_insert(user, I, inserted_scan_id))
inserted_scan_id = I
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 41ab9745976..7e74246ab3c 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -125,7 +125,7 @@ GLOBAL_VAR_INIT(cops_arrived, FALSE)
return ACCESS_CAPTAIN in authorize_access
// SKYRAT EDIT END
-/obj/machinery/computer/communications/attackby(obj/I, mob/user, list/modifiers)
+/obj/machinery/computer/communications/attackby(obj/I, mob/user, list/modifiers, list/attack_modifiers)
if(isidcard(I))
attack_hand(user)
else
diff --git a/code/game/machinery/computer/dna_console.dm b/code/game/machinery/computer/dna_console.dm
index b374faa53fa..fe10a55d8bf 100644
--- a/code/game/machinery/computer/dna_console.dm
+++ b/code/game/machinery/computer/dna_console.dm
@@ -172,7 +172,7 @@
genetic_damage_pulse()
return
-/obj/machinery/computer/scan_consolenew/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/computer/scan_consolenew/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
// Store chromosomes in the console if there's room
if (istype(item, /obj/item/chromosome))
item.forceMove(src)
diff --git a/code/game/machinery/computer/law.dm b/code/game/machinery/computer/law.dm
index dd72adf9a83..c854dc746ca 100644
--- a/code/game/machinery/computer/law.dm
+++ b/code/game/machinery/computer/law.dm
@@ -11,7 +11,7 @@
log_silicon("\A [name] was created at [loc_name(src)].")
message_admins("\A [name] was created at [ADMIN_VERBOSEJMP(src)].")
-/obj/machinery/computer/upload/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/machinery/computer/upload/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/ai_module))
var/obj/item/ai_module/M = O
if(machine_stat & (NOPOWER|BROKEN|MAINT))
diff --git a/code/game/machinery/computer/operating_computer.dm b/code/game/machinery/computer/operating_computer.dm
index e1ed92bb8d8..b0f36acbfe0 100644
--- a/code/game/machinery/computer/operating_computer.dm
+++ b/code/game/machinery/computer/operating_computer.dm
@@ -50,7 +50,7 @@
linked_techweb = tool.buffer
return TRUE
-/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/machinery/computer/operating/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/disk/surgery))
user.visible_message(span_notice("[user] begins to load \the [O] in \the [src]..."), \
span_notice("You begin to load a surgery protocol from \the [O]..."), \
diff --git a/code/game/machinery/computer/orders/order_computer/mining_order.dm b/code/game/machinery/computer/orders/order_computer/mining_order.dm
index 3274475bb3d..2f1acf491f0 100644
--- a/code/game/machinery/computer/orders/order_computer/mining_order.dm
+++ b/code/game/machinery/computer/orders/order_computer/mining_order.dm
@@ -103,7 +103,7 @@
. = ..()
. += span_notice("There's [points] point\s on the card.")
-/obj/item/card/mining_point_card/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/card/mining_point_card/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(!isidcard(attacking_item))
return ..()
var/obj/item/card/id/attacking_id = attacking_item
diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm
index 12b08e49190..6ad43ab5b05 100644
--- a/code/game/machinery/computer/prisoner/_prisoner.dm
+++ b/code/game/machinery/computer/prisoner/_prisoner.dm
@@ -50,7 +50,7 @@
balloon_alert_to_viewers("id ejected")
playsound(src, 'sound/machines/terminal/terminal_insert_disc.ogg', 50, FALSE)
-/obj/machinery/computer/prisoner/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/computer/prisoner/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/card/id/advanced/prisoner))
id_insert(user, weapon)
return TRUE
diff --git a/code/game/machinery/computer/records/medical.dm b/code/game/machinery/computer/records/medical.dm
index c564c71f310..c38256e6826 100644
--- a/code/game/machinery/computer/records/medical.dm
+++ b/code/game/machinery/computer/records/medical.dm
@@ -20,11 +20,11 @@
pass_flags = PASSTABLE
projectiles_pass_chance = 100
-/obj/machinery/computer/records/medical/attacked_by(obj/item/attacking_item, mob/living/user)
- . = ..()
- if(!istype(attacking_item, /obj/item/photo))
- return
- insert_new_record(user, attacking_item)
+/obj/machinery/computer/records/medical/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!istype(tool, /obj/item/photo))
+ return NONE
+ insert_new_record(user, tool)
+ return ITEM_INTERACT_SUCCESS
/obj/machinery/computer/records/medical/ui_interact(mob/user, datum/tgui/ui)
. = ..()
diff --git a/code/game/machinery/computer/records/security.dm b/code/game/machinery/computer/records/security.dm
index 17a46e34576..616367b0f84 100644
--- a/code/game/machinery/computer/records/security.dm
+++ b/code/game/machinery/computer/records/security.dm
@@ -66,11 +66,11 @@
qdel(target)
continue
-/obj/machinery/computer/records/security/attacked_by(obj/item/attacking_item, mob/living/user)
- . = ..()
- if(!istype(attacking_item, /obj/item/photo))
- return
- insert_new_record(user, attacking_item)
+/obj/machinery/computer/records/security/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!istype(tool, /obj/item/photo))
+ return NONE
+ insert_new_record(user, tool)
+ return ITEM_INTERACT_SUCCESS
/obj/machinery/computer/records/security/ui_interact(mob/user, datum/tgui/ui)
. = ..()
diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm
index 85d9e7fca1b..0bbfa1f80b9 100644
--- a/code/game/machinery/defibrillator_mount.dm
+++ b/code/game/machinery/defibrillator_mount.dm
@@ -81,7 +81,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/defibrillator_mount, 28)
return
user.put_in_hands(defib.paddles)
-/obj/machinery/defibrillator_mount/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/machinery/defibrillator_mount/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/defibrillator))
if(defib)
to_chat(user, span_warning("There's already a defibrillator in [src]!"))
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index b16cfc13c5d..34d40fbe189 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -26,7 +26,7 @@
return
-/obj/structure/barricade/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/structure/barricade/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_WELDER && !user.combat_mode && bar_material == METAL)
if(atom_integrity < max_integrity)
if(!I.tool_start_check(user, amount=1))
diff --git a/code/game/machinery/dish_drive.dm b/code/game/machinery/dish_drive.dm
index b933d459195..1645c178fbd 100644
--- a/code/game/machinery/dish_drive.dm
+++ b/code/game/machinery/dish_drive.dm
@@ -85,7 +85,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/dish_drive/attackby(obj/item/dish, mob/living/user, list/modifiers)
+/obj/machinery/dish_drive/attackby(obj/item/dish, mob/living/user, list/modifiers, list/attack_modifiers)
if(is_type_in_list(dish, collectable_items) && !user.combat_mode)
if(!user.transferItemToLoc(dish, src))
return
diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm
index 2070e1cb7a4..1e64561c9be 100644
--- a/code/game/machinery/dna_infuser/dna_infuser.dm
+++ b/code/game/machinery/dna_infuser/dna_infuser.dm
@@ -161,7 +161,7 @@
//we set drop to false to manually call it with an allowlist
dump_inventory_contents(list(occupant))
-/obj/machinery/dna_infuser/attackby(obj/item/used, mob/user, list/modifiers)
+/obj/machinery/dna_infuser/attackby(obj/item/used, mob/user, list/modifiers, list/attack_modifiers)
if(infusing)
return
if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, used))//sent icon_state is irrelevant...
diff --git a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm
index 58b629b684c..97e312a158c 100644
--- a/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/goliath_organs.dm
@@ -128,7 +128,7 @@
. = ..()
. += "You can use your tendril hammer arm to deliver a devastating blow against mining fauna, but only once every two seconds."
-/obj/item/goliath_infuser_hammer/attack(mob/living/target, mob/living/carbon/human/user, list/modifiers)
+/obj/item/goliath_infuser_hammer/attack(mob/living/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
. = ..()
//If we're on cooldown, we'll do a normal attack.
diff --git a/code/game/machinery/dna_scanner.dm b/code/game/machinery/dna_scanner.dm
index 73426e3bdfb..4c8a86b51cc 100644
--- a/code/game/machinery/dna_scanner.dm
+++ b/code/game/machinery/dna_scanner.dm
@@ -126,7 +126,7 @@
return
open_machine()
-/obj/machinery/dna_scannernew/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/dna_scannernew/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, item))//sent icon_state is irrelevant...
update_appearance()//..since we're updating the icon here, since the scanner can be unpowered when opened/closed
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index cecd76e088c..f5e1be3c53e 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1041,7 +1041,7 @@
update_appearance()
return TRUE
-/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, list/modifiers)
+/obj/machinery/door/airlock/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers)
if(!HAS_SILICON_ACCESS(user))
if(isElectrified() && (C.obj_flags & CONDUCTS_ELECTRICITY) && shock(user, 75))
return
diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm
index 88e37b9d777..517fe1a65ae 100644
--- a/code/game/machinery/doors/door.dm
+++ b/code/game/machinery/doors/door.dm
@@ -367,7 +367,7 @@
try_to_crowbar(tool, user, forced_open)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/door/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/machinery/door/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/access_key))
var/obj/item/access_key/key = weapon
return key.attempt_open_door(user, src)
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index ae81a56e463..9d6546b5644 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -306,7 +306,7 @@
/obj/machinery/firealarm/attack_robot_secondary(mob/user)
return attack_hand_secondary(user)
-/obj/machinery/firealarm/attackby(obj/item/tool, mob/living/user, list/modifiers)
+/obj/machinery/firealarm/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(tool.tool_behaviour == TOOL_SCREWDRIVER && buildstage == FIRE_ALARM_BUILD_SECURED)
diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm
index 3cdeb3f94ad..1d98eb41bcd 100644
--- a/code/game/machinery/flasher.dm
+++ b/code/game/machinery/flasher.dm
@@ -62,7 +62,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26)
return ..()
//Don't want to render prison breaks impossible
-/obj/machinery/flasher/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/flasher/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if (attacking_item.tool_behaviour == TOOL_WIRECUTTER)
if (bulb)
@@ -185,7 +185,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/flasher, 26)
if(vname == NAMEOF(src, flash_range))
proximity_monitor?.set_range(flash_range)
-/obj/machinery/flasher/portable/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/flasher/portable/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if (attacking_item.tool_behaviour == TOOL_WRENCH)
attacking_item.play_tool_sound(src, 100)
diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm
index aecc6d8fd1e..c070e4920c9 100644
--- a/code/game/machinery/hologram.dm
+++ b/code/game/machinery/hologram.dm
@@ -258,7 +258,7 @@ Possible to do for anyone motivated enough:
if(record_mode)
record_stop()
-/obj/machinery/holopad/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/holopad/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", item))
return
diff --git a/code/game/machinery/hypnochair.dm b/code/game/machinery/hypnochair.dm
index 617006b8f47..80f0fb2778d 100644
--- a/code/game/machinery/hypnochair.dm
+++ b/code/game/machinery/hypnochair.dm
@@ -27,7 +27,7 @@
open_machine()
update_appearance()
-/obj/machinery/hypnochair/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/hypnochair/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, item))
update_appearance()
return
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index beb1b966a6e..c891e15cd91 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -179,7 +179,7 @@
user.visible_message(span_warning("[user] attaches [src] to [target]."), span_notice("You attach [src] to [target]."))
attach_iv(target, user)
-/obj/machinery/iv_drip/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/iv_drip/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(use_internal_storage)
return ..()
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index 1a48dbff661..e3cef8bcc4e 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -75,7 +75,7 @@
balloon_alert(user, "saved to buffer")
return ITEM_INTERACT_SUCCESS
-/obj/machinery/launchpad/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/launchpad/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(!stationary)
return ..()
@@ -312,7 +312,7 @@
closed = TRUE
update_indicator()
-/obj/machinery/launchpad/briefcase/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/launchpad/briefcase/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/launchpad_remote))
var/obj/item/launchpad_remote/launch = item
if(launch.pad == WEAKREF(src)) //do not attempt to link when already linked
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 57727a43068..43dfb9ee79c 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -54,7 +54,7 @@
O.throw_at(target, drive_range * power, power)
flick("mass_driver1", src)
-/obj/machinery/mass_driver/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/machinery/mass_driver/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(is_wire_tool(item) && panel_open)
wires.interact(user)
diff --git a/code/game/machinery/medical_kiosk.dm b/code/game/machinery/medical_kiosk.dm
index 83e90bc98c5..a7603303f8d 100644
--- a/code/game/machinery/medical_kiosk.dm
+++ b/code/game/machinery/medical_kiosk.dm
@@ -117,7 +117,7 @@
active_price = board.custom_cost
return
-/obj/machinery/medical_kiosk/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/machinery/medical_kiosk/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "[base_icon_state]_open", "[base_icon_state]_off", O))
return
else if(default_deconstruction_crowbar(O))
diff --git a/code/game/machinery/modular_shield.dm b/code/game/machinery/modular_shield.dm
index c79e32086ec..c11bebc5fe9 100644
--- a/code/game/machinery/modular_shield.dm
+++ b/code/game/machinery/modular_shield.dm
@@ -143,7 +143,7 @@
if(default_deconstruction_crowbar(tool))
return TRUE
-/obj/machinery/modular_shield_generator/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/modular_shield_generator/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(is_wire_tool(W) && panel_open)
wires.interact(user)
diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm
index d36df5e9290..a3f1859fe26 100644
--- a/code/game/machinery/navbeacon.dm
+++ b/code/game/machinery/navbeacon.dm
@@ -115,7 +115,7 @@
return TRUE
return default_deconstruction_screwdriver(user, "navbeacon1","navbeacon0",tool)
-/obj/machinery/navbeacon/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/navbeacon/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
var/turf/our_turf = loc
if(our_turf.underfloor_accessibility < UNDERFLOOR_INTERACTABLE)
return // prevent intraction when T-scanner revealed
diff --git a/code/game/machinery/nebula_shielding.dm b/code/game/machinery/nebula_shielding.dm
index d1f7104479e..8cf41265df4 100644
--- a/code/game/machinery/nebula_shielding.dm
+++ b/code/game/machinery/nebula_shielding.dm
@@ -109,7 +109,7 @@
if(isopenturf(turf))
turf.atmos_spawn_air("[GAS_TRITIUM]=1;[TURF_TEMPERATURE(T20C)]")
-/obj/machinery/nebula_shielding/radiation/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/nebula_shielding/radiation/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, initial(icon_state) + "_open", initial(icon_state), item))
return
diff --git a/code/game/machinery/newscaster/newscaster_machine.dm b/code/game/machinery/newscaster/newscaster_machine.dm
index 6e52741dc21..402ae4768bc 100644
--- a/code/game/machinery/newscaster/newscaster_machine.dm
+++ b/code/game/machinery/newscaster/newscaster_machine.dm
@@ -486,7 +486,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/newscaster, 30)
. = ..()
update_appearance()
-/obj/machinery/newscaster/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/newscaster/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/paper))
if(!user.temporarilyRemoveItemFromInventory(attacking_item))
return
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 46e73e6fe79..7c8e0b642b4 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -151,7 +151,7 @@
ui = new(user, src, "PipeDispenser", name)
ui.open()
-/obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/pipedispenser/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter))
to_chat(usr, span_notice("You put [W] back into [src]."))
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index 41d1ce5a5a3..d5fe7413b78 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -324,7 +324,7 @@ DEFINE_BITFIELD(turret_flags, list(
balloon_alert(user, "saved to multitool buffer")
return ITEM_INTERACT_SUCCESS
-/obj/machinery/porta_turret/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/porta_turret/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(machine_stat & BROKEN)
if(I.tool_behaviour == TOOL_CROWBAR)
//If the turret is destroyed, you can remove it with a crowbar to
@@ -996,7 +996,7 @@ DEFINE_BITFIELD(turret_flags, list(
to_chat(user, span_notice("You link \the [multi_tool.buffer] with \the [src]."))
return ITEM_INTERACT_SUCCESS
-/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/turretid/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(machine_stat & BROKEN)
return
diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm
index 959752ef263..93b0ada37fa 100644
--- a/code/game/machinery/porta_turret/portable_turret_construct.dm
+++ b/code/game/machinery/porta_turret/portable_turret_construct.dm
@@ -40,7 +40,7 @@
if(PTURRET_START_EXTERNAL_ARMOUR)
. += span_notice("The turret's armor needs to be welded in place, the armor looks like it could be pried off.")
-/obj/machinery/porta_turret_construct/attackby(obj/item/used, mob/user, list/modifiers)
+/obj/machinery/porta_turret_construct/attackby(obj/item/used, mob/user, list/modifiers, list/attack_modifiers)
//this is a bit unwieldy but self-explanatory
switch(build_step)
if(PTURRET_UNSECURED) //first step
diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm
index dd950a00a4a..9ce769c1ddc 100644
--- a/code/game/machinery/porta_turret/portable_turret_cover.dm
+++ b/code/game/machinery/porta_turret/portable_turret_cover.dm
@@ -45,7 +45,7 @@
balloon_alert(user, "saved to multitool buffer")
return ITEM_INTERACT_SUCCESS
-/obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/porta_turret_cover/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_WRENCH && !parent_turret.on)
if(parent_turret.raised)
return
@@ -72,8 +72,8 @@
return ..()
-/obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user)
- parent_turret.attacked_by(I, user)
+/obj/machinery/porta_turret_cover/attacked_by(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
+ return parent_turret.attacked_by(I, user, modifiers)
/obj/machinery/porta_turret_cover/attack_alien(mob/living/carbon/alien/adult/user, list/modifiers)
parent_turret.attack_alien(user, modifiers)
diff --git a/code/game/machinery/prisonlabor.dm b/code/game/machinery/prisonlabor.dm
index e226adcbbc5..24373326b0e 100644
--- a/code/game/machinery/prisonlabor.dm
+++ b/code/game/machinery/prisonlabor.dm
@@ -26,7 +26,7 @@
QDEL_NULL(current_plate)
. = ..()
-/obj/machinery/plate_press/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/machinery/plate_press/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(!is_operational)
to_chat(user, span_warning("[src] has to be on to do this!"))
return FALSE
diff --git a/code/game/machinery/quantum_pad.dm b/code/game/machinery/quantum_pad.dm
index 48be6b53b5b..397b62e35da 100644
--- a/code/game/machinery/quantum_pad.dm
+++ b/code/game/machinery/quantum_pad.dm
@@ -71,7 +71,7 @@
balloon_alert(user, "no quantum pad data found!")
return NONE
-/obj/machinery/quantumpad/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/quantumpad/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "qpad-idle-open", "qpad-idle", weapon))
return
@@ -248,5 +248,3 @@
failed.set_output(COMPONENT_SIGNAL)
return
attached_pad.doteleport(target_pad = attached_pad.linked_pad)
-
-
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 6f9a60b9d7e..0804fa9a5ff 100755
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -85,7 +85,7 @@
update_appearance()
return ..()
-/obj/machinery/recharger/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/recharger/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(!is_type_in_typecache(attacking_item, allowed_devices))
return ..()
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index f1690718a81..5cf4dc31525 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -109,7 +109,7 @@
if (!(. & EMP_PROTECT_SELF))
open_machine()
-/obj/machinery/recharge_station/attackby(obj/item/P, mob/user, list/modifiers)
+/obj/machinery/recharge_station/attackby(obj/item/P, mob/user, list/modifiers, list/attack_modifiers)
if(state_open)
if(default_deconstruction_screwdriver(user, "borgdecon2", "borgcharger0", P))
return
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index b49131ae341..b2436cd54dc 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -384,7 +384,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments)
to_chat(user, span_warning("You must open the maintenance panel first!"))
return TRUE
-/obj/machinery/requests_console/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/requests_console/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
var/obj/item/card/id/ID = attacking_item.GetID()
if(ID)
message_verified_by = "[ID.registered_name] ([ID.assignment])"
diff --git a/code/game/machinery/roulette_machine.dm b/code/game/machinery/roulette_machine.dm
index 482623e3347..2cc2225c6c1 100644
--- a/code/game/machinery/roulette_machine.dm
+++ b/code/game/machinery/roulette_machine.dm
@@ -116,7 +116,7 @@
update_appearance() // Not applicable to all objects.
///Handles setting ownership and the betting itself.
-/obj/machinery/roulette/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/roulette/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(machine_stat & MAINT && is_wire_tool(W))
wires.interact(user)
return
diff --git a/code/game/machinery/scanner_gate.dm b/code/game/machinery/scanner_gate.dm
index 6131739571c..b5fd3e9eaee 100644
--- a/code/game/machinery/scanner_gate.dm
+++ b/code/game/machinery/scanner_gate.dm
@@ -151,7 +151,7 @@
return
set_scanline("passive")
-/obj/machinery/scanner_gate/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/scanner_gate/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
var/obj/item/card/id/card = attacking_item.GetID()
if(card)
if(locked)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index 238205bf535..24057c27a34 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -236,7 +236,7 @@
set_anchored(FALSE)
-/obj/machinery/shieldgen/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/shieldgen/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/stack/cable_coil) && (machine_stat & BROKEN) && panel_open)
var/obj/item/stack/cable_coil/coil = W
if (coil.get_amount() < 1)
@@ -460,7 +460,7 @@
return
return default_deconstruction_crowbar(tool)
-/obj/machinery/power/shieldwallgen/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/power/shieldwallgen/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(W.GetID())
if(allowed(user) && !(obj_flags & EMAGGED))
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index a99d4cfaba4..7ed0bb3b5d6 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -202,7 +202,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/space_heater/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/space_heater/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(default_deconstruction_screwdriver(user, icon_state, icon_state, I))
@@ -402,7 +402,7 @@
. = TRUE
///Slightly modified to ignore the open_hatch - it's always open, we hacked it.
-/obj/machinery/space_heater/improvised_chem_heater/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/space_heater/improvised_chem_heater/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(default_deconstruction_crowbar(item))
return
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index d3e2c90618b..342a0d5120e 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -639,7 +639,7 @@
return TRUE
-/obj/machinery/suit_storage_unit/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/suit_storage_unit/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = TRUE
var/obj/item/card/id/id = null
if(istype(weapon, /obj/item/stock_parts/card_reader) && can_install_card_reader(user))
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index f921509f968..ed27105b11a 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -189,7 +189,7 @@
return TRUE
-/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/syndicatebomb/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(is_wire_tool(I) && open_panel)
wires.interact(user)
@@ -533,7 +533,7 @@
playsound(loc, 'sound/effects/bamf.ogg', 75, TRUE, 5)
-/obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/bombcore/chemical/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_CROWBAR && beakers.len > 0)
I.play_tool_sound(src)
for (var/obj/item/B in beakers)
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index 4045c742332..f61349208a3 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -15,7 +15,7 @@
FREQ_CTF_BLUE,
)
-/obj/machinery/telecomms/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/telecomms/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
var/icon_closed = initial(icon_state)
var/icon_open = "[initial(icon_state)]_o"
diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm
index ab849dd6923..bd30c5ba0b5 100644
--- a/code/game/machinery/telecomms/machines/allinone.dm
+++ b/code/game/machinery/telecomms/machines/allinone.dm
@@ -45,6 +45,6 @@
sleep(signal.data["slow"]) // simulate the network lag if necessary
signal.broadcast()
-/obj/machinery/telecomms/allinone/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/telecomms/allinone/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(attacking_item.tool_behaviour == TOOL_MULTITOOL)
return attack_hand(user)
diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm
index fd991540ef3..5a8b137c701 100644
--- a/code/game/machinery/telecomms/machines/message_server.dm
+++ b/code/game/machinery/telecomms/machines/message_server.dm
@@ -34,7 +34,7 @@
to_chat(user, span_warning("It seems that the blackbox is missing..."))
return
-/obj/machinery/blackbox_recorder/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/blackbox_recorder/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/blackbox))
if(HAS_TRAIT(attacking_item, TRAIT_NODROP) || !user.transferItemToLoc(attacking_item, src))
to_chat(user, span_warning("[attacking_item] is stuck to your hand!"))
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index d55e3922417..06a4220f004 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -52,7 +52,7 @@
if(is_ready())
teleport(AM)
-/obj/machinery/teleport/hub/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/teleport/hub/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "tele-o", "tele0", W))
if(power_station?.engaged)
power_station.engaged = 0 //hub with panel open is off, so the station must be informed.
@@ -179,7 +179,7 @@
balloon_alert(user, "data uploaded from buffer")
return ITEM_INTERACT_SUCCESS
-/obj/machinery/teleport/station/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/teleport/station/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "controller-o", "controller", W))
update_appearance()
return
diff --git a/code/game/objects/effects/decals/cleanable.dm b/code/game/objects/effects/decals/cleanable.dm
index 1fdeb997e1d..c267c0092d7 100644
--- a/code/game/objects/effects/decals/cleanable.dm
+++ b/code/game/objects/effects/decals/cleanable.dm
@@ -81,7 +81,7 @@
if(mergeable_decal)
return TRUE
-/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/effect/decal/cleanable/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if((istype(W, /obj/item/reagent_containers/cup) && !istype(W, /obj/item/rag)) || istype(W, /obj/item/reagent_containers/cup/glass))
if(src.reagents && W.reagents)
. = 1 //so the containers don't splash their content on the src while scooping.
diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm
index 4921c4fa4ed..cb99987ba77 100644
--- a/code/game/objects/effects/decals/cleanable/misc.dm
+++ b/code/game/objects/effects/decals/cleanable/misc.dm
@@ -537,7 +537,7 @@
ignite()
log_combat(hit_proj.firer, src, "used [hit_proj] to ignite")
-/obj/effect/decal/cleanable/fuel_pool/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/effect/decal/cleanable/fuel_pool/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(item.ignition_effect(src, user))
ignite()
log_combat(user, src, "used [item] to ignite")
diff --git a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
index 55d29fdc651..c377b4bc9ce 100644
--- a/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/fluid_spread/effects_foam.dm
@@ -346,7 +346,7 @@
to_chat(user, span_warning("You hit [src] but bounce off it!"))
playsound(src.loc, 'sound/items/weapons/tap.ogg', 100, TRUE)
-/obj/structure/foamedmetal/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/foamedmetal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
///A speed modifier for how fast the wall is build
var/platingmodifier = 1
if(HAS_TRAIT(user, TRAIT_QUICK_BUILD))
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index a6179f240be..c37f0d16338 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -9,8 +9,8 @@
blocks_emissive = EMISSIVE_BLOCK_GENERIC
uses_integrity = FALSE
-/obj/effect/attackby(obj/item/weapon, mob/user, list/modifiers)
- if(SEND_SIGNAL(weapon, COMSIG_ITEM_ATTACK_EFFECT, src, user, modifiers) & COMPONENT_NO_AFTERATTACK)
+/obj/effect/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
+ if(SEND_SIGNAL(weapon, COMSIG_ITEM_ATTACK_EFFECT, src, user, modifiers, attack_modifiers) & COMPONENT_NO_AFTERATTACK)
return TRUE
// I'm not sure why these are snowflaked to early return but they are
diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm
index d4c27f09be2..8acf36f6e6f 100644
--- a/code/game/objects/effects/portals.dm
+++ b/code/game/objects/effects/portals.dm
@@ -69,7 +69,7 @@
/obj/effect/portal/newtonian_move(inertia_angle, instant = FALSE, start_delay = 0, drift_force = 0, controlled_cap = null)
return TRUE
-/obj/effect/portal/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/effect/portal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(user && Adjacent(user))
teleport(user)
return TRUE
diff --git a/code/game/objects/effects/poster_demotivational.dm b/code/game/objects/effects/poster_demotivational.dm
index 956e954437a..ef946372dfd 100644
--- a/code/game/objects/effects/poster_demotivational.dm
+++ b/code/game/objects/effects/poster_demotivational.dm
@@ -23,7 +23,7 @@
demoraliser = new(src, 7, TRUE, mood_category)
return ..()
-/obj/structure/sign/poster/traitor/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/structure/sign/poster/traitor/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
if (tool.tool_behaviour == TOOL_WIRECUTTER)
QDEL_NULL(demoraliser)
return ..()
diff --git a/code/game/objects/effects/poster_motivational.dm b/code/game/objects/effects/poster_motivational.dm
index 0b84d77b234..377fa271211 100644
--- a/code/game/objects/effects/poster_motivational.dm
+++ b/code/game/objects/effects/poster_motivational.dm
@@ -17,7 +17,7 @@
department_grab.quirk_poster_department = quirk_poster_department
/// You can use any spraypaint can on a quirk poster to turn it into a contraband poster from the traitor objective
-/obj/item/poster/quirk/attackby(obj/item/postertool, mob/user, list/modifiers)
+/obj/item/poster/quirk/attackby(obj/item/postertool, mob/user, list/modifiers, list/attack_modifiers)
if(!is_special_character(user) || !HAS_TRAIT(user, TRAIT_POSTERBOY) || !istype(postertool, /obj/item/toy/crayon))
return ..()
balloon_alert(user, "converting poster...")
@@ -50,7 +50,7 @@
mood_buff = new(_host = src, range = 7, _ignore_if_not_on_turf = TRUE, department = quirk_poster_department)
return ..()
-/obj/structure/sign/poster/quirk/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/sign/poster/quirk/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if (I.tool_behaviour == TOOL_WIRECUTTER)
QDEL_NULL(mood_buff)
return ..()
diff --git a/code/game/objects/effects/posters/poster.dm b/code/game/objects/effects/posters/poster.dm
index 3664fa69c4c..e0edb768e88 100644
--- a/code/game/objects/effects/posters/poster.dm
+++ b/code/game/objects/effects/posters/poster.dm
@@ -53,7 +53,7 @@
name = "[name] - [poster_structure.original_name]"
-/obj/item/poster/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/poster/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(I, /obj/item/shard))
return ..()
@@ -172,7 +172,7 @@
desc = holi_data.poster_desc
icon_state = holi_data.poster_icon
-/obj/structure/sign/poster/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/structure/sign/poster/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
if(tool.tool_behaviour == TOOL_WIRECUTTER)
tool.play_tool_sound(src, 100)
if(ruined)
diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
index 0700a2abac8..3dec4218ca2 100644
--- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm
+++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm
@@ -590,7 +590,7 @@
playsound(loc, 'sound/items/weapons/egloves.ogg', vol = 80, vary = TRUE)
end()
-/obj/effect/constructing_effect/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/effect/constructing_effect/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
attacked(user)
/obj/effect/constructing_effect/attack_hand(mob/living/user, list/modifiers)
diff --git a/code/game/objects/items/airlock_painter.dm b/code/game/objects/items/airlock_painter.dm
index 88fe3cc556b..04bce0b64a7 100644
--- a/code/game/objects/items/airlock_painter.dm
+++ b/code/game/objects/items/airlock_painter.dm
@@ -134,7 +134,7 @@
. += span_notice("Its ink levels look [ink_level].")
-/obj/item/airlock_painter/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/airlock_painter/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/toner))
if(ink)
to_chat(user, span_warning("[src] already contains \a [ink]!"))
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
index f5b60dc33ff..dbb767e280b 100644
--- a/code/game/objects/items/cardboard_cutouts.dm
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -79,7 +79,7 @@
pushed_over = FALSE
tacticool = AddComponent(/datum/component/tactical)
-/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/toy/crayon))
change_appearance(I, user)
return TRUE
diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm
index d98d9229a24..0215cf85f2e 100644
--- a/code/game/objects/items/chainsaw.dm
+++ b/code/game/objects/items/chainsaw.dm
@@ -87,7 +87,7 @@
myhead.dismember()
return BRUTELOSS
-/obj/item/chainsaw/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/chainsaw/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
if (target_mob.stat != DEAD)
return ..()
diff --git a/code/game/objects/items/cigarettes.dm b/code/game/objects/items/cigarettes.dm
index 4bdb1a000b4..ca409877246 100644
--- a/code/game/objects/items/cigarettes.dm
+++ b/code/game/objects/items/cigarettes.dm
@@ -335,7 +335,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
user.visible_message(span_suicide("[user] is huffing [src] as quickly as [user.p_they()] can! It looks like [user.p_theyre()] trying to give [user.p_them()]self cancer."))
return (TOXLOSS|OXYLOSS)
-/obj/item/cigarette/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/cigarette/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(lit)
return ..()
@@ -896,7 +896,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
STOP_PROCESSING(SSobj, src)
QDEL_NULL(cig_smoke)
-/obj/item/cigarette/pipe/attackby(obj/item/thing, mob/user, list/modifiers)
+/obj/item/cigarette/pipe/attackby(obj/item/thing, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(thing, /obj/item/food/grown))
return ..()
diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm
index f3085da2f4c..5b3bca0ecd5 100644
--- a/code/game/objects/items/cosmetics.dm
+++ b/code/game/objects/items/cosmetics.dm
@@ -208,7 +208,7 @@
skinhead.set_hairstyle("Skinhead", update = TRUE)
playsound(loc, 'sound/items/tools/welder2.ogg', 20, TRUE)
-/obj/item/razor/attack(mob/target_mob, mob/living/user, list/modifiers)
+/obj/item/razor/attack(mob/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
if(!ishuman(target_mob))
return ..()
var/mob/living/carbon/human/human_target = target_mob
diff --git a/code/game/objects/items/courtroom.dm b/code/game/objects/items/courtroom.dm
index facca62d760..d605a3b05f1 100644
--- a/code/game/objects/items/courtroom.dm
+++ b/code/game/objects/items/courtroom.dm
@@ -34,7 +34,7 @@
w_class = WEIGHT_CLASS_TINY
resistance_flags = FLAMMABLE
-/obj/item/gavelblock/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/gavelblock/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/gavelhammer))
playsound(loc, 'sound/items/gavel.ogg', 100, TRUE)
user.visible_message(span_warning("[user] strikes [src] with [I]."))
diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm
index 51e64adb3a1..59973a8617a 100644
--- a/code/game/objects/items/crab17.dm
+++ b/code/game/objects/items/crab17.dm
@@ -64,7 +64,7 @@
return FALSE
return TRUE
-/obj/structure/checkoutmachine/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/checkoutmachine/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(!canwalk)
balloon_alert(user, "not ready to accept transactions!")
return
diff --git a/code/game/objects/items/credit_holochip.dm b/code/game/objects/items/credit_holochip.dm
index 7f80341db38..2fc6fc9c9da 100644
--- a/code/game/objects/items/credit_holochip.dm
+++ b/code/game/objects/items/credit_holochip.dm
@@ -95,7 +95,7 @@
else
return 0
-/obj/item/holochip/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/holochip/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
..()
if(istype(I, /obj/item/holochip))
var/obj/item/holochip/H = I
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 59acf80e7b4..2f9c82cea1e 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -437,7 +437,7 @@
forceMove(defib)
defib.update_power()
-/obj/item/shockpaddles/attack(mob/M, mob/living/user, list/modifiers)
+/obj/item/shockpaddles/attack(mob/M, mob/living/user, list/modifiers, list/attack_modifiers)
if(busy)
return
defib?.update_power()
diff --git a/code/game/objects/items/devices/aicard_evil.dm b/code/game/objects/items/devices/aicard_evil.dm
index c987b254a48..f4c89c31444 100644
--- a/code/game/objects/items/devices/aicard_evil.dm
+++ b/code/game/objects/items/devices/aicard_evil.dm
@@ -95,7 +95,7 @@
max_capacity = 1000
w_class = WEIGHT_CLASS_NORMAL
-/obj/item/computer_disk/syndie_ai_upgrade/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/computer_disk/syndie_ai_upgrade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
var/mob/living/silicon/ai/AI
if(isAI(target))
AI = target
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index 073430cb7ae..3fe51527e3a 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -91,7 +91,7 @@
crystal_lens = null
return ITEM_INTERACT_SUCCESS
-/obj/item/laser_pointer/attackby(obj/item/attack_item, mob/user, list/modifiers)
+/obj/item/laser_pointer/attackby(obj/item/attack_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attack_item, /obj/item/stock_parts/micro_laser))
if(diode)
balloon_alert(user, "already has a diode!")
diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm
index c9f1cf72f73..dceece6fac9 100644
--- a/code/game/objects/items/devices/lightreplacer.dm
+++ b/code/game/objects/items/devices/lightreplacer.dm
@@ -76,7 +76,7 @@
//replace lights & stuff
return do_action(interacting_with, user) ? ITEM_INTERACT_SUCCESS : NONE
-/obj/item/lightreplacer/attackby(obj/item/insert, mob/user, list/modifiers)
+/obj/item/lightreplacer/attackby(obj/item/insert, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(uses >= max_uses)
user.balloon_alert(user, "already full!")
diff --git a/code/game/objects/items/devices/radio/electropack.dm b/code/game/objects/items/devices/radio/electropack.dm
index fd1b8865a9c..3867ace4fc1 100644
--- a/code/game/objects/items/devices/radio/electropack.dm
+++ b/code/game/objects/items/devices/radio/electropack.dm
@@ -37,7 +37,7 @@
return
return ..()
-/obj/item/electropack/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/electropack/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/clothing/head/helmet))
var/obj/item/assembly/shock_kit/A = new /obj/item/assembly/shock_kit(user)
A.icon = 'icons/obj/devices/assemblies.dmi'
diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm
index 9da5dc843ac..cb6ca697bbd 100644
--- a/code/game/objects/items/devices/radio/headset.dm
+++ b/code/game/objects/items/devices/radio/headset.dm
@@ -474,7 +474,7 @@ GLOBAL_LIST_INIT(channel_tokens, list(
tool.play_tool_sound(src, 10)
return TRUE
-/obj/item/radio/headset/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/radio/headset/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/encryptionkey))
if(keyslot && keyslot2)
to_chat(user, span_warning("The headset can't hold another key!"))
diff --git a/code/game/objects/items/devices/swapper.dm b/code/game/objects/items/devices/swapper.dm
index ff5de1d9681..5927ca07151 100644
--- a/code/game/objects/items/devices/swapper.dm
+++ b/code/game/objects/items/devices/swapper.dm
@@ -27,7 +27,7 @@
icon_state = "swapper[linked_swapper ? "-linked" : null]"
return ..()
-/obj/item/swapper/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/swapper/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/swapper))
var/obj/item/swapper/other_swapper = I
if(other_swapper.linked_swapper)
diff --git a/code/game/objects/items/devices/table_clock.dm b/code/game/objects/items/devices/table_clock.dm
index b5868dbfb4e..4f1c539f573 100644
--- a/code/game/objects/items/devices/table_clock.dm
+++ b/code/game/objects/items/devices/table_clock.dm
@@ -33,7 +33,7 @@
. += span_info("The current CST (local) time is: [station_time_timestamp()].")
. += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss", NO_TIMEZONE)].")
-/obj/item/table_clock/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/table_clock/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(attacking_item.force < 5 || broken)
return
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index f2ecc7106ce..a34d5a4e3c8 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -84,7 +84,7 @@
else
soundloop.start()
-/obj/item/taperecorder/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/taperecorder/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!mytape && istype(I, /obj/item/tape))
if(!user.transferItemToLoc(I,src))
return
diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index 213a3cca4fd..1135708959e 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -441,7 +441,7 @@ effective or pretty fucking useless.
return TRUE
-/obj/machinery/porta_turret/syndicate/toolbox/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/porta_turret/syndicate/toolbox/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(!istype(attacking_item, /obj/item/wrench/combat))
return ..()
diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm
index 06f682da94e..1b0ffaab204 100644
--- a/code/game/objects/items/dualsaber.dm
+++ b/code/game/objects/items/dualsaber.dm
@@ -208,7 +208,7 @@
/obj/item/dualsaber/purple
possible_colors = list("purple")
-/obj/item/dualsaber/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/dualsaber/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.tool_behaviour == TOOL_MULTITOOL)
if(!hacked)
hacked = TRUE
diff --git a/code/game/objects/items/dyespray.dm b/code/game/objects/items/dyespray.dm
index d22b28ed8e6..86caea178e7 100644
--- a/code/game/objects/items/dyespray.dm
+++ b/code/game/objects/items/dyespray.dm
@@ -10,7 +10,7 @@
/obj/item/dyespray/attack_self(mob/user)
dye(user, user)
-/obj/item/dyespray/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/dyespray/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
dye(target, user)
return ..()
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index dd1f9b2e3fd..dd067988673 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -187,7 +187,7 @@
else
return ..()
-/obj/item/extinguisher/attack_atom(obj/O, mob/living/user, list/modifiers)
+/obj/item/extinguisher/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers)
if(AttemptRefill(O, user))
refilling = TRUE
return FALSE
@@ -322,7 +322,7 @@
user.visible_message(span_notice("[user] empties out \the [src] onto the floor using the release valve."), span_info("You quietly empty out \the [src] using its release valve."))
//firebot assembly
-/obj/item/extinguisher/attackby(obj/O, mob/user, list/modifiers)
+/obj/item/extinguisher/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/bodypart/arm/left/robot) || istype(O, /obj/item/bodypart/arm/right/robot))
to_chat(user, span_notice("You add [O] to [src]."))
qdel(O)
diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm
index f820b33d8f2..d09bb1f162e 100644
--- a/code/game/objects/items/fireaxe.dm
+++ b/code/game/objects/items/fireaxe.dm
@@ -64,7 +64,7 @@ GLOBAL_DATUM(bridge_axe, /obj/item/fireaxe)
user.visible_message(span_suicide("[user] axes [user.p_them()]self from head to toe! It looks like [user.p_theyre()] trying to commit suicide!"))
return BRUTELOSS
-/obj/item/fireaxe/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/fireaxe/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(!HAS_TRAIT(src, TRAIT_WIELDED)) //destroys windows and grilles in one hit
return
if(target.resistance_flags & INDESTRUCTIBLE)
diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm
index a7166ef4545..659bdc11667 100644
--- a/code/game/objects/items/flamethrower.dm
+++ b/code/game/objects/items/flamethrower.dm
@@ -119,7 +119,7 @@
update_appearance()
return TRUE
-/obj/item/flamethrower/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/flamethrower/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(isigniter(W))
var/obj/item/assembly/igniter/I = W
if(I.secured)
diff --git a/code/game/objects/items/food/egg.dm b/code/game/objects/items/food/egg.dm
index 4b971ce167f..d154ce1ea51 100644
--- a/code/game/objects/items/food/egg.dm
+++ b/code/game/objects/items/food/egg.dm
@@ -88,7 +88,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0)
new /mob/living/basic/chick(spawn_turf)
GLOB.chicks_from_eggs++
-/obj/item/food/egg/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/food/egg/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/toy/crayon))
var/obj/item/toy/crayon/crayon = item
var/clr = crayon.crayon_color
@@ -282,7 +282,7 @@ GLOBAL_VAR_INIT(chicks_from_eggs, 0)
. = ..()
AddElement(/datum/element/love_food_buff, /datum/status_effect/food/speech/french)
-/obj/item/food/omelette/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/food/omelette/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/kitchen/fork))
var/obj/item/kitchen/fork/fork = item
if(fork.forkload)
diff --git a/code/game/objects/items/food/misc.dm b/code/game/objects/items/food/misc.dm
index 751ad21bfa9..c2d7b4c6da8 100644
--- a/code/game/objects/items/food/misc.dm
+++ b/code/game/objects/items/food/misc.dm
@@ -373,7 +373,7 @@
if (can_stick)
. += span_notice("If you had a rod you could make butter on a stick.")
-/obj/item/food/butter/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/food/butter/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(item, /obj/item/stack/rods) || !can_stick)
return ..()
var/obj/item/stack/rods/rods = item
diff --git a/code/game/objects/items/food/pancakes.dm b/code/game/objects/items/food/pancakes.dm
index cbe782e2863..51e2b2c1b43 100644
--- a/code/game/objects/items/food/pancakes.dm
+++ b/code/game/objects/items/food/pancakes.dm
@@ -30,7 +30,7 @@
positive_result = TRUE,\
use_large_steam_sprite = TRUE)
-/obj/item/food/pancakes/raw/attackby(obj/item/garnish, mob/living/user, list/modifiers)
+/obj/item/food/pancakes/raw/attackby(obj/item/garnish, mob/living/user, list/modifiers, list/attack_modifiers)
var/newresult
if(istype(garnish, /obj/item/food/grown/berries))
newresult = /obj/item/food/pancakes/blueberry
@@ -117,7 +117,7 @@
ingredients_listed += "[ING.name], "
. += "It contains [contents.len?"[ingredients_listed]":"no ingredient, "]on top of a [initial(name)]."
-/obj/item/food/pancakes/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/food/pancakes/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/food/pancakes))
var/obj/item/food/pancakes/pancake = item
if((contents.len >= PANCAKE_MAX_STACK) || ((pancake.contents.len + contents.len) > PANCAKE_MAX_STACK))
diff --git a/code/game/objects/items/grenades/festive.dm b/code/game/objects/items/grenades/festive.dm
index d7b295e4d08..faa8d8da5bf 100644
--- a/code/game/objects/items/grenades/festive.dm
+++ b/code/game/objects/items/grenades/festive.dm
@@ -14,7 +14,7 @@
/obj/item/sparkler/fire_act(exposed_temperature, exposed_volume)
light()
-/obj/item/sparkler/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/sparkler/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
var/ignition_msg = item.ignition_effect(src, user)
if(ignition_msg)
light(user, ignition_msg)
@@ -75,7 +75,7 @@
/obj/item/grenade/firecracker/attack_self(mob/user) // You need to light it manually.
return
-/obj/item/grenade/firecracker/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/grenade/firecracker/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
var/ignition_msg = item.ignition_effect(src, user)
if(ignition_msg && !active)
visible_message(ignition_msg)
@@ -117,5 +117,3 @@
update_mob()
explosion(src, devastation_range = -1, heavy_impact_range = -1, light_impact_range = 2)
qdel(src)
-
-
diff --git a/code/game/objects/items/grenades/ghettobomb.dm b/code/game/objects/items/grenades/ghettobomb.dm
index 26f8ecdfab8..b10c6e6e976 100644
--- a/code/game/objects/items/grenades/ghettobomb.dm
+++ b/code/game/objects/items/grenades/ghettobomb.dm
@@ -217,7 +217,7 @@
else
. += span_notice("The wires are just dangling from it, you need some sort of activating assembly.")
-/obj/item/sliced_pipe/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/sliced_pipe/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!wires_are_in)
// here we can stuff in additional objects for a cooler effect
if(is_type_in_typecache(item, allowed) && contents.len < MAX_STUFFINGS)
diff --git a/code/game/objects/items/grenades/plastic.dm b/code/game/objects/items/grenades/plastic.dm
index 879e2f3353f..0787f538e6b 100644
--- a/code/game/objects/items/grenades/plastic.dm
+++ b/code/game/objects/items/grenades/plastic.dm
@@ -58,7 +58,7 @@
to_chat(user, span_notice("The wire panel can be accessed without a screwdriver."))
return TRUE
-/obj/item/grenade/c4/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/grenade/c4/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(is_wire_tool(item))
wires.interact(user)
else
diff --git a/code/game/objects/items/hand_items.dm b/code/game/objects/items/hand_items.dm
index 47e3fd1a0ee..0e9ea7a28c5 100644
--- a/code/game/objects/items/hand_items.dm
+++ b/code/game/objects/items/hand_items.dm
@@ -282,14 +282,14 @@
playsound(slapped, 'sound/items/weapons/slap.ogg', slap_volume, TRUE, -1)
return
-/obj/item/hand_item/slapper/pre_attack_secondary(atom/target, mob/living/user, list/modifiers)
+/obj/item/hand_item/slapper/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!loc.Adjacent(target) || !istype(target, /obj/structure/table))
return ..()
slam_table(target, user)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/item/hand_item/slapper/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/hand_item/slapper/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!loc.Adjacent(target) || !istype(target, /obj/structure/table))
return ..()
@@ -352,7 +352,7 @@
desc = "Sometimes, you just want to act gentlemanly."
inhand_icon_state = "nothing"
-/obj/item/hand_item/hand/pre_attack(mob/living/carbon/help_target, mob/living/carbon/helper, list/modifiers)
+/obj/item/hand_item/hand/pre_attack(mob/living/carbon/help_target, mob/living/carbon/helper, list/modifiers, list/attack_modifiers)
if(!loc.Adjacent(help_target) || !istype(helper) || !istype(help_target))
return ..()
@@ -361,7 +361,7 @@
return TRUE
-/obj/item/hand_item/hand/pre_attack_secondary(mob/living/carbon/help_target, mob/living/carbon/helper, list/modifiers)
+/obj/item/hand_item/hand/pre_attack_secondary(mob/living/carbon/help_target, mob/living/carbon/helper, list/modifiers, list/attack_modifiers)
if(!loc.Adjacent(help_target) || !istype(helper) || !istype(help_target))
return ..()
@@ -372,7 +372,7 @@
return SECONDARY_ATTACK_CALL_NORMAL
-/obj/item/hand_item/hand/attack(mob/living/carbon/target_mob, mob/living/carbon/user, list/modifiers)
+/obj/item/hand_item/hand/attack(mob/living/carbon/target_mob, mob/living/carbon/user, list/modifiers, list/attack_modifiers)
if(!loc.Adjacent(target_mob) || !istype(user) || !istype(target_mob))
return TRUE
@@ -454,7 +454,7 @@
attack_verb_continuous = list("steals")
attack_verb_simple = list("steal")
-/obj/item/hand_item/stealer/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/hand_item/stealer/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if (!ishuman(target_mob))
return
diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm
index 36d11973608..b39603e4c51 100644
--- a/code/game/objects/items/hot_potato.dm
+++ b/code/game/objects/items/hot_potato.dm
@@ -98,7 +98,7 @@
if(active)
to_chat(user, span_userdanger("You have a really bad feeling about [src]!"))
-/obj/item/hot_potato/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/hot_potato/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return .
diff --git a/code/game/objects/items/implants/implantcase.dm b/code/game/objects/items/implants/implantcase.dm
index e081248f8ad..87fca49be89 100644
--- a/code/game/objects/items/implants/implantcase.dm
+++ b/code/game/objects/items/implants/implantcase.dm
@@ -35,7 +35,7 @@
icon_state = "implantcase-[imp ? imp.implant_color : 0]"
return ..()
-/obj/item/implantcase/attackby(obj/item/used_item, mob/living/user, list/modifiers)
+/obj/item/implantcase/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(IS_WRITING_UTENSIL(used_item))
if(!user.can_write(used_item))
return
diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm
index 60b23563be9..522cf0e3a93 100644
--- a/code/game/objects/items/implants/implanter.dm
+++ b/code/game/objects/items/implants/implanter.dm
@@ -44,7 +44,7 @@
else
to_chat(user, span_warning("[src] fails to implant [target]."))
-/obj/item/implanter/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/implanter/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(IS_WRITING_UTENSIL(I))
return ..()
if(!user.can_write(I))
diff --git a/code/game/objects/items/implants/implantpad.dm b/code/game/objects/items/implants/implantpad.dm
index 908127367a3..18594c116d5 100644
--- a/code/game/objects/items/implants/implantpad.dm
+++ b/code/game/objects/items/implants/implantpad.dm
@@ -37,7 +37,7 @@
inserted_case = null
update_appearance(UPDATE_ICON)
-/obj/item/implantpad/attackby(obj/item/implantcase/attacking_item, mob/user, list/modifiers)
+/obj/item/implantpad/attackby(obj/item/implantcase/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(inserted_case || !istype(attacking_item))
return ..()
if(!user.transferItemToLoc(attacking_item, src))
diff --git a/code/game/objects/items/implants/security/implant_chem.dm b/code/game/objects/items/implants/security/implant_chem.dm
index e20da8ab7b9..178dfcae2a6 100644
--- a/code/game/objects/items/implants/security/implant_chem.dm
+++ b/code/game/objects/items/implants/security/implant_chem.dm
@@ -95,7 +95,7 @@
desc = "A glass case containing a remote chemical implant."
imp_type = /obj/item/implant/chem
-/obj/item/implantcase/chem/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/implantcase/chem/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/reagent_containers/syringe) && imp)
W.interact_with_atom(imp, user, modifiers)
return TRUE
diff --git a/code/game/objects/items/inspector.dm b/code/game/objects/items/inspector.dm
index 5c314197725..d0feef1471e 100644
--- a/code/game/objects/items/inspector.dm
+++ b/code/game/objects/items/inspector.dm
@@ -67,7 +67,7 @@
balloon_alert(user, "[cell_cover_open ? "opened" : "closed"] cell cover")
return TRUE
-/obj/item/inspector/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/inspector/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(cell_cover_open && istype(I, /obj/item/stock_parts/power_store/cell))
if(cell)
to_chat(user, span_warning("[src] already has a cell installed."))
@@ -274,7 +274,7 @@
cycle_print_time(user)
return TRUE
-/obj/item/inspector/clown/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/inspector/clown/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(cell_cover_open && istype(I, /obj/item/kitchen/fork))
cycle_sound(user)
return
@@ -353,7 +353,7 @@
check_settings_legality()
return TRUE
-/obj/item/inspector/clown/bananium/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/inspector/clown/bananium/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(cell_cover_open)
check_settings_legality()
diff --git a/code/game/objects/items/kirby_plants/kirbyplants.dm b/code/game/objects/items/kirby_plants/kirbyplants.dm
index fb109eb1aae..90e74d86496 100644
--- a/code/game/objects/items/kirby_plants/kirbyplants.dm
+++ b/code/game/objects/items/kirby_plants/kirbyplants.dm
@@ -52,7 +52,7 @@
. = ..()
icon_state = dead ? "plant-25" : base_icon_state
-/obj/item/kirbyplants/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/kirbyplants/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!dead && trimmable && HAS_TRAIT(user,TRAIT_BONSAI) && isturf(loc) && I.get_sharpness())
to_chat(user,span_notice("You start trimming [src]."))
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 8bf9d69f7ec..88e790a4b6b 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -236,7 +236,7 @@
filled_overlay.color = mix_color_from_reagents(reagents.reagent_list)
. += filled_overlay
-/obj/item/kitchen/spoon/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/kitchen/spoon/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
if(!target_mob.reagents || reagents.total_volume <= 0)
return ..()
@@ -270,7 +270,7 @@
reagents.trans_to(target_mob, spoon_sip_size, methods = INGEST)
return TRUE
-/obj/item/kitchen/spoon/pre_attack(atom/attacked_atom, mob/living/user, list/modifiers)
+/obj/item/kitchen/spoon/pre_attack(atom/attacked_atom, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
@@ -290,7 +290,7 @@
attacked_atom.balloon_alert(user, "it's full!")
return TRUE
-/obj/item/kitchen/spoon/pre_attack_secondary(atom/attacked_atom, mob/living/user, list/modifiers)
+/obj/item/kitchen/spoon/pre_attack_secondary(atom/attacked_atom, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return
diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm
index 45a245c4066..d0747600cd9 100644
--- a/code/game/objects/items/knives.dm
+++ b/code/game/objects/items/knives.dm
@@ -88,7 +88,7 @@
/// Bleed stacks applied when an organic mob target is hit
var/bleed_stacks_per_hit = 3
-/obj/item/knife/bloodletter/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/knife/bloodletter/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(!isliving(target))
return
var/mob/living/M = target
@@ -335,4 +335,3 @@
inhand_icon_state = "rootshiv"
icon_angle = -45
custom_materials = null
-
diff --git a/code/game/objects/items/latexballoon.dm b/code/game/objects/items/latexballoon.dm
index 7dd3493e6b3..e08080504dd 100644
--- a/code/game/objects/items/latexballoon.dm
+++ b/code/game/objects/items/latexballoon.dm
@@ -101,7 +101,7 @@
return ..()
-/obj/item/latexballoon/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/latexballoon/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/tank))
var/obj/item/tank/air_tank = item
blow(air_tank, user)
diff --git a/code/game/objects/items/lighter.dm b/code/game/objects/items/lighter.dm
index f98f6880b7b..066d75a1e54 100644
--- a/code/game/objects/items/lighter.dm
+++ b/code/game/objects/items/lighter.dm
@@ -192,7 +192,7 @@
)
user.add_mood_event("burnt_thumb", /datum/mood_event/burnt_thumb)
-/obj/item/lighter/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/lighter/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
if(lit)
use(0.5)
if(target_mob.ignite_mob())
diff --git a/code/game/objects/items/mail.dm b/code/game/objects/items/mail.dm
index 10403973b81..e53c199912b 100644
--- a/code/game/objects/items/mail.dm
+++ b/code/game/objects/items/mail.dm
@@ -100,7 +100,7 @@
postmark_image.appearance_flags |= RESET_COLOR|KEEP_APART
. += postmark_image
-/obj/item/mail/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/mail/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
// Destination tagging
if(istype(W, /obj/item/dest_tagger))
var/obj/item/dest_tagger/destination_tag = W
diff --git a/code/game/objects/items/melee/baton.dm b/code/game/objects/items/melee/baton.dm
index bd8d8b8f43b..50268c1199d 100644
--- a/code/game/objects/items/melee/baton.dm
+++ b/code/game/objects/items/melee/baton.dm
@@ -41,12 +41,15 @@
var/on_stun_sound = 'sound/effects/woodhit.ogg'
/// The volume of the above.
var/on_stun_volume = 75
- /// Do we animate the "hit" when stunning something?
- var/stun_animation = TRUE
/// Whether the stun attack is logged. Only relevant for abductor batons, which have different modes.
var/log_stun_attack = TRUE
/// Boolean on whether people with chunky fingers can use this baton.
var/chunky_finger_usable = FALSE
+ /// Boolean, if TRUE when we harmbaton someone we will also try to stun if the baton is active / not on cooldown.
+ var/stun_on_harmbaton = FALSE
+
+ /// Text shown when trying to stun someone while the baton is on cooldown.
+ var/wait_desc = ""
/// What term do we use to describe our baton being 'ready', or the phrase to use when var/active is TRUE.
var/activated_word = "ready"
@@ -96,37 +99,83 @@
readout += "\nIt has a stun armor-piercing capability of [span_warning("[get_stun_penetration_value()]%")]."
return readout.Join("\n")
-/**
- * Ok, think of baton attacks like a melee attack chain:
- *
- * [/baton_attack()] comes first. It checks if the user is clumsy, if the target parried the attack and handles some messages and sounds.
- * * Depending on its return value, it'll either do a normal attack, continue to the next step or stop the attack.
- *
- * [/finalize_baton_attack()] is then called. It handles logging stuff, sound effects and calls baton_effect().
- * * The proc is also called in other situations such as stunbatons right clicking or throw impact. Basically when baton_attack()
- * * checks are either redundant or unnecessary.
- *
- * [/baton_effect()] is third in the line. It knockdowns targets, along other effects called in additional_effects_cyborg() and
- * * additional_effects_non_cyborg().
- *
- * Last but not least [/set_batoned()], which gives the target the IWASBATONED trait with REF(user) as source and then removes it
- * * after a cooldown has passed. Basically, it stops users from cheesing the cooldowns by dual wielding batons.
- *
- * TL;DR: [/baton_attack()] -> [/finalize_baton_attack()] -> [/baton_effect()] -> [/set_batoned()]
- */
-/obj/item/melee/baton/attack(mob/living/target, mob/living/user, list/modifiers)
- add_fingerprint(user)
- switch(baton_attack(target, user, modifiers))
- if(BATON_DO_NORMAL_ATTACK)
- return ..()
- if(BATON_ATTACKING)
- finalize_baton_attack(target, user, modifiers)
+/// Checks if we can actually USE the baton. Impure
+/obj/item/melee/baton/proc/can_baton(mob/living/target, mob/living/user)
+ PROTECTED_PROC(TRUE)
+ if(clumsy_check(user, target))
+ return FALSE
+
+ if(!chunky_finger_usable && ishuman(user))
+ var/mob/living/carbon/human/human_user = user
+ if(human_user.check_chunky_fingers() && user.is_holding(src) && !HAS_MIND_TRAIT(user, TRAIT_CHUNKYFINGERS_IGNORE_BATON))
+ balloon_alert(human_user, "fingers are too big!")
+ return FALSE
+
+ return TRUE
+
+// Stun attack
+/obj/item/melee/baton/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
+ . = ..()
+ if(. || !isliving(target))
+ return .
+
+ if(!can_baton(target, user))
+ return TRUE
+
+ if(!COOLDOWN_FINISHED(src, cooldown_check))
+ if(wait_desc)
+ balloon_alert(user, wait_desc)
+ return TRUE
+
+ if(HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) //no doublebaton abuse anon!
+ target.balloon_alert(user, "can't stun yet!")
+ return TRUE
+
+ if(active)
+ // when we continue to attack, deal 0 (brute) damage (just stun)
+ SET_ATTACK_FORCE(attack_modifiers, 0)
+ MUTE_ATTACK_HITSOUND(attack_modifiers)
+ HIDE_ATTACK_MESSAGES(attack_modifiers)
+ return .
+
+// Harm attack
+/obj/item/melee/baton/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
+ . = ..()
+ if(. != SECONDARY_ATTACK_CALL_NORMAL || !isliving(target))
+ return .
+
+ if(!can_baton(target, user))
+ return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
+
+ // call attack, NOT pre_attack
+ // (so we go directly to harming)
+ return SECONDARY_ATTACK_CONTINUE_CHAIN
+
+// This is where stun gets applied
+/obj/item/melee/baton/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
+ if(!active || !COOLDOWN_FINISHED(src, cooldown_check) || HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user)))
+ return
+ // worst check in the chain but - right click = harmbaton
+ if(LAZYACCESS(modifiers, RIGHT_CLICK) && !stun_on_harmbaton)
+ return
+
+ finalize_baton_attack(target, user, modifiers)
+
+ var/list/desc
+ if(iscyborg(target))
+ desc = get_cyborg_stun_description(target, user)
+ if(!affect_cyborg)
+ playsound(src, 'sound/effects/bang.ogg', 10, TRUE) //bonk
+ else
+ desc = get_stun_description(target, user)
+
+ if(desc)
+ target.visible_message(desc["visible"], desc["local"], visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE)
/obj/item/melee/baton/apply_fantasy_bonuses(bonus)
. = ..()
stamina_damage = modify_fantasy_variable("stamina_damage", stamina_damage, bonus * 4)
-
/obj/item/melee/baton/remove_fantasy_bonuses(bonus)
stamina_damage = reset_fantasy_variable("stamina_damage", stamina_damage)
return ..()
@@ -155,74 +204,19 @@
return CONTEXTUAL_SCREENTIP_SET
-/obj/item/melee/baton/proc/baton_attack(mob/living/target, mob/living/user, modifiers)
- . = BATON_ATTACKING
-
- if(clumsy_check(user, target))
- return BATON_ATTACK_DONE
-
- if(!chunky_finger_usable && ishuman(user))
- var/mob/living/carbon/human/potential_chunky_finger_human = user
- if(potential_chunky_finger_human.check_chunky_fingers() && user.is_holding(src) && !HAS_MIND_TRAIT(user, TRAIT_CHUNKYFINGERS_IGNORE_BATON))
- balloon_alert(potential_chunky_finger_human, "fingers are too big!")
- return BATON_ATTACK_DONE
-
- if(!active || LAZYACCESS(modifiers, RIGHT_CLICK))
- return BATON_DO_NORMAL_ATTACK
-
- if(cooldown_check > world.time)
- var/wait_desc = get_wait_description()
- if (wait_desc)
- to_chat(user, wait_desc)
- return BATON_ATTACK_DONE
-
- if(check_parried(target, user))
- return BATON_ATTACK_DONE
-
- if(HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user))) //no doublebaton abuse anon!
- to_chat(user, span_danger("You fumble and miss [target]!"))
- return BATON_ATTACK_DONE
-
- if(stun_animation)
- user.do_attack_animation(target)
-
- var/list/desc
-
- if(iscyborg(target))
- if(affect_cyborg)
- desc = get_cyborg_stun_description(target, user)
- else
- desc = get_unga_dunga_cyborg_stun_description(target, user)
- playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE) //bonk
- . = BATON_ATTACK_DONE
- else
- desc = get_stun_description(target, user)
-
- if(desc)
- target.visible_message(desc["visible"], desc["local"])
-
-/obj/item/melee/baton/proc/check_parried(mob/living/carbon/human/human_target, mob/living/user)
- if (human_target.check_block(src, 0, "[user]'s [name]", MELEE_ATTACK))
- playsound(human_target, 'sound/items/weapons/genhit.ogg', 50, TRUE)
- return TRUE
- return FALSE
-
-/obj/item/melee/baton/proc/finalize_baton_attack(mob/living/target, mob/living/user, modifiers, in_attack_chain = TRUE)
- if(!in_attack_chain && HAS_TRAIT_FROM(target, TRAIT_IWASBATONED, REF(user)))
- return BATON_ATTACK_DONE
-
- cooldown_check = world.time + cooldown
+/// Wrapper for calling "stun()" and doing relevant vfx/sfx
+/obj/item/melee/baton/proc/finalize_baton_attack(mob/living/target, mob/living/user, list/modifiers)
+ PROTECTED_PROC(TRUE)
+ COOLDOWN_START(src, cooldown_check, cooldown)
if(on_stun_sound)
- playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1)
- if(user)
- target.lastattacker = user.real_name
- target.lastattackerckey = user.ckey
- if(log_stun_attack)
- log_combat(user, target, "stun attacked", src)
+ playsound(src, on_stun_sound, on_stun_volume, TRUE, -1)
if(baton_effect(target, user, modifiers) && user)
set_batoned(target, user, cooldown)
+ log_combat(user, target, "stunned", src.name)
-/obj/item/melee/baton/proc/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override)
+/// The actual "stun()" of the stun baton
+/obj/item/melee/baton/proc/baton_effect(mob/living/target, mob/living/user, list/modifiers, stun_override)
+ PROTECTED_PROC(TRUE)
var/trait_check = HAS_TRAIT(target, TRAIT_BATON_RESISTANCE)
if(iscyborg(target))
if(!affect_cyborg)
@@ -244,46 +238,37 @@
SEND_SIGNAL(target, COMSIG_MOB_BATONED, user, src)
return TRUE
-/// Description for trying to stun when still on cooldown.
-/obj/item/melee/baton/proc/get_wait_description()
- return
-
/// Default message for stunning a living, non-cyborg mob.
/obj/item/melee/baton/proc/get_stun_description(mob/living/target, mob/living/user)
+ PROTECTED_PROC(TRUE)
. = list()
-
.["visible"] = span_danger("[user] knocks [target] down with [src]!")
.["local"] = span_userdanger("[user] knocks you down with [src]!")
- return .
-
/// Default message for stunning a cyborg.
/obj/item/melee/baton/proc/get_cyborg_stun_description(mob/living/target, mob/living/user)
+ PROTECTED_PROC(TRUE)
. = list()
-
- .["visible"] = span_danger("[user] pulses [target]'s sensors with the baton!")
- .["local"] = span_danger("You pulse [target]'s sensors with the baton!")
-
- return .
-
-/// Default message for trying to stun a cyborg with a baton that can't stun cyborgs.
-/obj/item/melee/baton/proc/get_unga_dunga_cyborg_stun_description(mob/living/target, mob/living/user)
- . = list()
-
- .["visible"] = span_danger("[user] tries to knock down [target] with [src], and predictably fails!") //look at this duuuuuude
- .["local"] = span_userdanger("[user] tries to... knock you down with [src]?") //look at the top of his head!
-
- return .
+ if(affect_cyborg)
+ .["visible"] = span_danger("[user] pulses [target]'s sensors with the baton!")
+ .["local"] = span_danger("You pulse [target]'s sensors with the baton!")
+ else
+ .["visible"] = span_danger("[user] tries to knock down [target] with [src], and predictably fails!") //look at this duuuuuude
+ .["local"] = span_userdanger("[user] tries to... knock you down with [src]?") //look at the top of his head!
/// Contains any special effects that we apply to living, non-cyborg mobs we stun. Does not include applying a knockdown, dealing stamina damage, etc.
/obj/item/melee/baton/proc/additional_effects_non_cyborg(mob/living/target, mob/living/user)
+ PROTECTED_PROC(TRUE)
return
/// Contains any special effects that we apply to cyborgs we stun. Does not include flashing the cyborg's screen, hardstunning them, etc.
/obj/item/melee/baton/proc/additional_effects_cyborg(mob/living/target, mob/living/user)
+ PROTECTED_PROC(TRUE)
return
+/// Used in marking a target as being hit by a baton
/obj/item/melee/baton/proc/set_batoned(mob/living/target, mob/living/user, cooldown)
+ PRIVATE_PROC(TRUE)
if(!cooldown)
return
var/user_ref = REF(user) // avoids harddels.
@@ -293,7 +278,7 @@
/obj/item/melee/baton/proc/clumsy_check(mob/living/user, mob/living/intented_target)
if(!active || !HAS_TRAIT(user, TRAIT_CLUMSY) || prob(50))
return FALSE
- user.visible_message(span_danger("[user] accidentally hits [user.p_them()]self over the head with [src]! What a doofus!"), span_userdanger("You accidentally hit yourself over the head with [src]!"))
+ user.visible_message(span_danger("[user] accidentally hits [user.p_them()]self over the head with [src]! What a doofus!"), span_userdanger("You accidentally hit yourself over the head with [src]!"), visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE)
if(iscyborg(user))
if(affect_cyborg)
@@ -301,9 +286,9 @@
user.Paralyze(clumsy_knockdown_time)
additional_effects_cyborg(user, user) // user is the target here
if(on_stun_sound)
- playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1)
+ playsound(src, on_stun_sound, on_stun_volume, TRUE, -1)
else
- playsound(get_turf(src), 'sound/effects/bang.ogg', 10, TRUE)
+ playsound(src, 'sound/effects/bang.ogg', 10, TRUE)
else
//straight up always force say for clumsy humans
if(ishuman(user))
@@ -313,14 +298,11 @@
user.apply_damage(stamina_damage, STAMINA)
additional_effects_non_cyborg(user, user) // user is the target here
if(on_stun_sound)
- playsound(get_turf(src), on_stun_sound, on_stun_volume, TRUE, -1)
-
- user.apply_damage(2*force, BRUTE, BODY_ZONE_HEAD, attacking_item = src)
+ playsound(src, on_stun_sound, on_stun_volume, TRUE, -1)
+ user.apply_damage(2 * force, BRUTE, BODY_ZONE_HEAD, attacking_item = src)
log_combat(user, user, "accidentally stun attacked [user.p_them()]self due to their clumsiness", src)
- if(stun_animation)
- user.do_attack_animation(user)
- return
+ user.do_attack_animation(user)
/// Handles the penetration value of our baton, called during baton_effect()
/obj/item/melee/baton/proc/get_stun_penetration_value()
@@ -461,6 +443,7 @@
stun_armour_penetration = 40
clumsy_knockdown_time = 24 SECONDS
affect_cyborg = TRUE
+ wait_desc = "still charging!"
on_stun_sound = 'sound/items/weapons/contractor_baton/contractorbatonhit.ogg'
unfolded_drop_sound = 'sound/items/baton/contractor_baton_unfolded_pickup.ogg'
unfolded_pickup_sound = 'sound/items/baton/contractor_baton_unfolded_pickup.ogg'
@@ -469,9 +452,6 @@
on_sound = 'sound/items/weapons/contractorbatonextend.ogg'
active_force = 16
-/obj/item/melee/baton/telescopic/contractor_baton/get_wait_description()
- return span_danger("The baton is still charging!")
-
/obj/item/melee/baton/telescopic/contractor_baton/additional_effects_non_cyborg(mob/living/target, mob/living/user)
. = ..()
target.set_jitter_if_lower(40 SECONDS)
@@ -504,6 +484,8 @@
on_stun_sound = 'sound/items/weapons/egloves.ogg'
on_stun_volume = 50
active = FALSE
+ stun_on_harmbaton = TRUE
+ wait_desc = "still charging!"
activated_word = "activated"
context_living_rmb_active = "Harmful Stun"
light_range = 1.5
@@ -553,7 +535,7 @@
/obj/item/melee/baton/security/suicide_act(mob/living/user)
if(cell?.charge && active)
user.visible_message(span_suicide("[user] is putting the live [name] in [user.p_their()] mouth! It looks like [user.p_theyre()] trying to commit suicide!"))
- attack(user, user)
+ finalize_baton_attack(user, user)
return FIRELOSS
else
user.visible_message(span_suicide("[user] is shoving \the [src] down their throat! It looks like [user.p_theyre()] trying to commit suicide!"))
@@ -624,7 +606,7 @@
tool.play_tool_sound(src)
return TRUE
-/obj/item/melee/baton/security/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/melee/baton/security/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/stock_parts/power_store/cell))
var/obj/item/stock_parts/power_store/cell/active_cell = item
if(cell)
@@ -727,18 +709,20 @@
SEND_SIGNAL(user, COMSIG_LIVING_MINOR_SHOCK)
deductcharge(cell_hit_cost)
-/// Handles prodding targets with turned off stunbatons and right clicking stun'n'bash
-/obj/item/melee/baton/security/baton_attack(mob/living/target, mob/living/user, modifiers)
+/obj/item/melee/baton/security/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
- if(. != BATON_DO_NORMAL_ATTACK)
- return
- if(LAZYACCESS(modifiers, RIGHT_CLICK))
- if(active && cooldown_check <= world.time && !check_parried(target, user))
- finalize_baton_attack(target, user, modifiers, in_attack_chain = FALSE)
- else if(!user.combat_mode)
- target.visible_message(span_warning("[user] prods [target] with [src]. Luckily it was off."), \
- span_warning("[user] prods you with [src]. Luckily it was off."))
- return BATON_ATTACK_DONE
+ if(. || !isliving(target))
+ return .
+
+ if(!active && !user.combat_mode)
+ target.visible_message(
+ span_warning("[user] prods [target] with [src]. Luckily it was off."),
+ span_warning("[user] prods you with [src]. Luckily it was off."),
+ visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE,
+ )
+ return TRUE
+
+ return .
/obj/item/melee/baton/security/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override)
if(iscyborg(loc))
@@ -778,25 +762,22 @@
if(!trait_check)
target.Knockdown(knockdown_time)
-/obj/item/melee/baton/security/get_wait_description()
- return span_danger("The baton is still charging!")
-
/obj/item/melee/baton/security/get_stun_description(mob/living/target, mob/living/user)
. = list()
.["visible"] = span_danger("[user] stuns [target] with [src]!")
.["local"] = span_userdanger("[user] stuns you with [src]!")
-/obj/item/melee/baton/security/get_unga_dunga_cyborg_stun_description(mob/living/target, mob/living/user)
- . = list()
-
- .["visible"] = span_danger("[user] tries to stun [target] with [src], and predictably fails!")
- .["local"] = span_userdanger("[user] tries to... stun you with [src]?")
+/obj/item/melee/baton/security/get_cyborg_stun_description(mob/living/target, mob/living/user)
+ . = ..()
+ if(!affect_cyborg)
+ .["visible"] = span_danger("[user] tries to stun [target] with [src], and predictably fails!")
+ .["local"] = span_userdanger("[user] tries to... stun you with [src]?")
/obj/item/melee/baton/security/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
if(!. && active && prob(throw_stun_chance) && isliving(hit_atom))
- finalize_baton_attack(hit_atom, throwingdatum.get_thrower(), in_attack_chain = FALSE)
+ finalize_baton_attack(hit_atom, throwingdatum.get_thrower())
/obj/item/melee/baton/security/emp_act(severity)
. = ..()
@@ -857,7 +838,7 @@
. = ..()
sparkler = new (src)
-/obj/item/melee/baton/security/cattleprod/attackby(obj/item/item, mob/user, list/modifiers)//handles sticking a crystal onto a stunprod to make an improved cattleprod
+/obj/item/melee/baton/security/cattleprod/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)//handles sticking a crystal onto a stunprod to make an improved cattleprod
if(!istype(item, /obj/item/stack))
return ..()
@@ -889,9 +870,9 @@
var/obj/item/melee/baton/security/cattleprod/brand_new_prod = new our_prod(user.loc)
user.put_in_hands(brand_new_prod)
-/obj/item/melee/baton/security/cattleprod/baton_effect()
+/obj/item/melee/baton/security/cattleprod/can_baton(mob/living/target, mob/living/user)
if(!sparkler.activate())
- return BATON_ATTACK_DONE
+ return FALSE
return ..()
/obj/item/melee/baton/security/cattleprod/Destroy()
@@ -919,15 +900,7 @@
/obj/item/melee/baton/security/boomerang/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/boomerang, throw_range+2, TRUE)
-
-/obj/item/melee/baton/security/boomerang/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- if(!active)
- return ..()
- var/caught = hit_atom.hitby(src, skipcatch = FALSE, hitpush = FALSE, throwingdatum = throwingdatum)
- var/mob/thrown_by = throwingdatum.get_thrower()
- if(isliving(hit_atom) && !iscyborg(hit_atom) && !caught && prob(throw_stun_chance))//if they are a living creature and they didn't catch it
- finalize_baton_attack(hit_atom, thrown_by, in_attack_chain = FALSE)
+ AddComponent(/datum/component/boomerang, throw_range + 2, TRUE)
/obj/item/melee/baton/security/boomerang/loaded //Same as above, comes with a cell.
preload_cell_type = /obj/item/stock_parts/power_store/cell/high
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 4d633b3f98b..2709793c038 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -242,7 +242,7 @@
final_block_chance = 0 //Don't bring a sword to a gunfight, and also you aren't going to really block someone full body tackling you with a sword
return ..()
-/obj/item/melee/beesword/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/melee/beesword/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(iscarbon(target))
var/mob/living/carbon/carbon_target = target
carbon_target.reagents.add_reagent(/datum/reagent/toxin, 4)
@@ -291,7 +291,7 @@
if(!isspaceturf(turf))
consume_turf(turf)
-/obj/item/melee/supermatter_sword/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/melee/supermatter_sword/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return .
@@ -385,7 +385,7 @@
attack_verb_simple = list("flog", "whip", "lash", "discipline")
hitsound = 'sound/items/weapons/whip.ogg'
-/obj/item/melee/curator_whip/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/melee/curator_whip/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(ishuman(target))
var/mob/living/carbon/human/human_target = target
human_target.drop_all_held_items()
diff --git a/code/game/objects/items/piggy_bank.dm b/code/game/objects/items/piggy_bank.dm
index 4dafb9dc9ed..0a14347116e 100644
--- a/code/game/objects/items/piggy_bank.dm
+++ b/code/game/objects/items/piggy_bank.dm
@@ -124,7 +124,7 @@
if(95 to INFINITY)
balloon_alert(user, "brimming with cash")
-/obj/item/piggy_bank/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/piggy_bank/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
var/creds_value = item.get_item_credit_value()
if(isnull(creds_value))
return ..()
diff --git a/code/game/objects/items/pillow.dm b/code/game/objects/items/pillow.dm
index dd67b92d243..2ccf7157b83 100644
--- a/code/game/objects/items/pillow.dm
+++ b/code/game/objects/items/pillow.dm
@@ -48,7 +48,7 @@
. = ..()
QDEL_NULL(pillow_trophy)
-/obj/item/pillow/attack(mob/living/carbon/target_mob, mob/living/user, list/modifiers)
+/obj/item/pillow/attack(mob/living/carbon/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!iscarbon(target_mob))
return
@@ -73,7 +73,7 @@
user.visible_message("[user] starts to smother [victim]", span_notice("You begin smothering [victim]"), vision_distance = COMBAT_MESSAGE_RANGE)
INVOKE_ASYNC(src, PROC_REF(smothering), user, victim)
-/obj/item/pillow/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/pillow/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(!bricked && istype(attacking_item, /obj/item/stack/sheet/mineral/sandstone))
var/obj/item/stack/sheet/mineral/sandstone/brick = attacking_item
balloon_alert(user, "inserting brick...")
@@ -222,4 +222,3 @@
desc = "Daww look at that little mime!"
icon_state = "pillow_6_t"
variation = 6
-
diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm
index 5d0ccf5d33c..f1f76cccfef 100644
--- a/code/game/objects/items/plushes.dm
+++ b/code/game/objects/items/plushes.dm
@@ -125,7 +125,7 @@
else
to_chat(user, span_notice("You try to pet [src], but it has no stuffing. Aww..."))
-/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/toy/plush/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(I.get_sharpness())
if(!grenade)
if(!stuffed)
@@ -677,7 +677,7 @@
)
AddElement(/datum/element/connect_loc, loc_connections)
-/obj/item/toy/plush/goatplushie/attackby(obj/item/cigarette/rollie/fat_dart, mob/user, list/modifiers)
+/obj/item/toy/plush/goatplushie/attackby(obj/item/cigarette/rollie/fat_dart, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(fat_dart))
return ..()
if(splat)
diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm
index d345f500e63..e8fe75c74b3 100644
--- a/code/game/objects/items/pneumaticCannon.dm
+++ b/code/game/objects/items/pneumaticCannon.dm
@@ -108,7 +108,7 @@
balloon_alert(user, "output level set to [pressure_setting_to_text(pressure_setting)]")
return TRUE
-/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/living/user, list/modifiers)
+/obj/item/pneumatic_cannon/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode)
return ..()
if(istype(W, /obj/item/tank/internals))
diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm
index cf3e7565c9b..172806476bd 100644
--- a/code/game/objects/items/powerfist.dm
+++ b/code/game/objects/items/powerfist.dm
@@ -72,7 +72,7 @@
update_tank(tank, TANK_REMOVING, user)
return TRUE
-/obj/item/melee/powerfist/attackby(obj/item/item_to_insert, mob/user, list/modifiers)
+/obj/item/melee/powerfist/attackby(obj/item/item_to_insert, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(item_to_insert, /obj/item/tank/internals))
return ..()
if(tank)
diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm
index fd1eaff87b3..f2ba65c0e85 100644
--- a/code/game/objects/items/puzzle_pieces.dm
+++ b/code/game/objects/items/puzzle_pieces.dm
@@ -124,7 +124,7 @@
desc = "This door only opens when a keycard is swiped. It looks virtually indestructible."
uses_queuelinks = FALSE
-/obj/machinery/door/puzzle/keycard/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/door/puzzle/keycard/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!istype(attacking_item, /obj/item/keycard))
return
@@ -374,7 +374,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/puzzle/button, 32)
icon_state = "keycardpad0"
base_icon_state = "keycardpad"
-/obj/machinery/puzzle/keycardpad/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/puzzle/keycardpad/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!istype(attacking_item, /obj/item/keycard) || used)
return
diff --git a/code/game/objects/items/rcd/RSF.dm b/code/game/objects/items/rcd/RSF.dm
index aac183475ce..1dff040fcfd 100644
--- a/code/game/objects/items/rcd/RSF.dm
+++ b/code/game/objects/items/rcd/RSF.dm
@@ -72,7 +72,7 @@ RSF
/obj/item/rsf/cyborg
matter = 30
-/obj/item/rsf/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/rsf/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(is_type_in_list(W,matter_by_item))//If the thing we got hit by is in our matter list
var/tempMatter = matter_by_item[W.type] + matter
if(tempMatter > max_matter)
diff --git a/code/game/objects/items/robot/ai_upgrades.dm b/code/game/objects/items/robot/ai_upgrades.dm
index a20a5448d1f..9d7e6c41d58 100644
--- a/code/game/objects/items/robot/ai_upgrades.dm
+++ b/code/game/objects/items/robot/ai_upgrades.dm
@@ -7,7 +7,7 @@
///The upgrade that will be applied to the AI when installed
var/datum/ai_module/to_gift = /datum/ai_module
-/obj/item/aiupgrade/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/aiupgrade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!isAI(target))
return ..()
var/mob/living/silicon/ai/AI = target
@@ -51,7 +51,7 @@
. = ..()
ADD_TRAIT(src, TRAIT_CONTRABAND, INNATE_TRAIT)
-/obj/item/malf_upgrade/pre_attack(atom/A, mob/living/user, list/modifiers)
+/obj/item/malf_upgrade/pre_attack(atom/A, mob/living/user, list/modifiers, list/attack_modifiers)
if(!isAI(A))
return ..()
var/mob/living/silicon/ai/AI = A
@@ -85,7 +85,3 @@
name = "power transfer upgrade"
desc = "A legal upgrade that allows an artificial intelligence to directly provide power to APCs from a distance"
to_gift = /datum/ai_module/power_apc
-
-
-
-
diff --git a/code/game/objects/items/robot/items/generic.dm b/code/game/objects/items/robot/items/generic.dm
index 8f815f675b9..7d8c2cc9f7f 100644
--- a/code/game/objects/items/robot/items/generic.dm
+++ b/code/game/objects/items/robot/items/generic.dm
@@ -96,7 +96,7 @@
if(HUG_MODE_CRUSH)
to_chat(user, "ERROR: ARM ACTUATORS OVERLOADED.")
-/obj/item/borg/cyborghug/attack(mob/living/attacked_mob, mob/living/silicon/robot/user, list/modifiers)
+/obj/item/borg/cyborghug/attack(mob/living/attacked_mob, mob/living/silicon/robot/user, list/modifiers, list/attack_modifiers)
if(attacked_mob == user)
return
if(attacked_mob.health < 0)
diff --git a/code/game/objects/items/robot/items/storage.dm b/code/game/objects/items/robot/items/storage.dm
index 0a2a3b5042e..dbbd9eb3ee2 100644
--- a/code/game/objects/items/robot/items/storage.dm
+++ b/code/game/objects/items/robot/items/storage.dm
@@ -61,7 +61,7 @@
stored.forceMove(user.drop_location())
return CLICK_ACTION_SUCCESS
-/obj/item/borg/apparatus/pre_attack(atom/atom, mob/living/user, list/modifiers)
+/obj/item/borg/apparatus/pre_attack(atom/atom, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(atom.loc, /mob/living/silicon/robot) || istype(atom.loc, /obj/item/robot_model) || HAS_TRAIT(atom, TRAIT_NODROP))
return ..() // Borgs should not be grabbing their own modules
@@ -92,7 +92,7 @@
update_appearance()
return NONE
-/obj/item/borg/apparatus/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/borg/apparatus/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(stored)
item.melee_attack_chain(user, stored, modifiers)
return
@@ -317,7 +317,7 @@
. += "The apparatus currently has [stored] secured."
. += span_notice(" Alt-click will drop the currently stored circuit. ")
-/obj/item/borg/apparatus/circuit/pre_attack(atom/atom, mob/living/user, list/modifiers)
+/obj/item/borg/apparatus/circuit/pre_attack(atom/atom, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(atom, /obj/item/ai_module) && !stored) //If an admin wants a borg to upload laws, who am I to stop them? Otherwise, we can hint that it fails
to_chat(user, span_warning("This circuit board doesn't seem to have standard robot apparatus pin holes. You're unable to pick it up."))
return ..()
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index 4a22c91abfb..631775bcb04 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -166,7 +166,7 @@
return TRUE
//ADD
-/obj/item/robot_suit/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/robot_suit/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/stack/sheet/iron))
var/obj/item/stack/sheet/iron/M = W
if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index d7c15ac45d4..01cbd0db9a8 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -831,7 +831,7 @@
icon = 'icons/obj/devices/circuitry_n_data.dmi'
icon_state = "cyborg_upgrade1"
-/obj/item/borg_restart_board/pre_attack(mob/living/silicon/robot/borgo, mob/living/user, list/modifiers)
+/obj/item/borg_restart_board/pre_attack(mob/living/silicon/robot/borgo, mob/living/user, list/modifiers, list/attack_modifiers)
if(!istype(borgo))
return ..()
if(!borgo.opened)
diff --git a/code/game/objects/items/secret_documents.dm b/code/game/objects/items/secret_documents.dm
index ef6b12444f9..91a2a8934e4 100644
--- a/code/game/objects/items/secret_documents.dm
+++ b/code/game/objects/items/secret_documents.dm
@@ -66,7 +66,7 @@
var/obj/item/documents/photocopy/C = copy
copy_type = C.copy_type
-/obj/item/documents/photocopy/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/item/documents/photocopy/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/toy/crayon/red) || istype(O, /obj/item/toy/crayon/blue))
if (forgedseal)
to_chat(user, span_warning("You have already forged a seal on [src]!"))
diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm
index 9b3795a620c..daf1bf0ba96 100644
--- a/code/game/objects/items/sharpener.dm
+++ b/code/game/objects/items/sharpener.dm
@@ -23,7 +23,7 @@
///If TRUE, the whetstone will only sharpen already sharp items
var/requires_sharpness = TRUE
-/obj/item/sharpener/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/sharpener/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(uses == 0)
to_chat(user, span_warning("The sharpening block is too worn to use again!"))
return
diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm
index b43aecff00c..76a47fba68b 100644
--- a/code/game/objects/items/shields.dm
+++ b/code/game/objects/items/shields.dm
@@ -178,7 +178,7 @@
slapcraft_recipes = slapcraft_recipe_list,\
)
-/obj/item/shield/riot/attackby(obj/item/attackby_item, mob/user, list/modifiers)
+/obj/item/shield/riot/attackby(obj/item/attackby_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attackby_item, /obj/item/stack/sheet/mineral/titanium))
if (atom_integrity >= max_integrity)
to_chat(user, span_warning("[src] is already in perfect condition."))
@@ -446,7 +446,7 @@
shield_break_leftover = /obj/item/stack/rods/ten
armor_type = /datum/armor/item_shield/ballistic
-/obj/item/shield/ballistic/attackby(obj/item/attackby_item, mob/user, list/modifiers)
+/obj/item/shield/ballistic/attackby(obj/item/attackby_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attackby_item, /obj/item/stack/sheet/mineral/titanium))
if (atom_integrity >= max_integrity)
to_chat(user, span_warning("[src] is already in perfect condition."))
diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm
index c7767a7af31..a725791e238 100644
--- a/code/game/objects/items/signs.dm
+++ b/code/game/objects/items/signs.dm
@@ -30,7 +30,7 @@
name = "[label] sign"
desc = "It reads: [label]"
-/obj/item/picket_sign/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/picket_sign/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(IS_WRITING_UTENSIL(W))
retext(user, W)
else
diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm
index 9fb15854f0e..1b394b2cca6 100644
--- a/code/game/objects/items/spear.dm
+++ b/code/game/objects/items/spear.dm
@@ -170,7 +170,7 @@
return CLICK_ACTION_SUCCESS
-/obj/item/spear/explosive/afterattack(atom/movable/target, mob/user, list/modifiers)
+/obj/item/spear/explosive/afterattack(atom/movable/target, mob/user, list/modifiers, list/attack_modifiers)
if(!HAS_TRAIT(src, TRAIT_WIELDED) || !istype(target))
return
if(target.resistance_flags & INDESTRUCTIBLE) //due to the lich incident of 2021, embedding grenades inside of indestructible structures is forbidden
@@ -199,7 +199,7 @@
force_unwielded = 15
force_wielded = 25
-/obj/item/spear/grey_tide/afterattack(atom/movable/target, mob/living/user, list/modifiers)
+/obj/item/spear/grey_tide/afterattack(atom/movable/target, mob/living/user, list/modifiers, list/attack_modifiers)
user.faction |= "greytide([REF(user)])"
if(!isliving(target))
return
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index db6a30c68e2..d8c2bee83a2 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -483,7 +483,7 @@
/obj/item/stack/medical/gauze/twelve
amount = 12
-/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/stack/medical/gauze/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_WIRECUTTER || I.get_sharpness())
if(get_amount() < 2)
balloon_alert(user, "not enough gauze!")
diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm
index d67353e13e1..c2547cbbea7 100644
--- a/code/game/objects/items/stacks/sheets/glass.dm
+++ b/code/game/objects/items/stacks/sheets/glass.dm
@@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(glass_recipes, list ( \
. = ..()
. += GLOB.glass_recipes
-/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/stack/sheet/glass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(istype(W, /obj/item/lightreplacer))
var/obj/item/lightreplacer/lightreplacer = W
@@ -118,7 +118,7 @@ GLOBAL_LIST_INIT(pglass_recipes, list ( \
. = ..()
. += GLOB.pglass_recipes
-/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/stack/sheet/plasmaglass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(istype(W, /obj/item/stack/rods))
@@ -174,7 +174,7 @@ GLOBAL_LIST_INIT(reinforced_glass_recipes, list ( \
fire = 70
acid = 100
-/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/stack/sheet/rglass/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
..()
@@ -357,7 +357,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
if(T && is_station_level(T.z))
SSblackbox.record_feedback("tally", "station_mess_destroyed", 1, name)
-/obj/item/shard/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/shard/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(!iscarbon(user) || !user.is_holding(src))
return
@@ -368,7 +368,7 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list(
to_chat(user, span_warning("[src] cuts into your hand!"))
jab.apply_damage(force * 0.5, BRUTE, user.get_active_hand(), attacking_item = src)
-/obj/item/shard/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/shard/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/lightreplacer))
var/obj/item/lightreplacer/lightreplacer = item
lightreplacer.attackby(src, user)
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 4a2c8a75136..0c5ae9a505c 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -344,7 +344,7 @@ GLOBAL_LIST_INIT(bear_pelt_recipes, list ( \
//Step one - dehairing.
-/obj/item/stack/sheet/animalhide/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/stack/sheet/animalhide/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.get_sharpness())
playsound(loc, 'sound/items/weapons/slice.ogg', 50, TRUE, -1)
user.visible_message(span_notice("[user] starts cutting hair off \the [src]."), span_notice("You start cutting the hair off \the [src]..."), span_hear("You hear the sound of a knife rubbing against flesh."))
diff --git a/code/game/objects/items/stacks/sheets/light.dm b/code/game/objects/items/stacks/sheets/light.dm
index 316b35e035c..8597cfc859f 100644
--- a/code/game/objects/items/stacks/sheets/light.dm
+++ b/code/game/objects/items/stacks/sheets/light.dm
@@ -18,7 +18,7 @@
. = ..()
. += span_warning("\The [src] looks unfinished, add iron to complete it.")
-/obj/item/stack/light_w/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/item/stack/light_w/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/stack/sheet/iron))
var/obj/item/stack/sheet/iron/M = O
if (M.use(1))
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 0099eae1c5f..ca996d9737e 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -78,7 +78,7 @@ GLOBAL_LIST_INIT(sandbag_recipes, list ( \
icon_state = "sandbag"
w_class = WEIGHT_CLASS_TINY
-/obj/item/emptysandbag/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/emptysandbag/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/stack/ore/glass))
var/obj/item/stack/ore/glass/G = W
to_chat(user, span_notice("You fill the sandbag."))
@@ -311,7 +311,7 @@ GLOBAL_LIST_INIT(titanium_recipes, list ( \
. = ..()
. += GLOB.titanium_recipes
-/obj/item/stack/sheet/mineral/titanium/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/stack/sheet/mineral/titanium/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(istype(W, /obj/item/stack/rods))
var/obj/item/stack/rods/old_rods = W
@@ -490,7 +490,7 @@ GLOBAL_LIST_INIT(abductor_recipes, list ( \
grind_results = list(/datum/reagent/carbon = 20)
novariants = TRUE
-/obj/item/stack/sheet/mineral/coal/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/stack/sheet/mineral/coal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.get_temperature() > 300)//If the temperature of the object is over 300, then ignite
var/turf/T = get_turf(src)
message_admins("Coal ignited by [ADMIN_LOOKUPFLW(user)] in [ADMIN_VERBOSEJMP(T)]")
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 1b6d55039ac..29950bc6c0e 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -718,7 +718,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \
/obj/item/stack/sheet/cardboard/fifty
amount = 50
-/obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/stack/sheet/cardboard/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/stamp/clown) && !istype(loc, /obj/item/storage))
var/atom/droploc = drop_location()
if(use(1))
diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm
index f1fe1b25122..4393e70fee4 100644
--- a/code/game/objects/items/stacks/stack.dm
+++ b/code/game/objects/items/stacks/stack.dm
@@ -740,7 +740,7 @@
is_zero_amount(delete_if_zero = TRUE)
-/obj/item/stack/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/stack/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(can_merge(W, inhand = TRUE))
var/obj/item/stack/S = W
if(merge(S))
diff --git a/code/game/objects/items/stacks/tiles/light.dm b/code/game/objects/items/stacks/tiles/light.dm
index bd50960dfdd..0c4bce3310a 100644
--- a/code/game/objects/items/stacks/tiles/light.dm
+++ b/code/game/objects/items/stacks/tiles/light.dm
@@ -10,7 +10,7 @@
merge_type = /obj/item/stack/tile/light
var/state = 0
-/obj/item/stack/tile/light/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/item/stack/tile/light/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(O.tool_behaviour == TOOL_CROWBAR)
new/obj/item/stack/sheet/iron(user.loc)
amount--
diff --git a/code/game/objects/items/stacks/tiles/tile_mineral.dm b/code/game/objects/items/stacks/tiles/tile_mineral.dm
index d2a746070fe..4e7c23b51ff 100644
--- a/code/game/objects/items/stacks/tiles/tile_mineral.dm
+++ b/code/game/objects/items/stacks/tiles/tile_mineral.dm
@@ -2,7 +2,7 @@
/// Determines what stack is gotten out of us when welded.
var/mineralType = null
-/obj/item/stack/tile/mineral/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/stack/tile/mineral/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.tool_behaviour == TOOL_WELDER)
if(get_amount() < 4)
to_chat(user, span_warning("You need at least four tiles to do this!"))
diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm
index 51c416fdd4a..3d8b552c776 100644
--- a/code/game/objects/items/stacks/wrap.dm
+++ b/code/game/objects/items/stacks/wrap.dm
@@ -26,7 +26,7 @@
. = ..()
ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT)
-/obj/item/stack/wrapping_paper/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/stack/wrapping_paper/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
user.visible_message(
span_warning("[user] baps [target_mob] on the head with [src]!"),
@@ -235,11 +235,10 @@
. = ..()
ADD_TRAIT(src, TRAIT_CUSTOM_TAP_SOUND, INNATE_TRAIT)
-/obj/item/c_tube/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/c_tube/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
user.visible_message(
span_warning("[user] baps [target_mob] on the head with [src]!"),
span_warning("You bap [target_mob] on the head with [src]!"),
)
target_mob.add_mood_event("roll", /datum/mood_event/bapped)
-
diff --git a/code/game/objects/items/storage/toolboxes/mechanical.dm b/code/game/objects/items/storage/toolboxes/mechanical.dm
index a818d620da2..092a8b00b8b 100644
--- a/code/game/objects/items/storage/toolboxes/mechanical.dm
+++ b/code/game/objects/items/storage/toolboxes/mechanical.dm
@@ -52,13 +52,13 @@
force = initial(force) + power
throwforce = initial(throwforce) + power
-/obj/item/storage/toolbox/mechanical/old/clean/attack(mob/target, mob/living/user)
+/obj/item/storage/toolbox/mechanical/old/clean/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
calc_damage()
- ..()
+ return ..()
/obj/item/storage/toolbox/mechanical/old/clean/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
calc_damage()
- ..()
+ return ..()
/obj/item/storage/toolbox/mechanical/old/clean/PopulateContents()
new /obj/item/screwdriver(src)
diff --git a/code/game/objects/items/tail_pin.dm b/code/game/objects/items/tail_pin.dm
index 23c13e71820..99998b53635 100644
--- a/code/game/objects/items/tail_pin.dm
+++ b/code/game/objects/items/tail_pin.dm
@@ -35,7 +35,7 @@
MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/poster/party_game, 32)
-/obj/structure/sign/poster/party_game/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/sign/poster/party_game/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!istype(I,/obj/item/tail_pin))//We're using the same trick that tables use for placing objects x and y onto the click location.
return
diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm
index 57d1425645c..0d8734a799b 100644
--- a/code/game/objects/items/tanks/tank_types.dm
+++ b/code/game/objects/items/tanks/tank_types.dm
@@ -104,7 +104,7 @@
air_contents.assert_gas(/datum/gas/plasma)
air_contents.gases[/datum/gas/plasma][MOLES] = (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
-/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/flamethrower))
var/obj/item/flamethrower/F = W
if ((!F.status) || (F.ptank))
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 3a613312da8..5a92271c184 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -199,7 +199,7 @@
to_chat(user, span_warning("There isn't enough pressure in [src] to commit suicide with..."))
return SHAME
-/obj/item/tank/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/tank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(istype(attacking_item, /obj/item/assembly_holder))
if(tank_assembly)
diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm
index 93908ce5da0..0b97caa3caa 100644
--- a/code/game/objects/items/tanks/watertank.dm
+++ b/code/game/objects/items/tanks/watertank.dm
@@ -96,7 +96,7 @@
var/atom/movable/screen/inventory/hand/H = over_object
M.putItemFromInventoryInHandIfPossible(src, H.held_index)
-/obj/item/watertank/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/watertank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(attacking_item == noz)
remove_noz()
return TRUE
diff --git a/code/game/objects/items/tcg/tcg.dm b/code/game/objects/items/tcg/tcg.dm
index 7d2d724c84a..7a50e142065 100644
--- a/code/game/objects/items/tcg/tcg.dm
+++ b/code/game/objects/items/tcg/tcg.dm
@@ -128,7 +128,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices)
icon_state = template.icon_state
return ..()
-/obj/item/tcgcard/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/tcgcard/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/tcgcard))
var/obj/item/tcgcard/second_card = item
var/obj/item/tcgcard_deck/new_deck = new /obj/item/tcgcard_deck(drop_location())
@@ -253,7 +253,7 @@ GLOBAL_LIST_EMPTY(tcgcard_radial_choices)
return FALSE
return TRUE
-/obj/item/tcgcard_deck/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/tcgcard_deck/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(istype(item, /obj/item/tcgcard))
if(contents.len >= 30)
diff --git a/code/game/objects/items/theft_tools.dm b/code/game/objects/items/theft_tools.dm
index 65e534e2a7a..66546a91672 100644
--- a/code/game/objects/items/theft_tools.dm
+++ b/code/game/objects/items/theft_tools.dm
@@ -176,7 +176,7 @@
/obj/item/nuke_core/supermatter_sliver/can_be_pulled(user, force) // no drag memes
return FALSE
-/obj/item/nuke_core/supermatter_sliver/attackby(obj/item/W, mob/living/user, list/modifiers)
+/obj/item/nuke_core/supermatter_sliver/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/hemostat/supermatter))
var/obj/item/hemostat/supermatter/tongs = W
if (tongs.sliver)
diff --git a/code/game/objects/items/tongs.dm b/code/game/objects/items/tongs.dm
index 18269b47182..3c85cc8c004 100644
--- a/code/game/objects/items/tongs.dm
+++ b/code/game/objects/items/tongs.dm
@@ -73,7 +73,7 @@
tonged = null
update_appearance(UPDATE_ICON)
-/obj/item/kitchen/tongs/pre_attack(obj/item/attacked, mob/living/user, list/modifiers)
+/obj/item/kitchen/tongs/pre_attack(obj/item/attacked, mob/living/user, list/modifiers, list/attack_modifiers)
if (!isnull(tonged) && tonged.force <= 0) // prevents tongs from giving food-weapons extra range
attacked.attackby(tonged, user)
return TRUE
diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm
index 8247220bfd5..ef82159dc41 100644
--- a/code/game/objects/items/tools/weldingtool.dm
+++ b/code/game/objects/items/tools/weldingtool.dm
@@ -112,7 +112,7 @@
flamethrower_screwdriver(tool, user)
return ITEM_INTERACT_SUCCESS
-/obj/item/weldingtool/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/item/weldingtool/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
if(istype(tool, /obj/item/stack/rods))
flamethrower_rods(tool, user)
else
@@ -170,7 +170,7 @@
INVOKE_ASYNC(src, PROC_REF(try_heal_loop), interacting_with, user, TRUE)
return ITEM_INTERACT_SUCCESS
-/obj/item/weldingtool/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/weldingtool/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(!isOn())
return
use(1)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 5fd3378a98d..a980ce95718 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -75,7 +75,7 @@
return ITEM_INTERACT_SUCCESS
return ITEM_INTERACT_BLOCKING
-/obj/item/toy/waterballoon/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/toy/waterballoon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/reagent_containers/cup))
if(I.reagents)
if(I.reagents.total_volume <= 0)
@@ -164,7 +164,7 @@
)
-/obj/item/toy/balloon/long/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/item/toy/balloon/long/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(!istype(attacking_item, /obj/item/toy/balloon/long) || !HAS_TRAIT(user, TRAIT_BALLOON_SUTRA))
return ..()
@@ -187,7 +187,7 @@
qdel(src)
return TRUE
-/obj/item/toy/balloon/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/toy/balloon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/ammo_casing/foam_dart) && ismonkey(user))
pop_balloon(monkey_pop = TRUE)
else
@@ -511,7 +511,7 @@
. = ..()
. += "There [bullets == 1 ? "is" : "are"] [bullets] cap\s left."
-/obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A, mob/user, list/modifiers)
+/obj/item/toy/gun/attackby(obj/item/toy/ammo/gun/A, mob/user, list/modifiers, list/attack_modifiers)
if(istype(A, /obj/item/toy/ammo/gun))
if (src.bullets >= 7)
@@ -662,7 +662,7 @@
// Copied from /obj/item/melee/energy/sword/attackby
-/obj/item/toy/sword/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/item/toy/sword/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/toy/sword))
var/obj/item/toy/sword/attatched_sword = weapon
if(HAS_TRAIT(weapon, TRAIT_NODROP))
diff --git a/code/game/objects/items/v8_engine.dm b/code/game/objects/items/v8_engine.dm
index ed9a9b93d98..2d2d5e40593 100644
--- a/code/game/objects/items/v8_engine.dm
+++ b/code/game/objects/items/v8_engine.dm
@@ -71,7 +71,7 @@
AddComponent(/datum/component/two_handed, force_unwielded = 12, force_wielded = 22, attacksound = active_hitsound)
RegisterSignals(src, list(COMSIG_ITEM_DROPPED, COMSIG_MOVABLE_PRE_THROW, COMSIG_ITEM_ATTACK_SELF), PROC_REF(reset_charges))
-/obj/item/house_edge/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/house_edge/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(!ismob(target))
return
if(HAS_TRAIT(src, TRAIT_WIELDED))
diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm
index ddfb0d07912..ccfd185f6f0 100644
--- a/code/game/objects/items/weaponry.dm
+++ b/code/game/objects/items/weaponry.dm
@@ -1006,7 +1006,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
thrown_datums.Cut()
return ..()
-/obj/item/melee/baseball_bat/pre_attack(atom/movable/target, mob/living/user, list/modifiers)
+/obj/item/melee/baseball_bat/pre_attack(atom/movable/target, mob/living/user, list/modifiers, list/attack_modifiers)
var/turf/target_turf = get_turf(target)
if(!target_turf)
return ..()
@@ -1132,7 +1132,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
))
-/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/melee/flyswatter/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(is_type_in_typecache(target, splattable))
to_chat(user, span_warning("You easily splat [target]."))
if(isliving(target))
@@ -1169,7 +1169,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
name = "\improper ACME Extendo-Hand"
desc = "A novelty extendo-hand produced by the ACME corporation. Originally designed to knock out roadrunners."
-/obj/item/extendohand/attack(atom/M, mob/living/carbon/human/user, list/modifiers)
+/obj/item/extendohand/attack(atom/M, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
var/dist = get_dist(M, user)
if(dist < min_reach)
to_chat(user, span_warning("[M] is too close to use [src] on."))
@@ -1281,7 +1281,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301
return TRUE
return FALSE
-/obj/item/highfrequencyblade/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/highfrequencyblade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return .
diff --git a/code/game/objects/items/wizard_weapons.dm b/code/game/objects/items/wizard_weapons.dm
index ef8c62a3684..7179eedb9d5 100644
--- a/code/game/objects/items/wizard_weapons.dm
+++ b/code/game/objects/items/wizard_weapons.dm
@@ -57,7 +57,7 @@
step_towards(A,pull)
step_towards(A,pull)
-/obj/item/singularityhammer/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/singularityhammer/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(!HAS_TRAIT(src, TRAIT_WIELDED))
return
if(!charged)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 0c90051a5bf..f51ffd339f9 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -71,40 +71,47 @@ GLOBAL_LIST_EMPTY(objects_by_id_tag)
GLOB.objects_by_id_tag -= id_tag
. = ..()
-/obj/attacked_by(obj/item/attacking_item, mob/living/user)
+/obj/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(!attacking_item.force)
- return
+ return 0
var/demo_mod = attacking_item.get_demolition_modifier(src)
- var/total_force = (attacking_item.force * demo_mod)
+ var/total_force = CALCULATE_FORCE(attacking_item, attack_modifiers) * demo_mod
var/damage = take_damage(total_force, attacking_item.damtype, MELEE, TRUE, get_dir(src, user), attacking_item.armour_penetration)
- // Sanity in case one is null for some reason
- var/picked_index = rand(max(length(attacking_item.attack_verb_simple), length(attacking_item.attack_verb_continuous)))
+ if(!LAZYACCESS(attack_modifiers, SILENCE_DEFAULT_MESSAGES))
+ // Sanity in case one is null for some reason
+ var/picked_index = rand(max(length(attacking_item.attack_verb_simple), length(attacking_item.attack_verb_continuous)))
- var/message_verb_continuous = "attacks"
- var/message_verb_simple = "attack"
- // Sanity in case one is... longer than the other?
- if (picked_index && length(attacking_item.attack_verb_continuous) >= picked_index)
- message_verb_continuous = attacking_item.attack_verb_continuous[picked_index]
- if (picked_index && length(attacking_item.attack_verb_simple) >= picked_index)
- message_verb_simple = attacking_item.attack_verb_simple[picked_index]
+ var/message_verb_continuous = "attacks"
+ var/message_verb_simple = "attack"
+ // Sanity in case one is... longer than the other?
+ if (picked_index && length(attacking_item.attack_verb_continuous) >= picked_index)
+ message_verb_continuous = attacking_item.attack_verb_continuous[picked_index]
+ if (picked_index && length(attacking_item.attack_verb_simple) >= picked_index)
+ message_verb_simple = attacking_item.attack_verb_simple[picked_index]
- if(demo_mod > 1 && prob(damage * 5))
- if(HAS_TRAIT(src, TRAIT_INVERTED_DEMOLITION))
- message_verb_simple = "shred"
- message_verb_continuous = "shreds"
- else
- message_verb_simple = "pulverise"
- message_verb_continuous = "pulverises"
+ if(demo_mod > 1 && prob(damage * 5))
+ if(HAS_TRAIT(src, TRAIT_INVERTED_DEMOLITION))
+ message_verb_simple = "shred"
+ message_verb_continuous = "shreds"
+ else
+ message_verb_simple = "pulverise"
+ message_verb_continuous = "pulverises"
- if(demo_mod < 1)
- message_verb_simple = "ineffectively " + message_verb_simple
- message_verb_continuous = "ineffectively " + message_verb_continuous
+ if(demo_mod < 1)
+ message_verb_simple = "ineffectively " + message_verb_simple
+ message_verb_continuous = "ineffectively " + message_verb_continuous
+
+ user.visible_message(
+ span_danger("[user] [message_verb_continuous] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"),
+ span_danger("You [message_verb_simple] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"),
+ null,
+ COMBAT_MESSAGE_RANGE,
+ )
- user.visible_message(span_danger("[user] [message_verb_continuous] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"), \
- span_danger("You [message_verb_simple] [src] with [attacking_item][damage ? "." : ", [no_damage_feedback]!"]"), null, COMBAT_MESSAGE_RANGE)
log_combat(user, src, "attacked", attacking_item)
+ return damage
/obj/assume_air(datum/gas_mixture/giver)
if(loc)
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 4e52090f848..8fcfca6f6ea 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -149,7 +149,7 @@
return FALSE
return TRUE
-/obj/structure/ai_core/latejoin_inactive/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/structure/ai_core/latejoin_inactive/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
if(tool.tool_behaviour == TOOL_MULTITOOL)
active = !active
to_chat(user, span_notice("You [active? "activate" : "deactivate"] \the [src]'s transmitters."))
@@ -179,7 +179,7 @@
balloon_alert(user, "connected neural network")
return ITEM_INTERACT_SUCCESS
-/obj/structure/ai_core/attackby(obj/item/tool, mob/living/user, list/modifiers)
+/obj/structure/ai_core/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers)
if(remote_ai)
to_chat(remote_ai, span_danger("CORE TAMPERING DETECTED!"))
if(!anchored)
diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm
index ca7ae8a01fd..930e1f61994 100644
--- a/code/game/objects/structures/aliens.dm
+++ b/code/game/objects/structures/aliens.dm
@@ -67,6 +67,7 @@
/obj/structure/alien/resin/Initialize(mapload)
. = ..()
air_update_turf(TRUE, TRUE)
+ ADD_TRAIT(src, TRAIT_INVERTED_DEMOLITION, INNATE_TRAIT)
/obj/structure/alien/resin/Destroy()
air_update_turf(TRUE, FALSE)
diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm
index 3f24c6ed127..68833f91c0d 100644
--- a/code/game/objects/structures/beds_chairs/bed.dm
+++ b/code/game/objects/structures/beds_chairs/bed.dm
@@ -174,7 +174,7 @@
. += mutable_appearance(icon, "brakes_down")
. += emissive_appearance(icon, "brakes_down", src, alpha = src.alpha)
-/obj/structure/bed/medical/emergency/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/bed/medical/emergency/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/emergency_bed/silicon))
var/obj/item/emergency_bed/silicon/silicon_bed = item
if(silicon_bed.loaded)
@@ -220,7 +220,7 @@
righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
w_class = WEIGHT_CLASS_NORMAL // No more excuses, stop getting blood everywhere
-/obj/item/emergency_bed/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/emergency_bed/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/emergency_bed/silicon))
var/obj/item/emergency_bed/silicon/silicon_bed = item
if(silicon_bed.loaded)
diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm
index 4701be6396e..939552ba14e 100644
--- a/code/game/objects/structures/beds_chairs/chair.dm
+++ b/code/game/objects/structures/beds_chairs/chair.dm
@@ -71,7 +71,7 @@
W.setDir(dir)
qdel(src)
-/obj/structure/chair/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/chair/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/assembly/shock_kit) && !HAS_TRAIT(src, TRAIT_ELECTRIFIED_BUCKLE))
electrify_self(W, user)
return
@@ -421,7 +421,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/chair/stool/bar, 0)
return TRUE
return FALSE
-/obj/item/chair/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/chair/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(!ishuman(target))
return
diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm
index 9aa73e67943..16a727ef9b1 100644
--- a/code/game/objects/structures/bonfire.dm
+++ b/code/game/objects/structures/bonfire.dm
@@ -39,7 +39,7 @@
QDEL_NULL(burning_loop)
. = ..()
-/obj/structure/bonfire/attackby(obj/item/used_item, mob/living/user, list/modifiers)
+/obj/structure/bonfire/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(used_item, /obj/item/stack/rods) && !can_buckle && !grill)
var/obj/item/stack/rods/rods = used_item
var/choice = tgui_alert(user, "What would you like to construct?", "Bonfire", list("Stake","Grill"))
diff --git a/code/game/objects/structures/cannons/cannon.dm b/code/game/objects/structures/cannons/cannon.dm
index d312b8d6ddd..4e7730cc6da 100644
--- a/code/game/objects/structures/cannons/cannon.dm
+++ b/code/game/objects/structures/cannons/cannon.dm
@@ -53,7 +53,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/structure/cannon/attackby(obj/item/used_item, mob/user, list/modifiers)
+/obj/structure/cannon/attackby(obj/item/used_item, mob/user, list/modifiers, list/attack_modifiers)
if(charge_ignited)
balloon_alert(user, "it's gonna fire!")
return
diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm
index e68581bc5f8..e85bccafdca 100644
--- a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm
+++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm
@@ -46,7 +46,7 @@
return ITEM_INTERACT_SUCCESS
///Covers Reloading and lighting of the gun
-/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, list/modifiers)
+/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, list/modifiers, list/attack_modifiers)
var/ignition_message = used_item.ignition_effect(src, user) // Checks if item used can ignite stuff.
if(istype(used_item, ammo_type))
if(fully_loaded_gun)
diff --git a/code/game/objects/structures/construction_console/construction_console.dm b/code/game/objects/structures/construction_console/construction_console.dm
index b9469dcacc6..042511cceb8 100644
--- a/code/game/objects/structures/construction_console/construction_console.dm
+++ b/code/game/objects/structures/construction_console/construction_console.dm
@@ -64,7 +64,7 @@
eyeobj = new /mob/eye/camera/remote/base_construction(spawn_spot, src)
return TRUE
-/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/computer/camera_advanced/base_construction/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
//If we have an internal RCD, we can refill it by slapping the console with some materials
if(internal_rcd && (istype(W, /obj/item/rcd_ammo) || istype(W, /obj/item/stack/sheet)))
internal_rcd.attackby(W, user, modifiers)
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 4f29fdf0ab0..31a3b4c3211 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -646,7 +646,7 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets)
req_access = accesses
req_one_access = null
-/obj/structure/closet/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/closet/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(user in src)
return
if(src.tool_interact(W,user))
@@ -1257,13 +1257,17 @@ GLOBAL_LIST_EMPTY(roundstart_station_closets)
GLOB.roundstart_station_closets += src
///Spears deal bonus damages to lockers
-/obj/structure/closet/attacked_by(obj/item/attacking_item, mob/living/user)
+/obj/structure/closet/secure_closet/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/spear))
- take_damage(attacking_item.force * 2, attacking_item.damtype, MELEE, 1, get_dir(src, user))
- user.visible_message(span_danger("[user] stabs with precision [src]'s electronics with [attacking_item]!"),
- span_danger("You stab with precision [src]'s electronics with [attacking_item]!"), null, COMBAT_MESSAGE_RANGE)
- log_combat(user, src, "attacked", attacking_item)
- return
+ HIDE_ATTACK_MESSAGES(attack_modifiers)
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 2)
+ user.visible_message(
+ span_danger("[user] stabs with precision [src]'s electronics with [attacking_item]!"),
+ span_danger("You stab with precision [src]'s electronics with [attacking_item]!"),
+ null,
+ COMBAT_MESSAGE_RANGE,
+ )
+
return ..()
/obj/structure/closet/secure_closet/hitby(atom/movable/hit_by, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum)
diff --git a/code/game/objects/structures/crates_lockers/closets/bodybag.dm b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
index 2196bc2cbdf..16781a3fb09 100644
--- a/code/game/objects/structures/crates_lockers/closets/bodybag.dm
+++ b/code/game/objects/structures/crates_lockers/closets/bodybag.dm
@@ -46,7 +46,7 @@
QDEL_NULL(foldedbag_instance)
return ..()
-/obj/structure/closet/body_bag/attackby(obj/item/interact_tool, mob/user, list/modifiers)
+/obj/structure/closet/body_bag/attackby(obj/item/interact_tool, mob/user, list/modifiers, list/attack_modifiers)
if (IS_WRITING_UTENSIL(interact_tool))
if(!user.can_write(interact_tool))
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index c0970e2ab19..ee82397f117 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -222,7 +222,7 @@
. = ..()
. += span_notice("Right-click with a Security-level ID to reset [src]'s registered ID.")
-/obj/structure/closet/secure_closet/brig/genpop/attackby(obj/item/card/id/advanced/prisoner/user_id, mob/user, list/modifiers)
+/obj/structure/closet/secure_closet/brig/genpop/attackby(obj/item/card/id/advanced/prisoner/user_id, mob/user, list/modifiers, list/attack_modifiers)
if(!secure || !istype(user_id))
return ..()
@@ -238,7 +238,7 @@
name = initial(name)
update_appearance()
-/obj/structure/closet/secure_closet/brig/genpop/attackby_secondary(obj/item/card/id/advanced/used_id, mob/user, list/modifiers)
+/obj/structure/closet/secure_closet/brig/genpop/attackby_secondary(obj/item/card/id/advanced/used_id, mob/user, list/modifiers, list/attack_modifiers)
if(!secure || !istype(used_id))
return ..()
diff --git a/code/game/objects/structures/crates_lockers/crates/bins.dm b/code/game/objects/structures/crates_lockers/crates/bins.dm
index 6161d5814f6..36a907ee0b6 100644
--- a/code/game/objects/structures/crates_lockers/crates/bins.dm
+++ b/code/game/objects/structures/crates_lockers/crates/bins.dm
@@ -33,7 +33,7 @@
return
. += base_icon_state + "_some"
-/obj/structure/closet/crate/bin/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/closet/crate/bin/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/storage/bag/trash) && !opened)
var/obj/item/storage/bag/trash/T = W
to_chat(user, span_notice("You fill the bag."))
diff --git a/code/game/objects/structures/crates_lockers/crates/large.dm b/code/game/objects/structures/crates_lockers/crates/large.dm
index 6b1155daf6d..a527d48727a 100644
--- a/code/game/objects/structures/crates_lockers/crates/large.dm
+++ b/code/game/objects/structures/crates_lockers/crates/large.dm
@@ -31,7 +31,7 @@
else
to_chat(user, span_warning("You need a crowbar to pry this open!"))
-/obj/structure/closet/crate/large/attackby(obj/item/W, mob/living/user, list/modifiers)
+/obj/structure/closet/crate/large/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers)
if(W.tool_behaviour == TOOL_CROWBAR)
if(manifest)
tear_manifest(user)
diff --git a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm
index edea83ae247..1abbecdd2ad 100644
--- a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm
+++ b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm
@@ -43,7 +43,7 @@
qdel(src)
///ensures that the syndicrate can only be unlocked by opening it with a syndicrate_key
-/obj/structure/closet/crate/secure/syndicrate/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/closet/crate/secure/syndicrate/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(item, /obj/item/syndicrate_key) || created_items)
return ..()
created_items = TRUE
@@ -67,7 +67,7 @@
)
update_appearance()
-/obj/structure/closet/crate/secure/syndicrate/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/structure/closet/crate/secure/syndicrate/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
/obj/item/syndicrate_key
diff --git a/code/game/objects/structures/deployable_turret.dm b/code/game/objects/structures/deployable_turret.dm
index 8cf5c2e0344..870427cb7d6 100644
--- a/code/game/objects/structures/deployable_turret.dm
+++ b/code/game/objects/structures/deployable_turret.dm
@@ -249,14 +249,14 @@
/obj/item/gun_control/CanItemAutoclick()
return TRUE
-/obj/item/gun_control/attack_atom(obj/O, mob/living/user, list/modifiers)
+/obj/item/gun_control/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers)
user.changeNext_move(CLICK_CD_MELEE)
- O.attacked_by(src, user)
+ O.attacked_by(src, user, modifiers)
-/obj/item/gun_control/attack(mob/living/M, mob/living/user)
+/obj/item/gun_control/attack(mob/living/M, mob/living/user, list/modifiers, list/attack_modifiers)
M.lastattacker = user.real_name
M.lastattackerckey = user.ckey
- M.attacked_by(src, user)
+ M.attacked_by(src, user, modifiers)
add_fingerprint(user)
/obj/item/gun_control/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
diff --git a/code/game/objects/structures/detectiveboard.dm b/code/game/objects/structures/detectiveboard.dm
index 2f9aae546a2..c2f143ced07 100644
--- a/code/game/objects/structures/detectiveboard.dm
+++ b/code/game/objects/structures/detectiveboard.dm
@@ -40,7 +40,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/detectiveboard, 32)
/// Attaching evidences: photo and papers
-/obj/structure/detectiveboard/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/detectiveboard/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/paper) || istype(item, /obj/item/photo))
if(!cases.len)
to_chat(user, "There are no cases!")
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 80ecefe6edd..0b9b9902029 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -125,7 +125,7 @@
. += "[initial(icon_state)]_closed"
return
-/obj/structure/displaycase/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/structure/displaycase/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(attacking_item.GetID() && !broken)
if(allowed(user))
to_chat(user, span_notice("You [open ? "close":"open"] [src]."))
@@ -272,7 +272,7 @@
qdel(src)
return ITEM_INTERACT_SUCCESS
-/obj/structure/displaycase_chassis/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/displaycase_chassis/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/electronics/airlock))
balloon_alert(user, "installing electronics...")
if(do_after(user, 3 SECONDS, target = src) && user.transferItemToLoc(attacking_item, src))
@@ -359,7 +359,7 @@
holographic_showpiece = TRUE
update_appearance()
-/obj/structure/displaycase/trophy/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/displaycase/trophy/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/key/displaycase))
toggle_historian_mode(user)
return
@@ -609,7 +609,7 @@
return TRUE
. = TRUE
-/obj/structure/displaycase/forsale/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/displaycase/forsale/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(isidcard(attacking_item))
//Card Registration
var/obj/item/card/id/potential_acc = attacking_item
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 3509a4c7125..c8c9cdf058d 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -81,7 +81,7 @@
if(created_name)
. += span_notice("There is a small paper placard on the assembly, written on it is '[created_name]'.")
-/obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, list/modifiers)
+/obj/structure/door_assembly/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers)
if(IS_WRITING_UTENSIL(W) && !user.combat_mode)
var/t = tgui_input_text(user, "Enter the name for the door", "Airlock Renaming", created_name, max_length = MAX_NAME_LEN)
if(!t)
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 091cdbd7d9f..11bd9a9080e 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -9,7 +9,7 @@
density = TRUE
anchored = TRUE
-/obj/structure/dresser/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/dresser/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_WRENCH)
to_chat(user, span_notice("You begin to [anchored ? "unwrench" : "wrench"] [src]."))
if(I.use_tool(src, user, 20, volume=50))
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index 2150c5af4ba..d68457f9bae 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -13,7 +13,7 @@
export_to_component = color_atom_overlay(export_to_component)
AddComponent(/datum/component/electrified_buckle, (SHOCK_REQUIREMENT_ITEM | SHOCK_REQUIREMENT_LIVE_CABLE | SHOCK_REQUIREMENT_SIGNAL_RECEIVED_TOGGLE), stored_kit, list(export_to_component))
-/obj/structure/chair/e_chair/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/chair/e_chair/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.tool_behaviour == TOOL_WRENCH)
var/obj/structure/chair/C = new /obj/structure/chair(loc)
W.play_tool_sound(src)
diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm
index d90fc41c5a5..138dd50a062 100644
--- a/code/game/objects/structures/extinguisher.dm
+++ b/code/game/objects/structures/extinguisher.dm
@@ -65,7 +65,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/extinguisher_cabinet, 29)
stored_extinguisher = null
update_appearance(UPDATE_ICON)
-/obj/structure/extinguisher_cabinet/attackby(obj/item/used_item, mob/living/user, list/modifiers)
+/obj/structure/extinguisher_cabinet/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(used_item.tool_behaviour == TOOL_WRENCH && !stored_extinguisher)
user.balloon_alert(user, "deconstructing cabinet...")
used_item.play_tool_sound(src)
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index 2f5a048b4fb..3b061dc3610 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -121,7 +121,7 @@
return ITEM_INTERACT_SUCCESS
return
-/obj/structure/falsewall/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/falsewall/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(!opening)
return ..()
to_chat(user, span_warning("You must wait until the door has stopped moving!"))
@@ -202,7 +202,7 @@
. = ..()
RegisterSignal(src, COMSIG_ATOM_PROPAGATE_RAD_PULSE, PROC_REF(radiate))
-/obj/structure/falsewall/uranium/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/falsewall/uranium/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
radiate()
return ..()
diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm
index 27e365334c1..d140a2cb6db 100644
--- a/code/game/objects/structures/fireaxe.dm
+++ b/code/game/objects/structures/fireaxe.dm
@@ -43,7 +43,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fireaxecabinet, 32)
QDEL_NULL(held_item)
return ..()
-/obj/structure/fireaxecabinet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/structure/fireaxecabinet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(iscyborg(user) || attacking_item.tool_behaviour == TOOL_MULTITOOL)
toggle_lock(user)
else if(attacking_item.tool_behaviour == TOOL_WELDER && !user.combat_mode && !broken)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 69171c229e1..4565cd1b09a 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -52,9 +52,7 @@
/// Flags for the flora to determine what kind of sound to play when it gets hit
var/flora_flags = NONE
-//BUBBER EDIT START - MOVED TO MODULAR
-/*
-/obj/structure/flora/attackby(obj/item/used_item, mob/living/user, list/modifiers)
+/obj/structure/flora/attackby(obj/item/used_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode)
return ..()
if(flags_1 & HOLOGRAM_1)
@@ -95,8 +93,6 @@
if(harvest(user))
after_harvest(user)
-*/
-//BUBBER EDIT END
/obj/structure/flora/attack_hand(mob/user, list/modifiers)
. = ..()
diff --git a/code/game/objects/structures/fluff.dm b/code/game/objects/structures/fluff.dm
index ce852fae35e..1ce124dc3c3 100644
--- a/code/game/objects/structures/fluff.dm
+++ b/code/game/objects/structures/fluff.dm
@@ -14,7 +14,7 @@
///If true, the structure can be deconstructed into a metal sheet with a wrench.
var/deconstructible = TRUE
-/obj/structure/fluff/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/structure/fluff/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_WRENCH && deconstructible)
user.visible_message(span_notice("[user] starts disassembling [src]..."), span_notice("You start disassembling [src]..."))
I.play_tool_sound(src)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 8dbb557db31..fc396715219 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -43,7 +43,7 @@
if(GIRDER_TRAM)
. += span_notice("[src] is designed for tram usage. Deconstructed with a screwdriver!")
-/obj/structure/girder/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/girder/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
var/skill_modifier = user.mind.get_skill_modifier(/datum/skill/construction, SKILL_SPEED_MODIFIER) //SKYRAT EDIT
var/platingmodifier = 1
if(HAS_TRAIT(user, TRAIT_QUICK_BUILD))
@@ -456,7 +456,7 @@
smoothing_groups = null
canSmoothWith = null
-/obj/structure/girder/cult/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/girder/cult/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(W.tool_behaviour == TOOL_WELDER)
if(!W.tool_start_check(user, amount=1))
@@ -531,7 +531,7 @@
smoothing_groups = null
canSmoothWith = null
-/obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, list/modifiers)
+/obj/structure/girder/bronze/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(W.tool_behaviour == TOOL_WELDER)
if(!W.tool_start_check(user, amount = 0, heat_required = HIGH_TEMPERATURE_REQUIRED))
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index f2be71b22b4..d21f7d457ab 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -219,7 +219,7 @@
span_notice("You [anchored ? "fasten [src] to" : "unfasten [src] from"] the floor."))
return ITEM_INTERACT_SUCCESS
-/obj/structure/grille/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/grille/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
user.changeNext_move(CLICK_CD_MELEE)
if(istype(W, /obj/item/stack/rods) && broken && do_after(user, 1 SECONDS, target = src))
if(shock(user, 90))
diff --git a/code/game/objects/structures/guillotine.dm b/code/game/objects/structures/guillotine.dm
index b67b4d6445d..ca7344d2f24 100644
--- a/code/game/objects/structures/guillotine.dm
+++ b/code/game/objects/structures/guillotine.dm
@@ -183,7 +183,7 @@
blade_status = GUILLOTINE_BLADE_DROPPED
icon_state = "guillotine"
-/obj/structure/guillotine/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/guillotine/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if (istype(W, /obj/item/sharpener))
add_fingerprint(user)
if (blade_status == GUILLOTINE_BLADE_SHARPENING)
diff --git a/code/game/objects/structures/guncase.dm b/code/game/objects/structures/guncase.dm
index 34598abd31f..f1894b1f7aa 100644
--- a/code/game/objects/structures/guncase.dm
+++ b/code/game/objects/structures/guncase.dm
@@ -31,7 +31,7 @@
. += new /mutable_appearance(gun_overlay)
. += "[icon_state]_[open ? "open" : "door"]"
-/obj/structure/guncase/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/structure/guncase/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(iscyborg(user) || isalien(user))
return
if(istype(I, gun_category) && open)
diff --git a/code/game/objects/structures/janitor.dm b/code/game/objects/structures/janitor.dm
index b8f93821e4f..b0b194d6f1d 100644
--- a/code/game/objects/structures/janitor.dm
+++ b/code/game/objects/structures/janitor.dm
@@ -28,14 +28,14 @@
return .
-/obj/structure/mop_bucket/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/structure/mop_bucket/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/reagent_containers))
update_appearance(UPDATE_OVERLAYS)
return FALSE // skip attack animation when refilling cart
return ..()
-/obj/structure/mop_bucket/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/structure/mop_bucket/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/mop))
if(weapon.reagents.total_volume >= weapon.reagents.maximum_volume)
balloon_alert(user, "already soaked!")
@@ -182,7 +182,7 @@
return . || NONE
-/obj/structure/mop_bucket/janitorialcart/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/mop_bucket/janitorialcart/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/mop))
if(mymop)
balloon_alert(user, "already has \a [mymop]!")
@@ -248,7 +248,7 @@
update_appearance(UPDATE_OVERLAYS)
return ITEM_INTERACT_SUCCESS
-/obj/structure/mop_bucket/janitorialcart/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/structure/mop_bucket/janitorialcart/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index aa26f28ad71..58724f3fd70 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -50,7 +50,7 @@
default_unfasten_wrench(user, tool)
return TRUE
-/obj/structure/kitchenspike_frame/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/kitchenspike_frame/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(!istype(attacking_item, /obj/item/stack/rods))
return ..()
diff --git a/code/game/objects/structures/ladders.dm b/code/game/objects/structures/ladders.dm
index 2a2fc531d20..95534b28610 100644
--- a/code/game/objects/structures/ladders.dm
+++ b/code/game/objects/structures/ladders.dm
@@ -378,11 +378,11 @@
use(user, going_up = FALSE)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/structure/ladder/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/ladder/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
use(user)
return TRUE
-/obj/structure/ladder/attackby_secondary(obj/item/item, mob/user, list/modifiers)
+/obj/structure/ladder/attackby_secondary(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return
diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm
index b29e9f47d21..a98b9ac8f9f 100644
--- a/code/game/objects/structures/lattice.dm
+++ b/code/game/objects/structures/lattice.dm
@@ -62,7 +62,7 @@
/obj/structure/lattice/blob_act(obj/structure/blob/B)
return
-/obj/structure/lattice/attackby(obj/item/C, mob/user, list/modifiers)
+/obj/structure/lattice/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers)
if(resistance_flags & INDESTRUCTIBLE)
return
if(C.tool_behaviour == TOOL_WIRECUTTER)
@@ -174,7 +174,7 @@
/obj/structure/lattice/lava/deconstruction_hints(mob/user)
return span_notice("The rods look like they could be cut, but the heat treatment will shatter off. There's space for a tile.")
-/obj/structure/lattice/lava/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/lattice/lava/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!ismetaltile(attacking_item))
return
diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm
index 52ef0215441..f664ee751c4 100644
--- a/code/game/objects/structures/lavaland/geyser.dm
+++ b/code/game/objects/structures/lavaland/geyser.dm
@@ -62,7 +62,7 @@
RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(start_chemming))
return PROCESS_KILL
-/obj/structure/geyser/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/geyser/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(item, /obj/item/mining_scanner) && !istype(item, /obj/item/t_scanner/adv_mining_scanner))
playsound(src, SFX_INDUSTRIAL_SCAN, 20, TRUE, -2, TRUE, FALSE)
return ..() //this runs the plunger code
@@ -143,7 +143,7 @@
///What layer we set it to
var/target_layer = DUCT_LAYER_DEFAULT
-/obj/item/plunger/attack_atom(obj/O, mob/living/user, list/modifiers)
+/obj/item/plunger/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers)
if(layer_mode)
SEND_SIGNAL(O, COMSIG_MOVABLE_CHANGE_DUCT_LAYER, O, target_layer)
return ..()
diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm
index 06957908287..ac8417af20b 100644
--- a/code/game/objects/structures/lavaland/ore_vent.dm
+++ b/code/game/objects/structures/lavaland/ore_vent.dm
@@ -97,7 +97,7 @@
SSore_generation.processed_vents -= src
return ..()
-/obj/structure/ore_vent/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/ore_vent/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return TRUE
diff --git a/code/game/objects/structures/maintenance.dm b/code/game/objects/structures/maintenance.dm
index c360534c140..bd3c4ed06e0 100644
--- a/code/game/objects/structures/maintenance.dm
+++ b/code/game/objects/structures/maintenance.dm
@@ -87,7 +87,7 @@ at the cost of risking a vicious bite.**/
return
to_chat(user, span_warning("You find nothing of value..."))
-/obj/structure/moisture_trap/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/moisture_trap/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(iscyborg(user) || isalien(user) || !CanReachInside(user))
return ..()
add_fingerprint(user)
@@ -131,7 +131,7 @@ at the cost of risking a vicious bite.**/
/// Stage of the pants making process
var/status = ALTAR_INACTIVE
-/obj/structure/destructible/cult/pants_altar/attackby(obj/attacking_item, mob/user, list/modifiers)
+/obj/structure/destructible/cult/pants_altar/attackby(obj/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/melee/cultblade/dagger) && IS_CULTIST(user) && status)
to_chat(user, span_notice("[src] is creating something, you can't move it!"))
return
diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm
index 516d990dacb..cc8a561acad 100644
--- a/code/game/objects/structures/mirror.dm
+++ b/code/game/objects/structures/mirror.dm
@@ -276,14 +276,12 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror/broken, 28)
return CONTEXTUAL_SCREENTIP_SET
return .
-/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user)
- if(broken || !istype(user) || !I.force)
- return ..()
-
+/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
- if(broken) // breaking a mirror truly gets you bad luck!
- to_chat(user, span_warning("A chill runs down your spine as [src] shatters..."))
- user.AddComponent(/datum/component/omen, incidents_left = 7)
+ if(broken || !.) // breaking a mirror truly gets you bad luck!
+ return
+ to_chat(user, span_warning("A chill runs down your spine as [src] shatters..."))
+ user.AddComponent(/datum/component/omen, incidents_left = 7)
/obj/structure/mirror/bullet_act(obj/projectile/proj)
if(broken || !isliving(proj.firer) || !proj.damage)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 03560edc0b7..70d925af3fe 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -559,7 +559,7 @@ GLOBAL_LIST_EMPTY(crematoriums)
to_chat(user, span_warning("That's not connected to anything!"))
add_fingerprint(user)
-/obj/structure/tray/attackby(obj/P, mob/user, list/modifiers)
+/obj/structure/tray/attackby(obj/P, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(P, /obj/item/riding_offhand))
return ..()
diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm
index 7aa278fd65d..c7089e631b7 100644
--- a/code/game/objects/structures/noticeboard.dm
+++ b/code/game/objects/structures/noticeboard.dm
@@ -29,7 +29,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/noticeboard, 32)
find_and_hang_on_wall()
//attaching papers!!
-/obj/structure/noticeboard/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/structure/noticeboard/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/paper) || istype(O, /obj/item/photo))
if(!allowed(user))
to_chat(user, span_warning("You are not authorized to add notices!"))
diff --git a/code/game/objects/structures/ore_containers.dm b/code/game/objects/structures/ore_containers.dm
index 75c7a03cfcf..ba8e59cc78a 100644
--- a/code/game/objects/structures/ore_containers.dm
+++ b/code/game/objects/structures/ore_containers.dm
@@ -1,7 +1,7 @@
///structure to contain ores
/obj/structure/ore_container
-/obj/structure/ore_container/attackby(obj/item/ore, mob/living/carbon/human/user, list/modifiers)
+/obj/structure/ore_container/attackby(obj/item/ore, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
if(istype(ore, /obj/item/stack/ore) && !user.combat_mode)
ore.forceMove(src)
return
diff --git a/code/game/objects/structures/plaques/_plaques.dm b/code/game/objects/structures/plaques/_plaques.dm
index c085a86c42c..5baf25200fd 100644
--- a/code/game/objects/structures/plaques/_plaques.dm
+++ b/code/game/objects/structures/plaques/_plaques.dm
@@ -80,7 +80,7 @@
atom_integrity = max_integrity
return TRUE
-/obj/structure/plaque/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/plaque/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/pen/fountain))
if(engraved)
to_chat(user, span_warning("This plaque has already been engraved."))
@@ -153,7 +153,7 @@
return TRUE
-/obj/item/plaque/attackby(obj/item/I, mob/user, list/modifiers) //Same as part of the above, except for the item in hand instead of the structure.
+/obj/item/plaque/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers) //Same as part of the above, except for the item in hand instead of the structure.
if(istype(I, /obj/item/pen/fountain))
if(engraved)
to_chat(user, span_warning("This plaque has already been engraved."))
diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm
index a785c0a2b5e..db7570bb216 100644
--- a/code/game/objects/structures/railings.dm
+++ b/code/game/objects/structures/railings.dm
@@ -82,7 +82,7 @@
else
. += span_notice("The railing is unbolted from the floor and can be deconstructed with wirecutters.")
-/obj/structure/railing/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/structure/railing/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
..()
add_fingerprint(user)
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
index db1eaa8e784..899d3390ddb 100644
--- a/code/game/objects/structures/reflector.dm
+++ b/code/game/objects/structures/reflector.dm
@@ -132,7 +132,7 @@
return ITEM_INTERACT_SUCCESS
-/obj/structure/reflector/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/reflector/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(admin)
return
//Finishing the frame
diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm
index c0578d32566..ec7da473608 100644
--- a/code/game/objects/structures/safe.dm
+++ b/code/game/objects/structures/safe.dm
@@ -62,7 +62,7 @@ FLOOR SAFES
icon_state = "[initial(icon_state)][open ? null : "_locked"]"
return ..()
-/obj/structure/safe/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/safe/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(open)
. = TRUE //no afterattack
if(attacking_item.w_class + space <= maxspace)
diff --git a/code/game/objects/structures/shower.dm b/code/game/objects/structures/shower.dm
index 25a0c154111..83a8ce7fcb7 100644
--- a/code/game/objects/structures/shower.dm
+++ b/code/game/objects/structures/shower.dm
@@ -136,7 +136,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16))
to_chat(user, span_notice("The water temperature seems to be [current_temperature]."))
return TRUE
-/obj/machinery/shower/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/machinery/shower/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
if(istype(tool, /obj/item/stock_parts/water_recycler))
if(has_water_reclaimer)
to_chat(user, span_warning("There is already has a water recycler installed."))
@@ -386,7 +386,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/shower, (-16))
. = ..()
AddComponent(/datum/component/simple_rotation)
-/obj/structure/showerframe/attackby(obj/item/tool, mob/living/user, list/modifiers)
+/obj/structure/showerframe/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(tool, /obj/item/stock_parts/water_recycler))
qdel(tool)
var/obj/machinery/shower/shower = new(loc, REVERSE_DIR(dir), TRUE)
diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm
index b128bfbff2a..c3786e81e28 100644
--- a/code/game/objects/structures/signs/_signs.dm
+++ b/code/game/objects/structures/signs/_signs.dm
@@ -84,7 +84,7 @@
atom_integrity = max_integrity
return TRUE
-/obj/structure/sign/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/sign/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(is_editable && IS_WRITING_UTENSIL(I))
if(!length(GLOB.editable_sign_types))
CRASH("GLOB.editable_sign_types failed to populate")
@@ -191,7 +191,7 @@
context[SCREENTIP_CONTEXT_LMB] = "Change design"
return CONTEXTUAL_SCREENTIP_SET
-/obj/item/sign/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/sign/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(is_editable && IS_WRITING_UTENSIL(I))
if(!length(GLOB.editable_sign_types))
CRASH("GLOB.editable_sign_types failed to populate")
diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm
index 3080e97af44..0a944561508 100644
--- a/code/game/objects/structures/spawner.dm
+++ b/code/game/objects/structures/spawner.dm
@@ -39,7 +39,7 @@
else
. += span_notice("It looks like you could probably scan and tag it with a [scanner_descriptor].")
-/obj/structure/spawner/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/spawner/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return TRUE
diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm
index 3959b205531..cc13ce6a25a 100644
--- a/code/game/objects/structures/stairs.dm
+++ b/code/game/objects/structures/stairs.dm
@@ -238,7 +238,7 @@
/obj/structure/stairs_frame/atom_deconstruct(disassembled = TRUE)
new frame_stack(get_turf(src), frame_stack_amount)
-/obj/structure/stairs_frame/attackby(obj/item/attacked_by, mob/user, list/modifiers)
+/obj/structure/stairs_frame/attackby(obj/item/attacked_by, mob/user, list/modifiers, list/attack_modifiers)
if(!isstack(attacked_by))
return ..()
if(!anchored)
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index 7419c328f2c..aa288c06bf7 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -59,7 +59,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/structure/tank_dispenser/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/structure/tank_dispenser/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
var/full
if(istype(I, /obj/item/tank/internals/plasma))
if(plasmatanks < TANK_DISPENSER_CAPACITY)
diff --git a/code/game/objects/structures/tank_holder.dm b/code/game/objects/structures/tank_holder.dm
index d942f95974f..5a9eb683c5c 100644
--- a/code/game/objects/structures/tank_holder.dm
+++ b/code/game/objects/structures/tank_holder.dm
@@ -42,7 +42,7 @@
. += "It is empty."
. += span_notice("It is held together by some screws.")
-/obj/structure/tank_holder/attackby(obj/item/W, mob/living/user, list/modifiers)
+/obj/structure/tank_holder/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode)
return ..()
if(W.tool_behaviour == TOOL_WRENCH)
diff --git a/code/game/objects/structures/toiletbong.dm b/code/game/objects/structures/toiletbong.dm
index e132d2b02f0..6d4c8d64ee3 100644
--- a/code/game/objects/structures/toiletbong.dm
+++ b/code/game/objects/structures/toiletbong.dm
@@ -96,7 +96,7 @@
to_chat(user, span_boldwarning("The [emag_card] falls into the toilet. You fish it back out. Looks like you broke the toilet."))
return TRUE
-/obj/structure/toiletbong/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/toiletbong/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/card/emag))
return
return ..()
diff --git a/code/game/objects/structures/training_machine.dm b/code/game/objects/structures/training_machine.dm
index 81095be3c58..f6c12c155f3 100644
--- a/code/game/objects/structures/training_machine.dm
+++ b/code/game/objects/structures/training_machine.dm
@@ -360,7 +360,7 @@
///Number of hits made since the Lap button (alt-click) was last pushed
var/lap_hits = 0
-/obj/item/training_toolbox/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/training_toolbox/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return .
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index 119bb255a09..b938cd82ff2 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -93,7 +93,7 @@
break
-/obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/transit_tube/station/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.tool_behaviour == TOOL_CROWBAR)
for(var/obj/structure/transit_tube_pod/P in loc)
P.deconstruct(FALSE, user)
diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm
index d4730570480..4991eb9df11 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube.dm
@@ -32,7 +32,7 @@
if(current_size >= STAGE_FIVE)
deconstruct(FALSE)
-/obj/structure/transit_tube/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/transit_tube/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.tool_behaviour == TOOL_WRENCH)
if(tube_construction)
for(var/obj/structure/transit_tube_pod/pod in src.loc)
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
index 8fc2efc0a06..fe806662dac 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm
@@ -27,7 +27,7 @@
icon_state = contents.len ? occupied_icon_state : initial(icon_state)
return ..()
-/obj/structure/transit_tube_pod/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/transit_tube_pod/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_CROWBAR)
if(!moving)
I.play_tool_sound(src)
diff --git a/code/game/objects/structures/votingbox.dm b/code/game/objects/structures/votingbox.dm
index b5227ac896b..f31c8510d31 100644
--- a/code/game/objects/structures/votingbox.dm
+++ b/code/game/objects/structures/votingbox.dm
@@ -19,7 +19,7 @@
var/list/voted //List of ID's that already voted.
COOLDOWN_DECLARE(vote_print_cooldown)
-/obj/structure/votebox/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/structure/votebox/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(I,/obj/item/card/id))
if(!owner)
register_owner(I,user)
diff --git a/code/game/objects/structures/water_structures/sink.dm b/code/game/objects/structures/water_structures/sink.dm
index b7a1a66b47f..b40bee8240e 100644
--- a/code/game/objects/structures/water_structures/sink.dm
+++ b/code/game/objects/structures/water_structures/sink.dm
@@ -105,7 +105,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink, (-14))
user.visible_message(span_notice("[user] washes [user.p_their()] [washing_face ? "face" : "hands"] using [src]."), \
span_notice("You wash your [washing_face ? "face" : "hands"] using [src]."))
-/obj/structure/sink/attackby(obj/item/O, mob/living/user, list/modifiers)
+/obj/structure/sink/attackby(obj/item/O, mob/living/user, list/modifiers, list/attack_modifiers)
if(busy)
to_chat(user, span_warning("Someone's already washing here!"))
return
@@ -278,7 +278,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sink/kitchen, (-16))
. = ..()
AddComponent(/datum/component/simple_rotation)
-/obj/structure/sinkframe/attackby(obj/item/tool, mob/living/user, list/modifiers)
+/obj/structure/sinkframe/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(tool, /obj/item/stock_parts/water_recycler))
qdel(tool)
var/obj/structure/sink/greyscale/new_sink = new(loc, REVERSE_DIR(dir), TRUE)
diff --git a/code/game/objects/structures/water_structures/toilet.dm b/code/game/objects/structures/water_structures/toilet.dm
index 7c6051e26b4..c2f1ecb848f 100644
--- a/code/game/objects/structures/water_structures/toilet.dm
+++ b/code/game/objects/structures/water_structures/toilet.dm
@@ -184,7 +184,7 @@
for(var/datum/material/M as anything in custom_materials)
new M.sheet_type(loc, FLOOR(custom_materials[M] / SHEET_MATERIAL_AMOUNT, 1))
-/obj/structure/toilet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/structure/toilet/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(cover_open && istype(attacking_item, /obj/item/fish))
if(fishes >= 3)
diff --git a/code/game/objects/structures/water_structures/urinal.dm b/code/game/objects/structures/water_structures/urinal.dm
index 97db0fa2687..23795155db0 100644
--- a/code/game/objects/structures/water_structures/urinal.dm
+++ b/code/game/objects/structures/water_structures/urinal.dm
@@ -51,7 +51,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/urinal, 32)
return
return ..()
-/obj/structure/urinal/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/urinal/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(exposed)
if(hidden_item)
to_chat(user, span_warning("There is already something in the drain enclosure!"))
diff --git a/code/game/objects/structures/water_structures/water_source.dm b/code/game/objects/structures/water_structures/water_source.dm
index 678e2509b71..0f2f771612d 100644
--- a/code/game/objects/structures/water_structures/water_source.dm
+++ b/code/game/objects/structures/water_structures/water_source.dm
@@ -57,7 +57,7 @@
span_notice("You wash your [washing_face ? "face" : "hands"] using [src]."),
)
-/obj/structure/water_source/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/structure/water_source/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(busy)
to_chat(user, span_warning("Someone's already washing here!"))
return
@@ -138,7 +138,7 @@
. = ..()
icon_state = base_icon_state
-/obj/structure/water_source/puddle/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/water_source/puddle/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
icon_state = "[base_icon_state]-splash"
. = ..()
icon_state = base_icon_state
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 5db6857dc82..62fa00a6457 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -97,7 +97,7 @@
leaving.Bump(src)
return COMPONENT_ATOM_BLOCK_EXIT
-/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
//I really should have spread this out across more states but thin little windoors are hard to sprite.
add_fingerprint(user)
switch(state)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 3a1b7e5310f..c7ef0edb806 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -280,7 +280,7 @@
return ITEM_INTERACT_SUCCESS
-/obj/structure/window/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/structure/window/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(!can_be_reached(user))
return TRUE //skip the afterattack
@@ -513,7 +513,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/window/unanchored/spawner, 0)
return list("delay" = 3 SECONDS, "cost" = 15)
return FALSE
-/obj/structure/window/reinforced/attackby_secondary(obj/item/tool, mob/user, list/modifiers)
+/obj/structure/window/reinforced/attackby_secondary(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
if(resistance_flags & INDESTRUCTIBLE)
balloon_alert(user, "too resilient!")
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index 4d0db93e8a7..9fba7a6bc44 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -395,7 +395,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
C.wiringGuiUpdate(user)
C.is_empty(user)
-/turf/attackby(obj/item/C, mob/user, list/modifiers)
+/turf/attackby(obj/item/C, mob/user, list/modifiers, list/attack_modifiers)
if(..())
return TRUE
if(can_lay_cable() && istype(C, /obj/item/stack/cable_coil))
diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
index 85c2fd96d2b..6c442f4c77e 100644
--- a/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
+++ b/code/modules/antagonists/abductor/equipment/gear/abductor_items.dm
@@ -356,7 +356,6 @@ Return to step 11 of normal process."}
affect_cyborg = is_stun_mode
log_stun_attack = is_stun_mode // other modes have their own log entries.
- stun_animation = is_stun_or_sleep
on_stun_sound = is_stun_or_sleep ? 'sound/items/weapons/egloves.ogg' : null
to_chat(usr, span_notice("You switch the baton to [txt] mode."))
@@ -378,16 +377,16 @@ Return to step 11 of normal process."}
icon_state = "wonderprodProbe"
inhand_icon_state = "wonderprodProbe"
-/obj/item/melee/baton/abductor/baton_attack(mob/target, mob/living/user, modifiers)
+/obj/item/melee/baton/abductor/can_baton(mob/living/target, mob/living/user)
if(!AbductorCheck(user))
- return BATON_ATTACK_DONE
+ return TRUE
return ..()
/obj/item/melee/baton/abductor/baton_effect(mob/living/target, mob/living/user, modifiers, stun_override)
switch (mode)
if(BATON_STUN)
target.visible_message(span_danger("[user] stuns [target] with [src]!"),
- span_userdanger("[user] stuns you with [src]!"))
+ span_userdanger("[user] stuns you with [src]!"), visible_message_flags = ALWAYS_SHOW_SELF_MESSAGE)
target.set_jitter_if_lower(40 SECONDS)
target.set_confusion_if_lower(10 SECONDS)
target.set_stutter_if_lower(16 SECONDS)
diff --git a/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm b/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm
index 4030d8676ac..96ba94170c8 100644
--- a/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm
+++ b/code/modules/antagonists/abductor/equipment/gear/abductor_posters.dm
@@ -17,7 +17,7 @@
return
return ..()
-/obj/structure/sign/poster/abductor/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/structure/sign/poster/abductor/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
if(tool.toolspeed >= 0.2)
balloon_alert(user, "tool too weak!")
return FALSE
diff --git a/code/modules/antagonists/abductor/machinery/console.dm b/code/modules/antagonists/abductor/machinery/console.dm
index bc57d99df4e..dd3abe6994a 100644
--- a/code/modules/antagonists/abductor/machinery/console.dm
+++ b/code/modules/antagonists/abductor/machinery/console.dm
@@ -266,7 +266,7 @@
vest = V
return TRUE
-/obj/machinery/abductor/console/attackby(obj/O, mob/user, list/modifiers)
+/obj/machinery/abductor/console/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/abductor/gizmo) && AddGizmo(O))
to_chat(user, span_notice("You link the tool to the console."))
else if(istype(O, /obj/item/clothing/suit/armor/abductor/vest) && AddVest(O))
diff --git a/code/modules/antagonists/abductor/machinery/dispenser.dm b/code/modules/antagonists/abductor/machinery/dispenser.dm
index a97c3a407a4..bd6cc36e5ba 100644
--- a/code/modules/antagonists/abductor/machinery/dispenser.dm
+++ b/code/modules/antagonists/abductor/machinery/dispenser.dm
@@ -61,7 +61,7 @@
Dispense(gland_id)
return TRUE
-/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/abductor/gland_dispenser/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/organ/heart/gland))
if(!user.transferItemToLoc(W, src))
return
diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm
index de8486760ea..34f9989f80c 100644
--- a/code/modules/antagonists/blob/structures/_blob.dm
+++ b/code/modules/antagonists/blob/structures/_blob.dm
@@ -242,7 +242,7 @@
/obj/structure/blob/hulk_damage()
return 15
-/obj/structure/blob/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/blob/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_ANALYZER)
user.changeNext_move(CLICK_CD_MELEE)
to_chat(user, "The analyzer beeps once, then reports:
")
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index b04def466a7..e639f5f9ae7 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -224,7 +224,7 @@
effectiveness = 80, \
)
-/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/melee/arm_blade/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(istype(target, /obj/structure/table))
var/obj/smash = target
smash.deconstruct(FALSE)
@@ -642,7 +642,7 @@
. = ..()
ADD_TRAIT(src, TRAIT_NODROP, CHANGELING_TRAIT)
-/obj/item/clothing/head/helmet/changeling_hivehead/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/clothing/head/helmet/changeling_hivehead/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!istype(attacking_item, /obj/item/organ/monster_core/regenerative_core/legion) || !holds_reagents)
return
diff --git a/code/modules/antagonists/clown_ops/clown_weapons.dm b/code/modules/antagonists/clown_ops/clown_weapons.dm
index f2b5e0603c2..c66df8215ca 100644
--- a/code/modules/antagonists/clown_ops/clown_weapons.dm
+++ b/code/modules/antagonists/clown_ops/clown_weapons.dm
@@ -133,7 +133,7 @@
var/datum/component/slippery/slipper = GetComponent(/datum/component/slippery)
slipper.Slip(src, hit_atom)
-/obj/item/melee/energy/sword/bananium/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/item/melee/energy/sword/bananium/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(COOLDOWN_FINISHED(src, next_trombone_allowed) && istype(weapon, /obj/item/melee/energy/sword/bananium))
COOLDOWN_START(src, next_trombone_allowed, 5 SECONDS)
to_chat(user, span_warning("You slap the two swords together. Sadly, they do not seem to fit!"))
diff --git a/code/modules/antagonists/heretic/influences.dm b/code/modules/antagonists/heretic/influences.dm
index 5aae01c4500..42aafd03aad 100644
--- a/code/modules/antagonists/heretic/influences.dm
+++ b/code/modules/antagonists/heretic/influences.dm
@@ -206,7 +206,7 @@
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/effect/heretic_influence/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/effect/heretic_influence/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm
index b59741c259a..cd695587ca3 100644
--- a/code/modules/antagonists/heretic/items/heretic_blades.dm
+++ b/code/modules/antagonists/heretic/items/heretic_blades.dm
@@ -41,7 +41,7 @@
/obj/item/melee/sickly_blade/proc/check_usability(mob/living/user)
return IS_HERETIC_OR_MONSTER(user)
-/obj/item/melee/sickly_blade/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/melee/sickly_blade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return .
@@ -89,7 +89,7 @@
playsound(src, SFX_SHATTER, 70, TRUE) //copied from the code for smashing a glass sheet onto the ground to turn it into a shard
qdel(src)
-/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
SEND_SIGNAL(user, COMSIG_HERETIC_BLADE_ATTACK, target, src)
/obj/item/melee/sickly_blade/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
@@ -163,7 +163,7 @@
///If our blade is currently infused with the mansus grasp
var/infused = FALSE
-/obj/item/melee/sickly_blade/dark/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/melee/sickly_blade/dark/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!infused || target == user || !isliving(target))
return
diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm
index 51cd16632f3..5bf63652ec9 100644
--- a/code/modules/antagonists/heretic/items/heretic_necks.dm
+++ b/code/modules/antagonists/heretic/items/heretic_necks.dm
@@ -157,7 +157,7 @@
// How much damage does this item do to the targets sanity?
var/sanity_damage = 20
-/obj/item/clothing/neck/heretic_focus/moon_amulet/attack(mob/living/target, mob/living/user, list/modifiers)
+/obj/item/clothing/neck/heretic_focus/moon_amulet/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
var/mob/living/carbon/human/hit = target
if(!IS_HERETIC_OR_MONSTER(user))
user.balloon_alert(user, "you feel a presence watching you")
diff --git a/code/modules/antagonists/heretic/knowledge/blade_lore.dm b/code/modules/antagonists/heretic/knowledge/blade_lore.dm
index 2b85a5b7091..759f77a2adc 100644
--- a/code/modules/antagonists/heretic/knowledge/blade_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/blade_lore.dm
@@ -289,15 +289,8 @@
offand_force_decrement += 2
hits_to_crit_on_average = ROUND_UP(100 / (blade.force * 2 - offand_force_decrement))
- // Save the force as our last weapon force
- last_weapon_force = blade.force
- // Subtract the decrement, but only if the target is living
- if(isliving(target))
- blade.force -= offand_force_decrement
// Perform the offhand attack
- blade.melee_attack_chain(source, target)
- // Restore the force.
- blade.force = last_weapon_force
+ blade.melee_attack_chain(source, target, null, list(FORCE_MODIFIER = -offand_force_decrement))
///Modifies our blade demolition modifier so we can take down doors with it
/datum/heretic_knowledge/blade_upgrade/blade/proc/on_blade_equipped(mob/user, obj/item/equipped, slot)
diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm
index e444e5a639f..5b2f8743691 100644
--- a/code/modules/antagonists/heretic/structures/carving_knife.dm
+++ b/code/modules/antagonists/heretic/structures/carving_knife.dm
@@ -189,13 +189,14 @@
return
return ..()
-/obj/structure/trap/eldritch/attacked_by(obj/item/weapon, mob/living/user)
- if(istype(weapon, /obj/item/melee/rune_carver) || istype(weapon, /obj/item/nullrod))
+/obj/structure/trap/eldritch/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(istype(tool, /obj/item/melee/rune_carver) || istype(tool, /obj/item/nullrod))
loc.balloon_alert(user, "carving dispelled")
playsound(src, 'sound/items/sheath.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE)
qdel(src)
+ return ITEM_INTERACT_SUCCESS
- return ..()
+ return NONE
/obj/structure/trap/eldritch/alert
name = "alert carving"
diff --git a/code/modules/antagonists/heretic/structures/mawed_crucible.dm b/code/modules/antagonists/heretic/structures/mawed_crucible.dm
index 67dfc47b7df..63a6b4c33f3 100644
--- a/code/modules/antagonists/heretic/structures/mawed_crucible.dm
+++ b/code/modules/antagonists/heretic/structures/mawed_crucible.dm
@@ -77,37 +77,37 @@
/obj/structure/destructible/eldritch_crucible/rust_heretic_act()
return
-/obj/structure/destructible/eldritch_crucible/attacked_by(obj/item/weapon, mob/living/user)
- if(!iscarbon(user))
- return ..()
-
- if(!IS_HERETIC_OR_MONSTER(user))
- bite_the_hand(user)
- return TRUE
-
- if(isbodypart(weapon))
-
- var/obj/item/bodypart/consumed = weapon
+/obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(isbodypart(tool))
+ var/obj/item/bodypart/consumed = tool
if(!IS_ORGANIC_LIMB(consumed))
balloon_alert(user, "not organic!")
- return
-
+ return ITEM_INTERACT_BLOCKING
+ if(!IS_HERETIC_OR_MONSTER(user))
+ if(user.combat_mode)
+ return ITEM_INTERACT_SKIP_TO_ATTACK
+ bite_the_hand(user)
+ return ITEM_INTERACT_SUCCESS
consume_fuel(user, consumed)
- return TRUE
+ return ITEM_INTERACT_SUCCESS
- if(isorgan(weapon))
- var/obj/item/organ/consumed = weapon
+ if(isorgan(tool))
+ var/obj/item/organ/consumed = tool
if(!IS_ORGANIC_ORGAN(consumed))
balloon_alert(user, "not organic!")
- return
+ return ITEM_INTERACT_BLOCKING
if(consumed.organ_flags & ORGAN_VITAL) // Basically, don't eat organs like brains
balloon_alert(user, "invalid organ!")
- return
-
+ return ITEM_INTERACT_BLOCKING
+ if(!IS_HERETIC_OR_MONSTER(user))
+ if(user.combat_mode)
+ return ITEM_INTERACT_SKIP_TO_ATTACK
+ bite_the_hand(user)
+ return ITEM_INTERACT_SUCCESS
consume_fuel(user, consumed)
- return TRUE
+ return ITEM_INTERACT_SUCCESS
- return ..()
+ return NONE
/obj/structure/destructible/eldritch_crucible/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
if(istype(tool, /obj/item/codex_cicatrix) || istype(tool, /obj/item/melee/touch_attack/mansus_fist))
@@ -213,7 +213,7 @@
if(QDELETED(arm))
return
- to_chat(user, span_userdanger("[src] grabs your [arm.name]!"))
+ to_chat(user, span_userdanger("[src] grabs your [arm.plaintext_zone]!"))
arm.dismember()
consume_fuel(consumed = arm)
diff --git a/code/modules/antagonists/nightmare/nightmare_equipment.dm b/code/modules/antagonists/nightmare/nightmare_equipment.dm
index 7748f3e4226..535e11854bf 100644
--- a/code/modules/antagonists/nightmare/nightmare_equipment.dm
+++ b/code/modules/antagonists/nightmare/nightmare_equipment.dm
@@ -48,7 +48,7 @@
UnregisterSignal(user, COMSIG_MOB_AFTER_EXIT_JAUNT)
remove_crit()
-/obj/item/light_eater/attack(mob/living/target, mob/living/user, list/modifiers)
+/obj/item/light_eater/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!has_crit)
return
diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm
index 3c2dcaa0cff..8b33de2e49b 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclear_authentication_disk.dm
@@ -82,7 +82,7 @@
return discover_after
-/obj/item/disk/nuclear/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/item/disk/nuclear/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/claymore/highlander) && !fake)
var/obj/item/claymore/highlander/claymore = weapon
if(claymore.nuke_disk)
diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm
index f04dabe7874..73a29a1380a 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/_nuclear_bomb.dm
@@ -108,7 +108,7 @@ GLOBAL_VAR(station_nuke_source)
return TRUE
-/obj/machinery/nuclearbomb/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/nuclearbomb/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if (istype(weapon, /obj/item/disk/nuclear))
if(!disk_check(weapon))
return TRUE
diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm
index c09b02ff224..f2cc848a8b3 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclear_bomb/beer_nuke.dm
@@ -27,7 +27,7 @@
else
. += span_danger("It's empty.")
-/obj/machinery/nuclearbomb/beer/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/nuclearbomb/beer/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(weapon.is_refillable())
weapon.interact_with_atom(keg, user) // redirect refillable containers to the keg, allowing them to be filled
return TRUE // pretend we handled the attack, too.
diff --git a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm
index 9f050c565d7..44fbc63c850 100644
--- a/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm
+++ b/code/modules/antagonists/voidwalker/voidwalker_void_eater.dm
@@ -54,7 +54,7 @@
. += span_notice("Sharpness: [round(force)]/[initial(force)]")
. += span_notice("Wall Conversions remaining: [conversions_remaining ? conversions_remaining : "None! You must resharpen your blade!"]")
-/obj/item/void_eater/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/void_eater/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
if(!ishuman(target_mob))
return ..()
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index 440d52a9275..bee49757a18 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -63,7 +63,7 @@
qdel(src)
return PROCESS_KILL
-/obj/effect/rend/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/effect/rend/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/nullrod))
user.visible_message(span_danger("[user] seals \the [src] with \the [I]."))
qdel(src)
diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm
index 3a7330e3af7..b76b300446c 100644
--- a/code/modules/antagonists/wizard/equipment/soulstone.dm
+++ b/code/modules/antagonists/wizard/equipment/soulstone.dm
@@ -318,7 +318,7 @@
if(IS_CULTIST(user) || HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) || user.stat == DEAD)
. += extra_desc
-/obj/structure/constructshell/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/structure/constructshell/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/soulstone))
var/obj/item/soulstone/SS = O
if(!IS_CULTIST(user) && !HAS_MIND_TRAIT(user, TRAIT_MAGICALLY_GIFTED) && !SS.theme == THEME_HOLY)
diff --git a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm
index c7f553a4c1d..a69492bab16 100644
--- a/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/wizard_spellbook.dm
@@ -74,7 +74,7 @@
return ..()
-/obj/item/spellbook/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/item/spellbook/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
// This can be generalized in the future, but for now it stays
if(istype(O, /obj/item/antag_spawner/contract))
var/datum/spellbook_entry/item/contract/contract_entry = locate() in entries
diff --git a/code/modules/art/paintings.dm b/code/modules/art/paintings.dm
index 6d12be2c0f7..d6cc060a1c6 100644
--- a/code/modules/art/paintings.dm
+++ b/code/modules/art/paintings.dm
@@ -15,7 +15,7 @@
var/obj/item/canvas/painting = null
//Adding canvases
-/obj/structure/easel/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/easel/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/canvas))
var/obj/item/canvas/canvas = I
user.dropItemToGround(canvas)
@@ -135,7 +135,7 @@
ui = new(user, src, "Canvas", name)
ui.open()
-/obj/item/canvas/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/canvas/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(!user.combat_mode)
ui_interact(user)
else
@@ -719,7 +719,7 @@
. = ..()
SSpersistent_paintings.painting_frames -= src
-/obj/structure/sign/painting/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/sign/painting/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!current_canvas && istype(I, /obj/item/canvas))
frame_canvas(user,I)
else if(current_canvas && current_canvas.painting_metadata.title == initial(current_canvas.painting_metadata.title) && istype(I,/obj/item/pen))
diff --git a/code/modules/art/statues.dm b/code/modules/art/statues.dm
index e083d1f6523..2a0c1ce4507 100644
--- a/code/modules/art/statues.dm
+++ b/code/modules/art/statues.dm
@@ -33,7 +33,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/structure/statue/attackby(obj/item/W, mob/living/user, list/modifiers)
+/obj/structure/statue/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(W.tool_behaviour == TOOL_WELDER)
if(!W.tool_start_check(user, amount=1, heat_required = HIGH_TEMPERATURE_REQUIRED))
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 4f35fda4634..4a8e1b9dbc0 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -118,7 +118,7 @@
return
. = ..()
-/obj/item/assembly/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/assembly/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(isassembly(attacking_item))
var/obj/item/assembly/new_assembly = attacking_item
// Check both our's and their's assembly flags to see if either should not duplicate
diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index 17a80cfb0fe..5501843d318 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -289,7 +289,7 @@
..()
new /obj/effect/temp_visual/borgflash(get_turf(src))
-/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
return
/obj/item/assembly/flash/cyborg/screwdriver_act(mob/living/user, obj/item/I)
return
diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm
index 526e9c91b03..5fd30faa3a5 100644
--- a/code/modules/assembly/holder.dm
+++ b/code/modules/assembly/holder.dm
@@ -134,7 +134,7 @@
for(var/obj/item/assembly/assembly as anything in assemblies)
assembly.attack_hand(user, modifiers) // Note override in assembly.dm to prevent side effects here
-/obj/item/assembly_holder/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/assembly_holder/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(isassembly(weapon))
try_add_assembly(weapon, user)
return
diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm
index b326e9197fd..751585d439b 100644
--- a/code/modules/assembly/signaler.dm
+++ b/code/modules/assembly/signaler.dm
@@ -120,7 +120,7 @@
update_appearance()
-/obj/item/assembly/signaler/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/assembly/signaler/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(issignaler(W))
var/obj/item/assembly/signaler/signaler2 = W
if(secured && signaler2.secured)
@@ -182,7 +182,7 @@
/obj/item/assembly/signaler/cyborg
-/obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/assembly/signaler/cyborg/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
return
/obj/item/assembly/signaler/cyborg/screwdriver_act(mob/living/user, obj/item/I)
return
@@ -193,7 +193,7 @@
/obj/item/assembly/signaler/internal/ui_state(mob/user)
return GLOB.inventory_state
-/obj/item/assembly/signaler/internal/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/assembly/signaler/internal/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
return
/obj/item/assembly/signaler/internal/screwdriver_act(mob/living/user, obj/item/I)
diff --git a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm
index 98b5c7ece7e..67d2ba9fdc0 100644
--- a/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm
+++ b/code/modules/atmospherics/machinery/air_alarm/air_alarm_interact.dm
@@ -100,7 +100,7 @@
if((buildstage == AIR_ALARM_BUILD_COMPLETE))
new /obj/item/stack/cable_coil(loc, 3)
-/obj/machinery/airalarm/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/airalarm/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
update_last_used(user)
switch(buildstage)
if(AIR_ALARM_BUILD_COMPLETE)
diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm
index 88c7a32541f..cad21032ec8 100644
--- a/code/modules/atmospherics/machinery/atmosmachinery.dm
+++ b/code/modules/atmospherics/machinery/atmosmachinery.dm
@@ -403,7 +403,7 @@
nodes[nodes.Find(reference)] = null
update_appearance()
-/obj/machinery/atmospherics/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/atmospherics/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/pipe)) //lets you autodrop
var/obj/item/pipe/pipe = W
if(user.dropItemToGround(pipe))
diff --git a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm
index d8105c1b344..94cb05e1b8b 100644
--- a/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm
+++ b/code/modules/atmospherics/machinery/components/electrolyzer/electrolyzer.dm
@@ -160,7 +160,7 @@
/obj/machinery/electrolyzer/crowbar_act(mob/living/user, obj/item/tool)
return default_deconstruction_crowbar(tool)
-/obj/machinery/electrolyzer/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/electrolyzer/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(istype(I, /obj/item/stock_parts/power_store/cell))
if(!panel_open)
diff --git a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm
index 31908e6375c..73847953743 100644
--- a/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm
+++ b/code/modules/atmospherics/machinery/components/fusion/hfr_parts.dm
@@ -34,7 +34,7 @@
. = ..()
. += span_notice("[src] can be rotated by first opening the panel with a screwdriver and then using a wrench on it.")
-/obj/machinery/atmospherics/components/unary/hypertorus/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/atmospherics/components/unary/hypertorus/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!fusion_started)
if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_off, I))
return
@@ -128,7 +128,7 @@
. = ..()
. += span_notice("[src] can be rotated by first opening the panel with a screwdriver and then using a wrench on it.")
-/obj/machinery/hypertorus/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/hypertorus/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!fusion_started)
if(default_deconstruction_screwdriver(user, icon_state_open, icon_state_off, I))
return
diff --git a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm
index 830509ac10f..4c8e9ecb787 100644
--- a/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm
+++ b/code/modules/atmospherics/machinery/components/gas_recipe_machines/crystallizer.dm
@@ -58,7 +58,7 @@
context[SCREENTIP_CONTEXT_RMB] = "Rotate"
return CONTEXTUAL_SCREENTIP_SET
-/obj/machinery/atmospherics/components/binary/crystallizer/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/atmospherics/components/binary/crystallizer/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!on)
if(default_deconstruction_screwdriver(user, "[base_icon_state]-open", "[base_icon_state]-off", I))
return
diff --git a/code/modules/atmospherics/machinery/components/tank.dm b/code/modules/atmospherics/machinery/components/tank.dm
index 44961cd0949..272fff1ddb8 100644
--- a/code/modules/atmospherics/machinery/components/tank.dm
+++ b/code/modules/atmospherics/machinery/components/tank.dm
@@ -543,7 +543,7 @@
if(TANK_PLATING_UNSECURED)
icon_state = "plated_frame"
-/obj/structure/tank_frame/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/structure/tank_frame/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(construction_state == TANK_FRAME && isstack(item) && add_plating(user, item))
return
return ..()
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index bd65168fdfd..8f77d733653 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -89,7 +89,7 @@
return air_temporary.remove(amount)
return parent.air.remove(amount)
-/obj/machinery/atmospherics/pipe/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/atmospherics/pipe/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/pipe_meter))
var/obj/item/pipe_meter/meter = item
user.dropItemToGround(meter)
diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm
index 947f0fe385a..684e5e1e5c4 100644
--- a/code/modules/atmospherics/machinery/portable/canister.dm
+++ b/code/modules/atmospherics/machinery/portable/canister.dm
@@ -363,7 +363,7 @@
if(internal_cell)
internal_cell.forceMove(drop_location())
-/obj/machinery/portable_atmospherics/canister/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/portable_atmospherics/canister/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/stock_parts/power_store/cell))
var/obj/item/stock_parts/power_store/cell/active_cell = item
if(!panel_open)
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 9de5e8a0d5f..f9020860edf 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -9,6 +9,7 @@
anchored = FALSE
layer = ABOVE_OBJ_LAYER
interaction_flags_click = NEED_DEXTERITY
+ damage_deflection = 11
///Stores the gas mixture of the portable component. Don't access this directly, use return_air() so you support the temporary processing it provides
var/datum/gas_mixture/air_contents
@@ -253,7 +254,7 @@
update_appearance()
return TRUE
-/obj/machinery/portable_atmospherics/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/portable_atmospherics/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/tank))
return replace_tank(user, FALSE, item)
return ..()
@@ -287,13 +288,20 @@
investigate_log("was connected to [possible_port] by [key_name(user)].", INVESTIGATE_ATMOS)
return TRUE
+/obj/machinery/portable_atmospherics/atom_break(damage_flag)
+ . = ..()
+ damage_deflection = 0
+
+/obj/machinery/portable_atmospherics/atom_fix()
+ . = ..()
+ damage_deflection = initial(damage_deflection)
+
/obj/machinery/portable_atmospherics/attacked_by(obj/item/item, mob/user)
- if(item.force < 10 && !(machine_stat & BROKEN))
- take_damage(0)
+ . = ..()
+ if(!.)
return
investigate_log("was smacked with \a [item] by [key_name(user)].", INVESTIGATE_ATMOS)
- add_fingerprint(user)
- return ..()
+ add_hiddenprint(user)
/// Holding tanks can get to zero integrity and be destroyed without other warnings due to pressure change.
/// This checks for that case and removes our reference to it.
diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm
index 8470311721a..94c71287eef 100644
--- a/code/modules/awaymissions/signpost.dm
+++ b/code/modules/awaymissions/signpost.dm
@@ -30,7 +30,7 @@
else
to_chat(user, "Nothing happens. You feel that this is a bad sign.")
-/obj/structure/signpost/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/signpost/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
return interact(user)
/obj/structure/signpost/attack_paw(mob/user, list/modifiers)
diff --git a/code/modules/awaymissions/super_secret_room.dm b/code/modules/awaymissions/super_secret_room.dm
index 4f0262625a9..6d338e5ec26 100644
--- a/code/modules/awaymissions/super_secret_room.dm
+++ b/code/modules/awaymissions/super_secret_room.dm
@@ -90,7 +90,7 @@
speaking = FALSE
times_spoken_to++
-/obj/structure/speaking_tile/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/speaking_tile/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
return interact(user)
/obj/structure/speaking_tile/attack_paw(mob/user, list/modifiers)
diff --git a/code/modules/basketball/basketball.dm b/code/modules/basketball/basketball.dm
index 64f3ea34f67..919d26daeee 100644
--- a/code/modules/basketball/basketball.dm
+++ b/code/modules/basketball/basketball.dm
@@ -149,7 +149,7 @@
user.balloon_alert_to_viewers("fumbles the ball")
-/obj/item/toy/basketball/attack(mob/living/carbon/target, mob/living/user, list/modifiers)
+/obj/item/toy/basketball/attack(mob/living/carbon/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!iscarbon(target) || user.combat_mode)
return ..()
diff --git a/code/modules/basketball/hoop.dm b/code/modules/basketball/hoop.dm
index 501942ec863..830bde426f7 100644
--- a/code/modules/basketball/hoop.dm
+++ b/code/modules/basketball/hoop.dm
@@ -89,7 +89,7 @@
scoreboard.add_overlay(tens_overlay)
scoreboard.add_overlay(emissive_tens_overlay)
-/obj/structure/hoop/attackby(obj/item/ball, mob/living/baller, list/modifiers)
+/obj/structure/hoop/attackby(obj/item/ball, mob/living/baller, list/modifiers, list/attack_modifiers)
if(!baller.can_perform_action(src, NEED_HANDS|FORBID_TELEKINESIS_REACH))
return // TK users aren't allowed to dunk
diff --git a/code/modules/bitrunning/server/_parent.dm b/code/modules/bitrunning/server/_parent.dm
index 70a5deb7441..281b80c2148 100644
--- a/code/modules/bitrunning/server/_parent.dm
+++ b/code/modules/bitrunning/server/_parent.dm
@@ -123,7 +123,7 @@
return ..()
-/obj/machinery/quantum_server/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/quantum_server/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!istype(weapon, /obj/item/bitrunning_debug))
diff --git a/code/modules/capture_the_flag/ctf_game.dm b/code/modules/capture_the_flag/ctf_game.dm
index 9dd0b8f31fc..d30ab87f0a6 100644
--- a/code/modules/capture_the_flag/ctf_game.dm
+++ b/code/modules/capture_the_flag/ctf_game.dm
@@ -171,7 +171,7 @@
player_mob.add_traits(player_traits, CAPTURE_THE_FLAG_TRAIT)
return player_mob //used in medisim_game.dm
-/obj/machinery/ctf/spawner/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/ctf/spawner/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/ctf_flag))
var/obj/item/ctf_flag/flag = item
if(flag.team != team)
@@ -268,7 +268,7 @@
user.set_anchored(TRUE)
user.status_flags &= ~CANPUSH
-/obj/item/ctf_flag/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/ctf_flag/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(item, /obj/item/ctf_flag))
return ..()
@@ -367,7 +367,7 @@
scores += UNLINT("[ctf_team.team_color] - [ctf_team.points]/[ctf_game.points_to_win]\n")
balloon_alert_to_viewers(scores)
-/obj/machinery/ctf/control_point/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/ctf/control_point/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
capture(user)
/obj/machinery/ctf/control_point/attack_hand(mob/user, list/modifiers)
diff --git a/code/modules/cards/cardhand.dm b/code/modules/cards/cardhand.dm
index cedb421f334..e54d004882d 100644
--- a/code/modules/cards/cardhand.dm
+++ b/code/modules/cards/cardhand.dm
@@ -91,7 +91,7 @@
return ..()
-/obj/item/toy/cards/cardhand/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/toy/cards/cardhand/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
attackby(weapon, user, modifiers, flip_card = TRUE)
return SECONDARY_ATTACK_CONTINUE_CHAIN
diff --git a/code/modules/cards/deck/deck.dm b/code/modules/cards/deck/deck.dm
index 55c2a1d31fa..03c92e4ce6f 100644
--- a/code/modules/cards/deck/deck.dm
+++ b/code/modules/cards/deck/deck.dm
@@ -177,7 +177,7 @@
card.Flip(CARD_FACEDOWN)
. = ..()
-/obj/item/toy/cards/deck/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/toy/cards/deck/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/toy/singlecard) || istype(item, /obj/item/toy/cards/cardhand))
insert(item)
var/card_grammar = istype(item, /obj/item/toy/singlecard) ? "card" : "cards"
diff --git a/code/modules/cards/singlecard.dm b/code/modules/cards/singlecard.dm
index 8693fc5c0f1..92a2d921b31 100644
--- a/code/modules/cards/singlecard.dm
+++ b/code/modules/cards/singlecard.dm
@@ -219,7 +219,7 @@
return
return ..()
-/obj/item/toy/singlecard/attackby_secondary(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/toy/singlecard/attackby_secondary(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
attackby(item, user, modifiers, flip_card=TRUE)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm
index 4dcb9076b54..8c137835f7d 100644
--- a/code/modules/cargo/coupon.dm
+++ b/code/modules/cargo/coupon.dm
@@ -112,7 +112,7 @@
visible_message(span_warning("[src] burns up in a sinister flash, taking an evil energy with it..."))
burn()
-/obj/item/coupon/attack_atom(obj/O, mob/living/user, list/modifiers)
+/obj/item/coupon/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers)
if(!istype(O, /obj/machinery/computer/cargo))
return ..()
if(discount_pct_off == COUPON_OMEN)
diff --git a/code/modules/cargo/materials_market.dm b/code/modules/cargo/materials_market.dm
index 26520805b36..4eac999980f 100644
--- a/code/modules/cargo/materials_market.dm
+++ b/code/modules/cargo/materials_market.dm
@@ -55,7 +55,7 @@
if(default_deconstruction_crowbar(tool))
return ITEM_INTERACT_SUCCESS
-/obj/machinery/materials_market/attackby(obj/item/markable_object, mob/user, list/modifiers)
+/obj/machinery/materials_market/attackby(obj/item/markable_object, mob/user, list/modifiers, list/attack_modifiers)
if(is_type_in_list(markable_object, exportable_material_items))
if(machine_stat & NOPOWER)
balloon_alert(user, "no power!")
diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm
index 2f62ea76560..c7f6eff740b 100644
--- a/code/modules/cargo/orderconsole.dm
+++ b/code/modules/cargo/orderconsole.dm
@@ -44,13 +44,12 @@
can_approve_requests = FALSE
requestonly = TRUE
-/obj/machinery/computer/cargo/attacked_by(obj/item/I, mob/living/user)
- if(istype(I,/obj/item/trade_chip))
- var/obj/item/trade_chip/contract = I
- contract.try_to_unlock_contract(user)
- return TRUE
- else
- return ..()
+/obj/machinery/computer/cargo/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!istype(tool, /obj/item/trade_chip))
+ return NONE
+ var/obj/item/trade_chip/contract = tool
+ contract.try_to_unlock_contract(user)
+ return ITEM_INTERACT_SUCCESS
/obj/machinery/computer/cargo/emag_act(mob/user, obj/item/card/emag/emag_card)
if(obj_flags & EMAGGED)
diff --git a/code/modules/cargo/universal_scanner.dm b/code/modules/cargo/universal_scanner.dm
index bf572af5591..01d9f4e7f55 100644
--- a/code/modules/cargo/universal_scanner.dm
+++ b/code/modules/cargo/universal_scanner.dm
@@ -69,7 +69,7 @@
return ITEM_INTERACT_SUCCESS
return NONE
-/obj/item/universal_scanner/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/universal_scanner/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(scanning_mode == SCAN_SALES_TAG && isidcard(attacking_item))
var/obj/item/card/id/potential_acc = attacking_item
diff --git a/code/modules/clothing/belts/polymorph_belt.dm b/code/modules/clothing/belts/polymorph_belt.dm
index cedd161959a..07740888a9a 100644
--- a/code/modules/clothing/belts/polymorph_belt.dm
+++ b/code/modules/clothing/belts/polymorph_belt.dm
@@ -61,7 +61,7 @@
qdel(tool)
return ITEM_INTERACT_SUCCESS
-/obj/item/polymorph_belt/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/polymorph_belt/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if (.)
return
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 7b493d3712c..e492c2504f6 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -103,7 +103,7 @@
else
qdel(src)
-/obj/item/clothing/attack(mob/living/target, mob/living/user, list/modifiers)
+/obj/item/clothing/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode || !ismoth(target) || ispickedupmob(src))
return ..()
if((clothing_flags & INEDIBLE_CLOTHING) || (resistance_flags & INDESTRUCTIBLE))
diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm
index 93fa2e6d0f1..f1feb7165ff 100644
--- a/code/modules/clothing/gloves/_gloves.dm
+++ b/code/modules/clothing/gloves/_gloves.dm
@@ -73,7 +73,7 @@
return FALSE // We don't want to cut dyed gloves.
return TRUE
-/obj/item/clothing/gloves/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/item/clothing/gloves/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index b1672d083d3..c9c1aa8197d 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -45,7 +45,7 @@
. = ..()
AddComponent(/datum/component/seclite_attachable, light_icon_state = "flight")
-/obj/item/clothing/head/helmet/sec/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/clothing/head/helmet/sec/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(issignaler(attacking_item))
var/obj/item/assembly/signaler/attached_signaler = attacking_item
// There's a flashlight in us. Remove it first, or it'll be lost forever!
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index d442c6ddcc7..0a769fa0ca2 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -312,7 +312,7 @@
return .
-/obj/item/clothing/head/fedora/inspector_hat/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/clothing/head/fedora/inspector_hat/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(LAZYLEN(contents) >= max_items)
diff --git a/code/modules/clothing/head/tophat.dm b/code/modules/clothing/head/tophat.dm
index 36984e0c4fe..1efa8210db7 100644
--- a/code/modules/clothing/head/tophat.dm
+++ b/code/modules/clothing/head/tophat.dm
@@ -10,7 +10,7 @@
/// Cooldown for how often we can pull rabbits out of here
COOLDOWN_DECLARE(rabbit_cooldown)
-/obj/item/clothing/head/hats/tophat/attackby(obj/item/hitby_item, mob/user, list/modifiers)
+/obj/item/clothing/head/hats/tophat/attackby(obj/item/hitby_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(istype(hitby_item, /obj/item/gun/magic/wand))
abracadabra(hitby_item, user)
diff --git a/code/modules/clothing/masks/muzzle.dm b/code/modules/clothing/masks/muzzle.dm
index c13d29edf31..b9b2460167c 100644
--- a/code/modules/clothing/masks/muzzle.dm
+++ b/code/modules/clothing/masks/muzzle.dm
@@ -73,7 +73,7 @@
INVOKE_ASYNC(user, TYPE_PROC_REF(/mob, emote), "scream")
to_chat(user, span_userdanger("You feel a massive pain as hundreds of tiny spikes tear free from your face!"))
-/obj/item/clothing/mask/muzzle/tape/attack(mob/living/carbon/victim, mob/living/carbon/attacker, list/modifiers)
+/obj/item/clothing/mask/muzzle/tape/attack(mob/living/carbon/victim, mob/living/carbon/attacker, list/modifiers, list/attack_modifiers)
if(attacker.combat_mode)
return ..()
if(victim.is_mouth_covered(ITEM_SLOT_HEAD))
diff --git a/code/modules/clothing/neck/collar_bomb.dm b/code/modules/clothing/neck/collar_bomb.dm
index dd0d4fcf9d2..10450f53c94 100644
--- a/code/modules/clothing/neck/collar_bomb.dm
+++ b/code/modules/clothing/neck/collar_bomb.dm
@@ -38,7 +38,7 @@
return
. += span_tinynotice("It has a [EXAMINE_HINT("wire")] panel that could be interacted with...")
-/obj/item/clothing/neck/collar_bomb/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/clothing/neck/collar_bomb/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(is_wire_tool(item))
wires.interact(user)
else
diff --git a/code/modules/clothing/shoes/sneakers.dm b/code/modules/clothing/shoes/sneakers.dm
index 31f6f7f44b2..9dc902b0143 100644
--- a/code/modules/clothing/shoes/sneakers.dm
+++ b/code/modules/clothing/shoes/sneakers.dm
@@ -143,13 +143,13 @@
return
return ..()
-/obj/item/clothing/shoes/sneakers/orange/pre_attack(atom/movable/attacking_movable, mob/living/user, list/modifiers)
+/obj/item/clothing/shoes/sneakers/orange/pre_attack(atom/movable/attacking_movable, mob/living/user, list/modifiers, list/attack_modifiers)
if(attached_cuffs || attacking_movable.type != /obj/item/restraints/handcuffs)
return ..()
attacking_movable.forceMove(src)
return TRUE
-/obj/item/clothing/shoes/sneakers/orange/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/clothing/shoes/sneakers/orange/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(attached_cuffs || attacking_item.type != /obj/item/restraints/handcuffs) // Note: not using istype here because we want to ignore all subtypes
return ..()
attacking_item.forceMove(src)
diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm
index cb74fc7a726..5cafbeb13fd 100644
--- a/code/modules/clothing/spacesuits/_spacesuits.dm
+++ b/code/modules/clothing/spacesuits/_spacesuits.dm
@@ -218,7 +218,7 @@
return ITEM_INTERACT_SUCCESS
// object handling for accessing features of the suit
-/obj/item/clothing/suit/space/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/clothing/suit/space/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!cell_cover_open || !istype(I, /obj/item/stock_parts/power_store/cell))
return ..()
if(cell)
diff --git a/code/modules/clothing/spacesuits/softsuit.dm b/code/modules/clothing/spacesuits/softsuit.dm
index 13cb9090c95..445af2ea1b6 100644
--- a/code/modules/clothing/spacesuits/softsuit.dm
+++ b/code/modules/clothing/spacesuits/softsuit.dm
@@ -52,7 +52,7 @@
. = ..()
. += span_notice("You can start constructing a critter sized mecha with a [span_bold("cyborg leg")].")
-/obj/item/clothing/head/helmet/space/eva/attackby(obj/item/attacked_with, mob/user, list/modifiers)
+/obj/item/clothing/head/helmet/space/eva/attackby(obj/item/attacked_with, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm
index f5726555feb..cf2dc9a0072 100644
--- a/code/modules/clothing/under/_under.dm
+++ b/code/modules/clothing/under/_under.dm
@@ -112,7 +112,7 @@
blood_overlay.color = get_blood_dna_color(GET_ATOM_BLOOD_DNA(src))
. += blood_overlay
-/obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/clothing/under/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(repair_sensors(attacking_item, user))
return TRUE
diff --git a/code/modules/economy/holopay.dm b/code/modules/economy/holopay.dm
index e9f385c4046..45eb59c8135 100644
--- a/code/modules/economy/holopay.dm
+++ b/code/modules/economy/holopay.dm
@@ -74,7 +74,7 @@
linked_card = null
return ..()
-/obj/structure/holopay/attackby(obj/item/held_item, mob/item_holder, list/modifiers)
+/obj/structure/holopay/attackby(obj/item/held_item, mob/item_holder, list/modifiers, list/attack_modifiers)
var/mob/living/user = item_holder
if(!isliving(user))
return ..()
@@ -115,7 +115,7 @@
return TRUE
return ..()
-/obj/structure/holopay/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/structure/holopay/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
/// Can kill it by right-clicking with ID because it seems useful and intuitive, to me, at least
if(!isidcard(weapon))
return ..()
diff --git a/code/modules/events/space_vines/vine_structure.dm b/code/modules/events/space_vines/vine_structure.dm
index 78d0d0e8e35..da56c5359b8 100644
--- a/code/modules/events/space_vines/vine_structure.dm
+++ b/code/modules/events/space_vines/vine_structure.dm
@@ -30,6 +30,7 @@
/obj/structure/spacevine/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_CHASM_DESTROYED, INNATE_TRAIT)
+ ADD_TRAIT(src, TRAIT_INVERTED_DEMOLITION, INNATE_TRAIT)
add_atom_colour("#ffffff", FIXED_COLOUR_PRIORITY)
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
@@ -80,16 +81,14 @@
if(!override)
qdel(src)
-/obj/structure/spacevine/attacked_by(obj/item/item, mob/living/user)
- var/damage_dealt = item.force
- if(item.get_sharpness())
- damage_dealt *= 4
+/obj/structure/spacevine/attacked_by(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
+ LAZYSET(attack_modifiers, SILENCE_DEFAULT_MESSAGES, TRUE)
+ LAZYSET(attack_modifiers, FORCE_MULTIPLIER, 1)
if(item.damtype == BURN)
- damage_dealt *= 4
-
- for(var/datum/spacevine_mutation/mutation in mutations)
- damage_dealt = mutation.on_hit(src, user, item, damage_dealt) //on_hit now takes override damage as arg and returns new value for other mutations to permutate further
- take_damage(damage_dealt, item.damtype, MELEE, 1)
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 4)
+ if(item.get_sharpness())
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 4)
+ return ..()
/obj/structure/spacevine/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
switch(damage_type)
diff --git a/code/modules/events/wizard/rpgloot.dm b/code/modules/events/wizard/rpgloot.dm
index 077c644d2b5..43517ec26dd 100644
--- a/code/modules/events/wizard/rpgloot.dm
+++ b/code/modules/events/wizard/rpgloot.dm
@@ -35,7 +35,7 @@
return ..()
-/obj/item/upgradescroll/pre_attack(obj/item/target, mob/living/user, list/modifiers)
+/obj/item/upgradescroll/pre_attack(obj/item/target, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(. || !istype(target) || !user.combat_mode)
return
diff --git a/code/modules/experisci/destructive_scanner.dm b/code/modules/experisci/destructive_scanner.dm
index 2b07ee91966..4d6ae192db1 100644
--- a/code/modules/experisci/destructive_scanner.dm
+++ b/code/modules/experisci/destructive_scanner.dm
@@ -104,7 +104,7 @@
. = ..()
icon_state = scanning ? "tube_on" : "tube_open"
-/obj/machinery/destructive_scanner/attackby(obj/item/object, mob/user, list/modifiers)
+/obj/machinery/destructive_scanner/attackby(obj/item/object, mob/user, list/modifiers, list/attack_modifiers)
if (!scanning && default_deconstruction_screwdriver(user, "tube_open", "tube_open", object) || default_deconstruction_crowbar(object))
update_icon()
return
diff --git a/code/modules/explorer_drone/exodrone.dm b/code/modules/explorer_drone/exodrone.dm
index 49d7fa70e61..e0b1aec07b2 100644
--- a/code/modules/explorer_drone/exodrone.dm
+++ b/code/modules/explorer_drone/exodrone.dm
@@ -361,7 +361,7 @@ GLOBAL_LIST_EMPTY(exodrone_launchers)
if(fuel_canister)
. += span_notice("You can remove the [fuel_canister] with a prying tool.")
-/obj/machinery/exodrone_launcher/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/machinery/exodrone_launcher/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/fuel_pellet))
if(fuel_canister)
to_chat(user, span_warning("There's already fuel loaded inside [src]!"))
diff --git a/code/modules/explorer_drone/loot.dm b/code/modules/explorer_drone/loot.dm
index 3de78751d04..7f21b788f3d 100644
--- a/code/modules/explorer_drone/loot.dm
+++ b/code/modules/explorer_drone/loot.dm
@@ -159,7 +159,7 @@ GLOBAL_LIST_INIT(adventure_loot_generator_index,generate_generator_index())
cell = new /obj/item/stock_parts/power_store/cell(src)
AddComponent(/datum/component/two_handed)
-/obj/item/firelance/attack(mob/living/M, mob/living/user, list/modifiers)
+/obj/item/firelance/attack(mob/living/M, mob/living/user, list/modifiers, list/attack_modifiers)
if(!user.combat_mode)
return
. = ..()
diff --git a/code/modules/fishing/fish/_fish.dm b/code/modules/fishing/fish/_fish.dm
index fe0a60b7879..361520f2d15 100644
--- a/code/modules/fishing/fish/_fish.dm
+++ b/code/modules/fishing/fish/_fish.dm
@@ -491,7 +491,7 @@ GLOBAL_LIST_INIT(fish_compatible_fluid_types, list(
icon_state = base_icon_state
return ..()
-/obj/item/fish/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/fish/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(!istype(item, /obj/item/reagent_containers/cup/fish_feed))
return ..()
if(!item.reagents.total_volume)
diff --git a/code/modules/fishing/fish/types/rift.dm b/code/modules/fishing/fish/types/rift.dm
index dc698935bf5..af21edb3f78 100644
--- a/code/modules/fishing/fish/types/rift.dm
+++ b/code/modules/fishing/fish/types/rift.dm
@@ -747,7 +747,7 @@
. = ..()
limb.remove_bodypart_overlay(babbel_overlay)
-/obj/item/organ/ears/babbelfish/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/organ/ears/babbelfish/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
var/obj/item/organ/ears/ears = target_mob.get_organ_slot(ORGAN_SLOT_EARS)
if(!ears)
diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm
index 11c56c0e67e..ce71a616831 100644
--- a/code/modules/fishing/fishing_rod.dm
+++ b/code/modules/fishing/fishing_rod.dm
@@ -523,7 +523,7 @@
. += line_overlay
. += mutable_appearance(icon_file, "hook_overlay")
-/obj/item/fishing_rod/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/fishing_rod/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(slot_check(attacking_item,ROD_SLOT_LINE))
use_slot(ROD_SLOT_LINE, user, attacking_item)
SStgui.update_uis(src)
diff --git a/code/modules/food_and_drinks/machinery/coffeemaker.dm b/code/modules/food_and_drinks/machinery/coffeemaker.dm
index 720fbdcaacc..38395113cc9 100644
--- a/code/modules/food_and_drinks/machinery/coffeemaker.dm
+++ b/code/modules/food_and_drinks/machinery/coffeemaker.dm
@@ -183,7 +183,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/coffeemaker/attackby(obj/item/attack_item, mob/living/user, list/modifiers)
+/obj/machinery/coffeemaker/attackby(obj/item/attack_item, mob/living/user, list/modifiers, list/attack_modifiers)
//You can only screw open empty grinder
if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item))
return FALSE
@@ -582,7 +582,7 @@
return FALSE
return TRUE
-/obj/machinery/coffeemaker/impressa/attackby(obj/item/attack_item, mob/living/user, list/modifiers)
+/obj/machinery/coffeemaker/impressa/attackby(obj/item/attack_item, mob/living/user, list/modifiers, list/attack_modifiers)
//You can only screw open empty grinder
if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item))
return
diff --git a/code/modules/food_and_drinks/machinery/deep_fryer.dm b/code/modules/food_and_drinks/machinery/deep_fryer.dm
index 2246a847622..a5dac16a411 100644
--- a/code/modules/food_and_drinks/machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/machinery/deep_fryer.dm
@@ -97,7 +97,7 @@ GLOBAL_LIST_INIT(oilfry_blacklisted_items, typecacheof(list(
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/deepfryer/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/deepfryer/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
// Dissolving pills into the frier
if(istype(weapon, /obj/item/reagent_containers/applicator/pill))
if(!reagents.total_volume)
diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm
index 5c6e7b6bca7..0e4b028e3fd 100644
--- a/code/modules/food_and_drinks/machinery/gibber.dm
+++ b/code/modules/food_and_drinks/machinery/gibber.dm
@@ -134,7 +134,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/gibber/attackby(obj/item/P, mob/user, list/modifiers)
+/obj/machinery/gibber/attackby(obj/item/P, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P))
return
diff --git a/code/modules/food_and_drinks/machinery/griddle.dm b/code/modules/food_and_drinks/machinery/griddle.dm
index ed7d17f1ce4..f5ff1c140e8 100644
--- a/code/modules/food_and_drinks/machinery/griddle.dm
+++ b/code/modules/food_and_drinks/machinery/griddle.dm
@@ -62,7 +62,7 @@
return default_deconstruction_crowbar(I, ignore_panel = TRUE)
-/obj/machinery/griddle/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/griddle/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(griddled_objects.len >= max_items)
to_chat(user, span_notice("[src] can't fit more items!"))
diff --git a/code/modules/food_and_drinks/machinery/icecream_vat.dm b/code/modules/food_and_drinks/machinery/icecream_vat.dm
index f9bec4701d4..82b3e9a6224 100644
--- a/code/modules/food_and_drinks/machinery/icecream_vat.dm
+++ b/code/modules/food_and_drinks/machinery/icecream_vat.dm
@@ -114,7 +114,7 @@
. = ..()
. += "You can use a [EXAMINE_HINT("spoon")] or [EXAMINE_HINT("soup ladle")] to spill reagents."
-/obj/machinery/icecream_vat/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/icecream_vat/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
@@ -140,7 +140,7 @@
balloon_alert(user, "beaker inserted")
custom_ice_cream_beaker = beaker
-/obj/machinery/icecream_vat/attackby_secondary(obj/item/reagent_containers/beaker, mob/user, list/modifiers)
+/obj/machinery/icecream_vat/attackby_secondary(obj/item/reagent_containers/beaker, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN)
return
diff --git a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm
index f8cfb616091..2ea7de7d4fa 100644
--- a/code/modules/food_and_drinks/machinery/monkeyrecycler.dm
+++ b/code/modules/food_and_drinks/machinery/monkeyrecycler.dm
@@ -47,7 +47,7 @@ GLOBAL_LIST_EMPTY(monkey_recyclers)
power_change()
return ITEM_INTERACT_SUCCESS
-/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O))
return
diff --git a/code/modules/food_and_drinks/machinery/oven.dm b/code/modules/food_and_drinks/machinery/oven.dm
index f6f9fc24ef9..7b4ccb76280 100644
--- a/code/modules/food_and_drinks/machinery/oven.dm
+++ b/code/modules/food_and_drinks/machinery/oven.dm
@@ -102,7 +102,7 @@
update_appearance()
use_energy(active_power_usage)
-/obj/machinery/oven/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/oven/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!open || used_tray || !istype(item, /obj/item/plate/oven_tray))
return ..()
diff --git a/code/modules/food_and_drinks/machinery/processor.dm b/code/modules/food_and_drinks/machinery/processor.dm
index 5e0c3675b5f..dbbe35570dc 100644
--- a/code/modules/food_and_drinks/machinery/processor.dm
+++ b/code/modules/food_and_drinks/machinery/processor.dm
@@ -88,7 +88,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/processor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/processor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(processing)
to_chat(user, span_warning("[src] is in the process of processing!"))
return TRUE
diff --git a/code/modules/food_and_drinks/machinery/smartfridge.dm b/code/modules/food_and_drinks/machinery/smartfridge.dm
index f2369374021..f038306da24 100644
--- a/code/modules/food_and_drinks/machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/machinery/smartfridge.dm
@@ -260,7 +260,7 @@
playsound(src, SFX_SHATTER, 50, TRUE)
return ..()
-/obj/machinery/smartfridge/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/machinery/smartfridge/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(!machine_stat)
var/shown_contents_length = visible_items()
if(shown_contents_length >= max_n_of_items)
diff --git a/code/modules/food_and_drinks/machinery/stove.dm b/code/modules/food_and_drinks/machinery/stove.dm
index d6782efaf99..5d2b0f808dd 100644
--- a/code/modules/food_and_drinks/machinery/stove.dm
+++ b/code/modules/food_and_drinks/machinery/stove.dm
@@ -142,7 +142,7 @@
update_appearance(UPDATE_OVERLAYS)
return TRUE
-/obj/item/reagent_containers/cup/soup_pot/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/reagent_containers/cup/soup_pot/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
diff --git a/code/modules/food_and_drinks/plate.dm b/code/modules/food_and_drinks/plate.dm
index 1fb5632219f..243d4f0ef14 100644
--- a/code/modules/food_and_drinks/plate.dm
+++ b/code/modules/food_and_drinks/plate.dm
@@ -24,7 +24,7 @@
if(fragile)
AddElement(/datum/element/can_shatter)
-/obj/item/plate/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/plate/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!IS_EDIBLE(I))
balloon_alert(user, "not food!")
return
@@ -45,7 +45,7 @@
else
return ..()
-/obj/item/plate/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/plate/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!iscarbon(target))
return
if(!contents.len)
diff --git a/code/modules/food_and_drinks/restaurant/_venue.dm b/code/modules/food_and_drinks/restaurant/_venue.dm
index 59d82878b46..0a968e3351f 100644
--- a/code/modules/food_and_drinks/restaurant/_venue.dm
+++ b/code/modules/food_and_drinks/restaurant/_venue.dm
@@ -223,15 +223,14 @@
linked_venue.toggle_open()
update_icon()
-/obj/machinery/restaurant_portal/attacked_by(obj/item/I, mob/living/user)
- if(!istype(I, /obj/item/card/id))
- return ..()
+/obj/machinery/restaurant_portal/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ var/obj/item/card/id/used_id = tool.GetID()
+ if(!istype(used_id))
+ return NONE
- var/obj/item/card/id/used_id = I
-
- if(!(linked_venue.req_access in used_id.GetAccess()))
- to_chat(user, span_warning("This card lacks the access to change this venues status."))
- return
+ if(!check_access(used_id))
+ balloon_alert(user, "insufficient access!")
+ return ITEM_INTERACT_BLOCKING
var/list/radial_items = list()
var/list/radial_results = list()
@@ -244,7 +243,7 @@
var/choice = show_radial_menu(user, src, radial_items, null, require_near = TRUE)
if(!choice)
- return
+ return ITEM_INTERACT_BLOCKING
var/venue_type = radial_results[choice]
var/obj/item/circuitboard/machine/restaurant_portal/board = circuit
@@ -253,11 +252,7 @@
turned_on_portal = WEAKREF(user)
- if(!(chosen_venue.req_access in used_id.GetAccess()))
- to_chat(user, span_warning("This card lacks the access to change this venues status."))
- return
-
- to_chat(user, span_notice("You change the portal's linked venue."))
+ balloon_alert(user, "venue changed to [chosen_venue.name]")
if(linked_venue && (src in linked_venue.restaurant_portals)) //We're already linked, unlink us.
linked_venue.restaurant_portals -= src
@@ -267,6 +262,7 @@
linked_venue = chosen_venue
linked_venue.restaurant_portals += src
+ return ITEM_INTERACT_SUCCESS
/obj/machinery/restaurant_portal/screwdriver_act(mob/user, obj/item/tool)
if (default_deconstruction_screwdriver(user, "[base_icon_state]-open", base_icon_state, tool))
diff --git a/code/modules/holodeck/items.dm b/code/modules/holodeck/items.dm
index 2a192c997bd..741cd472183 100644
--- a/code/modules/holodeck/items.dm
+++ b/code/modules/holodeck/items.dm
@@ -93,7 +93,7 @@
to_chat(user, span_warning("You are too primitive to use this device!"))
return
-/obj/machinery/readybutton/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/readybutton/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
to_chat(user, span_warning("The device is a solid button, there's nothing you can do with it!"))
/obj/machinery/readybutton/attack_hand(mob/user, list/modifiers)
@@ -148,7 +148,7 @@
/obj/machinery/conveyor/holodeck
-/obj/machinery/conveyor/holodeck/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/conveyor/holodeck/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!user.transferItemToLoc(I, drop_location()))
return ..()
diff --git a/code/modules/hydroponics/beekeeping/bee_smoker.dm b/code/modules/hydroponics/beekeeping/bee_smoker.dm
index d04c72adfd6..d54cc6d99bc 100644
--- a/code/modules/hydroponics/beekeeping/bee_smoker.dm
+++ b/code/modules/hydroponics/beekeeping/bee_smoker.dm
@@ -75,7 +75,7 @@
return .
-/obj/item/bee_smoker/attackby(obj/item/herb, mob/living/carbon/human/user, list/modifiers)
+/obj/item/bee_smoker/attackby(obj/item/herb, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 2949f6ed920..cb073c99b03 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -145,7 +145,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/structure/beebox/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/beebox/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/honey_frame))
var/obj/item/honey_frame/frame = item
if(honey_frames.len < BEEBOX_MAX_FRAMES)
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index 42d8b83829e..c1ab15162a4 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -199,7 +199,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/biogenerator/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/biogenerator/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode)
return ..()
diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm
index 7a57c1fc2bd..ab52f9e6c56 100644
--- a/code/modules/hydroponics/fermenting_barrel.dm
+++ b/code/modules/hydroponics/fermenting_barrel.dm
@@ -56,7 +56,7 @@
else
. += span_notice("It is currently closed, letting it ferment fruits or draw reagents from its tap.")
-/obj/structure/fermenting_barrel/attackby(obj/item/object, mob/user, list/modifiers)
+/obj/structure/fermenting_barrel/attackby(obj/item/object, mob/user, list/modifiers, list/attack_modifiers)
if(open)
if(istype(object, /obj/item/food/grown) && insert_fruit(user, object))
balloon_alert(user, "added fruit")
diff --git a/code/modules/hydroponics/grown/corn.dm b/code/modules/hydroponics/grown/corn.dm
index 3fc026a60e3..a55ae42e449 100644
--- a/code/modules/hydroponics/grown/corn.dm
+++ b/code/modules/hydroponics/grown/corn.dm
@@ -47,7 +47,7 @@
throw_range = 7
grind_results = list(/datum/reagent/cellulose = 10) //really partially hemicellulose
-/obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, list/modifiers)
+/obj/item/grown/corncob/attackby(obj/item/grown/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.get_sharpness())
to_chat(user, span_notice("You use [W] to fashion a pipe out of the corn cob!"))
new /obj/item/cigarette/pipe/cobpipe (user.loc)
diff --git a/code/modules/hydroponics/grown/hedges.dm b/code/modules/hydroponics/grown/hedges.dm
index b86baac13e5..d6bf1f49512 100644
--- a/code/modules/hydroponics/grown/hedges.dm
+++ b/code/modules/hydroponics/grown/hedges.dm
@@ -46,14 +46,15 @@
opacity = FALSE
max_integrity = 80
-/obj/structure/hedge/attacked_by(obj/item/I, mob/living/user)
- if(opacity && HAS_TRAIT(user, TRAIT_BONSAI) && I.get_sharpness())
- to_chat(user,span_notice("You start trimming \the [src]."))
- if(do_after(user, 3 SECONDS,target=src))
- to_chat(user,span_notice("You finish trimming \the [src]."))
- opacity = FALSE
- else
- return ..()
+/obj/structure/hedge/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!opacity || !HAS_TRAIT(user, TRAIT_BONSAI) || !tool.get_sharpness())
+ return NONE
+ balloon_alert(user, "trimming...")
+ if(!do_after(user, 3 SECONDS, target=src))
+ return ITEM_INTERACT_BLOCKING
+ opacity = FALSE
+ return ITEM_INTERACT_SUCCESS
+
/**
* useful for mazes and such
*/
diff --git a/code/modules/hydroponics/grown/melon.dm b/code/modules/hydroponics/grown/melon.dm
index 3317b544e57..284f760cc66 100644
--- a/code/modules/hydroponics/grown/melon.dm
+++ b/code/modules/hydroponics/grown/melon.dm
@@ -40,7 +40,7 @@
/obj/item/food/grown/watermelon/make_dryable()
return //No drying
-/obj/item/food/grown/watermelon/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/food/grown/watermelon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(I, /obj/item/kitchen/spoon))
return ..()
@@ -110,7 +110,7 @@
AddComponentFrom(SOURCE_EDIBLE_INNATE, /datum/component/edible, check_liked = CALLBACK(src, PROC_REF(check_holyness)))
-/obj/item/food/grown/holymelon/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/food/grown/holymelon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(I, /obj/item/kitchen/spoon))
return ..()
@@ -183,7 +183,7 @@
/obj/item/food/grown/barrelmelon/make_processable()
AddElement(/datum/element/processable, TOOL_KNIFE, /obj/item/food/barrelmelonslice, 5, 20, screentip_verb = "Chop")
-/obj/item/food/grown/barrelmelon/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/food/grown/barrelmelon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(I, /obj/item/kitchen/spoon))
return ..()
diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm
index 11e5ecd7486..9d0e465d033 100644
--- a/code/modules/hydroponics/grown/mushrooms.dm
+++ b/code/modules/hydroponics/grown/mushrooms.dm
@@ -197,7 +197,7 @@
desc = "Cantharellus Cibarius: These jolly yellow little shrooms sure look tasty!"
icon_state = "chanterelle"
-/obj/item/food/grown/mushroom/chanterelle/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/food/grown/mushroom/chanterelle/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(I, /obj/item/kitchen/spoon))
return ..()
if(seed.potency < 95)
diff --git a/code/modules/hydroponics/grown/potato.dm b/code/modules/hydroponics/grown/potato.dm
index e91e55a62fd..a9be7fc2c2f 100644
--- a/code/modules/hydroponics/grown/potato.dm
+++ b/code/modules/hydroponics/grown/potato.dm
@@ -37,7 +37,7 @@
icon_state = "potato_wedges"
bite_consumption_mod = 100
-/obj/item/food/grown/potato/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/food/grown/potato/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W.get_sharpness())
to_chat(user, span_notice("You cut the potato into wedges with [W]."))
var/obj/item/food/grown/potato/wedges/Wedges = new /obj/item/food/grown/potato/wedges
diff --git a/code/modules/hydroponics/grown/pumpkin.dm b/code/modules/hydroponics/grown/pumpkin.dm
index 59f2ba67a93..256abeced65 100644
--- a/code/modules/hydroponics/grown/pumpkin.dm
+++ b/code/modules/hydroponics/grown/pumpkin.dm
@@ -29,7 +29,7 @@
///Which type of lantern this gourd produces when carved.
var/carved_type = /obj/item/clothing/head/utility/hardhat/pumpkinhead
-/obj/item/food/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, list/modifiers)
+/obj/item/food/grown/pumpkin/attackby(obj/item/W as obj, mob/user as mob, list/modifiers, list/attack_modifiers)
if(W.get_sharpness())
user.show_message(span_notice("You carve a face into [src]!"), MSG_VISUAL)
new carved_type(user.loc)
diff --git a/code/modules/hydroponics/grown/root.dm b/code/modules/hydroponics/grown/root.dm
index 793a15b2239..201fdd1a660 100644
--- a/code/modules/hydroponics/grown/root.dm
+++ b/code/modules/hydroponics/grown/root.dm
@@ -25,7 +25,7 @@
juice_typepath = /datum/reagent/consumable/carrotjuice
wine_power = 30
-/obj/item/food/grown/carrot/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/food/grown/carrot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!I.get_sharpness())
return ..()
@@ -64,7 +64,7 @@
juice_typepath = /datum/reagent/consumable/parsnipjuice
wine_power = 35
-/obj/item/food/grown/parsnip/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/food/grown/parsnip/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!I.get_sharpness())
return ..()
@@ -110,7 +110,7 @@
tastes = list("sweet dirt" = 1)
distill_reagent = /datum/reagent/consumable/rootbeer
-/obj/item/food/grown/cahnroot/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/food/grown/cahnroot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!I.get_sharpness())
return ..()
diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm
index cb803de8e07..f0db7a02282 100644
--- a/code/modules/hydroponics/grown/towercap.dm
+++ b/code/modules/hydroponics/grown/towercap.dm
@@ -78,7 +78,7 @@
return NONE
-/obj/item/grown/log/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/grown/log/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(attacking_item.get_sharpness())
var/plank_count = 1
if(seed)
diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm
index 59752762b5c..49d2400c820 100644
--- a/code/modules/hydroponics/hydroitemdefines.dm
+++ b/code/modules/hydroponics/hydroitemdefines.dm
@@ -189,7 +189,7 @@
playsound(src, SFX_DESECRATION ,50, TRUE, -1)
return BRUTELOSS
-/obj/item/scythe/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/scythe/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!istype(target, /obj/structure/alien/resin/flower_bud) && !istype(target, /obj/structure/spacevine))
return ..()
if(swiping || get_turf(target) == get_turf(user))
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 31144776055..dfa2b36085f 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -225,7 +225,7 @@
QDEL_NULL(our_snail)
-/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/machinery/hydroponics/constructable/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if (!user.combat_mode)
// handle opening the panel
if(default_deconstruction_screwdriver(user, icon_state, icon_state, I))
@@ -865,7 +865,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/machinery/hydroponics/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
//Called when mob user "attacks" it with object O
if(IS_EDIBLE(O) || is_reagent_container(O)) // Syringe stuff (and other reagent containers now too)
var/obj/item/reagent_containers/reagent_source = O
@@ -1085,7 +1085,7 @@
else
return ..()
-/obj/machinery/hydroponics/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/hydroponics/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if (istype(weapon, /obj/item/reagent_containers/syringe))
to_chat(user, span_warning("You can't get any extract out of this plant."))
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
@@ -1209,7 +1209,7 @@
/obj/machinery/hydroponics/soil/update_status_light_overlays()
return // Has no lights
-/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/hydroponics/soil/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(weapon.tool_behaviour != TOOL_SHOVEL) //Spades can still uproot plants on left click
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
balloon_alert(user, "clearing up soil...")
diff --git a/code/modules/hydroponics/seed_extractor.dm b/code/modules/hydroponics/seed_extractor.dm
index 6c8d4552e9b..d7049b85f96 100644
--- a/code/modules/hydroponics/seed_extractor.dm
+++ b/code/modules/hydroponics/seed_extractor.dm
@@ -93,7 +93,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/seed_extractor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/seed_extractor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(!isliving(user) || user.combat_mode)
return ..()
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index d0cb9870059..be3b686f5b8 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -475,7 +475,7 @@
/obj/item/seeds/proc/on_chem_reaction(datum/reagents/reagents)
return
-/obj/item/seeds/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/item/seeds/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(IS_WRITING_UTENSIL(O))
var/choice = tgui_input_list(usr, "What would you like to change?", "Seed Alteration", list("Plant Name", "Seed Description", "Product Description"))
if(isnull(choice))
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index afae744e94d..2fe51b434e0 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -118,7 +118,7 @@
. = ..()
AddElement(/datum/element/spooky, too_spooky = !single_use, single_use = single_use)
-/obj/item/instrument/trumpet/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/instrument/trumpet/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
playsound(src, 'sound/runtime/instruments/trombone/En4.mid', 1000, 1, -1)
return ..()
@@ -146,7 +146,7 @@
. = ..()
AddElement(/datum/element/spooky, too_spooky = !single_use, single_use = single_use)
-/obj/item/instrument/saxophone/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/instrument/saxophone/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
playsound(src, 'sound/runtime/instruments/trombone/En4.mid', 1000, 1, -1)
return ..()
@@ -177,7 +177,7 @@
/obj/item/instrument/trombone/spectral/one_doot
single_use = TRUE
-/obj/item/instrument/trombone/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/instrument/trombone/spectral/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
playsound(src, 'sound/runtime/instruments/trombone/Cn4.mid', 1000, 1, -1)
return ..()
diff --git a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
index c3e497bffa5..8cb499e886a 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain_nullrod.dm
@@ -77,7 +77,7 @@ means that you'll be forced to move carefully while it's on. Fits in pockets, an
user.visible_message(span_suicide("[user] is killing [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to get closer to god!"))
return (BRUTELOSS|FIRELOSS)
-/obj/item/nullrod/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/nullrod/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
if(!user.mind?.holy_role)
return ..()
if(!IS_CULTIST(target_mob) || istype(target_mob, /mob/living/carbon/human/cult_ghost))
@@ -193,11 +193,9 @@ means that you'll be forced to move carefully while it's on. Fits in pockets, an
force = 15
menu_description = "An odd sharp blade which provides a low chance of blocking incoming melee attacks and deals a random amount of damage, which can range from almost nothing to very high. Can be worn on the back."
-/obj/item/nullrod/claymore/multiverse/melee_attack_chain(mob/user, atom/target, list/modifiers)
- var/force_mod = rand(-14, 15)
- force += force_mod
- . = ..()
- force -= force_mod
+/obj/item/nullrod/claymore/multiverse/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
+ SET_ATTACK_FORCE(attack_modifiers, rand(max(force - 15, 1), force + 15))
+ return ..()
/obj/item/nullrod/claymore/saber
name = "light energy sword"
@@ -820,36 +818,20 @@ means that you'll be forced to move carefully while it's on. Fits in pockets, an
alt_simple = string_list(alt_simple)
AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple)
-/obj/item/nullrod/nullblade/melee_attack_chain(mob/user, atom/target, list/modifiers)
- //Track our actual force separately
- var/old_force = force
- force = 0
- //Potential dice roll for our baseline force
- force += roll("1d6")
-
- //Now we can check for our user's potential 'strength' value. As a baseline, we'll use a default value of 4 for the sake of nonhuman users.
+/obj/item/nullrod/nullblade/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
+ //Check for our user's potential 'strength' value. As a baseline, we'll use a default value of 4 for the sake of nonhuman users.
var/strength_value = 4
-
- //We can use our human wielder's arm strength to determine their 'strength'. We add unarmed lower and upper, then divide by four.
- //This isn't how strength works in dnd but who fucking cares.
+ // We can use our human wielder's arm strength to determine their 'strength'. We add unarmed lower and upper, then divide by four.
+ // This isn't how strength works in dnd but who fucking cares.
if(ishuman(user))
var/mob/living/carbon/human/human_user = user
var/obj/item/bodypart/wielding_bodypart = human_user.get_active_hand()
strength_value = round((wielding_bodypart.unarmed_damage_low + wielding_bodypart.unarmed_damage_high) * 0.25, 1)
+ // Our force becomes 1d6 + strength + some modifier (based on force - base force) to account for whetstones and other things.
+ SET_ATTACK_FORCE(attack_modifiers, roll("1d6") + strength_value + (force - initial(force)))
+ return ..()
- force += strength_value
-
- //If our old_force is higher than our initial force, add the difference to this calculation.
- //We do this because our force could have been changed by things like whetstones and RPG stats.
- force += old_force - initial(force)
-
- //Record change to our force in case something modifies it down the chain
- var/force_diff = force - old_force
- . = ..()
- //Reapply our old force.
- force -= force_diff
-
-/obj/item/nullrod/nullblade/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/nullrod/nullblade/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(!isliving(target))
return
diff --git a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
index 10abdef72a1..cc36ec3c312 100644
--- a/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
+++ b/code/modules/jobs/job_types/chaplain/chaplain_vorpal_scythe.dm
@@ -89,7 +89,7 @@ If the scythe isn't empowered when you sheath it, you take a heap of damage and
)
AddElement(/datum/element/bane, mob_biotypes = MOB_PLANT, damage_multiplier = 0.5, requires_combat_mode = FALSE) //less good at killing revenants, much better at killing plants
-/obj/item/vorpalscythe/attack(mob/living/target, mob/living/user, list/modifiers)
+/obj/item/vorpalscythe/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(ismonkey(target) && !target.mind) //Don't empower from hitting monkeys. Hit a corgi or something, I don't know.
return ..()
diff --git a/code/modules/library/book.dm b/code/modules/library/book.dm
index fa73afd2eb3..8fc5139ce5d 100644
--- a/code/modules/library/book.dm
+++ b/code/modules/library/book.dm
@@ -98,7 +98,7 @@
user.visible_message(span_notice("[user] opens a book titled \"[book_data.title]\" and begins reading intently."))
display_content(user)
-/obj/item/book/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/item/book/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(IS_WRITING_UTENSIL(attacking_item))
if(!user.can_perform_action(src) || !user.can_write(attacking_item))
return
diff --git a/code/modules/library/bookcase.dm b/code/modules/library/bookcase.dm
index 0297a929311..3fa3efb70fe 100644
--- a/code/modules/library/bookcase.dm
+++ b/code/modules/library/bookcase.dm
@@ -118,7 +118,7 @@
I.forceMove(Tsec)
update_appearance()
-/obj/structure/bookcase/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/bookcase/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(state == BOOKCASE_UNANCHORED)
if(attacking_item.tool_behaviour == TOOL_WRENCH)
if(attacking_item.use_tool(src, user, 20, volume=50))
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 37ccc48e589..edf77d4873e 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -545,7 +545,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0)
set_screen_state(MIN_LIBRARY)
return TRUE
-/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/computer/libraryconsole/bookmanagement/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(weapon, /obj/item/barcodescanner))
return ..()
var/obj/item/barcodescanner/scanner = weapon
@@ -711,7 +711,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0)
cache = null
return ..()
-/obj/machinery/libraryscanner/attackby(obj/hitby, mob/user, list/modifiers)
+/obj/machinery/libraryscanner/attackby(obj/hitby, mob/user, list/modifiers, list/attack_modifiers)
if(istype(hitby, /obj/item/book))
user.transferItemToLoc(hitby, src)
if(held_book)
@@ -792,7 +792,7 @@ GLOBAL_VAR_INIT(library_table_modified, 0)
if(default_deconstruction_crowbar(tool))
return ITEM_INTERACT_SUCCESS
-/obj/machinery/bookbinder/attackby(obj/hitby, mob/user, list/modifiers)
+/obj/machinery/bookbinder/attackby(obj/hitby, mob/user, list/modifiers, list/attack_modifiers)
if(istype(hitby, /obj/item/paper))
prebind_book(user, hitby)
return TRUE
diff --git a/code/modules/library/skill_learning/skill_station.dm b/code/modules/library/skill_learning/skill_station.dm
index f6e3a7674c1..db21181e9b9 100644
--- a/code/modules/library/skill_learning/skill_station.dm
+++ b/code/modules/library/skill_learning/skill_station.dm
@@ -83,7 +83,7 @@
else
toggle_open()
-/obj/machinery/skill_station/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/machinery/skill_station/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(I,/obj/item/skillchip))
if(inserted_skillchip)
to_chat(user,span_notice("There's already a skillchip inside."))
diff --git a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm
index be0fbd85f67..18db493cf84 100644
--- a/code/modules/mapfluff/ruins/lavaland_ruin_code.dm
+++ b/code/modules/mapfluff/ruins/lavaland_ruin_code.dm
@@ -40,7 +40,7 @@
/// Type of shell to create
var/shell_type = /obj/effect/mob_spawn/ghost_role/human/golem
-/obj/item/golem_shell/attackby(obj/item/potential_food, mob/user, list/modifiers)
+/obj/item/golem_shell/attackby(obj/item/potential_food, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!isstack(potential_food))
balloon_alert(user, "not a mineral!")
diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
index cf3b4908b1e..89058e33f5a 100644
--- a/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
+++ b/code/modules/mapfluff/ruins/lavalandruin_code/elephantgraveyard.dm
@@ -105,7 +105,7 @@
reagents.expose(user, TOUCH, 20) //Covers target in 20u of oil.
to_chat(user, span_notice("You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water."))
-/obj/structure/sink/oil_well/attackby(obj/item/O, mob/living/user, list/modifiers)
+/obj/structure/sink/oil_well/attackby(obj/item/O, mob/living/user, list/modifiers, list/attack_modifiers)
flick("puddle-oil-splash",src)
if(O.tool_behaviour == TOOL_SHOVEL) //attempt to deconstruct the puddle with a shovel
to_chat(user, "You fill in the oil well with soil.")
diff --git a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm
index fec863153d4..3ff54df736c 100644
--- a/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm
+++ b/code/modules/mapfluff/ruins/lavalandruin_code/syndicate_base.dm
@@ -49,7 +49,7 @@
warning_channel = "Syndicate"
include_in_cims = FALSE
-/obj/machinery/power/supermatter_crystal/shard/syndicate/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/machinery/power/supermatter_crystal/shard/syndicate/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/scalpel/supermatter)) //You can already yoink the docs as a free objective win, another would be just gross
to_chat(user, span_danger("This shard's already in Syndicate custody, taking it again could cause more harm than good."))
return
diff --git a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm
index 9b2d6769a2d..72c4fe3ce4a 100644
--- a/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/mapfluff/ruins/objects_and_mobs/sin_ruins.dm
@@ -37,7 +37,7 @@
custom_materials = list(/datum/material/bone=SMALL_MATERIAL_AMOUNT)
hitsound = 'sound/items/weapons/bladeslice.ogg'
-/obj/item/knife/envy/afterattack(atom/target, mob/living/carbon/human/user, list/modifiers)
+/obj/item/knife/envy/afterattack(atom/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
if(!istype(user) || !ishuman(target))
return
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/garbagetruck.dm b/code/modules/mapfluff/ruins/spaceruin_code/garbagetruck.dm
index a269c07ec10..bfc71e6be1e 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/garbagetruck.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/garbagetruck.dm
@@ -18,7 +18,7 @@
. = ..()
icon_state = "[base_icon_state][used ? "-used" : ""]"
-/obj/item/eyesnatcher/attack(mob/living/carbon/human/target, mob/living/user, list/modifiers)
+/obj/item/eyesnatcher/attack(mob/living/carbon/human/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(used || !istype(target) || !target.Adjacent(user)) //Works only once, no TK use
return ..()
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
index f46b2f78583..c87d5c20dd0 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/meateor.dm
@@ -99,7 +99,7 @@
. = ..()
stored_organ = pick_weight(allowed_organs)
-/obj/structure/meateor_fluff/flesh_pod/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/meateor_fluff/flesh_pod/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if (attacking_item.get_sharpness() & SHARP_EDGED)
cut_open(user)
return
diff --git a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm
index d4186d5b28f..1c2173949a7 100644
--- a/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm
+++ b/code/modules/mapfluff/ruins/spaceruin_code/oldstation/oldstation_rnd.dm
@@ -23,7 +23,7 @@
. += span_notice("Insert [EXAMINE_HINT("Research Notes")] to generate points.")
-/obj/machinery/rnd/server/oldstation/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/rnd/server/oldstation/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/research_notes) && stored_research)
var/obj/item/research_notes/research_notes = attacking_item
stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = research_notes.value))
diff --git a/code/modules/meteors/meteor_types.dm b/code/modules/meteors/meteor_types.dm
index bd61fd49b88..751da2a08dc 100644
--- a/code/modules/meteors/meteor_types.dm
+++ b/code/modules/meteors/meteor_types.dm
@@ -118,7 +118,7 @@
check_examine_award(user)
-/obj/effect/meteor/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/effect/meteor/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_MINING)
make_debris()
qdel(src)
diff --git a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm
index 35cfeabe602..4e67861a7ed 100644
--- a/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher/kinetic_crusher.dm
@@ -100,7 +100,7 @@
for(var/obj/item/crusher_trophy/crusher_trophy as anything in trophies)
. += span_notice("It has \a [crusher_trophy] attached, which causes [crusher_trophy.effect_desc()].")
-/obj/item/kinetic_crusher/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/kinetic_crusher/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/crusher_trophy))
var/obj/item/crusher_trophy/crusher_trophy = attacking_item
crusher_trophy.add_to(src, user)
@@ -158,7 +158,7 @@
return FALSE
return TRUE
-/obj/item/kinetic_crusher/pre_attack(atom/A, mob/living/user, list/modifiers)
+/obj/item/kinetic_crusher/pre_attack(atom/A, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return TRUE
@@ -171,7 +171,7 @@
target.apply_status_effect(/datum/status_effect/crusher_damage)
return ..()
-/obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, list/modifiers)
+/obj/item/kinetic_crusher/afterattack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!isliving(target))
return
// Melee effect
diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm
index fc27d151524..b52c2dc21d3 100644
--- a/code/modules/mining/equipment/marker_beacons.dm
+++ b/code/modules/mining/equipment/marker_beacons.dm
@@ -134,7 +134,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list(
/obj/structure/marker_beacon/attack_tk(mob/user)
return
-/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/marker_beacon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/stack/marker_beacon))
var/obj/item/stack/marker_beacon/M = I
to_chat(user, span_notice("You start picking [src] up..."))
diff --git a/code/modules/mining/equipment/resonator.dm b/code/modules/mining/equipment/resonator.dm
index 1918fe5b95a..8c5ffb873a7 100644
--- a/code/modules/mining/equipment/resonator.dm
+++ b/code/modules/mining/equipment/resonator.dm
@@ -43,7 +43,7 @@
new /obj/effect/temp_visual/resonance(target_turf, user, src, mode, adding_failure)
user.changeNext_move(CLICK_CD_MELEE)
-/obj/item/resonator/pre_attack(atom/target, mob/user, list/modifiers)
+/obj/item/resonator/pre_attack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(check_allowed_items(target, not_inside = TRUE))
create_resonance(target, user)
return ..()
diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm
index fc1c6aeed3e..2478b84b7f7 100644
--- a/code/modules/mining/laborcamp/laborstacker.dm
+++ b/code/modules/mining/laborcamp/laborstacker.dm
@@ -213,7 +213,7 @@
return
user.examinate(src)
-/obj/machinery/mineral/labor_points_checker/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/mineral/labor_points_checker/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(weapon, /obj/item/card/id/advanced/prisoner))
return ..()
var/obj/item/card/id/advanced/prisoner/prisoner_id = weapon
diff --git a/code/modules/mining/lavaland/mining_loot/cursed_katana.dm b/code/modules/mining/lavaland/mining_loot/cursed_katana.dm
index 3606d6d92af..3fc020fd93a 100644
--- a/code/modules/mining/lavaland/mining_loot/cursed_katana.dm
+++ b/code/modules/mining/lavaland/mining_loot/cursed_katana.dm
@@ -99,7 +99,7 @@
if(isturf(loc))
qdel(src)
-/obj/item/cursed_katana/attack(mob/living/target, mob/user, list/modifiers)
+/obj/item/cursed_katana/attack(mob/living/target, mob/user, list/modifiers, list/attack_modifiers)
if(target.stat < DEAD && target != user)
drew_blood = TRUE
if(ismining(target))
diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm b/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm
index 99aaa2530f0..7791cdce339 100644
--- a/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm
+++ b/code/modules/mining/lavaland/mining_loot/megafauna/blood_drunk.dm
@@ -63,23 +63,17 @@
if(!HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE))
user.changeNext_move(CLICK_CD_MELEE * 0.5) //when closed, it attacks very rapidly
-/obj/item/melee/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user)
+/obj/item/melee/cleaving_saw/attack(mob/living/target, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
var/is_open = HAS_TRAIT(src, TRAIT_TRANSFORM_ACTIVE)
if(!is_open || swiping || !target.density || get_turf(target) == get_turf(user))
- if(!is_open)
- faction_bonus_force = 0
- var/is_nemesis_faction = FALSE
for(var/found_faction in target.faction)
- if(found_faction in nemesis_factions)
- is_nemesis_faction = TRUE
- force += faction_bonus_force
- nemesis_effects(user, target)
- break
+ if(!(found_faction in nemesis_factions))
+ continue
+ if(is_open)
+ MODIFY_ATTACK_FORCE(attack_modifiers, faction_bonus_force)
+ nemesis_effects(user, target)
+ break
. = ..()
- if(is_nemesis_faction)
- force -= faction_bonus_force
- if(!is_open)
- faction_bonus_force = initial(faction_bonus_force)
return
var/turf/user_turf = get_turf(user)
diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/bubblegum.dm b/code/modules/mining/lavaland/mining_loot/megafauna/bubblegum.dm
index 72b24d386db..df85934493d 100644
--- a/code/modules/mining/lavaland/mining_loot/megafauna/bubblegum.dm
+++ b/code/modules/mining/lavaland/mining_loot/megafauna/bubblegum.dm
@@ -174,7 +174,7 @@
. = ..()
. += soul.ckey ? span_nicegreen("There is a soul inhabiting it.") : span_danger("It's dormant.")
-/obj/item/soulscythe/attack(mob/living/attacked, mob/living/user, list/modifiers)
+/obj/item/soulscythe/attack(mob/living/attacked, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(attacked.stat != DEAD)
give_blood(10)
diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm
index f5371e4bab3..d21322424cf 100644
--- a/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm
+++ b/code/modules/mining/lavaland/mining_loot/megafauna/colossus.dm
@@ -123,7 +123,7 @@
return
ActivationReaction(user, ACTIVATE_TOUCH)
-/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/anomalous_crystal/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.get_temperature())
ActivationReaction(user, ACTIVATE_HEAT)
else
diff --git a/code/modules/mining/lavaland/mining_loot/megafauna/legion.dm b/code/modules/mining/lavaland/mining_loot/megafauna/legion.dm
index 9b83d73fc1d..5154488df72 100644
--- a/code/modules/mining/lavaland/mining_loot/megafauna/legion.dm
+++ b/code/modules/mining/lavaland/mining_loot/megafauna/legion.dm
@@ -67,7 +67,7 @@
/obj/item/storm_staff/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
return thunder_blast(interacting_with, user) ? ITEM_INTERACT_SUCCESS : ITEM_INTERACT_BLOCKING
-/obj/item/storm_staff/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/storm_staff/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
thunder_blast(target, user)
/obj/item/storm_staff/proc/thunder_blast(atom/target, mob/user)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 5fa47d5d913..8b70c283710 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -16,7 +16,7 @@
/// var to check if it got opened by a key
var/spawned_loot = FALSE
-/obj/structure/closet/crate/necropolis/tendril/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/closet/crate/necropolis/tendril/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(item, /obj/item/skeleton_key) || spawned_loot)
return ..()
var/loot = rand(1,21)
diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm
index 688676cbdb8..bc8ef95ef2f 100644
--- a/code/modules/mining/ores_coins.dm
+++ b/code/modules/mining/ores_coins.dm
@@ -280,7 +280,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
/obj/item/gibtonite/IsSpecialAssembly()
return TRUE
-/obj/item/gibtonite/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/gibtonite/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/assembly_holder) && !rig)
var/obj/item/assembly_holder/holder = I
if(!(locate(/obj/item/assembly/igniter) in holder.assemblies))
@@ -472,7 +472,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
. = ..()
. += span_info("It's worth [value] credit\s.")
-/obj/item/coin/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/coin/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/CC = W
if(string_attached)
diff --git a/code/modules/mining/satchel_ore_box.dm b/code/modules/mining/satchel_ore_box.dm
index 19da292ffb9..79bc8618a04 100644
--- a/code/modules/mining/satchel_ore_box.dm
+++ b/code/modules/mining/satchel_ore_box.dm
@@ -55,7 +55,7 @@
deconstruct(TRUE)
return ITEM_INTERACT_SUCCESS
-/obj/structure/ore_box/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/structure/ore_box/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/stack/ore) || istype(weapon, /obj/item/boulder))
user.transferItemToLoc(weapon, src)
return TRUE
diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm
index 6284fb0ed4f..954f830bfb0 100644
--- a/code/modules/mob/living/basic/bots/_bots.dm
+++ b/code/modules/mob/living/basic/bots/_bots.dm
@@ -422,7 +422,7 @@ GLOBAL_LIST_INIT(command_strings, list(
heal_overall_damage(10)
user.visible_message(span_notice("[user] repairs [src]!"),span_notice("You repair [src]."))
-/mob/living/basic/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/mob/living/basic/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(attacking_item.GetID())
unlock_with_id(user)
return
diff --git a/code/modules/mob/living/basic/bots/repairbot/repairbot.dm b/code/modules/mob/living/basic/bots/repairbot/repairbot.dm
index 09739aeebcf..932f6df6be1 100644
--- a/code/modules/mob/living/basic/bots/repairbot/repairbot.dm
+++ b/code/modules/mob/living/basic/bots/repairbot/repairbot.dm
@@ -98,7 +98,7 @@
toolbox_color = new_color
update_appearance()
-/mob/living/basic/bot/repairbot/attackby(obj/item/potential_stack, mob/living/carbon/human/user, list/modifiers)
+/mob/living/basic/bot/repairbot/attackby(obj/item/potential_stack, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
if(!istype(potential_stack, /obj/item/stack))
return ..()
attempt_merge(potential_stack, user)
diff --git a/code/modules/mob/living/basic/clown/clown.dm b/code/modules/mob/living/basic/clown/clown.dm
index 98ebc8f8df7..169e8573005 100644
--- a/code/modules/mob/living/basic/clown/clown.dm
+++ b/code/modules/mob/living/basic/clown/clown.dm
@@ -414,20 +414,16 @@
AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 30, bonus_tame_chance = 0)
AddElement(/datum/element/damage_threshold, 10) //lots of fat to cushion blows.
-/mob/living/basic/clown/mutant/glutton/attacked_by(obj/item/item, mob/living/user)
- if(!check_edible(item))
- return ..()
- eat_atom(item)
+/mob/living/basic/clown/mutant/glutton/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!check_edible(tool))
+ return NONE
+ eat_atom(tool)
+ return ITEM_INTERACT_SUCCESS
-/mob/living/basic/clown/mutant/glutton/melee_attack(atom/target, list/modifiers, ignore_cooldown = FALSE)
- if(!check_edible(target))
+/mob/living/basic/clown/mutant/glutton/resolve_unarmed_attack(atom/attack_target, list/modifiers)
+ if(!check_edible(attack_target))
return ..()
- eat_atom(target)
-
-/mob/living/basic/clown/mutant/glutton/UnarmedAttack(atom/victim, proximity_flag, list/modifiers)
- if(!check_edible(victim))
- return ..()
- eat_atom(victim)
+ eat_atom(attack_target)
///Returns whether or not the supplied movable atom is edible.
/mob/living/basic/clown/mutant/glutton/proc/check_edible(atom/movable/potential_food)
diff --git a/code/modules/mob/living/basic/cult/shade.dm b/code/modules/mob/living/basic/cult/shade.dm
index 7c5520c71fe..bb56ef2db03 100644
--- a/code/modules/mob/living/basic/cult/shade.dm
+++ b/code/modules/mob/living/basic/cult/shade.dm
@@ -72,7 +72,7 @@
SSblackbox.record_feedback("tally", "cult_shade_suicided", 1)
..()
-/mob/living/basic/shade/attackby(obj/item/item, mob/user, list/modifiers)
+/mob/living/basic/shade/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/soulstone))
var/obj/item/soulstone/stone = item
stone.capture_shade(src, user)
diff --git a/code/modules/mob/living/basic/jungle/seedling/seedling.dm b/code/modules/mob/living/basic/jungle/seedling/seedling.dm
index d6d189d2ebc..0d74cf6b171 100644
--- a/code/modules/mob/living/basic/jungle/seedling/seedling.dm
+++ b/code/modules/mob/living/basic/jungle/seedling/seedling.dm
@@ -138,7 +138,7 @@
combatant_state = state
update_appearance()
-/mob/living/basic/seedling/attackby(obj/item/can, mob/living/carbon/human/user, list/modifiers)
+/mob/living/basic/seedling/attackby(obj/item/can, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
if(istype(can, /obj/item/reagent_containers/cup/watering_can) && isnull(held_can))
can.forceMove(src)
return
diff --git a/code/modules/mob/living/basic/jungle/venus_human_trap.dm b/code/modules/mob/living/basic/jungle/venus_human_trap.dm
index 0a4a557eef1..7f37bb55336 100644
--- a/code/modules/mob/living/basic/jungle/venus_human_trap.dm
+++ b/code/modules/mob/living/basic/jungle/venus_human_trap.dm
@@ -59,14 +59,14 @@
damage_amount = 0
. = ..()
-/obj/structure/alien/resin/flower_bud/attacked_by(obj/item/item, mob/living/user)
- var/damage_dealt = item.force
+/obj/structure/alien/resin/flower_bud/attacked_by(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
+ LAZYSET(attack_modifiers, SILENCE_DEFAULT_MESSAGES, TRUE)
+ LAZYSET(attack_modifiers, FORCE_MULTIPLIER, 1)
if(item.damtype == BURN)
- damage_dealt *= 4
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 4)
if(item.get_sharpness())
- damage_dealt *= 16 // alien resin applies 75% reduction to brute damage so this actually x4 damage
-
- take_damage(damage_dealt, item.damtype, MELEE, 1)
+ MODIFY_ATTACK_FORCE_MULTIPLIER(attack_modifiers, 16) // alien resin applies 75% reduction to brute damage so this actually x4 damage
+ return ..()
/obj/structure/alien/resin/flower_bud/Destroy()
QDEL_LIST(vines)
diff --git a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
index b3a68f1bb54..9e3f271c528 100644
--- a/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
+++ b/code/modules/mob/living/basic/lavaland/goliath/goliath.dm
@@ -102,7 +102,7 @@
if (tentacles.cooldown_time > 1 SECONDS)
tentacles.cooldown_time -= 1 SECONDS
-/mob/living/basic/mining/goliath/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/mob/living/basic/mining/goliath/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if (!istype(attacking_item, /obj/item/goliath_saddle))
return ..()
if (!tameable)
diff --git a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm
index 0b25c5438ce..6be564ab4ab 100644
--- a/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm
+++ b/code/modules/mob/living/basic/lavaland/legion/legion_tumour.dm
@@ -60,7 +60,7 @@
. = ..()
owner.log_message("has received [src] which will eventually turn them into a Legion.", LOG_VICTIM)
-/obj/item/organ/legion_tumour/attack(mob/living/target, mob/living/user, list/modifiers)
+/obj/item/organ/legion_tumour/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
if (try_apply(target, user))
qdel(src)
return
diff --git a/code/modules/mob/living/basic/minebots/minebot.dm b/code/modules/mob/living/basic/minebots/minebot.dm
index 32316cafcfc..9223b7dfa58 100644
--- a/code/modules/mob/living/basic/minebots/minebot.dm
+++ b/code/modules/mob/living/basic/minebots/minebot.dm
@@ -126,7 +126,7 @@
user.balloon_alert(user, "successfully repaired!")
return TRUE
-/mob/living/basic/mining_drone/attackby(obj/item/item_used, mob/user, list/modifiers)
+/mob/living/basic/mining_drone/attackby(obj/item/item_used, mob/user, list/modifiers, list/attack_modifiers)
if(item_used.tool_behaviour == TOOL_CROWBAR || istype(item_used, /obj/item/borg/upgrade/modkit))
item_used.melee_attack_chain(user, stored_gun, modifiers)
return
diff --git a/code/modules/mob/living/basic/pets/dog/_dog.dm b/code/modules/mob/living/basic/pets/dog/_dog.dm
index 24ae2e24f04..f3a106eb15c 100644
--- a/code/modules/mob/living/basic/pets/dog/_dog.dm
+++ b/code/modules/mob/living/basic/pets/dog/_dog.dm
@@ -104,7 +104,7 @@
attack_verb_continuous = list("attacks", "bashes", "batters", "bludgeons", "whacks")
attack_verb_simple = list("attack", "bash", "batter", "bludgeon", "whack")
-/obj/item/dog_bone/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/dog_bone/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
if (!isdog(target) || user.combat_mode)
return ..()
var/mob/living/basic/pet/dog/dog_target = target
diff --git a/code/modules/mob/living/basic/pets/dog/corgi.dm b/code/modules/mob/living/basic/pets/dog/corgi.dm
index 2399c2c0800..b2bd8e47976 100644
--- a/code/modules/mob/living/basic/pets/dog/corgi.dm
+++ b/code/modules/mob/living/basic/pets/dog/corgi.dm
@@ -112,7 +112,7 @@
armorval += inventory_back.get_armor_rating(type)
return armorval * 0.5
-/mob/living/basic/pet/dog/corgi/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/mob/living/basic/pet/dog/corgi/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/razor))
if(shaved)
to_chat(user, span_warning("You can't shave this corgi, [p_they()] has already been shaved!"))
diff --git a/code/modules/mob/living/basic/ruin_defender/living_floor.dm b/code/modules/mob/living/basic/ruin_defender/living_floor.dm
index ac9627b8037..df248b7d24f 100644
--- a/code/modules/mob/living/basic/ruin_defender/living_floor.dm
+++ b/code/modules/mob/living/basic/ruin_defender/living_floor.dm
@@ -81,7 +81,7 @@
/mob/living/basic/living_floor/med_hud_set_status()
return
-/mob/living/basic/living_floor/attackby(obj/item/weapon, mob/user, list/modifiers)
+/mob/living/basic/living_floor/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(weapon.tool_behaviour != TOOL_CROWBAR)
return ..()
balloon_alert(user, "prying...")
diff --git a/code/modules/mob/living/basic/slime/defense.dm b/code/modules/mob/living/basic/slime/defense.dm
index 8f5b0e6d8e5..30e4cb41b4e 100644
--- a/code/modules/mob/living/basic/slime/defense.dm
+++ b/code/modules/mob/living/basic/slime/defense.dm
@@ -23,7 +23,7 @@
defender_slime.discipline_slime()
-/mob/living/basic/slime/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/mob/living/basic/slime/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
//Lets you feed slimes plasma. Checks before the passthrough force check
if(istype(attacking_item, /obj/item/stack/sheet/mineral/plasma) && stat == CONSCIOUS)
diff --git a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm
index 66e73b2bbfa..cc05cdbd6d4 100644
--- a/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm
+++ b/code/modules/mob/living/basic/space_fauna/eyeball/_eyeball.dm
@@ -77,7 +77,7 @@
qdel(attack_target)
return TRUE
-/mob/living/basic/eyeball/attackby(obj/item/weapon, mob/living/carbon/human/user, list/modifiers)
+/mob/living/basic/eyeball/attackby(obj/item/weapon, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!weapon.force && !user.combat_mode)
return
diff --git a/code/modules/mob/living/basic/space_fauna/mushroom.dm b/code/modules/mob/living/basic/space_fauna/mushroom.dm
index 28f8fa46013..16c46674e2f 100644
--- a/code/modules/mob/living/basic/space_fauna/mushroom.dm
+++ b/code/modules/mob/living/basic/space_fauna/mushroom.dm
@@ -160,7 +160,7 @@
melee_damage_upper += (level_gain * rand(1,5))
maxHealth += (level_gain * rand(1,5))
-/mob/living/basic/mushroom/attackby(obj/item/mush, mob/living/carbon/human/user, list/modifiers)
+/mob/living/basic/mushroom/attackby(obj/item/mush, mob/living/carbon/human/user, list/modifiers, list/attack_modifiers)
if(istype(mush, /obj/item/food/grown/mushroom))
recover(mush)
return
diff --git a/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm b/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm
index 7d3dd6906c2..75508c3e542 100644
--- a/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm
+++ b/code/modules/mob/living/basic/vermin/mothroach/mothroach.dm
@@ -79,7 +79,7 @@
else
playsound(loc, 'sound/mobs/humanoids/moth/scream_moth.ogg', 50, TRUE)
-/mob/living/basic/mothroach/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/mob/living/basic/mothroach/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(src.stat == DEAD)
return
diff --git a/code/modules/mob/living/basic/vermin/mouse.dm b/code/modules/mob/living/basic/vermin/mouse.dm
index b0cffa70f21..b027b13ba77 100644
--- a/code/modules/mob/living/basic/vermin/mouse.dm
+++ b/code/modules/mob/living/basic/vermin/mouse.dm
@@ -364,7 +364,7 @@
qdel(src)
return LAZARUS_INJECTOR_USED
-/obj/item/food/deadmouse/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/food/deadmouse/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
var/mob/living/living_user = user
if(istype(living_user) && attacking_item.get_sharpness() && living_user.combat_mode)
if(!isturf(loc))
diff --git a/code/modules/mob/living/brain/MMI.dm b/code/modules/mob/living/brain/MMI.dm
index fd3ec152304..00adadd33fd 100644
--- a/code/modules/mob/living/brain/MMI.dm
+++ b/code/modules/mob/living/brain/MMI.dm
@@ -49,7 +49,7 @@
if(brain)
. += "mmi_dead"
-/obj/item/mmi/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/item/mmi/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
user.changeNext_move(CLICK_CD_MELEE)
if(istype(O, /obj/item/organ/brain)) //Time to stick a brain in it --NEO
var/obj/item/organ/brain/newbrain = O
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index f431d908b7b..35084d1eb78 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -164,7 +164,7 @@
L.mind.transfer_to(brainmob)
to_chat(brainmob, span_notice("You feel slightly disoriented. That's normal when you're just a brain."))
-/obj/item/organ/brain/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/organ/brain/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
user.changeNext_move(CLICK_CD_MELEE)
if(istype(item, /obj/item/borg/apparatus/organ_storage))
diff --git a/code/modules/mob/living/brain/posibrain.dm b/code/modules/mob/living/brain/posibrain.dm
index 1c844e8e87b..56237da5a55 100644
--- a/code/modules/mob/living/brain/posibrain.dm
+++ b/code/modules/mob/living/brain/posibrain.dm
@@ -216,7 +216,7 @@ GLOBAL_VAR(posibrain_notify_cooldown)
icon_state = "[base_icon_state]"
return
-/obj/item/mmi/posibrain/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/item/mmi/posibrain/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
return
/obj/item/mmi/posibrain/add_mmi_overlay()
diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm
index c4d03c08f31..3e8d92d5a80 100644
--- a/code/modules/mob/living/carbon/alien/special/facehugger.dm
+++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm
@@ -54,7 +54,7 @@
if(atom_integrity < 90)
Die()
-/obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/item/clothing/mask/facehugger/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
return O.attack_atom(src, user, modifiers)
/obj/item/clothing/mask/facehugger/proc/react_to_mob(datum/source, mob/user)
diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm
index 47dec505e4f..ba7dd437a54 100644
--- a/code/modules/mob/living/silicon/ai/ai_defense.dm
+++ b/code/modules/mob/living/silicon/ai/ai_defense.dm
@@ -1,5 +1,5 @@
-/mob/living/silicon/ai/attackby(obj/item/W, mob/user, list/modifiers)
+/mob/living/silicon/ai/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/ai_module))
var/obj/item/ai_module/MOD = W
disconnect_shell()
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index e8dd00ad187..d310301b922 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -456,7 +456,7 @@
user.visible_message(span_notice("[user] repairs [src]!"),span_notice("You repair [src]."))
return ITEM_INTERACT_SUCCESS
-/mob/living/simple_animal/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/mob/living/simple_animal/bot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(attacking_item.GetID())
unlock_with_id(user)
return
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index ea63aa4e704..e8e2cb948ea 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -10,7 +10,7 @@
var/build_step = ASSEMBLY_FIRST_STEP
var/robot_arm = /obj/item/bodypart/arm/right/robot
-/obj/item/bot_assembly/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/bot_assembly/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
..()
if(IS_WRITING_UTENSIL(I))
rename_bot()
@@ -73,7 +73,7 @@
return ..()
-/obj/item/bot_assembly/cleanbot/attackby(obj/item/item_attached, mob/user, list/modifiers)
+/obj/item/bot_assembly/cleanbot/attackby(obj/item/item_attached, mob/user, list/modifiers, list/attack_modifiers)
..()
if(!istype(item_attached, /obj/item/bodypart/arm/left/robot) && !istype(item_attached, /obj/item/bodypart/arm/right/robot))
return
@@ -98,7 +98,7 @@
var/lasercolor = ""
var/vest_type = /obj/item/clothing/suit/armor/vest
-/obj/item/bot_assembly/ed209/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/bot_assembly/ed209/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
..()
switch(build_step)
if(ASSEMBLY_FIRST_STEP, ASSEMBLY_SECOND_STEP)
@@ -225,7 +225,7 @@
if(build_step >= ASSEMBLY_SECOND_STEP)
. += mutable_appearance(icon, "repairbot_base_arms", appearance_flags = RESET_COLOR|KEEP_APART)
-/obj/item/bot_assembly/repairbot/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/bot_assembly/repairbot/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
..()
switch(build_step)
if(ASSEMBLY_FIRST_STEP)
@@ -269,7 +269,7 @@
if(skin)
icon_state = "[base_icon_state]_[skin]"
-/obj/item/bot_assembly/medbot/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/bot_assembly/medbot/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
..()
switch(build_step)
if(ASSEMBLY_FIRST_STEP)
@@ -310,7 +310,7 @@
icon_state = "honkbot_arm"
created_name = "Honkbot"
-/obj/item/bot_assembly/honkbot/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/bot_assembly/honkbot/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
..()
switch(build_step)
if(ASSEMBLY_FIRST_STEP)
@@ -347,7 +347,7 @@
var/swordamt = 0 //If you're converting it into a grievousbot, how many swords have you attached
var/toyswordamt = 0 //honk
-/obj/item/bot_assembly/secbot/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/bot_assembly/secbot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
..()
var/atom/Tsec = drop_location()
switch(build_step)
@@ -481,7 +481,7 @@
icon_state = "firebot_arm"
created_name = "Firebot"
-/obj/item/bot_assembly/firebot/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/bot_assembly/firebot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
..()
switch(build_step)
if(ASSEMBLY_FIRST_STEP)
@@ -511,7 +511,7 @@
icon_state = "hygienebot"
created_name = "Hygienebot"
-/obj/item/bot_assembly/hygienebot/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/bot_assembly/hygienebot/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
var/atom/Tsec = drop_location()
switch(build_step)
@@ -566,7 +566,7 @@
icon_state = "vim_0"
created_name = "\improper Vim"
-/obj/item/bot_assembly/vim/attackby(obj/item/part, mob/user, list/modifiers)
+/obj/item/bot_assembly/vim/attackby(obj/item/part, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 83f39b05867..1bd4a0f51bd 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -178,7 +178,7 @@
diag_hud_set_mulebotcell()
return ITEM_INTERACT_SUCCESS
-/mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/living/user, list/modifiers)
+/mob/living/simple_animal/bot/mulebot/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/stock_parts/power_store/cell) && bot_cover_flags & BOT_COVER_MAINTS_OPEN)
if(cell)
to_chat(user, span_warning("[src] already has a power cell!"))
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index 1ad7640a6a8..b07bf8efe32 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -269,7 +269,7 @@
return ..()
-/mob/living/simple_animal/bot/secbot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/mob/living/simple_animal/bot/secbot/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
..()
if(!(bot_mode_flags & BOT_MODE_ON)) // Bots won't remember if you hit them while they're off.
return
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index 18483726202..f947909ae40 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -151,7 +151,7 @@ Difficulty: Hard
* * mob/user The user of the item
* * params, extra parameters
*/
-/mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, list/modifiers)
+/mob/living/simple_animal/hostile/megafauna/bubblegum/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(istype(W, /obj/item/organ/tongue))
user.client?.give_award(/datum/award/achievement/jobs/frenching, user)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 5f19be2e53f..b2e3628d315 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -768,7 +768,7 @@ Difficulty: Hard
layer = LOW_OBJ_LAYER
anchored = TRUE
-/obj/effect/hierophant/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/effect/hierophant/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/hierophant_club))
var/obj/item/hierophant_club/club = attacking_item
if(club.beacon == src)
diff --git a/code/modules/mob/living/simple_animal/hostile/ooze.dm b/code/modules/mob/living/simple_animal/hostile/ooze.dm
index 801c3cb2056..3bdefaa75b1 100644
--- a/code/modules/mob/living/simple_animal/hostile/ooze.dm
+++ b/code/modules/mob/living/simple_animal/hostile/ooze.dm
@@ -43,13 +43,15 @@
grant_actions_by_list(get_innate_actions())
-/mob/living/simple_animal/hostile/ooze/attacked_by(obj/item/I, mob/living/user)
- if(!eat_atom(I, TRUE))
- return ..()
+/mob/living/simple_animal/hostile/ooze/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(eat_atom(tool, TRUE))
+ return ITEM_INTERACT_SUCCESS
+ return ..()
-/mob/living/simple_animal/hostile/ooze/AttackingTarget(atom/attacked_target)
- if(!eat_atom(attacked_target))
- return ..()
+/mob/living/simple_animal/hostile/ooze/resolve_unarmed_attack(atom/attack_target, list/modifiers)
+ if(eat_atom(attack_target))
+ return ITEM_INTERACT_SUCCESS
+ return ..()
///Handles nutrition gain/loss of mob and also makes it take damage if it's too low on nutrition, only happens for sentient mobs.
/mob/living/simple_animal/hostile/ooze/Life(seconds_per_tick = SSMOBS_DT, times_fired)
@@ -88,12 +90,13 @@
///Tries to transfer the atoms reagents then delete it
/mob/living/simple_animal/hostile/ooze/proc/eat_atom(atom/eat_target, silent)
if(isnull(eat_target))
- return
+ return FALSE
if(SEND_SIGNAL(eat_target, COMSIG_OOZE_EAT_ATOM, src, edible_food_types) & COMPONENT_ATOM_EATEN)
- return
+ return TRUE
if(silent || !isitem(eat_target)) //Don't bother reporting it for everything
- return
+ return FALSE
to_chat(src, span_warning("[eat_target] cannot be eaten!"))
+ return FALSE
///Updates the display that shows the mobs nutrition
/mob/living/simple_animal/hostile/ooze/proc/updateNutritionDisplay()
diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm
index f152af190a9..fd41c1c7f30 100644
--- a/code/modules/mod/mod_construction.dm
+++ b/code/modules/mod/mod_construction.dm
@@ -67,7 +67,7 @@
. = ..()
. += span_notice("You could probably attach some wires to it...")
-/obj/item/mod/construction/lavalandcore/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/mod/construction/lavalandcore/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(weapon, /obj/item/stack/cable_coil))
return ..()
if(!weapon.tool_start_check(user, amount=2))
@@ -155,7 +155,7 @@
display_text = "All it's missing is external plating..."
. += span_notice(display_text)
-/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, list/modifiers)
+/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
switch(step)
if(START_STEP)
diff --git a/code/modules/mod/mod_link.dm b/code/modules/mod/mod_link.dm
index 5c13972a4ea..15c9a373f72 100644
--- a/code/modules/mod/mod_link.dm
+++ b/code/modules/mod/mod_link.dm
@@ -210,7 +210,7 @@
return
cell.use(0.02 * STANDARD_CELL_RATE * seconds_per_tick, force = TRUE)
-/obj/item/clothing/neck/link_scryer/attackby(obj/item/attacked_by, mob/user, list/modifiers)
+/obj/item/clothing/neck/link_scryer/attackby(obj/item/attacked_by, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(cell || !istype(attacked_by, /obj/item/stock_parts/power_store/cell))
return
diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm
index 121d698ca7d..fb9b7c9d155 100644
--- a/code/modules/mod/modules/_module.dm
+++ b/code/modules/mod/modules/_module.dm
@@ -521,7 +521,7 @@
return FALSE
return TRUE
-/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(item.type in accepted_anomalies)
if(core)
balloon_alert(user, "core already in!")
diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm
index 9e79c968e36..9f1cec7e9fa 100644
--- a/code/modules/mod/modules/module_pathfinder.dm
+++ b/code/modules/mod/modules/module_pathfinder.dm
@@ -43,7 +43,7 @@
else
. += span_warning("The implant is missing.")
-/obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, list/modifiers)
+/obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!ishuman(target) || !implant)
return
if(!do_after(user, 1.5 SECONDS, target = target))
diff --git a/code/modules/modular_computers/computers/item/disks/virus_disk.dm b/code/modules/modular_computers/computers/item/disks/virus_disk.dm
index 39536b0ed4d..585e7d31558 100644
--- a/code/modules/modular_computers/computers/item/disks/virus_disk.dm
+++ b/code/modules/modular_computers/computers/item/disks/virus_disk.dm
@@ -109,7 +109,7 @@
///How much progression should be shown in the uplink, set on purchase of the item.
var/current_progression = 0
-/obj/item/computer_disk/virus/frame/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/computer_disk/virus/frame/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!istype(attacking_item, /obj/item/stack/telecrystal))
return
diff --git a/code/modules/modular_computers/computers/item/pda.dm b/code/modules/modular_computers/computers/item/pda.dm
index ea5170fa548..ef3eeb9eaa5 100644
--- a/code/modules/modular_computers/computers/item/pda.dm
+++ b/code/modules/modular_computers/computers/item/pda.dm
@@ -102,7 +102,7 @@
return ..()
-/obj/item/modular_computer/pda/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/modular_computer/pda/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(!inserted_disk || !ismachinery(target))
return ..()
diff --git a/code/modules/modular_computers/computers/machinery/modular_computer.dm b/code/modules/modular_computers/computers/machinery/modular_computer.dm
index 763335d6728..b7a0ae0b9e7 100644
--- a/code/modules/modular_computers/computers/machinery/modular_computer.dm
+++ b/code/modules/modular_computers/computers/machinery/modular_computer.dm
@@ -157,8 +157,8 @@
/obj/machinery/modular_computer/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
return (CPU_INTERACTABLE(user) && !user.combat_mode) ? cpu.item_interaction(user, tool, modifiers) : ..()
-/obj/machinery/modular_computer/attacked_by(obj/item/attacking_item, mob/living/user)
- return CPU_INTERACTABLE(user) ? cpu.attacked_by(attacking_item, user) : ..()
+/obj/machinery/modular_computer/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
+ return CPU_INTERACTABLE(user) ? cpu.attacked_by(attacking_item, user, modifiers, attack_modifiers) : ..()
// Stronger explosions cause serious damage to internal components
// Minor explosions are mostly mitigitated by casing.
diff --git a/code/modules/pai/card.dm b/code/modules/pai/card.dm
index e8895bacf92..eba717bdb1d 100644
--- a/code/modules/pai/card.dm
+++ b/code/modules/pai/card.dm
@@ -28,7 +28,7 @@
SSpai.pai_card_list += src
ADD_TRAIT(src, TRAIT_CASTABLE_LOC, INNATE_TRAIT)
-/obj/item/pai_card/attackby(obj/item/used, mob/user, list/modifiers)
+/obj/item/pai_card/attackby(obj/item/used, mob/user, list/modifiers, list/attack_modifiers)
if(pai && istype(used, /obj/item/encryptionkey))
if(!pai.encrypt_mod)
to_chat(user, span_alert("Encryption Key ports not configured."))
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index 27dc999d6dd..f17f3244c0a 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -113,7 +113,7 @@
return TRUE
. = ..()
-/obj/item/clipboard/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/clipboard/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/paper))
//Add paper into the clipboard
if(!user.transferItemToLoc(weapon, src))
diff --git a/code/modules/paperwork/desk_bell.dm b/code/modules/paperwork/desk_bell.dm
index 96e256d9557..0f37a458729 100644
--- a/code/modules/paperwork/desk_bell.dm
+++ b/code/modules/paperwork/desk_bell.dm
@@ -57,7 +57,7 @@
/obj/structure/desk_bell/attack_paw(mob/user, list/modifiers)
return attack_hand(user, modifiers)
-/obj/structure/desk_bell/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/structure/desk_bell/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
times_rang += weapon.force
ring_bell(user)
diff --git a/code/modules/paperwork/fax.dm b/code/modules/paperwork/fax.dm
index f81c60c4b77..2064f3bcd99 100644
--- a/code/modules/paperwork/fax.dm
+++ b/code/modules/paperwork/fax.dm
@@ -184,7 +184,7 @@ GLOBAL_VAR_INIT(fax_autoprinting, FALSE)
fax_name = new_fax_name
return ITEM_INTERACT_SUCCESS
-/obj/machinery/fax/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/fax/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if (jammed && clear_jam(item, user))
return
if (panel_open)
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index 10013b4699c..467fa9f8663 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -42,7 +42,7 @@
for(var/obj/item/obj in src)
obj.forceMove(loc)
-/obj/structure/filingcabinet/attackby(obj/item/P, mob/living/user, list/modifiers)
+/obj/structure/filingcabinet/attackby(obj/item/P, mob/living/user, list/modifiers, list/attack_modifiers)
if(P.tool_behaviour == TOOL_WRENCH && LAZYACCESS(modifiers, RIGHT_CLICK))
to_chat(user, span_notice("You begin to [anchored ? "unwrench" : "wrench"] [src]."))
if(P.use_tool(src, user, 20, volume=50))
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index 18089ba1155..53db65673de 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -79,7 +79,7 @@
paper_overlay = contents[1].color_atom_overlay(paper_overlay)
return paper_overlay
-/obj/item/folder/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/folder/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(is_type_in_typecache(weapon, folder_insertables))
//Add paper, photo or documents into the folder
if(!user.transferItemToLoc(weapon, src))
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index ee78506302e..39a4f105b18 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -414,7 +414,7 @@
user.put_in_hands(new_plane)
return new_plane
-/obj/item/paper/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/item/paper/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
// Enable picking paper up by clicking on it with the clipboard or folder
if(istype(attacking_item, /obj/item/clipboard) || istype(attacking_item, /obj/item/folder) || istype(attacking_item, /obj/item/paper_bin))
attacking_item.attackby(src, user)
diff --git a/code/modules/paperwork/paper_biscuit.dm b/code/modules/paperwork/paper_biscuit.dm
index 2bd6e9f053c..020ab8fda15 100644
--- a/code/modules/paperwork/paper_biscuit.dm
+++ b/code/modules/paperwork/paper_biscuit.dm
@@ -73,7 +73,7 @@
return ..()
-/obj/item/folder/biscuit/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/folder/biscuit/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if (is_type_in_typecache(weapon, folder_insertables) && !crack_check(user))
return
diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm
index bba25ae4e5f..71471f4bf1f 100644
--- a/code/modules/paperwork/paper_cutter.dm
+++ b/code/modules/paperwork/paper_cutter.dm
@@ -110,7 +110,7 @@
blade_secured = !blade_secured
return ITEM_INTERACT_SUCCESS
-/obj/item/papercutter/attackby(obj/item/inserted_item, mob/user, list/modifiers)
+/obj/item/papercutter/attackby(obj/item/inserted_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(inserted_item, /obj/item/paper))
if(is_type_in_list(inserted_item, list(
/obj/item/paper/fake_report,
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index 57923741cf0..f301ba3a29c 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -118,7 +118,7 @@
add_fingerprint(user)
return ..()
-/obj/item/paper_bin/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/paper_bin/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(at_overlay_limit())
dump_contents(drop_location(), TRUE)
return
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index a98af743b73..6b0f5a3c658 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -91,7 +91,7 @@
user.put_in_hands(released_paper)
-/obj/item/paperplane/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/paperplane/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(IS_WRITING_UTENSIL(attacking_item))
to_chat(user, span_warning("You should unfold [src] before changing it!"))
return
diff --git a/code/modules/paperwork/paperwork.dm b/code/modules/paperwork/paperwork.dm
index 5b3cebc645b..552c392ff5a 100644
--- a/code/modules/paperwork/paperwork.dm
+++ b/code/modules/paperwork/paperwork.dm
@@ -39,7 +39,7 @@
detailed_desc = span_notice("As you sift through the papers, you slowly start to piece together what you're reading.")
-/obj/item/paperwork/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/paperwork/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
@@ -234,7 +234,7 @@
else
. += span_notice("These appear to just be a photocopy of the original documents.")
-/obj/item/paperwork/photocopy/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/paperwork/photocopy/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/stamp/void) && !stamped && !voided)
to_chat(user, span_notice("You plant the [attacking_item] firmly onto the front of the documents."))
stamp_overlay = mutable_appearance('icons/obj/service/bureaucracy.dmi', "paper_stamp-void")
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 4c1e4469bee..63fc7a1cf16 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -242,7 +242,7 @@
SEND_SIGNAL(src, COMSIG_PEN_ROTATED, deg, user)
return CLICK_ACTION_SUCCESS
-/obj/item/pen/attack(mob/living/M, mob/user, list/modifiers)
+/obj/item/pen/attack(mob/living/M, mob/user, list/modifiers, list/attack_modifiers)
if(force) // If the pen has a force value, call the normal attack procs. Used for e-daggers and captain's pen mostly.
return ..()
if(!M.try_inject(user, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))
@@ -266,7 +266,7 @@
* Sleepypens
*/
-/obj/item/pen/sleepy/attack(mob/living/M, mob/user, list/modifiers)
+/obj/item/pen/sleepy/attack(mob/living/M, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!.)
return
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 65b34ddb67d..2957d9a969c 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -546,7 +546,7 @@ GLOBAL_LIST_INIT(paper_blanks, init_paper_blanks())
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/photocopier/attackby(obj/item/object, mob/user, list/modifiers)
+/obj/machinery/photocopier/attackby(obj/item/object, mob/user, list/modifiers, list/attack_modifiers)
if(istype(object, /obj/item/paper) || istype(object, /obj/item/photo) || istype(object, /obj/item/documents))
if(istype(object, /obj/item/paper))
var/obj/item/paper/paper = object
diff --git a/code/modules/paperwork/ticketmachine.dm b/code/modules/paperwork/ticketmachine.dm
index 1a20ed0f8e2..bf4e88fa17b 100644
--- a/code/modules/paperwork/ticketmachine.dm
+++ b/code/modules/paperwork/ticketmachine.dm
@@ -177,7 +177,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/ticket_machine, 32)
maptext_x = 4
maptext = MAPTEXT(current_number) //Finally, apply the maptext
-/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/ticket_machine/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
..()
if(istype(I, /obj/item/hand_labeler_refill))
if(!(ticket_number >= max_number))
diff --git a/code/modules/photography/photos/frame.dm b/code/modules/photography/photos/frame.dm
index 1a6ea18aafe..66db83342e5 100644
--- a/code/modules/photography/photos/frame.dm
+++ b/code/modules/photography/photos/frame.dm
@@ -147,7 +147,7 @@
return ITEM_INTERACT_SUCCESS
-/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/photo))
if(framed)
diff --git a/code/modules/photography/photos/photo.dm b/code/modules/photography/photos/photo.dm
index 82de4fc01a8..7189a64dbcb 100644
--- a/code/modules/photography/photos/photo.dm
+++ b/code/modules/photography/photos/photo.dm
@@ -78,7 +78,7 @@
/obj/item/photo/attack_self(mob/user)
user.examinate(src)
-/obj/item/photo/attackby(obj/item/P, mob/user, list/modifiers)
+/obj/item/photo/attackby(obj/item/P, mob/user, list/modifiers, list/attack_modifiers)
if(IS_WRITING_UTENSIL(P))
if(!user.can_write(P))
return
diff --git a/code/modules/plumbing/plumbers/plumbing_buffer.dm b/code/modules/plumbing/plumbers/plumbing_buffer.dm
index 303fda0763f..3f7c06ebb3f 100644
--- a/code/modules/plumbing/plumbers/plumbing_buffer.dm
+++ b/code/modules/plumbing/plumbers/plumbing_buffer.dm
@@ -77,7 +77,7 @@
to_chat(user, span_notice("New activation threshold is now [activation_volume]."))
return
-/obj/machinery/plumbing/buffer/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/plumbing/buffer/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(item.tool_behaviour == TOOL_SCREWDRIVER)
to_chat(user, span_notice("You reset the automatic buffer."))
diff --git a/code/modules/plumbing/plumbers/teleporter.dm b/code/modules/plumbing/plumbers/teleporter.dm
index 075308b9fe1..0baa3a8b207 100644
--- a/code/modules/plumbing/plumbers/teleporter.dm
+++ b/code/modules/plumbing/plumbers/teleporter.dm
@@ -98,7 +98,7 @@
senders = list()
-/obj/machinery/plumbing/receiver/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/plumbing/receiver/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, icon_state + "_open", initial(icon_state), I))
update_appearance()
return
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index 9c169d64c3a..453239f84ce 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -207,7 +207,7 @@ GLOBAL_LIST_INIT(wire_node_generating_types, typecacheof(list(
// - Wirecutters : cut it duh !
// - Multitool : get the power currently passing through the cable
//
-/obj/structure/cable/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/cable/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
handlecable(item, user, modifiers)
diff --git a/code/modules/power/floodlight.dm b/code/modules/power/floodlight.dm
index a127a663755..7d43f319475 100644
--- a/code/modules/power/floodlight.dm
+++ b/code/modules/power/floodlight.dm
@@ -98,7 +98,7 @@
return ITEM_INTERACT_SUCCESS
-/obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/structure/floodlight_frame/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/stack/cable_coil) && state == FLOODLIGHT_NEEDS_WIRES)
var/obj/item/stack/S = O
if(S.use(5))
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index 0241d880a55..3792c405c6c 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -83,7 +83,7 @@ GLOBAL_LIST_EMPTY(gravity_generators)
main_part = null
return ..()
-/obj/machinery/gravity_generator/part/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/gravity_generator/part/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(!main_part)
return
return main_part.attackby(weapon, user)
@@ -235,7 +235,7 @@ GLOBAL_LIST_EMPTY(gravity_generators)
. += span_notice("The new plating just needs to be bolted into place now.")
// Fixing the gravity generator.
-/obj/machinery/gravity_generator/main/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/gravity_generator/main/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(machine_stat & BROKEN)
switch(broken_state)
if(GRAV_NEEDS_SCREWDRIVER)
diff --git a/code/modules/power/lighting/light.dm b/code/modules/power/lighting/light.dm
index 7b5fd6e4418..598f1b3afe7 100644
--- a/code/modules/power/lighting/light.dm
+++ b/code/modules/power/lighting/light.dm
@@ -387,7 +387,7 @@
// attack with item - insert light (if right type), otherwise try to break the light
-/obj/machinery/light/attackby(obj/item/tool, mob/living/user, list/modifiers)
+/obj/machinery/light/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers)
// attempt to insert light
if(istype(tool, /obj/item/light))
if(status == LIGHT_OK)
@@ -469,14 +469,17 @@
real_cell.forceMove(new_light)
cell = null
-/obj/machinery/light/attacked_by(obj/item/attacking_object, mob/living/user)
- ..()
+/obj/machinery/light/attacked_by(obj/item/attacking_object, mob/living/user, list/modifiers, list/attack_modifiers)
+ . = ..()
+ if(!.)
+ return
if(status != LIGHT_BROKEN && status != LIGHT_EMPTY)
return
if(!on || !(attacking_object.obj_flags & CONDUCTS_ELECTRICITY))
return
- if(prob(12))
- electrocute_mob(user, get_area(src), src, 0.3, TRUE)
+ if(!prob(12))
+ return
+ electrocute_mob(user, get_area(src), src, 0.3, TRUE)
/obj/machinery/light/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0)
. = ..()
diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm
index 06f76ade214..3b4ab157b0e 100644
--- a/code/modules/power/lighting/light_construct.dm
+++ b/code/modules/power/lighting/light_construct.dm
@@ -75,7 +75,7 @@
cell_reference.forceMove(drop_location())
return cell_reference.attack_tk(user)
-/obj/structure/light_construct/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/structure/light_construct/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(istype(tool, /obj/item/stock_parts/power_store/cell))
if(!cell_connectors)
diff --git a/code/modules/power/lighting/light_items.dm b/code/modules/power/lighting/light_items.dm
index 5f93047cd6c..51acfd7ff57 100644
--- a/code/modules/power/lighting/light_items.dm
+++ b/code/modules/power/lighting/light_items.dm
@@ -30,7 +30,7 @@
AddElement(/datum/element/update_icon_updates_onmob)
AddComponent(/datum/component/golem_food, golem_food_key = /obj/item/light, extra_validation = CALLBACK(src, PROC_REF(is_intact)))
-/obj/item/light/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/light/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(istype(attacking_item, /obj/item/lightreplacer))
@@ -127,7 +127,7 @@
..()
shatter(M)
-/obj/item/light/attack_atom(obj/O, mob/living/user, list/modifiers)
+/obj/item/light/attack_atom(obj/O, mob/living/user, list/modifiers, list/attack_modifiers)
..()
shatter(O)
diff --git a/code/modules/power/pipecleaners.dm b/code/modules/power/pipecleaners.dm
index 6d3d9c780d7..9297140b7b8 100644
--- a/code/modules/power/pipecleaners.dm
+++ b/code/modules/power/pipecleaners.dm
@@ -151,7 +151,7 @@ By design, d1 is the smallest direction and d2 is the highest
investigate_log("was pulled up by [key_name(usr)] in [AREACOORD(src)]", INVESTIGATE_WIRES)
deconstruct()
-/obj/structure/pipe_cleaner/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/pipe_cleaner/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
handlecable(W, user, modifiers)
/obj/structure/pipe_cleaner/singularity_pull(atom/singularity, current_size)
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 8d49df1d485..81c3a78996e 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -175,7 +175,7 @@
else
disconnect_from_network()
-/obj/machinery/power/port_gen/pacman/attackby(obj/item/O, mob/user, list/modifiers)
+/obj/machinery/power/port_gen/pacman/attackby(obj/item/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, sheet_path))
var/obj/item/stack/addstack = O
var/amount = min((max_sheets - sheets), addstack.amount)
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index 39286aa0a7e..fba78f4559b 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -324,7 +324,7 @@
// attach a wire to a power machine - leads from the turf you are standing on
//almost never called, overwritten by all power machines but terminal and generator
-/obj/machinery/power/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/power/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/coil = W
var/turf/T = user.loc
diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm
index 8398ff4dafc..4390ae73854 100644
--- a/code/modules/power/rtg.dm
+++ b/code/modules/power/rtg.dm
@@ -37,7 +37,7 @@
if(in_range(user, src) || isobserver(user))
. += span_notice("The status display reads: Power generation at [display_power(power_gen, convert = FALSE)].")
-/obj/machinery/power/rtg/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/power/rtg/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I))
return
else if(default_deconstruction_crowbar(I))
@@ -142,7 +142,7 @@
power_gen = 750
anchored = TRUE
-/obj/machinery/power/rtg/old_station/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/power/rtg/old_station/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "[initial(icon_state)]-open", initial(icon_state), I))
to_chat(user,span_warning("You feel it crumbling under your hands!"))
return
diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm
index 1deecc52344..6be5d155949 100644
--- a/code/modules/power/singularity/containment_field.dm
+++ b/code/modules/power/singularity/containment_field.dm
@@ -50,7 +50,7 @@
shock(user)
return TRUE
-/obj/machinery/field/containment/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/field/containment/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
shock(user)
return TRUE
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index d850d6f5e58..f8d53960883 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -335,7 +335,7 @@
locked = !locked
to_chat(user, span_notice("You [src.locked ? "lock" : "unlock"] the controls."))
-/obj/machinery/power/emitter/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/power/emitter/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(item.GetID())
togglelock(user)
return
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 060425af013..26df900409b 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -312,7 +312,7 @@
return
randomise_offset(anchored ? 0 : random_offset)
-/obj/item/solar_assembly/attackby(obj/item/item_used, mob/user, list/modifiers)
+/obj/item/solar_assembly/attackby(obj/item/item_used, mob/user, list/modifiers, list/attack_modifiers)
if(item_used.tool_behaviour == TOOL_WRENCH && isturf(loc))
if(isinspace())
to_chat(user, span_warning("You can't secure [src] here."))
@@ -566,7 +566,7 @@
return TRUE
return FALSE
-/obj/machinery/power/solar_control/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/machinery/power/solar_control/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_SCREWDRIVER)
if(I.use_tool(src, user, 20, volume=50))
if (src.machine_stat & BROKEN)
diff --git a/code/modules/power/supermatter/supermatter_hit_procs.dm b/code/modules/power/supermatter/supermatter_hit_procs.dm
index 186492e6c10..1f929ba0ed2 100644
--- a/code/modules/power/supermatter/supermatter_hit_procs.dm
+++ b/code/modules/power/supermatter/supermatter_hit_procs.dm
@@ -65,7 +65,7 @@
qdel(rip_u)
return COMPONENT_CANCEL_ATTACK_CHAIN
-/obj/machinery/power/supermatter_crystal/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/power/supermatter_crystal/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/scalpel/supermatter))
var/obj/item/scalpel/supermatter/scalpel = item
to_chat(user, span_notice("You carefully begin to scrape \the [src] with \the [scalpel]..."))
diff --git a/code/modules/power/tesla/coil.dm b/code/modules/power/tesla/coil.dm
index ff550ad13b4..237bbadfc84 100644
--- a/code/modules/power/tesla/coil.dm
+++ b/code/modules/power/tesla/coil.dm
@@ -76,7 +76,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/power/energy_accumulator/tesla_coil/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/power/energy_accumulator/tesla_coil/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "coil_open[anchored]", "coil[anchored]", W))
return
@@ -158,7 +158,7 @@
default_unfasten_wrench(user, tool)
return ITEM_INTERACT_SUCCESS
-/obj/machinery/power/energy_accumulator/grounding_rod/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/power/energy_accumulator/grounding_rod/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "grounding_rod_open[anchored]", "grounding_rod[anchored]", W))
return
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm
index e0abfe231fb..83377666650 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammunition.dm
@@ -129,7 +129,7 @@
if(!loaded_projectile)
loaded_projectile = new projectile_type(src, src)
-/obj/item/ammo_casing/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/ammo_casing/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/ammo_box))
var/obj/item/ammo_box/box = I
if(isturf(loc))
diff --git a/code/modules/projectiles/ammunition/ballistic/foam.dm b/code/modules/projectiles/ammunition/ballistic/foam.dm
index 9f1060799f6..2a232d4dba7 100644
--- a/code/modules/projectiles/ammunition/ballistic/foam.dm
+++ b/code/modules/projectiles/ammunition/ballistic/foam.dm
@@ -43,7 +43,7 @@
[length(type_initial_names) ? ", such as [english_list(type_initial_names, and_text = "or ", final_comma_text = ", ")]" : ""].")
-/obj/item/ammo_casing/foam_dart/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/ammo_casing/foam_dart/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if (attacking_item.tool_behaviour != TOOL_SCREWDRIVER || modified)
return ..()
diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm
index d0e7bb3fee8..b02a9d21d16 100644
--- a/code/modules/projectiles/guns/ballistic/automatic.dm
+++ b/code/modules/projectiles/guns/ballistic/automatic.dm
@@ -311,7 +311,7 @@
return
..()
-/obj/item/gun/ballistic/automatic/l6_saw/attackby(obj/item/A, mob/user, list/modifiers)
+/obj/item/gun/ballistic/automatic/l6_saw/attackby(obj/item/A, mob/user, list/modifiers, list/attack_modifiers)
if(!cover_open && istype(A, accepted_magazine_type))
balloon_alert(user, "open the cover!")
return
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index 0440c142c66..11b61cba8b2 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -15,7 +15,7 @@
/obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted
pin = /obj/item/firing_pin
-/obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, list/modifiers)
+/obj/item/gun/ballistic/revolver/grenadelauncher/attackby(obj/item/A, mob/user, list/modifiers, list/attack_modifiers)
..()
if(istype(A, /obj/item/ammo_box) || isammocasing(A))
chamber_round()
diff --git a/code/modules/projectiles/guns/ballistic/pistol.dm b/code/modules/projectiles/guns/ballistic/pistol.dm
index 1b0f779d85b..a436f582a2f 100644
--- a/code/modules/projectiles/guns/ballistic/pistol.dm
+++ b/code/modules/projectiles/guns/ballistic/pistol.dm
@@ -93,7 +93,7 @@
return underbarrel.try_fire_gun(target, user, params)
return ..()
-/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/gun/ballistic/automatic/pistol/clandestine/fisher/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
var/obj/projectile/energy/fisher/melee/simulated_hit = new
simulated_hit.firer = user
simulated_hit.on_hit(target)
diff --git a/code/modules/projectiles/guns/energy/dueling.dm b/code/modules/projectiles/guns/energy/dueling.dm
index b531d96d221..e579148f03d 100644
--- a/code/modules/projectiles/guns/energy/dueling.dm
+++ b/code/modules/projectiles/guns/energy/dueling.dm
@@ -165,7 +165,7 @@
setting_overlay = mutable_appearance(icon,setting_iconstate())
add_overlay(setting_overlay)
-/obj/item/gun/energy/dueling/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/gun/energy/dueling/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(istype(W, /obj/item/gun/energy/dueling))
var/obj/item/gun/energy/dueling/other_gun = W
diff --git a/code/modules/projectiles/guns/energy/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm
index c63b58f4261..32c17488158 100644
--- a/code/modules/projectiles/guns/energy/laser_gatling.dm
+++ b/code/modules/projectiles/guns/energy/laser_gatling.dm
@@ -53,7 +53,7 @@
else
..()
-/obj/item/minigunpack/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/item/minigunpack/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(W == gun) //Don't need armed check, because if you have the gun assume its armed.
user.dropItemToGround(gun, TRUE)
else
diff --git a/code/modules/projectiles/guns/energy/recharge.dm b/code/modules/projectiles/guns/energy/recharge.dm
index 2cdbf1ed6aa..0f4da4e0ef2 100644
--- a/code/modules/projectiles/guns/energy/recharge.dm
+++ b/code/modules/projectiles/guns/energy/recharge.dm
@@ -156,7 +156,7 @@
While some would argue that this is a really terrible design choice, others argue that it is very funny to be able to shoot at light sources.
\
Caveat emptor.")
-/obj/item/gun/energy/recharge/fisher/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/gun/energy/recharge/fisher/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(.)
return
diff --git a/code/modules/projectiles/guns/special/grenade_launcher.dm b/code/modules/projectiles/guns/special/grenade_launcher.dm
index 3594f0dd3b0..9a290459389 100644
--- a/code/modules/projectiles/guns/special/grenade_launcher.dm
+++ b/code/modules/projectiles/guns/special/grenade_launcher.dm
@@ -24,7 +24,7 @@
max_grenades = reset_fantasy_variable("max_syringes", max_grenades)
return ..()
-/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/gun/grenadelauncher/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/grenade/c4))
return
diff --git a/code/modules/projectiles/guns/special/hand_of_midas.dm b/code/modules/projectiles/guns/special/hand_of_midas.dm
index 3d1c578dfc6..80aa94d31a5 100644
--- a/code/modules/projectiles/guns/special/hand_of_midas.dm
+++ b/code/modules/projectiles/guns/special/hand_of_midas.dm
@@ -75,7 +75,7 @@
return ITEM_INTERACT_SUCCESS
// If we botch a shot, we have to start over again by inserting gold coins into the gun. Can only be done if it has no charges or gold.
-/obj/item/gun/magic/midas_hand/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/gun/magic/midas_hand/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(charges || gold_timer)
balloon_alert(user, "already loaded")
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 66f45970f75..a965defcd3b 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -259,7 +259,7 @@
gun.desc = gun::desc
..()
-/obj/item/firing_pin/paywall/attackby(obj/item/M, mob/living/user, list/modifiers)
+/obj/item/firing_pin/paywall/attackby(obj/item/M, mob/living/user, list/modifiers, list/attack_modifiers)
if(isidcard(M))
var/obj/item/card/id/id = M
if(!id.registered_account)
diff --git a/code/modules/reagents/chemistry/items.dm b/code/modules/reagents/chemistry/items.dm
index cad406ed8a9..810b13e6d0d 100644
--- a/code/modules/reagents/chemistry/items.dm
+++ b/code/modules/reagents/chemistry/items.dm
@@ -159,7 +159,7 @@
if(reagent_type)
reagents.add_reagent(reagent_type, 15)
-/obj/item/burner/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/burner/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(is_reagent_container(I))
if(lit)
diff --git a/code/modules/reagents/chemistry/machinery/pandemic.dm b/code/modules/reagents/chemistry/machinery/pandemic.dm
index 568f1ac86d4..54ebe3871ac 100644
--- a/code/modules/reagents/chemistry/machinery/pandemic.dm
+++ b/code/modules/reagents/chemistry/machinery/pandemic.dm
@@ -80,7 +80,7 @@
update_appearance()
SStgui.update_uis(src)
-/obj/machinery/computer/pandemic/attackby(obj/item/held_item, mob/user, list/modifiers)
+/obj/machinery/computer/pandemic/attackby(obj/item/held_item, mob/user, list/modifiers, list/attack_modifiers)
//Advanced science! Precision instruments (eg droppers and syringes) are precise enough to modify the loaded sample!
if(istype(held_item, /obj/item/reagent_containers/dropper) || istype(held_item, /obj/item/reagent_containers/syringe))
if(!beaker)
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 97e7f8b4c78..7f6345b4151 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -83,7 +83,7 @@
. = ..()
RegisterSignal(reagents, COMSIG_REAGENTS_HOLDER_UPDATED, PROC_REF(on_reagent_change))
-/obj/item/reagent_containers/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/reagent_containers/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
if (!user.combat_mode)
return
return ..()
@@ -119,7 +119,7 @@
balloon_alert(user, "transferring [amount_per_transfer_from_this]u")
mode_change_message(user)
-/obj/item/reagent_containers/pre_attack_secondary(atom/target, mob/living/user, list/modifiers)
+/obj/item/reagent_containers/pre_attack_secondary(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
if(HAS_TRAIT(target, TRAIT_DO_NOT_SPLASH))
return ..()
if(!user.combat_mode)
diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm
index 8349141e32a..6cd19bf7f28 100644
--- a/code/modules/reagents/reagent_containers/blood_pack.dm
+++ b/code/modules/reagents/reagent_containers/blood_pack.dm
@@ -100,7 +100,7 @@
/obj/item/reagent_containers/blood/universal
blood_type = BLOOD_TYPE_UNIVERSAL
-/obj/item/reagent_containers/blood/attackby(obj/item/tool, mob/user, list/modifiers)
+/obj/item/reagent_containers/blood/attackby(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
if (IS_WRITING_UTENSIL(tool))
if(!user.can_write(tool))
return
diff --git a/code/modules/reagents/reagent_containers/cups/_cup.dm b/code/modules/reagents/reagent_containers/cups/_cup.dm
index d0005ee5a7b..d4672f0b83c 100644
--- a/code/modules/reagents/reagent_containers/cups/_cup.dm
+++ b/code/modules/reagents/reagent_containers/cups/_cup.dm
@@ -177,7 +177,7 @@
return NONE
-/obj/item/reagent_containers/cup/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/reagent_containers/cup/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
var/hotness = attacking_item.get_temperature()
if(hotness && reagents)
reagents.expose_temperature(hotness)
@@ -410,7 +410,7 @@
melee = 10
acid = 50
-/obj/item/reagent_containers/cup/bucket/attackby(obj/O, mob/user, list/modifiers)
+/obj/item/reagent_containers/cup/bucket/attackby(obj/O, mob/user, list/modifiers, list/attack_modifiers)
if(istype(O, /obj/item/mop))
if(reagents.total_volume < 1)
user.balloon_alert(user, "empty!")
diff --git a/code/modules/reagents/reagent_containers/cups/glassbottle.dm b/code/modules/reagents/reagent_containers/cups/glassbottle.dm
index 6c2f8b91f90..2969758475b 100644
--- a/code/modules/reagents/reagent_containers/cups/glassbottle.dm
+++ b/code/modules/reagents/reagent_containers/cups/glassbottle.dm
@@ -697,7 +697,7 @@
if(do_after(user, 1 SECONDS, src))
return pop_cork(user, sabrage = FALSE, froth_severity = pick(0, 1))
-/obj/item/reagent_containers/cup/glass/bottle/champagne/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/item/reagent_containers/cup/glass/bottle/champagne/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(spillable)
@@ -942,7 +942,7 @@
target.fire_act()
new /obj/effect/hotspot(get_turf(target))
-/obj/item/reagent_containers/cup/glass/bottle/molotov/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/reagent_containers/cup/glass/bottle/molotov/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.get_temperature() && !active)
active = TRUE
log_bomber(user, "has primed a", src, "for detonation")
diff --git a/code/modules/reagents/reagent_containers/misc.dm b/code/modules/reagents/reagent_containers/misc.dm
index 4f1dafcce11..ee354cc9d35 100644
--- a/code/modules/reagents/reagent_containers/misc.dm
+++ b/code/modules/reagents/reagent_containers/misc.dm
@@ -73,7 +73,7 @@
to_chat(user, span_notice("You screw the battery case on [src] [open ? "open" : "closed"] ."))
update_appearance()
-/obj/item/reagent_containers/cup/maunamug/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/reagent_containers/cup/maunamug/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(!istype(I, /obj/item/stock_parts/power_store/cell))
return ..()
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index 72a105e2c48..e3f4e36a7a4 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -132,7 +132,7 @@
current_range = spray_range
to_chat(user, span_notice("You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]."))
-/obj/item/reagent_containers/spray/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/reagent_containers/spray/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
var/hotness = I.get_temperature()
if(hotness && reagents)
reagents.expose_temperature(hotness)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index c664bc3f2bc..ae3500a8072 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -34,7 +34,7 @@
CALLBACK(src, PROC_REF(get_dart_var_modifiers))\
)
-/obj/item/reagent_containers/syringe/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/reagent_containers/syringe/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
return
/obj/item/reagent_containers/syringe/proc/try_syringe(atom/target, mob/user)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index 849ec6059cd..1aeb8fff1ff 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -81,7 +81,7 @@
if(tank_volume && (damage_flag == BULLET || damage_flag == LASER))
boom()
-/obj/structure/reagent_dispensers/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/reagent_dispensers/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(attacking_item.is_refillable())
return FALSE //so we can refill them via their afterattack.
if(istype(attacking_item, /obj/item/assembly_holder) && accepts_rig)
@@ -301,7 +301,7 @@
// if this sucks, feel free to change it, but make sure the damn thing will log. thanks.
return ..()
-/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(attacking_item.tool_behaviour != TOOL_WELDER)
return ..()
diff --git a/code/modules/recycling/conveyor.dm b/code/modules/recycling/conveyor.dm
index 414c13964bc..49d072c8101 100644
--- a/code/modules/recycling/conveyor.dm
+++ b/code/modules/recycling/conveyor.dm
@@ -285,7 +285,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
GLOB.move_manager.stop_looping(thing, SSconveyors)
// attack with item, place item on conveyor
-/obj/machinery/conveyor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/conveyor/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(attacking_item.tool_behaviour == TOOL_CROWBAR)
user.visible_message(span_notice("[user] struggles to pry up [src] with [attacking_item]."), \
span_notice("You struggle to pry up [src] with [attacking_item]."))
@@ -338,7 +338,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
else
return ..()
-/obj/machinery/conveyor/attackby_secondary(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/machinery/conveyor/attackby_secondary(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(attacking_item.tool_behaviour == TOOL_SCREWDRIVER)
attacking_item.play_tool_sound(src)
flipped = !flipped
@@ -545,7 +545,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
/obj/machinery/conveyor_switch/attack_robot_secondary(mob/user, list/modifiers)
return attack_hand_secondary(user, modifiers)
-/obj/machinery/conveyor_switch/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/conveyor_switch/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(is_wire_tool(attacking_item))
wires.interact(user)
return TRUE
@@ -660,7 +660,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
use(1)
return ITEM_INTERACT_SUCCESS
-/obj/item/stack/conveyor/attackby(obj/item/item_used, mob/user, list/modifiers)
+/obj/item/stack/conveyor/attackby(obj/item/item_used, mob/user, list/modifiers, list/attack_modifiers)
..()
if(istype(item_used, /obj/item/conveyor_switch_construct))
to_chat(user, span_notice("You link the switch to the conveyor belt assembly."))
diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm
index 0da491c8a97..11c1cc83809 100644
--- a/code/modules/recycling/disposal/bin.dm
+++ b/code/modules/recycling/disposal/bin.dm
@@ -111,7 +111,7 @@
air_contents.merge(removed)
trunk_check()
-/obj/machinery/disposal/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/machinery/disposal/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
if(!pressure_charging && !full_pressure && !flush)
if(I.tool_behaviour == TOOL_SCREWDRIVER)
@@ -378,7 +378,7 @@
var/obj/item/dest_tagger/mounted_tagger
// attack by item places it in to disposal
-/obj/machinery/disposal/bin/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/disposal/bin/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/storage/bag/trash)) //Not doing component overrides because this is a specific type.
var/obj/item/storage/bag/trash/bag = weapon
to_chat(user, span_warning("You empty the bag."))
@@ -388,7 +388,7 @@
return ..()
// handle machine interaction
-/obj/machinery/disposal/bin/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/disposal/bin/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/dest_tagger))
var/obj/item/dest_tagger/new_tagger = weapon
if(mounted_tagger)
diff --git a/code/modules/recycling/disposal/pipe_sorting.dm b/code/modules/recycling/disposal/pipe_sorting.dm
index 0d3ec432b1a..b438e88e4d7 100644
--- a/code/modules/recycling/disposal/pipe_sorting.dm
+++ b/code/modules/recycling/disposal/pipe_sorting.dm
@@ -55,7 +55,7 @@
else
. += "It has no sorting tags set."
-/obj/structure/disposalpipe/sorting/mail/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/structure/disposalpipe/sorting/mail/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/dest_tagger))
var/obj/item/dest_tagger/O = I
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index 55b60d8f5ab..a293d31b07c 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -103,7 +103,7 @@
if(sticker)
. += "[base_icon_state]_barcode"
-/obj/item/delivery/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/item/delivery/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/dest_tagger))
var/obj/item/dest_tagger/dest_tagger = item
@@ -352,7 +352,7 @@
if(payments_acc)
. += span_notice("Ctrl-click to clear the registered account.")
-/obj/item/sales_tagger/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/item/sales_tagger/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(isidcard(item))
var/obj/item/card/id/potential_acc = item
diff --git a/code/modules/religion/burdened/psyker.dm b/code/modules/religion/burdened/psyker.dm
index 87d033d543a..e28be0d4e55 100644
--- a/code/modules/religion/burdened/psyker.dm
+++ b/code/modules/religion/burdened/psyker.dm
@@ -204,7 +204,7 @@
/obj/item/gun/ballistic/revolver/chaplain/attack_self(mob/living/user)
pray_refill(user)
-/obj/item/gun/ballistic/revolver/chaplain/attackby(obj/item/possibly_ammo, mob/user, list/modifiers)
+/obj/item/gun/ballistic/revolver/chaplain/attackby(obj/item/possibly_ammo, mob/user, list/modifiers, list/attack_modifiers)
if (isammocasing(possibly_ammo) || istype(possibly_ammo, /obj/item/ammo_box))
user.balloon_alert(user, "no manual reloads!")
return
diff --git a/code/modules/research/anomaly/anomaly_core.dm b/code/modules/research/anomaly/anomaly_core.dm
index ab24f5ca631..16a9277c26e 100644
--- a/code/modules/research/anomaly/anomaly_core.dm
+++ b/code/modules/research/anomaly/anomaly_core.dm
@@ -30,7 +30,7 @@
/obj/item/assembly/signaler/anomaly/attack_self()
return
-/obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/assembly/signaler/anomaly/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(I.tool_behaviour == TOOL_ANALYZER)
to_chat(user, span_notice("Analyzing... [src]'s stabilized field is fluctuating along frequency [format_frequency(frequency)], code [code]."))
return ..()
diff --git a/code/modules/research/anomaly/anomaly_refinery.dm b/code/modules/research/anomaly/anomaly_refinery.dm
index 55ea8324012..7ec62a618d9 100644
--- a/code/modules/research/anomaly/anomaly_refinery.dm
+++ b/code/modules/research/anomaly/anomaly_refinery.dm
@@ -73,7 +73,7 @@
var/radius = clamp(round(MIN_RADIUS_REQUIRED + radius_increase_per_core * already_made, 1), MIN_RADIUS_REQUIRED, MAX_RADIUS_REQUIRED)
return radius
-/obj/machinery/research/anomaly_refinery/attackby(obj/item/tool, mob/living/user, list/modifiers)
+/obj/machinery/research/anomaly_refinery/attackby(obj/item/tool, mob/living/user, list/modifiers, list/attack_modifiers)
if(active)
to_chat(user, span_warning("You can't insert [tool] into [src] while [p_theyre()] currently active."))
return
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 3540a30b2d4..b73ae51bdd7 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -115,7 +115,7 @@
if(in_range(user, src) || isobserver(user))
. += span_notice("The status display reads: Malfunction probability reduced by [malfunction_probability_coeff]%.
Cooldown interval between experiments at [resetTime*0.1] seconds.")
-/obj/machinery/rnd/experimentor/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/machinery/rnd/experimentor/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode)
return ..()
if(!is_insertion_ready(user))
diff --git a/code/modules/research/ordnance/doppler_array.dm b/code/modules/research/ordnance/doppler_array.dm
index 50aabe04b2b..1f1d4600938 100644
--- a/code/modules/research/ordnance/doppler_array.dm
+++ b/code/modules/research/ordnance/doppler_array.dm
@@ -48,7 +48,7 @@
. = ..()
. += span_notice("It is currently facing [dir2text(dir)]")
-/obj/machinery/doppler_array/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/machinery/doppler_array/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(item, /obj/item/computer_disk))
var/obj/item/computer_disk/disk = item
eject_disk(user)
diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm
index b153cff87ac..9a481d6f362 100644
--- a/code/modules/research/rdconsole.dm
+++ b/code/modules/research/rdconsole.dm
@@ -66,7 +66,7 @@ Nothing else in the console has ID requirements.
d_disk = null
return ..()
-/obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, list/modifiers)
+/obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, list/modifiers, list/attack_modifiers)
//Loading a disk into it.
if(istype(D, /obj/item/disk))
if(istype(D, /obj/item/disk/tech_disk))
diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm
index 14fc5466a7d..5048163ea92 100644
--- a/code/modules/research/server.dm
+++ b/code/modules/research/server.dm
@@ -165,7 +165,7 @@
return ITEM_INTERACT_BLOCKING
return ..()
-/obj/machinery/rnd/server/master/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/machinery/rnd/server/master/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/computer_disk/hdd_theft))
switch(deconstruction_state)
if(HDD_PANEL_CLOSED)
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index c2cf8b339d3..c34e07ca4f1 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -27,7 +27,7 @@ Slimecrossing Weapons
throwforce = 15
damtype = BRUTE
-/obj/item/knife/rainbowknife/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/knife/rainbowknife/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(isliving(target))
damtype = pick(BRUTE, BURN, TOX, OXY)
switch(damtype)
diff --git a/code/modules/research/xenobiology/vatgrowing/petri_dish.dm b/code/modules/research/xenobiology/vatgrowing/petri_dish.dm
index 68600e24652..08e88b1e481 100644
--- a/code/modules/research/xenobiology/vatgrowing/petri_dish.dm
+++ b/code/modules/research/xenobiology/vatgrowing/petri_dish.dm
@@ -26,7 +26,7 @@
var/datum/micro_organism/MO = i
. += MO.get_details()
-/obj/item/petri_dish/pre_attack(atom/A, mob/living/user, list/modifiers)
+/obj/item/petri_dish/pre_attack(atom/A, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!sample || !istype(A, /obj/structure/sink))
return FALSE
diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm
index 2b235068b5a..7e865b7743a 100644
--- a/code/modules/research/xenobiology/xenobio_camera.dm
+++ b/code/modules/research/xenobiology/xenobio_camera.dm
@@ -118,7 +118,7 @@
user.hud_used.show_hud(user.hud_used.hud_version)
return ..()
-/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/used_item, mob/user, list/modifiers)
+/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/used_item, mob/user, list/modifiers, list/attack_modifiers)
if(istype(used_item, /obj/item/food/monkeycube))
monkeys++
to_chat(user, span_notice("You feed [used_item] to [src]. It now has [monkeys] monkey cubes stored."))
diff --git a/code/modules/shuttle/misc/special.dm b/code/modules/shuttle/misc/special.dm
index a1c609bbca6..a7f97136382 100644
--- a/code/modules/shuttle/misc/special.dm
+++ b/code/modules/shuttle/misc/special.dm
@@ -62,7 +62,7 @@
active = FALSE
update_appearance()
-/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/power/emitter/energycannon/magical/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
return
/obj/machinery/power/emitter/energycannon/magical/ex_act(severity)
@@ -259,7 +259,7 @@
/obj/machinery/scanner_gate/luxury_shuttle/auto_scan(atom/movable/AM)
return
-/obj/machinery/scanner_gate/luxury_shuttle/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/machinery/scanner_gate/luxury_shuttle/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
return
/obj/machinery/scanner_gate/luxury_shuttle/emag_act(mob/user, obj/item/card/emag/emag_card)
diff --git a/code/modules/spells/spell_types/self/spacetime_distortion.dm b/code/modules/spells/spell_types/self/spacetime_distortion.dm
index ca2988381a0..b2d43a99ee6 100644
--- a/code/modules/spells/spell_types/self/spacetime_distortion.dm
+++ b/code/modules/spells/spell_types/self/spacetime_distortion.dm
@@ -149,7 +149,7 @@
if(!busy)
walk_link(AM)
-/obj/effect/cross_action/spacetime_dist/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/effect/cross_action/spacetime_dist/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
if(user.temporarilyRemoveItemFromInventory(W))
walk_link(W)
else
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 8178f95cfde..d92fa18cf49 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -426,7 +426,7 @@
return
return ..()
-/obj/item/bodypart/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/bodypart/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
SHOULD_CALL_PARENT(TRUE)
if(weapon.get_sharpness())
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index 285ae12da98..bca64d47739 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -294,7 +294,7 @@
TRAIT_RESISTHIGHPRESSURE,
), AUGMENTATION_TRAIT)
-/obj/item/bodypart/chest/robot/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/bodypart/chest/robot/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/stock_parts/power_store/cell))
if(cell)
to_chat(user, span_warning("You have already inserted a cell!"))
@@ -438,7 +438,7 @@
. += "It has two eye sockets occupied by flashes."
. += span_notice("You can remove the seated flash[single_flash ? "":"es"] with a crowbar.")
-/obj/item/bodypart/head/robot/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/bodypart/head/robot/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/assembly/flash/handheld))
var/obj/item/assembly/flash/handheld/flash = weapon
if(flash1 && flash2)
diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm
index 8d1ac88011c..fc60b26f4d5 100644
--- a/code/modules/surgery/experimental_dissection.dm
+++ b/code/modules/surgery/experimental_dissection.dm
@@ -117,7 +117,7 @@
. = ..()
. += span_notice("It is worth [value] research points.")
-/obj/item/research_notes/attackby(obj/item/attacking_item, mob/living/user, list/modifiers)
+/obj/item/research_notes/attackby(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(attacking_item, /obj/item/research_notes))
var/obj/item/research_notes/notes = attacking_item
value = value + notes.value
diff --git a/code/modules/surgery/organs/autosurgeon.dm b/code/modules/surgery/organs/autosurgeon.dm
index 22ed3802def..2a578a89475 100644
--- a/code/modules/surgery/organs/autosurgeon.dm
+++ b/code/modules/surgery/organs/autosurgeon.dm
@@ -118,11 +118,11 @@
/obj/item/autosurgeon/attack_self(mob/user)//when the object it used...
use_autosurgeon(user, user)
-/obj/item/autosurgeon/attack(mob/living/target, mob/living/user, list/modifiers)
+/obj/item/autosurgeon/attack(mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
add_fingerprint(user)
use_autosurgeon(target, user, 8 SECONDS)
-/obj/item/autosurgeon/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/item/autosurgeon/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(isorgan(attacking_item))
load_organ(attacking_item, user)
else
diff --git a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm
index 4b6304eabf8..eccb6b9f55a 100644
--- a/code/modules/surgery/organs/internal/heart/heart_anomalock.dm
+++ b/code/modules/surgery/organs/internal/heart/heart_anomalock.dm
@@ -51,7 +51,7 @@
tesla_zap(source = organ_owner, zap_range = 20, power = 2.5e5, cutoff = 1e3)
qdel(src)
-/obj/item/organ/heart/cybernetic/anomalock/attack(mob/living/target_mob, mob/living/user, list/modifiers)
+/obj/item/organ/heart/cybernetic/anomalock/attack(mob/living/target_mob, mob/living/user, list/modifiers, list/attack_modifiers)
if(target_mob != user || !istype(target_mob) || !core)
return ..()
diff --git a/code/modules/transport/tram/tram_controller.dm b/code/modules/transport/tram/tram_controller.dm
index f3bd07d07d5..236590697a6 100644
--- a/code/modules/transport/tram/tram_controller.dm
+++ b/code/modules/transport/tram/tram_controller.dm
@@ -845,7 +845,7 @@
. += span_notice("The cabinet can be opened with a [EXAMINE_HINT("Left-click.")]")
-/obj/machinery/transport/tram_controller/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/machinery/transport/tram_controller/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode || cover_open)
return ..()
diff --git a/code/modules/transport/tram/tram_signals.dm b/code/modules/transport/tram/tram_signals.dm
index c20be7edf59..52b3f45186c 100644
--- a/code/modules/transport/tram/tram_signals.dm
+++ b/code/modules/transport/tram/tram_signals.dm
@@ -118,7 +118,7 @@
SStransport.crossing_signals -= src
. = ..()
-/obj/machinery/transport/crossing_signal/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/machinery/transport/crossing_signal/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(!user.combat_mode)
if(default_deconstruction_screwdriver(user, icon_state, icon_state, weapon))
return
@@ -180,7 +180,7 @@
find_uplink()
return CLICK_ACTION_SUCCESS
-/obj/machinery/transport/crossing_signal/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/transport/crossing_signal/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(weapon.tool_behaviour == TOOL_WRENCH && panel_open)
@@ -519,7 +519,7 @@
. += span_notice("The red [EXAMINE_HINT("local fault")] light is on.")
. += span_notice("The status display reads: Repair required.")
-/obj/machinery/transport/guideway_sensor/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/machinery/transport/guideway_sensor/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if (!user.combat_mode)
if(default_deconstruction_screwdriver(user, icon_state, icon_state, weapon))
return
diff --git a/code/modules/transport/tram/tram_structures.dm b/code/modules/transport/tram/tram_structures.dm
index bff8b795898..a9ba78d9898 100644
--- a/code/modules/transport/tram/tram_structures.dm
+++ b/code/modules/transport/tram/tram_structures.dm
@@ -163,7 +163,7 @@
update_appearance()
return ITEM_INTERACT_SUCCESS
-/obj/structure/tram/attackby_secondary(obj/item/tool, mob/user, list/modifiers)
+/obj/structure/tram/attackby_secondary(obj/item/tool, mob/user, list/modifiers, list/attack_modifiers)
switch(state)
if(TRAM_SCREWED_TO_FRAME)
if(tool.tool_behaviour == TOOL_SCREWDRIVER)
@@ -218,7 +218,7 @@
for(var/i in 1 to mineral_amount)
new mineral(loc)
-/obj/structure/tram/attackby(obj/item/item, mob/user, list/modifiers)
+/obj/structure/tram/attackby(obj/item/item, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(istype(item, /obj/item/wallframe/tram))
@@ -353,7 +353,7 @@
/// The last time a radiation pulse was performed
var/last_event = 0
-/obj/structure/tram/alt/uranium/attackby(obj/item/W, mob/user, list/modifiers)
+/obj/structure/tram/alt/uranium/attackby(obj/item/W, mob/user, list/modifiers, list/attack_modifiers)
radiate()
return ..()
diff --git a/code/modules/transport/transport_module.dm b/code/modules/transport/transport_module.dm
index 6ff6ba76ab7..1a3c76e3f5b 100644
--- a/code/modules/transport/transport_module.dm
+++ b/code/modules/transport/transport_module.dm
@@ -745,7 +745,7 @@
return open_lift_radial(user)
-/obj/structure/transport/linear/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/structure/transport/linear/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(!radial_travel)
return ..()
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index a0828bf8a55..b8ddc586594 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -103,14 +103,14 @@
foam.set_up(4, holder = src, location = loc, carry = foamreagent)
foam.start()
-/obj/vehicle/sealed/car/clowncar/attacked_by(obj/item/I, mob/living/user)
- . = ..()
- if(!istype(I, /obj/item/food/grown/banana))
+/obj/vehicle/sealed/car/clowncar/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!istype(tool, /obj/item/food/grown/banana))
return
- var/obj/item/food/grown/banana/banana = I
- atom_integrity += min(banana.seed.potency, max_integrity-atom_integrity)
- to_chat(user, span_danger("You use the [banana] to repair [src]!"))
+ var/obj/item/food/grown/banana/banana = tool
+ repair_damage(banana.seed.potency)
+ to_chat(user, span_danger("You use [banana] to repair [src]!"))
qdel(banana)
+ return ITEM_INTERACT_SUCCESS
/obj/vehicle/sealed/car/clowncar/Bump(atom/bumped)
. = ..()
diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm
index fa8ec712e28..48d4127083b 100644
--- a/code/modules/vehicles/mecha/combat/durand.dm
+++ b/code/modules/vehicles/mecha/combat/durand.dm
@@ -124,7 +124,7 @@ Expects a turf. Returns true if the attack should be blocked, false if not.*/
else
. = ..()
-/obj/vehicle/sealed/mecha/durand/attackby(obj/item/W as obj, mob/user as mob, list/modifiers)
+/obj/vehicle/sealed/mecha/durand/attackby(obj/item/W as obj, mob/user as mob, list/modifiers, list/attack_modifiers)
if(defense_check(user.loc))
log_message("Attack absorbed by defense field. Attacker - [user], with [W]", LOG_MECHA, color="orange")
shield.attackby(W, user, modifiers)
diff --git a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm
index 10f997022a1..c7b94cdeac2 100644
--- a/code/modules/vehicles/mecha/equipment/tools/other_tools.dm
+++ b/code/modules/vehicles/mecha/equipment/tools/other_tools.dm
@@ -347,7 +347,7 @@
log_message("Deactivated.", LOG_MECHA)
return TRUE
-/obj/item/mecha_parts/mecha_equipment/generator/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/item/mecha_parts/mecha_equipment/generator/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(!istype(weapon, fuel))
return FALSE
@@ -551,4 +551,3 @@
mech.chassis_camera = new /obj/machinery/camera/exosuit(mech)
mech.chassis_camera.update_c_tag(mech)
mech.diag_hud_set_camera()
-
diff --git a/code/modules/vehicles/mecha/mech_bay.dm b/code/modules/vehicles/mecha/mech_bay.dm
index 954d8145e68..922b2af7366 100644
--- a/code/modules/vehicles/mecha/mech_bay.dm
+++ b/code/modules/vehicles/mecha/mech_bay.dm
@@ -76,7 +76,7 @@
recharge_console.update_appearance()
-/obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/machinery/mech_bay_recharge_port/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(default_deconstruction_screwdriver(user, "recharge_port-o", "recharge_port", I))
return
diff --git a/code/modules/vehicles/mecha/mecha_defense.dm b/code/modules/vehicles/mecha/mecha_defense.dm
index 653342e429c..71af41eebf8 100644
--- a/code/modules/vehicles/mecha/mecha_defense.dm
+++ b/code/modules/vehicles/mecha/mecha_defense.dm
@@ -210,14 +210,14 @@
cookedalive.adjust_fire_stacks(1)
cookedalive.ignite_mob()
-/obj/vehicle/sealed/mecha/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/vehicle/sealed/mecha/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if(istype(weapon, /obj/item/mecha_parts))
var/obj/item/mecha_parts/parts = weapon
parts.try_attach_part(user, src, TRUE)
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
return ..()
-/obj/vehicle/sealed/mecha/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/vehicle/sealed/mecha/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode)
return ..()
if(istype(weapon, /obj/item/mmi))
@@ -319,11 +319,12 @@
balloon_alert(user, "already installed!")
return
-/obj/vehicle/sealed/mecha/attacked_by(obj/item/attacking_item, mob/living/user)
- if(!attacking_item.force)
- return
+/obj/vehicle/sealed/mecha/attacked_by(obj/item/attacking_item, mob/living/user, list/modifiers, list/attack_modifiers)
+ var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers) * attacking_item.get_demolition_modifier(src)
+ if(!final_force)
+ return 0
- var/damage_taken = take_damage(attacking_item.force * attacking_item.get_demolition_modifier(src), attacking_item.damtype, MELEE, 1, get_dir(src, user))
+ var/damage_taken = take_damage(final_force, attacking_item.damtype, MELEE, 1, get_dir(src, user))
try_damage_component(damage_taken, user.zone_selected)
var/hit_verb = length(attacking_item.attack_verb_simple) ? "[pick(attacking_item.attack_verb_simple)]" : "hit"
@@ -336,6 +337,7 @@
log_combat(user, src, "attacked", attacking_item)
log_message("Attacked by [user]. Item - [attacking_item], Damage - [damage_taken]", LOG_MECHA)
+ return damage_taken
/obj/vehicle/sealed/mecha/attack_generic(mob/user, damage_amount, damage_type, damage_flag, effects, armor_penetration)
. = ..()
diff --git a/code/modules/vehicles/mecha/mecha_parts.dm b/code/modules/vehicles/mecha/mecha_parts.dm
index ae2c1f5e84f..51bb1b4b92d 100644
--- a/code/modules/vehicles/mecha/mecha_parts.dm
+++ b/code/modules/vehicles/mecha/mecha_parts.dm
@@ -251,7 +251,7 @@
name = "\improper Phazon chassis"
construct_type = /datum/component/construction/unordered/mecha_chassis/phazon
-/obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/mecha_parts/chassis/phazon/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
. = ..()
if(istype(I, /obj/item/assembly/signaler/anomaly) && !istype(I, /obj/item/assembly/signaler/anomaly/ectoplasm))
to_chat(user, "The anomaly core socket only accepts ectoplasm anomaly cores!")
diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm
index 227b4d726b8..29efdc39504 100644
--- a/code/modules/vehicles/motorized_wheelchair.dm
+++ b/code/modules/vehicles/motorized_wheelchair.dm
@@ -97,7 +97,7 @@
user.put_in_hands(power_cell)
power_cell = null
-/obj/vehicle/ridden/wheelchair/motorized/attackby(obj/item/attacking_item, mob/user, list/modifiers)
+/obj/vehicle/ridden/wheelchair/motorized/attackby(obj/item/attacking_item, mob/user, list/modifiers, list/attack_modifiers)
if(!panel_open)
return ..()
diff --git a/code/modules/vehicles/pimpin_ride.dm b/code/modules/vehicles/pimpin_ride.dm
index 0bd2360a2c9..16ff261b1c3 100644
--- a/code/modules/vehicles/pimpin_ride.dm
+++ b/code/modules/vehicles/pimpin_ride.dm
@@ -34,7 +34,7 @@
if (installed_upgrade)
. += "It has been upgraded with [installed_upgrade], which can be removed with a screwdriver."
-/obj/vehicle/ridden/janicart/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/vehicle/ridden/janicart/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/storage/bag/trash))
if(trash_bag)
to_chat(user, span_warning("[src] already has a trashbag hooked!"))
diff --git a/code/modules/vehicles/ridden.dm b/code/modules/vehicles/ridden.dm
index 7771133727d..1bcf91301b1 100644
--- a/code/modules/vehicles/ridden.dm
+++ b/code/modules/vehicles/ridden.dm
@@ -29,7 +29,7 @@
add_occupant(M)
return ..()
-/obj/vehicle/ridden/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/vehicle/ridden/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!key_type || is_key(inserted_key) || !is_key(I))
return ..()
if(!user.transferItemToLoc(I, src))
diff --git a/code/modules/vehicles/scooter.dm b/code/modules/vehicles/scooter.dm
index 2413a8c55a0..187b64835a7 100644
--- a/code/modules/vehicles/scooter.dm
+++ b/code/modules/vehicles/scooter.dm
@@ -241,7 +241,7 @@
icon_state = "scooter_frame"
w_class = WEIGHT_CLASS_NORMAL
-/obj/item/scooter_frame/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/item/scooter_frame/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(I, /obj/item/stack/sheet/iron))
return ..()
if(!I.tool_start_check(user, amount=5))
@@ -264,7 +264,7 @@
/obj/vehicle/ridden/scooter/skateboard/wrench_act(mob/living/user, obj/item/I)
return
-/obj/vehicle/ridden/scooter/skateboard/improvised/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/vehicle/ridden/scooter/skateboard/improvised/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(!istype(I, /obj/item/stack/rods))
return ..()
if(!I.tool_start_check(user, amount=2))
diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm
index 82426a999c7..b1af55c67e9 100644
--- a/code/modules/vehicles/sealed.dm
+++ b/code/modules/vehicles/sealed.dm
@@ -108,7 +108,7 @@
/obj/vehicle/sealed/proc/exit_location(M)
return drop_location()
-/obj/vehicle/sealed/attackby(obj/item/I, mob/user, list/modifiers)
+/obj/vehicle/sealed/attackby(obj/item/I, mob/user, list/modifiers, list/attack_modifiers)
if(key_type && !is_key(inserted_key) && is_key(I))
if(user.transferItemToLoc(I, src))
to_chat(user, span_notice("You insert [I] into [src]."))
diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm
index 685e8e48aaf..7520f0e2e17 100644
--- a/code/modules/vehicles/secway.dm
+++ b/code/modules/vehicles/secway.dm
@@ -61,7 +61,7 @@
else
user.balloon_alert_to_viewers("stopped welding [src]", "interrupted the repair!")
-/obj/vehicle/ridden/secway/attackby(obj/item/W, mob/living/user, list/modifiers)
+/obj/vehicle/ridden/secway/attackby(obj/item/W, mob/living/user, list/modifiers, list/attack_modifiers)
if(!istype(W, /obj/item/food/grown/banana))
return ..()
// ignore the occupants because they're presumably too distracted to notice the guy stuffing fruit into their vehicle's exhaust. do segways have exhausts? they do now!
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 9bc279a9bd1..418175f9a9f 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -713,7 +713,7 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock)
to_chat(user, span_warning("You must first secure [src]."))
return TRUE
-/obj/machinery/vending/attackby(obj/item/attack_item, mob/living/user, list/modifiers)
+/obj/machinery/vending/attackby(obj/item/attack_item, mob/living/user, list/modifiers, list/attack_modifiers)
if(panel_open && is_wire_tool(attack_item))
wires.interact(user)
return
@@ -1800,7 +1800,7 @@ GLOBAL_LIST_EMPTY(vending_machines_to_restock)
vend_ready = TRUE
return TRUE
-/obj/machinery/vending/custom/attackby(obj/item/attack_item, mob/user, list/modifiers)
+/obj/machinery/vending/custom/attackby(obj/item/attack_item, mob/user, list/modifiers, list/attack_modifiers)
if(!linked_account && isliving(user))
var/mob/living/living_user = user
var/obj/item/card/id/card_used = living_user.get_idcard(TRUE)
diff --git a/code/modules/wiremod/components/abstract/module.dm b/code/modules/wiremod/components/abstract/module.dm
index 1579025e60a..af9adddcc75 100644
--- a/code/modules/wiremod/components/abstract/module.dm
+++ b/code/modules/wiremod/components/abstract/module.dm
@@ -229,7 +229,7 @@
. = list()
.["global_port_types"] = GLOB.wiremod_basic_types
-/obj/item/circuit_component/module/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/circuit_component/module/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
if(istype(I, /obj/item/circuit_component))
internal_circuit.attackby(I, user, modifiers)
return
diff --git a/code/modules/wiremod/components/action/mmi.dm b/code/modules/wiremod/components/action/mmi.dm
index aaf924f8d71..3a8cc85b00b 100644
--- a/code/modules/wiremod/components/action/mmi.dm
+++ b/code/modules/wiremod/components/action/mmi.dm
@@ -155,7 +155,7 @@
return TRUE
-/obj/item/circuit_component/mmi/proc/handle_mmi_attack(mob/living/source, atom/target, list/modifiers)
+/obj/item/circuit_component/mmi/proc/handle_mmi_attack(mob/living/source, atom/target, list/modifiers, list/attack_modifiers)
SIGNAL_HANDLER
if(modifiers[RIGHT_CLICK])
clicked_atom.set_output(target)
diff --git a/code/modules/wiremod/core/component_printer.dm b/code/modules/wiremod/core/component_printer.dm
index 5efa7255f09..f7835a6c1fe 100644
--- a/code/modules/wiremod/core/component_printer.dm
+++ b/code/modules/wiremod/core/component_printer.dm
@@ -205,7 +205,7 @@
return data
-/obj/machinery/component_printer/attackby(obj/item/weapon, mob/living/user, list/modifiers)
+/obj/machinery/component_printer/attackby(obj/item/weapon, mob/living/user, list/modifiers, list/attack_modifiers)
if (user.combat_mode)
return ..()
@@ -431,7 +431,7 @@
created_atom.pixel_x = created_atom.base_pixel_x + rand(-5, 5)
created_atom.pixel_y = created_atom.base_pixel_y + rand(-5, 5)
-/obj/machinery/module_duplicator/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/module_duplicator/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
var/list/data = list()
if(istype(weapon, /obj/item/circuit_component/module))
diff --git a/code/modules/wiremod/core/integrated_circuit.dm b/code/modules/wiremod/core/integrated_circuit.dm
index 7fe0b0029d9..bbd1303dd05 100644
--- a/code/modules/wiremod/core/integrated_circuit.dm
+++ b/code/modules/wiremod/core/integrated_circuit.dm
@@ -147,7 +147,7 @@ GLOBAL_LIST_EMPTY_TYPED(integrated_circuits, /obj/item/integrated_circuit)
SEND_SIGNAL(src, COMSIG_CIRCUIT_SET_LOCKED, new_value)
locked = new_value
-/obj/item/integrated_circuit/attackby(obj/item/I, mob/living/user, list/modifiers)
+/obj/item/integrated_circuit/attackby(obj/item/I, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if(istype(I, /obj/item/circuit_component))
add_component_manually(I, user)
diff --git a/code/modules/wiremod/core/usb_cable.dm b/code/modules/wiremod/core/usb_cable.dm
index 791ecab3735..9c07a5e9e48 100644
--- a/code/modules/wiremod/core/usb_cable.dm
+++ b/code/modules/wiremod/core/usb_cable.dm
@@ -38,7 +38,7 @@
if (!isnull(attached_circuit))
. += span_notice("It is attached to [attached_circuit.shell || attached_circuit].")
-/obj/item/usb_cable/pre_attack(atom/target, mob/living/user, list/modifiers)
+/obj/item/usb_cable/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers)
. = ..()
if (.)
return
diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm
index 00928610221..72d6ca75180 100644
--- a/code/modules/wiremod/shell/brain_computer_interface.dm
+++ b/code/modules/wiremod/shell/brain_computer_interface.dm
@@ -357,7 +357,7 @@
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
-/obj/machinery/bci_implanter/attackby(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/bci_implanter/attackby(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
var/obj/item/organ/cyberimp/bci/new_bci = weapon
if (istype(new_bci))
if (!(locate(/obj/item/integrated_circuit) in new_bci))
@@ -379,7 +379,7 @@
return ..()
-/obj/machinery/bci_implanter/attackby_secondary(obj/item/weapon, mob/user, list/modifiers)
+/obj/machinery/bci_implanter/attackby_secondary(obj/item/weapon, mob/user, list/modifiers, list/attack_modifiers)
if (!occupant && default_deconstruction_screwdriver(user, icon_state, icon_state, weapon))
update_appearance()
return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN
diff --git a/code/modules/wiremod/shell/dispenser.dm b/code/modules/wiremod/shell/dispenser.dm
index 57ae4acd56e..d31a5cb04c0 100644
--- a/code/modules/wiremod/shell/dispenser.dm
+++ b/code/modules/wiremod/shell/dispenser.dm
@@ -60,7 +60,7 @@
new /obj/item/circuit_component/dispenser_bot()
), SHELL_CAPACITY_LARGE)
-/obj/structure/dispenser_bot/attackby(obj/item/item, mob/living/user, list/modifiers)
+/obj/structure/dispenser_bot/attackby(obj/item/item, mob/living/user, list/modifiers, list/attack_modifiers)
if(user.combat_mode)
return ..()
if(istype(item, /obj/item/wrench) || istype(item, /obj/item/multitool) || istype(item, /obj/item/integrated_circuit))
diff --git a/code/modules/zombie/items.dm b/code/modules/zombie/items.dm
index 78f58204e36..74ecdf5213f 100644
--- a/code/modules/zombie/items.dm
+++ b/code/modules/zombie/items.dm
@@ -11,7 +11,7 @@
bare_wound_bonus = 15
sharpness = SHARP_EDGED
-/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, list/modifiers)
+/obj/item/mutant_hand/zombie/afterattack(atom/target, mob/user, list/modifiers, list/attack_modifiers)
if(ishuman(target))
try_to_zombie_infect(target, user, user.zone_selected)
else if(isliving(target))
diff --git a/modular_zubbers/code/modules/fluff/flora/ash_flora.dm b/modular_zubbers/code/modules/fluff/flora/ash_flora.dm
index 7e1c71f4a32..4c7c88d72c7 100644
--- a/modular_zubbers/code/modules/fluff/flora/ash_flora.dm
+++ b/modular_zubbers/code/modules/fluff/flora/ash_flora.dm
@@ -1,65 +1,6 @@
/obj/structure/flora/ash/cacti
can_uproot = TRUE
-/obj/structure/flora/attackby(obj/item/used_item, mob/living/user, params)
- if(user.combat_mode)
- return ..()
- if(flags_1 & HOLOGRAM_1)
- to_chat(user, "Your [used_item] goes right through \the [src]!")
- return ..()
- if(can_uproot && used_item.tool_behaviour == TOOL_SHOVEL)
- if(uprooted)
- if(locate(/obj/structure/flora) in (loc.contents - src))
- to_chat(user, span_warning("There's already a plant here!"))
- return
-
- user.visible_message(
- span_notice("[user] starts to replant [src]..."),
- span_notice("You start to replant [src]...")
- )
- used_item.play_tool_sound(src, 50)
- if(!do_after(user, harvest_time, src) || locate(/obj/structure/flora) in (loc.contents - src))
- return
-
- user.visible_message(
- span_notice("[user] replants [src]."),
- span_notice("You replant [src].")
- )
- replant()
- else
- user.visible_message(
- span_notice("[user] starts to uproot [src]..."),
- span_notice("You start to uproot [src]...")
- )
- used_item.play_tool_sound(src, 50)
- if(!do_after(user, harvest_time, src))
- return
-
- user.visible_message(
- span_notice("[user] uproots [src]."),
- span_notice("You uproot [src].")
- )
- uproot()
-
- used_item.play_tool_sound(src, 50)
- return
-
- if(!can_harvest(user, used_item))
- return ..()
-
- user.visible_message(
- span_notice("[user] starts to [harvest_verb] [src]..."),
- span_notice("You start to [harvest_verb] [src] with [used_item]...")
- )
- play_attack_sound(used_item.force)
- if(!do_after(user, harvest_time * used_item.toolspeed, src))
- return
- visible_message(span_notice("[user] [harvest_verb][harvest_verb_suffix] [src]."), ignored_mobs = list(user))
- play_attack_sound(used_item.force)
-
- if(harvest(user))
- after_harvest(user)
-
/obj/structure/flora/ash/cacti/uproot(mob/living/user)
. = ..()
qdel(GetComponent(/datum/component/caltrop))