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

Тема в разделе "Программирование / Скриптинг", создана пользователем 8Ahnenerbe8, 13 июн 2016.

  1. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
    Как сделать так,чтобы функция g_bClientPractising[client] = false; выполнялась только через 3 секунды?
    PHP:
    if ( g_iClientState[client] == STATE_START )   
        {   
            
    g_bClientPractising[client] = false;
        }
     
  2. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
  3. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.590
    Симпатии:
    1.995
  4. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
    @AlmazON, там не все так просто для меня.
    Там вот такой код,я не могу понять как туда таймер прикрутить.(Я вырезал из плагина огрызки кода)
    PHP:
    public void OnClientPutInServerint client )
    {
     
        
    SDKHookclientSDKHook_PostThinkPostEvent_PostThinkPost_Client );
        
    SDKHookclientSDKHook_PreThinkPostEvent_PreThinkPost_Client );
    }
    public 
    void OnClientDisconnectint client )
    {
        
    SDKUnhookclientSDKHook_PreThinkPostEvent_PreThinkPost_Client );
        
    SDKUnhookclientSDKHook_PostThinkPostEvent_PostThinkPost_Client );
    }
    public 
    void Event_PostThinkPost_Clientint client )
    {
        if ( 
    g_iClientState[target] == STATE_START )
        {
           
    g_bClientPractising[client] = false;
        }

     
  5. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.590
    Симпатии:
    1.995
    Сюда. Нужно сброс переменной сделать через 3 секунды, если условие if ( g_iClientState[target] == STATE_START ) верно?
     
  6. 8Ahnenerbe8

    8Ahnenerbe8

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

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @8Ahnenerbe8, можно через глобальный таймер который будет работать постоянно.

    Код:
    #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);
    }
     
    Последнее редактирование: 14 июн 2016
  8. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    892
    Симпатии:
    659
    то есть идея какая, он должен простоять 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.0OnTimerStartclient);
        }
    }

    public 
    Action:OnTimerStart(Handle:hTimerany: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]);
        }
    }
    --- Добавлено позже ---
    твой код не проверят, где находится игрок, то есть если он включит ноклип, то через 5 секунд будет false у переменной
     
    Последнее редактирование: 14 июн 2016
  9. Hejter

    Hejter Mapper Source Engine

    Сообщения:
    1.771
    Симпатии:
    259
    @The End Is Near..., я и не добавил проверку где и что он делает, я лишь дал пример готового таймера, как можно сделать.