ox_target addBoxZone, addModel y addLocalEntity: cómo añadir objetivos

Cómo añadir interacciones de ox_target en FiveM: addBoxZone, addSphereZone, addModel, addLocalEntity y addGlobalVehicle, con opciones, grupos, eliminación y debug.

Añades un objetivo en tu script y en el juego no aparece nada. O la consola dice:

text
No such export addBoxZone in resource ox_target

Esta es la guía práctica de ox_target en el cliente: la zona, modelo y exportaciones de entidad, las opciones que puedes poner en ellas, y cómo eliminar y depurar.

Asegúrate de que ox_target se inicia primero

Las exportaciones solo existen mientras ox_target se está ejecutando, y necesita ox_lib. En server.cfg, inícialo antes que tu script:

cfg
ensure oxmysql
ensure ox_lib
ensure ox_target

ensure my_script

También añádelo a tu fxmanifest.lua del recurso, para que FiveM se rehúse a iniciar el script sin él:

lua
dependency 'ox_target'

Todas las llamadas a continuación son lado del cliente. Ponlas en un archivo del cliente, no uno del servidor.

Una zona de caja

Una zona de caja es un rectángulo en el mundo. Es la opción correcta para un mostrador, una puerta o un cajero automático:

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 es el centro de la caja, size es su ancho, largo y alto, y rotation la gira alrededor del eje vertical. Mantén el zoneId devuelto si eliminarás la zona más tarde.

Una zona de esfera

Una esfera es más simple cuando no te importa la forma, solo "cerca de este 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,
        },
    },
})

Modelos, entidades y vehículos

Para apuntar a cada objeto, ped o vehículo de un cierto modelo, usa addModel. Toma un nombre o hash de modelo, o una lista de ellos:

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 apuntar a una entidad que ya creaste en tu cliente, 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,
    },
})

Para añadir una opción a cada vehículo, usa addGlobalVehicle. Existen otras exportaciones globales para peds, jugadores y 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,
    },
})

Consejo: addLocalEntity solo existe en el cliente que creó la entidad. Para una entidad en red que otros jugadores deberían ver la opción, usa la variante en red (addEntity) con la id de red de la entidad.

Los campos de opción

Cada opción es una tabla. Estos son los campos que usarás más:

Campo Qué hace
name Un nombre único. Necesario para eliminar la opción más tarde.
icon Una clase Font Awesome, como fa-solid fa-box.
label El texto mostrado al jugador.
onSelect Función llamada cuando el jugador elige la opción.
distance Qué tan cerca debe estar el jugador, en metros.
canInteract Función que devuelve true para mostrar la opción.
groups Trabajo o grupo necesario para ver la opción.

canInteract recibe la entidad y la distancia, así que puedes ocultar una opción basada en cualquier condición:

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 trabajos, groups toma un nombre o una tabla, y funciona en ESX, QBCore y QBox a través del propio soporte de framework de ox_target:

lua
groups = 'police',
-- or several, optionally with a minimum grade
groups = { police = 0, sheriff = 2 },

Elimina zonas y opciones

Las zonas se eliminan con la id que devolvió la llamada:

lua
exports.ox_target:removeZone(zoneId)

Las opciones añadidas a modelos, entidades y objetivos globales se eliminan por el name que les diste:

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

Limpia cuando tu recurso se detenga, de lo contrario un reinicio puede dejar duplicados atrá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)

Depura una zona que no se muestra

Establece debug = true en la zona. ox_target luego dibuja su forma en el mundo, para que veas de inmediato si la caja está en el lugar incorrecto, es demasiado pequeña, o está enterrada en el piso. Las causas usuales:

  • La zona está mal ubicada. El coords es el centro, así que una caja cuya z se asienta en el nivel del piso está medio bajo tierra. Levántala por la mitad de su altura.
  • La distancia es demasiado pequeña. El jugador tiene que estar dentro de distance de la zona para ver la opción.
  • Una verificación falla. Un groups o canInteract que devuelve false oculta la opción sin error. Elimínalo temporalmente para probar.
  • Se están ejecutando dos objetivos. Si qb-target también se inicia, véase qb-target vs ox_target.

Por defecto sostienes una tecla (Alt izquierdo) para abrir el ojo de apuntamiento, así que prueba con ella sostenida.

Lista de verificación

Síntoma Solución
No such export addBoxZone in resource ox_target Inicia ox_target (y ox_lib) antes que tu script
La opción nunca se muestra Enciende debug = true, verifica distance, groups y canInteract
La zona está medio bajo tierra coords es el centro: levanta z por la mitad de la altura de la caja
La opción se muestra para todos Añade groups o una verificación de canInteract
Duplicados después de reiniciar tu script Elimina zonas y opciones en onResourceStop
Necesito eliminar una opción Dale un name y llama a la exportación de remove... correspondiente

Respuestas rápidas

¿Cómo añado una zona de ox_target desde mi propio script?

Llama a exports.ox_target:addBoxZone({ coords = ..., size = ..., rotation = ..., options = { ... } }) en el cliente. Devuelve una id que mantienes para poder eliminar la zona más tarde.

¿Cómo muestro una opción solo a algunos trabajos?

Usa groups en la opción, por ejemplo groups = 'police', o una tabla para varios trabajos. Para cualquier cosa más específica, devuelve true o false desde canInteract.

¿Por qué mi objetivo no aparece?

Usualmente el jugador está fuera de la distance de la opción, una verificación de groups o canInteract falla, u ox_target no se inicia antes que tu script. Enciende debug = true en la zona para ver su forma.

Scripts que evitan este problema

Shop CreatorCrea una tienda en menos de un minuto — dueños, empleados, caja fuerte y atracos.Ver script →Quest CreatorUn editor visual de misiones y diálogos con NPC, nodo a nodo dentro del juego.Ver script →Item Creator V2Crea items usables con animaciones, props, efectos y más — sin escribir código.Ver script →

Sigue leyendo