подскажите с условием

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
Как сделать так,чтобы функция g_bClientPractising[client] = false; выполнялась только через 3 секунды?
PHP:
if ( g_iClientState[client] == STATE_START )   
    {   
        g_bClientPractising[client] = false;
    }
 

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
@AlmazON, там не все так просто для меня.
Там вот такой код,я не могу понять как туда таймер прикрутить.(Я вырезал из плагина огрызки кода)
PHP:
public void OnClientPutInServer( int client )
{
 
    SDKHook( client, SDKHook_PostThinkPost, Event_PostThinkPost_Client );
    SDKHook( client, SDKHook_PreThinkPost, Event_PreThinkPost_Client );
}
public void OnClientDisconnect( int client )
{
    SDKUnhook( client, SDKHook_PreThinkPost, Event_PreThinkPost_Client );
    SDKUnhook( client, SDKHook_PostThinkPost, Event_PostThinkPost_Client );
}
public void Event_PostThinkPost_Client( int client )
{
    if ( g_iClientState[target] == STATE_START )
    {
       g_bClientPractising[client] = false;
    }
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
public void Event_PostThinkPost_Client( int client )
{
if (
g_iClientState[target] == STATE_START )
{
g_bClientPractising[client] = false;
}
}
Сюда. Нужно сброс переменной сделать через 3 секунды, если условие if ( g_iClientState[target] == STATE_START ) верно?
 

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
@AlmazON, да.
Введу в курс дела немного.
У меня есть плагин таймера для сервера.Когда включаешь,например,ноклип,человека перекидывает в практический режим,то есть,если он дойдет до финиша,то время просто не засчитается,грубо говоря таймер сбросится и рекорда не будет.
Чтобы выйти из этого режима нужно прописывать команду sm_prac,это как-то неудобно,поэтому я сделал условие if ( g_iClientState[target] == STATE_START ) ,это условие проверяет,находится ли клиент в зоне старта или нет.
Если находится,то с него снимается практический режим.(g_bClientPractising[client] = false;)
Но мне нужно,чтобы практический режим снимался только через 3 секунды,после того,как игрок войдет в зону старта.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@8Ahnenerbe8, можно через глобальный таймер который будет работать постоянно.

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#define TIMER 5

int int_timer[MAXPLAYERS + 1];
bool g_bClientPractising[MAXPLAYERS + 1];

public void OnPluginStart(){
    CreateTimer(1.0, OnEverySecond, _, TIMER_REPEAT);
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public Action OnEverySecond(Handle timer)
{
    for (int client = 1; client <= MaxClients; client++)
    {
        if (IsValid(client) && g_bClientPractising[client])
        {
            StartPractising(client);
        }
    }
}

stock bool StartPractising(int client)
{
    if (int_timer[client] > 0)
    {
        int_timer[client]--;
        PrintHintText(client, "<font color='#ff0000'>Практический режим выключится через %d</font>", int_timer[client]);
    }
   
    else if (int_timer[client] == 0)
    {
        g_bClientPractising[client] = false;
        Reset_Var(client);
    }
}

stock bool IsValid(int client)
{
    if (0 < client && client <= MaxClients && IsClientInGame(client) && IsPlayerAlive(client))
    {
        return true;
    }
    else return false;
}

stock bool Reset_Var(int client)
{
    int_timer[client] = TIMER;
}

public void OnClientPutInServer(int client)
{   
    Reset_Var(client);
}

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    Reset_Var(client);
}
 
Последнее редактирование:

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
то есть идея какая, он должен простоять 3 секунды на старте, иначе переменная значение не изменит, этого можно избежать, если в убирать ноклип принудительно, тогда игрок сможет лишь коснуться старта, а далее проходить карту
PHP:
new Handle:g_hClientTimer[MAXPLAYERS + 1] = {INVALID_HANDLE, ...};

public Event_PostThinkPost_Client(client)
{
    if (g_iClientState[client] == STATE_START)
    {
        Function_TimerKill(client);

        g_hClientTimer[client] = CreateTimer(3.0, OnTimerStart, client);
    }
}

public Action:OnTimerStart(Handle:hTimer, any:iClient)
{
    // думаю, тут можно даже не проверять, на старте игрок или нет, т.к. если не на старте, таймер будет убит
    g_bClientPractising[iClient] = false;
    g_hClientTimer[iClient] = INVALID_HANDLE;
}

public OnClientDisconnect(iClient)
{
    Function_TimerKill(iClient);
    g_hClientTimer[iClient] = INVALID_HANDLE;
}

stock Function_TimerKill(iClient)
{
    if (g_hClientTimer[iClient] != INVALID_HANDLE)
    {
        KillTimer(g_hClientTimer[iClient]);
    }
}
--- Добавлено позже ---
@8Ahnenerbe8, можно через глобальный таймер который будет работать постоянно.

C-подобный:
#pragma semicolon 1
#pragma newdecls required

#define TIMER 5

int int_timer[MAXPLAYERS + 1];
bool g_bClientPractising[MAXPLAYERS + 1];

public void OnPluginStart(){
    CreateTimer(1.0, OnEverySecond, _, TIMER_REPEAT);
    HookEvent("player_spawn", Event_PlayerSpawn);
}

public Action OnEverySecond(Handle timer)
{
    for (int client = 1; client <= MaxClients; client++)
    {
        if (IsValid(client) && g_bClientPractising[client])
        {
            StartPractising(client);
        }
    }
}

stock bool StartPractising(int client)
{
    if (int_timer[client] > 0)
    {
        int_timer[client]--;
        PrintHintText(client, "<font color='#ff0000'>Практический режим выключится через %d</font>", int_timer[client]);
    }
  
    else if (int_timer[client] == 0)
    {
        g_bClientPractising[client] = false;
        Reset_Var(client);
    }
}

stock bool IsValid(int client)
{
    if (0 < client && client <= MaxClients && IsClientInGame(client) && IsPlayerAlive(client))
    {
        return true;
    }
    else return false;
}

stock bool Reset_Var(int client)
{
    int_timer[client] = TIMER;
}

public void OnClientPutInServer(int client)
{  
    Reset_Var(client);
}

public void Event_PlayerSpawn(Event event, const char[] name, bool dontBroadcast)
{
    int client = GetClientOfUserId(event.GetInt("userid"));
    Reset_Var(client);
}
твой код не проверят, где находится игрок, то есть если он включит ноклип, то через 5 секунд будет false у переменной
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
@The End Is Near..., я и не добавил проверку где и что он делает, я лишь дал пример готового таймера, как можно сделать.
 
Сверху Снизу