mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-19 05:26:28 +00:00
## About The Pull Request Signals were initially only usable with component listeners, which while no longer the case has lead to outdated documentation, names, and a similar location in code. This pr pulls the two apart. Partially because mso thinks we should, but also because they really aren't directly linked anymore, and having them in this midstate just confuses people. [Renames comp_lookup to listen_lookup, since that's what it does](102b79694f) [Moves signal procs over to their own file](33d07d01fd) [Renames the PREQDELETING and QDELETING comsigs to drop the parent bit since they can hook to more then just comps now](335ea4ad08) [Does something similar to the attackby comsigs (PARENT -> ATOM)](210e57051d) [And finally passes over the examine signals](65917658fb) ## Why It's Good For The Game Code makes more sense, things are better teased apart, s just good imo ## Changelog 🆑 refactor: Pulled apart the last vestiges of names/docs directly linking signals to components /🆑
203 lines
5.6 KiB
Plaintext
203 lines
5.6 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_REF(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_REF(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
|
|
///List of moving atoms mapped to their inital direction
|
|
var/list/affecting = list()
|
|
|
|
/obj/effect/step_trigger/thrower/Trigger(atom/A)
|
|
if(!A || !ismovable(A))
|
|
return
|
|
var/atom/movable/AM = A
|
|
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, REF(src))
|
|
|
|
affecting[AM] = AM.dir
|
|
var/datum/move_loop/loop = SSmove_manager.move(AM, direction, speed, tiles ? tiles * speed : INFINITY)
|
|
RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move))
|
|
RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move))
|
|
RegisterSignal(loop, COMSIG_QDELETING, PROC_REF(set_to_normal))
|
|
|
|
/obj/effect/step_trigger/thrower/proc/pre_move(datum/move_loop/source)
|
|
SIGNAL_HANDLER
|
|
var/atom/movable/being_moved = source.moving
|
|
affecting[being_moved] = being_moved.dir
|
|
|
|
/obj/effect/step_trigger/thrower/proc/post_move(datum/move_loop/source)
|
|
SIGNAL_HANDLER
|
|
var/atom/movable/being_moved = source.moving
|
|
if(!facedir)
|
|
being_moved.setDir(affecting[being_moved])
|
|
if(being_moved.z != z)
|
|
qdel(source)
|
|
return
|
|
if(!nostop)
|
|
for(var/obj/effect/step_trigger/T in get_turf(being_moved))
|
|
if(T.stopper && T != src)
|
|
qdel(source)
|
|
return
|
|
else
|
|
for(var/obj/effect/step_trigger/teleporter/T in get_turf(being_moved))
|
|
if(T.stopper)
|
|
qdel(source)
|
|
return
|
|
|
|
/obj/effect/step_trigger/thrower/proc/set_to_normal(datum/move_loop/source)
|
|
SIGNAL_HANDLER
|
|
var/atom/movable/being_moved = source.moving
|
|
affecting -= being_moved
|
|
REMOVE_TRAIT(being_moved, TRAIT_IMMOBILIZED, REF(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/fluid_spread/smoke/s = new
|
|
s.set_up(4, holder = src, location = src)
|
|
s.start()
|
|
if(exitsmoke)
|
|
var/datum/effect_system/fluid_spread/smoke/s = new
|
|
s.set_up(4, holder = src, location = dest)
|
|
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)
|