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:
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:
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:
centerviracoords, e é o centro da box em ambos, mas a altura agora vem desize. qb-target usaminZemaxZ, então coloquecoords.zno meio entre eles e use o gap deles como altura.lengthewidthviramxeydesize. Se a box terminar virada de forma errada, troque-as ou muderotation, e verifique comdebug = true.headingvirarotation.jobviragroups, edistancese move para dentro de cada opção.type = 'client'comeventfica umevent. UseserverEventparatype = 'server', ouonSelectcom uma função em vez de um evento.
Converter um model target
qb-target:
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:
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:
ensure ox_lib
ensure ox_target
# ensure qb-target <- remove or comment outA 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 →