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:
No such export addBoxZone in resource ox_targetEsta 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:
ensure oxmysql
ensure ox_lib
ensure ox_target
ensure my_scriptTambién añádelo a tu fxmanifest.lua del recurso, para que FiveM se rehúse a iniciar el script sin él:
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:
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":
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:
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:
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:
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:
addLocalEntitysolo 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:
{
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:
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:
exports.ox_target:removeZone(zoneId)Las opciones añadidas a modelos, entidades y objetivos globales se eliminan por el name que les diste:
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:
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
coordses 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
distancede la zona para ver la opción. - Una verificación falla. Un
groupsocanInteractque 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 →