Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

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

  • Страница 1 из 1
  • 1
SourceMod урок #1
_wS_ Дата: Четверг, 04.08.2011, 19:20:38 | Сообщение # 1
Как создать SourceMod плагин/скрипт

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

$IMAGE1$

Если компилятор обнаружил в коде какие-либо ошибки, то он подробно сообщит о них в этом окне. Будет видно имя файла, номер строки, что именно за ошибка, её код и тд. Чтобы можно было копировать текст из окна, нажмите правой кнопкой мыши по верхней полосе окна, свойства, и там выделение мышью. Выделяете текст, нажимаете правую кнопку мыши и текст скопирован. В нашем случае никаких ошибок не было, .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. Советую использовать текстовый редактор VS Code и установить в него расширение для SourcePawn, но для начала подойдёт и Notepad++.

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

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

Код
#include <sdktools>

#pragma semicolon 1
#pragma newdecls required

public void OnPluginStart()
{
    PrintToServer("My first plugin is enabled.");
    PrintToServer("Slots: %d", MaxClients);

    char map[64];
    GetCurrentMap(map, sizeof(map));
    PrintToServer("Current map: %s", map);

    char date[32];
    FormatTime(date, sizeof(date), "%d.%m.%Y %H:%M");
    PrintToServer("Date: %s", date);
    
    HookEvent("player_jump", Event_player_jump);
}

#define HEALTH_LIMIT 110

static void Event_player_jump(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    if (client)
    {
        int health = GetClientHealth(client) + (GetClientButtons(client) & IN_DUCK ? -10 : 1);
        if (health > 0) {
            if (health <= HEALTH_LIMIT) {
                SetEntityHealth(client, health);
            } else {
                PrintToChat(client, "Health limit: %d", HEALTH_LIMIT);
            }
        } else {
            ForcePlayerSuicide(client);
        }
    }
}


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

Код
My first plugin is enabled.
Slots: 7
Current map: de_dust2
Date: 12.02.2022 02:12

Зайдите на сервер и попрыгайте.
После каждого прыжка вам будет добавляться 1 HP (до 110 HP).
Если прыгать с зажатым приседанием (CTRL), то будет отниматься по 10 HP и в итоге убьёт.

-----

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

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

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

- SourceMod wiki
- SourceMod функции/события

Код
// Подключение библиотеки sdktools.
// Подробнее о библиотеках здесь: https://world-source.ru/forum/100-2331-1
#include <sdktools>


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

Гости не могут скачивать файлы
 
rotmir1989 Дата: Пятница, 31.10.2014, 07:58:37 | Сообщение # 2
Сообщений: 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 | Сообщение # 3
Код
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 | Сообщение # 4
Сообщений: 28
Репутация: 0 [ +/- ]
Как сделать чтобы если админ написал в консоль sm_hp ID HP, и по ид дало ему HP


Сообщение отредактировал sdn203 - Среда, 08.04.2015, 08:30:35
 
SourceSamil Дата: Среда, 08.04.2015, 11:51:06 | Сообщение # 5
Сообщений: 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 | Сообщение # 6
Сообщений: 943
Репутация: 137 [ +/- ]
SourceSamil, он же сказал, по ID давать хп.





Сообщение отредактировал BarD - Среда, 08.04.2015, 16:17:37
 
TEIN Дата: Среда, 08.04.2015, 16:05:36 | Сообщение # 7
Сообщений: 563
Репутация: 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 | Сообщение # 8
Сообщений: 943
Репутация: 137 [ +/- ]
TEIN, верно, исправил. Спасибо.
 
SourceSamil Дата: Среда, 08.04.2015, 18:35:37 | Сообщение # 9
Сообщений: 237
Репутация: [ +/- ]
Ден, точно, я не понял суть
 
sdn203 Дата: Четверг, 09.04.2015, 13:05:29 | Сообщение # 10
Сообщений: 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 ))

 
bloom Дата: Пятница, 08.05.2020, 21:34:26 | Сообщение # 11
Сообщений: 1
Репутация: 0 [ +/- ]
Привет
У меня вопрос, можно ли сделать плагин автобинденр клавиш, что бы когда человек выходил у него бинды не сохранялись???
Если можно то как???
 
_wS_ Дата: Пятница, 08.05.2020, 22:23:31 | Сообщение # 12
Цитата bloom ()
можно ли сделать плагин автобинденр клавиш

Наверно только если вирус на его комп закинуть)
Подобные настройки это по идее клиентская часть и сервер нич не может, кроме как получить клиент-настройки.
 
  • Страница 1 из 1
  • 1
Поиск: