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:

lua
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ład car_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
lua
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:

lua
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)
end

Możesz także filtrować po metadanych. Przesyłaj tabelę jako czwarty argument:

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

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

lua
local slot = exports.ox_inventory:GetSlot(source, 5)
if slot and slot.name == 'car_key' then
    print(slot.metadata.plate)
end

Gdy tylko znasz przedmiot, użyj GetSlotWithItem:

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

lua
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)
end

SetMetadata(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ą.

lua
-- data/items.lua
['id_card'] = {
    label = 'ID card',
    weight = 10,
    stack = false,
    close = true,
},
lua
-- 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:

lua
-- data/items.lua
['id_card'] = {
    label = 'ID card',
    weight = 10,
    stack = false,
    server = { export = 'my_script.id_card' },
},
lua
-- 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 AddItem i SetMetadata z 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.

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