Делаем бинды для кнопок

Lev Angel

Developer
Команда форума
Скриптер
Сообщения
795
Как в RAGE:MP сделать бинд на кнопку? Для этой цели нужно использовать методы bind и unbind. Бинды делаются только на клиентской стороне.
gta5_rickie_lukens_screen-3.jpg
Пример бинда на кнопку F2
JavaScript:
function testBind(){ // функция обработчик бинда
    mp.gui.chat.push('Нажата кнопка F2');
}

mp.keys.bind(0x71, true, testBind); // 0x71 это код кнопки F2

В качестве первого аргумента в mp.keys.bind мы передаем код кнопки. Коды всех кнопок: Virtual-Key Codes
Второй аргумент это момент на нажатия на котором должен сработать бинд. Если true, то при нажатии кнопки, false - при отпускании.
И третий аргумент это функция обработчик.


Чтобы убрать бинд нужно вызвать метод undind и передать туда тот же набор параметров что был в bind. Например, сделаем так чтобы бинд на F2 срабатывал только один раз.
JavaScript:
function testBind(){
    mp.gui.chat.push('Нажата кнопка F2');
    mp.keys.unbind(0x71, true, testBind); // убираем бинд
}

mp.keys.bind(0x71, true, testBind);



В rage mp также можно отслеживать статус нажатия кнопки без бинда: mp.keys.isUp и mp.keys.isDown



Полезные ссылки по теме:
Как отключать бинд когда активно поле ввода чата
 
Последнее редактирование:

geneff

