From 214a7b44e07a32aaf225b5606b0dd7b70b5b09be Mon Sep 17 00:00:00 2001 From: Artem Dzhemesiuk Date: Sun, 18 Aug 2024 16:02:39 +0200 Subject: [PATCH] fix: memory, timers and config module --- src/lua/library/config.lua | 41 ++++++++++--------- src/lua/library/memory.lua | 8 ++-- .../modloader/mod/impl/ModImplLua.cpp | 5 ++- 3 files changed, 28 insertions(+), 26 deletions(-) diff --git a/src/lua/library/config.lua b/src/lua/library/config.lua index fef3625..27c064c 100644 --- a/src/lua/library/config.lua +++ b/src/lua/library/config.lua @@ -10,28 +10,10 @@ local configGetNested = __configGetNested --[[@as fun(cfg: userdata, key: string local configSet = __configSet --[[@as fun(cfg: userdata, val: any, key: string): userdata]] local configSave = __configSave --[[@as fun()]] ----@class config -local config = {} - ----@private -function config.fromHandle(handle) - local instance = setmetatable({}, config) - instance.handle = handle - return instance -end - ----Сохраняет конфиг файл на диск -function config.save() - configSave() -end - ----Обьект конфигурации текущего мода ----@type Config -config.mod = config.fromHandle(getModConfig()) - ---@class Config ---@field private handle userdata local Config = {} +Config.__index = Config ---Получает строковое значение по указанному ключу ---@param key string @@ -70,4 +52,23 @@ function Config:set(key, value) configSet(self.handle, value, key) end -return Config +---@class config +local config = {} + +---@private +function config.fromHandle(handle) + local instance = setmetatable({}, Config) + instance.handle = handle + return instance +end + +---Сохраняет конфиг файл на диск +function config.save() + configSave() +end + +---Обьект конфигурации текущего мода +---@type Config +config.mod = config.fromHandle(getModConfig()) + +return config diff --git a/src/lua/library/memory.lua b/src/lua/library/memory.lua index af4c93c..46b7366 100644 --- a/src/lua/library/memory.lua +++ b/src/lua/library/memory.lua @@ -85,7 +85,7 @@ function M.withBackup(backup) mem.__index = mem function mem.at(location, params) local oldInstance = M.at(location, params) - local instance = setmetatable({}, mem) + local instance = setmetatable({}, Memory) instance.addr = oldInstance.addr instance.unsafe = oldInstance.unsafe instance.backup = backup @@ -167,7 +167,7 @@ end ---@param offset number Оффсет от прошлого адреса (в байтах) ---@return Memory function Memory:add(offset) - return self.at(self.addr + offset) + return M.at(self.addr + offset) end ---Возвращает функцию по текущему адресу @@ -202,14 +202,14 @@ end ---Читает адрес (int32) по текущему адресу, и возвращает обьект Memory с новым адресом ---@return Memory function Memory:readOffset() - return self.at(self:readInt32()) + return M.at(self:readInt32()) end ---Читает инструкцию вызова по относительному адресу (opcode E8), и возвращает обьект Memory с адресом вызываемой функции ---@return Memory function Memory:readNearCall() local addr = self.addr - return self.at(self:add(1):readInt32() + addr + 5) + return M.at(self:add(1):readInt32() + addr + 5) end ---Читает int64 по текущему адресу (8 байт) diff --git a/src/supermod/modloader/mod/impl/ModImplLua.cpp b/src/supermod/modloader/mod/impl/ModImplLua.cpp index 8ecfdbe..b8e45ae 100644 --- a/src/supermod/modloader/mod/impl/ModImplLua.cpp +++ b/src/supermod/modloader/mod/impl/ModImplLua.cpp @@ -90,10 +90,11 @@ void ModImplLua::OnEnabled() lua.script(sdk->read("library/events.lua"), package->fenv, sol::script_throw_on_error, "built-in events"); package->builtin["timers"] = lua.script(sdk->read("library/timers.lua"), package->fenv, sol::script_throw_on_error, "built-in timers"); + tick = package->fenv["__tick"]; + auto memText = sdk->read("library/memory.lua"); HookManager::AddLuaIntrinsics(package->fenv); - package->builtin["memory"] = - lua.script(sdk->read("library/memory.lua"), package->fenv, sol::script_throw_on_error, "built-in memory"); + package->builtin["memory"] = lua.script(memText, package->fenv, sol::script_throw_on_error, "built-in memory"); HookManager::RemoveLuaIntrinsics(package->fenv); Config::AddLuaIntrinsics(package->fenv, info->GetID());