[SourcePawn] Помощь по написанию простого плагина.

KoBboy

Участник
Сообщения
58
Реакции
1
Заранее говорю, мои знания в языке SourcePawn небольшие (вернее, их почти нет).

Вот в чём нужда. Мне необходимо сделать плагин, чтобы когда игроков в какой-либо команде меньше трёх, то отключается плагин [VIP] Respawn, или же блокируется команда "respawn".

Что-то такого типа:
PHP:
if (alivet <= 3 || alivect <=3)
{
    ServerCommand("sm plugins unload vip/VIP_Respawn_1.0.3.smx"); 
}
А далее просто:
PHP:
public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    ServerCommand("sm plugins load vip/VIP_Respawn_1.0.3.smx"); 
}


Вот как сделать этот самый if нормальным и работоспособным?
Надеюсь, что кто-нибудь поможет.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
П%сец твоей вип системе будет, если вот так будешь модули отрубать.

В самом исходнике плагина делай проверку.
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Извини, не понимаю что и как. Можешь этот if написать в подобном виде?
PHP:
if (alivet <= 3 || alivect <=3)
{
    ...Тут код...
}
тьфу ты блин
PHP:
if(IsPlayerAlive(client)) - если игрок жив.
PHP:
if(!IsPlayerAlive(client)) - если игрок мертв.

Ты пришел с cs 1.6 ?))

PHP:
if (alivet <= 3 && alivect <=3)
 

KoBboy

Участник
Сообщения
58
Реакции
1
тьфу ты блин
PHP:
if(IsPlayerAlive(client)) - если игрок жив.
PHP:
if(!IsPlayerAlive(client)) - если игрок мертв.
А как само условие собрать?

Ты пришел с cs 1.6 ?))
Не совсем.
Я в программирование - овощ.
--- Добавлено позже ---
Можно сделать таким образом, отдельным плагином:
PHP:
if (какое-то условие)
{
     SetConVarInt(FindConVar("sm_vip_respawn_enable"), 0);
}
Но как это само условие сделать? :(
 
Последнее редактирование:

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
А как само условие собрать?
Я так понимаю тебе сам код нужно написать...

Не знаю, я бы наверное сделал так:

PHP:
for(new i=1; i <= MaxClients; i++) // Цикл проверки всех игроков
{
   if(IsClientInGame(i) && IsPlayerAlive(i)) // В игре? Живых?
   {
       new TT = GetClientTeam(i) == 2 // Террористы
       new CT = GetClientTeam(i) == 3 // Контер-Террористы
    
       if(CT <= 3 && TT <= 3) // Условие
       {
           BlablaBla... // Если выполнены все условия, выполняем...
       }
   }
}
 
Последнее редактирование:

KoBboy

Участник
Сообщения
58
Реакции
1
Я так понимаю тебе сам код нужно написать...

Не знаю, я бы наверное сделал так:

PHP:
for(new i=1; i <= MaxClients; i++)
{
   if(IsClientInGame(i) && IsPlayerAlive(i))
   {
       new TT = GetClientTeam(i) == 2
       new CT = GetClientTeam(i) == 3
    
       if(CT <= 3 && TT <= 3)
       {
           BlablaBla...
       }
   }
}
Хорошо, остался последний вопрос, а теперь куда вставлять этот if?
За свою тупость извиняюсь.
PHP:
#include <sourcemod>

public Plugin:myinfo =
{
    name = "blabla",
    description = "",
    author = "Kto-to",
    version = "1.0",
    url = ""
};

public OnPluginStart()
{
    HookEvent("round_end", Event_RoundEnd);
}

// Я полностью уверен, что если сюда вставить, то ничего хорошего не будет.
// Тогда у меня возникает вопрос: Куда?
for(new i=1; i <= MaxClients; i++)
{
   if(IsClientInGame(i) && IsPlayerAlive(i))
   {
       new TT = GetClientTeam(i) == 2
       new CT = GetClientTeam(i) == 3
    
       if(CT <= 3 && TT <= 3)
       {
           SetConVarInt(FindConVar("sm_vip_respawn_enable"), 0);
       }
   }
}

public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    SetConVarInt(FindConVar("sm_vip_respawn_enable"), 1);
}
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
Хорошо, остался последний вопрос, а теперь куда вставлять этот if?
За свою тупость извиняюсь.
PHP:
#include <sourcemod>