Middle Developer
Скриптер
Сообщения
58
Константы клавиш:
JavaScript:
global.Keys = {
    VK_LBUTTON: 0x01,
    VK_RBUTTON: 0x02,
    VK_CANCEL: 0x03,
    VK_MBUTTON: 0x04,
    VK_XBUTTON1: 0x05,
    VK_XBUTTON2: 0x06,
    VK_BACK: 0x08,
    VK_TAB: 0x09,
    VK_CLEAR: 0x0C,
    VK_RETURN: 0x0D,
    VK_SHIFT: 0x10,
    VK_CONTROL: 0x11,
    VK_MENU: 0x12,
    VK_ALT: 0x12,
    VK_PAUSE: 0x13,
    VK_CAPITAL: 0x14,
    VK_KANA: 0x15,
    VK_JUNJA: 0x17,
    VK_FINAL: 0x18,
    VK_HANJA: 0x19,
    VK_ESCAPE: 0x1B,
    VK_CONVERT: 0x1C,
    VK_NONCONVERT: 0x1D,
    VK_ACCEPT: 0x1E,
    VK_MODECHANGE: 0x1F,
    VK_SPACE: 0x20,
    VK_PRIOR: 0x21,
    VK_NEXT: 0x22,
    VK_END: 0x23,
    VK_HOME: 0x24,
    VK_LEFT: 0x25,
    VK_UP: 0x26,
    VK_RIGHT: 0x27,
    VK_DOWN: 0x28,
    VK_SELECT: 0x29,
    VK_PRINT: 0x2A,
    VK_EXECUTE: 0x2B,
    VK_SNAPSHOT: 0x2C,
    VK_INSERT: 0x2D,
    VK_DELETE: 0x2E,
    VK_HELP: 0x2F,
    VK_0: 0x30,
    VK_1: 0x31,
    VK_2: 0x32,
    VK_3: 0x33,
    VK_4: 0x34,
    VK_5: 0x35,
    VK_6: 0x36,
    VK_7: 0x37,
    VK_8: 0x38,
    VK_9: 0x39,
    VK_A: 0x41,
    VK_B: 0x42,
    VK_C: 0x43,
    VK_D: 0x44,
    VK_E: 0x45,
    VK_F: 0x46,
    VK_G: 0x47,
    VK_H: 0x48,
    VK_I: 0x49,
    VK_J: 0x4A,
    VK_K: 0x4B,
    VK_L: 0x4C,
    VK_M: 0x4D,
    VK_N: 0x4E,
    VK_O: 0x4F,
    VK_P: 0x50,
    VK_Q: 0x51,
    VK_R: 0x52,
    VK_S: 0x53,
    VK_T: 0x54,
    VK_U: 0x55,
    VK_V: 0x56,
    VK_W: 0x57,
    VK_X: 0x58,
    VK_Y: 0x59,
    VK_Z: 0x5A,
    VK_LWIN: 0x5B,
    VK_RWIN: 0x5C,
    VK_APPS: 0x5D,
    VK_SLEEP: 0x5F,
    VK_NUMPAD0: 0x60,
    VK_NUMPAD1: 0x61,
    VK_NUMPAD2: 0x62,
    VK_NUMPAD3: 0x63,
    VK_NUMPAD4: 0x64,
    VK_NUMPAD5: 0x65,
    VK_NUMPAD6: 0x66,
    VK_NUMPAD7: 0x67,
    VK_NUMPAD8: 0x68,
    VK_NUMPAD9: 0x69,
    VK_MULTIPLY: 0x6A,
    VK_ADD: 0x6B,
    VK_SEPARATOR: 0x6C,
    VK_SUBTRACT: 0x6D,
    VK_DECIMAL: 0x6E,
    VK_DIVIDE: 0x6F,
    VK_F1: 0x70,
    VK_F2: 0x71,
    VK_F3: 0x72,
    VK_F4: 0x73,
    VK_F5: 0x74,
    VK_F6: 0x75,
    VK_F7: 0x76,
    VK_F8: 0x77,
    VK_F9: 0x78,
    VK_F10: 0x79,
    VK_F11: 0x7A,
    VK_F12: 0x7B,
    VK_F13: 0x7C,
    VK_F14: 0x7D,
    VK_F15: 0x7E,
    VK_F16: 0x7F,
    VK_F17: 0x80,
    VK_F18: 0x81,
    VK_F19: 0x82,
    VK_F20: 0x83,
    VK_F21: 0x84,
    VK_F22: 0x85,
    VK_F23: 0x86,
    VK_F24: 0x87,
    VK_NUMLOCK: 0x90,
    VK_SCROLL: 0x91,
    VK_LSHIFT: 0xA0,
    VK_RSHIFT: 0xA1,
    VK_LCONTROL: 0xA2,
    VK_RCONTROL: 0xA3,
    VK_LMENU: 0xA4,
    VK_RMENU: 0xA5,
    VK_BROWSER_BACK: 0xA6,
    VK_BROWSER_FORWARD: 0xA7,
    VK_BROWSER_REFRESH: 0xA8,
    VK_BROWSER_STOP: 0xA9,
    VK_BROWSER_SEARCH: 0xAA,
    VK_BROWSER_FAVORITES: 0xAB,
    VK_BROWSER_HOME: 0xAC,
    VK_VOLUME_MUTE: 0xAD,
    VK_VOLUME_DOWN: 0xAE,
    VK_VOLUME_UP: 0xAF,
    VK_MEDIA_NEXT_TRACK: 0xB0,
    VK_MEDIA_PREV_TRACK: 0xB1,
    VK_MEDIA_STOP: 0xB2,
    VK_MEDIA_PLAY_PAUSE: 0xB3,
    VK_LAUNCH_MAIL: 0xB4,
    VK_LAUNCH_MEDIA_SELECT: 0xB5,
    VK_LAUNCH_APP1: 0xB6,
    VK_LAUNCH_APP2: 0xB7,
    VK_OEM_1: 0xBA,
    VK_OEM_PLUS: 0xBB,
    VK_OEM_COMMA: 0xBC,
    VK_OEM_MINUS: 0xBD,
    VK_OEM_PERIOD: 0xBE,
    VK_OEM_2: 0xBF,
    VK_OEM_3: 0xC0,
    VK_OEM_4: 0xDB,
    VK_OEM_5: 0xDC,
    VK_OEM_6: 0xDD,
    VK_OEM_7: 0xDE,
    VK_OEM_8: 0xDF,
    VK_OEM_102: 0xE2,
    VK_PROCESSKEY: 0xE5,
    VK_PACKET: 0xE7,
    VK_ATTN: 0xF6,
    VK_CRSEL: 0xF7,
    VK_EXSEL: 0xF8,
    VK_EREOF: 0xF9,
    VK_PLAY: 0xFA,
    VK_ZOOM: 0xFB,
    VK_NONAME: 0xFC,
    VK_PA1: 0xFD,
    VK_OEM_CLEAR: 0xFE
}
Для удобности создаете отдельный файл, в который помещаете данный код и далее пользуетесь этими биндами. По-скольку переменная обьявлена глобально, данный файл можно не подключать с помощью require, а сразу напрямую вызывать переменуюю Keys :)

Пример:
JavaScript:
function testBind(){
    mp.gui.chat.push('Нажата кнопка F2');
    mp.keys.unbind(Keys.VK_F2, true, testBind); // убираем бинд
}
mp.keys.bind(Keys.VK_F2, true, testBind);

Для тех кому нужна розшифрофка констант.
 
Последнее редактирование:

Lev Angel

Developer
Команда форума
Скриптер
Сообщения
795
Спасибо за константы, так будет удобнее :)
 

LimoN

Trainee
Сообщения
7
Есть ли возможность заставить сервер игнорировать нажатие клавиш, занятых биндами, во время ввода сообщения в чат, например?
 

