Таймеры или Убийство Людей в конце раунда

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

  1. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    И снова здравствуйте!))
    В общем, очень давно уже пытаюсь сделать плагин Zombie Reloaded убивающий живых людей если время раунда вышло, но в первом моем коде, на тестовом сервере все норм, на котором надо не пашет, второй код, тоже самое, хотя и получился гораздо проще, сейчас я уже близок к истине, но есть баги, такие как убийство после начала раунда, или чуть раньше чем надо.....
    Короче я уже не могу))) Придется выложить код, чтобы разобраться, хотя мне этого не очень хочется))

    PHP:
    public OnPluginStart()   
    {
        
    HookEvent("round_freeze_end"RoundStart);
        
    HookEvent("round_end"roundend);
        
    HookEvent("player_spawn"pspawn);
    }   

    public 
    Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)   
    {    
        
        
    getroundtime = (GetConVarFloat(FindConVar("mp_roundtime"))*60.0);
        
        
    fakeround = (getroundtime 2.0);
        
        
    timekill =false;
        
        for(new 
    1<= MaxClientsj++)
        {
            if (
    IsClientInGame(j))
            {
                if (
    IsPlayerAlive(j))
                {
                    
                    
    TimerKill[j] = CreateTimer(fakeroundKillj);
                    
    PrintToChat (j"Timer");
                }
            }
        }

        
        
    PrintToChatAll ("getroundtime %f"getroundtime);
        
    PrintToChatAll ("fakeround %f",fakeround);
    }   

    public 
    pspawn(Handle:event,const String:name[],bool:dontBroadcast
    {
        new 
    client GetClientOfUserId(GetEventInt(event"userid"));
        
        if (
    IsClientInGame(client)) 
            { 
                if (
    IsPlayerAlive(client))
                {
                    if (
    ZR_IsClientHuman(client))
                    {
                        if (
    TimerKill[client] != INVALID_HANDLE) { 
                            
    KillTimer(TimerKill[client]); 
                            
    TimerKill[client] = INVALID_HANDLE;
                        }
                    }
                }
            }
    }

    public 
    ActionKill(Handle:timeranyclient)   
    {
        
    KillHumans();
    }

    KillHumans()
    {
        
    KillAllTimers();
        if (
    timekill == true)
        {
            for(new 
    1<= MaxClientsi++)  
            {
                if (
    IsClientInGame(i)) 
                { 
                    if (
    IsPlayerAlive(i))
                    {
                        if(
    ZR_IsClientZombie(i))
                        {
                            
    SlapPlayer(i0false);
                            
    PrintToChat(i,"Slap 0");
                        }else
                        {
                            
    SlapPlayer(i300false);
                            
    PrintToChat(i,"Slap 300");
                        }
                        
                    }
                }
            }
        }
    }

    KillAllTimers()
    {
        for(new 
    1<= MaxClientsc++)  
        {
            if (
    IsClientInGame(c)) 
            { 
                if (
    IsPlayerAlive(c))
                {
                    if (
    TimerKill[c] != INVALID_HANDLE) { 
                    
    KillTimer(TimerKill[c]); 
                    
    TimerKill[c] = INVALID_HANDLE;
                    }
                }
            }
        }
        
        
    timekill true;
    }


    public 
    roundend(Handle:event, const String:name[], bool:dontBroadcast
    {
        
    KillAllTimers();
    }

    public 
    OnClientDisconnect(client)
    {
        if (
    TimerKill[client] != INVALID_HANDLE) { 
            
    KillTimer(TimerKill[client]); 
            
    TimerKill[client] = INVALID_HANDLE;
        }
    }


    Тамеры меня доканали, надо с ними разобраться че кого, также у меня есть другой плагин , суть которого заключается в том, что зомбы имеют один Отравленный дротик(мое название:) ) , который они кидают в человека, при этом у жертвы, искажается экран, меняется разными цветами, НО и очень больше НО очень часто бывает что если тебя травят, то эфект искажения то появляется то исчезает, либо вообще сам эфект отравления мелькнет на секунду и все, как будто таймер запустился и тут же убился...
     
  2. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    помоему проще будет так:

    PHP:
    new Handle:TimerToRoundEnd;

    public 
    OnPluginStart()
    {    
        
    HookEvent("round_start"RoundStart);
    }

    public 
    Action:RoundStart(Handle:event, const String:name[], bool:dontBroadcast)    

        if (
    TimerToRoundEnd != INVALID_HANDLE)
        {
            
    CloseHandle(TimerToRoundEnd);
            
    TimerToRoundEnd INVALID_HANDLE;
        }
        
    TimerToRoundEnd CreateTimer((GetConVarFloat(FindConVar("mp_roundtime")) * 60.0) - GetConVarFloat(FindConVar("mp_freezetime")), OnTimerToRoundEnd);
    }

    public 
    Action:OnTimerToRoundEnd(Handle:timer)
    {
        for (new 
    i=1;i<=256;i++)
        {
            if (
    IsClientInGame(i))
            {
                if (
    GetClientTeam(i) == 3)
                {    
                    
    ForcePlayerSuicide(i);
                }            
            }
        }
    }

    должно работать))
     
  3. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Должно но не обязано, не все так, просто....
    Это зомби мо а не простая контра...как пишет автор мода, там не полностью идет преобразование из контра в тера или из тера коньтра, т.е. если ты был в начале раунда тером, кто-то стал зомбов и ты видишь себя в списке КТ, то это далеко на значит что, ты КТ)))
    По моду есть Люди, а есть Зомби...
    Тем более я пробывалс получением команды клиента, убивал всех
    Вы не поняли суть вопроса, не важно каким методом убивать людей, важно сделать правильный расчет таймера, его чистку и создание....
    Также если вы расчитаете полностью время раунда, возможно он и убьет людей,но победа будет за людьми...следовательно, надо убивать на 1-2 секунды раньше чем время кончится....(на данный момент если кончилось время раунда автоматически побеждают люди, но на ЗЕ картах это глупо)
     
  4. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    тогда юзай TerminateRound(0.0, 9); - точно как юзать не помню, но вот эта ф-ция устраивает победу в раунде одной из команд. (8 - контры выигрывают, 9 - теры)
     
  5. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    я тем более не знаю как юзать))
     
  6. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    PHP:
    enum CSRoundEndReason
    {
        
    CSRoundEnd_TargetBombed 0,           // Target Successfully Bombed!
        
    CSRoundEnd_VIPEscaped,                 // The VIP has escaped!
        
    CSRoundEnd_VIPKilled,                  // VIP has been assassinated!
        
    CSRoundEnd_TerroristsEscaped,          // The terrorists have escaped!
        
    CSRoundEnd_CTStoppedEscape,            // The CTs have prevented most of the terrorists from escaping!
        
    CSRoundEnd_TerroristsStopped,          // Escaping terrorists have all been neutralized!
        
    CSRoundEnd_BombDefused,                // The bomb has been defused!
        
    CSRoundEnd_CTWin,                      // Counter-Terrorists Win!
        
    CSRoundEnd_TerroristWin,               // Terrorists Win!
        
    CSRoundEnd_Draw,                       // Round Draw!
        
    CSRoundEnd_HostagesRescued,            // All Hostages have been rescued!
        
    CSRoundEnd_TargetSaved,                // Target has been saved!
        
    CSRoundEnd_HostagesNotRescued,         // Hostages have not been rescued!
        
    CSRoundEnd_TerroristsNotEscaped,       // Terrorists have not escaped!
        
    CSRoundEnd_VIPNotEscaped,              // VIP has not escaped!
        
    CSRoundEnd_GameStart                   // Game Commencing!
    };
    Вот сама функция. Не пойму, чё сложного то?

    А с дротиками что не получается? Тебе объяснить как делать? Создаёш летящий дротик, хукаеш его через SDKHook_StartTouch, если попал в кого надо, то шейк и оверлей какой-нибудь наложить можно. Ну или через фейд озеленить монитор виктиму или ещё что-нибудь на подобе.
     
    TheRunningMan нравится это.
  7. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    нет дротики я уже давно сделал))просто с таймерами там проблемы блыи, щас вроде ошибок не выдает, надо на серваке потестить....
    А вообще у меня эфект у жертвы такой: цвета меняются, экран эскажен и стянут в цетр и трясется экран, еще звук добавлю, такойже как при заражении людей, чтоб немного побоялся)))

    Добавлено через 3 минуты
    И кстати мы даже просили нам написать такой плагин, вот этого типА neatek, но че то он не смог))также просили SideX стату то корявую написал, она работает но хренова...вот так...

    Добавлено через 42 минуты
    Можете мне объяснить еще на счет таймеро НЕповторяющихся, их вообще нужно убивать, вот я это делаю и в консоли сервера всегда на это указывается типо, убивается таймер который уже убит?
     
    Последнее редактирование: 23 мар 2012
  8. neatek

    neatek

    Сообщения:
    442
    Симпатии:
    233
    Эт ты спецом написал чтоб меня задеть? У меня багаж стал больше, насчет ZR. Видимо тебе уже помогли ,если нет пиши в скайп [​IMG]
     
  9. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Да, нет просто говорю как было))
    Я видел твои плагины... А скайпа нет у меня))
     
  10. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Ты вопрос ставь более понятно. Если таймер не убивать, то он будет срабатывать, и срабатывать будет не обязательно в том раунде, в котором он был запущен. Честно, не знаю правильно ли это, но я в коллбеках таймеров присваиваю таймерам INVALID_HANDLE, потому-что зачастую таймеры после срабатывания не равны INVALID_HANDLE тобиш 0, и при попытке убить сработавшие таймеры сразу начинает засирать логи.
     
  11. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Ну вот я создал как только начался раунд таймер на 10 секунд например, после которых например напишет в чат "прошло 10 секунд", если раунд закончился тут же после того как начился, то в следующем раунде получается в чат напишется "прошло 10 секунд" еще до начала раунда (началом раунда я счтаю когда прошло фризитайм) так?
    Для это в событии round_end я пишу если таймер не INVALID_HANDLE, то убить таймер и присвоить ему INVALID_HANDLE, это правильно?
     
  12. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Да, но если таймер успел сработать, то его значение не обязательно равно INVALID_HANDLE, и в таком случае в хуке евента round_end ты пытаешся убить сработавший таймер.
     
  13. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    Тогда в консоли сервера будет ошибка, как тогда быть?
     
  14. Игорь Охремчук

    Игорь Охремчук Админ uaplayer.com

    Сообщения:
    243
    Симпатии:
    366
    Я уже сказал, добисать в коллбек таймера

    PHP:
    if (TimerKill[client] != INVALID_HANDLE
    {  
        
    KillTimer(TimerKill[client]);  
        
    TimerKill[client] = INVALID_HANDLE
    }
     
  15. TheRunningMan

    TheRunningMan

    Сообщения:
    163
    Симпатии:
    9
    ну
    я же так и написал если не равено то ....
    Я также писал в других плагинах мне все равно писалось что таймер уже убит и указывад на строчку KIllTimer