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:

sql
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. burger und Burger sind 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:

lua
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:

lua
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:

lua
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:

lua
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:

lua
if xPlayer.canCarryItem('burger', 2) then
    xPlayer.addInventoryItem('burger', 2)
else
    xPlayer.showNotification('You cannot carry that much')
end

canCarryItem(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:

lua
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.lua definiert, nicht in der SQL-Tabelle
  • Die Familie xPlayer.addInventoryItem funktioniert immer noch, da ESX sie an ox_inventory weiterleitet
  • ESX.RegisterUsableItem funktioniert immer noch, also müssen ältere Skripte nicht geändert werden
  • Das Item muss in items.lua existieren, 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.

Scripts ohne dieses Problem

Item Creator V2Erstelle nutzbare Items mit Animationen, Props, Effekten und mehr — ganz ohne Code.Script ansehen →Shop CreatorBau einen Shop in unter einer Minute — Besitzer, Angestellte, Tresore und Überfälle inklusive.Script ansehen →

Weiterlesen