SA-MP Forums Archive
How to make this condition? - Printable Version

+- SA-MP Forums Archive (https://sampforum.blast.hk)
+-- Forum: SA-MP Scripting and Plugins (https://sampforum.blast.hk/forumdisplay.php?fid=8)
+--- Forum: Scripting Help (https://sampforum.blast.hk/forumdisplay.php?fid=12)
+---- Forum: Help Archive (https://sampforum.blast.hk/forumdisplay.php?fid=89)
+---- Thread: How to make this condition? (/showthread.php?tid=113675)



How to make this condition? - M1GU3L - 15.12.2009

I've got something like this:
pawn Код:
SetTimer("OneSecondTimer", 1000, true);
pawn Код:
public OneSecondTimer(playerid)
{
  Server[Seconds]++;
  if(Server[Seconds] == 60)
  {
    Server[Minutes]++;
  }
  bla...
  bla...
  bla...
  return 1;
}
What I want to do is every 10 minutes something happens, so I tried this:
pawn Код:
public OneSecondTimer(playerid)
{
  Server[Seconds]++;
  if(Server[Seconds] == 60)
  {
    Server[Minutes]++;
  }
  bla...
  bla...
  bla...
  else if(Server[Minutes] == 0 || Server[Minutes] == 10 || Server[Minutes] == 20 || Server[Minutes] == 30 || Server[Minutes] == 40 || Server[Minutes] == 50)
  {
    // do something
  }
  return 1;
}
But by doing that, "do something" would be repeated 60 times in a minute, and I want it to be done just once every 10 minutes. How can I do it?
(I decided to use this in order to not use too many timers).

Thanks!



Re: How to make this condition? - Babul - 15.12.2009

try this:
Код:
public OneSecondTimer(playerid)
{
	Server[Seconds]++;
	if(Server[Seconds]>59)
	{
		Server[Seconds]-=60;
		Server[Minutes]++;
		if(Server[Minutes]%10==0)
		{
			// do something
		}
	}
	return 1;
}



Re: How to make this condition? - [HiC]TheKiller - 15.12.2009

So you are saying you want a timer to repeat every 10 minutes, I'm a but confused.

pawn Код:
SetTimer("TenMinuteTimer", 6000000 /*10mins*/, true);

public TenMinuteTimer(playerid)
{
 
    Server[Minutes] = Server[Minutes] + 10;
  bla...
  bla...
  bla...
  else if(Server[Minutes] == 0 || Server[Minutes] == 10 || Server[Minutes] == 20 || Server[Minutes] == 30 || Server[Minutes] == 40 || Server[Minutes] == 50)
  {
    // do something
  }
  return 1;
}



Re: How to make this condition? - M1GU3L - 15.12.2009

Quote:
Originally Posted by Babul
try this:
pawn Код:
public OneSecondTimer(playerid)
{
    Server[Seconds]++;
    if(Server[Seconds]>59)
    {
        Server[Seconds]-=60;
        Server[Minutes]++;
        if(Server[Minutes]%10==0) // This line
        {
            // do something
        }
    }
    return 1;
}
What is this "%" for?

Quote:
Originally Posted by [HiC
TheKiller ]
So you are saying you want a timer to repeat every 10 minutes, I'm a but confused.
Yes but, I don't want a timer, I want the OneSecondTimer to check and do something every 10 mins...


Re: How to make this condition? - Babul - 25.12.2009

the % is the "modulo" operator, the remaining amount of the division: 5/2 = 2 remaining 1 (the mod value 5%2=1).
so each 10 minutes (or minutes dividable thru 10 w/o any remaining value, gets 0: 10/10=1 remain 0, 20/10=2 remain 0, etc) - the result (dividable /10) is true.
if you set the seconds back to 0 (-=60), after reaching >59 (=60 and more hehe), the condition also is true, coz 0/10=0 remain 0.
the reason i script it this way has one simple reason:
if you start syncing the seconds with a real clock, then the seconds skip 1 sometimes. so there is a 1.67% chance of skipping one vital second for calling a minutely "payday", and you maybe would "lag" 1 whole more minute in hope to hit the 60th second next time...
if you check for >59 seconds, the 61st second will fit the condition check too, and will subtract 60 from the seconds-timer to second 1 instead of 0, AND will call your minute-loop, adding minutes, until the minutes %10 ==0.
1 more advantage: you get your 1 lagged second back for free