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.
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 ?
Whennnnn ;D i need this script ! Good job for the rest
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
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?
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 :
UPDATE
- 23/04 : performance improvement by separating from essentialmode event who slowdown the script, thanks to @GeekRiot
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 ?
This update allow me to introduce the recolting/treatment/selling system that I will soon release
Any news on this ?
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
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
Oh thanks. Now working!