From 3d8312e4e6641eaa82bfa1a7ccdc6b7d5a2a7316 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Wed, 14 Aug 2024 16:35:19 +0200 Subject: [PATCH] [MIRROR] Ash drakes no longer get stuck in flight if their target changes Z levels or is destroyed and doesn't spawn lavaland turfs after the lava arena attack ends (#29299) * Ash drakes no longer get stuck in flight if their target changes Z levels or is destroyed and doesn't spawn lavaland turfs after the lava arena attack ends (#85700) ## About The Pull Request Closes #79210 Closes #56244 Cleaned up the code and added some much-needed sanity checks. Not sure how exactly the latter issue happened but the checks should ensure that it doesnt occur again. Also made the drake not terraform turfs into lavaland ones after the lava disappears because if it ever went to station it ended up permanently changing space turfs which is not good, and there's no reason for terraforming on lavaland already. ## Changelog :cl: fix: Ash drakes no longer get stuck in flight if their target changes Z levels or is destroyed and doesn't spawn lavaland turfs after the lava arena attack ends /:cl: * Ash drakes no longer get stuck in flight if their target changes Z levels or is destroyed and doesn't spawn lavaland turfs after the lava arena attack ends --------- Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com> --- code/datums/actions/mobs/lava_swoop.dm | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/code/datums/actions/mobs/lava_swoop.dm b/code/datums/actions/mobs/lava_swoop.dm index 0b0735bc471..aa512b2d28e 100644 --- a/code/datums/actions/mobs/lava_swoop.dm +++ b/code/datums/actions/mobs/lava_swoop.dm @@ -50,7 +50,7 @@ negative = FALSE else if(target.x == initial_x) //if their x is the same, pick a direction negative = prob(50) - var/obj/effect/temp_visual/dragon_flight/F = new /obj/effect/temp_visual/dragon_flight(owner.loc, negative) + var/obj/effect/temp_visual/dragon_flight/flight_vis = new /obj/effect/temp_visual/dragon_flight(owner.loc, negative) negative = !negative //invert it for the swoop down later @@ -60,7 +60,7 @@ for(var/i in 1 to 3) sleep(0.1 SECONDS) if(QDELETED(owner) || owner.stat == DEAD) //we got hit and died, rip us - qdel(F) + qdel(flight_vis) if(owner.stat == DEAD) swooping = FALSE animate(owner, alpha = 255, transform = oldtransform, time = 0, flags = ANIMATION_END_NOW) //reset immediately @@ -72,9 +72,11 @@ owner.mouse_opacity = MOUSE_OPACITY_TRANSPARENT SLEEP_CHECK_DEATH(7, owner) - while(target && owner.loc != get_turf(target)) - owner.forceMove(get_step(owner, get_dir(owner, target))) + var/turf/target_turf = get_turf(target) + while(!QDELETED(target) && owner.loc != target_turf && owner.z == target_turf.z) + owner.forceMove(get_step(owner, get_dir(owner, target_turf))) SLEEP_CHECK_DEATH(0.5, owner) + target_turf = get_turf(target) // Ash drake flies onto its target and rains fire down upon them var/descentTime = 10 @@ -82,7 +84,6 @@ if(lava_arena) lava_success = lava_arena(target) - //ensure swoop direction continuity. if(negative) if(ISINRANGE(owner.x, initial_x + 1, initial_x + SWOOP_DIRECTION_CHANGE_RANGE)) @@ -96,20 +97,20 @@ SLEEP_CHECK_DEATH(descentTime, owner) owner.mouse_opacity = initial(owner.mouse_opacity) playsound(owner.loc, 'sound/effects/meteorimpact.ogg', 200, TRUE) - for(var/mob/living/L in orange(1, owner) - owner) - L.adjustBruteLoss(75) - if(!QDELETED(L)) // Some mobs are deleted on death - var/throw_dir = get_dir(owner, L) - if(L.loc == owner.loc) + for(var/mob/living/victim in orange(1, owner) - owner) + victim.adjustBruteLoss(75) + if(!QDELETED(victim)) // Some mobs are deleted on death + var/throw_dir = get_dir(owner, victim) + if(victim.loc == owner.loc) throw_dir = pick(GLOB.alldirs) var/throwtarget = get_edge_target_turf(owner, throw_dir) - L.throw_at(throwtarget, 3) - owner.visible_message(span_warning("[L] is thrown clear of [owner]!")) - for(var/obj/vehicle/sealed/mecha/M in orange(1, owner)) - M.take_damage(75, BRUTE, MELEE, 1) + victim.throw_at(throwtarget, 3) + owner.visible_message(span_warning("[victim] is thrown clear of [owner]!")) + for(var/obj/vehicle/sealed/mecha/mech in orange(1, owner)) + mech.take_damage(75, BRUTE, MELEE, 1) - for(var/mob/M in range(7, owner)) - shake_camera(M, 15, 1) + for(var/mob/observer in range(7, owner)) + shake_camera(observer, 15, 1) REMOVE_TRAIT(owner, TRAIT_UNDENSE, SWOOPING_TRAIT) SLEEP_CHECK_DEATH(1, owner) @@ -126,15 +127,16 @@ while(amount > 0) if(QDELETED(target)) break - var/turf/TT = get_turf(target) - var/turf/T = pick(RANGE_TURFS(1,TT)) - var/obj/effect/temp_visual/lava_warning/LW = new /obj/effect/temp_visual/lava_warning(T, 60) // longer reset time for the lava - LW.owner = owner + var/turf/target_turf = get_turf(target) + var/turf/lava_turf = pick(RANGE_TURFS(1, target_turf)) + var/obj/effect/temp_visual/lava_warning/warn_effect = new /obj/effect/temp_visual/lava_warning(lava_turf, 60) // longer reset time for the lava + warn_effect.owner = owner amount-- SLEEP_CHECK_DEATH(delay, owner) /datum/action/cooldown/mob_cooldown/lava_swoop/proc/lava_arena(atom/target) - if(!target || !isliving(target)) + var/turf/target_turf = get_turf(target) + if(QDELETED(target) || !isliving(target) || target_turf.z != owner.z) return target.visible_message(span_boldwarning("[owner] encases you in an arena of fire!")) var/amount = 3 @@ -147,9 +149,7 @@ for(var/turf/T in RANGE_TURFS(2, center)) if(isindestructiblefloor(T)) continue - if(!isindestructiblewall(T)) - T.TerraformTurf(/turf/open/misc/asteroid/basalt/lava_land_surface, flags = CHANGETURF_INHERIT_AIR) - else + if(isindestructiblewall(T)) indestructible_turfs += T SLEEP_CHECK_DEATH(1 SECONDS, owner) // give them a bit of time to realize what attack is actually happening