Существует ли плагин "При достижении кол-ва побед происходит рестарт"?

skynet2040

Участник
Сообщения
51
Реакции
1
Ребят в общем видел такую штуку на серве паблике, когда одна из команд делает 50 побед то счет сбрасывается, а в чате писалось типо Кт или Т победили. Есть такой плагин вообще или писать надо ?
 

CTe6eJIeK_vRn

Участник
Сообщения
2,114
Реакции
1,867
Re: Существует ли плагин ?

В паблике такого нет, но такой написал R1KO, за что ему говорите спасибо:
PHP:
#include <sourcemod>
#include <sdktools>

new Handle:g_hAutoRestartRounds = INVALID_HANDLE,
    Handle:g_hAutoRestartEnabled = INVALID_HANDLE,
    bool:g_bEnabled = true,
    g_iWins,
    String: soundFile[] = "ambient/misc/brass_bell_c.wav";

public Plugin:myinfo =
{
    name = "Autorestartgame",
    author = "R1KO",
    description = "Автоматический рестарт при достижении лимита побед",
    version = "1.1",
    url = "https://hlmod.ru"
};

public OnPluginStart()
{
    g_hAutoRestartEnabled = CreateConVar("sm_autorestartgame_enabled", "1", "Вкл/Выкл плагин.", FCVAR_NONE, true, 0.0, true, 1.0);
    g_hAutoRestartRounds = CreateConVar("sm_autorestartgame_round", "50", "Количество раундов до рестарта.", FCVAR_NONE, true, 4.0);
    HookEvent("round_end", OnRoundEnd);
    HookConVarChange(g_hAutoRestartRounds, ConVarChanges);
    HookConVarChange(g_hAutoRestartEnabled, ConVarChanges);
    decl String:fileSound[128];
    Format(fileSound, sizeof(fileSound), "sound/%s", soundFile);
    AddFileToDownloadsTable(fileSound);
    PrecacheSound(soundFile, true);
}

public OnConfigsExecuted()
{
    g_iWins = GetConVarInt(g_hAutoRestartRounds);
    g_bEnabled = GetConVarBool(g_hAutoRestartEnabled);
}

public Action:OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    if(g_bEnabled)
    {
        new ScoreT = GetTeamScore(2), ScoreCT = GetTeamScore(3);
        if(ScoreT == g_iWins-2 || ScoreCT == g_iWins-2)
            PrintToChatAll("\x07FF0000Внимание! \x0700FF00Осталось 2 победы одной из команд до рестарта игры.");
        else if(ScoreT == g_iWins-1 || ScoreCT == g_iWins-1)
            PrintToChatAll("\x07FF0000Внимание! \x0700FF00Осталась 1 победа одной из команд до рестарта игры.");
        else if(ScoreT == g_iWins || ScoreCT == g_iWins)
        {
            ServerCommand ("mp_restartgame 5");
            PrintToChatAll("\x07FF0000Внимание! \x0700FF00Достигнут лимит побед. Будет произведен рестарт игры");
            for(new i = 1; i <= MaxClients; i++)
                if(IsClientInGame(i) && !IsFakeClient(i))
                    ClientCommand(i, "playgamesound %s", soundFile);
        }
    }
}

public ConVarChanges(Handle:convar, const String:oldValue[], const String:newValue[])
{
    if(convar == g_hAutoRestartRounds)
        g_iWins = GetConVarInt(g_hAutoRestartRounds);
    if(convar == g_hAutoRestartEnabled)
        g_bEnabled = GetConVarBool(g_hAutoRestartEnabled);
}
Есть желающие оптимизировать, пожалуйста
 
  • Мне нравится
Реакции: R1KO

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #3
В данном случае нужно так:
PHP:
#include <sourcemod>
#include <sdktools>

#define SOUND "ambient/misc/brass_bell_c.wav"

new Handle:g_hAutoRestartRounds = INVALID_HANDLE,
    Handle:g_hAutoRestartEnabled = INVALID_HANDLE,
    bool:g_bEnabled = true,
    g_iWins;

public Plugin:myinfo =
{
    name = "Autorestartgame",
    author = "R1KO",
    description = "Автоматический рестарт при достижении лимита побед",
    version = "1.1"
};

