PDA

Просмотр полной версии : [Урок] Как создать команду



TrezeLurese
30.08.2014, 18:19
Приветствую всех. Сегодня мы подробно узнаем о процессе создания команды на МТА Lua. В этом нам поможет функция addCommandHandler (https://wiki.multitheftauto.com/wiki/AddCommandHandler).

И так. Давайте разберём, какие же аргументы присутствуют в данной функции?
Вот так выглядит функция для стороны сервера.

bool addCommandHandler(string commandName, function handlerFunction, [bool restricted = false, bool caseSensitive = true])
- commandName - Комманда, вводимая в чат или консоль. Она пишется без символа "/". Например "showdialog". В чате её можно вызвать как "/showdialog", а в консоли просто "showdialog".
- handlerFunction - функция, которая будет выпоняться при вводе данной команды
Опционально можнно ввести следующие аргументы:
- restricted - Доступность функции для какого-либо типа ACL. Например есть нужно добавить функцию для администратора, данный аргумент должен быть равен true, а в файле acl.xml название команды должно быть вписано в группу Admin. Можно конечно обойтись и проверкой на группу ACL (Подробнее тут (http://pro-pawn.ru/showthread.php?10085-%D0%92%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2-%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3-%D0%9C%D0%A2%D0%90-Lua)), но это только для стороны сервера.
- caseSensitive - Игнорирование регистра ввода команды. Например у вас стоит первый аргумент "showdialog", и если данный аргумент равен true, то вы можете ввестив чат\консоль команду "ShoWdIalOG", команда вс равно будет определена как "showdialog"

На стороне клиента отсутствует третий аргумент.

bool addCommandHandler(string commandName, function handlerFunction, [bool caseSensitive = true])
Аргументы остаются те же.


Вроде первый и 2 последних аргумента понятны, но что делать с функцией, как она используется, какие у неё аргументы?
Даайте разберёмся с этим.
Вот аргументы функции для стороны сервера:

player playerSource, string commandName, [string arg1, string arg2, ...]
- playerSource - Элемент, который вызывает команду, и для кого она выполняется. Лучше написать тут source.
- commandName - Команда, которую должен вводить пользователь. Если использовать для одной команды, можно оставить "_", иначе ставить собственный аргумент, и делать проверку на команду.
- arg1, arg2, ... - Аргументы команды. Например если нужно написать "/showdialog tetris", то "tetris" это arg1, но этих аргументов может быть множество.

На стороне клиента отстутствует аргумент playerSource

string commandName, [string arg1, string arg2, ...]
Но аргументы остаются те же.

С функцией разобрались. Давайте закрепим пройденный материал, создав команды, одна из которых переместит пользователя в центр, вторая будет пустой командой, а третья будет расчитана по названию команды.

Начнём с пустой команды на стороне сервера

addCommandHandler("teletocenter", --Создадим команду "teletocenter", котоорая телепортирует игрока в центр карты.
function(source) --Мы можем не задавать второй и следующие аргументы, так как обязательный CommandName установлен по стандарту. CommandName в данном случае равна "teletocenter"
setElementPosition(source, 0, 0, 0) -- Так как source установлен в аргументе, то при вводе команды "teletocenter", вас перенесёт в центр карты.
end, false, false) --Функция закончилась словом "end", следовательно можно продолжать необязательными аргументами. В данном случае не получится ввести "teLeTOCenter", так как четвёртый аргумент отрицает выполнение данного действия.

Создадим такую-же команду, так-же на сервере, только уже более красивей выглядящую

function setPosition(source) --Создадим функцию setPosition, где первый аргумент будет пользователь,
setElementPosition(source, 0, 0, 0) --И которая будет устанавливать нулевые позиции любому, кто вызовет эту команду
end
addCommandHandler("teletocenter", setPosition, false, false) --Тоже самое, только второй аргумент функции addCommandHandler мы вынесли в полноценную функцию

Мы можем в данном случае записать как


addCommandHandler("teletocenter", setPosition, false) -- убрав 4й аргумент
--Или
addCommandHandler("teletocenter", setPosition) -- убрав 3й и 4й аргументы
--Или
addCommandHandler("teletocenter", setPosition, _, false) -- убрав 3й аргумент



Теперь создадим функцию с аргументом на сервере.

addCommandHandler("printnum", --Создадим команду "printnum", которая будет писать в чат заданное в аргументе число
function(_, _, num) --Так как мы используем в команде дополнительное значение, второй аргумент обязательно напишем, так как он обозначает введённую команду, а первый можем обозначить как "_", так как игрок в данной команде не будет использоваться
if not num or not tonumber(num) then num = 1 end --Проверим, введён ли аргумент, и можно ли его считать номером. Если аргумент не введён или он не номер, то аргументу присваиваем значение единицы
outputChatBox(num) --Отправляем в чат сообщение с номером
end) --Закрываем функцию, но так как аргументы не обязательны, можем их не писать


А теперь создадим функцию с проверкой на команду на стороне клиента

function commandRead(cmd) --Создаём функцию на проверку команды, так как на клиенте, первый аргумент не элемент, а команда
if cmd == "command" then print("Command") --Если введёная команда равна "command", то принтим "Command"
elseif cmd == "cmd" then print("cmd, not command") end -- А если команда равна "cmd" то принтим "cmd, not command"
end --Закрываем функцию

addCommandHandler("command", commandRead) --Добавляем команду "command", и при её выполнении будет отправлено "Command", так как проверяется в функции аргумент команды
addCommandHandler("cmd", commandRead) --Таже самая функция, но будет отправлено "cmd, not command", так как такая-же проверка, но аргумент команды будет другой
addCommandHandler("texter", commandRead) -- Ничего не произойдёт, так как в функции нет проверки на данную команду.


Думаю на этом урок закончить. Удачи в разработках, и спасибо за внимание.

Disinterpreter
31.08.2014, 11:12
Еще екземпл
Exmpl:


addCommandHandler( "tpxyz",
function( pPlayer, sCmd, x, y, z )
setElementPosition( pPlayer, tonumber(x), tonumber(y), tonumber(z) )
end
)

TrezeLurese
31.08.2014, 13:27
Отредактировал, привёл в более лучший вид, исправил некоторые ошибки