Merge pull request #15338 from tkdrg/whoa

[s]Fixes server crash by abusing containment fields
This commit is contained in:
Razharas
2016-02-11 04:23:46 +03:00
@@ -67,25 +67,19 @@
/obj/machinery/field
var/hasShocked = 0 //Used to add a delay between shocks. In some cases this used to crash servers by spawning hundreds of sparks every second.
/obj/machinery/field/CanPass(mob/mover, turf/target, height=0)
/obj/machinery/field/CanPass(atom/movable/mover, turf/target, height=0)
if(hasShocked)
return 0
if(isliving(mover)) // Don't let mobs through
shock(mover)
return 0
return ..()
/obj/machinery/field/CanPass(obj/mover, turf/target, height=0)
if((istype(mover, /obj/machinery) && !istype(mover, /obj/singularity)) || \
istype(mover, /obj/structure) || \
istype(mover, /obj/mecha))
if(istype(mover, /obj/machinery) || istype(mover, /obj/structure) || istype(mover, /obj/mecha))
bump_field(mover)
return 0
return ..()
/obj/machinery/field/proc/shock(mob/living/user)
if(hasShocked)
return 0
if(isliving(user))
hasShocked = 1
var/shock_damage = min(rand(30,40),rand(30,40))
if(iscarbon(user))
@@ -104,14 +98,18 @@
user.updatehealth()
bump_field(user)
spawn(5)
hasShocked = 0
return
/obj/machinery/field/proc/clear_shock()
hasShocked = 0
/obj/machinery/field/proc/bump_field(atom/movable/AM as mob|obj)
if(hasShocked)
return 0
hasShocked = 1
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(5, 1, AM.loc)
s.start()
var/atom/target = get_edge_target_turf(AM, get_dir(src, get_step_away(AM, src)))
AM.throw_at(target, 200, 4)
addtimer(src, "clear_shock", 5)