[Release] Inventory System v2.1 (Personal Menu)

Good job man you’re a god i wait impatiently for your release

Thank you for your follow up update and i will kindly expect the recolting/treatment/selling system. :thumbsup:

Are you planning to release the release today or later?

For the weed it is necessary to code in the same folder as the inventory or by creating a new file ?

1 Like

Whennnnn ;D i need this script ! Good job for the rest

1 Like

There are so many errors in the server console from your script, causing players to time out, sometimes even crash. Being a head admin on a server that’s busy 24/7, I can’t have that. So, I made major fixes to your script. I also added comments, something I see lacking big time in everyone’s scripts. Both client and server consoles are now clean.

Here’s the code, based on your latest code

server.lua

require "resources/essentialmode/lib/MySQL"
MySQL:open(database.host, database.name, database.username, database.password)

RegisterServerEvent("item:getItems")
RegisterServerEvent("item:updateQuantity")
RegisterServerEvent("item:setItem")
RegisterServerEvent("item:Reset")
RegisterServerEvent("item:sell")

local items = {}


AddEventHandler("item:getItems", function()
    items = {}
    local player = getPlayerID(source)
    local executed_query = MySQL:executeQuery("SELECT * FROM user_inventory JOIN items ON `user_inventory`.`item_id` = `items`.`id` WHERE user_id = '@username'", { ['@username'] = player })
    local result = MySQL:getResults(executed_query, { 'quantity', 'libelle', 'item_id' }, "item_id")
    if (result) then
        for _, v in ipairs(result) do
            print('-----------------')
            print(v.item_id)
            print(v.libelle)
            print(v.quantity)
            t = { ["quantity"] = v.quantity, ["libelle"] = v.libelle }
            table.insert(items, tonumber(v.item_id), t)
        end
    end
    TriggerClientEvent("gui:getItems", source, items)
end)

AddEventHandler("item:setItem", function(item, quantity)
    local player = getPlayerID(source)
    MySQL:executeQuery("INSERT INTO user_inventory (`user_id`, `item_id`, `quantity`) VALUES ('@player', @item, @qty)",
            { ['@player'] = user.identifier, ['@item'] = item, ['@qty'] = quantity })
end)

AddEventHandler("item:updateQuantity", function(qty, id)
    local player = getPlayerID(source)
    MySQL:executeQuery("UPDATE user_inventory SET `quantity` = @qty WHERE `user_id` = '@username' AND `item_id` = @id", { ['@username'] = player, ['@qty'] = tonumber(qty), ['@id'] = tonumber(id) })
end)

AddEventHandler("item:Reset", function()
	local player = getPlayerID(source)
    local executed_query = MySQL:executeQuery("SELECT * FROM user_inventory JOIN items ON `user_inventory`.`item_id` = `items`.`id` WHERE user_id = '@username'", { ['@username'] = player })
    local result = MySQL:getResults(executed_query, { 'quantity', 'libelle', 'item_id' }, "item_id")
    if (result) then
        for _, v in ipairs(result) do
            MySQL:executeQuery("UPDATE user_inventory SET `quantity` = @qty WHERE `user_id` = '@username' AND `item_id` = @id", { ['@username'] = player, ['@qty'] = 0, ['@id'] = tonumber(v.item_id) })
        end
    end
end)

AddEventHandler("item:sell", function(id, qty, price)
    local player = getPlayerID(source)
    MySQL:executeQuery("UPDATE user_inventory SET `quantity` = @qty WHERE `user_id` = '@username' AND `item_id` = @id", { ['@username'] = player, ['@qty'] = tonumber(qty), ['@id'] = tonumber(id) })
    user:addMoney(tonumber(price))
end)

-- get's the player id without having to use bugged essentials
function getPlayerID(source)
	local identifiers = GetPlayerIdentifiers(source)
	local player = getIdentifiant(identifiers)
	return player
end

-- gets the actual player id unique to the player,
-- independent of whether the player changes their screen name
function getIdentifiant(id)

	for _, v in ipairs(id) do
	    return v
	end

end

vdkinv.lua

ITEMS = {}
-- flag to keep track of whether player died to prevent
-- multiple runs of player dead code
local playerdead = false

-- register events, only needs to be done once
RegisterNetEvent("item:Reset")
RegisterNetEvent("item:getItems")
RegisterNetEvent("item:updateQuantity")
RegisterNetEvent("item:setItem")
RegisterNetEvent("item:sell")
	
