Difference between revisions of "LlSetTimerEvent"
Jump to navigation
Jump to search
All Issues ~ Search JIRA for related Bugs
(Additional llSetTimerEvent() calls reset current timer, added example.) |
m |
||
(3 intermediate revisions by 3 users not shown) | |||
Line 2: | Line 2: | ||
|func_id=107|func_sleep=0.0|func_energy=10.0 | |func_id=107|func_sleep=0.0|func_energy=10.0 | ||
|func=llSetTimerEvent|p1_type=float|p1_name=sec|p1_desc=Any positive non-zero value to enable, zero (0.0) to disable. | |func=llSetTimerEvent|p1_type=float|p1_name=sec|p1_desc=Any positive non-zero value to enable, zero (0.0) to disable. | ||
|func_desc=Cause the [[timer]] event to be triggered a maximum of once every | |func_desc=Cause the [[timer]] event to be triggered a maximum of once every {{LSLPT|sec}} seconds. Passing in 0.0 stops further timer events. | ||
|func_footnote | |func_footnote | ||
|return_text | |return_text | ||
Line 12: | Line 12: | ||
** '''Event Execution''' - If the execution of an event takes too long. | ** '''Event Execution''' - If the execution of an event takes too long. | ||
*The timer persists across state changes, but gets removed when the script is reset. So if you change to a state that has a timer() event, with the timer still running, it will fire in the new state. | *The timer persists across state changes, but gets removed when the script is reset. So if you change to a state that has a timer() event, with the timer still running, it will fire in the new state. | ||
*Setting a new timer replaces the old timer | *Setting a new timer replaces the old timer and resets the timer clock. | ||
**If you repeatedly call this function at some interval less than {{LSLPT|sec}} the timer event will never fire. | |||
*The [[timer]] event is not an interrupt, it will not pause the execution of the currently running event to execute the timer. The current event must finish executing before the timer executes. | |||
|constants | |constants | ||
|examples= | |examples= | ||
< | <source lang="lsl2"> | ||
// default of counter is 0 upon script load | // default of counter is 0 upon script load | ||
integer counter; | integer counter; | ||
Line 43: | Line 45: | ||
} | } | ||
} | } | ||
</ | </source> | ||
< | <source lang="lsl2"> | ||
// random period in between (+15.0, +30.0] | // random period in between (+15.0, +30.0] | ||
// which means the resulting float could be 30.0 but not 15.0 | // which means the resulting float could be 30.0 but not 15.0 | ||
Line 52: | Line 54: | ||
// same results for: | // same results for: | ||
// llSetTimerEvent( 30.0 + llFrand(-15.0) ); | // llSetTimerEvent( 30.0 + llFrand(-15.0) ); | ||
</ | </source> | ||
< | <source lang="lsl2"> | ||
// The timer event will never fire. | // The timer event will never fire. | ||
default | default | ||
Line 60: | Line 62: | ||
{ | { | ||
llSetTimerEvent(5.0); | llSetTimerEvent(5.0); | ||
llSensorRepeat("", NULL_KEY, FALSE, 0.0, 0.0, 2.5); | // Sensor every 2.5 seconds | ||
llSensorRepeat("", NULL_KEY, FALSE, 0.0, 0.0, 2.5); | |||
} | } | ||
Line 71: | Line 74: | ||
{ | { | ||
llSay(0, "I will never happen."); | llSay(0, "I will never happen."); | ||
llSay(0, "Well, unless llSensorRepeat() magically finds something, or maybe there's 2.5+ seconds of lag and the timer() event queues."); | llSay(0, "Well, unless llSensorRepeat() magically finds something,"+ | ||
"or maybe there's 2.5+ seconds of lag and the timer()"+ | |||
"event queues."); | |||
} | } | ||
} | } | ||
</ | </source> | ||
<source lang="lsl2"> | |||
// Using a timer to simulate multiple timers | |||
integer counter_a = 0; | |||
integer counter_b = 0; | |||
default | |||
{ | |||
state_entry() | |||
{ | |||
//Starting Timer Event | |||
llSetTimerEvent(1.0); | |||
} | |||
timer() | |||
{ | |||
//Increment counters | |||
counter_a++; | |||
counter_b++; | |||
if(counter_a >= 100) | |||
{ | |||
//Resetting Counter A | |||
counter_a = 0; | |||
llOwnerSay("Counter a has reached 100"); | |||
} | |||
if(counter_b >= 200) | |||
{ | |||
//Resetting counter B | |||
counter_b = 0; | |||
llOwnerSay("Counter b has reached 200"); | |||
} | |||
} | |||
} | |||
</source> | |||
|helpers | |helpers | ||
|also_functions= | |also_functions= |
Latest revision as of 11:10, 5 July 2023
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Summary
Function: llSetTimerEvent( float sec );107 | Function ID |
0.0 | Forced Delay |
10.0 | Energy |
Cause the timer event to be triggered a maximum of once every sec seconds. Passing in 0.0 stops further timer events.
• float | sec | – | Any positive non-zero value to enable, zero (0.0) to disable. |
Caveats
- The time between timer events can be longer, this is caused by:
- Time dilation - See llGetRegionTimeDilation for more information.
- Default event delay - Only so many events can be triggered per second.
- Event Execution - If the execution of an event takes too long.
- The timer persists across state changes, but gets removed when the script is reset. So if you change to a state that has a timer() event, with the timer still running, it will fire in the new state.
- Setting a new timer replaces the old timer and resets the timer clock.
- If you repeatedly call this function at some interval less than sec the timer event will never fire.
- The timer event is not an interrupt, it will not pause the execution of the currently running event to execute the timer. The current event must finish executing before the timer executes.
Examples
// default of counter is 0 upon script load
integer counter;
float gap = 2.0;
default
{
state_entry()
{
llSetTimerEvent(gap);
}
touch_start(integer total_number)
{
llSay(0, "The timer stops.");
llSetTimerEvent(0.0);
counter = 0;
}
timer()
{
++counter;
llSay(0,
(string)counter+" ticks have passed in " + (string)llGetTime()
+ " script seconds.\nEstimated elapsed time: " + (string)(counter * gap));
}
}
// random period in between (+15.0, +30.0]
// which means the resulting float could be 30.0 but not 15.0
llSetTimerEvent( 30.0 - llFrand(15.0) );
// same results for:
// llSetTimerEvent( 30.0 + llFrand(-15.0) );
// The timer event will never fire.
default
{
state_entry()
{
llSetTimerEvent(5.0);
// Sensor every 2.5 seconds
llSensorRepeat("", NULL_KEY, FALSE, 0.0, 0.0, 2.5);
}
no_sensor()
{
llSetTimerEvent(5.0);
}
timer()
{
llSay(0, "I will never happen.");
llSay(0, "Well, unless llSensorRepeat() magically finds something,"+
"or maybe there's 2.5+ seconds of lag and the timer()"+
"event queues.");
}
}
// Using a timer to simulate multiple timers
integer counter_a = 0;
integer counter_b = 0;
default
{
state_entry()
{
//Starting Timer Event
llSetTimerEvent(1.0);
}
timer()
{
//Increment counters
counter_a++;
counter_b++;
if(counter_a >= 100)
{
//Resetting Counter A
counter_a = 0;
llOwnerSay("Counter a has reached 100");
}
if(counter_b >= 200)
{
//Resetting counter B
counter_b = 0;
llOwnerSay("Counter b has reached 200");
}
}
}
Notes
- Notes on minimum practical llSetTimerEvent values, Second Life forum, 2011-03-21