Plugin – Pawn.CMD – самый быстрый и функциональный командный процессор | Страница 2 | Pawno-Info.Ru – Портал о программировании №1

Plugin – pawn.cmd – самый быстрый и функциональный командный процессор

В любом случае не вижу смысла переходить на данный командный процессор.
Он совсем новый и возможно в нем есть некие неуязвимости и т.д.

DC_CMD проверен уже немалым количеством времени, да и смысл переходить, когда разница в доли секунд не будет особо ощущатся при игре даже 500-ста игроков.

———- Сообщение добавлено в 11:03 ———- Предыдущее сообщение добавлено в 10:59 ———-

p.s Таблица тестов действительно странная. С каких пор ZCMD быстрее DC_CMD. Про MCMD покуда спорить не хочу, с даным командным процесором я еще не сталкивался.

Моды для сервера

Огромный выбор различных модификаций для Вашего сервера. пролистайте эти темы! Возможно именно там Вы найдете то, что искали уже давно.

Софт – [plugin] pawn.cmd – самый быстрый и функциональный командный процессор.

Pawn.CMD 3.0​


Описание:

Pawn.CMD – новый командный процессор, который работает через плагин.

Плагин совместим с любой версией SA:MP, несмотря на работу с памятью.

Natives:

Callbacks:

Установка:

Распакуйте “pawncmd.zip” в папку вашего сервера. Отредактируйте”server.cfg”:

– Windows

– Linux

Пример команды:

Регистрация альтернативных названий (псевдонимов):

Использование флагов:

Полный пример:

#include <Pawn.CMD>

#define ADMIN_CMD   1
#define VIP_CMD     2
#define USER_CMD    4

flags:ban(ADMIN_CMD);
cmd:ban(playerid, params[])
{
	// код
	return 1;
}
alias:ban("block");

public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
	if ((flags & ADMIN_CMD) && !pAdmin[playerid])
		return 0;

	return 1;
}

public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
	if(result == -1)
	{
		SendClientMessage(playerid, 0xFFFFFFFF, "SERVER: Unknown command.");
		return 0;
	}

	return 1;
}

Если вы хотите использовать Pawn.CMD в filterscript, вставьте этот define перед include:

Pawn.CMD.inc должен быть подключен после остальных include!

Changelog:
1.0:
– Первый релиз.
2.0:
– Теперь плагин полностью совместим с синтаксисом zcmd.
2.1:
– Были исправлены баги.
3.0:
– Добавлен макрос “callcmd” для вызова команды. Пример: callcmd::ban(playerid, “42”);
– Добавлены нативы: PC_SetFlags, PC_GetFlags, PC_EmulateCommand, PC_RenameCommand, PC_DeleteCommand.
– Добавлен макрос “isnull” для проверки параметров команды.
– Удалена запись в консоль о регистрации команды.
– “cmdtext” был разделен на “cmd” и “params”.
– Потеряна совместимость с синтаксисом zcmd.

Download binaries:
https://github.com/urShadow/Pawn.CMD/releases

Source code:
https://github.com/urShadow/Pawn.CMD

Source code of the benchmark:
https://gist.github.com/urShadow/14da06af69232657e017088cf2f23cbe

§

Pawn.CMD 3.0​


Описание:

Pawn.CMD – новый командный процессор, который работает через плагин.

Плагин совместим с любой версией SA:MP, несмотря на работу с памятью.

Natives:

Callbacks:

Установка:

Распакуйте “pawncmd.zip” в папку вашего сервера. Отредактируйте”server.cfg”:

– Windows

– Linux

Пример команды:

Регистрация альтернативных названий (псевдонимов):

Использование флагов:

Полный пример:

#include <Pawn.CMD>

#define ADMIN_CMD   1
#define VIP_CMD     2
#define USER_CMD    4

flags:ban(ADMIN_CMD);
cmd:ban(playerid, params[])
{
	// код
	return 1;
}
alias:ban("block");

