Re-refactors batons / Refactors attack chain force modifiers (#90809)

Melee attack chain now has a list passed along with it,
`attack_modifiers`, which you can stick force modifiers to change the
resulting attack

This is basically a soft implementation of damage packets until a more
definitive pr, but one that only applies to item attack chain, and not
unarmed attacks.

This change was done to facilitate a baton refactor - batons no longer
hack together their own attack chain, and are now integrated straight
into the real attack chain. This refactor itself was done because batons
don't send any attack signals, which has been annoying in the past (for
swing combat).

🆑 Melbert
refactor: Batons have been refactored again. Baton stuns now properly
count as an attack, when before it was a nothing. Report any oddities,
particularly in regards to harmbatonning vs normal batonning.
refactor: The method of adjusting item damage mid-attack has been
refactored - some affected items include the Nullblade and knives.
Report any strange happenings with damage numbers.
refactor: A few objects have been moved to the new interaction chain -
records consoles, mawed crucible, alien weeds and space vines, hedges,
restaurant portals, and some mobs - to name a few.
fix: Spears only deal bonus damage against secure lockers, not all
closet types (including crates)
/🆑
This commit is contained in:
MrMelbert
2025-05-18 22:32:12 -05:00
committed by Roxy
parent fec7efbdae
commit bc2215667f
484 changed files with 1088 additions and 1144 deletions
+2 -2
View File
@@ -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)
+1
View File
@@ -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)
@@ -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)
@@ -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
+1 -1
View File
@@ -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"))
@@ -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
@@ -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)
@@ -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)
@@ -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)
@@ -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
@@ -222,7 +222,7 @@
. = ..()
. += span_notice("<b>Right-click</b> 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 ..()
@@ -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."))
@@ -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)
@@ -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
@@ -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)
@@ -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!")
+4 -4
View File
@@ -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
@@ -81,7 +81,7 @@
if(created_name)
. += span_notice("There is a small <i>paper</i> 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)
+1 -1
View File
@@ -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))
@@ -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)
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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 ..()
+1 -1
View File
@@ -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)
+1 -5
View File
@@ -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)
. = ..()
+1 -1
View File
@@ -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)
+3 -3
View File
@@ -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))
+1 -1
View File
@@ -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))
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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)
+4 -4
View File
@@ -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
@@ -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 ..()
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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 <b>cut</b>, but the <i>heat treatment will shatter off</i>. There's space for a <i>tile</i>.")
/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
@@ -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 ..()
@@ -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
+2 -2
View File
@@ -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
+5 -7
View File
@@ -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)
+1 -1
View File
@@ -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 ..()
+1 -1
View File
@@ -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!"))
@@ -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
@@ -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."))
+1 -1
View File
@@ -82,7 +82,7 @@
else
. += span_notice("The railing is <i>unbolted</i> from the floor and can be deconstructed with <b>wirecutters</b>.")
/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)
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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")
+1 -1
View File
@@ -39,7 +39,7 @@
else
. += span_notice("It looks like you could probably scan and tag it with a <b>[scanner_descriptor]</b>.")
/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
+1 -1
View File
@@ -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)
@@ -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)
+1 -1
View File
@@ -42,7 +42,7 @@
. += "It is empty."
. += span_notice("It is held together by some <b>screws</b>.")
/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)
+1 -1
View File
@@ -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 ..()
@@ -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 .
@@ -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)
@@ -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)
@@ -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)
+1 -1
View File
@@ -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)
@@ -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)
@@ -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)
@@ -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!"))
@@ -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
@@ -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)
+2 -2
View File
@@ -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