Контакты Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 1
  • 1
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » Урок 1 (Первый SourceMod плагин)
Урок 1
_wS_ Дата: Четверг, 04.08.2011, 19:20:38 | Сообщение # 1
Как Создать SourceMod Плагин

Скачайте SourceMod и куда-нибудь распакуйте папку addons/sourcemod/scripting
В папке scripting вы увидите исходные файлы стандартных плагинов с расширением .sp
Перетащив funcommands.sp на compile.exe, вы увидите похожее окно:



Если компилятор обнаружил в коде какие-либо ошибки, то он подробно сообщит о них в этом окне. Будет видно имя файла, номер строки, что именно за ошибка, её код и тд. Чтобы можно было копировать текст из окна, нажмите правой кнопкой мыши по верхней полосе окна, свойства, и там выделение мышью. Выделяете текст, нажимаете правую кнопку мыши и текст скопирован. В нашем случае никаких ошибок не было, .sp успешно скомпилирован и наш плагин лежит в scripting/compiled/funcommands.smx. Черное окно можно закрывать, оно уже не нужно. Теперь funcommands.smx достаточно переместить в addons/sourcemod/plugins и после включения сервера/смены карты он заработает.

Если переместить .smx файл в addons/sourcemod/plugins/disabled, то он не будет включаться.
В папке plugins/ можно создавать свои папки и перемещать .smx файлы туда.
Плагин (файл .smx) перезагружается после смены карты, если дата его последнего изменения не совпадает с прошлой.
Чтобы немедленно перезагрузить/включить/отключить плагин, можно использовать RCON команды:

Код
sm plugins load x - вкл плагин (расширение .smx можно не указывать)
sm plugins unload x - отключить
sm plugins reload x - перезапустить (откл и сразу вкл)
sm plugins list - список включенных плагинов

x - это имя .smx плагина, который находится в addons/sourcemod/plugins.
Если x.smx лежит в plugins/my_folder/x.smx, то писать нужно sm plugins load my_folder/x

Создаём первый плагин:

1. Используйте текстовый редактор Notepad++ (скачать)

2. Создайте в папке scripting текстовый документ (.txt) и переименуйте его в x.sp, сменив расширение.
Если вы не видите расширение .txt у вашего текстового файла, то гугл поможет -> "win 7 показывать расширения файлов".

3. Вставьте этот код:

Код
// UTF-8 (без BOM)

#pragma semicolon 1

#define HP_LIMIT 110

#include <sourcemod>

public OnPluginStart()
{
    PrintToServer("SM скрипт включен!");

    new x = 1;
    PrintToServer("x = %d", x);
    new y = 4 + x;
    PrintToServer("y = 4 + %d = %d", x, y);

    new String:x_str[] = "CS:Source";
    PrintToServer("x_str = \"%s\" | Символов в тексте: %d", x_str, strlen(x_str));

    PrintToServer("Теперь пробуем цикл for");
    for (new i = 1; i < 6; i++) {
        PrintToServer("i = %i", i);
    }
    
    decl String:text[128];
    GetCurrentMap(text, sizeof(text));
    PrintToServer("Текущая карта: %s", text);

    FormatTime(text, sizeof(text), "%d/%m/%Y | %H:%M");
    PrintToServer("Дата | Время: %s", text);

    PrintToServer("Слотов на сервере: %d", GetMaxClients());

    // Ловим событие (игрок прыгнул)
    HookEvent("player_jump", player_jump, EventHookMode_Post);
}

public player_jump(Handle:event, const String:name[], bool:dontBroadcast)
{
    new client = GetClientOfUserId(GetEventInt(event, "userid"));
    new hp = GetClientHealth(client);
    if (hp < HP_LIMIT) {
        SetEntityHealth(client, hp + 1);
    }
    else {
        PrintToChat(client, "Лимит: %d hp", HP_LIMIT);
    }
}

4. Мы используем не только ASCII символы, поэтому преобразуйте кодировку в UTF-8 без BOM



