Уроки - Текстовые команды

Для команд создано обратно-вызываемое событие "`OnPlayerCommandText`" с двумя аргументами (`playerid, cmdtext`).

Соответственно, когда игрок вводит какую-либо команду в чат, сервер обращается к этому колбеку и обрабатывает ее. Если прописать несуществующую команду, то ничего не произойдет. Команды бывают разных типов: с дополнительными аргументами или одиночные. Если делать упрощенное объяснение, то команды работают по следующему принципу:

1. Вначале создается функция, которая содержит в себе скрипт команды.
2. В нужном нам колбеке создается команда, которая будет вызывать необходимую функцию.
3. При написании команды, сервер начинает искать ее в колбеке и, если она прописана, обрабатывать ее.

Создадим простую команду отправки сообщения в чат и подключим обратно-вызываемое событие к игровому моду. Открываем файл `new.lua` и спускаемся в самый низ:

```
function OnPlayerCommandText(playerid, cmdtext) -- объявляем колбек.
	if cmdtext == "/текст" then -- открываем блок, делаем проверку на то, какая команда вводится в чат.
		NewCommand(playerid) -- выполняем функцию NewCommand для игрока, что вызывает команду.
	end -- закрываем блок команды.
end

function NewCommand(playerid) -- объявляем функцию для игрока.
	SendPlayerMessage(playerid, 255, 255, 255, "Всем привет, это моя первая команда."); -- функция выполнит отправку сообщения в чат игроку.
end -- закрываем функцию

```

Разберем написанный код по алгоритму:

1. Создаем функцию с любым названием, придерживаясь правила "Вначале буква, потом цифры (если нужно)".
2. В качестве аргумента для функции указываем `playerid` - это позволит применять функцию на игрока.
3. Внутри функции прописываем нужные нам скрипты. В данном случае - отправить сообщение в чат игроку.
4. Закрываем функцию (end).
5. Объявляем колбек `OnPlayerCommandText()`.
6. Внутри колбека создаем новый блок с командой "`/текст`".
7. Блок начинается с оператора `if`, что в переводе "если". Прочитать это можно как: "`if (если) cmdtext(команда) ==(равняется) "/текст" then(то)` ..."
8. Вставляем выполнение нашей функции при вызове команды `/текст` внутри блока.
9. Закрываем блок (end).
10. Закрываем колбек (end).

Теперь создадим более сложную команду, в которой мы сможем указать доп. параметры при написании команды. Для начала перейдем к колбеку и добавим в него две переменные (cmd, params), которые объединим в функцию `GetCommand()`, после чего переделаем первую команду:

```
function OnPlayerCommandText(playerid, cmdtext)

	local cmd, params = GetCommand(cmdtext); -- создаем две переменные и объединяем их в функцию.
    -- данная функция предусмотрена платформой, поэтому отдельно ее создавать не нужно.

	if cmd == "/текст" then -- меняем cmdtext на cmd
		NewCommand(playerid)
	end
end

```

`"local cmd, params = GetCommand(cmdtext)"` нужно для того, чтобы мы могли указывать дополнительные аргументы при вводе команды.

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

```
function OnPlayerCommandText(playerid, cmdtext)

	local cmd, params = GetCommand(cmdtext);

	if cmd == "/текст" then
		NewCommand(playerid)
	end

	if cmd == "/команда" then
		NedCommand\_2(playerid, params)
	end

end

function NedCommand\_2(playerid, params) -- создаем функцию и пишем два аргумента для выполнения. второй аргумент - это доп. условия.

	local result, arg = sscanf(params, "s"); -- создаем требование для ввода дополнительных аргументов при использовании команды.
	-- в данном случае result - это и будет сама вводимая команда, а arg - аргумент, который нужно указать после ввода.
	-- все это объединяется в одну команду с помощью функции sscanf, в которой мы задаем настройку "params" и указываем тип аргумента.
	-- в данном случае написания команды нам нужно указать какой-либо текст, поэтому мы ставим условие в кавычках 's'.

	-- Первый вариант:
	if result == 1 then -- делаем проверку, введена ли команда правильно (с указанием доп. аргумента).
		SendPlayerMessage(playerid, 255, 255, 255, arg); -- отправляем игроку, что вызывал команду, сообщение с указанным им же текстом.
	end -- закрываем блок проверки.

	-- Второй вариант:
	if result == 1 then
		SendPlayerMessage(playerid, 255, 255, 255, arg);
	else -- если команда введена НЕ правильно, что должно произойти. else - это "иначе".
		SendPlayerMessage(playerid, 255, 255, 255, "Команда введена неправильно. Пишите /команда (текст)")
	end

end

```
В качестве типа для доп. аргументов у команды можно указать следующие:

* String (s) - текстовой тип.
* Number (d) - числовой тип.
* Float (f) - дробные числа.

Если указан числовой тип, а игроком написан текст - сервер не обработает команду.

По такому принципу создаются команды для чата. Посмотрим на результат в игре: