Métadonnées d'éléments ox_inventory : AddItem, Search, SetMetadata et éléments uniques

Utiliser les métadonnées dans ox_inventory : ajouter des éléments avec des données, chercher et lire les emplacements, mettre à jour avec SetMetadata, afficher une étiquette et une description personnalisées, et créer des éléments uniques comme les identifiants et les clés.

Un élément dans ox_inventory est un nom et un nombre. Lorsque deux éléments portant le même nom doivent être différents, comme une clé de voiture pour une plaque et une clé pour une autre, vous utilisez les métadonnées : une table stockée avec l'élément. Cet article montre comment ajouter un élément avec des métadonnées, le trouver à nouveau, le lire et le mettre à jour, l'afficher, et construire des éléments uniques comme les identifiants et les clés.

Ajouter un élément avec des métadonnées

Le quatrième argument de AddItem est la table de métadonnées :

lua
exports.ox_inventory:AddItem(source, 'car_key', 1, {
    plate = 'ABC 123',
    label = 'Key ABC 123',
    description = 'Opens the car with plate ABC 123.',
})

La signature est AddItem(inventory, item, count, metadata). inventory est l'id du joueur pour un inventaire de joueur. Toute clé que vous ajoutez est stockée avec l'emplacement, et vous pouvez la lire à nouveau plus tard. Gardez les métadonnées petites et faites de données simples : chaînes, nombres, booléens et tables simples.

Astuce : l'élément doit exister dans data/items.lua, par exemple car_key. Voir adding items to ox_inventory.

L'afficher au joueur

Quelques clés de métadonnées changent ce que l'inventaire affiche :

Clé Effet
label Remplace le nom de l'élément dans l'inventaire
description Remplace la description de l'élément
image Remplace l'icône, en utilisant le nom d'une image dans web/images
lua
exports.ox_inventory:AddItem(source, 'id_card', 1, {
    label = 'ID card: Jane Doe',
    description = 'Born 1994-05-12',
    image = 'id_card',
})

Tout ce que vous mettez d'autre dans la table est stocké, mais ne s'affiche pas, à moins que la propre définition de l'élément ne l'affiche. Utilisez une label unique lorsque vous avez besoin que les joueurs distinguent les éléments d'un coup d'œil.

Chercher des éléments

Search trouve des éléments dans un inventaire. Avec 'count' il retourne le nombre, avec 'slots' il retourne les emplacements :

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

Vous pouvez également filtrer par métadonnées. Passez une table en tant que quatrième 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

C'est le moyen standard de vérifier la propriété : faites-le sur le serveur, avec les données en lesquelles vous avez confiance, jamais à partir d'un message client.

Lire un emplacement

Si vous connaissez le numéro de l'emplacement, GetSlot retourne les données de cet emplacement :

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

Lorsque vous ne connaissez que l'élément, utilisez GetSlotWithItem :

lua
local slot = exports.ox_inventory:GetSlotWithItem(source, 'car_key', { plate = 'ABC 123' })

Les deux retournent nil quand rien ne correspond, donc vérifiez le résultat avant de lire slot.metadata. Un emplacement a aussi slot.count et slot.weight.

Mettre à jour les métadonnées avec SetMetadata

Pour modifier un emplacement existant, par exemple marquer une clé comme copiée, ou réduire les charges restantes sur un élément, utilisez 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) remplace les métadonnées de l'emplacement par la table que vous donnez. Copiez d'abord la table existante, changez un champ, et envoyez la table entière en arrière, sinon vous effacez les autres clés.

Éléments uniques : identifiants, clés, permis

Pour un élément unique, vous voulez deux choses : un élément qui ne s'empile pas, et des métadonnées qui l'identifient.

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',
})

Les éléments avec des métadonnées différentes ne s'empilent pas, donc deux clés pour deux voitures occupent toujours deux emplacements, et stack = false le rend explicite pour les éléments qui ne devraient jamais.

Pour lire les données lorsque l'élément est utilisé, enregistrez une export serveur sur l'élément :

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)

L'argument event vous dit la phase de l'utilisation. Les arguments exacts dépendent de votre version d'ox_inventory, donc consultez la documentation de votre version si l'export n'est pas appelée.

Choses à regarder

  • Les métadonnées vivent sur l'emplacement. Lorsque le joueur lâche ou échange l'élément, il se déplace avec lui, et c'est l'élément qui prouve le droit d'accéder à quelque chose.
  • Ne mettez pas de secrets dans les métadonnées. Les joueurs ne voient pas les clés non listées, mais les traitent comme des données, pas comme une protection.
  • Beaucoup d'éléments avec de grandes tables de métadonnées rend l'enregistrement de l'inventaire plus lent. Stockez un id et gardez les données lourdes dans votre propre table de base de données.
  • Les métadonnées définies sur le client ne sont pas dignes de confiance. Appelez toujours AddItem et SetMetadata à partir du code serveur.

Liste de contrôle

Symptôme Correction
Deux clés fusionnent en une seule pile Elles ont des métadonnées identiques ; ajouter un champ unique comme plate
L'étiquette ne change pas Mettez label à l'intérieur de la table des métadonnées, pas dans items.lua
Search ne trouve rien Passer le bon nom d'élément, et le filtre des métadonnées comme une table
SetMetadata a effacé d'autres champs Copier les métadonnées existantes, changer une clé, envoyer la table entière
slot.metadata est nil Vérifier que l'emplacement existe et lire metadata uniquement après le contrôle nil
Données d'élément éditées par les joueurs Exécuter AddItem et SetMetadata sur le serveur uniquement

Réponses rapides

Qu'est-ce que les métadonnées dans ox_inventory ?

Une table de données supplémentaires stockées sur un emplacement d'élément. Cela permet à deux éléments avec le même nom de différer, par exemple deux clés pour différentes voitures, ou une carte d'identité pour différentes personnes.

Comment afficher du texte personnalisé sur un élément ?

Définissez label, description ou image à l'intérieur des métadonnées lorsque vous ajoutez l'élément. ox_inventory affiche celui-ci au lieu du texte par défaut de l'élément.

Les éléments avec des métadonnées différentes s'empilent-ils ?

Non. Deux éléments ne s'empilent que lorsque leurs métadonnées sont les mêmes, de sorte que les éléments avec des métadonnées uniques occupent un emplacement chacun.

Des scripts sans ce problème

Item Creator V2Créez des items utilisables avec animations, props, effets et plus — sans écrire une ligne de code.Voir le script →Shop CreatorCréez un magasin en moins d’une minute — propriétaires, employés, coffres et braquages inclus.Voir le script →

À lire aussi