From 7a6ff116a305355b0d27e374410a5bf1773372ec Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Fri, 27 Apr 2018 20:05:11 -0400 Subject: [PATCH] POLARIS: Varset Callback --- code/_helpers/unsorted.dm | 22 ++++++++++++++++------ code/controllers/Processes/scheduler.dm | 17 +++++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index e26724ae5b..92b8d25542 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -1467,11 +1467,21 @@ var/mob/dview/dview_mob = new if(337.5) return "North-Northwest" +//This is used to force compiletime errors if you incorrectly supply variable names. Crafty! +#define NAMEOF(datum, X) (#X || ##datum.##X) +//Creates a callback with the specific purpose of setting a variable +#define VARSET_CALLBACK(datum, var, var_value) CALLBACK(GLOBAL_PROC, /proc/___callbackvarset, weakref(##datum), NAMEOF(##datum, ##var), ##var_value) - - - - - - +//Helper for the above +/proc/___callbackvarset(list_or_datum, var_name, var_value) + if(isweakref(list_or_datum)) + var/weakref/wr = list_or_datum + list_or_datum = wr.resolve() + if(!list_or_datum) + return + if(length(list_or_datum)) + list_or_datum[var_name] = var_value + return + var/datum/D = list_or_datum + D.vars[var_name] = var_value diff --git a/code/controllers/Processes/scheduler.dm b/code/controllers/Processes/scheduler.dm index a2a2f5f925..c852264bb7 100644 --- a/code/controllers/Processes/scheduler.dm +++ b/code/controllers/Processes/scheduler.dm @@ -58,6 +58,9 @@ /proc/schedule_task_in(var/in_time, var/procedure, var/list/arguments = list()) return schedule_task(world.time + in_time, procedure, arguments) +/proc/schedule_callback_in(var/in_time, var/datum/callback) + return schedule_callback(world.time + in_time, callback) + /proc/schedule_task_with_source_in(var/in_time, var/source, var/procedure, var/list/arguments = list()) return schedule_task_with_source(world.time + in_time, source, procedure, arguments) @@ -66,6 +69,11 @@ scheduler.schedule(st) return st +/proc/schedule_callback(var/trigger_time, var/datum/callback) + var/datum/scheduled_task/callback/st = new/datum/scheduled_task/callback(trigger_time, callback, /proc/destroy_scheduled_task, list()) + scheduler.schedule(st) + return st + /proc/schedule_task_with_source(var/trigger_time, var/source, var/procedure, var/list/arguments) var/datum/scheduled_task/st = new/datum/scheduled_task/source(trigger_time, source, procedure, arguments, /proc/destroy_scheduled_task, list()) scheduler.schedule(st) @@ -125,6 +133,15 @@ /datum/scheduled_task/proc/trigger_task_in(var/trigger_in) src.trigger_time = world.time + trigger_in +/datum/scheduled_task/callback + var/datum/callback/callback + +/datum/scheduled_task/callback/New(var/trigger_time, var/datum/callback, var/proc/task_after_process, var/list/task_after_process_args) + ..(trigger_time = trigger_time, task_after_process = task_after_process, task_after_process_args = task_after_process_args) + +/datum/scheduled_task/callback/process() + callback.Invoke() + /datum/scheduled_task/source var/datum/source