public Plugin:myinfo =
{
    name = "blabla",
    description = "",
    author = "Kto-to",
    version = "1.0",
    url = ""
};

public OnPluginStart()
{
    HookEvent("round_end", Event_RoundEnd);
}

// Я полностью уверен, что если сюда вставить, то ничего хорошего не будет.
// Тогда у меня возникает вопрос: Куда?
for(new i=1; i <= MaxClients; i++)
{
   if(IsClientInGame(i) && IsPlayerAlive(i))
   {
       new TT = GetClientTeam(i) == 2
       new CT = GetClientTeam(i) == 3
   
       if(CT <= 3 && TT <= 3)
       {
           SetConVarInt(FindConVar("sm_vip_respawn_enable"), 0);
       }
   }
}

public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    SetConVarInt(FindConVar("sm_vip_respawn_enable"), 1);
}

Туда , где тебе нужно сделать проверку.
Я ж тебе написал, делай все в самом плагине VIP_Respawn_1.0.3
 

KoBboy

Участник
Сообщения
58
Реакции
1
Туда , где тебе нужно сделать проверку.
Я ж тебе написал, делай все в самом плагине VIP_Respawn_1.0.3
Мне кажется намного легче будет сделать отдельным. Просто менять квар когда тебе нужно.
PHP:
sm_vip_respawn_enable 0/1
--- Добавлено позже ---
Живых, видимо? Или, всё же любых? Если последнее, то:
PHP:
if (GetTeamClientCount(2) < 3 || GetTeamClientCount(3) < 3)
Именно живых
--- Добавлено позже ---
Осталось собрать плагин. Вот части:
PHP:
for(new i=1; i <= MaxClients; i++)
{
   if(IsClientInGame(i) && IsPlayerAlive(i))
   {
       new TT = GetClientTeam(i) == 2
       new CT = GetClientTeam(i) == 3
 
       if(CT <= 3 && TT <= 3)
       {
           SetConVarInt(FindConVar("sm_vip_respawn_enable"), 0);
       }
   }
}
И
PHP:
public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    SetConVarInt(FindConVar("sm_vip_respawn_enable"), 1);
}
--- Добавлено позже ---
Плагин для сервера CS:GO
Мне необходимо, чтобы когда меньше 3 человек в любой команде, то квар sm_vip_respawn_enable будет ставится на 0. (выкл)
А в конце раунда пусть ставится на 1. (вкл)

Попробовал таким образом, но квар он не меняет:
PHP:
#include <sourcemod>

public OnPluginStart()
{
    HookEvent("round_end", Event_RoundEnd);
}

public Respawnblock(client)
{
   for(new i=1; i <= MaxClients; i++)
   {
       if(IsClientInGame(i) && IsPlayerAlive(i))
       {
           new TT = GetClientTeam(i) == 2
           new CT = GetClientTeam(i) == 3
        
           if(CT <= 3 && TT <= 3)
           {
               SetConVarInt(FindConVar("sm_vip_respawn_enable"), 0);
           }
       }
   }
}

public Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    SetConVarInt(FindConVar("sm_vip_respawn_enable"), 1);
}
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #13
Я так понимаю тебе сам код нужно написать...

Не знаю, я бы наверное сделал так:

PHP:
for(new i=1; i <= MaxClients; i++) // Цикл проверки всех игроков
{
   if(IsClientInGame(i) && IsPlayerAlive(i)) // В игре? Живых?
   {
       new TT = GetClientTeam(i) == 2 // Террористы
       new CT = GetClientTeam(i) == 3 // Контер-Террористы
   
       if(CT <= 3 && TT <= 3) // Условие
       {
           BlablaBla... // Если выполнены все условия, выполняем...
       }
   }
}
Без обид но это бред.

