ESX Items: die items-Tabelle, RegisterUsableItem und addInventoryItem
Füge ein Item zu ESX hinzu: Die items SQL-Tabelle, ESX.RegisterUsableItem, um es nutzbar zu machen, addInventoryItem, removeInventoryItem, getInventoryItem und canCarryItem, plus die ox_inventory-Notiz.
Du möchtest ein neues Item auf deinem ESX-Server: einen Burger, ein Telefon, einen Lockpick. In ESX ist ein Item eine Zeile in der Datenbank, und ein Skript gibt, entfernt und verwendet es über das Spieler-Objekt. Dieser Artikel behandelt die Tabelle items, wie man ein Item nutzbar macht, die xPlayer-Funktionen, die du jeden Tag verwendest, und was sich ändert, wenn der Server ox_inventory lädt.
Die items-Tabelle
ESX liest seine Items aus der Tabelle items. Seine Spalten sind:
| Spalte | Bedeutung |
|---|---|
name |
Der Item-Name, der im Code verwendet wird. Kleinbuchstaben, keine Leerzeichen |
label |
Der Name, den Spieler sehen |
weight |
Gewicht eines Items |
rare |
Behalten für ältere Verwendet, normalerweise 0 |
can_remove |
1, wenn Spieler das Item fallen lassen oder entfernen dürfen |
Füge ein Item mit SQL hinzu:
INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`)
VALUES ('burger', 'Burger', 1, 0, 1);Starte ESX neu, oder den ganzen Server, damit es die Tabelle neu lädt. Wenn deine Datenbank einen anderen Satz von Spalten anzeigt, folge den Spalten, die sie hat, da Versionen ein wenig unterschiedlich sind. Wenn du unsicher bist, wie man eine Abfrage lädt, siehe oxmysql queries.
Achtung: Der Item-Name ist der Schlüssel.
burgerundBurgersind unterschiedlich, und ein Item, das mit falscher Schreibweise hinzugefügt wurde, schlägt in den meisten Skripten stillschweigend fehl.
Mache ein Item nutzbar
Registriere das Item auf dem Server, in einem Skript:
ESX = exports['es_extended']:getSharedObject()
ESX.RegisterUsableItem('burger', function(source)
local xPlayer = ESX.GetPlayerFromId(source)
if not xPlayer then return end
xPlayer.removeInventoryItem('burger', 1)
TriggerClientEvent('my_script:eatBurger', source)
end)Der Rückruf läuft auf dem Server, wenn der Spieler das Item verwendet. Es entfernt das Item nicht von selbst, also entfernst du es selbst. Führe die Entfernung auf dem Server durch, dann sage dem Client, die Animation zu spielen. Wenn das Objekt nil ist, siehe ESX is nil: fixing getSharedObject.
Auf dem Client braucht das Event nur den Effekt zu spielen:
RegisterNetEvent('my_script:eatBurger', function()
-- animation, progress bar, hunger update
end)Gib, entferne und überprüfe Items
Dies sind die xPlayer-Funktionen, die du brauchst:
local xPlayer = ESX.GetPlayerFromId(source)
-- give
xPlayer.addInventoryItem('burger', 2)
-- remove
xPlayer.removeInventoryItem('burger', 1)
-- read one item
local item = xPlayer.getInventoryItem('burger')
print(item.count)getInventoryItem gibt eine Tabelle mit mindestens count, label und name zurück. Wenn das Item nicht in der Tabelle existiert, kann das Ergebnis auf einigen Versionen nil sein, also überprüfe, bevor du count liest.
Ein zuverlässiges Muster ist zu überprüfen, bevor du entfernst:
local item = xPlayer.getInventoryItem('lockpick')
if item and item.count >= 1 then
xPlayer.removeInventoryItem('lockpick', 1)
-- do the action
else
xPlayer.showNotification('You need a lockpick')
endÜberprüfe das Gewicht zuerst: canCarryItem
Bevor du ein Item gibst, frage, ob der Spieler es tragen kann. Wenn du es nicht tust, kann addInventoryItem bei vollem Inventar fehlschlagen und der Spieler verliert die Belohnung:
if xPlayer.canCarryItem('burger', 2) then
xPlayer.addInventoryItem('burger', 2)
else
xPlayer.showNotification('You cannot carry that much')
endcanCarryItem(name, count) vergleicht das Item-Gewicht mit dem freien Gewicht des Spielers. Verwende es überall, wo ein Skript ein Item belohnt: Jobs, Crafting, Loot. Weitere Helfer findest du unter ESX job setup.
Ein Beispiel: ein Shop, der ein Item verkauft
Setze die Teile zusammen auf dem Server, mit einer Prüfung auf Geld und Gewicht:
RegisterNetEvent('my_script:buyBurger', function()
local src = source
local xPlayer = ESX.GetPlayerFromId(src)
if not xPlayer then return end
local price = 10
if xPlayer.getAccount('money').money < price then
return xPlayer.showNotification('Not enough money')
end
if not xPlayer.canCarryItem('burger', 1) then
return xPlayer.showNotification('Your inventory is full')
end
xPlayer.removeAccountMoney('money', price)
xPlayer.addInventoryItem('burger', 1)
end)Der Preis und das Item sind auf dem Server fest. Der Client sagt nur „Ich möchte einen Burger", er sendet nie den Preis. Siehe securing server events warum.
ESX mit ox_inventory
Viele ESX-Server betreiben ox_inventory anstelle des Standard-Inventars. Dann:
- Items werden in
ox_inventory/data/items.luadefiniert, nicht in der SQL-Tabelle - Die Familie
xPlayer.addInventoryItemfunktioniert immer noch, da ESX sie an ox_inventory weiterleitet ESX.RegisterUsableItemfunktioniert immer noch, also müssen ältere Skripte nicht geändert werden- Das Item muss in
items.luaexistieren, oder der Aufruf schlägt fehl
Um zu wechseln, folge dem ox_inventory-Setup für ESX, und stelle die benutzerdefinierte Inventar-Option in der Konfiguration es_extended ein, damit ESX weiß, welches Inventar verwendet wird. Um ein Item auf die ox_inventory-Weise hinzuzufügen, siehe how to add items to ox_inventory.
Tipp: Wenn du nicht für jedes neue Item SQL oder Lua bearbeiten möchtest, lässt dich Item Creator Items im Spiel erstellen.
Checkliste
| Symptom | Lösung |
|---|---|
| Item existiert nicht | Füge eine Zeile zu der Tabelle items hinzu, oder zu items.lua mit ox_inventory |
| Item macht nichts, wenn es verwendet wird | Registriere es mit ESX.RegisterUsableItem auf dem Server |
addInventoryItem gibt nichts |
Falscher Name, oder der Spieler kann es nicht tragen; überprüfe xPlayer.canCarryItem |
| Item wird nicht nach Verwendung entfernt | Der Rückruf muss removeInventoryItem selbst aufrufen |
getInventoryItem ist nil |
Der Item-Name ist nicht in der items-Tabelle |
| Name-Mismatch | Namen sind Groß-/Kleinschreibung sensibel; verwende den exakten name-Wert |
Kurze Antworten
Wo füge ich ein neues Item in ESX hinzu?
In der Tabelle items deiner Datenbank, mit einem Namen, einem Label und einem Gewicht. Auf einem Server mit ox_inventory werden Items stattdessen in ox_inventory/data/items.lua definiert.
Wie mache ich ein ESX-Item nutzbar?
Registriere es auf dem Server mit ESX.RegisterUsableItem('itemname', function(source) ... end). Der Item-Name muss dem name in der items-Tabelle entsprechen.
Warum macht addInventoryItem nichts?
Der Item-Name ist nicht in der items-Tabelle, der Spieler kann es nicht tragen, oder du hast einen Namen mit unterschiedlicher Großschreibung verwendet. Überprüfe, dass das Item existiert und teste zuerst mit xPlayer.canCarryItem.