public OnPlayerCommandReceived(playerid, cmd[], params[], flags)
{
	if ((flags & ADMIN_CMD) && !pAdmin[playerid])
		return 0;

	return 1;
}

public OnPlayerCommandPerformed(playerid, cmd[], params[], result, flags)
{
	if(result == -1)
	{
		SendClientMessage(playerid, 0xFFFFFFFF, "SERVER: Unknown command.");
		return 0;
	}

	return 1;
}

Если вы хотите использовать Pawn.CMD в filterscript, вставьте этот define перед include:

Pawn.CMD.inc должен быть подключен после остальных include!

Changelog:
1.0:
– Первый релиз.
2.0:
– Теперь плагин полностью совместим с синтаксисом zcmd.
2.1:
– Были исправлены баги.
3.0:
– Добавлен макрос “callcmd” для вызова команды. Пример: callcmd::ban(playerid, “42”);
– Добавлены нативы: PC_SetFlags, PC_GetFlags, PC_EmulateCommand, PC_RenameCommand, PC_DeleteCommand.
– Добавлен макрос “isnull” для проверки параметров команды.
– Удалена запись в консоль о регистрации команды.
– “cmdtext” был разделен на “cmd” и “params”.
– Потеряна совместимость с синтаксисом zcmd.

Download binaries:
https://github.com/urShadow/Pawn.CMD/releases

Source code:
https://github.com/urShadow/Pawn.CMD

Source code of the benchmark:
https://gist.github.com/urShadow/14da06af69232657e017088cf2f23cbe

Урок – для новичков №1: dc_cmd | sscanf2

Команды DC_CMD Sscanf2​

[HR][/HR]

Команды в SA:MP существуют для того, чтобы можно было взаимодействовать с сервером.
Покупать оружее и т.п

[HR][/HR]

Пример обработки команд стандартным способом:​

Данный код при вводе команд /command и /command1 выводит соответствующие сообщения. При этом, если нужно будет сделать обработку параметров команд (например, получить число 4 из строки “/cmd1 4”), такой код придётся усложнить, в 2-3 раза.

Но есть другой способ обработки команд: командный процессор DC_CMD

:/>  Ремонт светодиодных LED ламп, электрические схемы
[HR][/HR]

Пример создания команд для DC_CMD:​

[HR][/HR]

Преимущества DC_CMD:​

  • Более простой синтаксис команд.
  • Команды можно расположить в любом участке скрипта (не только в OnPlayerCommandText).
  • Не требуется вручную отделять параметры команд (уже отделённые параметры передаются в команду в строке params).
  • Проще в освоении.
  • Работает в разы быстрее других обработчиков, создавая меньшую нагрузку на сервер.

Теперь перейдём к обработке параметров.

Допустим, у нас есть команда “/ban”, которая банит на сервере игрока с указанным ID (пример: “/ban 65”).

Однако, кроме самой команды, потребуется ещё и обработать ID указанного игрока, а именно – извлечь этот ID из строки params (именно в ней обработчик DC_CMD передаёт параметры).

Стандартным способом это делается с помощью функции strval, которая преобразует содержимое строки в число:


new target = strval(params);

Но в данном способе есть много минусов

Чтобы избежать этих ошибок, придётся сделать дополнительные проверки на пустоту и подсчёт количества параметров (сосчитать все пробелы в строке и прибавить 1). Такая задача может оказаться слишком трудной для начинающих скриптеров.

Однако, есть иное решение: плагин sscanf2.

Использование:

– строка, из которой считываются нужные значения

– строка, в которой указывается, какого типа данные должны быть считаны из исходной строки (пример: “ds[40]”)

  • d, i – целое число
  • f – вещественное число (Float)
  • u – игрок (ID или часть имени)
  • s[размер] – строка с указанной макс. длиной

– переменные, в которые будут записаны значения, полученные из исходной строки