function sell(arg)
    local itemId = tonumber(arg[1])
    local price = arg[2]
    local item = ITEMS[itemId]
    item.quantity = item.quantity - 1
    TriggerServerEvent("item:sell", itemId, item.quantity, price)
end

-- handles when a player spawns either from joining or after death
AddEventHandler("playerSpawned", function()
    TriggerServerEvent("item:getItems")
	-- reset player dead flag
	playerdead = false
end)

AddEventHandler("gui:getItems", function(THEITEMS)
    ITEMS = {}
    ITEMS = THEITEMS
end)

AddEventHandler("player:receiveItem", function(item, quantity)
    item = tonumber(item)
    if (ITEMS[item] == nil) then
        new(item, quantity)
    else
        add({ item, quantity })
    end
end)

AddEventHandler("player:looseItem", function(item, quantity)
    item = tonumber(item)
    if (ITEMS[item].quantity >= quantity) then
        delete({ item, quantity })
    else
        Chat("Vous n'avez pas assez de ressources")
    end
end)

function delete(arg)
    local itemId = tonumber(arg[1])
    local qty = arg[2]
    local item = ITEMS[itemId]
    item.quantity = item.quantity - qty
    TriggerServerEvent("item:updateQuantity", item.quantity, itemId)
    InventoryMenu()
end

function add(arg)
    local itemId = tonumber(arg[1])
    local qty = arg[2]
    local item = ITEMS[itemId]
    item.quantity = item.quantity + qty
    TriggerServerEvent("item:updateQuantity", item.quantity, itemId)
    InventoryMenu()
end

function new(item, quantity)
    TriggerServerEvent("item:setItem", item, quantity)
    TriggerServerEvent("item:getItems")
end

function InventoryMenu()
    ped = GetPlayerPed(-1);
    MenuTitle = "Items:"
    ClearMenu()
    for ind, value in pairs(ITEMS) do
        if (value.quantity > 0) then
            Menu.addButton(tostring(value.libelle) .. " : " .. tostring(value.quantity), "ItemMenu", ind)
        end
    end
end

function ItemMenu(itemId)
    MenuTitle = "Details:"
    ClearMenu()
    Menu.addButton("Supprimer 1", "delete", { itemId, 1 })
    Menu.addButton("Ajouter 1", "add", { itemId, 1 })
end

Citizen.CreateThread(function()
	while true do
        Citizen.Wait(0)
        if IsControlJustPressed(1, 311) then
            InventoryMenu() -- Menu to draw
            Menu.hidden = not Menu.hidden -- Hide/Show the menu
        end
        Menu.renderGUI() -- Draw menu on each tick if Menu.hidden = false
        if IsEntityDead(PlayerPedId()) then
			PlayerIsDead()
			-- prevent the death check from overloading the server
			playerdead = true
        end
    end
end)

function PlayerIsDead()
	-- do not run if already ran
	if playerdead then 
		return
	end
    TriggerServerEvent("item:Reset")
end

function Chat(debugg)
    TriggerEvent("chatMessage", '', { 0, 0x99, 255 }, tostring(debugg))
end
1 Like

Cannot add or update a child row: a foreign key constraint fails (szyxekgj_gta.user_inventory, CONSTRAINT user_inventory_ibfk_2 FOREIGN KEY (item_id) REFERENCES items (id))

Help?

hi, can you help me to fix that

Hello, I come towards you because, I installed(settled) everything as said higher, I also downloaded on your github but, I do not see items on the sideline K it posts(shows) me nothing simply item :

1 Like

UPDATE

  • 23/04 : performance improvement by separating from essentialmode event who slowdown the script, thanks to @GeekRiot
2 Likes

You add this to your code , but Where is this function , cause when we try to set item we got error

GetPlayerIdentifiers(source)

Salut , tu as ajouter une nouvelle fonction :

function getPlayerID(source)
local identifiers = GetPlayerIdentifiers(source)
local player = getIdentifiant(identifiers)
return player
end

tu as bien definis la fonction getIdentifiant mais ou est la fonction GetPlayerIdentifiers ?

1 Like

The error I got since update

1 Like

This update allow me to introduce the recolting/treatment/selling system that I will soon release

Any news on this ? :slight_smile:

Keep up the good work !

Nice job ! is possible /inspect for police job ?

It’s resolve thank you I made a mistake in RegisterNetEvent(“gui:getItems”), thank you :wink:

same error as Thefoxeur54

Can someone explain me how to add items to database (show screen database or something else)? I trying everything. This is my testing items.

Your items need to have ‘libelle’ and add a line in user_inventory

1 Like

Oh thanks. Now working!