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:

text
No such export addBoxZone in resource ox_target

Questa è 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:

cfg
ensure oxmysql
ensure ox_lib
ensure ox_target

ensure my_script

Aggiungi anche alla fxmanifest.lua della tua risorsa, così FiveM si rifiuta di avviare lo script senza:

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

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

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,
        },
    },
})

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:

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,
    },
})

Per targetare un'entità che hai già creato sul tuo client, usa 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,
    },
})

Per aggiungere un'opzione a ogni veicolo, usa addGlobalVehicle. Esistono altri export globali per ped, giocatori e oggetti:

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,
    },
})

Consiglio: addLocalEntity esiste 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:

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,
}

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:

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

lua
exports.ox_target:removeZone(zoneId)

Le opzioni aggiunte ai modelli, alle entità e ai target globali vengono rimosse dal name che hai dato loro:

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')

Pulisci quando la tua risorsa si ferma, altrimenti un riavvio può lasciare duplicati dietro:

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)

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 coords sono 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 distance della zona per vedere l'opzione.
  • Un controllo fallisce. Un groups o canInteract che 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 →

Continua a leggere