[HR][/HR]

Для получения ID игрока в команде /ban плагин sscanf2 можно использовать следующим образом​

В результате в переменной target будет получен ID игрока, которого нужно забанить.

[HR][/HR]

Но что делать, если ID всё же не был введён игроком?
Здесь всё тоже предусмотрено: функция sscanf возвращает 1 в случае ошибки и 0 в случае успеха. Таким образом, проверку на неправильный ввод можно записать в виде ветвления if

Если функция sscanf не сможет правильно считать параметры, она вернёт 1 (при этом в условиях всем ненулевым числам соответствует значение true), условие выполнится, игроку будет выведена подсказка о правильном использовании и команда прервёт свою работу.

[HR][/HR]

Теперь, когда ID игрока получен и все случаи неправильного ввода обработаны, можно доделать оставшуюся часть команды:​

[HR][/HR]

Сделаем тестовую команду выдачу уровня:​

Это команда отвечает за выдачу уровня определенного игрока.

И как вы успели заметить, тут мы используем 2 параметра это

  • target – Сюда записываем id игрока.
  • level – Записываем LVL который хотим дать игроку.

Разберем

по подробнее.

  • SetPlayerScore – Функция отвечающая за число находящийся в TAB листе.
  • targetid – переменная в которую мы записали ID игрока.
  • GetPlayerScore(target) – Функция отвечающая за получения текущего числа в TAB листе.
  • level – Так как мы уже получили текущее число которое уже есть и приплюсовываем к этому числу которое уже есть, ту переменную в которую записали число(Уровень).

[HR][/HR]

Давайте создадим еще одну тестовую команду, но уже будем записывать не число а текст вывода определенному игроку:​

PHP:

CMD:sms(playerid, params[])
{
     new target, text, sendername[MAX_PLAYER_NAME], str_[28-4 MAX_PLAYER_NAME 120];
     if(sscanf(params, "us[145]", target, text))
                 return SendClientMessage(playerid, 0xFFFFFFFF, "Используйте: /sms [ID игрока/часть имени] [Text]");

     GetPlayerName(playerid, sendername, sizeof(sendername));
     format(str_ , sizeof(str_), "Игрок %s отправил вам текст: %s", sendername, text);
     SendClientMessage(target, 0xFFFFFFFF, str_);
     return 1;
}

Тут вы уже видите серьезную команду с записью имя игрока, текста, форматирования, много переменных, и уже наверное напугались

Но на самом деле не чего тут страшного нет, и самые обычные функции.

Разберем первую строку

по подробнее.

  • target – записываем id игрока.
  • text – записываем текст.
  • sendername[MAX_PLAYER_NAME] – в нее будет записываться имя игрока.
  • MAX_PLAYER_NAME – это макрос который определяет размер ячеек директивой #define по дефолту в a_samp.inc она имеет значение 24.
  • А 24 это максимальное длина имени, можно написать за место MAX_PLAYER_NAME просто 24 разницы не будет.
  • str_[28-4 MAX_PLAYER_NAME 120] – сюда как раз и будет записываться отформатированный текст.
:/>  Как заархивировать папку с файлами в ZIP на компьютере с Windows 10, 7

  • 28-4 MAX_PLAYER_NAME 120 – Это размер ячеек сколько можно будет поместить в эту переменную символов.
  • Я сделал точный подсчет всего символов 28 не считая %s два раза. Именно поэтому я отнимаю 4 ибо % – 1 s – 2. и еще раз % – 1 s – 2.
  • MAX_PLAYER_NAME – Ну думаю понятно максимальное длина имени.
  • 120 – это и есть текст который будет передаваться в функцию SendClientMessage по дефолту в чат максимальная длина 144 нуль символ 145.

Теперь расскажу подробнее про эту

  • u – ид игрока
  • s[145] – сам текст и 145 ячеек.Так как всего максимальная длина 144 в чате нуль символ 1 получается 145.

