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:
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.
burgeriBurgerto 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:
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:
RegisterNetEvent('my_script:eatBurger', function()
-- animation, progress bar, hunger update
end)Daj, usuń i sprawdzaj przedmioty
To są funkcje xPlayer, które potrzebujesz:
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:
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')
endNajpierw 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ę:
if xPlayer.canCarryItem('burger', 2) then
xPlayer.addInventoryItem('burger', 2)
else
xPlayer.showNotification('You cannot carry that much')
endcanCarryItem(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:
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.addInventoryItemwciąż działa, ponieważ ESX przekazuje ją do ox_inventory ESX.RegisterUsableItemwciąż 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.

