Armes et munitions ox_inventory : data/weapons.lua et armes qui disparaissent

Les armes disparaissent après reconnexion avec ox_inventory ? Comment les armes fonctionnent comme des éléments : data/weapons.lua, éléments de munitions, durabilité, AddItem pour WEAPON_PISTOL, et accessoires.

Vous donnez à un joueur un pistolet avec un menu d'administrateur ou un script d'emploi. Il se déconnecte, revient, et le pistolet est parti. Avec ox_inventory, les armes ne sont pas un équipement séparé : ce sont des éléments, et tout ce qui n'est pas un élément est supprimé. Cet article explique comment les armes et les munitions fonctionnent, comment les donner correctement, et où régler la durabilité et les accessoires.

Les armes sont des éléments

Dans ox_inventory, le nom d'élément d'une arme est son nom de hash, par exemple WEAPON_PISTOL. Elles sont définies dans ox_inventory/data/weapons.lua, pas dans items.lua. Le fichier retourne trois groupes :

lua
return {
    Weapons = {
        ['WEAPON_PISTOL'] = {
            label = 'Pistol',
            weight = 1130,
            durability = 0.1,
        },
        -- ...
    },
    Components = {
        -- attachments
    },
    Ammo = {
        -- ammo definitions
    },
}

Ouvrez le fichier dans votre installation : chaque arme par défaut a une entrée prête, et c'est la référence pour les champs exacts de votre version. Une arme manquante de Weapons n'est simplement pas un élément valide.

Pourquoi les armes disparaissent lors de la reconnexion

Les anciens scripts ESX et QBCore donnent des armes avec des natives comme GiveWeaponToPed, ou avec xPlayer.addWeapon d'ESX. Cela met l'arme dans les mains du ped pour cette session, mais ce n'est pas un élément et rien n'est sauvegardé. ox_inventory supprime également les armes qui ne sont pas dans l'inventaire, elles disparaissent donc lors de la reconnexion ou encore plus tôt.

La correction est de donner les armes comme des éléments, du serveur :

lua
local success = exports.ox_inventory:AddItem(source, 'WEAPON_PISTOL', 1)
if not success then
    print('Could not give the weapon: inventory full or unknown weapon')
end

Remplacez chaque appel de script qui accorde une arme avec une native, addWeapon ou Player.Functions.AddItem('weapon_pistol', ...) par un appel AddItem avec le nom d'arme en majuscules. Un script qui ne fonctionne que via une native, comme un magasin qui crée une arme à la main, a besoin ce changement avant de fonctionner sur un serveur utilisant ox_inventory.

Astuce : les noms d'armes sont sensibles à la casse dans les listes d'éléments, et WEAPON_PISTOL est la forme que ox_inventory utilise. Un ancien script qui envoie weapon_pistol peut échouer pour cette raison.

Éléments de munitions

Les munitions sont aussi un élément. Le type de munitions est nommé par le ammoname d'une arme dans son entrée, par exemple ammo-9 pour 9 mm :

lua
exports.ox_inventory:AddItem(source, 'ammo-9', 60)

Lorsqu'un joueur utilise un élément de munitions avec une arme équipée qui l'accepte, ox_inventory le charge dans l'arme, et l'arme garde son propre nombre de munitions dans ses métadonnées. Les munitions s'affichent comme un élément dans l'inventaire lorsqu'elles ne sont pas chargées.

Vérifiez les noms d'éléments sur votre version dans data/items.lua et data/weapons.lua. Le motif est ammo-<type>, par exemple ammo-9, ammo-rifle, ammo-shotgun, et un élément qui n'existe pas ne peut pas être ajouté.

Durabilité et dégradation

Les armes s'usent lorsqu'elles sont utilisées. La valeur durability dans l'entrée d'arme définit à quelle vitesse : un nombre plus élevé signifie qu'elle se dégrade plus vite. Une arme à zéro durabilité ne fonctionne pas jusqu'à ce qu'elle soit réparée.

lua
['WEAPON_PISTOL'] = {
    label = 'Pistol',
    weight = 1130,
    durability = 0.05,
},

Abaissez le nombre pour que une arme dure plus longtemps. La réparation est un choix de gameplay : de nombreux serveurs utilisent un élément de réparation, une recette d'artisanat ou un mécanicien, et vous pouvez réinitialiser la durabilité avec SetMetadata (voir item metadata in ox_inventory).

Accessoires (composants)

Les accessoires tels qu'une lampe de poche, un silencieux ou un chargeur sont des éléments énumérés dans le groupe Components, et ils ont leurs propres entrées dans items.lua. Un joueur en met un en l'utilisant tandis que l'arme est équipée. Le composant est stocké sur l'élément d'arme, de sorte qu'il survit à une reconnexion.

Si un accessoire ne fait rien, vérifiez ces trois choses :

  • l'élément composant existe dans data/items.lua
  • il est listé pour cette arme dans data/weapons.lua
  • l'arme est équipée lorsque le composant est utilisé

Vous pouvez également ajouter un composant à partir du serveur via les métadonnées d'arme, par exemple lorsque vous vendez une arme pré-construite, mais testez d'abord avec un pistolet normal, car le format des métadonnées dépend de votre version.

Vendre des armes dans les magasins

Les armes apparaissent dans un magasin comme n'importe quel élément, avec le même nom :

lua
{ name = 'WEAPON_PISTOL', price = 2500, license = 'weapon' },

Voir ox_inventory shops pour le reste du format du magasin. Si un script de magasin donne toujours des armes par native, il a besoin le changement montré ci-dessus.

Autres scripts qui touchent aux armes

Les menus d'administrateur, les scripts de police, les scripts de loadout et les systèmes de gang utilisent souvent les natives. Recherchez ces appels dans vos ressources et remplacez-les :

lua
GiveWeaponToPed(...)
GiveDelayedWeaponToPed(...)
xPlayer.addWeapon(...)

Recherchez dans le dossier des ressources addWeapon et GiveWeaponToPed, puis commutez chaque résultat à exports.ox_inventory:AddItem. Si vous le faites pour tous une fois, les armes cessent de disparaître.

Liste de contrôle

Symptôme Correction
L'arme disparaît lors de la reconnexion Ce n'était pas un élément ; la donner avec exports.ox_inventory:AddItem
AddItem retourne false Nom inconnu, inventaire plein, ou trop lourd
L'arme ne fonctionne pas Le nom doit être en majuscules, par exemple WEAPON_PISTOL, et exister dans data/weapons.lua
Pas de munitions après utilisation Vérifier le ammoname de l'arme et le nom de l'élément de munitions
L'arme se casse trop vite Abaisser durability dans data/weapons.lua
L'accessoire ne fait rien L'élément composant et l'entrée d'arme doivent correspondre, arme équipée

Réponses rapides

Pourquoi mes armes disparaissent-elles lors de la reconnexion avec ox_inventory ?

L'arme a été donnée au ped avec une native, pas comme un élément. ox_inventory garde seulement les armes qui sont des éléments dans votre inventaire, donc tout ce qui est donné autrement est perdu.

Comment donner une arme à un joueur avec ox_inventory ?

Utilisez exports.ox_inventory:AddItem(source, 'WEAPON_PISTOL', 1) sur le serveur. Le nom de l'arme est le nom de l'élément, en lettres majuscules.

Où changer le poids d'une arme ou la durabilité ?

Dans ox_inventory/data/weapons.lua. Chaque arme a une entrée avec son étiquette, son poids et sa durabilité, et les munitions et composants sont définis dans le même fichier.

Des scripts sans ce problème

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

À lire aussi