Discord + +Copyright (C) 2024 bitpredator + +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. + +ATTENTION: +You are not authorized to change the name of the resource and the resources within it. + +If you want to contribute you can open a pull request. + +You are not authorized to sell this software (this is free project). + +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 http://www.gnu.org/licenses/. \ No newline at end of file diff --git a/server-data/resources/[esx_addons]/esx_datastore/esx_datastore.sql b/server-data/resources/[bpt_addons]/bpt_datastore/bpt_datastore.sql similarity index 99% rename from server-data/resources/[esx_addons]/esx_datastore/esx_datastore.sql rename to server-data/resources/[bpt_addons]/bpt_datastore/bpt_datastore.sql index 589519d0e..ef87011a8 100644 --- a/server-data/resources/[esx_addons]/esx_datastore/esx_datastore.sql +++ b/server-data/resources/[bpt_addons]/bpt_datastore/bpt_datastore.sql @@ -17,4 +17,3 @@ CREATE TABLE `datastore_data` ( UNIQUE INDEX `index_datastore_data_name_owner` (`name`, `owner`), INDEX `index_datastore_data_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; - diff --git a/server-data/resources/[bpt_addons]/bpt_datastore/fxmanifest.lua b/server-data/resources/[bpt_addons]/bpt_datastore/fxmanifest.lua new file mode 100644 index 000000000..fe2c59587 --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_datastore/fxmanifest.lua @@ -0,0 +1,16 @@ +fx_version("adamant") + +game("gta5") + +description("Used for storing Data, such as society inventories") + +version("1.0.0") + +lua54("yes") + +server_scripts({ + "@es_extended/imports.lua", + "@oxmysql/lib/MySQL.lua", + "server/classes/datastore.lua", + "server/main.lua", +}) diff --git a/server-data/resources/[esx]/esx_society/server/main.lua b/server-data/resources/[esx]/esx_society/server/main.lua index 0236f212e..0374b9934 100644 --- a/server-data/resources/[esx]/esx_society/server/main.lua +++ b/server-data/resources/[esx]/esx_society/server/main.lua @@ -155,7 +155,7 @@ AddEventHandler("esx_society:putVehicleInGarage", function(societyName, vehicle) print(("[^3WARNING^7] Player ^5%s^7 attempted to put vehicle in non-existing society garage - ^5%s^7!"):format(source, societyName)) return end - TriggerEvent("esx_datastore:getSharedDataStore", society.datastore, function(store) + TriggerEvent("bpt_datastore:getSharedDataStore", society.datastore, function(store) local garage = store.get("garage") or {} table.insert(garage, vehicle) store.set("garage", garage) @@ -171,7 +171,7 @@ AddEventHandler("esx_society:removeVehicleFromGarage", function(societyName, veh print(("[^3WARNING^7] Player ^5%s^7 attempted to remove vehicle from non-existing society garage - ^5%s^7!"):format(source, societyName)) return end - TriggerEvent("esx_datastore:getSharedDataStore", society.datastore, function(store) + TriggerEvent("bpt_datastore:getSharedDataStore", society.datastore, function(store) local garage = store.get("garage") or {} for i = 1, #garage, 1 do @@ -398,7 +398,7 @@ ESX.RegisterServerCallback("esx_society:getVehiclesInGarage", function(_, cb, so print(("[^3WARNING^7] Attempting To get a non-existing society - %s!"):format(societyName)) return end - TriggerEvent("esx_datastore:getSharedDataStore", society.datastore, function(store) + TriggerEvent("bpt_datastore:getSharedDataStore", society.datastore, function(store) local garage = store.get("garage") or {} cb(garage) end) diff --git a/server-data/resources/[esx_addons]/esx_datastore/README.md b/server-data/resources/[esx_addons]/esx_datastore/README.md deleted file mode 100644 index 8f38d2890..000000000 --- a/server-data/resources/[esx_addons]/esx_datastore/README.md +++ /dev/null @@ -1,43 +0,0 @@ -
Discord - Website - Documentation - -A simple script for storing data :) - -# Usage - -There are two types of datastores: shared and not shared. - -- Shared datastores does not belong to a specific user, Example: police armory -- None-shared datastores are created for every user in the server. They are created in db when player is loaded, Example: property (weapons, dressing). - -## `datastore` database information - -An datastore must be configured in the database before using it. Don't forget to run a server restart afterwards (you can alternative restart the script and relog all clients) - -| `name` | `label` | `shared` | -| -------- | ------- | -------- | -| name of the datastore | label of the datastore (not used) | is the datastore shared with others? (boolean either `0` or `1`) | - -```lua -TriggerEvent('esx_datastore:getSharedDataStore', 'police', function(store) - local weapons = store.get('weapons') or {} - - table.insert(weapons, {name = 'WEAPON_PUMPSHOTGUN', ammo = 50}) - store.set('weapons', weapons) -end) - -TriggerEvent('esx_datastore:getDataStore', 'property', 'steam:0123456789', function(store) - local dressing = store.get('dressing') or {} -end) -``` - -# Legal - -esx_datastore - Datastore for ESX-Framework - -Copyright (C) 2015-2022 Jérémie N'gadi - -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 http://www.gnu.org/licenses/. diff --git a/server-data/resources/[esx_addons]/esx_datastore/fxmanifest.lua b/server-data/resources/[esx_addons]/esx_datastore/fxmanifest.lua deleted file mode 100644 index ae4a4cb07..000000000 --- a/server-data/resources/[esx_addons]/esx_datastore/fxmanifest.lua +++ /dev/null @@ -1,14 +0,0 @@ -fx_version 'adamant' - -game 'gta5' - -description 'ESX Data Store' - -version '1.7.5' - -server_scripts { - '@es_extended/imports.lua', - '@oxmysql/lib/MySQL.lua', - 'server/classes/datastore.lua', - 'server/main.lua' -} diff --git a/server-data/resources/[esx_addons]/esx_datastore/server/classes/datastore.lua b/server-data/resources/[esx_addons]/esx_datastore/server/classes/datastore.lua deleted file mode 100644 index 537113861..000000000 --- a/server-data/resources/[esx_addons]/esx_datastore/server/classes/datastore.lua +++ /dev/null @@ -1,81 +0,0 @@ -function stringsplit(inputstr, sep) - if sep == nil then - sep = "%s" - end - - local t={} ; i=1 - for str in string.gmatch(inputstr, "([^"..sep.."]+)") do - t[i] = str - i = i + 1 - end - - return t -end - -function CreateDataStore(name, owner, data) - local self = {} - - self.name = name - self.owner = owner - self.data = type(data) == 'string' and json.decode(data) or data - - local timeoutCallbacks = {} - - function self.set(key, val) - data[key] = val - self.save() - end - - function self.get(key, i) - local path = stringsplit(key, '.') - local obj = self.data - - for i=1, #path, 1 do - obj = obj[path[i]] - end - - if i == nil then - return obj - else - return obj[i] - end - end - - function self.count(key, i) - local path = stringsplit(key, '.') - local obj = self.data - - for i=1, #path, 1 do - obj = obj[path[i]] - end - - if i ~= nil then - obj = obj[i] - end - - if obj == nil then - return 0 - else - return #obj - end - end - - function self.save() - for i=1, #timeoutCallbacks, 1 do - ESX.ClearTimeout(timeoutCallbacks[i]) - timeoutCallbacks[i] = nil - end - - local timeoutCallback = ESX.SetTimeout(10000, function() - if self.owner == nil then - MySQL.update('UPDATE datastore_data SET data = ? WHERE name = ?', {json.encode(self.data), self.name}) - else - MySQL.update('UPDATE datastore_data SET data = ? WHERE name = ? and owner = ?', {json.encode(self.data), self.name, self.owner}) - end - end) - - table.insert(timeoutCallbacks, timeoutCallback) - end - - return self -end diff --git a/server-data/resources/[esx_addons]/esx_datastore/server/main.lua b/server-data/resources/[esx_addons]/esx_datastore/server/main.lua deleted file mode 100644 index fee178219..000000000 --- a/server-data/resources/[esx_addons]/esx_datastore/server/main.lua +++ /dev/null @@ -1,80 +0,0 @@ -local DataStores, DataStoresIndex, SharedDataStores = {}, {}, {} - -AddEventHandler('onResourceStart', function(resourceName) - if resourceName == GetCurrentResourceName() then - local dataStore = MySQL.query.await('SELECT * FROM datastore_data LEFT JOIN datastore ON datastore_data.name = datastore.name UNION SELECT * FROM datastore_data RIGHT JOIN datastore ON datastore_data.name = datastore.name') - - local newData = {} - for i = 1, #dataStore do - local data = dataStore[i] - if data.shared == 0 then - if not DataStores[data.name] then - DataStoresIndex[#DataStoresIndex + 1] = data.name - DataStores[data.name] = {} - end - DataStores[data.name][#DataStores[data.name] + 1] = CreateDataStore(data.name, data.owner, json.decode(data.data)) - else - if data.data then - SharedDataStores[data.name] = CreateDataStore(data.name, nil, json.decode(data.data)) - else - newData[#newData + 1] = {data.name, '\'{}\''} - end - end - end - - if next(newData) then - MySQL.prepare('INSERT INTO datastore_data (name, data) VALUES (?, ?)', newData) - for i = 1, #newData do - local new = newData[i] - SharedDataStores[new[1]] = CreateDataStore(new[1], nil, {}) - end - end - end -end) - -function GetDataStore(name, owner) - for i=1, #DataStores[name], 1 do - if DataStores[name][i].owner == owner then - return DataStores[name][i] - end - end -end - -function GetDataStoreOwners(name) - local identifiers = {} - - for i=1, #DataStores[name], 1 do - table.insert(identifiers, DataStores[name][i].owner) - end - - return identifiers -end - -function GetSharedDataStore(name) - return SharedDataStores[name] -end - -AddEventHandler('esx_datastore:getDataStore', function(name, owner, cb) - cb(GetDataStore(name, owner)) -end) - -AddEventHandler('esx_datastore:getDataStoreOwners', function(name, cb) - cb(GetDataStoreOwners(name)) -end) - -AddEventHandler('esx_datastore:getSharedDataStore', function(name, cb) - cb(GetSharedDataStore(name)) -end) - -AddEventHandler('esx:playerLoaded', function(playerId, xPlayer) - for i=1, #DataStoresIndex, 1 do - local name = DataStoresIndex[i] - local dataStore = GetDataStore(name, xPlayer.identifier) - - if not dataStore then - MySQL.insert('INSERT INTO datastore_data (name, owner, data) VALUES (?, ?, ?)', {name, xPlayer.identifier, '{}'}) - - DataStores[name][#DataStores[name] + 1] = CreateDataStore(name, xPlayer.identifier, {}) - end - end -end) diff --git a/server-data/resources/[esx_addons]/esx_policejob/README.md b/server-data/resources/[esx_addons]/esx_policejob/README.md index f8974f415..fcf228bcd 100644 --- a/server-data/resources/[esx_addons]/esx_policejob/README.md +++ b/server-data/resources/[esx_addons]/esx_policejob/README.md @@ -7,7 +7,6 @@ This resource for ESX adds police armories, vehicle garages and ability for cops * [esx_vehicleshop](https://github.com/esx-framework/esx_vehicleshop) * Player management (boss actions and armory with buyable weapons) - * [esx_datastore](https://github.com/esx-framework/esx_datastore) * [esx_society](https://github.com/esx-framework/esx_society) * ESX Identity Support diff --git a/server-data/resources/[esx_addons]/esx_policejob/server/main.lua b/server-data/resources/[esx_addons]/esx_policejob/server/main.lua index c3316be83..d98adb818 100644 --- a/server-data/resources/[esx_addons]/esx_policejob/server/main.lua +++ b/server-data/resources/[esx_addons]/esx_policejob/server/main.lua @@ -263,7 +263,7 @@ ESX.RegisterServerCallback("esx_policejob:getVehicleInfos", function(source, cb, end) ESX.RegisterServerCallback("esx_policejob:getArmoryWeapons", function(source, cb) - TriggerEvent("esx_datastore:getSharedDataStore", "society_police", function(store) + TriggerEvent("bpt_datastore:getSharedDataStore", "society_police", function(store) local weapons = store.get("weapons") if weapons == nil then @@ -281,7 +281,7 @@ ESX.RegisterServerCallback("esx_policejob:addArmoryWeapon", function(source, cb, xPlayer.removeWeapon(weaponName) end - TriggerEvent("esx_datastore:getSharedDataStore", "society_police", function(store) + TriggerEvent("bpt_datastore:getSharedDataStore", "society_police", function(store) local weapons = store.get("weapons") or {} local foundWeapon = false @@ -309,7 +309,7 @@ ESX.RegisterServerCallback("esx_policejob:removeArmoryWeapon", function(source, local xPlayer = ESX.GetPlayerFromId(source) xPlayer.addWeapon(weaponName, 500) - TriggerEvent("esx_datastore:getSharedDataStore", "society_police", function(store) + TriggerEvent("bpt_datastore:getSharedDataStore", "society_police", function(store) local weapons = store.get("weapons") or {} local foundWeapon = false diff --git a/server-data/resources/[esx_addons]/esx_property/server/main.lua b/server-data/resources/[esx_addons]/esx_property/server/main.lua index 2c8c25ccd..989bcffcf 100644 --- a/server-data/resources/[esx_addons]/esx_property/server/main.lua +++ b/server-data/resources/[esx_addons]/esx_property/server/main.lua @@ -1041,7 +1041,7 @@ end) ESX.RegisterServerCallback("esx_property:getPlayerDressing", function(source, cb) local xPlayer = ESX.GetPlayerFromId(source) - TriggerEvent("esx_datastore:getDataStore", "property", xPlayer.identifier, function(store) + TriggerEvent("bpt_datastore:getDataStore", "property", xPlayer.identifier, function(store) local count = store.count("dressing") local labels = {} @@ -1270,7 +1270,7 @@ end) ESX.RegisterServerCallback("esx_property:getPlayerOutfit", function(source, cb, num) local xPlayer = ESX.GetPlayerFromId(source) - TriggerEvent("esx_datastore:getDataStore", "property", xPlayer.identifier, function(store) + TriggerEvent("bpt_datastore:getDataStore", "property", xPlayer.identifier, function(store) local outfit = store.get("dressing", num) cb(outfit.skin) end) From cadedf43c795c99449fc132170f84304efe5b4ab Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Tue, 11 Jun 2024 11:00:48 +0200 Subject: [PATCH 2/6] convert: esx_datastore > bpt_datastore --- .../server/classes/datastore.lua | 82 +++++++++++++++++++ .../bpt_datastore/server/main.lua | 80 ++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua create mode 100644 server-data/resources/[bpt_addons]/bpt_datastore/server/main.lua diff --git a/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua b/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua new file mode 100644 index 000000000..79a103432 --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua @@ -0,0 +1,82 @@ +function stringsplit(inputstr, sep) + if sep == nil then + sep = "%s" + end + + local t = {} + i = 1 + for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do + t[i] = str + i = i + 1 + end + + return t +end + +function CreateDataStore(name, owner, data) + local self = {} + + self.name = name + self.owner = owner + self.data = type(data) == "string" and json.decode(data) or data + + local timeoutCallbacks = {} + + function self.set(key, val) + data[key] = val + self.save() + end + + function self.get(key, i) + local path = stringsplit(key, ".") + local obj = self.data + + for i = 1, #path, 1 do + obj = obj[path[i]] + end + + if i == nil then + return obj + else + return obj[i] + end + end + + function self.count(key, i) + local path = stringsplit(key, ".") + local obj = self.data + + for i = 1, #path, 1 do + obj = obj[path[i]] + end + + if i ~= nil then + obj = obj[i] + end + + if obj == nil then + return 0 + else + return #obj + end + end + + function self.save() + for i = 1, #timeoutCallbacks, 1 do + ESX.ClearTimeout(timeoutCallbacks[i]) + timeoutCallbacks[i] = nil + end + + local timeoutCallback = ESX.SetTimeout(10000, function() + if self.owner == nil then + MySQL.update("UPDATE datastore_data SET data = ? WHERE name = ?", { json.encode(self.data), self.name }) + else + MySQL.update("UPDATE datastore_data SET data = ? WHERE name = ? and owner = ?", { json.encode(self.data), self.name, self.owner }) + end + end) + + table.insert(timeoutCallbacks, timeoutCallback) + end + + return self +end diff --git a/server-data/resources/[bpt_addons]/bpt_datastore/server/main.lua b/server-data/resources/[bpt_addons]/bpt_datastore/server/main.lua new file mode 100644 index 000000000..4f38fae04 --- /dev/null +++ b/server-data/resources/[bpt_addons]/bpt_datastore/server/main.lua @@ -0,0 +1,80 @@ +local DataStores, DataStoresIndex, SharedDataStores = {}, {}, {} + +AddEventHandler("onResourceStart", function(resourceName) + if resourceName == GetCurrentResourceName() then + local dataStore = MySQL.query.await("SELECT * FROM datastore_data LEFT JOIN datastore ON datastore_data.name = datastore.name UNION SELECT * FROM datastore_data RIGHT JOIN datastore ON datastore_data.name = datastore.name") + + local newData = {} + for i = 1, #dataStore do + local data = dataStore[i] + if data.shared == 0 then + if not DataStores[data.name] then + DataStoresIndex[#DataStoresIndex + 1] = data.name + DataStores[data.name] = {} + end + DataStores[data.name][#DataStores[data.name] + 1] = CreateDataStore(data.name, data.owner, json.decode(data.data)) + else + if data.data then + SharedDataStores[data.name] = CreateDataStore(data.name, nil, json.decode(data.data)) + else + newData[#newData + 1] = { data.name, "'{}'" } + end + end + end + + if next(newData) then + MySQL.prepare("INSERT INTO datastore_data (name, data) VALUES (?, ?)", newData) + for i = 1, #newData do + local new = newData[i] + SharedDataStores[new[1]] = CreateDataStore(new[1], nil, {}) + end + end + end +end) + +function GetDataStore(name, owner) + for i = 1, #DataStores[name], 1 do + if DataStores[name][i].owner == owner then + return DataStores[name][i] + end + end +end + +function GetDataStoreOwners(name) + local identifiers = {} + + for i = 1, #DataStores[name], 1 do + table.insert(identifiers, DataStores[name][i].owner) + end + + return identifiers +end + +function GetSharedDataStore(name) + return SharedDataStores[name] +end + +AddEventHandler("bpt_datastore:getDataStore", function(name, owner, cb) + cb(GetDataStore(name, owner)) +end) + +AddEventHandler("bpt_datastore:getDataStoreOwners", function(name, cb) + cb(GetDataStoreOwners(name)) +end) + +AddEventHandler("bpt_datastore:getSharedDataStore", function(name, cb) + cb(GetSharedDataStore(name)) +end) + +AddEventHandler("esx:playerLoaded", function(playerId, xPlayer) + for i = 1, #DataStoresIndex, 1 do + local name = DataStoresIndex[i] + local dataStore = GetDataStore(name, xPlayer.identifier) + + if not dataStore then + MySQL.insert("INSERT INTO datastore_data (name, owner, data) VALUES (?, ?, ?)", { name, xPlayer.identifier, "{}" }) + + DataStores[name][#DataStores[name] + 1] = CreateDataStore(name, xPlayer.identifier, {}) + end + end +end) From 13a51681c9ca28164f2ecb6ac6b9e7c1739ccfa9 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:40:08 +0200 Subject: [PATCH 3/6] =?UTF-8?q?chore:=20bpt=5Fdatastore\server\classes\dat?= =?UTF-8?q?astore.lua=20=F0=9F=8E=A8=20Run=20formatter?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/classes/datastore.lua | 157 +++++++++--------- 1 file changed, 80 insertions(+), 77 deletions(-) diff --git a/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua b/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua index 79a103432..066b1352c 100644 --- a/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua +++ b/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua @@ -1,82 +1,85 @@ function stringsplit(inputstr, sep) - if sep == nil then - sep = "%s" - end - - local t = {} - i = 1 - for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do - t[i] = str - i = i + 1 - end - - return t + if sep == nil then + sep = "%s" + end + + local t = {} + i = 1 + for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do + t[i] = str + i = i + 1 + end + + return t end function CreateDataStore(name, owner, data) - local self = {} - - self.name = name - self.owner = owner - self.data = type(data) == "string" and json.decode(data) or data - - local timeoutCallbacks = {} - - function self.set(key, val) - data[key] = val - self.save() - end - - function self.get(key, i) - local path = stringsplit(key, ".") - local obj = self.data - - for i = 1, #path, 1 do - obj = obj[path[i]] - end - - if i == nil then - return obj - else - return obj[i] - end - end - - function self.count(key, i) - local path = stringsplit(key, ".") - local obj = self.data - - for i = 1, #path, 1 do - obj = obj[path[i]] - end - - if i ~= nil then - obj = obj[i] - end - - if obj == nil then - return 0 - else - return #obj - end - end - - function self.save() - for i = 1, #timeoutCallbacks, 1 do - ESX.ClearTimeout(timeoutCallbacks[i]) - timeoutCallbacks[i] = nil - end - - local timeoutCallback = ESX.SetTimeout(10000, function() - if self.owner == nil then - MySQL.update("UPDATE datastore_data SET data = ? WHERE name = ?", { json.encode(self.data), self.name }) - else - MySQL.update("UPDATE datastore_data SET data = ? WHERE name = ? and owner = ?", { json.encode(self.data), self.name, self.owner }) - end - end) - - table.insert(timeoutCallbacks, timeoutCallback) - end - - return self + local self = {} + + self.name = name + self.owner = owner + self.data = type(data) == "string" and json.decode(data) or data + + local timeoutCallbacks = {} + + function self.set(key, val) + data[key] = val + self.save() + end + + function self.get(key, i) + local path = stringsplit(key, ".") + local obj = self.data + + for i = 1, #path, 1 do + obj = obj[path[i]] + end + + if i == nil then + return obj + else + return obj[i] + end + end + + function self.count(key, i) + local path = stringsplit(key, ".") + local obj = self.data + + for i = 1, #path, 1 do + obj = obj[path[i]] + end + + if i ~= nil then + obj = obj[i] + end + + if obj == nil then + return 0 + else + return #obj + end + end + + function self.save() + for i = 1, #timeoutCallbacks, 1 do + ESX.ClearTimeout(timeoutCallbacks[i]) + timeoutCallbacks[i] = nil + end + + local timeoutCallback = ESX.SetTimeout(10000, function() + if self.owner == nil then + MySQL.update("UPDATE datastore_data SET data = ? WHERE name = ?", { json.encode(self.data), self.name }) + else + MySQL.update( + "UPDATE datastore_data SET data = ? WHERE name = ? and owner = ?", + { json.encode(self.data), self.name, self.owner } + ) + end + end) + + table.insert(timeoutCallbacks, timeoutCallback) + end + + return self end From b41f2d7309044308a7e1c93e59b1ace3420578a0 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:40:53 +0200 Subject: [PATCH 4/6] fix: bpt_basicneeds/client/main.lua:36: attempt to index a nil value (upvalue 'status') --- .../resources/[bpt_addons]/bpt_basicneeds/client/main.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server-data/resources/[bpt_addons]/bpt_basicneeds/client/main.lua b/server-data/resources/[bpt_addons]/bpt_basicneeds/client/main.lua index 2f59bb3c2..ec0e3d965 100644 --- a/server-data/resources/[bpt_addons]/bpt_basicneeds/client/main.lua +++ b/server-data/resources/[bpt_addons]/bpt_basicneeds/client/main.lua @@ -32,13 +32,13 @@ end) AddEventHandler("bpt_status:loaded", function(status) TriggerEvent("bpt_status:registerStatus", "hunger", 1000000, "#CFAD0F", function(status) return Config.Visible - end, function() + end, function(status) status.remove(100) end) TriggerEvent("bpt_status:registerStatus", "thirst", 1000000, "#0C98F1", function() return Config.Visible - end, function() + end, function(status) status.remove(75) end) end) From 91044174eae243da83142d3d4c26b0bc5e89face Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Wed, 12 Jun 2024 10:59:25 +0200 Subject: [PATCH 5/6] fix: accessing undefined variable i --- .../[bpt_addons]/bpt_datastore/server/classes/datastore.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua b/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua index 066b1352c..a42ff7b37 100644 --- a/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua +++ b/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua @@ -4,7 +4,7 @@ function stringsplit(inputstr, sep) end local t = {} - i = 1 + local i = 1 for str in string.gmatch(inputstr, "([^" .. sep .. "]+)") do t[i] = str i = i + 1 From 9a4e266c72bd2fa180ceb5df50666c58163d5776 Mon Sep 17 00:00:00 2001 From: bitpredator <67551273+bitpredator@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:09:41 +0200 Subject: [PATCH 6/6] fix: shadowing definition of argument i --- .../[bpt_addons]/bpt_datastore/server/classes/datastore.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua b/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua index a42ff7b37..99748e253 100644 --- a/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua +++ b/server-data/resources/[bpt_addons]/bpt_datastore/server/classes/datastore.lua @@ -31,7 +31,7 @@ function CreateDataStore(name, owner, data) local path = stringsplit(key, ".") local obj = self.data - for i = 1, #path, 1 do + for _ = 1, #path, 1 do obj = obj[path[i]] end @@ -46,7 +46,7 @@ function CreateDataStore(name, owner, data) local path = stringsplit(key, ".") local obj = self.data - for i = 1, #path, 1 do + for _ = 1, #path, 1 do obj = obj[path[i]] end