так, извлекаем содержимое архива
AMX Studio в папку scripting нашего AMXX-мода и запускаем AMXX-Studio.
Теперь
необходимо настроить рабочую среду для себя как можно удобнее. Неплохим
вариантом было бы сделать так, чтобы готовые плагины сразу помещались в
папку plugins. Для этого жмём Tools, затем Settings. В появившемся окне
видим слева структурное дерево, в котором выбираем ветвь Compiller
settings. В поле Compiller указываем путь к файлу amxxpc.exe (наш
компилятор), который лежит в папке scripting. В Default Output
Directory вписываем путь к папке plugins нашего AMXX мода. Настройка
завершена, жмём Ок.
Теперь мы можем приступить к написанию
скриптов - будущих плагинов. Язык, используемый для написания
AMX-скриптов, называется Pawn, именно с ним мы и будем работать. Жмём
File , New , Plugin. На экране появляется окно для редактирования с
текстом
/* Plugin generated by AMXXX-Studio */
#include
#include
#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "Admin"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
// Add your code here...
}
Сразу
следует пояснить что всё это значит. Начнём с первой строки - она
ограничена символами /* */ - это символические скобки, в которые можно
записывать комментарии. Комментарии сохраняются только в скрипте, а при
компилировании они просто игнорируются. Следовательно от комментариев
только польза.
Далее мы видим строки
#include
#include
Директивой
#include включается определённый модуль для работы с его объявлениями,
как в С. Все эти модули хранятся в папке scripting/include. При
использовании тех или иных модулей, нужно обязательно учесть, что
получившийся в результате плагин будет требовать от пользователя
включения этих модулей в файле modules.ini, который лежит в папке
configs. Для включения модуля, достаточно раскомментировать
соответствующую ему строку.
Следующие три строчки
#define PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "Admin"
Сообщают
информацию об имени будущего плагина, его версии и авторе в виде
констант. Эти константы в дальнейшем могут использоваться, и далее мы
это видим
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
// Add your code here...
}
Итак,
мы подошли к первой функции нашего скрипта plugin_init(). Вы, возможно,
уже заметили, что все модули, написанные на Pawn, не содержат классов.
В тонкости языка мы углубляться не будем, но лишь отметим, что данный
язык используется для написания высокопроизводительных и
быстродействующих модулей с монолитной структурой. Эти модули затем
компиллируются в бинарные файлы. Тем самым обеспечиваются все
необходимые условия для максимального быстродействия.
Вернёмся к
нашей функции plugin_init(). Эту функцию исполняет сервер при старте,
либо переходе на следующую карту. В теле функции обязательно должна
присутствовать строка
register_plugin(PLUGIN, VERSION, AUTHOR)
которая регистрирует плагин в памяти функцией уже другого модуля register_plugin()
О чём говорит строка // Add your code here..., я думаю догадаться можно легко :).
Итак,
я пояснил некоторые особенности языка скриптинга амх-мода, теперь можно
создать один простой плагин в качестве примера. Этот плагин будет
делать игрока бессмертным, в какой-то степени, а именно будет давать
999999 HP к здоровью.
Начнём. Жмём File, New, Plugin.
Сразу после закрывшейся фигурной скобки функции plugin_init() создаём новую функцию
godme(id,level,cid){
}
id,
level, cid - аргументы функции (параметры), причём эти параметры уже
имеет каждый клиент, поэтому их инициализация в теле функции не
трабуется (инициализация - присвоение начального значения переменной).
Эти аргументы уже имеют свои значения, например человек, подключившийся
к серверу получает на нём номер id, обычно соответствующий номеру
занемаемого им слота (например id = 4), level - уровень привелегий
(например level = ADMIN - уровень привилегий администратора), параметр
cid нам не нужен, поэтому оставим его без внимания. Эти параметры
понадобятся нам для того, чтобы ограничить доступ к функции бессмертия,
предоставив его лишь администраторам сервера.
Используем эти параметры в следующей конструкции:
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
Эта запись читается так: Если игрок не имеет уровень привелегий ADMIN, то прерывание работы плагина и возврат в его начало.
Возврат в начало организуется строкой
return PLUGIN_HANDLED
При этом весь код, расположенный ниже, не выполняется.
Применим эту конструкцию к нашей функции:
public godme(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
}
после строки
return PLUGIN_HANDLED
пишем
код, который будет выполняться в случае, если игрок - админ. А именно
нам необходимо реализовать присвоение 999999 HP. Это делается следующим
образом:
new health[32]
new name[32]
read_argv(1, name, 31)
read_argv(2,health, 31)
new player = cmd_target(id, name, 5)
new hps = str_to_num(health)
set_user_health (player, hps)
return PLUGIN_HANDLED
В результате мы будем иметь готовую функцию, которая присваивает очень много здоровья игроку
public godme(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new health[32]
new name[32]
read_argv(1, name, 31)
read_argv(2,health, 31)
new player = cmd_target(id, name, 5)
new hps = str_to_num(health)
set_user_health (player, hps)
return PLUGIN_HANDLED
}
Теперь нужно пояснить всё написанное.
Начнём
со строки new health[32] - так задаётся строка в С (как массив из
символов, где каждый символ - это его числовой код), имеющая длину 32
символа. Стоит отметить, что символы здесь нумеруются от 0 до 31, а не
от 1 до 32. Следующая строка задаётся также.
Далее функцией
read_argv(pos,output[],len) производим чтение данных при вводе с
консоли, то есть наша функция будет выполняться консольной командой
dodme (user) (health), которую мы позже зарегистрируем, а сейчас нужно
понять лишь то, что в строке read_argv(1, name, 31) функция read_argv
будет читать имя игрока (user) , распологающееся на первой позиции,
которому мы хотим дать много здоровья и заносить его в строку name.
Дале читаем с консоли количество сообщаемого здоровья той же функцией, но уже в строку health и со второй позиции
read_argv(2,health, 31)
смс внутри =)