switchMove: Difference between revisions

From Bohemia Interactive Community
Jump to navigation Jump to search
mNo edit summary
m (Text replacement - "AgentRevolution" to "AgentRev")
 
(77 intermediate revisions by 9 users not shown)
Line 1: Line 1:
{{Command|= Comments
{{RV|type=command
____________________________________________________________________________________________


| ofp |= Game name
|game1= ofp
|version1= 1.00


|1.00|= Game version
|game2= ofpe
|version2= 1.00


|arg= global |= Arguments in MP
|game3= arma1
|version3= 1.00


|eff= local |= Effects in MP
|game4= arma2
____________________________________________________________________________________________
|version4= 1.00


| When used on a person, the given move is started immediately (there is no transition). Use switchmove "" to switch back to the default movement if there is no transition back, otherwise the person may be stuck.
|game5= arma2oa
|version5= 1.50


[[:ArmA2:_Moves|List of moves in ArmA 2]]<br />
|game6= tkoh
[[:Armed_Assault:_Moves_List|List of moves in Armed Assault]]<br />
|version6= 1.00
[[:Operation_Flashpoint:_Moves_List|List of moves in Operation Flashpoint: Resistance]] |= Description
____________________________________________________________________________________________


| person '''switchmove''' movename |= Syntax
|game7= arma3
|version7= 0.50


|p1= person: [[Object]] |= Parameter 1
|arg= local


|p2= movename: [[String]] |= Parameter 2
|eff= global


| [[Nothing]] |= Return value
|gr1= Animations
____________________________________________________________________________________________
 
|x1= <code>_loon1 [[switchMove]] "FXStandDip" </code> |= Example 1
____________________________________________________________________________________________


| [[playAction]], [[playActionNow]], [[playMove]], [[playMoveNow]], [[playGesture]] |= See also
|descr= Immediately applies given animation to the unit. For a smooth transition from the current animation, use [[playMove]].
{{Feature|informative|see [[:Category:Moves]] for respective games animations.}}


This command first resets the unit's animation states (including aiming state, gesture state, etc.) then puts the unit in the first frame of the animation (therefore showing no transition).
If an invalid animation is provided, the unit's animations will be reset but no new animation will be played (see {{Link|#Example 3}}).
{{Feature|informative|It is a good practice to always use [[playMoveNow]] after [[switchMove]] to make sure the animation plays correctly when using the first syntax:
<sqf>
_unit switchMove "myMove";
_unit playMoveNow "myMove";
</sqf>
The alternative syntax does this automatically.
}}
}}


<h3 style="display:none">Notes</h3>
|mp= This command has a global effect when executed locally to the unit and will synchronise properly for JIP.
<dl class="command_description">
In this case the animation on the executing machine is immediate while on remote machines it will be transitional.
<!-- Note Section BEGIN -->
In order for the animation to change immediately on every PC in multiplayer, use global remote execution (see {{Link|#Example 2}}).
For a smooth transition use [[playMove]]. This command must be executed after mission start. If you place it into init.sqs or in the Init field of some unit, it will not work. Just add a little delay (~0.001) and then place the command.
When the argument is remote, the animation change on the executing PC is only temporary.
<dd class="notedate">Posted on March 25, 2007 - 23:48
 
<dt class="note">'''[[User:Hurricane|Hurricane]]'''<dd class="note">
|s1= person [[switchMove]] moveName
 
|p1= person: [[Object]] - unit
 
|p2= moveName: [[String]] - animation state (see [[animationState]])
 
|r1= [[Nothing]]
 
|s2= person [[switchMove]] [moveName, time, blendFactor, resetAim]
 
|s2since= arma3 2.18
 
|p21= person: [[Object]] - unit
 
|p22= moveName: [[String]] - entry from {{hl|"CfgMovesMaleSdr" >> "states"}} or {{hl|"CfgGesturesMale" >> "states"}}
 
|p23= time: [[Number]] - (Optional, default 0) normalized time, in range 0..1, where 0 = beginning of the animation, and 1 = end of the animation


In some cases the movement won't stay. I.e. AI hostages that put their hands behind their heads (_hostage [[switchMove]] "AmovPercMstpSsurWnonDnon") won't hold their hands up, unless you first use [[disableAI]] "autoTarget" on them. They mostly put their hands down because they 'noticed' unknown objects.
|p24= blendFactor: [[Number]] - (Optional, default 1) how much to blend the current animation with the new animation, in range 0..1, where 0 = current animation, and 1 = new animation. When 1 is used, the switching is instant (not smooth), similar to the first syntax.


<dd class="notedate">Posted on August 03, 2008 - 22:43
|p25= resetAim: [[Boolean]] - (Optional, default true) whether the aim/head direction should be reset after switching
<dt class="note">'''[[User:Killswitch|Killswitch]]'''<dd class="note">
This command will not cause an [[ArmA:_Event_Handlers#AnimChanged|AnimChanged]] or [[ArmA:_Event_Handlers#AnimDone|AnimDone]] event. However, [[playMove]] will.


<!-- Note Section END -->
|r2= [[Nothing]]
</dl>


<h3 style="display:none">Bottom Section</h3>
|x1= Prone:
[[Category:Scripting Commands|SWITCHMOVE]]
<sqf>player switchMove "AmovPpneMstpSrasWrflDnon";</sqf>
[[Category:Scripting Commands OFP 1.99|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands OFP 1.96|SWITCHMOVE]]
[[Category:Scripting Commands OFP 1.46|SWITCHMOVE]]
[[Category:Scripting Commands ArmA|SWITCHMOVE]]
[[Category:Scripting Commands ArmA2|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting Commands Arma 3|{{uc:{{PAGENAME}}}}]]
[[Category:Scripting_Commands_Take_On_Helicopters|{{uc:{{PAGENAME}}}}]]


<!-- CONTINUE Notes -->
|x2= Sit player immediately and globally:
<dl class="command_description">
<sqf>[player, "AmovPsitMstpSlowWrflDnon"] remoteExec ["switchMove"];</sqf>
<dd class="notedate">Posted on November 12, 2016 - 20:11 (UTC)</dd>
 
<dt class="note">[[User:AgentRevolution|AgentRev]]</dt>
|x3= Resets unit's animation:
<dd class="note">
<sqf>_unit switchMove "";</sqf>
When using this command on the [[player]] unit outside [[Scheduler#Unscheduled_Environment|unscheduled]] UI contexts, it will cause a minor camera glitch for a single frame.<br/>
 
For example,  [[Arma_3:_Event_Handlers/addMissionEventHandler#Draw3D|Draw3D]] and [[displayAddEventHandler|KeyDown]] are UI contexts and so are not affected by the glitch, but [[Arma_3:_Event_Handlers/addMissionEventHandler#EachFrame|EachFrame]] and scheduled scripts are not UI contexts and are affected by the glitch.
|x4= <sqf>
</dd>
// Create a dummy agent that copies your moves
</dl>
ai1 = createAgent [typeOf player, getPosATL player, [], 0, "NONE"];
<!-- DISCONTINUE Notes -->
ai1 disableAI "ALL";
onEachFrame
{
ai1 setAnimSpeedCoef getAnimSpeedCoef player;
ai1 setVectorDir vectorDir player;
private _m = animationState player;
private _g = gestureState player;
private _i = getUnitMovesInfo player;
private _a = getUnitMovesInfo ai1;
if (animationState ai1 != _m || abs(_i#1 - _a#1) > 0.1) then
{
ai1 switchMove [_m, _i#0, _i#3, false];
};
 
if ((gestureState ai1 != _g || abs(_i#6 - _a#6) > 0.1) && (_g != "<none>" && _g find "_player" < 0)) then
{
ai1 switchGesture [_g, _i#5, _i#8, false];
};
}
</sqf>
 
|seealso= [[switchGesture]] [[playMove]] [[playMoveNow]] [[switchAction]] [[playAction]] [[playActionNow]] [[getUnitMovesInfo]]
}}
 
{{Note
|user= Hurricane
|timestamp= 20070325234800
|text= In some cases the movement won't stay. I.e. AI hostages that put their hands behind their heads (_hostage [[switchMove]] "AmovPercMstpSsurWnonDnon") won't hold their hands up, unless you first use [[disableAI]] "autoTarget" on them. They mostly put their hands down because they 'noticed' unknown objects.
}}
 
{{Note
|user= Killswitch
|timestamp= 20080803224300
|text= This command will not cause an [[ArmA:_Event_Handlers#AnimChanged|AnimChanged]] or [[ArmA:_Event_Handlers#AnimDone|AnimDone]] event. However, [[playMove]] will.
}}
 
{{Note
|user= AgentRev
|timestamp= 20161112201100
|text= When using this command on the [[player]] unit outside [[Scheduler#Unscheduled_Environment|unscheduled]] UI contexts, it will cause a minor camera glitch for a single frame.<br>
For example,  [[Arma 3: Mission Event Handlers#Draw3D|Draw3D]] and [[displayAddEventHandler|KeyDown]] are UI contexts and so are not affected by the glitch, but [[Arma 3: Mission Event Handlers#EachFrame|EachFrame]] and [[Scheduler#Scheduled_Environment|scheduled]] scripts are not UI contexts and are affected by the glitch.
}}
 
{{Note
|user= Leopard20
|timestamp= 20210808155900
|text= If the animation you're trying to use with this command has no connection/interpolation to the unit's base animation (usually "AmovPercMstpSrasWrflDnon"), the move might not play using [[switchMove]] alone. In such cases you have to do this:
<sqf>_unit switchMove _move; _unit playMoveNow _move;</sqf>
This must run in '''[[Scheduler|unscheduled environment]]''' (see [[isNil]])<br/>
Alternatively, just use the second syntax:
<sqf>_unit switchMove [_move];</sqf>
}}

Latest revision as of 23:07, 4 May 2024

Hover & click on the images for description

Description

Description:
Immediately applies given animation to the unit. For a smooth transition from the current animation, use playMove.
see Category:Moves for respective games animations.

This command first resets the unit's animation states (including aiming state, gesture state, etc.) then puts the unit in the first frame of the animation (therefore showing no transition). If an invalid animation is provided, the unit's animations will be reset but no new animation will be played (see Example 3).

It is a good practice to always use playMoveNow after switchMove to make sure the animation plays correctly when using the first syntax:

_unit switchMove "myMove"; _unit playMoveNow "myMove";

The alternative syntax does this automatically.
Multiplayer:
This command has a global effect when executed locally to the unit and will synchronise properly for JIP. In this case the animation on the executing machine is immediate while on remote machines it will be transitional. In order for the animation to change immediately on every PC in multiplayer, use global remote execution (see Example 2). When the argument is remote, the animation change on the executing PC is only temporary.
Groups:
Animations

Syntax

Syntax:
person switchMove moveName
Parameters:
person: Object - unit
moveName: String - animation state (see animationState)
Return Value:
Nothing

Alternative Syntax

Syntax:
person switchMove [moveName, time, blendFactor, resetAim]
Parameters:
person: Object - unit
moveName: String - entry from "CfgMovesMaleSdr" >> "states" or "CfgGesturesMale" >> "states"
time: Number - (Optional, default 0) normalized time, in range 0..1, where 0 = beginning of the animation, and 1 = end of the animation
blendFactor: Number - (Optional, default 1) how much to blend the current animation with the new animation, in range 0..1, where 0 = current animation, and 1 = new animation. When 1 is used, the switching is instant (not smooth), similar to the first syntax.
resetAim: Boolean - (Optional, default true) whether the aim/head direction should be reset after switching
Return Value:
Nothing

Examples

Example 1:
Prone:
player switchMove "AmovPpneMstpSrasWrflDnon";
Example 2:
Sit player immediately and globally:
[player, "AmovPsitMstpSlowWrflDnon"] remoteExec ["switchMove"];
Example 3:
Resets unit's animation:
_unit switchMove "";
Example 4:
// Create a dummy agent that copies your moves ai1 = createAgent [typeOf player, getPosATL player, [], 0, "NONE"]; ai1 disableAI "ALL"; onEachFrame { ai1 setAnimSpeedCoef getAnimSpeedCoef player; ai1 setVectorDir vectorDir player; private _m = animationState player; private _g = gestureState player; private _i = getUnitMovesInfo player; private _a = getUnitMovesInfo ai1; if (animationState ai1 != _m || abs(_i#1 - _a#1) > 0.1) then { ai1 switchMove [_m, _i#0, _i#3, false]; }; if ((gestureState ai1 != _g || abs(_i#6 - _a#6) > 0.1) && (_g != "<none>" && _g find "_player" < 0)) then { ai1 switchGesture [_g, _i#5, _i#8, false]; }; }

Additional Information

See also:
switchGesture playMove playMoveNow switchAction playAction playActionNow getUnitMovesInfo

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
Hurricane - c
Posted on Mar 25, 2007 - 23:48 (UTC)
In some cases the movement won't stay. I.e. AI hostages that put their hands behind their heads (_hostage switchMove "AmovPercMstpSsurWnonDnon") won't hold their hands up, unless you first use disableAI "autoTarget" on them. They mostly put their hands down because they 'noticed' unknown objects.
Killswitch - c
Posted on Aug 03, 2008 - 22:43 (UTC)
This command will not cause an AnimChanged or AnimDone event. However, playMove will.
AgentRev - c
Posted on Nov 12, 2016 - 20:11 (UTC)
When using this command on the player unit outside unscheduled UI contexts, it will cause a minor camera glitch for a single frame.
For example, Draw3D and KeyDown are UI contexts and so are not affected by the glitch, but EachFrame and scheduled scripts are not UI contexts and are affected by the glitch.
Leopard20 - c
Posted on Aug 08, 2021 - 15:59 (UTC)
If the animation you're trying to use with this command has no connection/interpolation to the unit's base animation (usually "AmovPercMstpSrasWrflDnon"), the move might not play using switchMove alone. In such cases you have to do this:
_unit switchMove _move; _unit playMoveNow _move;
This must run in unscheduled environment (see isNil)
Alternatively, just use the second syntax:
_unit switchMove [_move];