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

8Ahnenerbe8

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

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #2
Например,до смены остается 5,4,3,2,1 - в чат выводит,соответственно,тоже самое.
Тогда нужно делать глобальный таймер на каждую секунду. Оффтоп
Теперь нужно сделать так, чтобы,во-первых,время выводилось в минутах:секундах.
То есть по timeleft'у осталось 12:20 до смены,в чат выводится тоже самое число.
Во-вторых,когда карта подходит к концу, и остаются считаные секнуды,нужно чтобы в чат выводило эти секунды.
Так же,хочу чтобы вместе с сообщение,которое выводит время до смены,выводилась и текущая карта.После голосования(оно у меня за 5 минуты до конца) строчку с текующей картой убрать,а добавить строчку со следующей картой.
Тестируй:
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(sMapname, sizeof(sMapname)) == false)
   {
     GetCurrentMap(sMapname, sizeof(sMapname));
     isNextMap = false;
   }
   else
     isNextMap = true;
  
   if (iTimeLeft > 0)
   {
     PrintToChatAll("Timeleft: %d min. %d sec.", (iTimeLeft > 60) ? iTimeLeft / 60 : 0, iTimeLeft);
     PrintToChatAll("%s map: %s", (isNextMap) ? "Next" : "Current", sMapname);
   }
  
   return Plugin_Continue;
}
 

8Ahnenerbe8

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

White Wolf

🍉
Сообщения
2,382
Реакции
2,187
  • Команда форума
  • #4
Вызов каждую секунду не самое оптимальное решение.
 

8Ahnenerbe8

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

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #6
PHP:
if(iTimeLeft < 3600) // проверка что меньше часа
{
    if(iTimeLeft < 60)
    {
        PrintToChatAll("Timeleft: %d sec.", iTimeLeft);
    }
    else
    {
        PrintToChatAll("Timeleft: %d min. %d sec.", iTimeLeft / 60, iTimeLeft % 60);
    }
}
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
можно попробовать, хотел придать вид плагину, да лень чет)) проверь сначала

за 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_szFormatMap, sizeof(g_szFormatMap));
    Format(g_szFormatMap, sizeof(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(szNextMap, sizeof(szNextMap));

    Format(g_szFormatMap, sizeof(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_szFormatMap, iTimeLeft / 60 % 60, iTimeLeft % 60);
    }

    return Plugin_Continue;
}

public Action:CT_OnTimerStart_LastTenSeconds_Basic(Handle:hTimer)
{
    g_hTimer_LastTenSeconds = CreateTimer(1.0, CT_OnTimerStart_LastTenSeconds, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);

    g_iCountSeconds = 0;
}

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

                decl String:szNextMap[32];
                GetNextMap(szNextMap, sizeof(szNextMap));

                ForceChangeLevel(szNextMap, "Timeleft");

                g_hTimer_LastTenSeconds = INVALID_HANDLE;
            }
        }
    }

    return Plugin_Continue;
}
 
Последнее редактирование:

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
@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.0, CheckRemainingTime, INVALID_HANDLE, 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(sMapname, sizeof(sMapname)) == false)
   {
     GetCurrentMap(sMapname, sizeof(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 / 60, iTimeLeft % 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 < -1 && !g_bAllowRoundEnd)
        {
            g_bAllowRoundEnd = true;
            CS_TerminateRound(0.5, CSRoundEnd_TerroristWin, true);
        }
    }
}

public Action:CS_OnTerminateRound(&Float:delay, &CSRoundEndReason:reason)
{
    return Plugin_Handled;
}
 
Последнее редактирование:

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
через 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_szFormatMap, sizeof(g_szFormatMap));
    Format(g_szFormatMap, sizeof(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.0, CT_OnTimerStart_GetNextMap, _, TIMER_FLAG_NO_MAPCHANGE);
}

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

    Format(g_szFormatMap, sizeof(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_szFormatMap, iTimeLeft / 60 % 60, iTimeLeft % 60);
    }

    return Plugin_Continue;
}

public Action:CT_OnTimerStart_LastTenSeconds_Basic(Handle:hTimer)
{
    g_hTimer_LastTenSeconds = CreateTimer(1.0, CT_OnTimerStart_LastTenSeconds, _, TIMER_REPEAT | TIMER_FLAG_NO_MAPCHANGE);

    g_iCountSeconds = 0;
}

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

                decl String:szNextMap[32];
                GetNextMap(szNextMap, sizeof(szNextMap));

                ForceChangeLevel(szNextMap, "Timeleft");

                g_hTimer_LastTenSeconds = INVALID_HANDLE;
            }
        }
    }

    return Plugin_Continue;
}
 

8Ahnenerbe8

Участник
Сообщения
113
Реакции
30
@The End Is Near..., сейчас еще раз проверю то,что впервый раз кидал
--- Добавлено позже ---
@The End Is Near..., в общем,работает все вроде:D спасибо
 
Последнее редактирование:
Сверху Снизу