ox_target addBoxZone, addModel e addLocalEntity: como adicionar alvos
Como adicionar interações ox_target em FiveM: addBoxZone, addSphereZone, addModel, addLocalEntity e addGlobalVehicle, com opções, grupos, remoção e debug.
Você adiciona um alvo em seu script e no jogo nada aparece. Ou o console diz:
No such export addBoxZone in resource ox_targetEste é o guia prático para ox_target no cliente: a zona, modelo e exportações de entidade, as opções que você pode colocar neles, e como removê-los e depurá-los.
Certifique-se de que ox_target começou primeiro
As exportações só existem enquanto ox_target está em execução, e ele precisa ox_lib. Em server.cfg, inicie-os antes de seu script:
ensure oxmysql
ensure ox_lib
ensure ox_target
ensure my_scriptTambém adicione ao fxmanifest.lua do seu recurso, para que FiveM se recuse a iniciar o script sem ele:
dependency 'ox_target'Todas as chamadas abaixo são do lado do cliente. Coloque-as em um arquivo do cliente, não em um arquivo do servidor.
Uma zona de caixa
Uma zona de caixa é um retângulo no mundo. É a escolha certa para um balcão, uma porta ou um caixa eletrônico:
local zoneId = exports.ox_target:addBoxZone({
coords = vec3(441.2, -981.9, 30.7),
size = vec3(1.5, 1.0, 2.0),
rotation = 90.0,
debug = false,
options = {
{
name = 'my_script_counter',
icon = 'fa-solid fa-box',
label = 'Open the counter',
distance = 2.0,
onSelect = function(data)
print('selected', data.name)
end,
},
},
})coords é o centro da caixa, size é sua largura, comprimento e altura, e rotation a gira ao redor do eixo vertical. Mantenha o zoneId retornado se você remover a zona depois.
Uma zona de esfera
Uma esfera é mais simples quando você não se importa com a forma, apenas com "perto deste ponto":
exports.ox_target:addSphereZone({
coords = vec3(-1037.5, -2737.9, 20.2),
radius = 1.5,
options = {
{
name = 'my_script_sphere',
icon = 'fa-solid fa-hand',
label = 'Talk',
onSelect = function()
print('talking')
end,
},
},
})Modelos, entidades e veículos
Para visar cada objeto, ped ou veículo de um certo modelo, use addModel. Leva um nome de modelo ou hash, ou uma lista deles:
exports.ox_target:addModel({ `prop_vend_soda_01`, `prop_vend_soda_02` }, {
{
name = 'my_script_vending',
icon = 'fa-solid fa-bottle-water',
label = 'Use the machine',
distance = 1.5,
onSelect = function(data)
print('entity', data.entity)
end,
},
})Para visar uma entidade que você já criou no seu cliente, use addLocalEntity:
local ped = CreatePed(4, `a_m_m_business_01`, 441.2, -981.9, 29.7, 90.0, false, true)
exports.ox_target:addLocalEntity(ped, {
{
name = 'my_script_ped',
icon = 'fa-solid fa-comment',
label = 'Talk to him',
onSelect = function(data)
print('talk to', data.entity)
end,
},
})Para adicionar uma opção a cada veículo, use addGlobalVehicle. Outras exportações globais existem para peds, jogadores e objetos:
exports.ox_target:addGlobalVehicle({
{
name = 'my_script_inspect',
icon = 'fa-solid fa-magnifying-glass',
label = 'Inspect vehicle',
distance = 2.5,
onSelect = function(data)
print('vehicle', data.entity)
end,
},
})Dica:
addLocalEntitysó existe no cliente que criou a entidade. Para uma entidade em rede que outros jogadores devem ver a opção, use a variante em rede (addEntity) com o id de rede da entidade.
Os campos de opção
Cada opção é uma tabela. Estes são os campos que você usará mais:
| Campo | O que faz |
|---|---|
name |
Um nome único. Necessário para remover a opção depois. |
icon |
Uma classe Font Awesome, como fa-solid fa-box. |
label |
O texto mostrado ao jogador. |
onSelect |
Função chamada quando o jogador escolhe a opção. |
distance |
Quão perto o jogador deve estar, em metros. |
canInteract |
Função que retorna true para mostrar a opção. |
groups |
Trabalho ou grupo necessário para ver a opção. |
canInteract recebe a entidade e a distância, para que você possa esconder uma opção com base em qualquer condição:
{
name = 'my_script_repair',
icon = 'fa-solid fa-wrench',
label = 'Repair',
distance = 2.0,
canInteract = function(entity, distance, coords, name, bone)
return GetVehicleEngineHealth(entity) < 900.0
end,
onSelect = function(data)
print('repair', data.entity)
end,
}Para empregos, groups leva um nome ou uma tabela, e funciona no ESX, QBCore e QBox através do suporte de framework próprio de ox_target:
groups = 'police',
-- or several, optionally with a minimum grade
groups = { police = 0, sheriff = 2 },Remova zonas e opções
Zonas são removidas com o id que a chamada retornou:
exports.ox_target:removeZone(zoneId)Opções adicionadas a modelos, entidades e alvos globais são removidas pelo name que você deu a elas:
exports.ox_target:removeModel({ `prop_vend_soda_01` }, 'my_script_vending')
exports.ox_target:removeLocalEntity(ped, 'my_script_ped')
exports.ox_target:removeGlobalVehicle('my_script_inspect')Limpe quando seu recurso para, caso contrário uma reinicialização pode deixar duplicatas para trás:
AddEventHandler('onResourceStop', function(resource)
if resource ~= GetCurrentResourceName() then return end
exports.ox_target:removeZone(zoneId)
exports.ox_target:removeLocalEntity(ped, 'my_script_ped')
end)Depure uma zona que não aparece
Defina debug = true na zona. ox_target então desenha sua forma no mundo, para que você veja imediatamente se a caixa está no lugar errado, muito pequena ou enterrada no piso. As causas usuais:
- A zona está deslocada. O
coordsé o centro, então uma caixa cujo z fica no nível do piso está meia enterrada. Levante-a pela metade de sua altura. - A distância é muito pequena. O jogador tem que estar dentro de
distanceda zona para ver a opção. - Uma verificação falha. Uma
groupsoucanInteractque retorna false esconde a opção sem erro. Remova temporariamente para testar. - Dois alvos estão rodando. Se qb-target também foi iniciado, veja qb-target vs ox_target.
Por padrão você segura uma chave (Alt esquerdo) para abrir o olho de orientação, então teste com ela segura.
Lista de verificação
| Sintoma | Solução |
|---|---|
No such export addBoxZone in resource ox_target |
Inicie ox_target (e ox_lib) antes de seu script |
| Opção nunca aparece | Ligue debug = true, verifique distance, groups e canInteract |
| Zona meia enterrada | coords é o centro: levante z pela metade da altura da caixa |
| Opção mostra para todos | Adicione groups ou uma verificação canInteract |
| Duplicatas após reiniciar seu script | Remova zonas e opções em onResourceStop |
| Precisa remover uma opção | Dê a ela um name e chame a exportação remove... correspondente |
Respostas rápidas
Como adiciono uma zona ox_target a partir de meu próprio script?
Chame exports.ox_target:addBoxZone({ coords = ..., size = ..., rotation = ..., options = { ... } }) no cliente. Retorna um id que você mantém para que possa remover a zona depois.
Como mostro uma opção apenas para alguns empregos?
Use groups na opção, por exemplo groups = 'police', ou uma tabela para vários empregos. Para qualquer coisa mais específica, retorne true ou false de canInteract.
Por que meu alvo não aparece?
Geralmente o jogador está fora de distance da opção, uma verificação groups ou canInteract falha, ou ox_target não foi iniciado antes de seu script. Ligue debug = true na zona para ver sua forma.
Scripts sem esse problema
Shop CreatorMonte uma loja em menos de um minuto — donos, funcionários, cofres e assaltos inclusos.Ver script →
Quest CreatorUm editor visual de missões e diálogos com NPCs, montado nó por nó dentro do jogo.Ver script →
Item Creator V2Crie itens usáveis com animações, props, efeitos e muito mais — sem escrever código.Ver script →