exitWith: Difference between revisions
Jump to navigation
Jump to search
Lou Montana (talk | contribs) m (Text replacement - "_{10,} " to "") |
Lou Montana (talk | contribs) m (Text replacement - "{{Command " to "{{RV|type=command ") |
||
(5 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
{{ | {{RV|type=command | ||
| arma1 | | arma1 | ||
|gr1= Program Flow | |gr1= Program Flow | ||
|1.00 | |||
| Exits current scope {...} it is executed from if condition evaluates [[true]], creates new scope {...code...} and executes the given code in it. Often used for exiting [[do]], [[for]], [[count]] or [[forEach]]. Simply exiting [[waitUntil]] or [[onEachFrame]] scopes with [[exitWith]] will have no effect as these scopes are called repeatedly by the engine and require different handling to terminate (see Example 3). | |||
| | | ifType [[exitWith]] code | ||
| | |p1= ifType: [[If Type]] | ||
|p2= code: [[Code]] | |||
| [[Anything]] | |||
| [[Anything]] | |||
|x1= <code>[[if]] (_x>5) [[exitWith]] {[[echo]] "_x is too big"; _x}</code> | |x1= <code>[[if]] (_x>5) [[exitWith]] {[[echo]] "_x is too big"; _x}</code> | ||
When _x is greater than 5, outputs message and terminates code in current level with value of _x. | When _x is greater than 5, outputs message and terminates code in current level with value of _x. | ||
|x2= <code>[[for]] "_j" [[from]] 1 [[to]] 10 [[do]] | |x2= <code>[[for]] "_j" [[from]] 1 [[to]] 10 [[do]] | ||
Line 29: | Line 27: | ||
[[player]] [[sideChat]] "Complete";</code> | [[player]] [[sideChat]] "Complete";</code> | ||
''Only'' the "for" loop will exit when the exitWith condition has been fulfilled (not the whole script). Execution will continue after the end of the loop (player sideChat "Complete"). | ''Only'' the "for" loop will exit when the exitWith condition has been fulfilled (not the whole script). Execution will continue after the end of the loop (player sideChat "Complete"). | ||
|x3= Most loops will also terminate when their scope exited. To exit and terminate scopes which are called every frame such as [[onEachFrame]] and [[waitUntil]] use the following examples: | |x3= Most loops will also terminate when their scope exited. To exit and terminate scopes which are called every frame such as [[onEachFrame]] and [[waitUntil]] use the following examples: | ||
Line 47: | Line 44: | ||
} | } | ||
</code> | </code> | ||
| [[scopeName]], [[breakOut]], [[breakTo]], [[else]], [[Control Structures]], [[then]], [[assert]], [[try]], [[catch]], [[throw]] | | [[scopeName]], [[breakOut]], [[breakTo]], [[else]], [[Control Structures]], [[then]], [[assert]], [[try]], [[catch]], [[throw]] | ||
}} | }} | ||
<dl class="command_description"> | <dl class="command_description"> | ||
<!-- Note Section BEGIN --> | <!-- Note Section BEGIN --> | ||
Line 80: | Line 75: | ||
</dl> | </dl> | ||
[[Category:Scripting Commands|{{uc:{{PAGENAME}}}}]] | [[Category:Scripting Commands|{{uc:{{PAGENAME}}}}]] | ||
Line 102: | Line 96: | ||
[[exitWith]] will exit current [[call]] scope only and override value therefore will appear in the main scope of the EH, right where we want it. | [[exitWith]] will exit current [[call]] scope only and override value therefore will appear in the main scope of the EH, right where we want it. | ||
</dd> | </dd> | ||
<dd class="notedate">Posted on October 12, 2016 - 17:56 (UTC)</dd> | <dd class="notedate">Posted on October 12, 2016 - 17:56 (UTC)</dd> | ||
<dt class="note">[[User:RHfront|RHfront]]</dt> | <dt class="note">[[User:RHfront|RHfront]]</dt> |
Revision as of 01:04, 23 January 2021
Description
- Description:
- Description needed
- Groups:
- Program Flow
Syntax
- Syntax:
- Syntax needed
- Parameters:
- ifType: If Type
- code: Code
- Return Value:
- Return value needed
Examples
- Example 1:
if (_x>5) exitWith {echo "_x is too big"; _x}
When _x is greater than 5, outputs message and terminates code in current level with value of _x.- Example 2:
for "_j" from 1 to 10 do { player sideChat format ["%1",_j]; if (_j==5) exitWith {player sideChat "5 is enough"}; }; player sideChat "Complete";
Only the "for" loop will exit when the exitWith condition has been fulfilled (not the whole script). Execution will continue after the end of the loop (player sideChat "Complete").- Example 3:
- Most loops will also terminate when their scope exited. To exit and terminate scopes which are called every frame such as onEachFrame and waitUntil use the following examples:
onEachFrame { if (!alive player) exitWith { onEachFrame {} } }
_time = time + 10; waitUntil { if (time > _time) exitWith { true }; false }
Additional Information
- See also:
- See also needed
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 May 28, 2010 - 22:15
- Roehre
- Since Arma 2 uses Blocks in FSM as any ordinary Handle like while, for etc. in Scripts, ExitWith also only closes the Block in the FSM.
- Posted on August 04, 2013 - 12:20
- Killzone_Kid
- The command will exit the current scope - no ifs no buts. If the current scope is a loop, it will exit the loop. If the current scope is the main body of a script, it will exit the script. For more understanding of scopes and exitWith have a look at this resource.
- Posted on January 06, 2014 - 13:41
- Naught
- To further explain Killzone_Kid's above statement, exitWith does not work as described within any subsequent inner scopes of a loop - it will only simply exit the current scope. For example, this code will not exit the while loop:
while {true} do { // 'while' scope if (player == (leader player)) then { // 'if-then' scope if (time > (5 * 60)) exitWith {}; // This will only exit the 'if-then' scope }; sleep 1; }; hint "Mission Started"; // This code will never execute
- Posted on March 10, 2016 - 08:31 (UTC)
- Killzone Kid
-
exitWith cannot be used in event handlers with override ability to simply exit with override value. The following is incorrect:
// INCORRECT USAGE onMapSingleClick {if (!isServer) exitWith {true}};
The override value must be returned in the main scope of EH, but since it is exited with exitWith, it never happens. The correct way in this case would be:// CORRECT USAGE onMapSingleClick {call {if (!isServer) exitWith {true}}};
exitWith will exit current call scope only and override value therefore will appear in the main scope of the EH, right where we want it. - Posted on October 12, 2016 - 17:56 (UTC)
- RHfront
- exitWith does not use standard "if-then" syntax, but a unique "if-exitWith" structure.
- exitWith will NOT take else. Attempts to do so will result in "Error exitwith: Type Array, expected code".