diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 8ddda4e49f7..3097d3f8b1b 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -460,6 +460,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 @@ -474,9 +475,10 @@ /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)) + for(var/i in 1 to duration-1) + 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 @@ -485,24 +487,36 @@ 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)) + stopped_atoms |= M + else if(istype(A, /obj/item/projectile)) + var/obj/item/projectile/P = A 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 + 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