• Просьба не публиковать сообщения с предложениями продажи модов или сборок!

    Мы против использования и перепродажи слитых модов и переделок на их основе. Остальное также сложно верифицировать, поэтому в целом пока что запрещаем эту тему на сайте.

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

Lev Angel

Developer
Команда форума
Скриптер
Сообщения
924
Как в 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



Полезные ссылки по теме:
Как отключать бинд когда активно поле ввода чата
 
Последнее редактирование:
Константы клавиш:
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);

Для тех кому нужна розшифрофка констант.
 
Последнее редактирование:
Есть ли возможность заставить сервер игнорировать нажатие клавиш, занятых биндами, во время ввода сообщения в чат, например?
 
У меня вопрос по теме: если делаю меню на кнопку капс лок, то меняется регистр букв, как это игнорировать?
 
Есть ли возможность заставить сервер игнорировать нажатие клавиш, занятых биндами, во время ввода сообщения в чат, например?
По идее ты можешь проверять что открыто поле ввода чата и проверять на это в своих биндах.
Вот это похоже на то что тебе нужно: https://wiki.rage.mp/index.php?title=Players::isTypingInTextChat
 
JavaScript:
mp.keys.bind(/* ид кнопки */, true, () => {
    if (mp.players.local.isTypingInTextChat) //открыт ли чат? true - да, false - нет
        return;

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

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);
 
У тебя не определен player внутри функции. Может быть это конечно глобальная переменная, но скорее всего ошибка.
Код у тебя клиентский и чтобы получить объект локального игрока нужно обращаться не к player, а к mp.players.local.
 
У тебя не определен player внутри функции. Может быть это конечно глобальная переменная, но скорее всего ошибка.
Код у тебя клиентский и чтобы получить объект локального игрока нужно обращаться не к player, а к mp.players.local.
Здравствуйте, как можно реализовать бинд на комбинации клавиш?
т.е. Noclip будет срабатывать при нажатии 2х клавиш - alt + w.
За ответ буду безумно благодарен!
 
Здравствуйте, как можно реализовать бинд на комбинации клавиш?
т.е. Noclip будет срабатывать при нажатии 2х клавиш - alt + w.
За ответ буду безумно благодарен!
Тебе поможет https://wiki.rage.mp/index.php?title=Keys::isDown Можно одновременно сделать несколько проверок на нужные тебе клавиши и если все они нажаты, то запускать нужный сценарий.
 
Подскажите, что делать?
Пока что для теста написал такой вот код:


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)
 
Подскажите, что делать?
Пока что для теста написал такой вот код:


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)
Кнопки биндятся на клиентской стороне
 
Кнопки биндятся на клиентской стороне
Попробовал писать на клиентской стороне (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 тоже самое.
 
Ты опять же путаешь серверную часть и клиентскую, 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 эвенты и функции
 
Последнее редактирование:
Ты опять же путаешь серверную часть и клиентскую, 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
 
Переносить в 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);
 
Назад
Верх