Получения имени игрока:

[HR][/HR]

Теперь про форматирования, это будет отдельный урок, расскажу кратко.

Ну и здесь мы уже выводим отформатированный текст игроку.

Всем спасибо это был урок для новичков #1.​

Урок #2 – Временно не доступен​

§

Команды DC_CMD Sscanf2​

[HR][/HR]

Команды в SA:MP существуют для того, чтобы можно было взаимодействовать с сервером.
Покупать оружее и т.п

[HR][/HR]

Пример обработки команд стандартным способом:​

Данный код при вводе команд /command и /command1 выводит соответствующие сообщения. При этом, если нужно будет сделать обработку параметров команд (например, получить число 4 из строки “/cmd1 4”), такой код придётся усложнить, в 2-3 раза.

Но есть другой способ обработки команд: командный процессор DC_CMD

[HR][/HR]

Пример создания команд для DC_CMD:​

[HR][/HR]

Преимущества DC_CMD:​

  • Более простой синтаксис команд.
  • Команды можно расположить в любом участке скрипта (не только в OnPlayerCommandText).
  • Не требуется вручную отделять параметры команд (уже отделённые параметры передаются в команду в строке params).
  • Проще в освоении.
  • Работает в разы быстрее других обработчиков, создавая меньшую нагрузку на сервер.

Теперь перейдём к обработке параметров.

Допустим, у нас есть команда “/ban”, которая банит на сервере игрока с указанным ID (пример: “/ban 65”).

Однако, кроме самой команды, потребуется ещё и обработать ID указанного игрока, а именно – извлечь этот ID из строки params (именно в ней обработчик DC_CMD передаёт параметры).

Стандартным способом это делается с помощью функции strval, которая преобразует содержимое строки в число:


new target = strval(params);

Но в данном способе есть много минусов

Чтобы избежать этих ошибок, придётся сделать дополнительные проверки на пустоту и подсчёт количества параметров (сосчитать все пробелы в строке и прибавить 1). Такая задача может оказаться слишком трудной для начинающих скриптеров.

Однако, есть иное решение: плагин sscanf2.

Использование:

– строка, из которой считываются нужные значения

– строка, в которой указывается, какого типа данные должны быть считаны из исходной строки (пример: “ds[40]”)

  • d, i – целое число
  • f – вещественное число (Float)
  • u – игрок (ID или часть имени)
  • s[размер] – строка с указанной макс. длиной

– переменные, в которые будут записаны значения, полученные из исходной строки

[HR][/HR]

Для получения ID игрока в команде /ban плагин sscanf2 можно использовать следующим образом​

В результате в переменной target будет получен ID игрока, которого нужно забанить.

[HR][/HR]

Но что делать, если ID всё же не был введён игроком?
Здесь всё тоже предусмотрено: функция sscanf возвращает 1 в случае ошибки и 0 в случае успеха. Таким образом, проверку на неправильный ввод можно записать в виде ветвления if

Если функция sscanf не сможет правильно считать параметры, она вернёт 1 (при этом в условиях всем ненулевым числам соответствует значение true), условие выполнится, игроку будет выведена подсказка о правильном использовании и команда прервёт свою работу.

[HR][/HR]

Теперь, когда ID игрока получен и все случаи неправильного ввода обработаны, можно доделать оставшуюся часть команды:​

[HR][/HR]

Сделаем тестовую команду выдачу уровня:​

:/>  Нет доступа к интернету через W-Fi роутер: как исправить и что делать

Это команда отвечает за выдачу уровня определенного игрока.

И как вы успели заметить, тут мы используем 2 параметра это

  • target – Сюда записываем id игрока.
  • level – Записываем LVL который хотим дать игроку.

Разберем

