From f9f82fd4181186c0e6fc2d9db25cb5222f92e7d3 Mon Sep 17 00:00:00 2001 From: HMBGERDO <61080616+HMBGERDO@users.noreply.github.com> Date: Sun, 28 Jan 2024 23:18:13 +0100 Subject: [PATCH] Thrown mobs cant move until the throw ends (#23775) * if you being throwed, you're not moving * throw block_movement variable * forgot arg here * tether might keep movement * Update code/controllers/subsystem/SSthrowing.dm Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --------- Co-authored-by: Luc <89928798+lewcc@users.noreply.github.com> --- code/controllers/subsystem/SSthrowing.dm | 2 ++ code/game/atoms_movable.dm | 3 ++- code/modules/mob/living/living.dm | 2 +- code/modules/mob/mob_movement.dm | 8 +++++--- code/modules/mod/modules/modules_engineering.dm | 2 +- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/code/controllers/subsystem/SSthrowing.dm b/code/controllers/subsystem/SSthrowing.dm index 606c762bb10b..10944b42c338 100644 --- a/code/controllers/subsystem/SSthrowing.dm +++ b/code/controllers/subsystem/SSthrowing.dm @@ -70,6 +70,8 @@ SUBSYSTEM_DEF(throwing) var/last_move = 0 ///When this variable is false, non dense mobs will be hit by a thrown item. useful for things that you dont want to be cheesed by crawling, EG. gravitational anomalies var/dodgeable = TRUE + /// Can a thrown mob move themselves to stop the throw? + var/block_movement = TRUE /datum/thrownthing/proc/tick() var/atom/movable/AM = thrownthing diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index a2a2294907b2..47976777b89d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -394,7 +394,7 @@ step(src, AM.dir) ..() -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, dodgeable = TRUE) +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = INFINITY, dodgeable = TRUE, block_movement = TRUE) if(!target || (flags & NODROP) || speed <= 0) return 0 @@ -435,6 +435,7 @@ TT.diagonals_first = diagonals_first TT.callback = callback TT.dodgeable = dodgeable + TT.block_movement = block_movement var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c5bc2f29f64f..61d972c71eab 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1116,7 +1116,7 @@ if("lighting_alpha") sync_lighting_plane_alpha() -/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, dodgeable) +/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin, diagonals_first, datum/callback/callback, force, dodgeable, block_movement) stop_pulling() return ..() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 5d77f2031a6d..117d256420e6 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -68,6 +68,9 @@ if(mob.notransform) return 0 //This is sota the goto stop mobs from moving var + if(mob.throwing && mob.throwing.block_movement) + return + if(mob.control_object) return Move_object(direct) @@ -182,9 +185,8 @@ mob.setDir(get_dir(mob, mob.pulling)) // Face welding tanks and stuff when pulling moving = 0 - if(mob && .) - if(mob.throwing) - mob.throwing.finalize(FALSE) + if(mob && . && mob.throwing) + mob.throwing.finalize(FALSE) for(var/obj/O in mob) O.on_mob_move(direct, mob) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 5641545940cc..f87ae33c3a57 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -145,7 +145,7 @@ if(firer && isliving(firer)) var/mob/living/L = firer L.apply_status_effect(STATUS_EFFECT_IMPACT_IMMUNE) - L.throw_at(target, 15, 1, L, FALSE, FALSE, callback = CALLBACK(L, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_IMPACT_IMMUNE)) + L.throw_at(target, 15, 1, L, FALSE, FALSE, callback = CALLBACK(L, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_IMPACT_IMMUNE), block_movement = FALSE) /obj/item/projectile/tether/Destroy() QDEL_NULL(chain)