exitWith: Difference between revisions
Jump to navigation
Jump to search
Lou Montana (talk | contribs) m (Text replacement - "</dl> <dl class="command_description"> " to "") |
Lou Montana (talk | contribs) (Some wiki formatting) |
||
Line 18: | Line 18: | ||
|gr1= Program Flow | |gr1= Program Flow | ||
|descr= Exits current scope | |descr= Exits the '''current''' code scope. Often used for exiting [[do]], [[for]], [[count]], [[forEach]] or the whole script. | ||
{{Feature|informative|See {{HashLink|Variables#Local Variables Scope}} for more information.}} | |||
|s1= ifType [[exitWith]] code | |s1= ifType [[exitWith]] code | ||
|p1= ifType: [[If Type]] | |p1= ifType: [[If Type]] | ||
|p2= code: [[Code]] | |p2= code: [[Code]] | ||
|r1= [[Anything]] | |r1= [[Anything]] | ||
|x1= <code>[[ | |x1= <code>[[systemChat]] "start"; | ||
[[private]] _condition = [[true]]; | |||
[[if]] (_condition) [[then]] | |||
{ | |||
[[if]] ([[true]]) [[exitWith]] | |||
{ | |||
[[systemChat]] "exiting if _condition scope"; | |||
}; | |||
[[systemChat]] "never shown"; | |||
}; | |||
[[systemChat]] "exiting #1 worked"; | |||
[[if]] ([[true]]) [[exitWith]] | |||
{ | |||
[[systemChat]] "exiting the main scope = leaving the whole script"; | |||
}; | |||
[[systemChat]] "never shown - the script has already ended"; | |||
</code> | |||
|x2= <code>[[for]] "_j" [[from]] 1 [[to]] 10 [[do]] | |x2= <code>[[for]] "_j" [[from]] 1 [[to]] 10 [[do]] | ||
{ | { | ||
[[ | [[systemChat]] [[format]] ["%1", _j]; | ||
if (_j | |||
{{cc|the [[for]] loop will cease and code execution will continue after the end of the loop}} | |||
[[if]] (_j == 5) [[exitWith]] | |||
{ | |||
[[systemChat]] "5 is enough"; | |||
}; | |||
}; | }; | ||
[[ | [[systemChat]] "Complete";</code> | ||
|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 is exited. To exit and terminate scopes which are called every frame such as [[onEachFrame]] and [[waitUntil]] use the following examples: | ||
<code>[[onEachFrame]] | <code>[[onEachFrame]] { | ||
[[if]] (![[alive]] [[player]]) [[exitWith]] | [[if]] (![[alive]] [[player]]) [[exitWith]] | ||
[[onEachFrame]] | { | ||
[[onEachFrame]] {}; | |||
}; | |||
}; | |||
</code> | </code> | ||
Line 53: | Line 78: | ||
[[if]] ([[time]] > _time) [[exitWith]] { [[true]] }; | [[if]] ([[time]] > _time) [[exitWith]] { [[true]] }; | ||
[[false]] | [[false]] | ||
} | }; | ||
</code> | </code> | ||
|seealso=[[scopeName]], [[breakOut]], [[breakTo]], [[else]], [[Control Structures]], [[then]], [[assert]], [[try]], [[catch]], [[throw]] | |||
|x4= <code>[[while]] { [[true]] } [[do]] | |||
{ | |||
[[if]] ([[alive]] [[player]]) [[then]] | |||
{ | |||
[[if]] ([[time]] > 300) [[exitWith]] {{cc|'''wrong''' - it will only leave the "if alive player" scope, remaining in the "while true" loop forever}} | |||
{ | |||
[[hint]] "exiting"; | |||
}; | |||
}; | |||
};</code> | |||
|x5= <code>[[if]] (_condition) [[exitWith]] | |||
{ | |||
[[hint]] "reached"; | |||
}; | |||
{{cc|[[else]] { [[hint]] "not reached" }; // '''wrong''' - using [[else]] does not work and makes no sense here}} | |||
</code> | |||
<code>[[if]] (_condition) [[exitWith]] | |||
{ | |||
[[hint]] "reached"; | |||
}; | |||
[[hint]] "not reached"; {{cc|'''correct''' - if _condition is met, the scope has already been exited by now}} | |||
</code> | |||
|seealso= [[scopeName]], [[breakOut]], [[breakTo]], [[else]], [[Control Structures]], [[then]], [[assert]], [[try]], [[catch]], [[throw]] | |||
}} | }} | ||
Line 64: | Line 113: | ||
<dd class="notedate">Posted on May 28, 2010 - 22:15</dd> | <dd class="notedate">Posted on May 28, 2010 - 22:15</dd> | ||
<dt class="note">[[User:Roehre|Roehre]]</dt> | <dt class="note">[[User:Roehre|Roehre]]</dt> | ||
<dd class="note">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. | <dd class="note">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.</dd> | ||
<dt><dt> | <dt><dt> | ||
<dd class="notedate">Posted on August 04, 2013 - 12:20</dd> | <dd class="notedate">Posted on August 04, 2013 - 12:20</dd> | ||
<dt class="note">[[User:Killzone_Kid|Killzone_Kid]]</dt> | <dt class="note">[[User:Killzone_Kid|Killzone_Kid]]</dt> | ||
<dd class="note">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 [http://killzonekid.com/arma-scripting-tutorials-scopes/ this resource]. | <dd class="note">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 [http://killzonekid.com/arma-scripting-tutorials-scopes/ this resource].</dd> | ||
<dt></dt> | <dt></dt> | ||
Line 87: | Line 125: | ||
<dd class="note"> | <dd class="note"> | ||
[[exitWith]] cannot be used in event handlers with override ability to simply exit with override value. The following is incorrect: | [[exitWith]] cannot be used in event handlers with override ability to simply exit with override value. The following is incorrect: | ||
<code> | <code>{{cc|INCORRECT USAGE}} | ||
[[onMapSingleClick]] {[[if]] (![[isServer]]) [[exitWith]] {[[true]]}};</code> | [[onMapSingleClick]] {[[if]] (![[isServer]]) [[exitWith]] {[[true]]}};</code> | ||
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: | 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: | ||
<code> | <code>{{cc|CORRECT USAGE}} | ||
[[onMapSingleClick]] {[[call]] {[[if]] (![[isServer]]) [[exitWith]] {[[true]]}}};</code> | [[onMapSingleClick]] {[[call]] {[[if]] (![[isServer]]) [[exitWith]] {[[true]]}}};</code> | ||
[[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> | ||
</dl> | </dl> |
Revision as of 13:58, 9 August 2021
Description
- Description:
- Exits the current code scope. Often used for exiting do, for, count, forEach or the whole script.
- Groups:
- Program Flow
Syntax
Examples
- Example 1:
systemChat "start"; private _condition = true; if (_condition) then { if (true) exitWith { systemChat "exiting if _condition scope"; }; systemChat "never shown"; }; systemChat "exiting #1 worked"; if (true) exitWith { systemChat "exiting the main scope = leaving the whole script"; }; systemChat "never shown - the script has already ended";
- Example 2:
for "_j" from 1 to 10 do { systemChat format ["%1", _j]; // the for loop will cease and code execution will continue after the end of the loop if (_j == 5) exitWith { systemChat "5 is enough"; }; }; systemChat "Complete";
- Example 3:
- Most loops will also terminate when their scope is 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 };
- Example 4:
while { true } do { if (alive player) then { if (time > 300) exitWith // wrong - it will only leave the "if alive player" scope, remaining in the "while true" loop forever { hint "exiting"; }; }; };
- Example 5:
if (_condition) exitWith { hint "reached"; }; // else { hint "not reached" }; // wrong - using else does not work and makes no sense here
if (_condition) exitWith { hint "reached"; }; hint "not reached"; // correct - if _condition is met, the scope has already been exited by now
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 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 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.
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