public OnPluginStart()
{
    g_hAutoRestartEnabled = CreateConVar("sm_autorestartgame_enabled", "1", "Вкл/Выкл плагин.", FCVAR_NONE, true, 0.0, true, 1.0);
    g_hAutoRestartRounds = CreateConVar("sm_autorestartgame_round", "50", "Количество раундов до рестарта.", FCVAR_NONE, true, 4.0);
    g_iWins = GetConVarInt(g_hAutoRestartRounds);
    g_bEnabled = GetConVarBool(g_hAutoRestartEnabled);
    HookConVarChange(g_hAutoRestartRounds, ConVarChanges);
    HookConVarChange(g_hAutoRestartEnabled, ConVarChanges);
    decl String:fileSound[128];
    FormatEx(fileSound, sizeof(fileSound), "sound/%s", SOUND);
    AddFileToDownloadsTable(fileSound);
    PrecacheSound(SOUND, true);
    HookEvent("round_end", Event_OnRoundEnd);
}

public Event_OnRoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
{
    if(g_bEnabled)
    {
        new ScoreT = GetTeamScore(2), ScoreCT = GetTeamScore(3);
        if(ScoreT == g_iWins || ScoreCT == g_iWins)
        {
            ServerCommand ("mp_restartgame 5");
            PrintToChatAll("\x07FF0000Внимание! \x0700FF00Победили %s", (ScoreCT > ScoreT) ? "\x0799CCFFКонтр-террористы": "\x07FF4040Террористы");
            for(new i = 1; i <= MaxClients; i++)
                if(IsClientInGame(i) && !IsFakeClient(i))
                    ClientCommand(i, "playgamesound %s", SOUND);
        }
    }
}

public ConVarChanges(Handle:convar, const String:oldValue[], const String:newValue[])
{
    if(convar == g_hAutoRestartRounds) g_iWins = GetConVarInt(g_hAutoRestartRounds);
    if(convar == g_hAutoRestartEnabled) g_bEnabled = GetConVarBool(g_hAutoRestartEnabled);
}
 
Последнее редактирование:

skynet2040

Участник
Сообщения
51
Реакции
1
Спасибо огромное )))) Выручил))

Добавлено через 52 секунды
:beer::victory:
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #7
The End Is Near..., каким образом?
 

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Где то слышал что вместо #define лучше const
#define типо старый вариант что ли.
PHP:
            for(new i = 1; i <= MaxClients; i++)
                if(IsClientInGame(i) && !IsFakeClient(i))
                    ClientCommand(i, "playgamesound %s", SOUND);
Переписал бы так:
PHP:
for(new i = 1; i <= MaxClients; i++)
{
    if (!IsClientInGame(i) || IsFakeClient(i))
    {
        continue;
    }
    ClientCommand(i, "playgamesound %s", SOUND);
}
PHP:
decl String:fileSound[128];
Переписал бы так (Так как есть спец. размерность массива для таких случаев)
PHP:
decl String:fileSound[PLATFORM_MAX_PATH];
Хм :
PHP:
HookEvent("round_end", OnRoundEnd);
PHP:
public:Action OnRoundEnd()
PHP:
#include <sdktools>
Переписал бы так:
PHP:
#include <sdktools_stringtables>
PHP:
#include <sourcemod>
не надо теперь компилятор автоматически подключает это.
 
Последнее редактирование:
  • Мне нравится
Реакции: R1KO

FrozDark

Участник
Сообщения
1,769
Реакции
2,050
Где то слышал что вместо #define лучше const
#define типо старый вариант что ли.

$define используется только при компиляции и не использует память во время работы плагина. Т.е.
PHP:
#define SOUND "misc/music.mp3"

EmitSoundToAll(SOUND);
после компиляции будет вида
PHP:
EmitSoundToAll("misc/music.mp3");
просто заменяет значение при компиляции

PHP:
            for(new i = 1; i <= MaxClients; i++)
                if(IsClientInGame(i) && !IsFakeClient(i))
                    ClientCommand(i, "playgamesound %s", SOUND);
