SetTimer: Difference between revisions
m (→Syntax: added information on tables and their metatables as arguments) |
No edit summary |
||
(37 intermediate revisions by 25 users not shown) | |||
Line 1: | Line 1: | ||
__NOTOC__ | __NOTOC__ | ||
{{Server client function}} | {{Server client function}}{{Important Note|The speed at which a client side timer runs can be completely unreliable if a client is maliciously modifying their operating system speed, timers could run much faster or slower.}} | ||
{{Important Note|Writing the following code can cause performance issues. Use [[onClientPreRender]] instead. <syntaxhighlight lang="lua">setTimer(theFunction, 0, 0)</syntaxhighlight>}} | |||
This function allows you to trigger a function after a number of milliseconds have elapsed. You can call one of your own functions or a built-in function. For example, you could set a timer to spawn a player after a number of seconds have elapsed. | This function allows you to trigger a function after a number of milliseconds have elapsed. You can call one of your own functions or a built-in function. For example, you could set a timer to spawn a player after a number of seconds have elapsed. | ||
Once a timer has finished repeating, it no longer exists. | Once a timer has finished repeating, it no longer exists. | ||
The minimum accepted interval is | The minimum accepted interval is 0ms. | ||
Multi Theft Auto guarantees that the timer will be triggered after ''at least'' the interval you specify. The resolution of the timer is tied to the frame rate (server side and client-side). All the overdue timers are triggered at a single point each frame. This means that if, for example, the player is running at 30 frames per second, then two timers specified to occur after 100ms and 110ms would more than likely occur during the same frame, as the difference in time between the two timers (10ms) is less than half the length of the frame (33ms). As with most timers provided by other languages, you shouldn't rely on the timer triggering at an exact point in the future. | |||
==Syntax== | ==Syntax== | ||
<syntaxhighlight lang="lua"> | <syntaxhighlight lang="lua"> | ||
timer setTimer ( function theFunction, int timeInterval, int timesToExecute, | timer setTimer ( function theFunction, int timeInterval, int timesToExecute [, var arguments... ] ) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{OOP||[[Timer]]}} | |||
===Required Arguments=== | ===Required Arguments=== | ||
*'''theFunction:''' The function you wish the timer to call. | *'''theFunction:''' The function you wish the timer to call. | ||
*'''timeInterval:''' The number of milliseconds that should elapse before the function is called. | {{Note|The hidden global variable '''sourceTimer''' contains the currently executing timer userdata}} | ||
{{Note|The hidden global variable '''source''' becomes ''nil'' inside a timer function. You need to declare it on the function arguments if you need to use it.}} | |||
*'''timeInterval:''' The number of milliseconds that should elapse before the function is called. The minimum is 0 ms; 1000 milliseconds = 1 second) | |||
*'''timesToExecute:''' The number of times you want the timer to execute, or 0 for infinite repetitions. | *'''timesToExecute:''' The number of times you want the timer to execute, or 0 for infinite repetitions. | ||
===Optional Arguments=== | ===Optional Arguments=== | ||
{{OptionalArg}} | {{OptionalArg}} | ||
*'''arguments:''' Any arguments you wish to pass to the function can be listed after the ''timesToExecute'' argument. Note that any tables you want to pass will get cloned, whereas metatables will get lost. Also changes you make in the original table before the function gets called won't get | *'''arguments:''' Any arguments you wish to pass to the function can be listed after the ''timesToExecute'' argument. Note that any tables you want to pass will get cloned, whereas metatables and functions/function references in that passed table will get lost. Also changes you make in the original table before the function gets called won't get transferred. | ||
===Returns=== | ===Returns=== | ||
Returns a [[timer]] pointer if the timer was set | Returns a [[timer]] pointer if the timer was set successfully, ''false'' if the arguments are invalid or the timer could not be set. | ||
==Example== | ==Example== | ||
<section name="Example" class="both" show="true"> | |||
<section name="Example 1" class="both" show="true"> | |||
This example will output some text after a small delay. | This example will output some text after a small delay. | ||
Line 39: | Line 43: | ||
setTimer ( delayedChat, 1000, 1, "Hello, World!" ) | setTimer ( delayedChat, 1000, 1, "Hello, World!" ) | ||
</syntaxhighlight> | </syntaxhighlight> | ||
1 second after the line above has been executed, the text ''Delayed text: Hello, World!'' will be displayed in the chat box. | |||
</section> | |||
<section name="Example 2" class="both" show="true"> | |||
This example will nest a whole function within a timer. This is nice for things like setting variables without having to call a function outside of your code block. | |||
<syntaxhighlight lang="lua"> | |||
function mainFunction() | |||
outputChatBox ("Instant text!") | |||
setTimer ( function() | |||
outputChatBox ( "5 second delay text!" ) | |||
end, 5000, 1 ) | |||
end | |||
1 | mainFunction() --call function | ||
</syntaxhighlight> | |||
</section> | |||
<section name="Example 3" class="both" show="true"> | |||
This example outputs some random text to the chat every 300000 milliseconds (5 minutes). | |||
<syntaxhighlight lang="lua"> | |||
setTimer(function() | |||
outputChatBox("Text " .. math.random(1,4)) | |||
end, 300000, 0) | |||
</syntaxhighlight> | |||
</section> | |||
<section name="Example 4" class="server" show="true"> | |||
This example should send a global message about the death of a player on a random time. I used [https://wiki.multitheftauto.com/wiki/Math.round math.round] in this example to give a nicer output. | |||
<syntaxhighlight lang="lua"> | |||
function math.round(number, decimals, method) -- math.round, useful function taken from the wiki: https://wiki.multitheftauto.com/wiki/Math.round | |||
decimals = decimals or 0 | |||
local factor = 10 ^ decimals | |||
if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor | |||
else return tonumber(("%."..decimals.."f"):format(number)) end | |||
end | |||
function onWasted() | |||
local delay = math.random(500, 5000) -- 0.5s to 5s of delay | |||
setTimer(function(thePlayer) -- Starts the Timer | |||
local whoDied = "Someone" -- In case the name can't be read, Someone will appear | |||
if isElement(thePlayer) then -- This checks if thePlayer's element still exists (which means thePlayer hasnt disconnected yet) | |||
whoDied = getPlayerName(thePlayer) -- Changes Someone to thePlayer's name | |||
end | |||
outputChatBox(whoDied.." #FFFFFFhas #FF0000died #FFFFFF"..math.round(delay/1000, 1).." seconds ago.", root, 255, 175, 0, true) -- This will output to everyone on the server that thePlayer (or Someone) died X seconds ago. | |||
end | |||
,delay, 1, source) -- The source at the end is an argument for the function we made before, you can't use the source directly because it won't be readed | |||
end | |||
addEventHandler("onPlayerWasted", root, onWasted) -- Executed every time someone dies | |||
</syntaxhighlight> | |||
</section> | </section> | ||
==See Also== | ==See Also== | ||
{{Utility functions}} | {{Utility functions}} | ||
[[pt-br:SetTimer]] |
Latest revision as of 09:22, 13 October 2023
Important Note: The speed at which a client side timer runs can be completely unreliable if a client is maliciously modifying their operating system speed, timers could run much faster or slower. |
Important Note: Writing the following code can cause performance issues. Use onClientPreRender instead. setTimer(theFunction, 0, 0) |
This function allows you to trigger a function after a number of milliseconds have elapsed. You can call one of your own functions or a built-in function. For example, you could set a timer to spawn a player after a number of seconds have elapsed.
Once a timer has finished repeating, it no longer exists.
The minimum accepted interval is 0ms.
Multi Theft Auto guarantees that the timer will be triggered after at least the interval you specify. The resolution of the timer is tied to the frame rate (server side and client-side). All the overdue timers are triggered at a single point each frame. This means that if, for example, the player is running at 30 frames per second, then two timers specified to occur after 100ms and 110ms would more than likely occur during the same frame, as the difference in time between the two timers (10ms) is less than half the length of the frame (33ms). As with most timers provided by other languages, you shouldn't rely on the timer triggering at an exact point in the future.
Syntax
timer setTimer ( function theFunction, int timeInterval, int timesToExecute [, var arguments... ] )
OOP Syntax Help! I don't understand this!
- Method: Timer(...)
Required Arguments
- theFunction: The function you wish the timer to call.
- timeInterval: The number of milliseconds that should elapse before the function is called. The minimum is 0 ms; 1000 milliseconds = 1 second)
- timesToExecute: The number of times you want the timer to execute, or 0 for infinite repetitions.
Optional Arguments
NOTE: When using optional arguments, you might need to supply all arguments before the one you wish to use. For more information on optional arguments, see optional arguments.
- arguments: Any arguments you wish to pass to the function can be listed after the timesToExecute argument. Note that any tables you want to pass will get cloned, whereas metatables and functions/function references in that passed table will get lost. Also changes you make in the original table before the function gets called won't get transferred.
Returns
Returns a timer pointer if the timer was set successfully, false if the arguments are invalid or the timer could not be set.
Example
This example will output some text after a small delay.
-- define function to be called function delayedChat ( text ) outputChatBox ( "Delayed text: " .. text ) end -- set a timer so the function is called after 1 second setTimer ( delayedChat, 1000, 1, "Hello, World!" )
1 second after the line above has been executed, the text Delayed text: Hello, World! will be displayed in the chat box.
This example will nest a whole function within a timer. This is nice for things like setting variables without having to call a function outside of your code block.
function mainFunction() outputChatBox ("Instant text!") setTimer ( function() outputChatBox ( "5 second delay text!" ) end, 5000, 1 ) end mainFunction() --call function
This example outputs some random text to the chat every 300000 milliseconds (5 minutes).
setTimer(function() outputChatBox("Text " .. math.random(1,4)) end, 300000, 0)
This example should send a global message about the death of a player on a random time. I used math.round in this example to give a nicer output.
function math.round(number, decimals, method) -- math.round, useful function taken from the wiki: https://wiki.multitheftauto.com/wiki/Math.round decimals = decimals or 0 local factor = 10 ^ decimals if (method == "ceil" or method == "floor") then return math[method](number * factor) / factor else return tonumber(("%."..decimals.."f"):format(number)) end end function onWasted() local delay = math.random(500, 5000) -- 0.5s to 5s of delay setTimer(function(thePlayer) -- Starts the Timer local whoDied = "Someone" -- In case the name can't be read, Someone will appear if isElement(thePlayer) then -- This checks if thePlayer's element still exists (which means thePlayer hasnt disconnected yet) whoDied = getPlayerName(thePlayer) -- Changes Someone to thePlayer's name end outputChatBox(whoDied.." #FFFFFFhas #FF0000died #FFFFFF"..math.round(delay/1000, 1).." seconds ago.", root, 255, 175, 0, true) -- This will output to everyone on the server that thePlayer (or Someone) died X seconds ago. end ,delay, 1, source) -- The source at the end is an argument for the function we made before, you can't use the source directly because it won't be readed end addEventHandler("onPlayerWasted", root, onWasted) -- Executed every time someone dies
See Also
- addDebugHook
- base64Decode
- base64Encode
- debugSleep
- decodeString
- encodeString
- fromJSON
- generateKeyPair
- getColorFromString
- getDevelopmentMode
- getDistanceBetweenPoints2D
- getDistanceBetweenPoints3D
- getEasingValue
- getNetworkStats
- getNetworkUsageData
- getPerformanceStats
- getRealTime
- getTickCount
- getTimerDetails
- getTimers
- getFPSLimit
- getUserdataType
- getVersion
- gettok
- isTransferBoxVisible
- setTransferBoxVisible
- hash
- inspect
- interpolateBetween
- iprint
- isOOPEnabled
- isTimer
- killTimer
- md5
- passwordHash
- passwordVerify
- pregFind
- pregMatch
- pregReplace
- removeDebugHook
- resetTimer
- setDevelopmentMode
- setFPSLimit
- setTimer
- ref
- deref
- sha256
- split
- teaDecode
- teaEncode
- toJSON
- tocolor
- getProcessMemoryStats
- utfChar
- utfCode
- utfLen
- utfSeek
- utfSub