From 15ca0ae3d9f0274b0eab8559e59eebea859704b1 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Thu, 24 Dec 2015 07:38:08 -0600 Subject: [PATCH 1/2] Timestop fixes --- .../research/xenobiology/xenobiology.dm | 67 +++++++++++-------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index e7e1f3f0e47..d8749d2e5d8 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -459,6 +459,7 @@ unacidable = 1 mouse_opacity = 0 var/mob/living/immune = list() // the one who creates the timestop is immune + var/list/stopped_atoms = list() var/freezerange = 2 var/duration = 140 alpha = 125 @@ -473,35 +474,47 @@ /obj/effect/timestop/proc/timestop() playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1) - while(loc) - if(duration) - for(var/mob/living/M in orange (freezerange, src.loc)) - if(M in immune) - continue - M.stunned = 10 - M.anchored = 1 - if(istype(M, /mob/living/simple_animal/hostile)) - var/mob/living/simple_animal/hostile/H = M - H.AIStatus = AI_OFF - H.LoseTarget() - continue - for(var/obj/item/projectile/P in orange (freezerange, src.loc)) - P.paused = TRUE - duration -- - else - for(var/mob/living/M in orange (freezerange+2, src.loc)) //longer range incase they lag out of it or something - M.stunned = 0 - M.anchored = 0 - if(istype(M, /mob/living/simple_animal/hostile)) - var/mob/living/simple_animal/hostile/H = M - H.AIStatus = initial(H.AIStatus) - continue - for(var/obj/item/projectile/P in orange(freezerange+2, src.loc)) - P.paused = FALSE - qdel(src) - return + for(var/i in 1 to duration-1) + for(var/mob/living/M in orange (freezerange, src.loc)) + if(M in immune) + continue + M.stunned = 10 + M.anchored = 1 + if(istype(M, /mob/living/simple_animal/hostile)) + var/mob/living/simple_animal/hostile/H = M + H.AIStatus = AI_OFF + H.LoseTarget() + continue + stopped_atoms |= M + + for(var/obj/item/projectile/P in orange (freezerange, src.loc)) + P.paused = TRUE + stopped_atoms |= P + + for(var/mob/living/M in stopped_atoms) + if(get_dist(get_turf(M),get_turf(src)) > freezerange) //If they lagged/ran past the timestop somehow, just ignore them + unfreeze_mob(M) + stopped_atoms -= M sleep(1) + //End + for(var/mob/living/M in stopped_atoms) + unfreeze_mob(M) + + for(var/obj/item/projectile/P in stopped_atoms) + P.paused = FALSE + qdel(src) + return + + + +/obj/effect/timestop/proc/unfreeze_mob(mob/living/M) + M.stunned = 0 + M.anchored = 0 + if(istype(M, /mob/living/simple_animal/hostile)) + var/mob/living/simple_animal/hostile/H = M + H.AIStatus = initial(H.AIStatus) + /obj/effect/timestop/wizard duration = 100 From f314b99777bdf1425758b10dae02a2031b96b920 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Mon, 28 Dec 2015 05:30:26 -0600 Subject: [PATCH 2/2] Fixes timestop loops --- .../research/xenobiology/xenobiology.dm | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index d8749d2e5d8..6951b8575c2 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -475,21 +475,22 @@ /obj/effect/timestop/proc/timestop() playsound(get_turf(src), 'sound/magic/TIMEPARADOX2.ogg', 100, 1, -1) for(var/i in 1 to duration-1) - for(var/mob/living/M in orange (freezerange, src.loc)) - if(M in immune) - continue - M.stunned = 10 - M.anchored = 1 - if(istype(M, /mob/living/simple_animal/hostile)) - var/mob/living/simple_animal/hostile/H = M - H.AIStatus = AI_OFF - H.LoseTarget() - continue - stopped_atoms |= M - - for(var/obj/item/projectile/P in orange (freezerange, src.loc)) - P.paused = TRUE - stopped_atoms |= P + for(var/atom/A in orange (freezerange, src.loc)) + if(istype(A, /mob/living)) + var/mob/living/M = A + if(M in immune) + continue + M.stunned = 10 + M.anchored = 1 + if(istype(M, /mob/living/simple_animal/hostile)) + var/mob/living/simple_animal/hostile/H = M + H.AIStatus = AI_OFF + H.LoseTarget() + stopped_atoms |= M + else if(istype(A, /obj/item/projectile)) + var/obj/item/projectile/P = A + P.paused = TRUE + stopped_atoms |= P for(var/mob/living/M in stopped_atoms) if(get_dist(get_turf(M),get_turf(src)) > freezerange) //If they lagged/ran past the timestop somehow, just ignore them @@ -503,8 +504,8 @@ for(var/obj/item/projectile/P in stopped_atoms) P.paused = FALSE - qdel(src) - return + qdel(src) + return