Помогите доделать плагин.

N

nightcore

Собственно, что нужно:
1. Не важно кто ставил матч на паузу, сервер или админ, нужно чтобы после !unpause или по истечение времени на паузу нельзя было опять поставить сервер на паузу в течение 90 секунд.
2. Таймер идёт во время раунда, а не пока матч на паузе. То есть, я могу запросить командой !pause поставить сервер на паузу. 90 секунд, после которых сервер должен сняться с паузы, длятся с того момента, как я ввёл команду, а не пока мы стоим каждый на своей респе. Я ради прикола ставил 5 секунд и во время матча ставил на паузу. Написал !pause во время раунда и через 5 секунд пишет, что пауза снята.
3. Когда я последний раз тестил этот плагин, у меня в каком-то моменте было так, что матч сначала можно поставить, а второй раз нет, ничего не происходит даже. Не помню что делал, правда. Может найдете ошибку.
C-подобный:
public OnPluginStart()
{
    RegAdminCmd("sm_pause", pause_on, ADMFLAG_SLAY, "Pause the match");
    RegAdminCmd("sm_unpause", pause_off, ADMFLAG_SLAY, "Unpause the match");
}

public Action:pause_on(client, args)
{  
    if (!allowed)
    {
        if (IsPaused())
        {
            PrintToChat(client, "[SM] Матч и так стоит на паузе.");
           return Plugin_Handled;
        }
        if (g_PauseTimer[client] != INVALID_HANDLE)
        {
            PrintToChat(client, "[SM] Паузу можно ставить 1 раз в 1.5 минуты!");
            return Plugin_Handled;
        }
        PrintToChatAll("[SM] Админ %N поставил матч на паузу. Автоматически снимется через 1.5 минуты.", client);
        allowed = true;
        ServerCommand("mp_pause_match");
        g_PauseTimer[client] = CreateTimer(TIMER_LIMIT, RemoveRestriction, client);
    }

    return Plugin_Handled;
} 

public Action:pause_off(client, args)
{
    if (allowed)
    {
        if (!IsPaused())
        {
            PrintToChat(client, "[SM] Матч не стоит на паузе.");
           return Plugin_Handled; 
        }

        PrintToChatAll("[SM] Админ %N снял матч с паузы", client);
        allowed = false;
        ServerCommand("mp_unpause_match");
        if (g_PauseTimer[client] != INVALID_HANDLE)
        {
            PrintToChat(client, "[SM] Пауза снята автоматически");
            ServerCommand("mp_unpause_match", client);
            return Plugin_Handled;
        }
    }

    return Plugin_Handled;
}

public Action:RemoveRestriction(Handle:RemoveRestriction, any:client)
{
    if (g_PauseTimer[client] != INVALID_HANDLE)
    {
        g_PauseTimer[client] = INVALID_HANDLE;
        ServerCommand("mp_unpause_match");
        allowed = false;
    }
}

stock bool:IsPaused() 
{
    return bool:GameRules_GetProp("m_bMatchWaitingForResume");
}
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
@nightcore, отсчёт запрета на установку на паузу должен начинаться с момента снятия с паузы или с момента установки на паузу?
 

Grey83

не пишу плагины с весны 2022
Сообщения
8,569
Реакции
5,071
PHP:
#include <sdktools_gamerules>

static const int TIMER_LIMIT = 90;

int nextPause;
Handle g_PauseTimer;

public void OnPluginStart()
{
    RegAdminCmd("sm_pause", pause_on, ADMFLAG_SLAY, "Pause the match");
    RegAdminCmd("sm_unpause", pause_off, ADMFLAG_SLAY, "Unpause the match");
}

public Action pause_on(int client, int args)
{
    if(!client) return Plugin_Handled;

    if(GetTime() < nextPause)
    {
        if(IsPaused()) ShowActivity2(client, "[SM] ", "Матч и так стоит на паузе.");
        else ShowActivity2(client, "[SM] ", "Паузу можно ставить 1 раз в 1.5 минуты!");
    }
    else StartPause(client);

    return Plugin_Handled;
}

stock void StartPause(int client)
{
    ShowActivity2(client, "[SM] ", "Админ %N поставил матч на паузу. Автоматически снимется через 1.5 минуты.", client);
    g_PauseTimer = CreateTimer(TIMER_LIMIT+0.0, RemoveRestriction, client);
    ServerCommand("mp_pause_match");
}

public Action RemoveRestriction(Handle RemoveRestriction, any client)
{
    EndPause(0 - client);
}

public Action pause_off(int client, int args)
{
    if(!client) return Plugin_Handled;

    if(!IsPaused()) PrintToChat(client, "[SM] Матч не стоит на паузе.");
    else EndPause(client);

    return Plugin_Handled;
}

stock void EndPause(client)
{
    if(g_PauseTimer != null)
    {
        g_PauseTimer = null;
        KillTimer(g_PauseTimer);
    }

    nextPause = GetTime() + TIMER_LIMIT;

    if(client < 0) ShowActivity2(0 - client, "[SM] ", "Пауза снята автоматически");
    else ShowActivity2(client, "[SM] ", "Админ %N снял матч с паузы", client);
    ServerCommand("mp_unpause_match");
}

stock bool IsPaused()
{
    return GameRules_GetProp("m_bMatchWaitingForResume") > 0;
}
//// pause.sp
//
// Code size: 4144 bytes
// Data size: 2804 bytes
// Stack/heap size: 16384 bytes
// Total requirements: 23332 bytes
//
// Compilation Time: 0,27 sec
// ---------------------------------
 

Вложения

  • pause.sp
    1.7 КБ · Просмотры: 2
  • pause.smx
    4.9 КБ · Просмотры: 3
Сверху Снизу