Files
SkyratBot 734eddd123 [MIRROR] Fixes soapbox component sometimes runtiming roundstart due to not unregistering signals (#29466)
* Fixes soapbox component sometimes runtiming roundstart due to not unregistering signals (#85937)

## About The Pull Request

sometimes runtimed due to reassigning signals and it has been driving me
insane

## Changelog
🆑
fix: Fixed soapbox component sometimes runtiming roundstart
/🆑

* Fixes soapbox component sometimes runtiming roundstart due to not unregistering signals

---------

Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
2024-08-22 08:22:52 +07:00

45 lines
1.7 KiB
Plaintext

/datum/component/soapbox
/// List of our current soapboxxer(s) who are gaining loud speech
var/list/soapboxers = list()
/// Gives atoms moving over us the soapbox speech and takes it away when they leave
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_loc_entered),
COMSIG_ATOM_EXITED = PROC_REF(on_loc_exited),
)
/datum/component/soapbox/Initialize(...)
if(!ismovable(parent))
return COMPONENT_INCOMPATIBLE
add_connect_loc_behalf_to_parent()
RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(parent_moved))
///Applies loud speech to our movable when entering the turf our parent is on
/datum/component/soapbox/proc/on_loc_entered(datum/source, atom/movable/soapbox_arrive)
SIGNAL_HANDLER
if(QDELETED(soapbox_arrive))
return
RegisterSignal(soapbox_arrive, COMSIG_MOB_SAY, PROC_REF(soapbox_speech))
soapboxers += soapbox_arrive
///Takes away loud speech from our movable when it leaves the turf our parent is on
/datum/component/soapbox/proc/on_loc_exited(datum/source, atom/movable/soapbox_leave)
SIGNAL_HANDLER
if(soapbox_leave in soapboxers)
UnregisterSignal(soapbox_leave, COMSIG_MOB_SAY)
soapboxers -= soapbox_leave
///We don't want our soapboxxer to keep their loud say if the parent is moved out from under them
/datum/component/soapbox/proc/parent_moved(datum/source)
SIGNAL_HANDLER
for(var/atom/movable/loud as anything in soapboxers)
UnregisterSignal(loud, COMSIG_MOB_SAY)
soapboxers.Cut()
///Gives a mob a unique say span
/datum/component/soapbox/proc/soapbox_speech(datum/source, list/speech_args)
SIGNAL_HANDLER
speech_args[SPEECH_SPANS] |= SPAN_SOAPBOX
/datum/component/soapbox/proc/add_connect_loc_behalf_to_parent()
AddComponent(/datum/component/connect_loc_behalf, parent, loc_connections)