Нужен человек,который допишет плагин.

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

  1. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
    Всем привет!
    В теме "написание плагинов" The End Is Near... уже сделал основу для плагина.
    Суть плагина:выводит время в секундах до смены карты.
    Код:
    Оффтоп
    Теперь нужно сделать так, чтобы,во-первых,время выводилось в минутах:секундах.
    То есть по timeleft'у осталось 12:20 до смены,в чат выводится тоже самое число.
    Во-вторых,когда карта подходит к концу, и остаются считаные секнуды,нужно чтобы в чат выводило эти секунды.Например,до смены остается 5,4,3,2,1 - в чат выводит,соответственно,тоже самое.
    Так же,хочу чтобы вместе с сообщение,которое выводит время до смены,выводилась и текущая карта.После голосования(оно у меня за 5 минуты до конца) строчку с текующей картой убрать,а добавить строчку со следующей картой.
    Если кто-то сделает бесплатно,то хорошо,а так могу соточку на киви-кошелек накинуть.
    Мало конечно,но и плагин вроде не трудный.
    Для оптыного кодера минут 10 работы.
     
  2. White Wolf

    White Wolf [] (int _n) -> double { return (_n % 2) == 0;}); Супер-модератор

    Сообщения:
    1.186
    Симпатии:
    411
    Тогда нужно делать глобальный таймер на каждую секунду. Оффтоп
    Тестируй:
    PHP:
    #include <sourcemod>

    #define TIME 5.0

    public OnMapStart()
    {
       
    CreateTimer((TIME*60.0), Callback_Timer_TIMER_FLAG_NO_MAPCHANGE TIMER_REPEAT);
    }

    public 
    Action:Callback_Timer(Handle:hTimer)
    {
       
    decl String:sMapname[24];
       
    decl iTimeLeft;
       
    decl bool:isNextMap;
       if (
    GetMapTimeLeft(iTimeLeft) == false)
         return 
    Plugin_Stop;
      
       if (
    GetNextMap(sMapnamesizeof(sMapname)) == false)
       {
         
    GetCurrentMap(sMapnamesizeof(sMapname));
         
    isNextMap false;
       }
       else
         
    isNextMap true;
      
       if (
    iTimeLeft 0)
       {
         
    PrintToChatAll("Timeleft: %d min. %d sec.", (iTimeLeft 60) ? iTimeLeft 60 0iTimeLeft);
         
    PrintToChatAll("%s map: %s", (isNextMap) ? "Next" "Current"sMapname);
       }
      
       return 
    Plugin_Continue;
    }
     
  3. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
    @White Wolf, а в чем проблема глобального таймера на каждую секунду?
    Протестировал.
    Вместо текущей почему-то выводит следующую карту,так же еще недочет в том,что сначала выводит в чат,что осталсоь 42 минуты до смены,а потом эти же 42 минуты выводит,но в секундах.
    Может,конечно,Вы меня не так поняли,я имел ввиду,чтобы выводило ,к примеру 12 минут 9 секунд,как в плагине рекламы.
     
    Последнее редактирование: 24 май 2016
  4. White Wolf

    White Wolf [] (int _n) -> double { return (_n % 2) == 0;}); Супер-модератор

    Сообщения:
    1.186
    Симпатии:
    411
    Вызов каждую секунду не самое оптимальное решение.
     
  5. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
    @White Wolf, ну просто не есть хорошо,когда резко происходит смена карты,у меня бхоп сервер,где карта длится около часа,поэтому все-таки желательно было бы сделать эту опцию,чтобы если что игрок,имеющий доступ к продлеванию карты мог за эти 5 секунд продлить ее.
    Или же игроки были готовы к смене.
    С меня мои обещанные 100 рублей,по возможности могу еще 100 кинуть завтра/послезавтра.
    =)
    Оффтоп
     
  6. R1KO

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

    Сообщения:
    5.972
    Симпатии:
    2.977
    PHP:
    if(iTimeLeft 3600// проверка что меньше часа
    {
        if(
    iTimeLeft 60)
        {
            
    PrintToChatAll("Timeleft: %d sec."iTimeLeft);
        }
        else
        {
            
    PrintToChatAll("Timeleft: %d min. %d sec."iTimeLeft 60iTimeLeft 60);
        }
    }
     
  7. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    можно попробовать, хотел придать вид плагину, да лень чет)) проверь сначала

    за 4 минуты до конца будем получать следующую карту, т.к. хз сколько длится голосование

    upd
    PHP:
    #include <sourcemod>

    #define TIME 5

    new Handle:g_hTimer_LastTenSeconds INVALID_HANDLE;

    new 
    String:g_szFormatMap[32];

    new 
    g_iCountSeconds 0;

    public 
    OnMapStart()
    {
        
    CreateTimer(float(TIME*60), CT_OnTimerStart_TimeLeft_TIMER_FLAG_NO_MAPCHANGE TIMER_REPEAT);

        
    OnMapTimeLeftChanged();

        
    GetCurrentMap(g_szFormatMapsizeof(g_szFormatMap));
        
    Format(g_szFormatMapsizeof(g_szFormatMap), "Current Map: \x05%s"g_szFormatMap);
    }

    public 
    OnMapTimeLeftChanged()
    {
        if (
    g_hTimer_LastTenSeconds != INVALID_HANDLE)
        {
            
    KillTimer(g_hTimer_LastTenSeconds);
        }

        
    decl iTimeLeft;
        if (
    GetMapTimeLeft(iTimeLeft) == false)
        {
            return;
        }

        if (
    iTimeLeft 10)
        {
            
    g_hTimer_LastTenSeconds CreateTimer(float(iTimeLeft 10), CT_OnTimerStart_LastTenSeconds_Basic);
        }
        else if (
    iTimeLeft 300)
        {
            
    CreateTimer(float(iTimeLeft 240), CT_OnTimerStart_GetNextMap_TIMER_FLAG_NO_MAPCHANGE);
        }
    }

    public 
    Action:CT_OnTimerStart_GetNextMap(Handle:hTimer)
    {
        
    decl String:szNextMap[32];
        
    GetNextMap(szNextMapsizeof(szNextMap));

        
    Format(g_szFormatMapsizeof(g_szFormatMap), "Next Map: \x05%s"g_szFormatMap);

        return 
    Plugin_Continue;
    }

    public 
    Action:CT_OnTimerStart_TimeLeft(Handle:hTimer)
    {
        
    decl iTimeLeft;
        if (
    GetMapTimeLeft(iTimeLeft) == false)
        {
            return 
    Plugin_Stop;
        }

        if (
    iTimeLeft 0)
        {
            
    PrintToChatAll("\x01%s. Timeleft: \x05%d:%d \x01sec."g_szFormatMapiTimeLeft 60 60iTimeLeft 60);
        }

        return 
    Plugin_Continue;
    }

    public 
    Action:CT_OnTimerStart_LastTenSeconds_Basic(Handle:hTimer)
    {
        
    g_hTimer_LastTenSeconds CreateTimer(1.0CT_OnTimerStart_LastTenSeconds_TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);

        
    g_iCountSeconds 0;
    }

    public 
    Action:CT_OnTimerStart_LastTenSeconds(Handle:hTimer)
    {
        for (new 
    iClient 1iClient <= MaxClientsiClient++)
        {
            if (
    IsClientInGame(iClient))
            {
                if (
    g_iCountSeconds 10)
                {
                    
    PrintCenterText(iClient"%d"10 g_iCountSeconds++);
                }
                else
                {
                    
    PrintCenterText(iClient"Смена карты");

                    
    decl String:szNextMap[32];
                    
    GetNextMap(szNextMapsizeof(szNextMap));

                    
    ForceChangeLevel(szNextMap"Timeleft");

                    
    g_hTimer_LastTenSeconds INVALID_HANDLE;
                }
            }
        }

        return 
    Plugin_Continue;
    }
     
    Последнее редактирование: 26 май 2016
  8. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
    @The End Is Near..., спасибо,конечно,но все теперь выводит только текущую карту.
    Я нашел огрызки кода подобного плагина,немного переписал его,вот что получилось:
    Тут осталось лишь условие поправить с текущей/следующей картой:
    Код:
    PHP:
    #pragma semicolon 1

    #include <sourcemod>
    #include <cstrike>
    #include <csgo_colors>

    #define TIME 6.0

    public Plugin:myinfo =
    {
        
    name        =    "[bTimes] Mapmanager",
    };

    public 
    OnMapStart()
    {
       
    CreateTimer((TIME*60.0), Callback_Timer_TIMER_FLAG_NO_MAPCHANGE TIMER_REPEAT);
       
    CreateTimer(1.0CheckRemainingTimeINVALID_HANDLETIMER_REPEAT);
    }

    public 
    Action:Callback_Timer(Handle:hTimer)
    {
    decl String:sMapname[24];
       
    decl iTimeLeft;
       
    decl bool:isNextMap;
       if (
    GetMapTimeLeft(iTimeLeft) == false)
         return 
    Plugin_Stop;
       if (
    GetNextMap(sMapnamesizeof(sMapname)) == false)
       {
         
    GetCurrentMap(sMapnamesizeof(sMapname));
         
    isNextMap false;
       }
       else
         
    isNextMap true;
     
      if(
    iTimeLeft 30)
       {
        if(
    iTimeLeft 60)
        {
            
    CGOPrintToChatAll("\n{GREEN}[bTimes-Map] {DEFAULT}До смены карты осталось: {GREEN}%d {DEFAULT}секунд\n "iTimeLeft);
        }
        else
        {
            
    CGOPrintToChatAll("\n{GREEN}[bTimes-Map] {DEFAULT}До смены карты осталось: {GREEN}%d:%d\n "iTimeLeft 60iTimeLeft 60);
        }
       }
     
      return 
    Plugin_Continue;
    }

    new 
    bool:g_bAllowRoundEnd false;

    public 
    Action:CheckRemainingTime(Handle:timer)
    {
        new 
    Handle:hTmp
        
    hTmp FindConVar("mp_timelimit");
        new 
    iTimeLimit GetConVarInt(hTmp);         
        if (
    hTmp != INVALID_HANDLE)
            
    CloseHandle(hTmp); 
        if (
    iTimeLimit 0)
        {
            new 
    timeleft;
            
    GetMapTimeLeft(timeleft);
         
            if(
    timeleft == 5)
            {
                
    CGOPrintToChatAll("{GREEN}[bTimes-Map] {DEFAULT}Карта сменится через {GREEN}5..");
            }
            if(
    timeleft == 4)
            {
                
    CGOPrintToChatAll("{GREEN}[bTimes-Map] {DEFAULT}Карта сменится через {GREEN}4..");
            }
            if(
    timeleft == 3)
            {
                
    CGOPrintToChatAll("{GREEN}[bTimes-Map] {DEFAULT}Карта сменится через {GREEN}3..");
            }
            if(
    timeleft == 2)
            {
                
    CGOPrintToChatAll("{GREEN}[bTimes-Map] {DEFAULT}Карта сменится через {GREEN}2..");
            }
            if(
    timeleft == 1)
            {
                
    CGOPrintToChatAll("{GREEN}[bTimes-Map] {DEFAULT}Карта сменится через {GREEN}1..");
            }
         
            if(
    timeleft < -&& !g_bAllowRoundEnd)
            {
                
    g_bAllowRoundEnd true;
                
    CS_TerminateRound(0.5CSRoundEnd_TerroristWintrue);
            }
        }
    }

    public 
    Action:CS_OnTerminateRound(&Float:delay, &CSRoundEndReason:reason)
    {
        return 
    Plugin_Handled;
    }
     
    Последнее редактирование: 26 май 2016
  9. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    сколько длится голосование?
     
  10. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
    @The End Is Near..., 20 секунд.
    Условие с timeleft хочешь сделать?
    if(timeleft < n)
     
  11. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    через 25 сек после начала голосования будет получена след. карта, а в прошлый раз точно не было след. карты в чатике?
    PHP:
    #include <sourcemod>

    #define TIME 5

    new Handle:g_hTimer_LastTenSeconds INVALID_HANDLE;

    new 
    String:g_szFormatMap[32];

    new 
    g_iCountSeconds 0;

    public 
    OnMapStart()
    {
        
    CreateTimer(float(TIME*60), CT_OnTimerStart_TimeLeft_TIMER_FLAG_NO_MAPCHANGE TIMER_REPEAT);

        
    OnMapTimeLeftChanged();

        
    GetCurrentMap(g_szFormatMapsizeof(g_szFormatMap));
        
    Format(g_szFormatMapsizeof(g_szFormatMap), "Current Map: \x05%s"g_szFormatMap);
    }

    public 
    OnMapTimeLeftChanged()
    {
        if (
    g_hTimer_LastTenSeconds != INVALID_HANDLE)
        {
            
    KillTimer(g_hTimer_LastTenSeconds);
        }

        
    decl iTimeLeft;
        if (
    GetMapTimeLeft(iTimeLeft) == false)
        {
            return;
        }

        if (
    iTimeLeft 10)
        {
            
    g_hTimer_LastTenSeconds CreateTimer(float(iTimeLeft 10), CT_OnTimerStart_LastTenSeconds_Basic);
        }
    }

    public 
    OnMapVoteStarted()
    {
        
    CreateTimer(25.0CT_OnTimerStart_GetNextMap_TIMER_FLAG_NO_MAPCHANGE);
    }

    public 
    Action:CT_OnTimerStart_GetNextMap(Handle:hTimer)
    {
        
    decl String:szNextMap[32];
        
    GetNextMap(szNextMapsizeof(szNextMap));

        
    Format(g_szFormatMapsizeof(g_szFormatMap), "Next Map: \x05%s"g_szFormatMap);

        return 
    Plugin_Continue;
    }

    public 
    Action:CT_OnTimerStart_TimeLeft(Handle:hTimer)
    {
        
    decl iTimeLeft;
        if (
    GetMapTimeLeft(iTimeLeft) == false)
        {
            return 
    Plugin_Stop;
        }

        if (
    iTimeLeft 0)
        {
            
    PrintToChatAll("\x01%s. Timeleft: \x05%d:%d \x01sec."g_szFormatMapiTimeLeft 60 60iTimeLeft 60);
        }

        return 
    Plugin_Continue;
    }

    public 
    Action:CT_OnTimerStart_LastTenSeconds_Basic(Handle:hTimer)
    {
        
    g_hTimer_LastTenSeconds CreateTimer(1.0CT_OnTimerStart_LastTenSeconds_TIMER_REPEAT TIMER_FLAG_NO_MAPCHANGE);

        
    g_iCountSeconds 0;
    }

    public 
    Action:CT_OnTimerStart_LastTenSeconds(Handle:hTimer)
    {
        for (new 
    iClient 1iClient <= MaxClientsiClient++)
        {
            if (
    IsClientInGame(iClient))
            {
                if (
    g_iCountSeconds 10)
                {
                    
    PrintCenterText(iClient"%d"10 g_iCountSeconds++);
                }
                else
                {
                    
    PrintCenterText(iClient"Смена карты");

                    
    decl String:szNextMap[32];
                    
    GetNextMap(szNextMapsizeof(szNextMap));

                    
    ForceChangeLevel(szNextMap"Timeleft");

                    
    g_hTimer_LastTenSeconds INVALID_HANDLE;
                }
            }
        }

        return 
    Plugin_Continue;
    }
     
  12. 8Ahnenerbe8

    8Ahnenerbe8

    Сообщения:
    102
    Симпатии:
    11
    @The End Is Near..., сейчас еще раз проверю то,что впервый раз кидал
    --- Добавлено позже ---
    @The End Is Near..., в общем,работает все вроде:D спасибо
     
    Последнее редактирование: 26 май 2016