Проблема с таймерами.
#1

Уважаемые форумчане, столкнулся с очень, по другому не назвать, печальной проблемой.
После создания и проверки таймера(откат ограбления) для команды /robbank, заметил, что он напрочь отказывается работать при времени, допустим, на 10 минут. Если ставлю таймер на 5 секунд, к примеру, то всё выполняется, если на 10 минут, не выполняется. Пытался использовать функции SetTimer и SetTimerEx. Эффект один и тот же.
Помогите советом, если кто-нибудь сталкивался с таким конечно. Буду очень признателен.
Reply
#2

Для начала не используйте теги, уважайте тех кто будет читать то что вы пишите. Во-вторых, показывайте код.
Reply
#3

Дико извиняюсь, встаю на путь исправления.
Прошу:
Код:
	if(strcmp(cmd, "/robbank", true) == 0)
	{
	    new success = random(2);
		if(PlayerInfo[playerid][pRobTime] > 0)
		{
		    SendClientMessage(playerid, COLOR_GREY, "* Ты уже пытался ограбить банк, потерпи немного.");
		    return 1;
		}
	    if(IsPlayerInRangeOfPoint(playerid, 2, 2309.6060,-4.0211,26.7422))
	    {
	        if(PlayerInfo[playerid][pDuty] == 0)
			{
		        if(success == 1)
			   {
		            WantedLevel[playerid] += 5;
		            SetPlayerWantedLevel(playerid,WantedLevel[playerid]);
		            SetPlayerCriminal(playerid,255, "Ограбление банка");
		            PlayerInfo[playerid][pRobTime] = 1;
		            SetMoney(playerid, 3000 + random(12000));
			    SetTimer("UnsetBankRob",600000, 0);
			    ApplyAnimation(playerid, "SHOP", "ROB_Shifty", 4.0, 0, 0, 0, 0, 0); // Rob Lookout
			    }
			 else
			    {
		              SendClientMessage(playerid, COLOR_GREY, "* Вам не удалось ограбить банк.");
			      WantedLevel[playerid] += 5;
			      SetPlayerWantedLevel(playerid,WantedLevel[playerid]);
		              SetPlayerCriminal(playerid,255, "Попытка ограбления банка");
                              SetTimer("UnsetBankRob",600000, 0);
			      PlayerInfo[playerid][pRobTime] = 1;
			     }
			}
			else
			{
			    SendClientMessage(playerid, COLOR_GREY, "Вы на службе.");
			    return 1;
			}
		}
		else
		{
		    SendClientMessage(playerid, COLOR_GREY, "Вы не на нужном месте.");
		    return 1;
		}
		return 1;
	}
Код:
public UnsetBankRob(playerid)
{
 PlayerInfo[playerid][pRobTime] = 0;
 SendClientMessage(playerid, COLOR_GREY, "* Теперь вы опять можете грабить банк.");
 return 1;
}
Reply
#4

pawn Код:
if (strcmp(cmd, "/robbank", true) == 0)
    {
        if (PlayerInfo[playerid][pRobTime] > 0)
        {
            SendClientMessage(playerid, COLOR_GREY, "* Ты уже пытался ограбить банк, потерпи немного.");
            return 1;
        }
        if (!IsPlayerInRangeOfPoint(playerid, 2, 2309.6060,-4.0211,26.7422))
        {
            SendClientMessage(playerid, COLOR_GREY, "Вы не на нужном месте.");
            return 1;
        }
        if (PlayerInfo[playerid][pDuty] != 0)
        {
            SendClientMessage(playerid, COLOR_GREY, "Вы на службе.");
            return 1;
        }
        if (random(100) > 49)
        {
            SetPlayerCriminal(playerid,255, "Ограбление банка");
            SetMoney(playerid, 3000 + random(12000));
            ApplyAnimation(playerid, "SHOP", "ROB_Shifty", 4.0, 0, 0, 0, 0, 0); // Rob Lookout
        }
        else
        {
            SendClientMessage(playerid, COLOR_GREY, "* Вам не удалось ограбить банк.");
            SetPlayerWantedLevel(playerid, WantedLevel[playerid]);
            SetPlayerCriminal(playerid,255, "Попытка ограбления банка");
        }
        WantedLevel[playerid] += 5;
        SetPlayerWantedLevel(playerid, WantedLevel[playerid]);
        SetTimerEx("UnsetBankRob", 600000, 0, "i", playerid);
        PlayerInfo[playerid][pRobTime] = 1;
        return 1;
    }
Так оптимальнее.
И надеюсь forward UnsetBankRob(playerid); в начале кода присутствует?
Reply
#5

Благодарю за ответ, сейчас попробую.
Да, форвард этого паблика присутствует в начале кода.
Reply
#6

Увы, не помогло. Если я умею считать, то 600000 миллисекунд = 10 минут.



Может есть другие предположения ? Эта проблема ещё наблюдалась на 0.3d, до перевода на 0.3e, просто не приходилось сводить ситуацию до таймера.
Reply
#7

Используй unixTime вместо таймера.

pawn Код:
PlayerInfo[playerid][pRobTime] = gettime() + 10 * 60; // или просто gettime() + 600
pawn Код:
if (PlayerInfo[playerid][pRobTime] > gettime())
    return SendClientMessage(playerid, COLOR_GREY, "* Ты уже пытался ограбить банк, потерпи немного.");
Reply
#8

Perfecto! Огромное спасибо, Ru-user, работает как часы, даже лучше таймера.
Stepashka, благодарю за оптимальный вариант команды.
Reply
#9

Quote:

работает как часы

это и есть часы.
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)