diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 073cd0df669..f9cf71271fc 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -331,7 +331,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
else
return ..()
-/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
+/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK, atom/movable/AM)
SEND_SIGNAL(src, COMSIG_ITEM_HIT_REACT, args)
if(prob(final_block_chance))
owner.visible_message("[owner] blocks [attack_text] with [src]!")
diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index 78f23b6c92a..f42decd4363 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -171,6 +171,40 @@
desc = "This thing looks dangerous... Dangerously good at baseball, that is."
homerun_able = 1
+/obj/item/melee/baseball_bat/hit_reaction(mob/living/carbon/human/owner, attack_text, final_block_chance, damage, attack_type, atom/movable/AM)
+ . = ..()
+ if(!istype(AM, /obj/item) || attack_type != THROWN_PROJECTILE_ATTACK)
+ return FALSE
+ var/obj/item/I = AM
+ if(I.w_class <= WEIGHT_CLASS_NORMAL || istype(I, /obj/item/beach_ball)) // baseball bat deflecting
+ if(deflectmode)
+ if(prob(10))
+ visible_message("[owner] Deflects [I] directly back at the thrower! It's a home run!", "You deflect the [I] directly back at the thrower! It's a home run!")
+ playsound(get_turf(owner), 'sound/weapons/homerun.ogg', 100, 1)
+ do_attack_animation(I, ATTACK_EFFECT_DISARM)
+ I.throw_at(I.thrownby, 20, 20, owner)
+ deflectmode = FALSE
+ if(!istype(I, /obj/item/beach_ball))
+ lastdeflect = world.time + 3000
+ return TRUE
+ else if(prob(30))
+ visible_message("[owner] swings! And [p_they()] miss[p_es()]! How embarassing.", "You swing! You miss! Oh no!")
+ playsound(get_turf(owner), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ do_attack_animation(get_step(owner, pick(alldirs)), ATTACK_EFFECT_DISARM)
+ deflectmode = FALSE
+ if(!istype(I, /obj/item/beach_ball))
+ lastdeflect = world.time + 3000
+ return FALSE
+ else
+ visible_message("[owner] swings and deflects [I]!", "You swing and deflect the [I]!")
+ playsound(get_turf(owner), 'sound/weapons/baseball_hit.ogg', 50, 1, -1)
+ do_attack_animation(I, ATTACK_EFFECT_DISARM)
+ I.throw_at(get_edge_target_turf(owner, pick(cardinal)), rand(8,10), 14, owner)
+ deflectmode = FALSE
+ if(!istype(I, /obj/item/beach_ball))
+ lastdeflect = world.time + 3000
+ return TRUE
+
/obj/item/melee/baseball_bat/attack_self(mob/user)
if(!homerun_able)
if(!deflectmode && world.time >= lastdeflect)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index d147b52577c..d172fabef00 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -141,19 +141,19 @@ emp_act
if(l_hand && !istype(l_hand, /obj/item/clothing))
var/final_block_chance = l_hand.block_chance - (Clamp((armour_penetration-l_hand.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example
- if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ if(l_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(r_hand && !istype(r_hand, /obj/item/clothing))
var/final_block_chance = r_hand.block_chance - (Clamp((armour_penetration-r_hand.armour_penetration)/2,0,100)) + block_chance_modifier //Need to reset the var so it doesn't carry over modifications between attempts
- if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ if(r_hand.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(wear_suit)
var/final_block_chance = wear_suit.block_chance - (Clamp((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier
- if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ if(wear_suit.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
if(w_uniform)
var/final_block_chance = w_uniform.block_chance - (Clamp((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier
- if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type))
+ if(w_uniform.hit_reaction(src, attack_text, final_block_chance, damage, attack_type, AM))
return 1
return 0
@@ -311,39 +311,6 @@ emp_act
throwpower = I.throwforce
if(I.thrownby == src) //No throwing stuff at yourself to trigger reactions
return ..()
- if(I.w_class <= WEIGHT_CLASS_NORMAL || istype(I, /obj/item/beach_ball)) // baseball bat deflecting
- var/obj/item/melee/baseball_bat/B
- if(l_hand && istype(l_hand, /obj/item/melee/baseball_bat))
- B = l_hand
- else if(r_hand && istype(r_hand, /obj/item/melee/baseball_bat))
- B = r_hand
- if(B && B.deflectmode)
- if(prob(10))
- visible_message("[src] Deflects the [I] directly back at the thrower! It's a home run!", "You deflect the [I] directly back at the thrower! It's a home run!")
- playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, 1)
- do_attack_animation(I, ATTACK_EFFECT_DISARM)
- I.throw_at(I.thrownby, 20, 20, src)
- B.deflectmode = FALSE
- if(!istype(I, /obj/item/beach_ball))
- B.lastdeflect = world.time + 3000
- return TRUE
- else if(prob(30))
- visible_message("[src] swings! And [p_they()] miss[p_es()]! How embarassing.", "You swing! You miss! Oh no!")
- playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
- do_attack_animation(get_step(src,pick(alldirs)), ATTACK_EFFECT_DISARM)
- B.deflectmode = FALSE
- if(!istype(I, /obj/item/beach_ball))
- B.lastdeflect = world.time + 3000
- return ..()
- else
- visible_message("[src] swings and deflects the [I]!", "You swing and deflect the [I]!")
- playsound(get_turf(src), 'sound/weapons/baseball_hit.ogg', 50, 1, -1)
- do_attack_animation(I, ATTACK_EFFECT_DISARM)
- I.throw_at(get_edge_target_turf(src,pick(alldirs)), rand(8,10), 14, src)
- B.deflectmode = FALSE
- if(!istype(I, /obj/item/beach_ball))
- B.lastdeflect = world.time + 3000
- return TRUE
if(check_shields(throwpower, "\the [AM.name]", AM, THROWN_PROJECTILE_ATTACK))
hitpush = 0
skipcatch = 1