по подробнее.

  • SetPlayerScore – Функция отвечающая за число находящийся в TAB листе.
  • targetid – переменная в которую мы записали ID игрока.
  • GetPlayerScore(target) – Функция отвечающая за получения текущего числа в TAB листе.
  • level – Так как мы уже получили текущее число которое уже есть и приплюсовываем к этому числу которое уже есть, ту переменную в которую записали число(Уровень).

[HR][/HR]

Давайте создадим еще одну тестовую команду, но уже будем записывать не число а текст вывода определенному игроку:​

PHP:

CMD:sms(playerid, params[])
{
     new target, text, sendername[MAX_PLAYER_NAME], str_[28-4 MAX_PLAYER_NAME 120];
     if(sscanf(params, "us[145]", target, text))
                 return SendClientMessage(playerid, 0xFFFFFFFF, "Используйте: /sms [ID игрока/часть имени] [Text]");

     GetPlayerName(playerid, sendername, sizeof(sendername));
     format(str_ , sizeof(str_), "Игрок %s отправил вам текст: %s", sendername, text);
     SendClientMessage(target, 0xFFFFFFFF, str_);
     return 1;
}

Тут вы уже видите серьезную команду с записью имя игрока, текста, форматирования, много переменных, и уже наверное напугались

Но на самом деле не чего тут страшного нет, и самые обычные функции.

Разберем первую строку

по подробнее.

  • target – записываем id игрока.
  • text – записываем текст.
  • sendername[MAX_PLAYER_NAME] – в нее будет записываться имя игрока.
  • MAX_PLAYER_NAME – это макрос который определяет размер ячеек директивой #define по дефолту в a_samp.inc она имеет значение 24.
  • А 24 это максимальное длина имени, можно написать за место MAX_PLAYER_NAME просто 24 разницы не будет.
  • str_[28-4 MAX_PLAYER_NAME 120] – сюда как раз и будет записываться отформатированный текст.

  • 28-4 MAX_PLAYER_NAME 120 – Это размер ячеек сколько можно будет поместить в эту переменную символов.
  • Я сделал точный подсчет всего символов 28 не считая %s два раза. Именно поэтому я отнимаю 4 ибо % – 1 s – 2. и еще раз % – 1 s – 2.
  • MAX_PLAYER_NAME – Ну думаю понятно максимальное длина имени.
  • 120 – это и есть текст который будет передаваться в функцию SendClientMessage по дефолту в чат максимальная длина 144 нуль символ 145.

Теперь расскажу подробнее про эту

  • u – ид игрока
  • s[145] – сам текст и 145 ячеек.Так как всего максимальная длина 144 в чате нуль символ 1 получается 145.

Получения имени игрока:

[HR][/HR]

Теперь про форматирования, это будет отдельный урок, расскажу кратко.

Ну и здесь мы уже выводим отформатированный текст игроку.

Всем спасибо это был урок для новичков #1.​

Урок #2 – Временно не доступен​

Урок – команды (dc_cmd sscanf2)

Однако, кроме самой команды, потребуется ещё и обработать ID указанного игрока, а именно – извлечь этот ID из строки params (именно в ней обработчик DC_CMD передаёт параметры).
Стандартным способом это делается с помощью функции strval, которая преобразует содержимое строки в число:

Но в данном способе есть много минусов:
* Если игрок ничего не ввёл, строка params будет пустой и функция strval вернёт 0, из-за чего можно нечаянно забанить игрока ID 0 (а если под ID 0 находитесь вы – забаните сами себя).
* Для обработки более чем 1 параметра, извлечения ID игроков и т.п. приходится вставлять в скрипт и много раз использовать пользовательские функции strtok, IsNumeric, ReturnUser и т.д.
Чтобы избежать этих ошибок, придётся сделать дополнительные проверки на пустоту и подсчёт количества параметров (сосчитать все пробелы в строке и прибавить 1). Такая задача может оказаться слишком трудной для начинающих скриптеров.
Однако, есть иное решение: плагин sscanf2.
Использование:​

Оставьте комментарий