diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm
index e5f903a1853..28e213c7826 100644
--- a/code/game/objects/items/weapons/weaponry.dm
+++ b/code/game/objects/items/weapons/weaponry.dm
@@ -185,6 +185,7 @@
throwforce = 12
attack_verb = list("beat", "smacked")
w_class = WEIGHT_CLASS_HUGE
+ var/next_throw_time = 0
var/homerun_ready = 0
var/homerun_able = 0
@@ -253,16 +254,38 @@
to_chat(user, "You cannot attack in deflect mode!")
return
. = ..()
- var/atom/throw_target = get_edge_target_turf(target, user.dir)
if(homerun_ready)
+ var/atom/throw_target = get_edge_target_turf(target, user.dir)
user.visible_message("It's a home run!")
target.throw_at(throw_target, rand(8,10), 14, user)
target.ex_act(2)
playsound(get_turf(src), 'sound/weapons/homerun.ogg', 100, 1)
homerun_ready = 0
return
- else if(!target.anchored)
- target.throw_at(throw_target, rand(1,2), 7, user)
+ if(world.time < next_throw_time)
+ // Limit the rate of throwing, so you can't spam it.
+ return
+ if(!istype(target))
+ // Should already be /mob/living, but check anyway.
+ return
+ if(target.anchored)
+ // No throwing mobs that are anchored to the floor.
+ return
+ if(target.mob_size > MOB_SIZE_HUMAN)
+ // No throwing things that are physically bigger than you are.
+ // Covers: blobbernaut, alien empress, ai core, juggernaut, ed209, mulebot, alien/queen/large, carp/megacarp, deathsquid, hostile/tree, megafauna, hostile/asteroid, terror_spider/queen/empress
+ return
+ if(!(target.status_flags & CANPUSH))
+ // No throwing mobs specifically flagged as immune to being pushed.
+ // Covers: revenant, hostile/blob/*, most borgs, juggernauts, hivebot/tele, spaceworms, shades, bots, alien queens, hostile/syndicate/melee, hostile/asteroid
+ return
+ if(target.move_resist > MOVE_RESIST_DEFAULT)
+ // No throwing mobs that have higher than normal move_resist.
+ // Covers: revenant, bot/mulebot, hostile/statue, hostile/megafauna, goliath
+ return
+ var/atom/throw_target = get_edge_target_turf(target, user.dir)
+ target.throw_at(throw_target, rand(1, 2), 7, user)
+ next_throw_time = world.time + 10 SECONDS
/obj/item/melee/baseball_bat/ablative
name = "metal baseball bat"