Difference between revisions of "Manual:Timer Engine"
(Worked on tempTimers) |
|||
Line 4: | Line 4: | ||
==Regular GUI Timers== | ==Regular GUI Timers== | ||
− | + | <span style="color:#0000FF">'''Regular GUI Timers'''</span> that fire repeatedly in a certain interval specified by the user. To make one, go to the ''Timers'' section '''(1)''' in Mudlet, click ''Add'' '''(2)''', select the time periods you'd like the timer to be going off at - save '''(3)''' and activate it '''(4)'''. The timer will go off after your specified interval and then at regular specified intervals after that, until disabled. | |
[[File:Simple timer.png|center]] | [[File:Simple timer.png|center]] | ||
Line 14: | Line 14: | ||
disableTimer("Newbie timer") -- disables it, so it won't go off anymore | disableTimer("Newbie timer") -- disables it, so it won't go off anymore | ||
+ | </lua> | ||
+ | |||
+ | ==Temporary Timers== | ||
+ | <span style="color:#0000FF">'''Temporary Timers'''</span> are timers that go off only once and are the most common type of timer used for scripting purposes. You don't work with them from the Timers section - you just code with them only. | ||
+ | |||
+ | For a basic introduction to temporary timers, [[Manual:Introduction#Timers|read up about them here]]. Here, we'll continue expanding on what you've learnt so far. | ||
+ | |||
+ | ===Stopping=== | ||
+ | To stop a temporary timer once you've made it and before before it went off - you use [[Manual:Mudlet_Object_Functions#killTimer|killTimer()]]. You give killTimer(id) the ID of the timer that you've made - which you get from Mudlet when you make it. Here's an example: | ||
+ | |||
+ | <lua> | ||
+ | -- get and store the timer ID in the global "greeting_timer_id" variable | ||
+ | greeting_timer_id = tempTimer(2, [[ echo("hello!\n") ]]) | ||
+ | |||
+ | -- delete the timer - thus nothing will actually happen! | ||
+ | killTimer(greeting_timer_id) | ||
+ | </lua> | ||
+ | |||
+ | ===Refreshing=== | ||
+ | You can also use [[Manual:Mudlet_Object_Functions#killTimer|killTimer()]] to "refresh" a timer - the following code example will delete the previous timer if one exists and create the new one, thus making sure you don't get multiple copies of it: | ||
+ | |||
+ | <lua> | ||
+ | if portal_timer then killTimer(portal_timer) end | ||
+ | portal_timer = tempTimer(2, [[ send("enter portal") ]]) | ||
+ | </lua> | ||
+ | |||
+ | ===Using variables=== | ||
+ | To embed a value of a variable in tempTimer code, you might try using this given what you've learnt: | ||
+ | |||
+ | <lua> | ||
+ | tempTimer(1.4, [[ echo("hello, "..matches[2].."!\n") ]]) | ||
+ | </lua> | ||
+ | |||
+ | But that won't work as you'd expect it to - that will try and use the value of matches[2] ''when the timer goes off'' - while by then, the variable could have changed! Instead, you take it outside the square [[ ]] brackets - this is correct: | ||
+ | |||
+ | <lua> | ||
+ | tempTimer(1.4, [[ echo("hello, ]]..matches[2]..[[!\n") ]]) | ||
+ | </lua> | ||
+ | |||
+ | ===Closures=== | ||
+ | Last but not least, you can also use [http://www.lua.org/pil/6.1.html closures] with tempTimer - using a slightly different syntax that has advantages of being able to access variables in it's scope, when it goes off: | ||
+ | |||
+ | <lua> | ||
+ | local name = matches[2] | ||
+ | tempTimer(2.4, function() echo("hello, "..name.."!\n") end) | ||
</lua> | </lua> | ||
==Offset Timers== | ==Offset Timers== | ||
− | + | <span style="color:#0000FF">'''Offset Timers'''</span> are child timers of a parent timer and fire a single shot after a specified timeout after their parent fired its respective timeout. This interval is an offset to the interval of its parent timer. To make them, add a regular GUI timer (see above), then create another timer and '''drag it onto the timer'''. This will make the timer that is "inside" the timer (the child inside the parent) go off at a certain time after it's parent goes off. Offset timers differ visually from regular timers and are represented with a + icon for offset. Offset timers can be turned on and off by the user just like any other timer. For example - a parent timer fires every 30 seconds and by doing so kicks off 3 offset timers with an offset of 5 seconds each. Consequently, the 3 children fire 5 seconds after each time the parent timer fired. To make this happen, make the parent timer tic every 30 seconds, drag 3 timers into it with an offset of 5s on each: | |
[[File:Offset timers.png|center]] | [[File:Offset timers.png|center]] | ||
− | |||
− | |||
− | |||
==Batch Job Timers== | ==Batch Job Timers== | ||
− | + | <span style="color:#0000FF">'''Batch Job Timers'''</span> are a form of timer that issue a sequence of commands/scripts according to a certain timeout instead of a single command/script. This is a very important tool if the sequence of commands is important. Timers depend largely on the operating system you are using and it cannot be guaranteed under certain conditions that if you have set up 5 timers to fire after 1.3 seconds that the sequence in which they fire is the same sequence in which they were created. If the sequence of commands is important, you should always use batch job timers as this form of timers guarantees that the sequence of commands is observed. For example: If you want to make an auto-miner bot that digs its way into a gold mine digging left, down, down, right, left, down until a trigger catches a message that indicates that the mine is going to collapse and bury your poor soul unless you run for your life and head out of the mine. In this scenario the sequence of commands is vital as you’d lose your way and die. This is a classical case for a batch job timer. | |
==Uses and examples== | ==Uses and examples== |
Revision as of 11:43, 28 July 2012
Timer Engine
Mudlet supports 4 different sorts of timers:
Regular GUI Timers
Regular GUI Timers that fire repeatedly in a certain interval specified by the user. To make one, go to the Timers section (1) in Mudlet, click Add (2), select the time periods you'd like the timer to be going off at - save (3) and activate it (4). The timer will go off after your specified interval and then at regular specified intervals after that, until disabled.
You can also enable/disable this timer via scripting with enableTimer() and disableTimer():
<lua> enableTimer("Newbie timer") -- enables the timer, so 2s after being enabled, it'll tick - and every 2s after that
disableTimer("Newbie timer") -- disables it, so it won't go off anymore </lua>
Temporary Timers
Temporary Timers are timers that go off only once and are the most common type of timer used for scripting purposes. You don't work with them from the Timers section - you just code with them only.
For a basic introduction to temporary timers, read up about them here. Here, we'll continue expanding on what you've learnt so far.
Stopping
To stop a temporary timer once you've made it and before before it went off - you use killTimer(). You give killTimer(id) the ID of the timer that you've made - which you get from Mudlet when you make it. Here's an example:
<lua> -- get and store the timer ID in the global "greeting_timer_id" variable greeting_timer_id = tempTimer(2, echo("hello!\n") )
-- delete the timer - thus nothing will actually happen! killTimer(greeting_timer_id) </lua>
Refreshing
You can also use killTimer() to "refresh" a timer - the following code example will delete the previous timer if one exists and create the new one, thus making sure you don't get multiple copies of it:
<lua> if portal_timer then killTimer(portal_timer) end portal_timer = tempTimer(2, send("enter portal") ) </lua>
Using variables
To embed a value of a variable in tempTimer code, you might try using this given what you've learnt:
<lua> tempTimer(1.4, [[ echo("hello, "..matches[2].."!\n") ]]) </lua>
But that won't work as you'd expect it to - that will try and use the value of matches[2] when the timer goes off - while by then, the variable could have changed! Instead, you take it outside the square [[ ]] brackets - this is correct:
<lua> tempTimer(1.4, echo("hello, ..matches[2]..!\n") ) </lua>
Closures
Last but not least, you can also use closures with tempTimer - using a slightly different syntax that has advantages of being able to access variables in it's scope, when it goes off:
<lua> local name = matches[2] tempTimer(2.4, function() echo("hello, "..name.."!\n") end) </lua>
Offset Timers
Offset Timers are child timers of a parent timer and fire a single shot after a specified timeout after their parent fired its respective timeout. This interval is an offset to the interval of its parent timer. To make them, add a regular GUI timer (see above), then create another timer and drag it onto the timer. This will make the timer that is "inside" the timer (the child inside the parent) go off at a certain time after it's parent goes off. Offset timers differ visually from regular timers and are represented with a + icon for offset. Offset timers can be turned on and off by the user just like any other timer. For example - a parent timer fires every 30 seconds and by doing so kicks off 3 offset timers with an offset of 5 seconds each. Consequently, the 3 children fire 5 seconds after each time the parent timer fired. To make this happen, make the parent timer tic every 30 seconds, drag 3 timers into it with an offset of 5s on each:
Batch Job Timers
Batch Job Timers are a form of timer that issue a sequence of commands/scripts according to a certain timeout instead of a single command/script. This is a very important tool if the sequence of commands is important. Timers depend largely on the operating system you are using and it cannot be guaranteed under certain conditions that if you have set up 5 timers to fire after 1.3 seconds that the sequence in which they fire is the same sequence in which they were created. If the sequence of commands is important, you should always use batch job timers as this form of timers guarantees that the sequence of commands is observed. For example: If you want to make an auto-miner bot that digs its way into a gold mine digging left, down, down, right, left, down until a trigger catches a message that indicates that the mine is going to collapse and bury your poor soul unless you run for your life and head out of the mine. In this scenario the sequence of commands is vital as you’d lose your way and die. This is a classical case for a batch job timer.
Uses and examples
The most common usage of temporary timers is the function tempTimer(). It lets you specify a timeout after which a script is being run e.g. <lua> tempTimer( 0.3, send("kill rat") ) </lua>
This will issue the command "kill rat" after 0.3 seconds. Other clients call this kind of function wait() or doAfter() etc. It is one of the most used functions in MUD scripting. tempTimer() is a single shot timer. It will only fire once and is then marked for deletion. TempTriggers(), by contrast, live through the entire session and are never deleted unless you explicitly delete them or disable them.
Another often used function in the context of timers is enableTimer( timerName ), or disableTimer( timerName ). Those are the counterparts of enableTrigger( triggerName ) and disableTrigger( triggerName ), enableKey( keyName ) etc..
Note: Temporary timers cannot be accessed from the GUI and are not saved in profiles.
To be continued…