Przedmioty ESX: tabela items, RegisterUsableItem i addInventoryItem

Dodaj przedmiot do ESX: tabela SQL items, ESX.RegisterUsableItem aby to wykorzystać, addInventoryItem, removeInventoryItem, getInventoryItem i canCarryItem, plus notatka ox_inventory.

Chcesz nowy przedmiot na serwerze ESX: burgera, telefon, wytrych. W ESX przedmiot to wiersz w bazie danych, a skrypt go daje, usuwa i używa go poprzez obiekt gracza. Ten artykuł obejmuje tabelę items, uczynienie przedmiotu użytecznym, funkcje xPlayer, które codziennie używasz, i co się zmienia, gdy serwer uruchamia ox_inventory.

Tabela items

ESX czyta swoje przedmioty z tabeli items. Jej kolumny to:

Kolumna Znaczenie
name Nazwa przedmiotu użyta w kodzie. Małe litery, bez spacji
label Nazwa, którą widzą gracze
weight Waga jednego przedmiotu
rare Przechowywane do starszych zastosowań, zwykle 0
can_remove 1 jeśli gracze mogą upuścić lub usunąć przedmiot

Dodaj przedmiot za pomocą SQL:

sql
INSERT INTO `items` (`name`, `label`, `weight`, `rare`, `can_remove`)
VALUES ('burger', 'Burger', 1, 0, 1);

Uruchom ponownie ESX, lub cały serwer, aby wznowił tabelę. Jeśli twoja baza danych pokazuje inny zestaw kolumn, postępuj zgodnie z kolumnami, które ma, ponieważ wersje się trochę różnią. Jeśli nie jesteś pewny, jak uruchomić zapytanie, patrz oxmysql queries.

Ostrzeżenie: nazwa przedmiotu to klucz. burger i Burger to inne rzeczy, a przedmiot dodany ze złą pisownią milczy w większości skryptów.

Uczyń przedmiot możliwym do użytku

Zarejestruj przedmiot na serwerze, w skrypcie:

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)

Callback uruchamia się na serwerze, gdy gracz używa przedmiotu. On sam nie usuwa przedmiotu, więc usuwasz go sam. Zrób usunięcie na serwerze, a następnie powiedz klientowi, aby zagrał animację. Jeśli obiekt ma wartość nil, patrz ESX is nil: fixing getSharedObject.

Na kliencie zdarzenie musi tylko zagrać efekt:

lua
RegisterNetEvent('my_script:eatBurger', function()
    -- animation, progress bar, hunger update
end)

Daj, usuń i sprawdzaj przedmioty

To są funkcje xPlayer, które potrzebujesz:

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 zwraca tabelę z co najmniej count, label i name. Jeśli przedmiot nie istnieje w tabeli, wynik może być nil na niektórych wersjach, więc sprawdź przed przeczytaniem count.

Niezawodny wzór to sprawdzenie przed usunięciem:

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

Najpierw sprawdź wagę: canCarryItem

Przed daniem przedmiotu zapytaj, czy gracz może go nosić. Jeśli nie, addInventoryItem może się nie powieść na pełnym ekwipunku i gracz traci nagrodę:

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

canCarryItem(name, count) porównuje wagę przedmiotu z wolną wagą gracza. Używaj go wszędzie, gdzie skrypt nagradza przedmiot: prace, crafting, zdobycz. Aby znaleźć inne pomocniki, patrz ESX job setup.

Przykład: sklep, który sprzedaje przedmiot

Połącz części razem na serwerze, ze sprawdzeniem pieniędzy i wagi:

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)

Cena i przedmiot są ustalone na serwerze. Klient tylko mówi « Chcę burgera », nigdy nie wysyła ceny. Patrz securing server events dlaczego.

ESX z ox_inventory

Wiele serwerów ESX uruchamia ox_inventory zamiast domyślnego ekwipunku. Wtedy:

  • przedmioty są zdefiniowane w ox_inventory/data/items.lua, a nie w tabeli SQL
  • rodzina xPlayer.addInventoryItem wciąż działa, ponieważ ESX przekazuje ją do ox_inventory
  • ESX.RegisterUsableItem wciąż działa, więc starsze skrypty nie muszą się zmieniać
  • przedmiot musi istnieć w items.lua, lub wezwanie się nie powiedzie

Aby przełączyć, postępuj zgodnie z konfiguracją ox_inventory dla ESX i ustaw opcję niestandardowego ekwipunku w konfiguracji es_extended, aby ESX wiedział, które ekwipunku są używane. Aby dodać przedmiot sposobem ox_inventory, patrz how to add items to ox_inventory.

Porada: jeśli nie chcesz edytować SQL lub Lua dla każdego nowego przedmiotu, Item Creator pozwala ci tworzyć przedmioty w grze.

Lista kontrolna

Objaw Naprawa
Przedmiot nie istnieje Dodaj wiersz do tabeli items, lub do items.lua z ox_inventory
Przedmiot nic nie robi po użyciu Zarejestruj go za pomocą ESX.RegisterUsableItem na serwerze
addInventoryItem nic nie daje Zła nazwa, lub gracz nie może go nosić; sprawdź xPlayer.canCarryItem
Przedmiot nie usunięty po użyciu Callback musi sam wezwać removeInventoryItem
getInventoryItem to nil Nazwa przedmiotu nie jest w tabeli items
Niezgodność nazwy Nazwy są czułe na wielkość liter; użyj dokładnej wartości name

Szybkie odpowiedzi

Gdzie dodaję nowy przedmiot w ESX?

W tabeli items bazy danych, z nazwą, etykietą i wagą. Na serwerze uruchamiającym ox_inventory, przedmioty są zdefiniowane w ox_inventory/data/items.lua.

Jak uczynic przedmiot ESX możliwym do użytku?

Zarejestruj go na serwerze za pomocą ESX.RegisterUsableItem('itemname', function(source) ... end). Nazwa przedmiotu musi pasować do name w tabeli items.

Dlaczego addInventoryItem nic nie robi?

Nazwa przedmiotu nie jest w tabeli items, gracz nie może go nosić, lub użyłeś nazwy z innym kapitalizacją. Sprawdź, czy przedmiot istnieje i przetestuj za pomocą xPlayer.canCarryItem najpierw.

Skrypty bez tego problemu

Item Creator V2Twórz używalne przedmioty z animacjami, propami, efektami i nie tylko — bez pisania kodu.Zobacz skrypt →Shop CreatorZbuduj sklep w niecałą minutę — właściciele, pracownicy, sejfy i napady w zestawie.Zobacz skrypt →

Czytaj dalej