Counter-Strike: Scripting 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__, Health)
               } else {
                    if (get_user_team(players__) == Team)
                    {
                         set_user_health(players__, 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__, str_to_num(Arg2))
               } else {
                    if (get_user_team(players__) == Team)
                    {
                         set_user_godmode(players__, 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 &lt;amxmodx>| это всё включения,
#include &lt;amxmisc>  | позволяющие вызывать 
#include &lt;csx>          | дополнительные функции,
#include &lt;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&lt;num; i++)
          {
               if (!Team) //Если переменная Team не задана, т.е. имеет стартовое значение-0, то устанавливаем хп всем игрокам(@ALL)
               {
                    set_user_health(players__, Health)
               } else {//Или же-проверяем команду, если она совпадает с нашей-выставляем хп
                    if (get_user_team(players__) == Team)
                    {
                         set_user_health(players__, 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 сделана ни чуть не сложнее, в ней вам разобраться не составит труда. Если вы с легкостью освоили этот материал-можете взглянуть на полную версию плагина с восстановлением хп при падении. В следующей части мы рассмотрим графические сообщения на экран и таймеры.

Просмотров: 7 779

Зевс #1 - 11 лет назад 0
маловато про кодинг... нужно побольше примеров... помнится был сервак, писал неплохие вещи =/
Артте #2 - 11 лет назад 0
ну как бы примеров пока да - мало, я плагин доработаю один и его опишу тут тоже, наверно
and_y87 #3 - 10 лет назад 0
Блин примерчиков бы побольше и про функции побольше бы...