Estojos ox_inventory: RegisterStash, openInventory e estojos de trabalho
Como criar estojos em ox_inventory: registre um no servidor, abra-o do cliente ou ox_target, torne-o pessoal por jogador ou bloqueie para um trabalho.
Você precisa de um lugar para armazenar coisas: um armário de evidência da polícia, um guarda-roupa pessoal, um cofre em uma casa. Com ox_inventory isto é um estojo: um inventário nomeado com seus próprios slots e limite de peso, armazenado no banco de dados. Este artigo cobre registrar um estojo no servidor, abri-lo do cliente, torná-lo pessoal, restringi-lo a um trabalho e anexá-lo a uma zona ox_target.
Registre o estojo no servidor
Um estojo deve existir no servidor antes de qualquer um abri-lo. Registre uma vez, quando seu recurso começar:
-- server.lua
exports.ox_inventory:RegisterStash('police_evidence', 'Evidence locker', 100, 500000, false)Os argumentos, em ordem:
| Argumento | Significado |
|---|---|
id |
String única. Usado para abrir o estojo e como sua chave no banco de dados |
label |
Nome mostrado no topo do estojo |
slots |
Número de slots |
maxWeight |
Limite de peso, em gramas (500000 é 500 kg) |
owner |
false para um estojo compartilhado, true para um por jogador, ou um identificador fixo |
groups |
Tabela opcional de empregos permitidos para abri-lo |
coords |
Posição opcional que o jogador deve estar perto |
Apenas os primeiros quatro são necessários. O conteúdo é salvo por ox_inventory, então ele sobrevive a reinicializações de seu script e do servidor.
Atenção: o id é a identidade do estojo. Se você alterar
'police_evidence'para outra string depois, o conteúdo antigo fica no banco de dados sob o id antigo e o novo estojo começa vazio.
Abra-o do cliente
No cliente, abra o estojo com a exportação e o mesmo id:
-- client.lua
exports.ox_inventory:openInventory('stash', 'police_evidence')O servidor verifica groups e coords quando a solicitação chega, então o cliente não pode pular. Se o id do estojo nunca foi registrado, nada abre.
Você também pode abrir um estojo para um jogador do servidor, por exemplo de um comando ou um evento que você já validou:
exports.ox_inventory:forceOpenInventory(source, 'stash', 'police_evidence')Estojos pessoais: owner = true
Para um guarda-roupa ou um armário onde cada jogador tem seu próprio conteúdo, use owner = true:
exports.ox_inventory:RegisterStash('personal_locker', 'Personal locker', 50, 100000, true)O id do estojo é o mesmo para todos, mas ox_inventory anexa o identificador do jogador a ele, para que cada jogador obtenha um inventário separado. No ESX isto é a licença ou identificador do personagem, no QBox e QBCore o citizen id.
Você também pode passar um proprietário fixo, o que é útil para uma casa onde apenas o proprietário e pessoas que você decide podem vê-lo:
local identifier = 'char1:abc123'
exports.ox_inventory:RegisterStash('house_' .. identifier, 'House storage', 80, 200000, identifier)Quando o owner é uma string, qualquer um abrindo esse estojo está anexado a esse proprietário, então a verificação de acesso deve acontecer em seu próprio código de servidor antes de você abri-lo.
Estojos de trabalho: groups
groups é uma tabela de nomes de trabalho, cada um com o grau mínimo:
exports.ox_inventory:RegisterStash(
'police_armory',
'Police armory',
80,
300000,
false,
{ police = 0, sheriff = 2 }
)Um jogador com o trabalho police no grau 0 ou superior pode abri-lo, e um sheriff apenas a partir do grau 2. Todos os outros são recusados pelo servidor. Isto funciona com empregos ESX, empregos QBCore e empregos QBox, porque ox_inventory os lê do framework.
Para também exigir que o jogador esteja na localização do estojo, passe coords como o último argumento:
exports.ox_inventory:RegisterStash(
'police_armory', 'Police armory', 80, 300000, false,
{ police = 0 }, vec3(452.1, -980.2, 30.7)
)Abra-o com ox_target
Um estojo geralmente é aberto a partir de um local no mundo. Com ox_target, adicione uma zona que chama a exportação:
exports.ox_target:addSphereZone({
coords = vec3(452.1, -980.2, 30.7),
radius = 1.0,
options = {
{
name = 'open_police_armory',
icon = 'fa-solid fa-box-archive',
label = 'Open armory',
groups = { police = 0 },
onSelect = function()
exports.ox_inventory:openInventory('stash', 'police_armory')
end,
},
},
})O groups aqui apenas oculta a opção, o que é uma conveniência. A verificação real é aquela em RegisterStash. Para zonas em geral, veja adicionando uma zona ox_target.
Estojos definidos em um arquivo
Se você não quer escrever código, ox_inventory lê estojos de data/stashes.lua. Cada entrada tem um nome, um rótulo, slots, peso, owner opcional, groups e uma localização. Procure as entradas de exemplo naquele arquivo em sua versão, copie uma e reinicie ox_inventory. Use registro de código quando um estojo é criado por outro recurso, como um script de habitação.
Dica: para verificar se um estojo funciona, abra-o, coloque um item, reinicie seu recurso e abra novamente. Se o item ainda está lá, o id corresponde e o conteúdo é salvo.
Lista de verificação
| Sintoma | Solução |
|---|---|
| Estojo não abre | Registre-o no servidor primeiro, com o mesmo id |
| Estojo vazio após renomear | O id mudou; o conteúdo antigo está sob o id antigo |
| Todos compartilham o mesmo estojo pessoal | Registre com owner = true |
| Um jogador sem o trabalho abre | Adicione groups = { jobname = grade } em RegisterStash |
| Abre de qualquer lugar | Passe coords como o último argumento |
| Precisa de itens para adicionar | Veja adicionando itens a ox_inventory |
Respostas rápidas
Qual é a diferença entre um estojo e um inventário de jogador em ox_inventory?
Um estojo é um armazenamento separado com seus próprios slots e limite de peso, identificado por um id de string. Pertence ao mundo, a um trabalho ou a um único jogador dependendo do owner e groups que você dá.
Como faço um estojo que é privado para cada jogador?
Registre-o com owner definido como true. ox_inventory então mantém uma cópia separada do estojo por jogador, então dois jogadores abrindo o mesmo id de estojo veem conteúdos diferentes.
Por que meu estojo abre vazio ou não abre?
O estojo não foi registrado no servidor, o id difere entre a chamada de registro e a chamada de abertura, ou o jogador está perdendo o trabalho exigido ou está muito longe de coords.

