/************* * Task Datum * *************/ /datum/scheduled_task var/trigger_time var/procedure var/list/arguments var/task_after_process var/list/task_after_process_args var/datum/scheduled_task/next var/destroyed = FALSE /datum/scheduled_task/New(var/trigger_time, var/procedure, var/list/arguments, var/proc/task_after_process, var/list/task_after_process_args) ..() src.trigger_time = trigger_time src.procedure = procedure src.arguments = arguments ? arguments : list() src.task_after_process = task_after_process ? task_after_process : /proc/destroy_scheduled_task src.task_after_process_args = istype(task_after_process_args) ? task_after_process_args : list() task_after_process_args += src /datum/scheduled_task/Destroy() if (!destroyed) kill(no_del = TRUE) procedure = null arguments.Cut() task_after_process = null task_after_process_args.Cut() return ..() /datum/scheduled_task/proc/pre_process() return /datum/scheduled_task/proc/process() if(procedure) call(procedure)(arglist(arguments)) /datum/scheduled_task/proc/post_process() call(task_after_process)(arglist(task_after_process_args)) // Resets the trigger time, has no effect if the task has already triggered /datum/scheduled_task/proc/trigger_task_in(var/trigger_in) src.trigger_time = world.time + trigger_in /datum/scheduled_task/proc/kill(no_del = FALSE) if (!destroyed) warning("scheduler: Non-destroyed task was killed!") destroyed = TRUE if (src in scheduler.tasks) warning("scheduler: Task was not cleaned up correctly, rebuilding scheduler queue!") scheduler.rebuild_queue() if (!no_del) qdel(src) /datum/scheduled_task/source var/datum/source /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 ..(trigger_time, procedure, arguments, task_after_process, task_after_process_args) /datum/scheduled_task/source/Destroy() source = null return ..() /datum/scheduled_task/source/process() call(source, procedure)(arglist(arguments)) /datum/scheduled_task/source/proc/source_destroyed() destroyed = TRUE /proc/destroy_scheduled_task(var/datum/scheduled_task/st) st.destroyed = TRUE /proc/repeat_scheduled_task(var/trigger_delay, var/datum/scheduled_task/st) st.trigger_time = world.time + trigger_delay scheduler.schedule(st)