ox_target addBoxZone, addModel и addLocalEntity: как добавлять цели

Как добавлять взаимодействия ox_target в FiveM: addBoxZone, addSphereZone, addModel, addLocalEntity и addGlobalVehicle, с опциями, группами, удалением и отладкой.

Вы добавляете цель в вашем скрипте и в игре ничего не показывается. Или консоль говорит:

text
No such export addBoxZone in resource ox_target

Это практическое руководство к ox_target на клиенте: зона, модель и экспорты сущностей, опции, которые вы можете поместить на них, и как удалить и отладить их.

Убедитесь, что ox_target запущен первым

Экспорты существуют только при запущенном ox_target, и он нуждается в ox_lib. В server.cfg, запустите их перед вашим скриптом:

cfg
ensure oxmysql
ensure ox_lib
ensure ox_target

ensure my_script

Также добавьте его в fxmanifest.lua вашего ресурса, чтобы FiveM отказался запускать скрипт без него:

lua
dependency 'ox_target'

Все вызовы ниже — на стороне клиента. Поместите их в файл клиента, а не сервера.

Зона в коробке

Зона коробки — это прямоугольник в мире. Это правильный выбор для прилавка, двери или банкомата:

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 — это центр коробки, size — это её ширина, длина и высота, и rotation поворачивает её вокруг вертикальной оси. Сохраняйте возвращённый zoneId, если вы удалите зону позже.

Зона сферы

Сфера проще, когда вы не заботитесь о форме, только о "вблизи этой точки":

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

Модели, сущности и транспортные средства

Чтобы нацеливаться на каждый объект, ped или транспортное средство определённой модели, используйте addModel. Это принимает имя модели или хэш, или список:

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

Чтобы нацеливаться на одну сущность, которую вы уже создали на вашем клиенте, используйте 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,
    },
})

Чтобы добавить опцию к каждому транспортному средству, используйте addGlobalVehicle. Другие глобальные экспорты существуют для пешеходов, игроков и объектов:

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

Совет: addLocalEntity существует только на клиенте, который создал сущность. Для сетевой сущности, на которой другие игроки должны видеть опцию, используйте сетевой вариант (addEntity) с id сети сущности.

Поля опции

Каждая опция — это таблица. Это поля, которые вы будете использовать чаще всего:

Поле Что оно делает
name Уникальное имя. Нужно для удаления опции позже.
icon Класс Font Awesome, как fa-solid fa-box.
label Текст, показываемый игроку.
onSelect Функция, вызываемая, когда игрок выбирает опцию.
distance Как близко должен быть игрок в метрах.
canInteract Функция, которая возвращает true для показа опции.
groups Требуемая работа или группа для просмотра опции.

canInteract получает сущность и расстояние, поэтому вы можете скрыть опцию на основе любого условия:

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

Для работ, groups принимает имя или таблицу и работает на ESX, QBCore и QBox через собственную поддержку фреймворка ox_target:

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

Удалите зоны и опции

Зоны удаляются с id, который возвращает вызов:

lua
exports.ox_target:removeZone(zoneId)

Опции, добавленные в модели, сущности и глобальные цели, удаляются по name, который вы им дали:

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

Очистите при остановке вашего ресурса, иначе перезагрузка может оставить дубликаты позади:

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 = 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Создавайте используемые предметы с анимациями, пропами, эффектами и не только — без кода.Смотреть скрипт →

Читайте также