offline
Опыт:
24,373
Активность:
|
Scripting Amx Mod X. Часть I
В этой статье я расскажу вам на конкретном примере о том, как писать плагины для Amx Mod X, а точнее - расскажу основы. Но для начала краткая инструкция по компилированию плагинов и список линков на полезные ресурсы:
» Компиляция
Вы написали плагин и сохранили его. У вас есть файл *.sma. Есть 2 пути компиляции: ручками и через студию. Я предпочитаю студию: заходим в Tools>Settings> |- Compiler. В этой вкладке надо указать 2 пути. К компилятору amxxpc.exe и место, куда складывать готовые плагины; вот как стоит у меня:
****\hlds\cstrike\addons\amxmodx\plugins\ - куда складывать
****\hlds\cstrike\addons\amxmodx\scripting\amxxpc.exe - компилятор
Еще, для удобства, можно там же в настрйоках поставить исполняемый файл контр-страйка hlds.exe. В итоге нажав кнопочку Compile & Start HL через меню, мы поулчим скомпилировавшийся плагин в директорию плагинов, после этого запустится сервер. Минимум лишних движений. Не забудьте прописать свой плагин в addons\amxmodx\configs\plugins.ini
Для того, чтобы начать писать плагины вам нужно будет скачать вот это. Это - невероятно удобный текстовый редактор, специально оптимизированный под язык Pawn, на котором и пишутся плагины.
Скачав студию, заходим в нее и, если мы имеем представление о том, что такое язык C, открываем мой плагин HealthControl_onlyHG.sma, если нет, то сформируем представление о языке Pawn-бежим сюда и читаем всё от и до. Если не понимаете о чем там пишут ли не знаете английского-закройте эту страницу и откройте через пару лет, предварительно выучив чего не знали. Я буду считать, что вы ознакомились с вышепредложенной страницей и начну с подробного разбора примера, описанного на том же сайте. Вы спросите "зачем разбирать то, что уже там разобрано?", но я вам скажу, что когда читал тот пример, до многого пришлось додумываться самому, да и дальнейшее развитие там не описывается.
Чтож, начнем...
» Весь плагин
Код:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <csx>
#include <fun>
#pragma tabsize 0
#define PLUGIN "Health Control"
#define VERSION "1.0"
#define AUTHOR "Artte@xgm.ru(jabber)"
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("amx_hp", "cmd_hp", ADMIN_SLAY, "<target> <amount>")
register_concmd("amx_god", "cmd_god", ADMIN_SLAY, "<target> <0/1>")
}
public cmd_hp(id, level, cid)
{
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new Arg1[24]
new Arg2[4]
//Берем аргументы команды из консоли
read_argv(1, Arg1, 23)
read_argv(2, Arg2, 3)
//Конвертируем количество жизней из строки в число
new Health = str_to_num(Arg2)
//Является ли первый символ @ символом?
if (Arg1[0] == '@')
{
new Team = 0
if (equali(Arg1[1], "CT"))
{
Team = 2
} else if (equali(Arg1[1], "T")) {
Team = 1
}
new players[32], num
get_players(players, num)
new i
for (i=0; i<num; i++)
{
if (!Team)
{
set_user_health(players[i], Health)
} else {
if (get_user_team(players[i]) == Team)
{
set_user_health(players[i], Health)
}
}
}
} else {
new player = cmd_target(id, Arg1, 1)
if (!player)
{
console_print(id, "Izvinite, igrok %s ne mojet bit naiden ili ispol'zovan v kachestve ob'ekta!", Arg1)
return PLUGIN_HANDLED
} else {
set_user_health(player, Health)
}
}
return PLUGIN_HANDLED
}
public cmd_god(id, level, cid)
{
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new Arg1[24]
new Arg2[2]
//Берем аргументы команды из консоли
read_argv(1, Arg1, 23)
read_argv(2, Arg2, 3)
//Является ли первый символ @ символом?
if (Arg1[0] == '@')
{
new Team = 0
if (equali(Arg1[1], "CT"))
{
Team = 2
} else if (equali(Arg1[1], "T")) {
Team = 1
}
new players[32], num
get_players(players, num)
new i
for (i=0; i<num; i++)
{
if (!Team)
{
set_user_godmode(players[i], str_to_num(Arg2))
} else {
if (get_user_team(players[i]) == Team)
{
set_user_godmode(players[i], str_to_num(Arg2))
}
}
}
} else {
new player = cmd_target(id, Arg1, 1)
if (!player)
{
console_print(id, "Izvinite, igrok %s ne mojet bit naiden ili ispol'zovan v kachestve ob'ekta!", Arg1)
return PLUGIN_HANDLED
} else {
set_user_godmode(player, str_to_num(Arg2))
}
}
return PLUGIN_HANDLED
}
Разберем код небольшими кусками:
Код:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>| это всё включения,
#include <amxmisc> | позволяющие вызывать
#include <csx> | дополнительные функции,
#include <fun> | очень удобно
#pragma tabsize 0 | позволяет избежать некоторых ошибок при компиляции, т.к. сбрасывает все отступы к 0
#define PLUGIN "Health Control" | Имя плагина
#define VERSION "1.0" | Версия
#define AUTHOR "Artte@xgm.ru(jabber)" | Автор
Код:
public plugin_init() { | Функция, обязательная для всех плагинов
register_plugin(PLUGIN, VERSION, AUTHOR) | Регистрируем плагин - обязательная процедура
register_concmd("amx_hp", "cmd_hp", ADMIN_SLAY, "<target> <amount>") | а вот это уже наши функции,
register_concmd("amx_god", "cmd_god", ADMIN_SLAY, "<target> <0/1>") | регистрирующие команды для консоли
}
Рассмотрим действие
Код:
register_concmd("amx_hp", "cmd_hp", ADMIN_SLAY, "<target> <amount>")
Она регистрирует команду для чата, которая будет вызывать определенные действия:
Код:
register_concmd("Команда для чата", "Какую функцию плагина она вызывает", Уровень доступа для использования команды, "Описание команды")
Рассмотрим функцию для установления уровня жизни по частям:
Код:
public cmd_hp(id, level, cid)
{
//Тут мы проверяем уровень доступа и корректность введенной команды: cmd_access(id запустившего команду, уровень доступа требуемый, сам еще не разобрался=), число минимально требуемых параметров(САМА КОМАНДА amx_hp ТОЖЕ СЧИТАЕТСЯ ПАРАМЕТРОМ))
//Если проверка не пройдена-завершаем выполнение функции
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
//Создаем новые переменные-массивы, которые будут служить string-переменными дял аргументов
new Arg1[24]
new Arg2[4]
//Берем аргументы команды из консоли(нулевой аргумент-amx_hp)
read_argv(1, Arg1, 23)
read_argv(2, Arg2, 3)
//Конвертируем количество жизней из строки в число
new Health = str_to_num(Arg2)
Рассмотрим следующую часть, однако, я сразу скажу как мы имеем возможность благодаря этому коду задавать параметр кому установить хп: @ALL @CT @T "Ник юзера"
Код:
//Является ли первый символ @ символом?
if (Arg1[0] == '@')
{
//Создаем переменную, в которой обозначим команду игроков
new Team = 0
if (equali(Arg1[1], "CT"))//Сравниваем содержимое массива со 2-го номера(0-первый номер) и до конца со строкой "CT"
{
Team = 2
} else if (equali(Arg1[1], "T")) //Аналогично вышесказанному
{
Team = 1
}
//Создаем массив целочисленных и одну целочисленную переменную. В них получаем id всех игроков в массив и кол-во игроков в переменную.
new players[32], num
get_players(players, num)
//Создаем переменную-индекс в технических целях-для цикла
new i
for (i=0; i<num; i++)
{
if (!Team) //Если переменная Team не задана, т.е. имеет стартовое значение-0, то устанавливаем хп всем игрокам(@ALL)
{
set_user_health(players[i], Health)
} else {//Или же-проверяем команду, если она совпадает с нашей-выставляем хп
if (get_user_team(players[i]) == Team)
{
set_user_health(players[i], Health)
}
}
}
}
Теперь разберем следующую часть:
Код:
else {//если у нас первый символ не @, то мы поулчаем ник игрока и, следовательно, поулчаем его id
new player = cmd_target(id, Arg1, 1)
if (!player)//Если игрок не получен
{
console_print(id, "Izvinite, igrok %s ne mojet bit naiden ili ispol'zovan v kachestve ob'ekta!", Arg1)//Пеачатем в консоли вызывавшего команду жалобное сообщение
return PLUGIN_HANDLED//Прекращаем выполение плагина
} else {//Если игрок найден..
set_user_health(player, Health)//Устанавливаем ему хп на значение, полученное из консоли.
}
}
return PLUGIN_HANDLED
}
Команда amx_god сделана ни чуть не сложнее, в ней вам разобраться не составит труда. Если вы с легкостью освоили этот материал-можете взглянуть на полную версию плагина с восстановлением хп при падении. В следующей части мы рассмотрим графические сообщения на экран и таймеры.
Отредактировано Артте, 30.05.2009 в 16:21.
|