Переписал бы так:
PHP:
for(new i = 1; i <= MaxClients; i++)
{
    if (!IsClientInGame(i) || IsFakeClient(i))
    {
        continue;
    }
    ClientCommand(i, "playgamesound %s", SOUND);
}
а что изменилось? Оптимальнее не стало, просто становится яснее человеку

PHP:
#include <sdktools>
Переписал бы так:
PHP:
#include <sdktools_stringtables>
плохая затея, подключая только sdktools_stringtables, плагин не будет заставлять само расширение SDKTools загрузиться. И не будет знать загружено ли само расширение. Т.е. игнорируется код в конце sdktools.inc
PHP:
public Extension:__ext_sdktools = 
{
	name = "SDKTools",
	file = "sdktools.ext",
#if defined AUTOLOAD_EXTENSIONS
	autoload = 1,
#else
	autoload = 0,
#endif
#if defined REQUIRE_EXTENSIONS
	required = 1,
#else
	required = 0,
#endif
};
Но это расширение в основном загружается многими другими плагинами
PHP:
#include <sourcemod>
не надо теперь компилятор автоматически подключает это.
Надо или не надо, легче от этого не будет
 

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
Вопрос по теме, что ознчает сторока в файле
#define PLUGIN_REQUIRE
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #12
Vit_ amin, что все инклюды, которые будут подключены дальше, не обязательные.

Например:
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <dbi>
#include <basecomm>
#undef REQUIRE_PLUGIN // всё, что ниже - не обязательно для работы.
#include <adminmenu>

Если не будет basecomm или любого другого инклюда, плагин не запустится.
А вот если не будет adminmenu, то запустится.
Но работа плагина уже обеспечивается через LibraryExists
 
Последнее редактирование:

skynet2040

Участник
Сообщения
51
Реакции
1
Рико ! А у тебя случаем не завалялось плагина, такого чтоб админы простые могли биндом простым включать общий чат, ну тыпо была команда sm_alltalk а то сейчас только я могу биндом включить чат и то только sm_rcon sv alltalk . А у них нет доступа к ркон.
 

FrozDark

Участник
Сообщения
1,769
Реакции
2,050
Vit_ amin, что все инклюды, которые будут подключены дальше, не обязательные.

Например:
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <sdktools>
#include <dbi>
#include <basecomm>
#undef REQUIRE_PLUGIN // всё, что ниже - не обязательно для компиляции.
#include <adminmenu>

Если не будет basecomm или любого другого инклюда, плагин не скомпилируется.
А вот если не будет adminmenu, то скомпилируется.
Но работа плагина уже обеспечивается через LibraryExists

все скомпилируется, просто если не будет плагина, для кого и предназначена библиотека adminmenu, плагин работать не будет (т.е. без работы плагина adminmenu его нативы использовать нельзя)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #15
все скомпилируется, просто если не будет плагина, для кого и предназначена библиотека adminmenu, плагин работать не будет (т.е. без работы плагина adminmenu его нативы использовать нельзя)

Может я попутал. Скомпилится, но стартовать плагин без них не будет.

Тоесть если написано
PHP:
#undef REQUIRE_PLUGIN
#include <basecomm>
а инклюда не будет - он запуститcя.
 
Последнее редактирование:

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
R1KO
1. Можно обойтись без g_bEnabled

2. По-моему, использование GetTeamScore затрачивает больше, чем банальный подсчет побед

3. Функции AddFileToDownloadsTable и PrecacheSound не используют при старте плагина
 

Vit_ amin

Добрая душа
Сообщения
1,504
Реакции
660
R1KO
1. Можно обойтись без g_bEnabled

2. По-моему, использование GetTeamScore затрачивает больше, чем банальный подсчет побед

3. Функции AddFileToDownloadsTable и PrecacheSound не используют при старте плагина
Ты имеешь ввиду через new wins =GetEventInt(event, "winner") узнавать победителя и прибавлять к переменной wins += 1 после составлять условие ?
 

FrozDark

Участник
Сообщения
1,769
Реакции
2,050
2. По-моему, использование GetTeamScore затрачивает больше, чем банальный подсчет побед
а вдруг счет обнулился командой mp_restartgame или изменился сторонним плагином?
В этом случае GetTeamScore гарантирует дать точный счет.
 
Сверху Снизу