RegisterCommand и RegisterKeyMapping: переназначаемые клавиши в FiveM

Создайте команды FiveM и позволяйте игрокам переназначать их: RegisterCommand с ACE, RegisterKeyMapping, действия удержания с +/- командами и почему новая клавиша по умолчанию игнорируется.

Вы хотите команду как /garage, которую любой может введя, клавишу как E, которая делает то же самое, и способ для каждого игрока изменить эту клавишу. FiveM дает вам RegisterCommand для команды и RegisterKeyMapping для клавиши. Эта статья показывает оба, как ограничить команду администраторами, как сделать действие, которое работает, пока клавиша удерживается и почему изменение клавиши по умолчанию позже делает ничего для существующих игроков.

Простая команда

Команда — это имя и функция:

lua
RegisterCommand('garage', function(source, args, rawCommand)
    print('garage opened')
end, false)

На клиенте source не полезен. Таблица args содержит слова, введенные после команды, и rawCommand — это полный текст. На сервере source — это id игрока или 0, когда команда приходит из консоли сервера.

То же самое на сервере, с аргументом:

lua
RegisterCommand('heal', function(source, args)
    local target = tonumber(args[1]) or source
    TriggerClientEvent('my_script:heal', target)
end, true)

Ограничьте команду с ACE

Последний аргумент RegisterCommand — это restricted. С true, никто не может запустить команду, если он не держит разрешение ACE command.<name>. Дайте его вашим администраторам в server.cfg:

cfg
add_ace group.admin command.heal allow
add_principal identifier.license:your_license_here group.admin

Игроки без его получают ошибку разрешения и команда никогда не выполняется. Как группы ACE и principals работают, охватывается в разрешения ACE для администраторов FiveM.

Внимание: команда false может быть введена всеми, включая читеров, которые вызывают её вручную. Никогда не полагайтесь на команду на стороне клиента, чтобы охранять что-то ценное. Выполните проверку реального разрешения на сервере.

Привяжите команду к клавише

RegisterKeyMapping привязывает команду к клавише, на клиенте. Команда должна существовать, поэтому зарегистрируйте обе:

lua
RegisterCommand('garage', function()
    print('garage opened')
end, false)

RegisterKeyMapping('garage', 'Open the garage', 'keyboard', 'F5')

Четыре аргумента — это имя команды, описание, показываемое игроку, устройство ввода ('keyboard' здесь) и клавиша по умолчанию. Имя клавиши написано как E, F5 или LSHIFT.

Игроки теперь могут нажать F5 или введя /garage, и оба делают то же самое.

Где игроки переназначают её

Клавиша по умолчанию — это только предложение. Игроки открывают Settings > Key Bindings > FiveM и находят ваше действие там, перечисленное по тексту описания. Они могут изменить клавишу на что им нравится.

Напишите четкое описание ('Open the garage', не 'garage'), так как это все, что видит игрок. Держите её короткой и уникальной, чтобы два скрипта не показали одну и ту же метку.

Действия удержания с командами + и -

Для чего-то, что длится, пока клавиша удерживается, такой как push-to-talk или веревка, зарегистрируйте пару команд: одна начинающаяся с + и одна с -. Игра запускает +name, когда клавиша опускается, и -name, когда она поднимается:

lua
local holding = false

RegisterCommand('+my_hold', function()
    holding = true
end, false)

RegisterCommand('-my_hold', function()
    holding = false
end, false)

RegisterKeyMapping('+my_hold', 'Hold to aim the tool', 'keyboard', 'G')

CreateThread(function()
    while true do
        if holding then
            -- do the held action here
            Wait(0)
        else
            Wait(250)
        end
    end
end)

Отобразите имя +. Обе команды + и - должны быть зарегистрированы, или релиз никогда не виден.

Почему новая клавиша по умолчанию делает ничего

Это ловит много разработчиков. Вы выпускаете версию 1 с 'F5', затем переходите на 'F6' в версию 2. Игроки, которые уже запустили версию 1, все еще нажимают F5.

Причина: клавиша по умолчанию из RegisterKeyMapping применяется только в первый раз, когда игра видит это отображение. После этого привязка живет в собственных настройках игрока, и новое значение по умолчанию не используется. Итак:

  • Новые игроки получают новую клавишу.
  • Существующие игроки держат старую или что-то, что они сами выбрали.

Нет чистого способа навязать клавишу игрокам, которые уже имеют привязку. Ваши варианты:

  1. Скажите игрокам переназначить в Settings > Key Bindings > FiveM. Поместите её в ваши заметки об обновлении.
  2. Используйте новое имя команды для действия, например garage_v2 вместо garage. Это новое отображение, поэтому применяется новое значение по умолчанию. Игроки видят обе записи до удаления старой.
  3. Не полагайтесь на значение по умолчанию. Покажите фактическую клавишу в вашем пользовательском интерфейсе вместо фиксированной буквы или скажите игрокам, как переназначить.

Это также почему вы должны тестировать изменения ключей на свежем профиле или после удаления привязки в настройках. Иначе вы продолжаете тестировать вашу старую клавишу.

Сохраните логику команды маленькой

Обработчик команды должен делать одно: вызвать функцию. Затем клавиша, команда и целевое взаимодействие (смотрите ox_target: как добавить targets) все вызывают одну и ту же функцию:

lua
local function openGarage()
    print('garage opened')
end

RegisterCommand('garage', openGarage, false)
RegisterKeyMapping('garage', 'Open the garage', 'keyboard', 'F5')

Избегайте клавиш, которые уже используют другие вещи. Проверка IsControlJustPressed в цикле для той же клавиши, как привязанная команда, делает обе выстреливают. Используйте только отображение.

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

Симптом Исправление
Команда работает для всех Передайте true как третий аргумент и дайте command.<name> с add_ace
Клавиша ничего не делает Зарегистрируйте команду в первую очередь, затем RegisterKeyMapping с тем же именем
Действие удержания никогда не релизится Зарегистрируйте обе +name и -name и отобразите имя +
Измененная клавиша по умолчанию игнорируется Значения по умолчанию применяются один раз: игроки переназначают или используют новое имя команды
Игроки не могут найти привязку Settings > Key Bindings > FiveM; используйте четкое описание
Команда сервера нарушается в консоли source равен 0 там; обработайте этот случай

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

Где игроки изменяют клавишу, установленную с RegisterKeyMapping?

В настройках игры, в разделе Key Bindings, в разделе FiveM. Текст вашего описания — это метка, которую они видят там.

Я изменил клавишу по умолчанию в моём скрипте, но у игроков все еще старая. Почему?

Значение по умолчанию применяется только в первый раз, когда регистрируется это отображение. После этого собственное сохраненное привязка игрока побеждает. Либо попросите игроков переназначить, либо зарегистрируйте действие под новым именем команды.

Как я ограничу команду администраторами?

Передайте true как третий аргумент RegisterCommand, затем дайте вашей группе администраторов ACE command.yourcommand в server.cfg с add_ace.

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

Item Creator V2Создавайте используемые предметы с анимациями, пропами, эффектами и не только — без кода.Смотреть скрипт →Shop CreatorМагазин меньше чем за минуту — владельцы, сотрудники, сейфы и ограбления в комплекте.Смотреть скрипт →

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