RegisterCommand и RegisterKeyMapping: переназначаемые клавиши в FiveM
Создайте команды FiveM и позволяйте игрокам переназначать их: RegisterCommand с ACE, RegisterKeyMapping, действия удержания с +/- командами и почему новая клавиша по умолчанию игнорируется.
Вы хотите команду как /garage, которую любой может введя, клавишу как E, которая делает то же самое, и способ для каждого игрока изменить эту клавишу. FiveM дает вам RegisterCommand для команды и RegisterKeyMapping для клавиши. Эта статья показывает оба, как ограничить команду администраторами, как сделать действие, которое работает, пока клавиша удерживается и почему изменение клавиши по умолчанию позже делает ничего для существующих игроков.
Простая команда
Команда — это имя и функция:
RegisterCommand('garage', function(source, args, rawCommand)
print('garage opened')
end, false)На клиенте source не полезен. Таблица args содержит слова, введенные после команды, и rawCommand — это полный текст. На сервере source — это id игрока или 0, когда команда приходит из консоли сервера.
То же самое на сервере, с аргументом:
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:
add_ace group.admin command.heal allow
add_principal identifier.license:your_license_here group.adminИгроки без его получают ошибку разрешения и команда никогда не выполняется. Как группы ACE и principals работают, охватывается в разрешения ACE для администраторов FiveM.
Внимание: команда
falseможет быть введена всеми, включая читеров, которые вызывают её вручную. Никогда не полагайтесь на команду на стороне клиента, чтобы охранять что-то ценное. Выполните проверку реального разрешения на сервере.
Привяжите команду к клавише
RegisterKeyMapping привязывает команду к клавише, на клиенте. Команда должна существовать, поэтому зарегистрируйте обе:
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, когда она поднимается:
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 применяется только в первый раз, когда игра видит это отображение. После этого привязка живет в собственных настройках игрока, и новое значение по умолчанию не используется. Итак:
- Новые игроки получают новую клавишу.
- Существующие игроки держат старую или что-то, что они сами выбрали.
Нет чистого способа навязать клавишу игрокам, которые уже имеют привязку. Ваши варианты:
- Скажите игрокам переназначить в Settings > Key Bindings > FiveM. Поместите её в ваши заметки об обновлении.
- Используйте новое имя команды для действия, например
garage_v2вместоgarage. Это новое отображение, поэтому применяется новое значение по умолчанию. Игроки видят обе записи до удаления старой. - Не полагайтесь на значение по умолчанию. Покажите фактическую клавишу в вашем пользовательском интерфейсе вместо фиксированной буквы или скажите игрокам, как переназначить.
Это также почему вы должны тестировать изменения ключей на свежем профиле или после удаления привязки в настройках. Иначе вы продолжаете тестировать вашу старую клавишу.
Сохраните логику команды маленькой
Обработчик команды должен делать одно: вызвать функцию. Затем клавиша, команда и целевое взаимодействие (смотрите ox_target: как добавить targets) все вызывают одну и ту же функцию:
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.

