Остановка повторяющегося таймера.

Тема в разделе "Программирование / Скриптинг", создана пользователем Primo, 20 авг 2014.

  1. Primo

    Primo Где мои манеры

    Сообщения:
    1.192
    Симпатии:
    310
    Имется простой код граба, который, возможно, с ошибками.
    Нужно отключить по команде Ungrab повторяющийся таймер.
    Я не уверен в том, что KillTimer останавливает таймер, т.к. после нескольких использований граба начинают подлагивать модели, точнее начинают дёргаться ноги в стороны.
    PHP:
    #include <sourcemod>
    #include <sdktools>
    #include <smlib>
    #include <sdkhooks>

    new Float:difference[MAXPLAYERS+1][3];

    new 
    Handle:Timer1;

    new 
    entitygrabbed[MAXPLAYERS+1];



    public 
    Plugin:myinfo 

        
    name "dP_BaseBuilder"
        
    author "Primo"
        
    description "Other Mod"
        
    version "1.1"


    public 
    OnPluginStart() 
    {
        
    RegConsoleCmd("grab"OnGrab);
        
    RegConsoleCmd("ungrab"OnUngrab);
    }


    public 
    Action:OnUngrab(clientargs)
    {
        new 
    Float:vec[3] = {0.10.10.1};
        
    TeleportEntity(entitygrabbed[client], NULL_VECTORNULL_VECTORvec);
        
    entitygrabbed[client] = -1;
        
    KillTimer(Timer1);
        
    }

    stock TraceClientViewEntity(this)
    {
        new 
    Float:m_vecOrigin[3];
        new 
    Float:m_angRotation[3];
        
    GetClientEyePosition(thism_vecOrigin);
        
    GetClientEyeAngles(thism_angRotation);
        new 
    Handle:tr TR_TraceRayFilterEx(m_vecOriginm_angRotationMASK_VISIBLERayType_InfiniteTRDontHitSelfthis);
        new 
    pEntity = -1;
        if (
    TR_DidHit(tr))
        {
            
    pEntity TR_GetEntityIndex(tr);
            
    CloseHandle(tr);
            return 
    pEntity;
        }
        
    CloseHandle(tr);
        return -
    1;
    }

    public 
    bool:TRDontHitSelf(entitymaskany:data)
    {
        if (
    entity == data) return false;
        return 
    true;
    }

    public 
    Action:OnGrab(clientargs)
    {
        if(
    GetUserFlagBits(client) & ADMFLAG_KICK)
        {
            new 
    ent TraceClientViewEntity(client);
            new 
    String:clEnt[50];
            
    GetEntityClassname(entclEntsizeof(clEnt));
            
    decl Float:playerAng[3];
            
    decl Float:propAng[3];
            
    GetClientEyeAngles(clientplayerAng);
            
    Entity_GetAbsAngles(entpropAng);
            
    entitygrabbed[client] = ent;

            
    SubtractVectors(playerAngpropAngdifference[client]);
            
    Timer1 CreateTimer(0.1OnPreThinkSclientTIMER_REPEAT);
        }
    }

    public 
    Action:OnPreThinkS(Handle:timerany:client)
    {
        
        new 
    entity entitygrabbed[client];
        new 
    Float:clvec[3],Float:clpos[3], Float:entpos[3], Float:clang[3];
                    
        
    GetClientAbsOrigin(clientclpos);
            
        
    GetClientEyeAngles(clientclang);
        
        
    GetAngleVectors(clangclvecNULL_VECTORNULL_VECTOR);
        
    // update object 
        
    clpos[0] += clvec[0]*100;
        
    clpos[1] += clvec[1]*100;
        
    clpos[2] += clvec[2]*100;
        
    Entity_GetAbsOrigin(entityentpos);
                    
        
    SubtractVectors(clposclvecentpos);
                    
        
    ScaleVector(entpos260.0);
        
    TeleportEntity(entityclposclangNULL_VECTOR);
        
    }
     
  2. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.999
    Симпатии:
    2.992
    Таймер то останавливается, но таймер твой расчитан на 1-го игрока, не на несколько.
     
  3. Primo

    Primo Где мои манеры

    Сообщения:
    1.192
    Симпатии:
    310
    Не осознаю в чем проблема, ведь так и задумывается, что для одного игрока, больше игроков с этим таймером не будет.

    Добавлено через 43 минуты
    Никак не фиксится тот факт, что ноги дёргаются после граба? Причем у всех, даже у тех, кого не трогали.

    Добавлено через 1 час 15 минут
    Да и таймер, похоже, не останавливается, т.к. в логи спамит ошибку постоянно.
     
    Последнее редактирование: 20 авг 2014
  4. AlmazON

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

    Сообщения:
    4.563
    Симпатии:
    1.988
    Люди, вы когда-нибудь выучите, что повторяющийся таймер не остановить через KillTimer?! Посмотрите натив, там же написано об этом! KillTimer может использоваться для закрытия Handle такого таймера и не более того!
     
  5. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.999
    Симпатии:
    2.992
    надо после KillTimer прировнять его к INVALID_HANDLE;
     
  6. Primo

    Primo Где мои манеры

    Сообщения:
    1.192
    Симпатии:
    310
    Это не меня надо было цитировать.
    Я и написал именно по этому поводу, т.е. как закрыть повторяющийся таймер :\
     
  7. AlmazON

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

    Сообщения:
    4.563
    Симпатии:
    1.988
    "Plugin_Stop to stop a repeating timer, any other value for default behavior.".
    А если сделано так, что этого не требуется, то есть ли в этом смысл? Освобождает память или нет (KillTimer разве не сделал этого в полной мере)?
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.999
    Симпатии:
    2.992
    AlmazON, как ты собираешься останавливать таймер до выполнения обратного вызова?
     
  9. AlmazON

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

    Сообщения:
    4.563
    Симпатии:
    1.988
    Чего, кого? В каком смысле? Повторяющийся таймер не будет остановлен моментально. Сначало идёт его вызов и, если переменная включения false, то не выполняя более действий - остановка. Если ты об этом. Никаких Handle зачастую и не надо, а создавать bool для каждого клиента (если нужно), приравнивая его к нужному значению. Таким образом, не нужно и закрывать (утечки памяти).
    А это я тебя спрашиваю, а не утверждаю. Не уверен, что так необходимо и наоборот.
     
    Последнее редактирование: 20 авг 2014