diff --git a/__resource.lua b/__resource.lua new file mode 100644 index 00000000..44dce451 --- /dev/null +++ b/__resource.lua @@ -0,0 +1,9 @@ +resource_manifest_version '44febabe-d386-4d18-afbe-5e627f4af937' + +description 'ESX AddonInventory' + +server_scripts { + '@mysql-async/lib/MySQL.lua', + 'server/classes/addoninventory.lua', + 'server/main.lua' +} \ No newline at end of file diff --git a/server/classes/addoninventory.lua b/server/classes/addoninventory.lua new file mode 100644 index 00000000..fca3dbe9 --- /dev/null +++ b/server/classes/addoninventory.lua @@ -0,0 +1,102 @@ +function CreateAddonInventory(name, owner, items) + + local self = {} + + self.name = name + self.owner = owner + self.items = items + + self.addItem = function(name, count) + + local item = self.getItem(name) + item.count = item.count + count + + self.saveItem(name, item.count) + end + + self.removeItem = function(name, count) + + local item = self.getItem(name) + item.count = item.count - count + + self.saveItem(name, item.count) + end + + self.setItem = function(name, count) + + local item = self.getItem(name) + item.count = count + + self.saveItem(name, item.count) + end + + self.getItem = function(name) + + for i=1, #self.items, 1 do + if self.items[i].name == name then + return self.items[i] + end + end + + item = { + name = name, + count = 0, + label = Items[name] + } + + table.insert(self.items, item) + + if self.owner == nil then + MySQL.Async.execute( + 'INSERT INTO addon_inventory_items (inventory_name, name, count) VALUES (@inventory_name, @item_name, @count)', + { + ['@inventory_name'] = self.name, + ['@item_name'] = name, + ['@count'] = 0 + } + ) + else + MySQL.Async.execute( + 'INSERT INTO addon_inventory_items (inventory_name, name, count, owner) VALUES (@inventory_name, @item_name, @count, @owner)', + { + ['@inventory_name'] = self.name, + ['@item_name'] = name, + ['@count'] = 0, + ['@owner'] = self.owner + } + ) + end + + return item + + end + + self.saveItem = function(name, count) + + if self.owner == nil then + MySQL.Async.execute( + 'UPDATE addon_inventory_items SET count = @count WHERE inventory_name = @inventory_name AND name = @item_name', + { + ['@inventory_name'] = self.name, + ['@item_name'] = name, + ['@count'] = count + } + ) + else + MySQL.Async.execute( + 'UPDATE addon_inventory_items SET count = @count WHERE inventory_name = @inventory_name AND name = @item_name AND owner = @owner', + { + ['@inventory_name'] = self.name, + ['@item_name'] = name, + ['@count'] = count, + ['@owner'] = self.owner + } + ) + end + + end + + return self + +end + diff --git a/server/main.lua b/server/main.lua new file mode 100644 index 00000000..a821db2d --- /dev/null +++ b/server/main.lua @@ -0,0 +1,125 @@ +ESX = nil +Items = {} +local InventoriesIndex = {} +local Inventories = {} +local SharedInventories = {} + + +TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end) + +AddEventHandler('onMySQLReady', function() + + local items = MySQL.Sync.fetchAll('SELECT * FROM items') + + for i=1, #items, 1 do + Items[items[i].name] = items[i].label + end + + local result = MySQL.Sync.fetchAll('SELECT * FROM addon_inventory') + + for i=1, #result, 1 do + + local name = result[i].name + local label = result[i].label + local shared = result[i].shared + + local result2 = MySQL.Sync.fetchAll( + 'SELECT * FROM addon_inventory_items WHERE inventory_name = @inventory_name', + { + ['@inventory_name'] = name + } + ) + + if shared == 0 then + + table.insert(InventoriesIndex, name) + + Inventories[name] = {} + local items = {} + + for j=1, #result2, 1 do + + local itemName = result2[j].name + local itemCount = result2[j].count + local itemOwner = result2[j].owner + + if items[itemOwner] == nil then + items[itemOwner] = {} + end + + table.insert(items[itemOwner], { + name = itemName, + count = itemCount, + label = Items[itemName] + }) + + end + + for k,v in pairs(items) do + local addonInventory = CreateAddonInventory(name, k, v) + table.insert(Inventories[name], addonInventory) + end + + else + + local items = {} + + for j=1, #result2, 1 do + table.insert(items, { + name = result2[j].name, + count = result2[j].count, + label = Items[result2[j].name] + }) + end + + local addonInventory = CreateAddonInventory(name, nil, items) + SharedInventories[name] = addonInventory + + end + + end + +end) + +function GetInventory(name, owner) + for i=1, #Inventories[name], 1 do + if Inventories[name][i].owner == owner then + return Inventories[name][i] + end + end +end + +function GetSharedInventory(name) + return SharedInventories[name] +end + +AddEventHandler('esx_addoninventory:getInventory', function(name, owner, cb) + cb(GetInventory(name, owner)) +end) + +AddEventHandler('esx_addoninventory:getSharedInventory', function(name, cb) + cb(GetSharedInventory(name)) +end) + +AddEventHandler('esx:playerLoaded', function(source) + + local xPlayer = ESX.GetPlayerFromId(source) + local addonInventories = {} + + for i=1, #InventoriesIndex, 1 do + + local name = InventoriesIndex[i] + local inventory = GetInventory(name, xPlayer.identifier) + + if inventory == nil then + inventory = CreateAddonInventory(name, xPlayer.identifier, {}) + table.insert(Inventories[name], inventory) + end + + table.insert(addonInventories, inventory) + + end + + xPlayer.set('addonInventories', addonInventories) + +end)