From b28aa718459f8b5b960870063d6e10946cc5ca06 Mon Sep 17 00:00:00 2001 From: MihailRis Date: Fri, 1 Aug 2025 21:08:23 +0300 Subject: [PATCH] add Schedule class & add time.schedule.world schedule group --- res/modules/schedule.lua | 37 +++++++++++++++++++++++++++++++ res/scripts/stdlib.lua | 33 +++++++++++++++++++++++++++ src/logic/scripting/scripting.cpp | 3 +++ 3 files changed, 73 insertions(+) create mode 100644 res/modules/schedule.lua diff --git a/res/modules/schedule.lua b/res/modules/schedule.lua new file mode 100644 index 00000000..91e47813 --- /dev/null +++ b/res/modules/schedule.lua @@ -0,0 +1,37 @@ +local Schedule = { + __index = { + set_interval = function(self, ms, callback) + local id = self._next_interval + self._intervals[id] = { + last_called = 0.0, + delay = ms / 1000.0, + callback = callback, + } + self._next_interval = id + 1 + return id + end, + tick = function(self, dt) + local timer = self._timer + dt + for id, interval in pairs(self._intervals) do + if timer - interval.last_called >= interval.delay then + xpcall(interval.callback, function(s) + debug.error(s..'\n'..debug.traceback()) + end) + interval.last_called = timer + end + end + self._timer = timer + end, + remove_interval = function (self, id) + self._intervals[id] = nil + end + } +} + +return function () + return setmetatable({ + _next_interval = 1, + _timer = 0.0, + _intervals = {}, + }, Schedule) +end diff --git a/res/scripts/stdlib.lua b/res/scripts/stdlib.lua index 765d2c08..060d40f0 100644 --- a/res/scripts/stdlib.lua +++ b/res/scripts/stdlib.lua @@ -450,8 +450,37 @@ function __vc_on_hud_open() hud.open_permanent("core:ingame_chat") end +local ScheduleGroup_mt = { + __index = { + publish = function(self, schedule) + local id = self._next_schedule + self._schedules[id] = schedule + self._next_schedule = id + 1 + end, + tick = function(self, dt) + for id, schedule in pairs(self._schedules) do + schedule:tick(dt) + end + end, + remove = function(self, id) + self._schedules[id] = nil + end + } +} + +local function ScheduleGroup() + return setmetatable({ + _next_schedule = 1, + _schedules = {}, + }, ScheduleGroup_mt) +end + +time.schedules = {} + local RULES_FILE = "world:rules.toml" function __vc_on_world_open() + time.schedules.world = ScheduleGroup() + if not file.exists(RULES_FILE) then return end @@ -461,6 +490,10 @@ function __vc_on_world_open() end end +function __vc_on_world_tick() + time.schedules.world:tick(1.0 / 20.0) +end + function __vc_on_world_save() local rule_values = {} for name, rule in pairs(rules.rules) do diff --git a/src/logic/scripting/scripting.cpp b/src/logic/scripting/scripting.cpp index f766f29d..5da5b3ba 100644 --- a/src/logic/scripting/scripting.cpp +++ b/src/logic/scripting/scripting.cpp @@ -299,6 +299,9 @@ void scripting::on_world_load(LevelController* controller) { void scripting::on_world_tick() { auto L = lua::get_main_state(); + if (lua::getglobal(L, "__vc_on_world_tick")) { + lua::call_nothrow(L, 0, 0); + } for (auto& pack : content_control->getAllContentPacks()) { lua::emit_event(L, pack.id + ":.worldtick"); }