[CS: Source] Mapchooser RoundEndVote

Тема в разделе "Новые плагины", создана пользователем TolikCorp, 28 июл 2014.

  1. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Состряпал небольшой плагин для запуска голосования за карту не во время игры, а в конце раунда.
    Необходимое условие, чтобы было выставлено значение:
    sm_mapvote_start "3.0" или меньше
    Ver. 3.0
    PHP:
    public OnConfigsExecuted() HookEvent("round_end"Event_RoundEndEventHookMode_PostNoCopy);
    public 
    Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    mapTimeLeft;
        if(
    GetMapTimeLeft(mapTimeLeft) && mapTimeLeft 600)
        {
            
    UnhookEvent("round_end"Event_RoundEndEventHookMode_PostNoCopy);
            
    ServerCommand("sm_mapvote");
        }
    }
    Ver. 2.0
    PHP:
    new bool:doCheck true;
    public 
    OnPluginStart() HookEvent("round_end"Event_RoundEndEventHookMode_PostNoCopy);
    public 
    OnConfigsExecuted() doCheck true;
    public 
    Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        if(
    doCheck)
        {
            new 
    mapTimeLeft;
            
    GetMapTimeLeft(mapTimeLeft)
            if(
    mapTimeLeft <= 600)
            {
                
    doCheck false;
                
    ServerCommand("sm_mapvote");
            }
        }
    }  

    Ver. 1.0
    PHP:
    new bool:doRunVote false;
    new 
    bool:doCheck true;
    public 
    OnPluginStart()
        
    HookEvent("round_end"Event_RoundEnd);
    public 
    OnMapStart(){
        
    doRunVote false;
        
    doCheck true;
    }
    public 
    Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){
        if(
    doCheck){
            new 
    mapTime;
            
    GetMapTimeLimit(mapTime);
            
    mapTime=mapTime*60;
            new 
    mapTimeLeft;
            
    GetMapTimeLeft(mapTimeLeft);
            if(
    mapTimeLeft <= mapTime/3){
                
    doRunVote true;
                
    doCheck false;
            }
        }
        if(
    doRunVote){
            
    doRunVote false;
            
    doCheck false;
            
    ServerCommand("sm_mapvote");
        }
    }
     
    Последнее редактирование: 29 июл 2014
    artushonok нравится это.
  2. artushonok

    artushonok

    Сообщения:
    962
    Симпатии:
    108
    TolikCorp,
     

    Вложения:

  3. AlmazON

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

    Сообщения:
    4.566
    Симпатии:
    1.988
    TolikCorp, попробуй проще:
    PHP:
    new bool:doCheck;

    public 
    OnPluginStart() HookEvent("round_end"Event_RoundEndEventHookMode_PostNoCopy);

    public 
    OnConfigsExecuted() doCheck true;

    public 
    Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        if(
    doCheck)
        {
            new 
    mapTimeLeftmapTime;
            if(
    GetMapTimeLeft(mapTimeLeft) && GetMapTimeLimit(mapTime) && mapTimeLeft <= mapTime*60/3)
            {
                
    doCheck false;
                
    ServerCommand("sm_mapvote");
            }
        }
    }
    GetMapTimeLimit(mapTime) так то зачем вообще? Вместо этого поставить квар времени в секундах, чтобы после указанного оствшегося времени карты проводилось голосование.
     
  4. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Можно, но ты знаешь сколько у каждого стоит время карты? А тут когда остается треть времени.
     
  5. AlmazON

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

    Сообщения:
    4.566
    Симпатии:
    1.988
    А смысл знать? Если остаток всегда узнаем и контролируем?
     
  6. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Обновил
     
  7. AlmazON

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

    Сообщения:
    4.566
    Симпатии:
    1.988
    TolikCorp, максимум оптимизации:
    PHP:
    public OnConfigsExecuted() HookEvent("round_end"Event_RoundEndEventHookMode_PostNoCopy);
    public 
    Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast)
    {
        new 
    mapTimeLeft;
        if(
    GetMapTimeLeft(mapTimeLeft) && mapTimeLeft 600)
        {
            
    UnhookEvent("round_end"Event_RoundEndEventHookMode_PostNoCopy);
            
    ServerCommand("sm_mapvote");
        }
    }
     
  8. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Все же надо делать:
    0 < mapTimeLeft <= 600
    т.к. карта может быть бесконечной, а тут вдруг изменили timelimit и появился timeleft

    Добавлено через 27 минут
    хмм, смотри: а если карта сменится до этого события, допустим, админом, а тут -
    public OnConfigsExecuted() HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
    ?
     
    Последнее редактирование: 28 июл 2014
  9. AlmazON

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

    Сообщения:
    4.566
    Симпатии:
    1.988
    Так бесконечность, а не 0. Смысл тогда? Проверял, 0 вместо неё?
    На секунду разница, ничего не убудет, зато -1 байт.
    Как? С админки вообще не реально, всё уже давно загрузится в этот момент, да и не хукнется, что с того? Нам ещё лучше! Карта же всё равно меняется, так смысл всех действий на секундной карте?
    Даже, если выйдет какая-то ошибка в логах по этому поводу, всё равно, надо это событие убрать (не создавая лишних проверок до истечения 600 секунд в раундах).
     
    Последнее редактирование: 29 июл 2014
  10. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Кажется, я неправильно объяснил.
    Играем, хукаем событие. До срабатывания unhook еще далеко. А тут решил админ сменить карту, событие еще хукается, да еще раз запускатся HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy);
    что-то накладка получается
     
  11. AlmazON

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

    Сообщения:
    4.566
    Симпатии:
    1.988
    Ты проверял? После окончания карты SM сам делает все Unhook'и и CloseHandle, кроме остановки таймеров (без нужного флага).
    Нет смысла ещё проверок наставлять - это большая накладка.
     
  12. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    Работает
     
  13. AlmazON

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

    Сообщения:
    4.566
    Симпатии:
    1.988
    Проверь сначала, а потом уж говори)
    А тут что выяснил? Лишнее сравнение - тоже кроха к нагрузке.
     
  14. TolikCorp

    TolikCorp

    Сообщения:
    855
    Симпатии:
    271
    То, что работать будет - я не сомневаюсь, тут даже проверять не надо - и так видно. Не знал некоторых особенностей, и из-за них засомневался.
     
  15. Александр Черный

    Александр Черный

    Сообщения:
    1
    Симпатии:
    0