XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Другие игры (только чтение)> Counter-Strike
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

 
Артте
Open up your eyes
offline
Опыт: 23,423
Активность:
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.
Старый 30.05.2009, 13:33

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 17:02.