ox_target addBoxZone, addModel e addLocalEntity: come aggiungere target
Come aggiungere interazioni ox_target in FiveM: addBoxZone, addSphereZone, addModel, addLocalEntity e addGlobalVehicle, con opzioni, gruppi, rimozione e debug.
Aggiungi un target nel tuo script e nel gioco nulla appare. O la console dice:
No such export addBoxZone in resource ox_targetQuesta è la guida pratica a ox_target sul client: la zona, i modelli e i export delle entità, le opzioni che puoi mettere su di essi, e come rimuoverli e debuggarli.
Assicurati che ox_target sia avviato per primo
Gli export esistono solo mentre ox_target è in esecuzione, e ha bisogno di ox_lib. In server.cfg, avviamoli prima dello script:
ensure oxmysql
ensure ox_lib
ensure ox_target
ensure my_scriptAggiungi anche alla fxmanifest.lua della tua risorsa, così FiveM si rifiuta di avviare lo script senza:
dependency 'ox_target'Tutte le chiamate di seguito sono lato client. Mettile in un file client, non uno server.
Una zona box
Una zona box è un rettangolo nel mondo. È la scelta giusta per un bancone, una porta o un bancomat:
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 è il centro del box, size è la sua larghezza, lunghezza e altezza, e rotation lo gira intorno all'asse verticale. Tieni il zoneId restituito se rimuoverai la zona in seguito.
Una zona sphere
Una sphere è più semplice quando non ti interessa la forma, solo "vicino a questo punto":
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,
},
},
})Modelli, entità e veicoli
Per targetare ogni oggetto, ped o veicolo di un certo modello, usa addModel. Prende un nome di modello o hash, o un elenco di essi:
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,
},
})Per targetare un'entità che hai già creato sul tuo client, usa 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,
},
})Per aggiungere un'opzione a ogni veicolo, usa addGlobalVehicle. Esistono altri export globali per ped, giocatori e oggetti:
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,
},
})Consiglio:
addLocalEntityesiste solo sul client che ha creato l'entità. Per un'entità in rete che altri giocatori dovrebbero vedere l'opzione, usa la variante in rete (addEntity) con l'id di rete dell'entità.
I campi dell'opzione
Ogni opzione è una tabella. Questi sono i campi che userai di più:
| Campo | Cosa fa |
|---|---|
name |
Un nome univoco. Necessario per rimuovere l'opzione in seguito. |
icon |
Una classe Font Awesome, come fa-solid fa-box. |
label |
Il testo mostrato al giocatore. |
onSelect |
Funzione chiamata quando il giocatore sceglie l'opzione. |
distance |
A quale distanza deve essere il giocatore, in metri. |
canInteract |
Funzione che restituisce true per mostrare l'opzione. |
groups |
Lavoro o gruppo necessario per vedere l'opzione. |
canInteract riceve l'entità e la distanza, così puoi nascondere un'opzione in base a qualsiasi condizione:
{
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,
}Per i lavori, groups prende un nome o una tabella, e funziona su ESX, QBCore e QBox attraverso il supporto del framework di ox_target:
groups = 'police',
-- or several, optionally with a minimum grade
groups = { police = 0, sheriff = 2 },Rimuovi zone e opzioni
Le zone vengono rimosse con l'id che la chiamata ha restituito:
exports.ox_target:removeZone(zoneId)Le opzioni aggiunte ai modelli, alle entità e ai target globali vengono rimosse dal name che hai dato loro:
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')Pulisci quando la tua risorsa si ferma, altrimenti un riavvio può lasciare duplicati dietro:
AddEventHandler('onResourceStop', function(resource)
if resource ~= GetCurrentResourceName() then return end
exports.ox_target:removeZone(zoneId)
exports.ox_target:removeLocalEntity(ped, 'my_script_ped')
end)Debug di una zona che non mostra
Imposta debug = true sulla zona. ox_target poi disegna la sua forma nel mondo, così vedi subito se il box è nel posto sbagliato, troppo piccolo, o sepolto nel pavimento. Le cause solite:
- La zona è collocata male. Le
coordssono il centro, quindi un box il cui z siede a livello del pavimento è mezzo sotterraneo. Alzalo di metà l'altezza. - La distanza è troppo piccola. Il giocatore deve stare dentro la
distancedella zona per vedere l'opzione. - Un controllo fallisce. Un
groupsocanInteractche restituisce false nasconde l'opzione senza errore. Rimuovilo temporaneamente per testare. - Due target sono in esecuzione. Se qb-target è avviato pure, vedi qb-target vs ox_target.
Per impostazione predefinita tieni premuto un tasto (Left Alt) per aprire l'occhio di targeting, quindi testa tenendolo premuto.
Checklist
| Sintomo | Soluzione |
|---|---|
No such export addBoxZone in resource ox_target |
Avvia ox_target (e ox_lib) prima dello script |
| L'opzione non appare mai | Accendi debug = true, controlla distance, groups e canInteract |
| La zona è mezzo sotterranea | coords è il centro: alza z di metà l'altezza della box |
| L'opzione mostra a tutti | Aggiungi groups o un controllo canInteract |
| Duplicati dopo aver riavviato lo script | Rimuovi zone e opzioni in onResourceStop |
| Devo rimuovere un'opzione | Dallo un name e chiama l'export di remove... corrispondente |
Risposte rapide
Come aggiungo una zona ox_target dal mio script?
Chiama exports.ox_target:addBoxZone({ coords = ..., size = ..., rotation = ..., options = { ... } }) sul client. Restituisce un id che tieni in modo da poter rimuovere la zona in seguito.
Come mostro un'opzione solo ad alcuni lavori?
Usa groups sull'opzione, ad esempio groups = 'police', o una tabella per più lavori. Per qualcosa di più specifico, restituisci true o false da canInteract.
Perché il mio target non appare?
Di solito il giocatore è fuori dalla distance dell'opzione, un controllo groups o canInteract fallisce, o ox_target non è avviato prima dello script. Accendi debug = true sulla zona per vedere la sua forma.
Script senza questo problema
Shop CreatorCrea un negozio in meno di un minuto — proprietari, dipendenti, casseforti e rapine inclusi.Vedi script →
Quest CreatorUn editor visuale di missioni e dialoghi con gli NPC, costruito nodo per nodo in gioco.Vedi script →
Item Creator V2Crea oggetti utilizzabili con animazioni, props, effetti e altro — senza scrivere codice.Vedi script →