diff --git a/impl.lua b/impl.lua index 6fcf894..b451884 100644 --- a/impl.lua +++ b/impl.lua @@ -41,42 +41,6 @@ function Class:extend(obj) return self:new(...) end - --[[ -- allow for getters and setters - mt.__index = function(table, key) - local val = rawget(table._, key) - --print(key, type(val)) - if val and type(val) == "table" and (rawget(val, '__cfx_functionReference') == nil) and (val.get ~= nil or val.value ~= nil) then - if val.get then - if type(val.get) == "function" then - return val.get(table, val.value) - else - return val.get - end - elseif val.value then - return val.value - end - else - return val - end - end - - mt.__newindex = function(table, key, value) - local val = rawget(table._, key) - if val and type(val) == "table" and (rawget(val, '__cfx_functionReference') == nil) and ((val.set ~= nil and val._ == nil) or val.value ~= nil) then - local v = value - if val.set then - if type(val.set) == "function" then - v = val.set(table, value, val.value) - else - v = val.set - end - end - val.value = v - if val and val.afterSet then val.afterSet(table, v) end - else - table._[key] = value - end - end ]] setmetatable(obj, mt) @@ -304,13 +268,25 @@ end ---Create a new Implemented class ---@param name string ---@return Impl -function NewImpl(name) +function NewImpl(name, sync) ---@type Impl local impl = Impl:extend({ name = name, config = Config[name] or {}, - implType = "impl" + implType = sync and "syncImpl" or "impl" }) main:RegisterImpl(name, impl) return impl end + +function NewSyncImpl(name) + local impl = Impl:extend({ + name = name, + config = Config[name] or {}, + implType = sync and "syncImpl" or "impl", + }) + impl.start = function() + main.initializedImpls[name] = impl(main) + end + return impl +end diff --git a/main.lua b/main.lua index 6d8fcd1..1f53d0d 100644 --- a/main.lua +++ b/main.lua @@ -49,26 +49,29 @@ function Main:Init() o:Thread1() else o.ClientImpls = {} - for k, v in pairs(Config.EnableModules) do - if v then - local path = "client/impl/" .. k .. ".impl.lua" - local source = LoadResourceFile(ResourceName, path) - if source == nil then - self:LogWarning("Failed to load %s", path) - else - --[[ self:LogInfo("Loading %s", path) - self:LogInfo("Loaded %s", source) ]] - o.ClientImpls[k] = source + if Config.ClientLazyLoad then + for k, v in pairs(Config.EnableModules) do + if v and v.client then + local path = "client/impl/" .. k .. ".impl.lua" + local source = LoadResourceFile(ResourceName, path) + if source == nil then + self:LogWarning("Failed to load %s", path) + else + --[[ self:LogInfo("Loading %s", path) + self:LogInfo("Loaded %s", source) ]] + o.ClientImpls[k] = source + end end end + lib.callback.register(ResourceName .. ":getClientImpl", function(source, implName) + return o.ClientImpls[implName] + end) end - lib.callback.register(ResourceName .. ":getClientImpl", function(source, implName) - return o.ClientImpls[implName] - end) end o:Exports() o:RegisterCommands() o:RegisterEvents() + o:LogInfo("Main initialized") return o end @@ -164,21 +167,21 @@ function Main:RegisterEvents() end function Main:LogError(msg, ...) - print(("[^1ERROR^0] " .. msg):format(...)) + print(("[^1ERROR^0] " .. ("[%s] "):format(GetGameTimer()) .. msg):format(...)) end function Main:LogWarning(msg, ...) - print(("[^3WARNING^0] " .. msg):format(...)) + print(("[^3WARNING^0] " .. ("[%s] "):format(GetGameTimer()) .. msg):format(...)) end function Main:LogSuccess(msg, ...) if not Config.Debug then return end - print(("[^2INFO^0] " .. msg):format(...)) + print(("[^2INFO^0] " .. ("[%s] "):format(GetGameTimer()) .. msg):format(...)) end function Main:LogInfo(msg, ...) if not Config.Debug then return end - print(("[^5INFO^0] " .. msg):format(...)) + print(("[^5INFO^0] " .. ("[%s] "):format(GetGameTimer()) .. msg):format(...)) end function Main:CheckValidImpl(name, impl) @@ -194,6 +197,9 @@ function Main:CheckValidImpl(name, impl) end function Main:RegisterImpl(name, impl) + if impl.implType == "syncImpl" then + return + end if impl.implType == "impl" and (Config.EnableModules[name] == nil or not Config.EnableModules[name].enabled) then self:LogWarning("Impl %s not enabled", name) return @@ -357,6 +363,16 @@ function Main:Exports() end) end +function Main:ToggleUI(state) + self.showUI = state + if Config.Nui then + SendNUIMessage({ + event = "main:setShow", + data = state + }) + end +end + main = Main:Init() AddEventHandler(("%s:onReady"):format(GetCurrentResourceName()), function(handler) local invokingResource = GetInvokingResource() @@ -364,25 +380,7 @@ AddEventHandler(("%s:onReady"):format(GetCurrentResourceName()), function(handle main:ListenOnReady(handler) end) ---[[ local origAddEventHandler = AddEventHandler -function AddEventHandler(eventName, ...) - if RegisteredEvents[eventName] then - main:LogWarning("Event %s already registered. Removing", eventName) - RemoveEventHandler(RegisteredEvents[eventName]) - end - RegisteredEvents[eventName] = origAddEventHandler(eventName, ...) - return RegisteredEvents[eventName] -end -local origRegisterNetEvent = RegisterNetEvent -function RegisterNetEvent(eventName, ...) - if RegisteredEvents[eventName] then - main:LogWarning("Event %s already registered. Removing", eventName) - RemoveEventHandler(RegisteredEvents[eventName]) - end - RegisteredEvents[eventName] = origRegisterNetEvent(eventName, ...) - return RegisteredEvents[eventName] -end ]] Citizen.CreateThread(function() while GetGameTimer() < main.lastTimeImplRegistered + 1000 do @@ -417,6 +415,11 @@ Citizen.CreateThread(function() Wait(100) player = Framework.Functions.GetPlayerData() end + elseif Config.Framework == 'ProjectStarboy' then + while not CORE.PlayerData.loaded do + Wait(100) + main:LogInfo("Waiting for player loaded") + end end while not NuiReady and Config.Nui do Wait(100)