evgee

Junior Developer
Сообщения
41
У меня вопрос по теме: если делаю меню на кнопку капс лок, то меняется регистр букв, как это игнорировать?
 

Lev Angel

Developer
Команда форума
Скриптер
Сообщения
795
Есть ли возможность заставить сервер игнорировать нажатие клавиш, занятых биндами, во время ввода сообщения в чат, например?
По идее ты можешь проверять что открыто поле ввода чата и проверять на это в своих биндах.
Вот это похоже на то что тебе нужно: https://wiki.rage.mp/index.php?title=Players::isTypingInTextChat
 

geneff

Middle Developer
Скриптер
Сообщения
58
JavaScript:
mp.keys.bind(/* ид кнопки */, true, () => {
    if (mp.players.local.isTypingInTextChat) //открыт ли чат? true - да, false - нет
        return;

    /* ваш код */
})
 

Dihan48

Middle Developer
Скриптер
Сообщения
61
У меня вопрос по теме: если делаю меню на кнопку капс лок, то меняется регистр букв, как это игнорировать?
Ни как. Смена регистра букв на капс срабатывает на уровне ОС, а не игры, это тоже самое что и смена раскладки клавиатуры, игра не может на это повлиять или заблокировать это действие. Лучше ставь меню на кнопку таб например
 

evgee

Junior Developer
Сообщения
41
Ни как. Смена регистра букв на капс срабатывает на уровне ОС, а не игры, это тоже самое что и смена раскладки клавиатуры, игра не может на это повлиять или заблокировать это действие. Лучше ставь меню на кнопку таб например
Я думал об этом, конфликтует с меню оружия
 

Realniy

Trainee
Сообщения
6
я привязал телепорт на нажатие клавиши, но когда нажимаю клавишу в игре сообщение в чат срабатывает а сам телепорт не срабатывает. что тут не так?

function testBind(){
mp.gui.chat.push('Вы были телепортированы');
const playerPos = player.position
console.log(playerPos) // return e.g. {x: 1337, y: 228, z: 70}
player.position = new mp.Vector3( 4840.571, -5174.425, 2.0);
mp.keys.unbind(0x4E, true, testBind); // убираем бинд
}

mp.keys.bind(0x4E, true, testBind);
 

Lev Angel

Developer
Команда форума
Скриптер
Сообщения
795
У тебя не определен player внутри функции. Может быть это конечно глобальная переменная, но скорее всего ошибка.
Код у тебя клиентский и чтобы получить объект локального игрока нужно обращаться не к player, а к mp.players.local.
 

Nicon

New member
Сообщения
3
У тебя не определен player внутри функции. Может быть это конечно глобальная переменная, но скорее всего ошибка.
Код у тебя клиентский и чтобы получить объект локального игрока нужно обращаться не к player, а к mp.players.local.
Здравствуйте, как можно реализовать бинд на комбинации клавиш?
т.е. Noclip будет срабатывать при нажатии 2х клавиш - alt + w.
За ответ буду безумно благодарен!
 

Lev Angel

Developer
Команда форума
Скриптер
Сообщения
795
Здравствуйте, как можно реализовать бинд на комбинации клавиш?
т.е. Noclip будет срабатывать при нажатии 2х клавиш - alt + w.
За ответ буду безумно благодарен!
Тебе поможет https://wiki.rage.mp/index.php?title=Keys::isDown Можно одновременно сделать несколько проверок на нужные тебе клавиши и если все они нажаты, то запускать нужный сценарий.
 

Амонгасик

New member
Сообщения
4
Подскажите, что делать?
Пока что для теста написал такой вот код:


const localPlayer = mp.players.local;
let IsWorking = false;




function WorkStart() {
let WorkStartPosition = new mp.Vector3(-500, -929, 25);
if (localPlayer.dist(WorkStartPosition) < 1.5) {
if (IsWorking === true) {
localPlayer.outputChatBox("working");
}
else if (IsWorking === false) {
localPlayer.outputChatBox("not");
}
}
}



mp.keys.bind(0x45, true, WorkStart);

И при запуске сервера появляется такая вот ошибка:

