ox_target addBoxZone, addModel и addLocalEntity: как добавлять цели
Как добавлять взаимодействия ox_target в FiveM: addBoxZone, addSphereZone, addModel, addLocalEntity и addGlobalVehicle, с опциями, группами, удалением и отладкой.
Вы добавляете цель в вашем скрипте и в игре ничего не показывается. Или консоль говорит:
No such export addBoxZone in resource ox_targetЭто практическое руководство к ox_target на клиенте: зона, модель и экспорты сущностей, опции, которые вы можете поместить на них, и как удалить и отладить их.
Убедитесь, что ox_target запущен первым
Экспорты существуют только при запущенном ox_target, и он нуждается в ox_lib. В server.cfg, запустите их перед вашим скриптом:
ensure oxmysql
ensure ox_lib
ensure ox_target
ensure my_scriptТакже добавьте его в fxmanifest.lua вашего ресурса, чтобы FiveM отказался запускать скрипт без него:
dependency 'ox_target'Все вызовы ниже — на стороне клиента. Поместите их в файл клиента, а не сервера.
Зона в коробке
Зона коробки — это прямоугольник в мире. Это правильный выбор для прилавка, двери или банкомата:
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 — это центр коробки, size — это её ширина, длина и высота, и rotation поворачивает её вокруг вертикальной оси. Сохраняйте возвращённый zoneId, если вы удалите зону позже.
Зона сферы
Сфера проще, когда вы не заботитесь о форме, только о "вблизи этой точки":
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,
},
},
})Модели, сущности и транспортные средства
Чтобы нацеливаться на каждый объект, ped или транспортное средство определённой модели, используйте addModel. Это принимает имя модели или хэш, или список:
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,
},
})Чтобы нацеливаться на одну сущность, которую вы уже создали на вашем клиенте, используйте 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,
},
})Чтобы добавить опцию к каждому транспортному средству, используйте addGlobalVehicle. Другие глобальные экспорты существуют для пешеходов, игроков и объектов:
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,
},
})Совет:
addLocalEntityсуществует только на клиенте, который создал сущность. Для сетевой сущности, на которой другие игроки должны видеть опцию, используйте сетевой вариант (addEntity) с id сети сущности.
Поля опции
Каждая опция — это таблица. Это поля, которые вы будете использовать чаще всего:
| Поле | Что оно делает |
|---|---|
name |
Уникальное имя. Нужно для удаления опции позже. |
icon |
Класс Font Awesome, как fa-solid fa-box. |
label |
Текст, показываемый игроку. |
onSelect |
Функция, вызываемая, когда игрок выбирает опцию. |
distance |
Как близко должен быть игрок в метрах. |
canInteract |
Функция, которая возвращает true для показа опции. |
groups |
Требуемая работа или группа для просмотра опции. |
canInteract получает сущность и расстояние, поэтому вы можете скрыть опцию на основе любого условия:
{
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,
}Для работ, groups принимает имя или таблицу и работает на ESX, QBCore и QBox через собственную поддержку фреймворка ox_target:
groups = 'police',
-- or several, optionally with a minimum grade
groups = { police = 0, sheriff = 2 },Удалите зоны и опции
Зоны удаляются с id, который возвращает вызов:
exports.ox_target:removeZone(zoneId)Опции, добавленные в модели, сущности и глобальные цели, удаляются по name, который вы им дали:
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')Очистите при остановке вашего ресурса, иначе перезагрузка может оставить дубликаты позади:
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 = true на зоне. ox_target затем рисует её форму в мире, поэтому вы сразу видите, если коробка находится не на месте, слишком мала или похоронена в полу. Обычные причины:
- Зона неправильно размещена.
coords— это центр, поэтому коробка, чей z сидит на уровне пола, наполовину под землей. Поднимите его на половину его высоты. - Расстояние слишком мало. Игрок должен быть внутри
distanceзоны, чтобы видеть опцию. - Проверка не работает.
groupsилиcanInteract, которые возвращают false, скрывают опцию без ошибки. Временно удалите это для тестирования. - Два целевых охотника запущены. Если qb-target также запущен, смотрите qb-target vs ox_target.
По умолчанию вы держите клавишу (Left Alt) для открытия глаза нацеливания, поэтому тестируйте, держа её.
Контрольный список
| Симптом | Решение |
|---|---|
No such export addBoxZone in resource ox_target |
Запустите ox_target (и ox_lib) перед вашим скриптом |
| Опция никогда не показывается | Включите debug = true, проверьте distance, groups и canInteract |
| Зона наполовину под землей | coords — это центр: поднимите z на половину высоты коробки |
| Опция показывается для всех | Добавьте groups или проверку canInteract |
| Дубликаты после перезагрузки вашего скрипта | Удалите зоны и опции в onResourceStop |
| Нужно удалить одну опцию | Дайте ей name и вызовите согласованный экспорт remove... |
Короткие ответы
Как добавить зону ox_target из собственного скрипта?
Вызовите exports.ox_target:addBoxZone({ coords = ..., size = ..., rotation = ..., options = { ... } }) на клиенте. Это возвращает id, который вы сохраняете, чтобы позже удалить зону.
Как показать опцию только для некоторых работ?
Используйте groups на опции, например groups = 'police', или таблицу для нескольких работ. Для чего-то более специфичного, возвращайте true или false из canInteract.
Почему моя цель не появляется?
Обычно игрок находится вне distance опции, проверка groups или canInteract не работает, или ox_target не запущен перед вашим скриптом. Включите debug = true на зоне, чтобы увидеть её форму.
Скрипты без этой проблемы
Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →
Quest CreatorВизуальный редактор квестов и диалогов с NPC — узел за узлом прямо в игре.Смотреть скрипт →
Item Creator V2Создавайте используемые предметы с анимациями, пропами, эффектами и не только — без кода.Смотреть скрипт →