Переменные для хранения кол-ва живых игроков надо создать ДО цикла, а В цикле только инкремент делать, а проверять кол-во нужно ПОСЛЕ цикла
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
То что я написал - полный бред.

Реализация не правильная.
Шо то типо этого должно быть.
PHP:
#include <cstrike>

public OnPluginStart()
{
   RegAdminCmd("sm_respawn", Respawncmd, ADMFLAG_ROOT);
}

public Action:Respawncmd(client, args)
{
   if (client > 0 && args < 1)
   {
       Respawn(client);
   }
   return Plugin_Handled;
}

public Respawn(client)
{
   new tt = 0
   new ct = 0;
   for(new i = 1; i <= MaxClients; i++)
   {
       if(IsClientInGame(i) && IsPlayerAlive(i))
       {
           switch (GetClientTeam(i))
           {
               case 2: tt++;
               case 3: ct++;
           }
       }
   }
   
   if( tt <= 3 && ct <= 3)
   {
       PrintToChat(client, "Вы не можете возродиться...");
   }
   else if(!IsPlayerAlive(client))
   {
       CS_RespawnPlayer(client);
   }
}
 
Последнее редактирование:

KoBboy

Участник
Сообщения
58
Реакции
1
То что я написал - полный бред.

Реализация не правильная.
Шо то типо этого должно быть.
PHP:
#include <cstrike>

public OnPluginStart()
{
   RegAdminCmd("sm_respawn", Respawncmd, ADMFLAG_ROOT);
}

public Action:Respawncmd(client, args)
{
   if (client > 0 && args < 1)
   {
       Respawn(client);
   }
   return Plugin_Handled;
}

public Respawn(client)
{
   new tt = 0;
   new ct = 0;
   for(new i = 1; i <= MaxClients; i++)
   {
       if(IsClientInGame(i) && IsPlayerAlive(i))
       {
           switch (GetClientTeam(i))
           {
               case 2: tt++;
               case 3: ct++;
           }
       }
   }
 
   if( tt <= 3 && ct <= 3)
   {
       PrintToChat(client, "Вы не можете возродиться...");
   }
   else
   {
       CS_RespawnPlayer(client);
   }
}
А можно сделать, чтобы ставился квар (sm_vip_respawn_enable 0) без прописания команды, а просто когда меньше 3 живых?
 

Drumanid

Нестандартное звание
Сообщения
1,862
Реакции
1,748
А можно сделать, чтобы ставился квар (sm_vip_respawn_enable 0) без прописания команды, а просто когда меньше 3 живых?
Если ты хочешь сделать так, как ты хочешь, то только через OnPlayerRunCmd или OnGameFrame, ну или через таймер проверяя каждую секнду делая проверку...
Короче это полный зашквар. Сделай лучше так как я написал тебе, через сам плагин и не люби себе и другим мозги.

Вопрос такой к тебе... Лучше проверить один раз при вызове команды или же жахать сервер каждую секнду?
 
Последнее редактирование:

KoBboy

Участник
Сообщения
58
Реакции
1
Если ты хочешь сделать так, как ты хочешь, то только через OnPlayerRunCmd или OnGameFrame, ну или через таймер проверяя каждую секнду делая проверку...
Короче это полный зашквар. Сделай лучше так как я написал тебе, через сам плагин и не люби себе и другим мозги.

Вопрос такой к тебе... Лучше проверить один раз при вызове команды или же жахать сервер каждую секнду?
Всё сделал, всё работает.
Большое всем спасибо
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
только через OnPlayerRunCmd или OnGameFrame, ну или через таймер проверяя каждую секнду делая проверку
Событие спавна игрока (живые) и смерти - вот основные принципы построения подобного кода. Будет работать мгновенно, не хуже, чем OnGameFrame().
 
F

FBI

Люди подскажите а мод 1 на 1 это приват? Или в паблике где-то есть?
 
Сверху Снизу