Difference between revisions of "State"
m |
Kireji Haiku (talk | contribs) m (changed example script) |
||
Line 51: | Line 51: | ||
{{#vardefine:examples| | {{#vardefine:examples| | ||
<lsl>default | <lsl> | ||
default | |||
{ | { | ||
state_entry() | |||
{ | |||
// PUBLIC_CHANNEL has the integer value 0 | |||
llSay(PUBLIC_CHANNEL, | |||
"You either just saved the script after editing it" | |||
+ "\nand/or the script (re)entered the default state."); | |||
// white and opaque text | |||
llSetText("Click to change states", <1.0, 1.0, 1.0>, (float)TRUE); | |||
} | |||
touch_start(integer num_detected) | |||
{ | { | ||
state | state other; | ||
} | |||
state_exit() | |||
{ | |||
llSay(PUBLIC_CHANNEL, "The script leaves the default state."); | |||
} | } | ||
} | } | ||
state | state other | ||
{ | { | ||
state_entry() | state_entry() | ||
{ | { | ||
llSay(PUBLIC_CHANNEL, "The script entered the other state."); | |||
state default; | state default; | ||
} | } | ||
state_exit() | state_exit() | ||
{ | { | ||
llSay(PUBLIC_CHANNEL, "The script leaves the other state."); | |||
} | } | ||
}</lsl> | } | ||
</lsl> | |||
* '''[http://www.youtube.com/watch?v=49vj9HEI2OY/Basic Tutorial on States, Events, and Functions] | * '''[http://www.youtube.com/watch?v=49vj9HEI2OY/Basic Tutorial on States, Events, and Functions] | ||
}} | }} |
Revision as of 12:38, 5 October 2012
LSL Portal | Functions | Events | Types | Operators | Constants | Flow Control | Script Library | Categorized Library | Tutorials |
Description
In LSL, most scripts sit idle until they receive some input, or detect some change in their environment. At any moment, the script is in some state, and will react to events or inputs according to some scheme defined by the programmer. However, a script can also contain two or more different states, and react differently to events or inputs depending on what state it is in.
The main state is the default state. When a script is compiled, reset or loaded, this is the state it enters by default. After the default state definition can follow additional state definitions which the script may use to change how and which events are handled.
- The correct title of this article is state. The initial letter is shown capitalized due to technical restrictions.
default { events }
default { events }• event | events | – | one or more events |
The default state definition.
state target { events }
• label | target | – | state name | |
• event | events | – | one or more events |
target state definition.
state target;
• label | target | – | name of a state to run |
When a state target; is encountered at runtime, if the current state and the target state are different:
- Trigger state_exit in the current state if it exists and clear the event queue.
- Change state to target, any listens are unregistered.
- Trigger state_entry in the target state if it exists.
If target state is the same as the current state, no state change occurs nor do any of the side effects.
Caveats
- On state change:
- All listens are released.
- The event queue is cleared. (see Notes for a partial workaround)
- Repeating sensors are released.
- The timer event clock is not cleared.
- This means if the new state has a timer event, and the previous state has a timer set, the timer event in the new state will be triggered on the interval set in the previous state.
- The default state must be defined before all others.
- States cannot have user functions or variables inside their immediate scope, only event definitions may be inside a states scope.
- User-defined (global) functions cannot change a script's state. The compiler will throw the error 'ERROR: Global functions can't change state'. Note: Previously, global functions could change state in the body of a simple 'if' statement; this "workaround" no longer works.
Important Issues
SVC-3017 | A | Server drops first touch event when a script returns to a state with a touch_start handler |
Examples
<lsl> default {
state_entry() { // PUBLIC_CHANNEL has the integer value 0 llSay(PUBLIC_CHANNEL, "You either just saved the script after editing it" + "\nand/or the script (re)entered the default state.");
// white and opaque text llSetText("Click to change states", <1.0, 1.0, 1.0>, (float)TRUE); }
touch_start(integer num_detected) { state other; }
state_exit() { llSay(PUBLIC_CHANNEL, "The script leaves the default state."); }
}
state other {
state_entry() { llSay(PUBLIC_CHANNEL, "The script entered the other state."); state default; }
state_exit() { llSay(PUBLIC_CHANNEL, "The script leaves the other state."); }
} </lsl>
Notes
- To avoid dumping previously queued events, consider moving the state target command to the timer event, and calling it with llSetTimerEvent( 0.01 ), then stopping the timer in state_entry of the new state. Do NOT use state_exit if this is a concern.
See Also
Deep Notes
Issues
SVC-3017 | A | Server drops first touch event when a script returns to a state with a touch_start handler |