diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm
index abc0507bf4..8c8e03d865 100644
--- a/code/__DEFINES/_flags/_flags.dm
+++ b/code/__DEFINES/_flags/_flags.dm
@@ -137,3 +137,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_PICKUP | MOBILITY_USE | MOBILITY_UI | MOBILITY_STORAGE | MOBILITY_PULL | MOBILITY_RESIST)
#define MOBILITY_FLAGS_ANY_INTERACTION (MOBILITY_USE | MOBILITY_PICKUP | MOBILITY_UI | MOBILITY_STORAGE)
+
+// melee_attack_chain() attackchain_flags
+/// The attack is from a parry counterattack.
+#define ATTACKCHAIN_PARRY_COUNTERATTACK (1<<0)
diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index cdb5c48dbd..2380c447b4 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -115,18 +115,6 @@
#define GRAB_NECK 2
#define GRAB_KILL 3
-/// Attack types for check_block()/run_block(). Flags, combinable.
-/// Attack was melee, whether or not armed.
-#define ATTACK_TYPE_MELEE (1<<0)
-/// Attack was with a gun or something that should count as a gun (but not if a gun shouldn't count for a gun, crazy right?)
-#define ATTACK_TYPE_PROJECTILE (1<<1)
-/// Attack was unarmed.. this usually means hand to hand combat.
-#define ATTACK_TYPE_UNARMED (1<<2)
-/// Attack was a thrown atom hitting the victim.
-#define ATTACK_TYPE_THROWN (1<<3)
-/// Attack was a bodyslam/leap/tackle. See: Xenomorph leap tackles.
-#define ATTACK_TYPE_TACKLE (1<<4)
-
//attack visual effects
#define ATTACK_EFFECT_PUNCH "punch"
#define ATTACK_EFFECT_KICK "kick"
diff --git a/code/__DEFINES/combat/attack_types b/code/__DEFINES/combat/attack_types
new file mode 100644
index 0000000000..409e74966b
--- /dev/null
+++ b/code/__DEFINES/combat/attack_types
@@ -0,0 +1,13 @@
+// Attack types for check_block()/run_block(). Flags, combinable.
+/// Attack was melee, whether or not armed.
+#define ATTACK_TYPE_MELEE (1<<0)
+/// Attack was with a gun or something that should count as a gun (but not if a gun shouldn't count for a gun, crazy right?)
+#define ATTACK_TYPE_PROJECTILE (1<<1)
+/// Attack was unarmed.. this usually means hand to hand combat.
+#define ATTACK_TYPE_UNARMED (1<<2)
+/// Attack was a thrown atom hitting the victim.
+#define ATTACK_TYPE_THROWN (1<<3)
+/// Attack was a bodyslam/leap/tackle. See: Xenomorph leap tackles.
+#define ATTACK_TYPE_TACKLE (1<<4)
+/// Attack was from a parry counterattack. Do not attempt to parry-this!
+#define ATTACK_TYPE_PARRY_COUNTERATTACK (1<<5)
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index 7ffb870971..10dca449fa 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -7,7 +7,7 @@
*and lastly
*afterattack. The return value does not matter.
*/
-/obj/item/proc/melee_attack_chain(mob/user, atom/target, params)
+/obj/item/proc/melee_attack_chain(mob/user, atom/target, params, flags, damage_multiplier = 1)
if(isliving(user))
var/mob/living/L = user
if(item_flags & NO_ATTACK_CHAIN_SOFT_STAMCRIT)
@@ -21,7 +21,7 @@
return
if(pre_attack(target, user, params))
return
- if(target.attackby(src,user, params))
+ if(target.attackby(src, user, params, flags, damage_multiplier))
return
if(QDELETED(src) || QDELETED(target))
return
@@ -56,13 +56,13 @@
/obj/attackby(obj/item/I, mob/living/user, params)
return ..() || ((obj_flags & CAN_BE_HIT) && I.attack_obj(src, user))
-/mob/living/attackby(obj/item/I, mob/living/user, params)
+/mob/living/attackby(obj/item/I, mob/living/user, params, attackchain_flags, damage_multiplier)
if(..())
return TRUE
user.changeNext_move(CLICK_CD_MELEE)
- return I.attack(src, user)
+ return I.attack(src, user, attackchain_flags, damage_multiplier)
-/obj/item/proc/attack(mob/living/M, mob/living/user)
+/obj/item/proc/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(SEND_SIGNAL(src, COMSIG_ITEM_ATTACK, M, user) & COMPONENT_ITEM_NO_ATTACK)
return
SEND_SIGNAL(user, COMSIG_MOB_ITEM_ATTACK, M, user)
@@ -86,7 +86,7 @@
M.lastattackerckey = user.ckey
user.do_attack_animation(M)
- M.attacked_by(src, user)
+ M.attacked_by(src, user, attackchain_flags, damage_multiplier)
log_combat(user, M, "attacked", src.name, "(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])")
add_fingerprint(user)
@@ -110,8 +110,8 @@
/atom/movable/proc/attacked_by()
return
-/obj/attacked_by(obj/item/I, mob/living/user)
- var/totitemdamage = I.force
+/obj/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
+ var/totitemdamage = I.force * damage_multiplier
var/bad_trait
if(!SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))
totitemdamage *= 0.5
@@ -129,10 +129,10 @@
log_combat(user, src, "attacked", I)
take_damage(totitemdamage, I.damtype, "melee", 1)
-/mob/living/attacked_by(obj/item/I, mob/living/user)
+/mob/living/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
var/list/block_return = list()
- var/totitemdamage = pre_attacked_by(I, user)
- if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS)
+ var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier
+ if((user != src) && mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, null, block_return) & BLOCK_SUCCESS)
return FALSE
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
send_item_attack_message(I, user)
@@ -148,7 +148,7 @@
user.add_mob_blood(src)
return TRUE //successful attack
-/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user)
+/mob/living/simple_animal/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(I.force < force_threshold || I.damtype == STAMINA)
playsound(loc, 'sound/weapons/tap.ogg', I.get_clamped_volume(), 1, -1)
else
diff --git a/code/game/gamemodes/gangs/dominator.dm b/code/game/gamemodes/gangs/dominator.dm
index af75315ded..db145ffacc 100644
--- a/code/game/gamemodes/gangs/dominator.dm
+++ b/code/game/gamemodes/gangs/dominator.dm
@@ -145,9 +145,9 @@
new /obj/item/stack/sheet/plasteel(src.loc)
qdel(src)
-/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user)
+/obj/machinery/dominator/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
add_fingerprint(user)
- ..()
+ return ..()
/obj/machinery/dominator/attack_hand(mob/user)
if(operating || (stat & BROKEN))
@@ -240,4 +240,4 @@
#undef DOM_BLOCKED_SPAM_CAP
#undef DOM_REQUIRED_TURFS
-#undef DOM_HULK_HITS_REQUIRED
\ No newline at end of file
+#undef DOM_HULK_HITS_REQUIRED
diff --git a/code/game/machinery/porta_turret/portable_turret_cover.dm b/code/game/machinery/porta_turret/portable_turret_cover.dm
index afb00d4ee2..5b029a6bf7 100644
--- a/code/game/machinery/porta_turret/portable_turret_cover.dm
+++ b/code/game/machinery/porta_turret/portable_turret_cover.dm
@@ -70,8 +70,8 @@
else
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, attackchain_flags = NONE, damage_multiplier = 1)
+ parent_turret.attacked_by(I, user, attackchain_flags, damage_multiplier)
/obj/machinery/porta_turret_cover/attack_alien(mob/living/carbon/alien/humanoid/user)
parent_turret.attack_alien(user)
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index 1fe7f74dec..395ac810f4 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -282,9 +282,9 @@
else
return ..()
-/obj/mecha/attacked_by(obj/item/I, mob/living/user)
+/obj/mecha/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
mecha_log_message("Attacked by [I]. Attacker - [user]")
- ..()
+ return ..()
/obj/mecha/proc/mech_toxin_damage(mob/living/target)
playsound(src, 'sound/effects/spray2.ogg', 50, 1)
diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm
index 4eedfc12fb..dcccf9149a 100644
--- a/code/game/objects/items/melee/misc.dm
+++ b/code/game/objects/items/melee/misc.dm
@@ -61,7 +61,6 @@
force = 18
throwforce = 15
w_class = WEIGHT_CLASS_BULKY
- block_chance = 50
armour_penetration = 75
sharpness = IS_SHARP
attack_verb = list("slashed", "cut")
@@ -72,12 +71,12 @@
block_parry_data = /datum/block_parry_data/captain_saber
/datum/block_parry_data/captain_saber
- parry_time_windup = 1
- parry_time_active = 3
+ parry_time_windup = 0.5
+ parry_time_active = 4
parry_time_spindown = 1
- parry_time_perfect = 1.5
- parry_time_perfect_leeway = 0.25
- parry_imperfect_falloff_percent = 20
+ parry_time_perfect = 0.75
+ parry_time_perfect_leeway = 0.75
+ parry_imperfect_falloff_percent = 30
parry_efficiency_perfect = 100
parry_failed_stagger_duration = 3 SECONDS
parry_failed_clickcd_duration = 2 SECONDS
diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm
index 1b245b5a01..6e6754eca2 100644
--- a/code/modules/antagonists/devil/true_devil/_true_devil.dm
+++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm
@@ -117,9 +117,9 @@
return 2
-/mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone)
+/mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone, attackchain_flags = NONE, damage_multiplier = 1)
var/weakness = check_weakness(I, user)
- apply_damage(I.force * weakness, I.damtype, def_zone)
+ apply_damage(I.force * weakness * damage_multiplier, I.damtype, def_zone)
var/message_verb = ""
if(I.attack_verb && I.attack_verb.len)
message_verb = "[pick(I.attack_verb)]"
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 8bf0554070..825ce84f1c 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -147,7 +147,7 @@
/obj/machinery/portable_atmospherics/analyzer_act(mob/living/user, obj/item/I)
atmosanalyzer_scan(air_contents, user, src)
-/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user)
+/obj/machinery/portable_atmospherics/attacked_by(obj/item/I, mob/user, attackchain_flags = NONE, damage_multiplier = 1)
if(I.force < 10 && !(stat & BROKEN))
take_damage(0)
else
diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm
index 69bfa6e569..05c098f767 100644
--- a/code/modules/events/spacevine.dm
+++ b/code/modules/events/spacevine.dm
@@ -330,8 +330,8 @@
if(!override)
qdel(src)
-/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user)
- var/damage_dealt = I.force
+/obj/structure/spacevine/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
+ var/damage_dealt = I.force * damage_multiplier
if(I.get_sharpness())
damage_dealt *= 4
if(I.damtype == BURN)
diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm
index 0ec2f16815..f9d38828e3 100644
--- a/code/modules/mob/living/carbon/carbon_defense.dm
+++ b/code/modules/mob/living/carbon/carbon_defense.dm
@@ -76,11 +76,11 @@
visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!")
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded)
-/mob/living/carbon/attacked_by(obj/item/I, mob/living/user)
- var/totitemdamage = pre_attacked_by(I, user)
+/mob/living/carbon/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
+ var/totitemdamage = pre_attacked_by(I, user) * damage_multiplier
var/impacting_zone = (user == src)? check_zone(user.zone_selected) : ran_zone(user.zone_selected)
var/list/block_return = list()
- if((user != src) && (mob_run_block(I, totitemdamage, "the [I]", ATTACK_TYPE_MELEE, I.armour_penetration, user, impacting_zone, block_return) & BLOCK_SUCCESS))
+ if((user != src) && (mob_run_block(I, totitemdamage, "the [I]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, impacting_zone, block_return) & BLOCK_SUCCESS))
return FALSE
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
var/obj/item/bodypart/affecting = get_bodypart(impacting_zone)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index f1281171a1..6f013f560a 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -78,7 +78,7 @@
..()
-/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user)
+/mob/living/carbon/human/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(!I || !user)
return 0
@@ -95,7 +95,7 @@
SSblackbox.record_feedback("tally", "zone_targeted", 1, target_area)
// the attacked_by code varies among species
- return dna.species.spec_attacked_by(I, user, affecting, a_intent, src)
+ return dna.species.spec_attacked_by(I, user, affecting, a_intent, src, attackchain_flags, damage_multiplier)
/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE)
if(user.a_intent == INTENT_HARM)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index de55ef388a..e1a7a3b221 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1700,12 +1700,12 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if("disarm")
disarm(M, H, attacker_style)
-/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H)
- var/totitemdamage = H.pre_attacked_by(I, user)
+/datum/species/proc/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, intent, mob/living/carbon/human/H, attackchain_flags = NONE, damage_multiplier = 1)
+ var/totitemdamage = H.pre_attacked_by(I, user) * damage_multiplier
// Allows you to put in item-specific reactions based on species
if(user != H)
var/list/block_return = list()
- if(H.mob_run_block(I, totitemdamage, "the [I.name]", ATTACK_TYPE_MELEE, I.armour_penetration, user, affecting.body_zone, block_return) & BLOCK_SUCCESS)
+ if(H.mob_run_block(I, totitemdamage, "the [I.name]", ((attackchain_flags & ATTACKCHAIN_PARRY_COUNTERATTACK)? ATTACK_TYPE_PARRY_COUNTERATTACK : NONE) | ATTACK_TYPE_MELEE, I.armour_penetration, user, affecting.body_zone, block_return) & BLOCK_SUCCESS)
return 0
totitemdamage = block_calculate_resultant_damage(totitemdamage, block_return)
if(H.check_martial_melee_block())
diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm
index 00cc20f7bc..609312917e 100644
--- a/code/modules/mob/living/living_active_parry.dm
+++ b/code/modules/mob/living/living_active_parry.dm
@@ -93,7 +93,7 @@
*/
/mob/living/proc/handle_parry_starting_effects(datum/block_parry_data/data)
playsound(src, data.parry_start_sound, 75, 1)
- parry_visual_effect = new /obj/effect/abstract/parry/main(null, data, src, data.parry_effect_icon_state)
+ parry_visual_effect = new /obj/effect/abstract/parry/main(null, TRUE, src, data.parry_effect_icon_state, data.parry_time_windup_visual_override || data.parry_time_windup, data.parry_time_active_visual_override || data.parry_time_active, data.parry_time_spindown_visual_override || data.parry_time_spindown)
switch(parrying)
if(ITEM_PARRY)
visible_message("[src] swings [active_parry_item]!")
@@ -303,13 +303,13 @@
/obj/effect/abstract/parry/main
name = null
-/obj/effect/abstract/parry/main/Initialize(mapload, datum/block_parry_data/data, mob/living/owner, icon_state)
+/obj/effect/abstract/parry/main/Initialize(mapload, autorun, mob/living/owner, set_icon_state, windup, active, spindown)
. = ..()
- src.icon_state = icon_state
+ icon_state = set_icon_state
if(owner)
attach_to(owner)
- if(data)
- INVOKE_ASYNC(src, .proc/run_animation, data.parry_time_windup, data.parry_time_active, data.parry_time_spindown, TRUE)
+ if(autorun)
+ INVOKE_ASYNC(src, .proc/run_animation, windup, active, spindown)
/obj/effect/abstract/parry/main/Destroy()
detach_from(owner)
@@ -326,9 +326,7 @@
owner = null
detaching.vis_contents -= src
-/obj/effect/abstract/parry/main/proc/run_animation(windup_time = 2, active_time = 5, spindown_time = 3, qdel_end = TRUE)
- if(qdel_end)
- QDEL_IN(src, windup_time + active_time + spindown_time)
+/obj/effect/abstract/parry/main/proc/run_animation(windup_time = 2, active_time = 5, spindown_time = 3)
var/matrix/current = transform
transform = matrix(0.1, 0, 0, 0, 0.1, 0)
animate(src, transform = current, time = windup_time)
diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm
index 1f4eae5ffb..3ae82dcd39 100644
--- a/code/modules/mob/living/living_blocking_parrying.dm
+++ b/code/modules/mob/living/living_blocking_parrying.dm
@@ -102,6 +102,13 @@ GLOBAL_LIST_EMPTY(block_parry_data)
var/parry_time_spindown = 3
/// Main parry window in deciseconds. This is between [parry_time_windup] and [parry_time_spindown]
var/parry_time_active = 5
+ // Visual overrides
+ /// If set, overrides visual duration of windup
+ var/parry_time_windup_visual_override
+ /// If set, overrides visual duration of active period
+ var/parry_time_active_visual_override
+ /// If set, overrides visual duration of spindown
+ var/parry_time_spindown_visual_override
/// Perfect parry window in deciseconds from the start of the main window. 3 with main 5 = perfect on third decisecond of main window.
var/parry_time_perfect = 2.5
/// Time on both sides of perfect parry that still counts as part of the perfect window.
@@ -122,7 +129,7 @@ GLOBAL_LIST_EMPTY(block_parry_data)
var/parry_efficiency_considered_successful = 0.1
/// Efficiency must be at least this to run automatic counterattack
var/parry_efficiency_to_counterattack = 0.1
- /// Maximum attacks to parry successfully or unsuccessfully during active period, hitting this immediately ends the sequence.
+ /// Maximum attacks to parry successfully or unsuccessfully (but not efficiency < 0) during active period, hitting this immediately ends the sequence.
var/parry_max_attacks = INFINITY
/// Visual icon state override for parrying
var/parry_effect_icon_state = "parry_bm_hold"
diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm
index 2bcb3c9b5a..9cefa7a12f 100644
--- a/code/modules/mob/living/silicon/ai/ai_defense.dm
+++ b/code/modules/mob/living/silicon/ai/ai_defense.dm
@@ -1,4 +1,4 @@
-/mob/living/silicon/ai/attacked_by(obj/item/I, mob/living/user, def_zone)
+/mob/living/silicon/ai/attacked_by(obj/item/I, mob/living/user, def_zone, attackchain_flags = NONE, damage_multiplier = 1)
. = ..()
if(!.)
return FALSE
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index e41fa7c896..e8991df358 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -117,7 +117,7 @@
Move(get_step(src,chosen_dir))
face_atom(target) //Looks better if they keep looking at you when dodging
-/mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user)
+/mob/living/simple_animal/hostile/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && user)
FindTarget(list(user), 1)
return ..()
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
index 116082d571..8ebd384b20 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm
@@ -103,7 +103,7 @@ IGNORE_PROC_IF_NOT_TARGET(attack_slime)
return BULLET_ACT_FORCE_PIERCE
return ..()
-/mob/living/simple_animal/hostile/asteroid/curseblob/attacked_by(obj/item/I, mob/living/L)
+/mob/living/simple_animal/hostile/asteroid/curseblob/attacked_by(obj/item/I, mob/living/L, attackchain_flags = NONE, damage_multiplier = 1)
if(L != set_target)
return
return ..()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 3c3f3c9541..c18eebbb55 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -506,7 +506,7 @@
cell = null
qdel(src)
-/obj/machinery/light/attacked_by(obj/item/I, mob/living/user)
+/obj/machinery/light/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
..()
if(status == LIGHT_BROKEN || status == LIGHT_EMPTY)
if(on && (I.flags_1 & CONDUCT_1))
diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm
index dc6cccb9a9..365a9abd3c 100644
--- a/code/modules/vehicles/cars/car.dm
+++ b/code/modules/vehicles/cars/car.dm
@@ -49,7 +49,7 @@
mob_exit(M, silent)
return TRUE
-/obj/vehicle/sealed/car/attacked_by(obj/item/I, mob/living/user)
+/obj/vehicle/sealed/car/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
if(!I.force)
return
if(occupants[user])
@@ -85,4 +85,4 @@
if(!silent)
M.visible_message("[M] is forced into \the [src]!")
M.forceMove(src)
- add_occupant(M, VEHICLE_CONTROL_KIDNAPPED)
\ No newline at end of file
+ add_occupant(M, VEHICLE_CONTROL_KIDNAPPED)
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index 2b9890b863..cd21b61dbe 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -36,7 +36,7 @@
visible_message("[src] spews out a ton of space lube!")
new /obj/effect/particle_effect/foam(loc) //YEET
-/obj/vehicle/sealed/car/clowncar/attacked_by(obj/item/I, mob/living/user)
+/obj/vehicle/sealed/car/clowncar/attacked_by(obj/item/I, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1)
. = ..()
if(istype(I, /obj/item/reagent_containers/food/snacks/grown/banana))
var/obj/item/reagent_containers/food/snacks/grown/banana/banana = I
@@ -129,4 +129,4 @@
icon_state = initial(icon_state)
/obj/vehicle/sealed/car/clowncar/proc/StopDroppingOil()
- droppingoil = FALSE
\ No newline at end of file
+ droppingoil = FALSE