From aeccbece0915f75d6d678702420bbe2d53e6514c Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 28 Feb 2022 16:30:58 +1100 Subject: [PATCH 01/11] refactor: rename imports BREAKING! Since the folder name determines the import name (i.e. lib.callbacks), use better names and lowerCamelCase. --- fxmanifest.lua | 4 +- imports/{commands => addCommand}/server.lua | 0 imports/{callbacks => callback}/client.lua | 108 +++++++++--------- imports/{callbacks => callback}/server.lua | 26 ++--- .../{controls => disableControls}/client.lua | 20 ++-- init.lua | 7 +- 6 files changed, 82 insertions(+), 83 deletions(-) rename imports/{commands => addCommand}/server.lua (100%) rename imports/{callbacks => callback}/client.lua (96%) rename imports/{callbacks => callback}/server.lua (96%) rename imports/{controls => disableControls}/client.lua (70%) diff --git a/fxmanifest.lua b/fxmanifest.lua index 20901ff..75d2feb 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -23,11 +23,11 @@ game 'gta5' --[[ Resource Information ]]-- name 'ox_lib' author 'Linden' -version '1.5.0' +version '2.0.0' repository 'https://github.com/overextended/ox_lib' description 'A library of shared functions to utilise in other resources.' -[[ Manifest ]]-- +--[[ Manifest ]]-- dependencies { '/server:5104', '/onesync', diff --git a/imports/commands/server.lua b/imports/addCommand/server.lua similarity index 100% rename from imports/commands/server.lua rename to imports/addCommand/server.lua diff --git a/imports/callbacks/client.lua b/imports/callback/client.lua similarity index 96% rename from imports/callbacks/client.lua rename to imports/callback/client.lua index c624c57..d676b6e 100644 --- a/imports/callbacks/client.lua +++ b/imports/callback/client.lua @@ -1,54 +1,54 @@ -local ServerCallbacks = {} - ----@param event string ----@param delay number prevent the event from being called for the given time -local function callbackTimer(event, delay) - if type(delay) == 'number' then - local time = GetGameTimer() - if (ServerCallbacks[event] or 0) > time then - return false - end - ServerCallbacks[event] = time + delay - end - return true -end - -local function startCallback(resource, event, ...) - local id = math.random(0, 100000) - event = ('__cb_%s:%s'):format(resource, event) - TriggerServerEvent(event, id, ...) - return event..id -end - -local ServerCallback = table.create(0, 2) - ----@param resource string ----@param event string ----@param delay number prevent the event from being called for the given time ---- Sends an event to the server and halts the current thread until a response is returned. -ServerCallback.Await = function(resource, event, delay, ...) - if callbackTimer(event, delay) then - local promise = promise.new() - event = RegisterNetEvent(startCallback(resource, event, ...), function(response) - promise:resolve(response) - RemoveEventHandler(event) - end) - return table.unpack(Citizen.Await(promise)) - end -end - ----@param resource string ----@param event string ----@param delay number ----@param cb function ---- Sends an event to the server and triggers a callback function once the response is returned. -ServerCallback.Async = function(resource, event, delay, cb, ...) - if callbackTimer(event, delay) then - event = RegisterNetEvent(startCallback(resource, event, ...), function(response) - cb(table.unpack(response)) - RemoveEventHandler(event) - end) - end -end - -return ServerCallback +local ServerCallbacks = {} + +---@param event string +---@param delay number prevent the event from being called for the given time +local function callbackTimer(event, delay) + if type(delay) == 'number' then + local time = GetGameTimer() + if (ServerCallbacks[event] or 0) > time then + return false + end + ServerCallbacks[event] = time + delay + end + return true +end + +local function startCallback(resource, event, ...) + local id = math.random(0, 100000) + event = ('__cb_%s:%s'):format(resource, event) + TriggerServerEvent(event, id, ...) + return event..id +end + +local ServerCallback = table.create(0, 2) + +---@param resource string +---@param event string +---@param delay number prevent the event from being called for the given time +--- Sends an event to the server and halts the current thread until a response is returned. +ServerCallback.Await = function(resource, event, delay, ...) + if callbackTimer(event, delay) then + local promise = promise.new() + event = RegisterNetEvent(startCallback(resource, event, ...), function(response) + promise:resolve(response) + RemoveEventHandler(event) + end) + return table.unpack(Citizen.Await(promise)) + end +end + +---@param resource string +---@param event string +---@param delay number +---@param cb function +--- Sends an event to the server and triggers a callback function once the response is returned. +ServerCallback.Async = function(resource, event, delay, cb, ...) + if callbackTimer(event, delay) then + event = RegisterNetEvent(startCallback(resource, event, ...), function(response) + cb(table.unpack(response)) + RemoveEventHandler(event) + end) + end +end + +return ServerCallback diff --git a/imports/callbacks/server.lua b/imports/callback/server.lua similarity index 96% rename from imports/callbacks/server.lua rename to imports/callback/server.lua index 53a93cd..1c0065c 100644 --- a/imports/callbacks/server.lua +++ b/imports/callback/server.lua @@ -1,14 +1,14 @@ -local ServerCallback = {} - ----@param name string ----@param callback function ---- Registers an event handler and callback function to respond to client requests. -ServerCallback.Register = function(name, callback) - name = ('__cb_%s:%s'):format(GetCurrentResourceName(), name) - - RegisterServerEvent(name, function(id, ...) - TriggerClientEvent(name..id, source, {callback(source, ...)}) - end) -end - +local ServerCallback = {} + +---@param name string +---@param callback function +--- Registers an event handler and callback function to respond to client requests. +ServerCallback.Register = function(name, callback) + name = ('__cb_%s:%s'):format(GetCurrentResourceName(), name) + + RegisterServerEvent(name, function(id, ...) + TriggerClientEvent(name..id, source, {callback(source, ...)}) + end) +end + return ServerCallback \ No newline at end of file diff --git a/imports/controls/client.lua b/imports/disableControls/client.lua similarity index 70% rename from imports/controls/client.lua rename to imports/disableControls/client.lua index 6ba5fb6..dc391b0 100644 --- a/imports/controls/client.lua +++ b/imports/disableControls/client.lua @@ -1,11 +1,11 @@ --- Call on frame to disable all stored keys. --- ``` ---- DisableControlActions() +--- disableControls() --- ``` -local DisableControlActions = {} +local disableControls = {} ---@param ... number -function DisableControlActions:Add(...) +function disableControls:Add(...) local keys = type(...) == 'table' and ... or {...} for i=1, #keys do local key = keys[i] @@ -18,7 +18,7 @@ function DisableControlActions:Add(...) end ---@param ... number -function DisableControlActions:Remove(...) +function disableControls:Remove(...) local keys = type(...) == 'table' and ... or {...} for i=1, #keys do local key = keys[i] @@ -32,22 +32,22 @@ function DisableControlActions:Remove(...) end ---@param ... number -function DisableControlActions:Clear(...) +function disableControls:Clear(...) local keys = type(...) == 'table' and ... or {...} for i=1, #keys do self[keys[i]] = nil end end -local Keys = {} +local keys = {} local DisableControlAction = DisableControlAction local pairs = pairs -return setmetatable(DisableControlActions, { - __index = Keys, - __newindex = Keys, +return setmetatable(disableControls, { + __index = keys, + __newindex = keys, __call = function() - for k in pairs(Keys) do + for k in pairs(keys) do DisableControlAction(0, k, true) end end diff --git a/init.lua b/init.lua index 8118fee..a79c055 100644 --- a/init.lua +++ b/init.lua @@ -2,19 +2,18 @@ if not _VERSION:find('5.4') then error('^1Lua 5.4 must be enabled in the resource manifest!^0', 3) end - ----------------------------------------------------------------------------------------------- -- Module ----------------------------------------------------------------------------------------------- -- env local lualib = 'ox_lib' -local file = IsDuplicityVersion() and 'server' or 'client' -- micro-optimise -local rawget = rawget -local rawset = rawset local LoadResourceFile = LoadResourceFile +local file = IsDuplicityVersion() and 'server' or 'client' +local rawset = rawset +local rawget = rawget local function loadModule(self, module) local dir = ('imports/%s'):format(module) From 4ae20d4dad8e6d9bef623202846e61d16213116b Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:14:18 +1100 Subject: [PATCH 02/11] refactor(imports/callback): new syntax BREAKING! --- imports/callback/client.lua | 40 ++++++++++++++++++------------------- imports/callback/server.lua | 10 +++++----- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/imports/callback/client.lua b/imports/callback/client.lua index d676b6e..827676a 100644 --- a/imports/callback/client.lua +++ b/imports/callback/client.lua @@ -13,23 +13,28 @@ local function callbackTimer(event, delay) return true end -local function startCallback(resource, event, ...) +local function triggerCallback(event, ...) local id = math.random(0, 100000) - event = ('__cb_%s:%s'):format(resource, event) + event = ('__cb_%s'):format(event) TriggerServerEvent(event, id, ...) return event..id end -local ServerCallback = table.create(0, 2) +---Sends an event to the server and triggers a callback function once the response is returned. +---``` +---callback(event: string, delay: number, function(...) +--- print(...) +---end) +---``` +local callback = {} ----@param resource string ---@param event string ---@param delay number prevent the event from being called for the given time --- Sends an event to the server and halts the current thread until a response is returned. -ServerCallback.Await = function(resource, event, delay, ...) +function callback.await(event, delay, ...) if callbackTimer(event, delay) then local promise = promise.new() - event = RegisterNetEvent(startCallback(resource, event, ...), function(response) + event = RegisterNetEvent(triggerCallback(event, ...), function(response) promise:resolve(response) RemoveEventHandler(event) end) @@ -37,18 +42,13 @@ ServerCallback.Await = function(resource, event, delay, ...) end end ----@param resource string ----@param event string ----@param delay number ----@param cb function ---- Sends an event to the server and triggers a callback function once the response is returned. -ServerCallback.Async = function(resource, event, delay, cb, ...) - if callbackTimer(event, delay) then - event = RegisterNetEvent(startCallback(resource, event, ...), function(response) - cb(table.unpack(response)) - RemoveEventHandler(event) - end) +return setmetatable(callback, { + __call = function(event, delay, cb, ...) + if callbackTimer(event, delay) then + event = RegisterNetEvent(triggerCallback(event, ...), function(response) + cb(table.unpack(response)) + RemoveEventHandler(event) + end) + end end -end - -return ServerCallback +}) diff --git a/imports/callback/server.lua b/imports/callback/server.lua index 1c0065c..a7266fb 100644 --- a/imports/callback/server.lua +++ b/imports/callback/server.lua @@ -1,14 +1,14 @@ -local ServerCallback = {} +local callback = {} ---@param name string ---@param callback function --- Registers an event handler and callback function to respond to client requests. -ServerCallback.Register = function(name, callback) - name = ('__cb_%s:%s'):format(GetCurrentResourceName(), name) +function callback.register(name, cb) + name = ('__cb_%s'):format(name) RegisterServerEvent(name, function(id, ...) - TriggerClientEvent(name..id, source, {callback(source, ...)}) + TriggerClientEvent(name..id, source, {cb(source, ...)}) end) end -return ServerCallback \ No newline at end of file +return callback \ No newline at end of file From 6aeda784288107e07ea32a70e3b8aca2d38f6579 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Mon, 28 Feb 2022 07:20:46 +0000 Subject: [PATCH 03/11] fix(vehicleproperties): save correct tyre damage --- resource/entities/client/vehicleproperties.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resource/entities/client/vehicleproperties.lua b/resource/entities/client/vehicleproperties.lua index 070d3d1..128156c 100644 --- a/resource/entities/client/vehicleproperties.lua +++ b/resource/entities/client/vehicleproperties.lua @@ -55,8 +55,8 @@ function lib.getVehicleProperties(vehicle) end for i = 0, 5 do - if IsVehicleTyreBurst(vehicle, i, true) then - damage.tyres[i] = IsVehicleTyreBurst(vehicle, i, false) and 2 or 1 + if IsVehicleTyreBurst(vehicle, i, false) then + damage.tyres[i] = IsVehicleTyreBurst(vehicle, i, true) and 2 or 1 end end From adf08e44b87a2672ae5be9348843828cd0431608 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 1 Mar 2022 10:55:46 +0000 Subject: [PATCH 04/11] chore: move files, add docs link --- README.md | 3 +++ resource/{states => cache}/client.lua | 0 .../vehicleproperties.lua => vehicleProperties/client.lua} | 0 3 files changed, 3 insertions(+) rename resource/{states => cache}/client.lua (100%) rename resource/{entities/client/vehicleproperties.lua => vehicleProperties/client.lua} (100%) diff --git a/README.md b/README.md index 014c21f..e14040b 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,9 @@ shared_script '@ox_lib/init.lua' ``` +

Documentation

+ + Once loaded, any resource can call exports or load modules with the `lib` keyword, i.e. ```lua lib.callbacks.Register(...) diff --git a/resource/states/client.lua b/resource/cache/client.lua similarity index 100% rename from resource/states/client.lua rename to resource/cache/client.lua diff --git a/resource/entities/client/vehicleproperties.lua b/resource/vehicleProperties/client.lua similarity index 100% rename from resource/entities/client/vehicleproperties.lua rename to resource/vehicleProperties/client.lua From f8d68df5e99d49497b9f11f0a0332c3a578b392d Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 1 Mar 2022 12:28:04 +0000 Subject: [PATCH 05/11] feat(cache): add lib.cache and update event --- resource/cache/client.lua | 46 ++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/resource/cache/client.lua b/resource/cache/client.lua index 8f96407..fbbb7ae 100644 --- a/resource/cache/client.lua +++ b/resource/cache/client.lua @@ -1,17 +1,4 @@ local cache = {} -local player = LocalPlayer.state -local states = { - ['vehicle'] = true, - ['driver'] = true -} - -function cache:set(key, value) - if value ~= self[key] then - self[key] = value - - if states[key] then player:set(key, value, false) end - end -end function cache:getPed() local ped = PlayerPedId() @@ -23,9 +10,7 @@ end function cache:getVehicle() local vehicle = GetVehiclePedIsIn(self.ped, false) if vehicle > 0 then - if vehicle ~= self.vehicle then - self:set('vehicle', vehicle) - + if self:set('vehicle', vehicle) then if GetPedInVehicleSeat(vehicle, -1) == self.ped then self:set('driver', true) else @@ -36,10 +21,12 @@ function cache:getVehicle() end function cache:onFoot() + -- todo -- print('on foot') end function cache:inVehicle() + -- todo if self.driver then -- print('driving vehicle') else @@ -47,17 +34,36 @@ function cache:inVehicle() end end +local update = {} + +function cache:set(key, value) + if value ~= self[key] then + self[key] = value + update[key] = value + return true + end +end + CreateThread(function() while true do cache:getPed() cache:getVehicle() - if not cache.vehicle then - cache:onFoot() - else - cache:inVehicle() + -- if not cache.vehicle then + -- cache:onFoot() + -- else + -- cache:inVehicle() + -- end + + if cache.update then + TriggerEvent('lualib:updateCache', update) + table.wipe(update) end Wait(100) end end) + +function lib.cache(key) + return cache[key] +end \ No newline at end of file From b37e9f772f9d3289bc141f64647841e02f973649 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 1 Mar 2022 13:22:52 +0000 Subject: [PATCH 06/11] refactor(cache): save seat index instead of driver --- resource/cache/client.lua | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/resource/cache/client.lua b/resource/cache/client.lua index fbbb7ae..ececb00 100644 --- a/resource/cache/client.lua +++ b/resource/cache/client.lua @@ -11,13 +11,18 @@ function cache:getVehicle() local vehicle = GetVehiclePedIsIn(self.ped, false) if vehicle > 0 then if self:set('vehicle', vehicle) then - if GetPedInVehicleSeat(vehicle, -1) == self.ped then - self:set('driver', true) - else - self:set('driver', false) + local seats = GetVehicleMaxNumberOfPassengers(vehicle) - 1 + local GetPedInVehicleSeat = GetPedInVehicleSeat + for i = -1, seats do + if GetPedInVehicleSeat(vehicle, i) == self.ped then + return self:set('seat', i) + end end end - else self:set('vehicle', nil) end + else + self:set('vehicle', false) + self:set('seat', false) + end end function cache:onFoot() @@ -55,7 +60,7 @@ CreateThread(function() -- cache:inVehicle() -- end - if cache.update then + if next(update) then TriggerEvent('lualib:updateCache', update) table.wipe(update) end From 58faab6217416c08afcac4f53cc27e42a3232dbb Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 1 Mar 2022 13:23:47 +0000 Subject: [PATCH 07/11] feat(init): implement cache --- init.lua | 83 +++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 13 deletions(-) diff --git a/init.lua b/init.lua index a79c055..70cc22b 100644 --- a/init.lua +++ b/init.lua @@ -1,3 +1,20 @@ + +-- ox_lib +-- Copyright (C) 2021 Linden + +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. + +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. + +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see + if not _VERSION:find('5.4') then error('^1Lua 5.4 must be enabled in the resource manifest!^0', 3) end @@ -75,7 +92,6 @@ lib = setmetatable({ return lualib end, }) -import = lib local intervals = {} --- Dream of a world where this PR gets accepted. @@ -116,18 +132,59 @@ function ClearInterval(id) intervals[id] = -1 end --- ox_lib --- Copyright (C) 2021 Linden --- This program is free software: you can redistribute it and/or modify --- it under the terms of the GNU General Public License as published by --- the Free Software Foundation, either version 3 of the License, or --- (at your option) any later version. +----------------------------------------------------------------------------------------------- +-- Cache +----------------------------------------------------------------------------------------------- --- This program is distributed in the hope that it will be useful, --- but WITHOUT ANY WARRANTY; without even the implied warranty of --- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the --- GNU General Public License for more details. +local ox = GetResourceState('ox_core') ~= 'missing' and setmetatable({}, { + __index = function() + return true + end +}) or { + groups = GetResourceState('ox_groups') ~= 'missing', +} --- You should have received a copy of the GNU General Public License --- along with this program. If not, see +local cache_mt = { + __index = function(self, key) + return rawset(self, key, exports[lualib]['cache'](nil, key) or false) + end, + + __call = function(self) + table.wipe(self) + + if IsDuplicityVersion then + + else + self.playerId = PlayerId() + end + + if ox.groups then + self.groups = setmetatable({}, { + __index = function(groups, index) + groups[index] = GlobalState['group:'..index] + return groups[index] + end + }) + end + end +} + +local cache = setmetatable({}, cache_mt) + +Citizen.CreateThreadNow(function() + while true do + cache() + Wait(60000) + end +end) + +AddEventHandler('lualib:updateCache', function(data) + for key, value in pairs(data) do + if cache[key] ~= nil then + cache[key] = value + end + end +end) + +_ENV.cache = cache From a37a897b103edbadb3dccc495a7d77082fee2173 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 1 Mar 2022 13:42:39 +0000 Subject: [PATCH 08/11] feat(init): callback hook when updating cache --- init.lua | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/init.lua b/init.lua index 70cc22b..a1c538b 100644 --- a/init.lua +++ b/init.lua @@ -80,6 +80,11 @@ end lib = setmetatable({ exports = {}, + onCache = setmetatable({}, { + __call = function(self, key, cb) + self[key] = cb + end + }) }, { __index = call, __call = call, @@ -181,9 +186,11 @@ end) AddEventHandler('lualib:updateCache', function(data) for key, value in pairs(data) do - if cache[key] ~= nil then - cache[key] = value + if lib.onCache[key] then + lib.onCache[key](value, cache[key]) end + + cache[key] = value end end) From 5a30dd7ad1e6dbad5864bc9bc87f14f93a290b9a Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 1 Mar 2022 13:58:08 +0000 Subject: [PATCH 09/11] fix(init): initial cache index returns full table --- init.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/init.lua b/init.lua index a1c538b..1c10b25 100644 --- a/init.lua +++ b/init.lua @@ -152,7 +152,7 @@ local ox = GetResourceState('ox_core') ~= 'missing' and setmetatable({}, { local cache_mt = { __index = function(self, key) - return rawset(self, key, exports[lualib]['cache'](nil, key) or false) + return rawset(self, key, exports[lualib]['cache'](nil, key) or false)[key] end, __call = function(self) @@ -186,11 +186,11 @@ end) AddEventHandler('lualib:updateCache', function(data) for key, value in pairs(data) do - if lib.onCache[key] then - lib.onCache[key](value, cache[key]) - end - cache[key] = value + + if lib.onCache[key] then + lib.onCache[key](value) + end end end) From 6b8b7990c84182825d618e90916d98d637bc39d3 Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Tue, 1 Mar 2022 14:20:14 +0000 Subject: [PATCH 10/11] fix(init): incorrect server check --- init.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/init.lua b/init.lua index 1c10b25..a625e14 100644 --- a/init.lua +++ b/init.lua @@ -158,7 +158,7 @@ local cache_mt = { __call = function(self) table.wipe(self) - if IsDuplicityVersion then + if file == 'server' then else self.playerId = PlayerId() From cdc75231461b7da63c38a94712024e786d3fdd4a Mon Sep 17 00:00:00 2001 From: Linden <65407488+thelindat@users.noreply.github.com> Date: Wed, 2 Mar 2022 02:28:10 +0000 Subject: [PATCH 11/11] fix(cache): ped not triggering update event --- resource/cache/client.lua | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/resource/cache/client.lua b/resource/cache/client.lua index ececb00..c578bd5 100644 --- a/resource/cache/client.lua +++ b/resource/cache/client.lua @@ -1,12 +1,5 @@ local cache = {} -function cache:getPed() - local ped = PlayerPedId() - if ped ~= self.ped then - self.ped = ped - end -end - function cache:getVehicle() local vehicle = GetVehiclePedIsIn(self.ped, false) if vehicle > 0 then @@ -51,7 +44,7 @@ end CreateThread(function() while true do - cache:getPed() + cache:set('ped', PlayerPedId()) cache:getVehicle() -- if not cache.vehicle then