Armas e munição ox_inventory: data/weapons.lua e armas desaparecendo

Armas desaparecem após reconectar com ox_inventory? Como as armas funcionam como itens: data/weapons.lua, itens de munição, durabilidade, AddItem para WEAPON_PISTOL e acessórios.

Você dá a um jogador uma pistola com um menu admin ou um script de trabalho. Ele desconecta, volta e a pistola desapareceu. Com ox_inventory, armas não são uma escala de equipamento separada: são itens, e qualquer coisa que não seja um item é removida. Este artigo explica como armas e munição funcionam, como dá-las corretamente e onde afinar durabilidade e acessórios.

Armas são itens

Em ox_inventory, o nome do item de uma arma é seu nome de hash, por exemplo WEAPON_PISTOL. Elas são definidas em ox_inventory/data/weapons.lua, não em items.lua. O arquivo retorna três grupos:

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

Abra o arquivo em sua instalação: cada arma padrão tem uma entrada pronta, e essa é a referência para os campos exatos de sua versão. Uma arma faltando de Weapons é simplesmente não um item válido.

Por que armas desaparecem ao reconectar

Scripts antigos do ESX e QBCore dão armas com nativos como GiveWeaponToPed, ou com o xPlayer.addWeapon do ESX. Isso coloca a arma nas mãos do ped para essa sessão, mas não é um item e nada o salva. ox_inventory também remove armas que não estão no inventário, então desaparecem ao reconectar ou até antes.

A correção é dar armas como itens, do servidor:

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

Substitua cada chamada de script que concede uma arma por um nativo, addWeapon ou Player.Functions.AddItem('weapon_pistol', ...) por uma chamada AddItem com o nome da arma em maiúsculas. Um script que só funciona através de um nativo, como uma loja que aparece uma arma na mão, precisa essa mudança antes de funcionar em um servidor usando ox_inventory.

Dica: nomes de armas são sensíveis a maiúsculas em listas de itens, e WEAPON_PISTOL é a forma que ox_inventory usa. Um script antigo que envia weapon_pistol pode falhar por essa razão.

Itens de munição

Munição também é um item. O tipo de munição é nomeado pelo ammoname de uma arma em sua entrada, por exemplo ammo-9 para 9 mm:

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

Quando um jogador usa um item de munição com uma arma equipada que a aceita, ox_inventory a carrega na arma, e a arma mantém sua própria contagem de munição em seus metadados. Munição aparece como um item no inventário quando não está carregada.

Verifique os nomes de itens em sua versão em data/items.lua e data/weapons.lua. O padrão é ammo-<type>, por exemplo ammo-9, ammo-rifle, ammo-shotgun, e um item que não existe não pode ser adicionado.

Durabilidade e desgaste

Armas se desgastam quando são disparadas. O valor durability na entrada da arma define com que velocidade: um número maior significa que se degrada mais rápido. Uma arma com zero de durabilidade não funciona até ser consertada.

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

Abaixe o número para fazer uma arma durar mais. Reparação é uma escolha gameplay: muitos servidores usam um item de reparação, uma receita de artesanato ou um mecânico, e você pode definir durabilidade de volta com SetMetadata (veja metadados de item em ox_inventory).

Acessórios (componentes)

Acessórios como uma lanterna, um supressor ou um carregador são itens listados no grupo Components, e eles têm suas próprias entradas em items.lua. Um jogador coloca um usando-o enquanto a arma está equipada. O componente é armazenado no item da arma, então sobrevive a uma reconexão.

Se um acessório não faz nada, verifique estas três coisas:

  • o item de componente existe em data/items.lua
  • está listado para essa arma em data/weapons.lua
  • a arma está equipada quando o componente é usado

Você também pode adicionar um componente do servidor através de metadados de arma, por exemplo quando você vende uma arma pré-montada, mas teste-a com uma pistola normal primeiro, já que o formato de metadados depende de sua versão.

Vendendo armas em lojas

Armas aparecem em uma loja como qualquer item, com o mesmo nome:

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

Veja lojas ox_inventory para o resto do formato da loja. Se um script de loja ainda dá armas por nativo, precisa da mudança mostrada acima.

Outros scripts que tocam armas

Menus admin, scripts de polícia, scripts de escala e sistemas de gang frequentemente usam nativos. Procure em seus recursos por essas chamadas e substitua-as:

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

Procure a pasta de recursos por addWeapon e GiveWeaponToPed, depois mude cada resultado para exports.ox_inventory:AddItem. Se você fizer para todos de uma vez, as armas param de desaparecer.

Lista de verificação

Sintoma Solução
Arma desaparece ao reconectar Não era um item; dê-a com exports.ox_inventory:AddItem
AddItem retorna false Nome desconhecido, inventário cheio ou muito pesado
Arma não funcionando Nome deve ser maiúsculo, por exemplo WEAPON_PISTOL, e existir em data/weapons.lua
Sem munição após o uso Verifique o ammoname da arma e o nome do item de munição
Arma quebra rápido demais Abaixe durability em data/weapons.lua
Acessório não faz nada Item de componente e entrada de arma devem corresponder, arma equipada

Respostas rápidas

Por que minhas armas desaparecem quando reconecto com ox_inventory?

A arma foi dada ao ped com um nativo, não como um item. ox_inventory apenas mantém armas que são itens em seu inventário, então qualquer coisa dada de outra forma é perdida.

Como dou uma arma a um jogador com ox_inventory?

Use exports.ox_inventory:AddItem(source, 'WEAPON_PISTOL', 1) no servidor. O nome da arma é o nome do item, em letras maiúsculas.

Onde mudo o peso ou durabilidade de uma arma?

Em ox_inventory/data/weapons.lua. Cada arma tem uma entrada com seu rótulo, peso e durabilidade, e munição e componentes são definidos no mesmo arquivo.

Scripts sem esse problema

Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →

Continue lendo