Здравствуйте, при разработке нашего проекта команда столкнулась с вопросом удобной регистрации административных команд по одному шаблону, а так же использования их в консоли сервера.
По истечении некоторого времени была разработана система, и мы решили поделиться ей для нуждающихся в подобном. Работа не претендует на звание революционной технологии, но надеюсь вы оцените её по существу.
Так же прошу заметить, что для интеграции данной системы вам в обязательном порядке необходимо будет переопределить получение "Административного уровня" игрока, или же удалить проверку и вывод предупреждения об ограничении использования команды.
Для работы необходимо подключение npm i readline
Выше представленный код является обработчиком ввода команд в игровой чат (команды сопровождаются открывающим символом "!") или же консоль сервера (команды вводятся без "!")
Если у вызываемой команды ожидаются аргументы, но сервер не получил их, или был введен знак "?" как аргумент команды, то пользователю в чат ( консоль сервера) выведется описание для данной команды.
Ниже приведен код заполнения команд.
В нем создается глобальный объект, в котором будут хранится объекты всех зарегистрированных команд и с помощью функции addCommandToList() он заполняется. Прошу заметить что приведенные в пример команды, где указывается ID игрока, всегда будут возвращать ошибку, так как mp.players.FindByID() является нашей функцией, следовательно поиск цели остается на вашей реализации.
В будущем будет добавлен вывод списка команд в CEF и удобное использование их как отдельных кнопок.
Спасибо за внимание!
По истечении некоторого времени была разработана система, и мы решили поделиться ей для нуждающихся в подобном. Работа не претендует на звание революционной технологии, но надеюсь вы оцените её по существу.
Так же прошу заметить, что для интеграции данной системы вам в обязательном порядке необходимо будет переопределить получение "Административного уровня" игрока, или же удалить проверку и вывод предупреждения об ограничении использования команды.
Для работы необходимо подключение npm i readline
JavaScript:
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (input) => {
for (com in commandsList) {
let args = input.split(" ");
if (args[0] == com && commandsList[com].console) {
args = args.slice(1);
if ((commandsList[com].args && args.length == 0) || args[0] == "?")
return console.log(commandsList[com].desc);
commandsList[com].func("console", args);
}
}
});
mp.events.add("playerChat", (player, input) => {
if (input.charAt(0) == "!") {
input = input.substr(1);
for (com in commandsList) {
let args = input.split(" ");
if (args[0] == com) {
if (player.getAdminlvl() < commandsList[com].adminLvl)
return player.outputChatBox(
`Для использование данной команды, вы должны быть администратором ${commandsList[com].adminLvl} уровня!`
);
args = args.slice(1);
if ((commandsList[com].args && args.length == 0) || args[0] == "?")
return player.outputChatBox(commandsList[com].desc);
commandsList[com].func(player, args);
}
}
}
});
Выше представленный код является обработчиком ввода команд в игровой чат (команды сопровождаются открывающим символом "!") или же консоль сервера (команды вводятся без "!")
Если у вызываемой команды ожидаются аргументы, но сервер не получил их, или был введен знак "?" как аргумент команды, то пользователю в чат ( консоль сервера) выведется описание для данной команды.
Ниже приведен код заполнения команд.
JavaScript:
global.commandsList = {};
global.addCommandToList = function (name, desc, args, cons, adminLvl, func) {
commandsList[name] = {
// Название команды
desc: desc, // Описание команды [string]
args: args, // Передаются ли команде аргументы [true/false]
console: cons, // Можно ли вызвать команду из консоли [true/false]
adminLvl: adminLvl, // Необходимый уровень администратора для вызова команды [int]
func: func, // Функция при вызове команды [func(args)]
};
};
////////////////////////////////// Инвиз ///////////////////////////////////////////
addCommandToList(
"invize",
"Команда: !invize\nОписание: Режим невидимости.",
false,
false,
1,
function (player) {
if (player.alpha == 255) {
player.alpha = 0;
} else {
player.alpha = 255;
}
}
);
/////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// Выставить здоровье ///////////////////////////////
addCommandToList(
"sethp",
"Команда: !sethp [ID] [Кол-во здоровья]\nОписание: Установить количество здоровья игроку.",
true,
true,
1,
function (player, data) {
let cons = (player == "console" && true) || false;
let id = parseInt(data[0]);
let hp = parseInt(data[1]);
let target = mp.players.FindByID(id);
if (!target)
return (
(cons && console.log("Игрок с таким id не найден!")) ||
player.outputChatBox("Игрок с таким id не найден!")
);
if (!hp || typeof hp != "number")
return (
(cons && console.log("Введено некоректное значение!")) ||
player.outputChatBox("Введено некоректное значение!")
);
target.health = hp;
}
);
/////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////// Выгнать игрока ///////////////////////////////////
addCommandToList(
"kick",
"Команда: !kick [ID] [Причина]\nОписание: Выгоняет игрока с сервера.",
true,
true,
1,
function (player, data) {
let cons = (player == "console" && true) || false;
let id = parseInt(data[0]);
let reason = data.slice(1).join(" ");
let target = mp.players.FindByID(id);
if (!target)
return (
(cons && console.log("Игрок с таким id не найден!")) ||
player.outputChatBox("Игрок с таким id не найден!")
);
if (!reason || typeof reason != "string")
return (
(cons && console.log("Указана некорректная причина!")) ||
player.outputChatBox("Указана некорректная причина!")
);
mp.players.broadcast(
`${player.name || "Console"} кикнул ${
target.name
}. Причина: ${reason}`
);
console.log(
`${player.name || "Console"} кикнул ${
target.name
}. Причина: ${reason}`
);
target.kick();
}
);
/////////////////////////////////////////////////////////////////////////////////////
В нем создается глобальный объект, в котором будут хранится объекты всех зарегистрированных команд и с помощью функции addCommandToList() он заполняется. Прошу заметить что приведенные в пример команды, где указывается ID игрока, всегда будут возвращать ошибку, так как mp.players.FindByID() является нашей функцией, следовательно поиск цели остается на вашей реализации.
В будущем будет добавлен вывод списка команд в CEF и удобное использование их как отдельных кнопок.
Спасибо за внимание!