qb-target vs ox_target: конвертируйте AddBoxZone и исправьте не показываемые targets

Переход с qb-target на ox_target на FiveM: как конвертировать вызовы AddBoxZone и AddTargetModel, что делает слой совместимости и почему targets не показываются.

Вы перешли с qb-target на ox_target или загрузили скрипт, написанный для одного, а работающий на другом, и зоны взаимодействия исчезли или удвоились. Вот как два отличаются, как конвертировать вызовы и как узнать, почему target не показывается.

Разница в одной таблице

Оба ресурса делают одно и то же: клавиша открывает targeting eye и игрок выбирает опцию на сущности или в зоне. Они отличаются тем, как вы это описываете.

Идея qb-target ox_target
Box zone AddBoxZone(name, center, length, width, options, targetOptions) addBoxZone({ coords, size, rotation, options })
Model AddTargetModel(models, options) addModel(models, options)
Что делать type, event, action onSelect, event, serverEvent
Ограничение работы job groups
Ограничение предмета item items
Дополнительная проверка canInteract canInteract

ox_target принимает одну таблицу для зон, и опции — это простой список, без обертки, которая держит options и distance вместе.

Конвертируйте box zone

Типичная зона qb-target:

lua
exports['qb-target']:AddBoxZone('pd_armory', vector3(452.2, -980.0, 30.7), 1.5, 1.0, {
    name = 'pd_armory',
    heading = 90.0,
    debugPoly = false,
    minZ = 29.7,
    maxZ = 31.7,
}, {
    options = {
        {
            type = 'client',
            event = 'my_script:openArmory',
            icon = 'fas fa-gun',
            label = 'Open armory',
            job = 'police',
        },
    },
    distance = 2.0,
})

Та же зона в ox_target:

lua
exports.ox_target:addBoxZone({
    coords = vec3(452.2, -980.0, 30.7),
    size = vec3(1.0, 1.5, 2.0),
    rotation = 90.0,
    debug = false,
    options = {
        {
            name = 'pd_armory',
            event = 'my_script:openArmory',
            icon = 'fa-solid fa-gun',
            label = 'Open armory',
            groups = 'police',
            distance = 2.0,
        },
    },
})

Что переместилось:

  • center становится coords, и это центр коробки в обоих, но высота теперь исходит из size. qb-target использует minZ и maxZ, поэтому поместите coords.z на полпути между ними и используйте их зазор как высоту.
  • length и width становятся x и y size. Если коробка оканчивается неправильно, поменяйте их местами или измените rotation, и проверьте с debug = true.
  • heading становится rotation.
  • job становится groups, и distance перемещается в каждую опцию.
  • type = 'client' с event остается event. Используйте serverEvent для type = 'server' или onSelect с функцией вместо события.

Конвертируйте model target

qb-target:

lua
exports['qb-target']:AddTargetModel({ `prop_atm_01`, `prop_atm_02` }, {
    options = {
        {
            type = 'client',
            event = 'my_script:openAtm',
            icon = 'fas fa-credit-card',
            label = 'Use ATM',
        },
    },
    distance = 1.5,
})

ox_target:

lua
exports.ox_target:addModel({ `prop_atm_01`, `prop_atm_02` }, {
    {
        name = 'my_script_atm',
        event = 'my_script:openAtm',
        icon = 'fa-solid fa-credit-card',
        label = 'Use ATM',
        distance = 1.5,
    },
})

Опции теперь сам второй аргумент, список таблиц опций. Полный список экспортов и полей находится в ox_target: addBoxZone, addModel и addLocalEntity.

Сохраняйте старый скрипт рабочим

ox_target обеспечивает совместимость для многих экспортов qb-target. Скрипт, который все еще вызывает exports['qb-target']:AddBoxZone(...), может продолжать работать, когда работает только ox_target, пока используются общие экспорты.

Не полагайтесь на это для всего. Менее распространенные экспорты и необычные поля опций могут вести себя не одинаково. Тестируйте каждый скрипт, и когда один неправильно себя ведет, конвертируйте его вызовы в встроенные экспорты ox_target, как показано выше. Встроенные вызовы также легче читать и отлаживать.

Внимание: не запускайте qb-target рядом с ox_target, чтобы «убедиться». Держите только один targeting ресурс и удалите другой из server.cfg.

Почему targets не показываются

Почти каждый случай «мой target невидим» подпадает в этот список.

Оба ресурса запущены. Два targeting ресурса борются за один и тот же ключ. Проверьте server.cfg и список ресурсов и держите только один:

cfg
ensure ox_lib
ensure ox_target
# ensure qb-target   <- remove or comment out

Расстояние слишком мало. Опция показывается только внутри ее distance. Попробуйте distance = 3.0 во время тестирования. С qb-target distance находится рядом с options, а не внутри каждой опции.

Проверка работы не удается. Опция с job (qb-target) или groups (ox_target) скрыта для всех без этой работы, без ошибки. Тестируйте с правильной работой или удалите поле на момент. На ox_target степень в таблице ({ police = 2 }) означает, что игроку требуется как минимум эта степень.

canInteract возвращает ничего. Если функция имеет путь кода, который возвращает nil, опция скрыта. Сделайте так, чтобы она возвращала true или false на каждом пути.

Зона в неправильном месте. Включите debug = true на ox_target (или debugPoly = true на qb-target) и посмотрите на форму. Коробка, центрированная на полу, наполовину под землей.

Скрипт запускается перед target. Запустите ресурс target перед вашим скриптом в server.cfg и добавьте dependency 'ox_target' в ваш манифест.

Контрольный список

Симптом Исправление
Опции удвоены или отсутствуют Запустите только один из qb-target и ox_target
job игнорируется после конвертирования Переименуйте его в groups
Зона повернута или неправильно размерена heading становится rotation; проверьте size с debug = true
Опция никогда не показывается Увеличьте distance, протестируйте работу и canInteract
Старый скрипт перестает работать Конвертируйте его вызовы в встроенные экспорты ox_target
Ничего вообще не показывается Запустите ox_target и ox_lib перед своими скриптами

Короткие ответы

Могу ли я запускать qb-target и ox_target вместе?

Нет. Выберите один. Оба ресурса хотят один и тот же targeting ключ и одну и ту же работу, и запуск обоих дает вам удвоенные или отсутствующие опции.

Работают ли мои старые скрипты qb-target с ox_target?

Часто да. ox_target обеспечивает совместимость для многих экспортов qb-target, поэтому скрипты, которые их вызывают, могут продолжать работать. Тестируйте каждый скрипт и конвертируйте те, которые неправильно себя ведут, в встроенные экспорты ox_target.

Что заменяет поле job qb-target?

ox_target использует groups. Установите groups = 'police' или таблицу, такую как { police = 0 }, чтобы также требовать степень.

Скрипты без этой проблемы

Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →Quest CreatorВизуальный редактор квестов и диалогов с NPC — узел за узлом прямо в игре.Смотреть скрипт →Advanced BoostingУгон машин на заказ через планшет: контракты от класса D до S+, команды и живая очередь.Смотреть скрипт →

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