mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2025-12-31 12:01:47 +00:00
* Makes turfs persist their signals, uses this to optimize connect_loc (#59608) * Makes turfs persist signals * Splits connect_loc up into two elements, one for stuff that wishes to connect on behalf of something, and one for stuff that just wants to connect normally. Connecting on behalf of someone has a significant amount of overhead, so let's do this to keep things clear * Converts all uses of connect_loc over to the new patterns * Adds some comments, actually makes turfs persist signals * There's no need to detach connect loc anymore, since all it does is unregister signals. Unregisters a signal from formorly decal'd turfs, and makes the changeturf signal persistance stuff actually work * bro fuck documentation * Changes from a var to a proc, prevents admemems and idiots * Extra detail on why we do the copy post qdel * Makes turfs persist their signals, uses this to optimize connect_loc Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
203 lines
4.9 KiB
Plaintext
203 lines
4.9 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 = FALSE
|
|
invisibility = INVISIBILITY_ABSTRACT // nope cant see this shit
|
|
anchored = TRUE
|
|
|
|
/obj/effect/step_trigger/Initialize(mapload)
|
|
. = ..()
|
|
var/static/list/loc_connections = list(
|
|
COMSIG_ATOM_ENTERED = .proc/on_entered,
|
|
)
|
|
AddElement(/datum/element/connect_loc, loc_connections)
|
|
|
|
/obj/effect/step_trigger/proc/Trigger(atom/movable/A)
|
|
return 0
|
|
|
|
/obj/effect/step_trigger/proc/on_entered(datum/source, H as mob|obj)
|
|
SIGNAL_HANDLER
|
|
if(!H)
|
|
return
|
|
if(isobserver(H) && !affect_ghosts)
|
|
return
|
|
if(!ismob(H) && mobs_only)
|
|
return
|
|
INVOKE_ASYNC(src, .proc/Trigger, H)
|
|
|
|
|
|
/obj/effect/step_trigger/singularity_act()
|
|
return
|
|
|
|
/obj/effect/step_trigger/singularity_pull()
|
|
return
|
|
|
|
/* Sends a message to mob when triggered*/
|
|
|
|
/obj/effect/step_trigger/message
|
|
var/message //the message to give to the mob
|
|
var/once = 1
|
|
mobs_only = TRUE
|
|
|
|
/obj/effect/step_trigger/message/Trigger(mob/M)
|
|
if(M.client)
|
|
to_chat(M, span_info("[message]"))
|
|
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 || !ismovable(A))
|
|
return
|
|
var/atom/movable/AM = A
|
|
var/curtiles = 0
|
|
var/stopthrow = FALSE
|
|
for(var/obj/effect/step_trigger/thrower/T in orange(2, src))
|
|
if(AM in T.affecting)
|
|
return
|
|
|
|
if(immobilize)
|
|
ADD_TRAIT(AM, TRAIT_IMMOBILIZED, src)
|
|
|
|
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 = TRUE
|
|
else
|
|
for(var/obj/effect/step_trigger/teleporter/T in get_step(AM, direction))
|
|
if(T.stopper)
|
|
stopthrow = TRUE
|
|
|
|
if(AM)
|
|
var/predir = AM.dir
|
|
step(AM, direction)
|
|
if(!facedir)
|
|
AM.setDir(predir)
|
|
|
|
|
|
|
|
affecting.Remove(AM)
|
|
|
|
REMOVE_TRAIT(AM, TRAIT_IMMOBILIZED, src)
|
|
|
|
|
|
/* 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)
|
|
|
|
var/turf/T = locate(teleport_x, teleport_y, teleport_z)
|
|
A.forceMove(T)
|
|
|
|
/* 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)
|
|
|
|
var/turf/T = locate(rand(teleport_x, teleport_x_offset), rand(teleport_y, teleport_y_offset), rand(teleport_z, teleport_z_offset))
|
|
if (T)
|
|
A.forceMove(T)
|
|
|
|
/* 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 && ismob(A))
|
|
var/mob/B = A
|
|
B.playsound_local(T, sound, volume, freq_vary)
|
|
else
|
|
playsound(T, sound, volume, freq_vary, extra_range)
|
|
|
|
if(happens_once)
|
|
qdel(src)
|