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:

text
No such export addBoxZone in resource ox_target

Este é 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:

cfg
ensure oxmysql
ensure ox_lib
ensure ox_target

ensure my_script

Também adicione ao fxmanifest.lua do seu recurso, para que FiveM se recuse a iniciar o script sem ele:

lua
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:

lua
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":

lua
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:

lua
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:

lua
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:

lua
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: addLocalEntity só 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:

lua
{
    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:

lua
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:

lua
exports.ox_target:removeZone(zoneId)

Opções adicionadas a modelos, entidades e alvos globais são removidas pelo name que você deu a elas:

lua
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:

lua
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 distance da zona para ver a opção.
  • Uma verificação falha. Uma groups ou canInteract que 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 →

Continue lendo