/obj/effect/temp_visual/point name = "pointer" icon = 'icons/mob/screen_gen.dmi' icon_state = "arrow" layer = POINT_LAYER duration = 25 /obj/effect/temp_visual/point/Initialize(mapload, set_invis = 0) . = ..() var/atom/old_loc = loc loc = get_turf(src) // We don't want to actualy trigger anything when it moves pixel_x = old_loc.pixel_x pixel_y = old_loc.pixel_y invisibility = set_invis //Used by spraybottles. /obj/effect/decal/chempuff name = "chemicals" icon = 'icons/obj/chempuff.dmi' pass_flags = PASSTABLE | PASSGRILLE layer = FLY_LAYER var/stream = FALSE var/speed = 1 var/range = 3 var/hits_left = 3 var/range_left = 3 var/firstmove = TRUE var/list/hit /obj/effect/decal/chempuff/blob_act(obj/structure/blob/B) return /obj/effect/decal/chempuff/Initialize(mapload, stream_mode, speed, range, hits_left, size) . = ..() create_reagents(size, NONE, NO_REAGENTS_VALUE) stream = stream_mode src.speed = speed src.range = src.range_left = range src.hits_left = hits_left hit = list() /obj/effect/decal/chempuff/Destroy() hit = null return ..() /// proc called to handle us hitting something /obj/effect/decal/chempuff/proc/hit_thing(atom/A, bump_hit) // if the thing is invisible it usually is abstract/underfloor. also, don't hit ourselves. if(A == src || A.invisibility) return // don't hit anything on the first move unless overridden (see: we're colliding a wall blocking our move out of the first tile) if(firstmove && !bump_hit) return // we're out of hits or we already hit it if(!hits_left || hit[A]) return var/living = isliving(A) // if it's not dense and we're a stream instead of a mist, and we're not out of range if(!A.density && stream && range_left && !bump_hit) return // non living mobs are effectively abstract if(ismob(A) && !living) return hit[A] = TRUE reagents.reaction(A, VAPOR) // mobs absorb enough to decrement hits_left, as well as stuff blocking us. if(ismob(A) || bump_hit) hits_left-- /obj/effect/decal/chempuff/Crossed(atom/movable/AM, oldloc) . = ..() // bump things moving into us as long as we're not on our first move/moving out of origin tile hit_thing(AM) /obj/effect/decal/chempuff/Bump(atom/A) . = ..() // if we hit something blocking our movement, collide it regardless even if we're still on our origin tile hit_thing(A, TRUE) /obj/effect/decal/chempuff/proc/run_puff(atom/target) var/safety = 255 while(range_left) if(!safety--) CRASH("Spray ran out of safety.") // move towards new turf step_towards(src, target) if(firstmove) // mark first movement so future Cross()es result in collisions firstmove = FALSE // decrement range range_left-- // if we got nullspaced, exit if(!isturf(loc)) break // hit everything in it for(var/atom/T in loc) hit_thing(T) // if we got deleted or ran out of hits, stop if(!hits_left || !isturf(loc)) break if(!hits_left || !isturf(loc)) // yeah yeah sue me it's copypasted code but I don't want to declare a var. break // hit the turf hit_thing(loc) sleep(speed) qdel(src) /obj/effect/decal/fakelattice name = "lattice" desc = "A lightweight support lattice." icon = 'icons/obj/smooth_structures/lattice.dmi' icon_state = "lattice" density = TRUE