5. Теперь скомпилируйте плагин. Перетаскиваем x.sp на compile.exe, открывшееся черное окно закрываем (ошибок же нет), и идём за x.smx в папку scripting/compiled. Включаем сервер, бросаем в addons/sourcemod/plugins наш x.smx и пишем в консоль сервера (rcon) sm plugins load x
После чего в консоле сервера увидим результат:

Код
SM скрипт включен!
x = 1
y = 4 + 1 = 5
x_str = "CS:Source" | Символов в тексте: 9
Теперь пробуем цикл for
i = 1
i = 2
i = 3
i = 4
i = 5
Текущая карта: de_cbble
Дата | Время: 25/05/2012 | 18:04
Слотов на сервере: 7

Зайдите на сервер и попрыгайте. После каждого прыжка вам будет добавлять 1 HP.
А если у вас 110 HP или выше, то в чат напишет "Лимит: 110 hp"

-----

Вот ваш первый скрипт и работает.
Теперь можете попробовать изменить его код на свой и проверить снова, т.к. важна практика.

В качестве отступов используйте TAB (это удобно), но внутри одной функции нельзя смешивать пробельные отступы и TAB (компилятору это не понравится). Можно довольно быстро изменить тип отступа, т.к. весь код функции можно сдвинуть влево, просто выделите нужный текст и нажмите shift + tab. Ну и конечно же нужно пользоваться ctrl + c (копировать), ctrl + v (вставить), ctrl + z (отменить), ctrl + y (повторить), ctrl + f (поиск).

Полезные ссылки:

- Обязательно ознакомьтесь с этой статьёй
- http://docs.sourcemod.net/api/ - список всех SM функций/событий
- http://wiki.alliedmods.net/Category:Ru:SourceMod_Scripting - разная информация

#include - подключает библиотеку

В разных библиотеках разные функции и чтобы иметь доступ к определенной функции, нужно подключить соответствующую библиотеку. Все они находятся в addons/sourcemod/scripting/include (файлы с расширением .inc). Как узнать какие библиотеки подключать: об этом есть отдельный урок.

Советую сначала тестировать различные варианты кода в событии OnPluginStart(). Внутри используйте PrintToServer для вывода данных в консоль сервера - так вы сможете узнать что чему равно и когда было выполнено, и заходить в игру не надо.

Прикрепления: 3609707.jpg(127.9 Kb)
 
_wS_ Дата: Пятница, 13.07.2012, 15:08:02 | Сообщение # 2
Если у вас нет доступа к консолю сервера (RCON), то установите программу HLSW. Добавьте свой сервер в список, внизу перейдите в раздел Rcon Config и введите RCON пароль. Если пароль введен верно, переходите в раздел Консоль и запускайте плагин командой: sm plugins load x


Прикрепления: 6806075.jpg(27.8 Kb)
 
