Observer fixups.

Adds a proper proc for raising events.
Now only creates the observer lists when an object registers itself.
Multitools now unregister themselves properly from buffers on Destroy().
This commit is contained in:
PsiOmegaDelta
2015-12-12 12:06:05 +01:00
parent 39af995c05
commit f74bd5e1d9
2 changed files with 30 additions and 16 deletions
@@ -4,28 +4,38 @@
var/list/observer_events
/datum/Destroy()
var/list/destroy_listeners = get_listener_list_from_event(OBSERVER_EVENT_DESTROY)
if(destroy_listeners)
for(var/destroy_listener in destroy_listeners)
call(destroy_listener, destroy_listeners[destroy_listener])(src)
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)
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)
var/list/listeners = get_listener_list_from_event(event, FALSE)
listeners -= procOwner
/datum/proc/get_listener_list_from_event(var/observer_event)
if(!observer_events) observer_events = list()
/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)
listeners = list()
observer_events[observer_event] = listeners
if(create_list)
listeners = list()
observer_events[observer_event] = listeners
else
return
return listeners