qb-target vs ox_target: converter AddBoxZone e corrigir targets não aparecendo

Mudando de qb-target para ox_target em FiveM: como converter chamadas AddBoxZone e AddTargetModel, o que a camada de compatibilidade faz, e por que targets não aparecem.

Você se moveu de qb-target para ox_target, ou baixou um script escrito para um enquanto roda o outro, e as interaction zones foram ou duplicadas. Aqui está como os dois diferem, como converter as chamadas, e como encontrar por que um target não aparece.

A diferença em uma tabela

Ambos os recursos fazem o mesmo trabalho: uma key abre um targeting eye e o jogador pega uma opção em uma entidade ou em uma zona. Eles diferem em como você descrevem.

Ideia qb-target ox_target
Box zone AddBoxZone(name, center, length, width, options, targetOptions) addBoxZone({ coords, size, rotation, options })
Modelo AddTargetModel(models, options) addModel(models, options)
O que fazer type, event, action onSelect, event, serverEvent
Limite de job job groups
Limite de item item items
Verificação extra canInteract canInteract

ox_target pega uma única tabela para zones, e as opções são uma lista simples, sem wrapper que segura options e distance juntos.

Converter uma box zone

Uma zona qb-target típica:

lua
exports['qb-target']:AddBoxZone('pd_armory', vector3(452.2, -980.0, 30.7), 1.5, 1.0, {
    name = 'pd_armory',
    heading = 90.0,
    debugPoly = false,
    minZ = 29.7,
    maxZ = 31.7,
}, {
    options = {
        {
            type = 'client',
            event = 'my_script:openArmory',
            icon = 'fas fa-gun',
            label = 'Open armory',
            job = 'police',
        },
    },
    distance = 2.0,
})

A mesma zona em ox_target:

lua
exports.ox_target:addBoxZone({
    coords = vec3(452.2, -980.0, 30.7),
    size = vec3(1.0, 1.5, 2.0),
    rotation = 90.0,
    debug = false,
    options = {
        {
            name = 'pd_armory',
            event = 'my_script:openArmory',
            icon = 'fa-solid fa-gun',
            label = 'Open armory',
            groups = 'police',
            distance = 2.0,
        },
    },
})

O que se moveu:

  • center vira coords, e é o centro da box em ambos, mas a altura agora vem de size. qb-target usa minZ e maxZ, então coloque coords.z no meio entre eles e use o gap deles como altura.
  • length e width viram x e y de size. Se a box terminar virada de forma errada, troque-as ou mude rotation, e verifique com debug = true.
  • heading vira rotation.
  • job vira groups, e distance se move para dentro de cada opção.
  • type = 'client' com event fica um event. Use serverEvent para type = 'server', ou onSelect com uma função em vez de um evento.

Converter um model target

qb-target:

lua
exports['qb-target']:AddTargetModel({ `prop_atm_01`, `prop_atm_02` }, {
    options = {
        {
            type = 'client',
            event = 'my_script:openAtm',
            icon = 'fas fa-credit-card',
            label = 'Use ATM',
        },
    },
    distance = 1.5,
})

ox_target:

lua
exports.ox_target:addModel({ `prop_atm_01`, `prop_atm_02` }, {
    {
        name = 'my_script_atm',
        event = 'my_script:openAtm',
        icon = 'fa-solid fa-credit-card',
        label = 'Use ATM',
        distance = 1.5,
    },
})

As opções são agora o segundo argumento em si, uma lista de tabelas de opção. A lista completa de exports e campos está em ox_target: addBoxZone, addModel and addLocalEntity.

Mantenha um script antigo funcionando

ox_target oferece compatibilidade para muitos exports qb-target. Um script que ainda chama exports['qb-target']:AddBoxZone(...) pode continuar funcionando quando apenas ox_target está rodando, contanto que use os exports comuns.

Não confie nisso para tudo. Exports menos comuns e campos de opção incomuns podem não se comportar igual. Teste cada script, e quando um se comporta mal, converta suas chamadas para os exports nativos de ox_target como mostrado acima. Chamadas nativas também são mais fáceis de ler e debugar.

Atenção: não comece qb-target ao lado de ox_target para "ter certeza". Mantenha apenas um recurso de targeting, e remova o outro de server.cfg.

Por que targets não aparecem

Quase todo caso de "meu target é invisível" cai nesta lista.

Ambos os recursos estão rodando. Dois recursos de targeting lutam pela mesma key. Verifique server.cfg e sua lista de recursos, e mantenha apenas um:

cfg
ensure ox_lib
ensure ox_target
# ensure qb-target   <- remove or comment out

A distância é muito pequena. A opção aparece apenas dentro de sua distance. Tente distance = 3.0 enquanto testa. Com qb-target, o distance fica ao lado de options, não dentro de cada opção.

Uma verificação de job falha. Uma opção com job (qb-target) ou groups (ox_target) é escondida para quem sem aquele job, sem erro. Teste com o job certo, ou remova o campo por um momento. Em ox_target um grade na tabela ({ police = 2 }) significa que o jogador precisa de pelo menos aquele grade.

Um canInteract não retorna nada. Se a função tem um caminho de código que retorna nil, a opção é escondida. Faça-a retornar true ou false em cada caminho.

A zona está no lugar errado. Ligue debug = true em ox_target (ou debugPoly = true em qb-target) e olhe a forma. Uma box centrada no chão está meio embaixo do solo.

O script roda antes do target. Comece o recurso de target antes de seu script em server.cfg, e adicione dependency 'ox_target' ao seu manifest.

Checklist

Sintoma Solução
Opções duplicadas ou faltando Execute apenas um de qb-target e ox_target
job ignorado após converter Renomeie para groups
Zona é rotacionada ou dimensionada errado heading vira rotation; verifique size com debug = true
Opção nunca aparece Aumente distance, teste o job e canInteract
Script antigo para de funcionar Converta suas chamadas para exports nativos de ox_target
Nada aparece absolutamente Comece ox_target e ox_lib antes de seus scripts

Respostas rápidas

Posso rodar qb-target e ox_target juntos?

Não. Escolha um. Ambos os recursos querem a mesma targeting key e o mesmo job, e rodar ambos dá a você opções duplicadas ou faltando.

Meus scripts antigos de qb-target funcionam com ox_target?

Frequentemente sim. ox_target oferece compatibilidade para muitos exports qb-target, então scripts que as chamam podem continuar funcionando. Teste cada script, e converta os que se comportam mal para os exports nativos de ox_target.

O que substitui o campo job de qb-target?

ox_target usa groups. Defina groups = 'police', ou uma tabela como { police = 0 } para também exigir um grade.

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 →Advanced BoostingBoosting de veículos pelo tablet: contratos da classe D à S+, crews e fila ao vivo.Ver script →

Continue lendo