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' ``` +
+ + 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