Arma 3 Scripting

Command in Program Flow

waitUntil

Also available as Markdown and JSON, or read the original wiki page.

Description

Suspends execution of scheduled script until the given condition satisfied.

Note

Arma 3: Since Arma 3 v1.94, a condition returning anything other than true or false will result in an appropriate type error.

Syntax

Syntax 1

waitUntil condition

Parameters:

Returns: Anything - the value the condition evaluates to when the wait is over (normally true)

Syntax 2

since arma3 2.22

waitUntil [condition, timeout, interval]

Parameters:

Returns: Anything - the value the condition evaluates to when the wait is over (normally true), or Nothing if the timeout ended the wait

Syntax 3

since arma3 2.22

waitUntil scriptHandle

Parameters:

Returns: Anything - The result of the script or Promise

Syntax 4

since arma3 2.22

waitUntil [scriptHandle, timeout]

Parameters:

Returns: Anything - the result of the script or Promise. Or Nothing if timed out.

Examples

Example 1

waitUntil { not alive player };

Example 2

_i = 0; waitUntil { _i = _i + 1; _i >= 100 };

Example 3

waitUntil can lead to performance loss if used improperly:

waitUntil { not alive player };            // bad
waitUntil { sleep 1; not alive player };    // good - checks every 1 second
player addEventHandler ["Killed", {  }];    // best - don't forget about Event Handlers

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 it may be better to use onEachFrame (stacked) mission Event Handler, 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:

waitUntil { sleep 1; if (not alive player) exitWith {}; _time = _time + 1 };                // bad
waitUntil { sleep 1; if (not alive player) exitWith { true }; _time = _time + 1; false };    // good
waitUntil { sleep 1; not alive player };                                                    // perfect

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 = someBooleanVar && (someNumberVar > 10); !isNil "_expression" && { _expression } };

See also

sleep · uiSleep · canSuspend · spawn · execVM · while · Control Structures

Community notes

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.

RoehrenRadio

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.

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;
};