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