mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
obj/effect/effect is now renamed obj/effect/particle_effect for better usability. datum/effect/system and /datum/effect/effect/system are now both /datum/effect_system. Fixes a bug where wall mounted igniters (and other spark producing objects) didn't produce sparks sometimes. Moved explosion_particles.dm into the effect_system folder, because it has effect_systems code.
193 lines
4.7 KiB
Plaintext
193 lines
4.7 KiB
Plaintext
/* Simple object type, calls a proc when "stepped" on by something */
|
|
|
|
/obj/effect/step_trigger
|
|
var/affect_ghosts = 0
|
|
var/stopper = 1 // stops throwers
|
|
var/mobs_only = 0
|
|
invisibility = 101 // nope cant see this shit
|
|
anchored = 1
|
|
|
|
/obj/effect/step_trigger/proc/Trigger(atom/movable/A)
|
|
return 0
|
|
|
|
/obj/effect/step_trigger/Crossed(H as mob|obj)
|
|
..()
|
|
if(!H)
|
|
return
|
|
if(istype(H, /mob/dead/observer) && !affect_ghosts)
|
|
return
|
|
if(!istype(H, /mob) && mobs_only)
|
|
return
|
|
Trigger(H)
|
|
|
|
/* Sends a message to mob when triggered*/
|
|
|
|
/obj/effect/step_trigger/message
|
|
var/message //the message to give to the mob
|
|
var/once = 1
|
|
|
|
/obj/effect/step_trigger/message/Trigger(mob/M)
|
|
if(M.client)
|
|
M << "<span class='info'>[message]</span>"
|
|
if(once)
|
|
qdel(src)
|
|
|
|
/* Tosses things in a certain direction */
|
|
|
|
/obj/effect/step_trigger/thrower
|
|
var/direction = SOUTH // the direction of throw
|
|
var/tiles = 3 // if 0: forever until atom hits a stopper
|
|
var/immobilize = 1 // if nonzero: prevents mobs from moving while they're being flung
|
|
var/speed = 1 // delay of movement
|
|
var/facedir = 0 // if 1: atom faces the direction of movement
|
|
var/nostop = 0 // if 1: will only be stopped by teleporters
|
|
var/list/affecting = list()
|
|
|
|
/obj/effect/step_trigger/thrower/Trigger(atom/A)
|
|
if(!A || !istype(A, /atom/movable))
|
|
return
|
|
var/atom/movable/AM = A
|
|
var/curtiles = 0
|
|
var/stopthrow = 0
|
|
for(var/obj/effect/step_trigger/thrower/T in orange(2, src))
|
|
if(AM in T.affecting)
|
|
return
|
|
|
|
if(ismob(AM))
|
|
var/mob/M = AM
|
|
if(immobilize)
|
|
M.canmove = 0
|
|
|
|
affecting.Add(AM)
|
|
while(AM && !stopthrow)
|
|
if(tiles)
|
|
if(curtiles >= tiles)
|
|
break
|
|
if(AM.z != src.z)
|
|
break
|
|
|
|
curtiles++
|
|
|
|
sleep(speed)
|
|
|
|
// Calculate if we should stop the process
|
|
if(!nostop)
|
|
for(var/obj/effect/step_trigger/T in get_step(AM, direction))
|
|
if(T.stopper && T != src)
|
|
stopthrow = 1
|
|
else
|
|
for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction))
|
|
if(T.stopper)
|
|
stopthrow = 1
|
|
|
|
if(AM)
|
|
var/predir = AM.dir
|
|
step(AM, direction)
|
|
if(!facedir)
|
|
AM.dir = predir
|
|
|
|
|
|
|
|
affecting.Remove(AM)
|
|
|
|
if(ismob(AM))
|
|
var/mob/M = AM
|
|
if(immobilize)
|
|
M.canmove = 1
|
|
|
|
/* Stops things thrown by a thrower, doesn't do anything */
|
|
|
|
/obj/effect/step_trigger/stopper
|
|
|
|
/* Instant teleporter */
|
|
|
|
/obj/effect/step_trigger/teleporter
|
|
var/teleport_x = 0 // teleportation coordinates (if one is null, then no teleport!)
|
|
var/teleport_y = 0
|
|
var/teleport_z = 0
|
|
|
|
/obj/effect/step_trigger/teleporter/Trigger(atom/movable/A)
|
|
if(teleport_x && teleport_y && teleport_z)
|
|
|
|
A.x = teleport_x
|
|
A.y = teleport_y
|
|
A.z = teleport_z
|
|
|
|
/* Random teleporter, teleports atoms to locations ranging from teleport_x - teleport_x_offset, etc */
|
|
|
|
/obj/effect/step_trigger/teleporter/random
|
|
var/teleport_x_offset = 0
|
|
var/teleport_y_offset = 0
|
|
var/teleport_z_offset = 0
|
|
|
|
/obj/effect/step_trigger/teleporter/random/Trigger(atom/movable/A)
|
|
if(teleport_x && teleport_y && teleport_z)
|
|
if(teleport_x_offset && teleport_y_offset && teleport_z_offset)
|
|
|
|
A.x = rand(teleport_x, teleport_x_offset)
|
|
A.y = rand(teleport_y, teleport_y_offset)
|
|
A.z = rand(teleport_z, teleport_z_offset)
|
|
|
|
/* Fancy teleporter, creates sparks and smokes when used */
|
|
|
|
/obj/effect/step_trigger/teleport_fancy
|
|
var/locationx
|
|
var/locationy
|
|
var/uses = 1 //0 for infinite uses
|
|
var/entersparks = 0
|
|
var/exitsparks = 0
|
|
var/entersmoke = 0
|
|
var/exitsmoke = 0
|
|
|
|
/obj/effect/step_trigger/teleport_fancy/Trigger(mob/M)
|
|
var/dest = locate(locationx, locationy, z)
|
|
M.Move(dest)
|
|
|
|
if(entersparks)
|
|
var/datum/effect_system/spark_spread/s = new
|
|
s.set_up(4, 1, src)
|
|
s.start()
|
|
if(exitsparks)
|
|
var/datum/effect_system/spark_spread/s = new
|
|
s.set_up(4, 1, dest)
|
|
s.start()
|
|
|
|
if(entersmoke)
|
|
var/datum/effect_system/smoke_spread/s = new
|
|
s.set_up(4, 1, src, 0)
|
|
s.start()
|
|
if(exitsmoke)
|
|
var/datum/effect_system/smoke_spread/s = new
|
|
s.set_up(4, 1, dest, 0)
|
|
s.start()
|
|
|
|
uses--
|
|
if(uses == 0)
|
|
qdel(src)
|
|
|
|
/* Simple sound player, Mapper friendly! */
|
|
|
|
/obj/effect/step_trigger/sound_effect
|
|
var/sound //eg. path to the sound, inside '' eg: 'growl.ogg'
|
|
var/volume = 100
|
|
var/freq_vary = 1 //Should the frequency of the sound vary?
|
|
var/extra_range = 0 // eg World.view = 7, extra_range = 1, 7+1 = 8, 8 turfs radius
|
|
var/happens_once = 0
|
|
var/triggerer_only = 0 //Whether the triggerer is the only person who hears this
|
|
|
|
|
|
/obj/effect/step_trigger/sound_effect/Trigger(atom/movable/A)
|
|
var/turf/T = get_turf(A)
|
|
|
|
if(!T)
|
|
return
|
|
|
|
if(triggerer_only)
|
|
A.playsound_local(T, sound, volume, freq_vary)
|
|
else
|
|
playsound(T, sound, volume, freq_vary, extra_range)
|
|
|
|
if(happens_once)
|
|
qdel(src)
|
|
|