Metadane przedmiotu ox_inventory: AddItem, Search, SetMetadata i unikalne przedmioty
Używaj metadanych w ox_inventory: dodaj przedmioty z danymi, szukaj i czytaj sloty, aktualizuj za pomocą SetMetadata, pokaż niestandardową etykietę i opis, i utwórz unikalne przedmioty takie jak ID i klucze.
Przedmiot w ox_inventory to nazwa i liczba. Gdy dwa przedmioty o tej samej nazwie potrzebują być różne, takie jak klucz samochodowy dla jednej tablicy i klucz dla innej, używasz metadanych: tabeli przechowywane z przedmiotem. Ten artykuł pokazuje jak dodać przedmiot z metadanymi, znaleźć go ponownie, przeczytać i zaktualizować, wyświetlić i zbudować unikalne przedmioty takie jak ID i klucze.
Dodaj przedmiot z metadanymi
Czwarty argument AddItem to tabela metadanych:
exports.ox_inventory:AddItem(source, 'car_key', 1, {
plate = 'ABC 123',
label = 'Key ABC 123',
description = 'Opens the car with plate ABC 123.',
})Podpis to AddItem(inventory, item, count, metadata). inventory to id gracza dla inwentarza gracza. Każdy klucz który dodajesz jest przechowywany ze slotem, i możesz go przeczytać ponownie później. Trzymaj metadane małe i wykonane z zwykłych danych: strings, numbers, booleans i proste tabele.
Porada: przedmiot musi istnieć w
data/items.lua, na przykładcar_key. Patrz dodawanie przedmiotów do ox_inventory.
Pokaż to graczowi
Kilka kluczy metadanych zmienia co inwentarz wyświetla:
| Klucz | Efekt |
|---|---|
label |
Zastępuje nazwę przedmiotu w inwentarzu |
description |
Zastępuje opis przedmiotu |
image |
Zastępuje ikonę, używając nazwy obrazu w web/images |
exports.ox_inventory:AddItem(source, 'id_card', 1, {
label = 'ID card: Jane Doe',
description = 'Born 1994-05-12',
image = 'id_card',
})Wszystko inne co umieścisz w tabeli jest przechowywane, ale nie wyświetlane, chyba że definicja przedmiotu je wyświetla. Użyj unikalnego label gdy potrzebujesz graczy aby odróżnili przedmioty na pierwszy rzut oka.
Szukaj przedmiotów
Search znajduje przedmioty w inwentarzu. Z 'count' zwraca ile jest, z 'slots' zwraca sloty:
local count = exports.ox_inventory:Search(source, 'count', 'car_key')
local slots = exports.ox_inventory:Search(source, 'slots', 'car_key')
for _, slot in pairs(slots) do
print(slot.slot, slot.metadata and slot.metadata.plate)
endMożesz także filtrować po metadanych. Przesyłaj tabelę jako czwarty argument:
local keys = exports.ox_inventory:Search(source, 'slots', 'car_key', { plate = 'ABC 123' })
if #keys > 0 then
-- the player has the key for that plate
endTo standardowy sposób aby sprawdzić posiadanie: zrób to na serwerze, z danymi którym ufasz, nigdy z wiadomości klienta.
Przeczytaj jeden slot
Jeśli znasz numer slotu, GetSlot zwraca dane tego slotu:
local slot = exports.ox_inventory:GetSlot(source, 5)
if slot and slot.name == 'car_key' then
print(slot.metadata.plate)
endGdy tylko znasz przedmiot, użyj GetSlotWithItem:
local slot = exports.ox_inventory:GetSlotWithItem(source, 'car_key', { plate = 'ABC 123' })Oboje zwracają nil gdy nic nie pasuje, więc sprawdź rezultat zanim przeczytasz slot.metadata. Slot ma też slot.count i slot.weight.
Aktualizuj metadane za pomocą SetMetadata
Aby zmienić istniejący slot, na przykład oznaczyć klucz jako skopiowany, lub zmniejszyć pozostałe ładunki na przedmiocie, użyj SetMetadata:
local slot = exports.ox_inventory:GetSlotWithItem(source, 'battery')
if slot then
local metadata = slot.metadata or {}
metadata.charge = (metadata.charge or 100) - 10
exports.ox_inventory:SetMetadata(source, slot.slot, metadata)
endSetMetadata(inventory, slot, metadata) zastępuje metadane slotu tabelą którą dajesz. Skopiuj istniejącą tabelę najpierw, zmień jedno pole, i wyślij całą tabelę z powrotem, inaczej wymaczesz inne klucze.
Unikalne przedmioty: ID, klucze, licencje
Dla unikalnego przedmiotu chcesz dwa rzeczy: przedmiot który się nie łączy, i metadane które go identyfikują.
-- data/items.lua
['id_card'] = {
label = 'ID card',
weight = 10,
stack = false,
close = true,
},-- server: give it at character creation
exports.ox_inventory:AddItem(source, 'id_card', 1, {
firstname = 'Jane',
lastname = 'Doe',
dob = '1994-05-12',
label = 'ID card: Jane Doe',
})Przedmioty z różnymi metadanymi się nie łączą, więc dwa klucze do dwóch samochodów zawsze zajmują dwa sloty, i stack = false robi to wyraźne dla przedmiotów które nigdy by nie powinny.
Aby przeczytać dane gdy przedmiot jest używany, zarejestruj export serwera na przedmiocie:
-- data/items.lua
['id_card'] = {
label = 'ID card',
weight = 10,
stack = false,
server = { export = 'my_script.id_card' },
},-- my_script/server.lua
exports('id_card', function(event, item, inventory, slot, data)
if event == 'usingItem' then
local info = exports.ox_inventory:GetSlot(inventory.id, slot)
if info and info.metadata then
print(info.metadata.firstname, info.metadata.lastname)
end
end
end)Argument event mówi ci fazę użycia. Dokładne argumenty zależą od wersji ox_inventory, więc sprawdź dokumentację dla twojego wydania jeśli export nie jest wołany.
Rzeczy na które zwracaj uwagę
- Metadane żyją na slocie. Gdy gracz upuści lub handluje przedmiotem, poruszają się z nim, i to przedmiot który dowodzi prawa do dostępu czegoś.
- Nie umieszczaj tajemnic w metadanych. Gracze nie widzą niewymienionych kluczy, ale traktuj je jako dane, nie jako ochronę.
- Wiele przedmiotów z dużymi tabelami metadanych sprawia że zapis inwentarza jest powolniejszy. Przechowuj id i trzymaj ciężkie dane w twojej własnej tabeli bazy danych.
- Metadane ustawione na kliencie nie są zaufane. Zawsze wołaj
AddItemiSetMetadataz kodu serwera.
Checklist
| Objaw | Naprawić |
|---|---|
| Dwa klucze łączą się w jeden stos | Mają identyczne metadane; dodaj unikalne pole takie jak plate |
| Etykieta się nie zmienia | Umieść label wewnątrz tabeli metadanych, nie w items.lua |
Search nic nie znajduje |
Przesyłaj właściwą nazwę przedmiotu, i filtr metadanych jako tabelę |
SetMetadata wytarł inne pola |
Skopiuj istniejące metadane, zmień jeden klucz, wyślij całą tabelę |
slot.metadata jest nil |
Sprawdź slot istnieje i czytaj metadata tylko po sprawdzeniu nil |
| Dane przedmiotu edytowane przez graczy | Uruchom AddItem i SetMetadata tylko na serwerze |
Szybkie odpowiedzi
Co to są metadane w ox_inventory?
Tabela dodatkowych danych przechowywanych na jednym slocie przedmiotu. Pozwala dwóm przedmiotom o tej samej nazwie się różnić, na przykład dwóm kluczom do różnych samochodów, lub ID do różnych osób.
Jak pokazać niestandardowy tekst na przedmiocie?
Ustaw label, description lub image wewnątrz metadanych gdy dodajesz przedmiot. ox_inventory pokazuje to zamiast domyślnego tekstu przedmiotu.
Czy przedmioty z różnymi metadanymi się łączą?
Nie. Dwa przedmioty łączą się tylko gdy ich metadane są takie same, więc przedmioty z unikalnymi metadanymi zajmują każdy swój slot.