rotmir1989 Дата: Пятница, 31.10.2014, 07:58:37 | Сообщение # 3
Сообщений: 2
Репутация: 0 [ +/- ]
Всем здравствуйте , я тут используя ваш код изменил его и хочу добавить сообщение игроку в чате , но не получается . Собщение не выводится (((( Не подскажете где ошибка ???

public PlaerDeath(Handle:event, const String:name[], bool:dontBroadcast)
{
new client = GetClientOfUserId(GetEventInt(event, "attacker"));
new hp = GetClientHealth(client);
if (hp < 150) SetEntProp(client, Prop_Send, "m_iHealth", hp + 5);
{
PrintToChat("%t","Вы получили +5 HP");
}
}
 
_wS_ Дата: Пятница, 31.10.2014, 08:15:26 | Сообщение # 4
Код
public PlaerDeath(Handle:event, const String:name[], bool:dontBroadcast)  
{
    new id = GetEventInt(event, "attacker");
    if (id != GetEventInt(event, "userid") && (id = GetClientOfUserId(id)) > 0 && IsPlayerAlive(id))
    {
       new hp = GetClientHealth(id);
       if (hp < 150)
       {
          SetEntProp(id, Prop_Send, "m_iHealth", hp + 5);
          PrintToChat(id, "Вы получили +5 HP");
       }
    }
}
 
sdn203 Дата: Вторник, 07.04.2015, 19:47:30 | Сообщение # 5
Сообщений: 28
Репутация: 0 [ +/- ]
Как сделать чтобы если админ написал в консоль sm_hp ID HP, и по ид дало ему HP


Сообщение отредактировал sdn203 - Среда, 08.04.2015, 08:30:35
 
SourceSamil Дата: Среда, 08.04.2015, 11:51:06 | Сообщение # 6
Сообщений: 237
Репутация: [ +/- ]
Думаю разберешься

Код
#include <entity_prop_stocks>

public OnPluginStart()    
{
    RegAdminCmd( "sm_hp", CMD_TakeHP, ADMFLAG_GENERIC );
}

public Action: CMD_TakeHP( i_client, i_args )
{
    if( i_client < 1 || || !IsClientInGame( i_client ) || !IsClientAlive( i_client ) )
     return Plugin_Handled;
       
    if( i_args > 1 || i_args < 1 )
    {
      PringToChat( i_client, "Используйте команду sm_hp <Кол-во>" );
    }
    else
    {
      decl String: s_Arg1[ 5 ];
      GetCmdArg( 1, s_Arg1, sizeof( s_Arg1 ) );
      SetEntityHealth( i_client, StringToInt( s_Arg1 ) );
    }
    return Plugin_Handled;
}


Сообщение отредактировал SourceSamil - Среда, 08.04.2015, 11:53:23
 
BarD Дата: Среда, 08.04.2015, 12:20:28 | Сообщение # 7
Сообщений: 941
Репутация: 132 [ +/- ]
SourceSamil, он же сказал, по ID давать хп.





Сообщение отредактировал BarD - Среда, 08.04.2015, 16:17:37
 
TEIN Дата: Среда, 08.04.2015, 16:05:36 | Сообщение # 8
Сообщений: 568
Репутация: 78 [ +/- ]
BarD, if (target > 0 && IsClientInGame(target) && IsPlayerAlive(target)) или if (target < 1 || !IsClientInGame(target) || !IsPlayerAlive(target))


Сообщение отредактировал TEIN - Среда, 08.04.2015, 16:07:39
 
BarD Дата: Среда, 08.04.2015, 16:16:30 | Сообщение # 9
Сообщений: 941
Репутация: 132 [ +/- ]
TEIN, верно, исправил. Спасибо.
 
SourceSamil Дата: Среда, 08.04.2015, 18:35:37 | Сообщение # 10
Сообщений: 237
Репутация: [ +/- ]
Ден, точно, я не понял суть
 
sdn203 Дата: Четверг, 09.04.2015, 13:05:29 | Сообщение # 11
Сообщений: 28
Репутация: 0 [ +/- ]
Спасибо, писал что то на подобие что у вас, ну были ошибки..)))

Добавлено (09.04.2015, 11:24:55)
---------------------------------------------
А тут все правильно

"Настройка здоровья (HP)"
{
"cmd" "sm_hp #1 #2"
"admin" "sm_rcon"
"execute" "player"

"1"
{
"type" "player"
"method" "userid"
"title" "Выберите игрока:\n \n"
}

"2"
{
"type" "list"
"title" "Настройка здоровья (HP):\n \n"

"1" "10"
"1." "10 HP"

"2" "20"
"2." "20 HP"

"3" "30"
"3." "30 HP"

"4" "40"
"4." "40 HP"

"5" "50"
"5." "50 HP"

"6" "60"
"6." "60 HP"

"7" "70"
"7." "70 HP"

"8" "80"
"8." "80 HP"

"9" "90"
"9." "90 HP"

"10" "100"
"10." "100 HP"

"11" "110"
"11." "110 HP"

"12" "150"
"12." "150 HP"

"13" "200"
"13." "200 HP"

"14" "500"
"14." "500 HP"

"15" "1000"
"15." "1000 HP"
}

}

Ну "method" "userid" не верно, как определить Индекс в adminmenu_custom

Добавлено (09.04.2015, 13:05:29)
---------------------------------------------
Понял clientid ))

 
Форум » SourceMod >> CS:Source >> CSGO » Уроки SourceMod (SourcePawn) Скриптинга » Урок 1 (Первый SourceMod плагин)
  • Страница 1 из 1
  • 1
Поиск: