Создание команд / работа с командами RAGE MP

Lev Angel

Developer
Команда форума
Скриптер
1579335739081.png
Чтобы зарегистрировать новую команду мы используем функцию mp.events.addCommand Она позволяет привязать к указанной команде функцию-обработчик.

JavaScript:
mp.events.addCommand(commandName, handlerFunction);
commandName - название команды
handlerFunction - функция-обработчик, которая будет вызвана когда кто-то введет эту команду. В эту функцию передаются следующие аргументы:
Код:
player, fullText [, arg1, arg2, ...]
player - игрок который ввел команду
fullText - массив всех аргументов введенных после команды
[, arg1, arg2, ...] - аргументы введенные после самой команды

Теперь для примера создадим несколько простых команды.

Пример 1 - Команда /me
JavaScript:
mp.events.addCommand("me", (player, message) => {
    mp.players.broadcast(`* ${player.name}: ${message}`);
});


Пример 2 - Команда /weapon
Команда выдает игроку выбранное оружие с указанным количеством патронов (если не указано, то 1000). Например, /weapon weapon_revolver 500 выдаст 500 патронов пистолета Heavy Revolver.
JavaScript:
mp.events.addCommand("weapon", (player, fullText, weapon, ammo) => {
    var weaponHash = mp.joaat(weapon);

    player.giveWeapon(weaponHash, parseInt(ammo) || 10000);

});


Также можно отслеживать ввод команд при помощи события playerCommand. Оно срабатывает для команд, которые не были зарегистрированы при помощи mp.events.addCommand.



Пример 3 - Отслеживание ошибочных команд

JavaScript:
mp.events.add('playerCommand', (player, command) => {      
    player.outputChatBox(`${command} не правильная команда. Введите /help для помощи.`);
});



Пример 4 - Команда /hello
Команда просто выводит в чат игроку фразу "Привет!"

JavaScript:
mp.events.add("playerCommand", (player, command) => {
    const args = command.split(/[ ]+/); // получаем список аргументов команды
    const commandName = args.splice(0, 1)[0]; // получаем название команды
       
    if (commandName === "hello") {
        player.outputChatBox("Привет!");
    }
});
 

Lev Angel

Developer
Команда форума
Скриптер
Примечание: название команды чувствительно к регистру. Т. е. если мы объявим команду mp.events.addCommand("Hello", handlerFunction);, то будет работать именно команда /Hello, а команда /hello не сработает. Если нужно чтобы работали оба варианта, то вероятно нужно объявить команду два раза с одинаковым обработчиком.
 

LimoN

Trainee
Каким образом можно передавать команде в качестве параметра несколько слов?

Допустим для примера, что я хочу отправить игроку с указанным id сообщение:

JavaScript:
mp.events.addCommand("pm", (player, target, text) => {
    let p = mp.players.at(target);
    player.outputChatBox(`Вы отправили сообщение ${p.name}`);
    p.outputChatBox(`Сообщение от ${player.name}: ${text}`);
});

Однако, при попытке отправить игроку текст "Привет друг", отправится только "Привет", а дальнейшие символы будут проигнорированы. Как можно исправить подобное?
 

seaniwe

Senior Developer
Скриптер
Каким образом можно передавать команде в качестве параметра несколько слов?

Допустим для примера, что я хочу отправить игроку с указанным id сообщение:

JavaScript:
mp.events.addCommand("pm", (player, target, text) => {
    let p = mp.players.at(target);
    player.outputChatBox(`Вы отправили сообщение ${p.name}`);
    p.outputChatBox(`Сообщение от ${player.name}: ${text}`);
});

Однако, при попытке отправить игроку текст "Привет друг", отправится только "Привет", а дальнейшие символы будут проигнорированы. Как можно исправить подобное?
mp.events.addCommand("pm", (player, _, target, text) => { let p = mp.players.at(target); player.outputChatBox(`Вы отправили сообщение ${p.name}`); p.outputChatBox(`Сообщение от ${player.name}: ${text}`); }); так должно работать
 
Примечание: название команды чувствительно к регистру. Т. е. если мы объявим команду mp.events.addCommand("Hello", handlerFunction);, то будет работать именно команда /Hello, а команда /hello не сработает. Если нужно чтобы работали оба варианта, то вероятно нужно объявить команду два раза с одинаковым обработчиком.
А тема с использованием перевода в один регистр не работает?

Я-то проверил, /hello или /Hello работают. А Вы что скажите?

JavaScript:
mp.events.add("playerCommand", (player, command) => {
    const args = command.split(/[ ]+/); // получаем список аргументов команды
    const commandName = args.splice(0, 1)[0]; // получаем название команды
      
    if (commandName.toLowerCase() === "hello".toLowerCase()) {
        player.outputChatBox("Привет!");
    }
});
 

