Add MP.CreateTimer(), MP.CreateEventTimer(), MP.CancelEventTimer()

This commit is contained in:
Maxim Khomutov 2023-07-22 07:48:35 +03:00
parent 33f2d2ba72
commit 132beb0dd6
2 changed files with 133 additions and 19 deletions

View File

@ -1,10 +1,5 @@
package.path = package.path..";modules/PluginsLoader/lua_libs/?.lua" package.path = package.path..";modules/PluginsLoader/lua_libs/?.lua"
function MP.Sleep(time_ms)
local start = getTickCount()
while getTickCount() - start < time_ms do end
end
MP.CallStrategy = { MP.CallStrategy = {
BestEffort = 0, BestEffort = 0,
Precise = 1 Precise = 1
@ -19,3 +14,87 @@ MP.Settings = {
Name = 5, Name = 5,
Description = 6 Description = 6
} }
function MP.CreateTimer()
MP.log.debug("request MP.CreateTimer()")
local timer = {}
timer.start_time = os.clock()
function timer:GetCurrent()
return os.clock() - self.start_time
end
function timer:Start()
self.start_time = os.clock()
end
return timer
end
----Timer object for event timers
--local TimedEvent = {}
--TimedEvent.__index = TimedEvent
--
--function TimedEvent:new(interval_ms, event_name, strategy)
-- local o = {}
-- setmetatable(o, self)
-- o.interval = interval_ms
-- o.event_name = event_name
-- o.strategy = strategy or MP.CallStrategy.BestEffort
-- o.last_trigger_time = 0
-- o.timer = MP.CreateTimer()
-- return o
--end
--
--function TimedEvent:trigger()
-- MP.TriggerLocalEvent(self.event_name)
-- self.last_trigger_time = self.timer:GetCurrent()
--end
--
--function TimedEvent:is_ready()
-- local elapsed_time = self.timer:GetCurrent() - self.last_trigger_time
-- return elapsed_time * 1000 >= self.interval
--end
--
---- Event timer management functions
--MP.event_timers = {}
--MP.event_timers_mutex = {}
--
--function MP.CreateEventTimer(event_name, interval_ms, strategy)
-- MP.log.debug("request MP.CreateEventTimer()")
-- strategy = strategy or MP.CallStrategy.BestEffort
-- local timer = TimedEvent:new(interval_ms, event_name, strategy)
-- table.insert(MP.event_timers, timer)
-- MP.log.debug("created event timer for \"" .. event_name .. "\" with " .. interval_ms .. "ms interval")
--end
--
--function MP.CancelEventTimer(event_name)
-- MP.log.debug("request MP.CancelEventTimer()")
-- for i, timer in ipairs(MP.event_timers) do
-- if timer.event_name == event_name then
-- table.remove(MP.event_timers, i)
-- end
-- end
-- MP.log.debug("cancelled event timer for \"" .. event_name .. "\"")
--end
--
--function MP.run_event_timers()
-- MP.log.debug("request MP.run_event_timers()")
-- while true do
-- -- Wait for some time before checking timers
-- MP.Sleep(100)
--
-- -- Check each timer and trigger events as necessary
-- for _, timer in ipairs(MP.event_timers) do
-- if timer:is_ready() then
-- if timer.strategy == MP.CallStrategy.Precise then
-- while timer:is_ready() do
-- timer:trigger()
-- end
-- else
-- timer:trigger()
-- end
-- end
-- end
-- end
--end

View File

@ -4,6 +4,9 @@ import os
import platform import platform
import random import random
import shutil import shutil
import threading
import time
from threading import Thread
import toml import toml
from lupa.lua53 import LuaRuntime from lupa.lua53 import LuaRuntime
@ -11,11 +14,37 @@ from lupa.lua53 import LuaRuntime
from core import get_logger from core import get_logger
class EventTimer:
def __init__(self, event_name, interval_ms, strategy=None):
self.event_name = event_name
self.interval_ms = interval_ms
self.strategy = strategy
self.timer = None
self.stopped = False
def start(self):
def callback():
if not self.stopped:
self.start()
self.trigger_event()
self.timer = threading.Timer(self.interval_ms / 1000.0, callback)
self.timer.start()
def stop(self):
self.stopped = True
if self.timer is not None:
self.timer.cancel()
def trigger_event(self):
# trigger the event with the given name
print(f"Event '{self.event_name}' triggered")
# noinspection PyPep8Naming # noinspection PyPep8Naming
class MP: class MP:
# In ./in_lua.lua # In ./in_lua.lua
# MP.Sleep
def __init__(self, name: str, lua: LuaRuntime): def __init__(self, name: str, lua: LuaRuntime):
self.loaded = False self.loaded = False
@ -30,6 +59,7 @@ class MP:
"onPlayerJoin": [], "onPlayerDisconnect": [], "onChatMessage": [], "onVehicleSpawn": [], "onPlayerJoin": [], "onPlayerDisconnect": [], "onChatMessage": [], "onVehicleSpawn": [],
"onVehicleEdited": [], "onVehicleDeleted": [], "onVehicleReset": [], "onFileChanged": [] "onVehicleEdited": [], "onVehicleDeleted": [], "onVehicleReset": [], "onFileChanged": []
} }
self._event_timers = {}
def _print(self, *args): def _print(self, *args):
args = list(args) args = list(args)
@ -39,11 +69,6 @@ class MP:
s = " ".join(map(str, args)) s = " ".join(map(str, args))
self.log.info(s) self.log.info(s)
def CreateTimer(self):
self.log.debug("request CreateTimer()")
# TODO: CreateTimer
self.log.warning("KuiToi does not currently support: MP.CreateTimer()")
def GetOSName(self) -> str: def GetOSName(self) -> str:
self.log.debug("request MP.GetOSName()") self.log.debug("request MP.GetOSName()")
pl = platform.system() pl = platform.system()
@ -78,13 +103,16 @@ class MP:
def CreateEventTimer(self, event_name: str, interval_ms: int, strategy: int = None): def CreateEventTimer(self, event_name: str, interval_ms: int, strategy: int = None):
self.log.debug("request CreateEventTimer()") self.log.debug("request CreateEventTimer()")
# TODO: CreateEventTimer event_timer = EventTimer(event_name, interval_ms, strategy)
self.log.warning("KuiToi does not currently support: MP.CreateEventTimer()") self._event_timers[event_name] = event_timer
event_timer.start()
def CancelEventTimer(self, event_name: str): def CancelEventTimer(self, event_name: str):
self.log.debug("request CancelEventTimer()") self.log.debug("request CancelEventTimer()")
# TODO: CancelEventTimer if event_name in self._event_timers:
self.log.warning("KuiToi does not currently support: MP.CancelEventTimer()") event_timer = self._event_timers[event_name]
event_timer.stop()
del self._event_timers[event_name]
def TriggerLocalEvent(self, event_name, *args): def TriggerLocalEvent(self, event_name, *args):
self.log.debug("request TriggerLocalEvent()") self.log.debug("request TriggerLocalEvent()")
@ -110,6 +138,10 @@ class MP:
GetResults=lambda: self._lua.table_from(ev.call_lua_event(event_name, *args)) GetResults=lambda: self._lua.table_from(ev.call_lua_event(event_name, *args))
) )
def Sleep(self, time_ms):
self.log.debug(f"request Sleep(); Thread: {threading.current_thread().name}")
time.sleep(time_ms * 0.001)
def SendChatMessage(self, player_id, message): def SendChatMessage(self, player_id, message):
self.log.debug("request SendChatMessage()") self.log.debug("request SendChatMessage()")
client = ev.call_event("_get_player", cid=player_id)[0] client = ev.call_event("_get_player", cid=player_id)[0]
@ -585,8 +617,6 @@ class LuaPluginsLoader:
} }
with open("ServerConfig.toml", "w") as f: with open("ServerConfig.toml", "w") as f:
toml.dump(data, f) toml.dump(data, f)
self.log.warning("KuiToi does not currently support: MP.CreateTimer(), MP.CreateEventTimer(), "
"MP.CancelEventTimer()")
self.log.warning("KuiToi will not support at all: MP.Set()") self.log.warning("KuiToi will not support at all: MP.Set()")
py_folders = ev.call_event("_plugins_get")[0] py_folders = ev.call_event("_plugins_get")[0]
for name in os.listdir(self.plugins_dir): for name in os.listdir(self.plugins_dir):
@ -617,7 +647,7 @@ class LuaPluginsLoader:
lua_globals.package.path += f';{p0};{p1}' lua_globals.package.path += f';{p0};{p1}'
with open("modules/PluginsLoader/add_in.lua", "r") as f: with open("modules/PluginsLoader/add_in.lua", "r") as f:
lua.execute(f.read()) lua.execute(f.read())
self.lua_plugins.update({name: {"lua": lua, "ok": False}}) self.lua_plugins.update({name: {"lua": lua, "ok": False, "th": None, "stop_th": None}})
plugin_path = os.path.join(self.plugins_dir, name) plugin_path = os.path.join(self.plugins_dir, name)
for file in os.listdir(plugin_path): for file in os.listdir(plugin_path):
path = f"plugins/{name}/{file}" path = f"plugins/{name}/{file}"
@ -640,4 +670,9 @@ class LuaPluginsLoader:
self.log.exception(e) self.log.exception(e)
def unload(self, _): def unload(self, _):
... self.log.debug("Unloading lua plugins")
for k, data in self.lua_plugins.items():
if data['ok']:
self.log.debug(f"Unloading lua plugin: {k}")
# data['stop_th']()
# data['th'].join()