[ERROR] "testrp" package loading failed, exception stack:
TypeError: Cannot read property 'bind' of undefined
at Object.<anonymous> (D:\games\Ragemp\server-files\packages\testrp\builder.js:21:9)
at Module._compile (internal/modules/cjs/loader.js:1076:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
at Module.load (internal/modules/cjs/loader.js:941:32)
at Function.Module._load (internal/modules/cjs/loader.js:782:14)
at Module.require (internal/modules/cjs/loader.js:965:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object.<anonymous> (D:\games\Ragemp\server-files\packages\testrp\index.js:2:1)
at Module._compile (internal/modules/cjs/loader.js:1076:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
 

Verdiji

Junior Developer
Скриптер
Сообщения
30
Подскажите, что делать?
Пока что для теста написал такой вот код:


const localPlayer = mp.players.local;
let IsWorking = false;




function WorkStart() {
let WorkStartPosition = new mp.Vector3(-500, -929, 25);
if (localPlayer.dist(WorkStartPosition) < 1.5) {
if (IsWorking === true) {
localPlayer.outputChatBox("working");
}
else if (IsWorking === false) {
localPlayer.outputChatBox("not");
}
}
}



mp.keys.bind(0x45, true, WorkStart);

И при запуске сервера появляется такая вот ошибка:

[ERROR] "testrp" package loading failed, exception stack:
TypeError: Cannot read property 'bind' of undefined
at Object.<anonymous> (D:\games\Ragemp\server-files\packages\testrp\builder.js:21:9)
at Module._compile (internal/modules/cjs/loader.js:1076:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
at Module.load (internal/modules/cjs/loader.js:941:32)
at Function.Module._load (internal/modules/cjs/loader.js:782:14)
at Module.require (internal/modules/cjs/loader.js:965:19)
at require (internal/modules/cjs/helpers.js:88:18)
at Object.<anonymous> (D:\games\Ragemp\server-files\packages\testrp\index.js:2:1)
at Module._compile (internal/modules/cjs/loader.js:1076:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
Кнопки биндятся на клиентской стороне
 

Амонгасик

New member
Сообщения
4
Кнопки биндятся на клиентской стороне
Попробовал писать на клиентской стороне (client_packages), там сделал index.js, там указал require('./works/builder.js'). После чего в builders.js прописал такой вот код:
const localPlayer = mp.players.local;
let IsWorking = false;

localPlayer.notify("hi")

function WorkStart() {
let WorkStartPosition = new mp.Vector3(-500, -929, 25);
if (localPlayer.dist(WorkStartPosition) < 1.5) {
if (IsWorking === true) {
localPlayer.notify("working")
}
else if (IsWorking === false) {
localPlayer.notify("not")
}
}
}
function SayHi() {
localPlayer.notify("hi")
}



mp.keys.bind(0x45, true, WorkStart);
mp.keys.bind(0x55, true, WorkStart);

Сервер конечно запустился, но при заходе на сервер вот такая ошибка GTA5_KbNWdw0bqa.png
При использовании outputChatBox тоже самое.
 

Verdiji

Junior Developer
Скриптер
Сообщения
30
Ты опять же путаешь серверную часть и клиентскую, notify - это серверный вызов нотифая игроку, outputChatBox - тоже серверный метод.
Клиентские вызовы это:
notify:
Код:
mp.game.graphics.notify('~g~Hello ~w~World');
Вывод в чат:
Код:
mp.gui.chat.push('text');
Внимательнее изучи https://wiki.rage.mp/index.php?title=Main_Page
Секцию "Reference" , там есть server-side и client-side эвенты и функции
 
Последнее редактирование:

Амонгасик

New member
Сообщения
4
Ты опять же путаешь серверную часть и клиентскую, notify - это серверный вызов нотифая игроку, outputChatBox - тоже серверный метод.
Клиентские вызовы это:
notify:
Код:
mp.game.graphics.notify('~g~Hello ~w~World');
Вывод в чат:
Код:
mp.gui.chat.push('text');
Внимательнее изучи https://wiki.rage.mp/index.php?title=Main_Page
Секцию "Reference" , там есть server-side и client-side эвенты и функции
Поменял, сейчас поялились новые ошибки GTA5_kX6np2vRol.png
Потом попробовал вместо require() перенести весь код в index.js, после чего ошибка уже такая GTA5_rF9Iko5UWf.png
Файлы храню в server-files\client_packages
 

Verdiji

Junior Developer
Скриптер
Сообщения
30
Переносить в index.js не нужно, посмотри, что за ошибка в файле, указанном на первом скрине ошибки, и ошибка когда появляется, при старте сервера, или при нажатии на забинженную кнопку?
И зачем используешь else if?
Попробуй так:
JavaScript:
const localPlayer = mp.players.local;
let IsWorking = false;
const WorkStartPosition = new mp.Vector3(-500, -929, 25);
function WorkStart() {
  if (localPlayer.dist(WorkStartPosition) < 1.5) {
    if (IsWorking) {
      mp.game.graphics.notify("~g~working");
    } else {
      mp.game.graphics.notify("~r~not working");
    }
  }
}
function SayHi() {
     mp.game.graphics.notify('Hi');
}

mp.keys.bind(0x45, true, WorkStart);
mp.keys.bind(0x55, true, SayHi);
 
Верх