Lev Angel

Developer
Команда форума
Скриптер
Сработает.
Кстате в "hello".toLowerCase() тебе не нужно делать toLowerCase. Там ведь и так уже задана строка в нижнем регистре ;)
 
Сработает.
Кстате в "hello".toLowerCase() тебе не нужно делать toLowerCase. Там ведь и так уже задана строка в нижнем регистре ;)
Возможно это для последователей)
Которым будет приятнее читать команды в таком формате: /MyBestCommand

Да ладно, чего оправдываться, увлекся х)
 

Lev Angel

Developer
Команда форума
Скриптер
Но для addCommand так не получится. Можно сделать как-то так:
JavaScript:
mp.events.addCommand("Hello", commandHello);
mp.events.addCommand("hello", commandHello);
mp.events.addCommand("hi", commandHello);

function commandHello(player){
    // код команды
}
 
Но для addCommand так не получится. Можно сделать как-то так:
JavaScript:
mp.events.addCommand("Hello", commandHello);
mp.events.addCommand("hello", commandHello);
mp.events.addCommand("hi", commandHello);

function commandHello(player){
    // код команды
}
А что если описать один раз:
Код:
mp.events.addCommand("hello", commandHello);
, а затем в события команд переводить в low-case?

Пока не проверял, просто в голову влетело
 
Но для addCommand так не получится. Можно сделать как-то так:
JavaScript:
mp.events.addCommand("Hello", commandHello);
mp.events.addCommand("hello", commandHello);
mp.events.addCommand("hi", commandHello);

function commandHello(player){
    // код команды
}
Так... я сейчас так долго тупил, а затем вспомнил. На серверах обычно собственный чат стоит, верно? Тогда туда .toLowCase() вставить проблемы нет совсем!

А вот со стандартным чатом я не нашел решения, эх

JavaScript:
// Use: fixAddCommand([ 'firstName', 'secondName', ... ], function)
function fixAddCommand( commandNames, func ) {
//  for ( let index = 0 ; index < names.length ; ++index )
//      mp.events.addCommand( names[ index ], func );

    commandNames.forEach(( command ) => {
        mp.events.addCommand( command, func );
    });
}

// For example:
fixAddCommand([ 'hello', 'hi' ], ( player ) => { player.outputChatBox( "Привет!" ); });
fixAddCommand([ 'bye' ], ( player ) => { player.outputChatBox( "Пока!" ); });
mp.events.addCommand( 'salut', ( player ) => { player.outputChatBox( "Salut!" ); });

Сейчас вставлю регистронезависимый поиск. Хотя, как выше описал, от него толку ноль, если у всех чат создан с 0
 

Lev Angel

Developer
Команда форума
Скриптер
Ну да, можно в свою обертку завернуть addCommand и тут уже реализовать что угодно: регистро независимые команды, псевдонимы, дополнительные проверки и т. д.
Выглядит красиво (y) Только название fixAddCommand не очень информативно.
 
Ну да, можно в свою обертку завернуть addCommand и тут уже реализовать что угодно: регистро независимые команды, псевдонимы, дополнительные проверки и т. д.
Выглядит красиво (y) Только название fixAddCommand не очень информативно.
JavaScript:
// https://www.cyberforum.ru/javascript/thread2695454.html#post14822836
function getArrayRegisterVariants(str) {
    return new Array(2 ** str.length).fill(0).map((_, i) =>
      [...i.toString(2).padStart(str.length, '0')].reduce((variant, el, i) =>
        variant + (str[i] || '')[!+el ? 'toLowerCase' : 'toUpperCase'](), ''));
}

function fixAddCommand( commandNames, func ) {
    commandNames.forEach(( commandName ) => {
        getArrayRegisterVariants( commandName ).forEach(( variant ) => {
             mp.events.addCommand( variant, func );
        });
    });
}

//  For example:
// fixAddCommand([ 'hello', 'hi' ], ( player ) => { player.outputChatBox( "Hello!" ); });
// fixAddCommand([ 'bye' ], ( player ) => { player.outputChatBox( "Bye!" ); });

Я тут на несколько часов убежал с девушкой общаться xD
В общем, я так решил проблему со СТАНДАРТНЫМ чатом... Перебором всех вариантов, работает)

Вот только хз куда это девать. Отдельным скриптом на форум отправить или в мануал? - Но это не мануал, да и само по себе бесполезно)
 

Lev Angel

Developer
Команда форума
Скриптер
Хз, мне кажется это уже будет слишком :LOL: Вряд ли кто-то будет упарываться и писать /heLlo или /hEllO
 

streetmeat

Trainee
это всё классно полезно, но как изменить цвет текста той же отыгровки, допустим? :^)
 
Яндекс.Метрика
Верх