Итак,
извлекаем содержимое архива
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)
Далее
видим
new player = cmd_target(id, name, 5)
player - это
переменная, число неопределённого типа, компилятор сам подбирает для
него тип, мы лишь задаём значение переменной. А значением для переменной
player будет возвращаемое значение функции cmd_target(id, name, 5).
Эта
функция меет очень важное значение для управления командой. Он
позволяет по отрезку из имени игрока определить его id. Например, если
ник игрока -=~PRO100Otec ~=-, то достаточно будет написать в консоле
godme otec 999999 для того, чтобы этому игроку присвоить много
здоровья.
Id игрока, определённый данным методом помещается в
переменную player.
Далее строка new hps = str_to_num(health) - тут
задаётся новая переменная hps, которая будет содержать количество
здоровья в виде числа (так как при чтении с консоли образуется строка,
то её необходимо перевести в число для использования в функции
set_user_health(player, health). Перевод строки в число производится
функцией str_to_num(str), возвращающим значение строки в виде числа.
Теперь
нам остаётся лишь сделать бессертным нашего избранника функцией
set_user_health
(player, hps)
В конце добавляем return PLUGIN_HANDLED, чтобы
прекратилось выполнение плагина. В нашем случае он и без этой строки
будет исправно работать, но во многих случаях следует использовать
данную конструкцию.
Теперь необходимо зарегистрировать консольную
команду godme, которой мы будем добавлять здоровье. Для этого в конец
тела метода plugin_init() вписываем строку
register_concmd("godme","godme",ADMIN_SLAY,"godme")
название
команды задаётся в кавычках на первой позиции после открытия скобок
(оно не обязательно должно совпадать с именем функции, просто в качестве
простого примера я решил сделать именно так), далее идёт имя функции в
ковычках, а затем уровень привелегий level, по которому и идёт проверка в
теле нашей функции. В нашем случае level = ADMIN_SLAY, тоесть каждый
админ, имеющий в своих правах директиву 'e' (имеется ввиду директива
прав в файле users.ini например "botinok" "12345"
"bcdefghijklmnopqrstuvwxy" "a"), отвещающую за slap и slay команды,
может иметь право делать бессмертным любого другого игрока.
Осталось
лишь подключить используемые модули. Помимо стандартных нужно
подключить ещё 2 дополнительных модуля: fun и AMXXmisc, так как метод
set_user_health() принадлежит модулю fun, а cmd_access() - AMXXmisc. Для
этого запишем в самом верху скрипта
#include
#include
#include
Всё,
скрипт готов, если вы всё делали правильно, то он примет следующий вид:
/*
Plugin generated by AMXXX-Studio */
#include
#include
#include
#define
PLUGIN "New Plug-In"
#define VERSION "1.0"
#define AUTHOR "Admin"
public
plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("godme","godme",ADMIN_SLAY,"godme")
}
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
}
Теперь жмём кнопку Compile,
похожую на зелёный треугольник и наш скрипт превращается в
откомпиллированный готовый плагин и отправляется в папку plugins.
Нам
остаётся лишь зарегистрировать его в файле plugins.ini, добавив туда
строку moi_plugin.amxx