diff --git a/code/datums/helper_datums/events.dm b/code/datums/helper_datums/events.dm index fa0dccd2a15..e42615716c0 100644 --- a/code/datums/helper_datums/events.dm +++ b/code/datums/helper_datums/events.dm @@ -10,59 +10,45 @@ ..() events = new +/datum/events/Destroy() + for(var/elist in events) + for(var/e in events[elist]) + qdel(e) + events = null + return ..() + /datum/events/proc/addEventType(event_type as text) if(!(event_type in events) || !islist(events[event_type])) events[event_type] = list() - return 1 - return - + return TRUE + return FALSE // Arguments: event_type as text, proc_holder as datum, proc_name as text // Returns: New event, null on error. -/datum/events/proc/addEvent(event_type as text, proc_holder, proc_name as text) - if(!event_type || !proc_holder || !proc_name) +/datum/events/proc/addEvent(event_type as text, datum/callback/cb) + if(!event_type || !cb) return addEventType(event_type) var/list/event = events[event_type] - var/datum/event/E = new /datum/event(proc_holder,proc_name) - event += E - return E + event += cb + return cb // Arguments: event_type as text, any number of additional arguments to pass to event handler // Returns: null -/datum/events/proc/fireEvent() - //world << "Events in [args[1]] called" - var/list/event = listgetindex(events,args[1]) +/datum/events/proc/fireEvent(eventName, ...) + var/list/event = listgetindex(events,eventName) if(istype(event)) - spawn(0) - for(var/datum/event/E in event) - if(!E.Fire(arglist(args.Copy(2)))) - clearEvent(args[1],E) - return + for(var/E in event) + var/datum/callback/cb = E + cb.InvokeAsync(arglist(args.Copy(2))) // Arguments: event_type as text, E as /datum/event -// Returns: 1 if event cleared, null on error +// Returns: TRUE if event cleared, FALSE on error -/datum/events/proc/clearEvent(event_type as text, datum/event/E) - if(!event_type || !E) - return +/datum/events/proc/clearEvent(event_type as text, datum/callback/cb) + if(!event_type || !cb) + return FALSE var/list/event = listgetindex(events,event_type) - event -= E - return 1 - - -/datum/event - var/listener - var/proc_name - -/datum/event/New(tlistener,tprocname) - listener = tlistener - proc_name = tprocname - return ..() - -/datum/event/proc/Fire() - //world << "Event fired" - if(listener) - call(listener,proc_name)(arglist(args)) - return 1 - return + event -= cb + qdel(cb) + return TRUE diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index fdfe4916e0a..9b193245c04 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -294,7 +294,7 @@ name = "cable layer" desc = "Equipment for engineering exosuits. Lays cable along the exosuit's path." icon_state = "mecha_wire" - var/datum/event/event + var/datum/callback/event var/turf/old_turf var/obj/structure/cable/last_piece var/obj/item/stack/cable_coil/cable @@ -313,7 +313,7 @@ /obj/item/mecha_parts/mecha_equipment/cable_layer/attach() ..() - event = chassis.events.addEvent("onMove",src,"layCable") + event = chassis.events.addEvent("onMove", CALLBACK(src, .proc/layCable)) return /obj/item/mecha_parts/mecha_equipment/cable_layer/detach() diff --git a/code/modules/security_levels/keycard_authentication.dm b/code/modules/security_levels/keycard_authentication.dm index 2aa6ee013f1..77609af73dc 100644 --- a/code/modules/security_levels/keycard_authentication.dm +++ b/code/modules/security_levels/keycard_authentication.dm @@ -12,7 +12,7 @@ var/datum/events/keycard_events = new() power_channel = ENVIRON req_access = list(access_keycard_auth) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - var/datum/event/ev + var/datum/callback/ev var/event = "" var/obj/machinery/keycard_auth/event_source var/mob/triggerer = null @@ -20,7 +20,7 @@ var/datum/events/keycard_events = new() /obj/machinery/keycard_auth/New() . = ..() - ev = keycard_events.addEvent("triggerEvent", src, "triggerEvent") + ev = keycard_events.addEvent("triggerEvent", CALLBACK(src, .proc/triggerEvent)) /obj/machinery/keycard_auth/Destroy() keycard_events.clearEvent("triggerEvent", ev)