waitUntil: Difference between revisions
Jump to navigation
Jump to search
Lou Montana (talk | contribs) m (Text replacement - "<dt class="note">([^<>]+) " to "<dt class="note">$1</dt> ") |
Lou Montana (talk | contribs) m (Text replacement - " <dl class="command_description"> <dt><dt>" to " <dl class="command_description"> <dt><dt>") |
||
(13 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{RV|type=command | {{RV|type=command | ||
| arma1 | |game1= arma1 | ||
|version1= 1.00 | |||
|1.00 | |game2= arma2 | ||
|version2= 1.00 | |||
|game3= arma2oa | |||
|version3= 1.50 | |||
|game4= tkoh | |||
|version4= 1.00 | |||
|game5= arma3 | |||
|version5= 0.50 | |||
|gr1= Program Flow | |gr1= Program Flow | ||
| Suspends execution of [[Scheduler | scheduled]] script until the given condition satisfied. This command will loop and call the code inside <tt>{}</tt> ''mostly'' | |descr= Suspends execution of [[Scheduler|scheduled]] script until the given condition satisfied. | ||
If the very first execution of the code returns [[true]] the command will exit immediately, therefore it will not produce any "Suspending not allowed in this context" error when used inside [[Scheduler#Unscheduled_Environment|non-scheduled]] script. For all other uses it must be executed in environment that allows [[Scheduler#Suspension|suspension]] ([[canSuspend]]), such as [[spawn]]ed or [[execVM]]ed code | * This command will loop and call the code inside <tt>{}</tt> '''mostly every frame''', depends on complexity of the condition and the overall engine load, until the [[Code|code]] returns [[true]] | ||
{{ | |||
* If the very first execution of the code returns [[true]] the command will exit immediately, therefore it will not produce any "Suspending not allowed in this context" error when used inside [[Scheduler#Unscheduled_Environment|non-scheduled]] script. For all other uses it must be executed in environment that allows [[Scheduler#Suspension|suspension]] ([[canSuspend]]), such as [[spawn]]ed or [[execVM]]ed code | |||
* Avoid doing {{ic|[[waitUntil]] {[[time]] > 20};}} and use {{ic|[[sleep]] 20;}} instead! | |||
* If you can, add a [[sleep]] to the condition to save some cpu cycles {{ic|[[waitUntil]] {[[sleep]] 1; ![[alive]] [[player]]};}} | |||
{{Feature|arma3|Since Arma 3 v1.94, a ''condition'' returning anything other than [[true]] or [[false]] '''will''' result in an appropriate type error.}} | |||
|pr= For some unknown reason if you have [[waitUntil]] loop active and game is '''saved/loaded''', some variables in the expression may appear undefined for a short time. As a workaround, assign expression to a variable and make sure it is defined before [[waitUntil]] checks it: | |pr= For some unknown reason if you have [[waitUntil]] loop active and game is '''saved/loaded''', some variables in the expression may appear undefined for a short time. As a workaround, assign expression to a variable and make sure it is defined before [[waitUntil]] checks it: | ||
<code>[[waitUntil]] { [[private]] _expression {{=}} var1 && (var2 > 10); ![[isNil]] "_expression" && { _expression } };</code> | <code>[[waitUntil]] { [[private]] _expression {{=}} var1 && (var2 > 10); ![[isNil]] "_expression" && { _expression } };</code> | ||
| [[waitUntil]] condition | |s1= [[waitUntil]] condition | ||
|p1= condition: [[Code]] - | |p1= condition: [[Code]] - The expression that '''must''' return a [[Boolean]], [[true]] to finish waiting or [[false]] to continue waiting | ||
| [[Anything]] - | |r1= [[Anything]] - The value the condition evaluates to when the wait is over (normally [[true]]) | ||
|x1= <code>[[waitUntil]] { [[not]] [[alive]] [[player]] };</code> | |x1= <code>[[waitUntil]] { [[not]] [[alive]] [[player]] };</code> | ||
|x2= <code>_i = 0; [[waitUntil]] { _i = _i + 1; _i >= 100 }; </code> | |x2= <code>_i = 0; [[waitUntil]] { _i = _i + 1; _i >= 100 };</code> | ||
|x3= <code>[[waitUntil]] {[[sleep]] 1; [[not]] [[alive]] [[player]] }; {{cc|Checks every 1 second}}</code> | |x3= <code>[[waitUntil]] {[[sleep]] 1; [[not]] [[alive]] [[player]] }; {{cc|Checks every 1 second}}</code> | ||
Line 29: | Line 48: | ||
[[while]] { [[true]] } [[do]] { | [[while]] { [[true]] } [[do]] { | ||
[[waitUntil]] { | [[waitUntil]] { | ||
[[inputAction]] ([[_this]] [[select]] 0) == 1; | [[inputAction]] ([[Magic Variables#this|_this]] [[select]] 0) == 1; | ||
}; | }; | ||
[[diag_log]] [[format]] ["%1 @ %2", [[_this]] [[select]] 0, [[diag_tickTime]]<nowiki>]</nowiki>; | [[diag_log]] [[format]] ["%1 @ %2", [[Magic Variables#this|_this]] [[select]] 0, [[diag_tickTime]]<nowiki>]</nowiki>; | ||
}; | }; | ||
};</code> | };</code> | ||
Although perhaps better to use [[BIS_fnc_addStackedEventHandler|onEachFrame]], depending on the application. | Although perhaps better to use [[BIS_fnc_addStackedEventHandler|onEachFrame]], depending on the application. | ||
|x5= Use [[getVariable]] with default value:<code> | |x5= Use [[getVariable]] with default value to prevent unexcepted script errors: | ||
<code>[[waitUntil]] { bank [[getVariable]] ["money", 0] > 0 }; | |||
[[waitUntil]] { bank [[getVariable]] ["money", 0] > 0 }; | |||
[[waitUntil]] { [[missionNamespace]] [[getVariable]] ["isready", [[false]]] };</code> | [[waitUntil]] { [[missionNamespace]] [[getVariable]] ["isready", [[false]]] };</code> | ||
Always return [[Boolean]]:<code>{{cc|bad}} | |||
|x6= Always return [[Boolean]]:<code>{{cc|bad}} | |||
[[waitUntil]] { [[if]] ([[not]] [[alive]] [[player]]) [[exitWith]] {}; _time {{=}} _time + 1 }; | [[waitUntil]] { [[if]] ([[not]] [[alive]] [[player]]) [[exitWith]] {}; _time {{=}} _time + 1 }; | ||
{{cc|good}} | {{cc|good}} | ||
Line 51: | Line 66: | ||
[[waitUntil]] { [[not]] [[alive]] [[player]] };</code> | [[waitUntil]] { [[not]] [[alive]] [[player]] };</code> | ||
| [[sleep]], [[uiSleep]], [[canSuspend]], [[spawn]], [[execVM]], [[while]], [[Control Structures]] | |seealso= [[sleep]], [[uiSleep]], [[canSuspend]], [[spawn]], [[execVM]], [[while]], [[Control Structures]] | ||
}} | }} | ||
<dl class="command_description"> | <dl class="command_description"> | ||
<dt><dt> | |||
<dd class="notedate">Posted on December 20, 2006 - 19:55</dd> | <dd class="notedate">Posted on December 20, 2006 - 19:55</dd> | ||
<dt class="note">[[User:CrashDome|CrashDome]]</dt> | <dt class="note">[[User:CrashDome|CrashDome]]</dt> | ||
<dd class="note"> | <dd class="note"> | ||
waitUntil suspends both SQF functions and SQF scripts. In functions, the calling script is still in suspension due to waiting for a return from the [[call]] command. The game engine will continue, however. See [[Function]] for more detail. | waitUntil suspends both SQF functions and SQF scripts. In functions, the calling script is still in suspension due to waiting for a return from the [[call]] command. The game engine will continue, however. See [[Function]] for more detail. | ||
<dt><dt> | |||
<dd class="notedate">Posted on April 2, 2010 - 17:10</dd> | <dd class="notedate">Posted on April 2, 2010 - 17:10</dd> | ||
<dt class="note">[[User:Roehre|Roehre]]</dt> | <dt class="note">[[User:Roehre|Roehre]]</dt> | ||
<dd class="note"> | <dd class="note"> | ||
Prior to Arma 3 v1. | Prior to Arma 3 v1.94 if [[waitUntil]] uses an undefined [[call]] code, [[waitUntil]] won't release, even when this code is separated from other conditions through [[or]]. Be warned that this won't cause an error message. | ||
<dt><dt> | |||
<dt | |||
<dd class="notedate">Posted on December 13, 2014 - 23:25 (UTC)</dd> | <dd class="notedate">Posted on December 13, 2014 - 23:25 (UTC)</dd> | ||
<dt class="note">[[User:Commy2|Commy2]]</dt> | <dt class="note">[[User:Commy2|Commy2]]</dt> | ||
Line 81: | Line 90: | ||
<code>[[waitUntil]] { | <code>[[waitUntil]] { | ||
{{cc|exit loop if the unit gets deleted}} | {{cc|exit loop if the unit gets deleted}} | ||
[[if]] ([[isNull]] _unit) [[exitWith]] { [[true]] }; {{cc|has to return true to continue}} | |||
![[alive]] _unit; | ![[alive]] _unit; | ||
Line 88: | Line 97: | ||
</dd> | </dd> | ||
</dl> | </dl> | ||
Revision as of 16:46, 12 June 2021
Description
- Description:
- Suspends execution of scheduled script until the given condition satisfied.
- This command will loop and call the code inside {} mostly every frame, depends on complexity of the condition and the overall engine load, until the code returns true
- If the very first execution of the code returns true the command will exit immediately, therefore it will not produce any "Suspending not allowed in this context" error when used inside non-scheduled script. For all other uses it must be executed in environment that allows suspension (canSuspend), such as spawned or execVMed code
- Problems:
- For some unknown reason if you have waitUntil loop active and game is saved/loaded, some variables in the expression may appear undefined for a short time. As a workaround, assign expression to a variable and make sure it is defined before waitUntil checks it:
waitUntil { private _expression = var1 && (var2 > 10); !isNil "_expression" && { _expression } };
- Groups:
- Program Flow
Syntax
- Syntax:
- waitUntil condition
- Parameters:
- condition: Code - The expression that must return a Boolean, true to finish waiting or false to continue waiting
- Return Value:
- Anything - The value the condition evaluates to when the wait is over (normally true)
Examples
- Example 1:
waitUntil { not alive player };
- Example 2:
_i = 0; waitUntil { _i = _i + 1; _i >= 100 };
- Example 3:
waitUntil {sleep 1; not alive player }; // Checks every 1 second
- Example 4:
- An on-the-fly custom event handler:
_myEH = ["ZoomIn"] spawn { while { true } do { waitUntil { inputAction (_this select 0) == 1; }; diag_log format ["%1 @ %2", _this select 0, diag_tickTime]; }; };
Although perhaps better to use onEachFrame, depending on the application. - Example 5:
- Use getVariable with default value to prevent unexcepted script errors:
waitUntil { bank getVariable ["money", 0] > 0 }; waitUntil { missionNamespace getVariable ["isready", false] };
- Example 6:
- Always return Boolean:
// bad waitUntil { if (not alive player) exitWith {}; _time = _time + 1 }; // good waitUntil { if (not alive player) exitWith { true }; _time = _time + 1; false }; // perfect waitUntil { not alive player };
Additional Information
Notes
-
Report bugs on the Feedback Tracker and/or discuss them on the Arma Discord or on the Forums.
Only post proven facts here! Add Note
- Posted on December 20, 2006 - 19:55
- CrashDome
- waitUntil suspends both SQF functions and SQF scripts. In functions, the calling script is still in suspension due to waiting for a return from the call command. The game engine will continue, however. See Function for more detail.
- Posted on April 2, 2010 - 17:10
- Roehre
- Prior to Arma 3 v1.94 if waitUntil uses an undefined call code, waitUntil won't release, even when this code is separated from other conditions through or. Be warned that this won't cause an error message.
- Posted on December 13, 2014 - 23:25 (UTC)
- Commy2
-
If you want to use waitUntil together with exitWith, remember that the loop only exits if the code block returns true.
It should look like this:waitUntil { // exit loop if the unit gets deleted if (isNull _unit) exitWith { true }; // has to return true to continue !alive _unit; };
Categories:
- Scripting Commands
- Introduced with Armed Assault version 1.00
- ArmA: Armed Assault: New Scripting Commands
- ArmA: Armed Assault: Scripting Commands
- Arma 2: Scripting Commands
- Arma 2: Operation Arrowhead: Scripting Commands
- Take On Helicopters: Scripting Commands
- Arma 3: Scripting Commands
- Command Group: Program Flow