mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-27 06:54:18 +01:00
Turns events into vars instead of a list, to greatly simplify qdel() cleanup.
This commit is contained in:
+1
-1
@@ -122,7 +122,6 @@
|
||||
#include "code\controllers\subsystems.dm"
|
||||
#include "code\controllers\verbs.dm"
|
||||
#include "code\controllers\voting.dm"
|
||||
#include "code\controllers\observer_listener\datum\observer.dm"
|
||||
#include "code\controllers\Processes\air.dm"
|
||||
#include "code\controllers\Processes\alarm.dm"
|
||||
#include "code\controllers\Processes\chemistry.dm"
|
||||
@@ -212,6 +211,7 @@
|
||||
#include "code\datums\helper_datums\global_iterator.dm"
|
||||
#include "code\datums\helper_datums\teleport.dm"
|
||||
#include "code\datums\helper_datums\topic_input.dm"
|
||||
#include "code\datums\observation\observation.dm"
|
||||
#include "code\datums\wires\airlock.dm"
|
||||
#include "code\datums\wires\alarm.dm"
|
||||
#include "code\datums\wires\apc.dm"
|
||||
|
||||
@@ -28,16 +28,13 @@
|
||||
stat(null, "[scheduled_tasks.len] task\s")
|
||||
|
||||
/datum/controller/process/scheduler/proc/schedule(var/datum/scheduled_task/st)
|
||||
if(world.time < st.trigger_time)
|
||||
scheduled_tasks += st
|
||||
st.register(OBSERVER_EVENT_DESTROY, src, /datum/controller/process/scheduler/proc/unschedule)
|
||||
else
|
||||
st.process()
|
||||
scheduled_tasks += st
|
||||
st.destruction.register(src, /datum/controller/process/scheduler/proc/unschedule)
|
||||
|
||||
/datum/controller/process/scheduler/proc/unschedule(var/datum/scheduled_task/st)
|
||||
if(st in scheduled_tasks)
|
||||
scheduled_tasks -= st
|
||||
st.unregister(OBSERVER_EVENT_DESTROY, src)
|
||||
st.destruction.unregister(src)
|
||||
|
||||
/**********
|
||||
* Helpers *
|
||||
@@ -98,7 +95,7 @@
|
||||
|
||||
/datum/scheduled_task/source/New(var/trigger_time, var/datum/source, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args)
|
||||
src.source = source
|
||||
src.source.register(OBSERVER_EVENT_DESTROY, src, /datum/scheduled_task/source/proc/source_destroyed)
|
||||
src.source.destruction.register(src, /datum/scheduled_task/source/proc/source_destroyed)
|
||||
..(trigger_time, procedure, arguments, task_after_process, task_after_process_args)
|
||||
|
||||
/datum/scheduled_task/source/Destroy()
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
#define OBSERVER_EVENT_DESTROY "OnDestroy"
|
||||
|
||||
/datum
|
||||
var/list/observer_events
|
||||
|
||||
/datum/Destroy()
|
||||
raise_event(OBSERVER_EVENT_DESTROY, list(src))
|
||||
for(var/list/listeners in observer_events)
|
||||
listeners.Cut()
|
||||
|
||||
return ..()
|
||||
|
||||
/datum/proc/register(var/event, var/procOwner, var/proc_call)
|
||||
var/list/listeners = get_listener_list_from_event(event, TRUE)
|
||||
listeners[procOwner] = proc_call
|
||||
|
||||
/datum/proc/unregister(var/event, var/procOwner)
|
||||
var/list/listeners = get_listener_list_from_event(event, FALSE)
|
||||
listeners -= procOwner
|
||||
|
||||
/datum/proc/raise_event(var/event, var/list/args = list())
|
||||
var/list/listeners = get_listener_list_from_event(event, FALSE)
|
||||
if(listeners)
|
||||
for(var/listener in listeners)
|
||||
call(listener, listeners[listener])(arglist(args))
|
||||
|
||||
/datum/proc/get_listener_list_from_event(var/observer_event, var/create_list)
|
||||
if(!observer_events)
|
||||
if(create_list)
|
||||
observer_events = list()
|
||||
else
|
||||
return
|
||||
|
||||
var/list/listeners = observer_events[observer_event]
|
||||
if(!listeners)
|
||||
if(create_list)
|
||||
listeners = list()
|
||||
observer_events[observer_event] = listeners
|
||||
else
|
||||
return
|
||||
return listeners
|
||||
@@ -0,0 +1,56 @@
|
||||
/datum/observ
|
||||
var/list/listeners
|
||||
|
||||
/datum/observ/Destroy()
|
||||
if(listeners)
|
||||
for(var/listener in listeners)
|
||||
unregister(listener)
|
||||
listeners.Cut()
|
||||
return ..()
|
||||
|
||||
/datum/observ/proc/register(var/datum/procOwner, var/proc_call)
|
||||
if(!listeners)
|
||||
listeners = list()
|
||||
listeners[procOwner] = proc_call
|
||||
procOwner.destruction.register(src, /datum/observ/proc/unregister)
|
||||
|
||||
/datum/observ/proc/unregister(var/datum/procOwner)
|
||||
if(!listeners)
|
||||
return
|
||||
listeners -= procOwner
|
||||
procOwner.destruction.unregister(src)
|
||||
|
||||
/datum/observ/proc/raise_event(var/list/args = list())
|
||||
if(!listeners)
|
||||
return
|
||||
for(var/listener in listeners)
|
||||
call(listener, listeners[listener]) (arglist(args))
|
||||
|
||||
/***********************
|
||||
* Destruction Handling *
|
||||
***********************/
|
||||
/datum
|
||||
var/datum/observ/destruction
|
||||
|
||||
/datum/New()
|
||||
init_observers()
|
||||
..()
|
||||
|
||||
/datum/Destroy()
|
||||
destruction.raise_event(list(src))
|
||||
destroy_observers()
|
||||
return ..()
|
||||
|
||||
/datum/proc/init_observers()
|
||||
destruction = new()
|
||||
|
||||
/datum/proc/destroy_observers()
|
||||
qdel(destruction)
|
||||
destruction = null
|
||||
|
||||
// This ensures that observer handlers don't create their own observer handlers, which create their own handlers, which create...
|
||||
/datum/observ/init_observers()
|
||||
return
|
||||
|
||||
/datum/observ/destroy_observers()
|
||||
return
|
||||
@@ -38,7 +38,7 @@
|
||||
|
||||
/obj/machinery/computer/station_alert/proc/unregister_monitor()
|
||||
if(alarm_monitor)
|
||||
alarm_monitor.unregister(src)
|
||||
alarm_monitor.unregister_alarm(src)
|
||||
qdel(alarm_monitor)
|
||||
alarm_monitor = null
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
/obj/item/device/multitool/hacktool/Destroy()
|
||||
for(var/T in known_targets)
|
||||
var/atom/target = T
|
||||
target.unregister(OBSERVER_EVENT_DESTROY, src)
|
||||
target.destruction.unregister(src)
|
||||
known_targets.Cut()
|
||||
qdel(hack_state)
|
||||
hack_state = null
|
||||
@@ -68,7 +68,7 @@
|
||||
return 0
|
||||
|
||||
known_targets.Insert(1, target) // Insert the newly hacked target first,
|
||||
target.register(OBSERVER_EVENT_DESTROY, src, /obj/item/device/multitool/hacktool/proc/on_target_destroy)
|
||||
target.destruction.register(src, /obj/item/device/multitool/hacktool/proc/on_target_destroy)
|
||||
return 1
|
||||
|
||||
/obj/item/device/multitool/hacktool/proc/sanity_check()
|
||||
@@ -77,7 +77,7 @@
|
||||
if(known_targets.len > max_known_targets)
|
||||
for(var/i = (max_known_targets + 1) to known_targets.len)
|
||||
var/atom/A = known_targets[i]
|
||||
A.unregister(OBSERVER_EVENT_DESTROY, src)
|
||||
A.destruction.unregister(src)
|
||||
known_targets.Cut(max_known_targets + 1)
|
||||
|
||||
/obj/item/device/multitool/hacktool/proc/on_target_destroy(var/target)
|
||||
|
||||
@@ -48,13 +48,13 @@
|
||||
unregister_buffer(buffer_object)
|
||||
buffer_object = buffer
|
||||
if(buffer_object)
|
||||
buffer_object.register(OBSERVER_EVENT_DESTROY, src, /obj/item/device/multitool/proc/unregister_buffer)
|
||||
buffer_object.destruction.register(src, /obj/item/device/multitool/proc/unregister_buffer)
|
||||
|
||||
/obj/item/device/multitool/proc/unregister_buffer(var/atom/buffer_to_unregister)
|
||||
// Only remove the buffered object, don't reset the name
|
||||
// This means one cannot know if the buffer has been destroyed until one attempts to use it.
|
||||
if(buffer_to_unregister == buffer_object && buffer_object)
|
||||
buffer_object.unregister(OBSERVER_EVENT_DESTROY, src)
|
||||
buffer_object.destruction.unregister(src)
|
||||
buffer_object = null
|
||||
|
||||
/obj/item/device/multitool/resolve_attackby(atom/A, mob/user)
|
||||
|
||||
@@ -66,13 +66,13 @@
|
||||
unset_registered_user()
|
||||
registered_user = user
|
||||
user.set_id_info(src)
|
||||
user.register(OBSERVER_EVENT_DESTROY, src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user)
|
||||
user.destruction.register(src, /obj/item/weapon/card/id/syndicate/proc/unset_registered_user)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/proc/unset_registered_user(var/mob/user)
|
||||
if(!registered_user || (user && user != registered_user))
|
||||
return
|
||||
registered_user.unregister(OBSERVER_EVENT_DESTROY, src)
|
||||
registered_user.destruction.unregister(src)
|
||||
registered_user = null
|
||||
|
||||
/obj/item/weapon/card/id/syndicate/CanUseTopic(mob/user)
|
||||
|
||||
Reference in New Issue
Block a user