---
name: "doFSM"
type: command
status: ok
groups: ["Unit Control"]
arma3_since: "0.50"
locality: {"argument": null, "effect": null, "server_exec": false}
source: https://community.bistudio.com/wiki/doFSM
revid: 379414
updated: 2026-10-31T00:03:21Z
---

# doFSM

*Command · Unit Control · Arma 3 v0.50 · introduced in Armed Assault v1.00*

## Description

Orders a unit to process command defined by [FSM](../topics/FSM.md) file (silently).

Unlike with execFSM where *_this* is passed to the FSM, the following parameters are passed when using doFSM/commandFSM:

_leader: leader of subgroup with this command
_destination: command destination/position
_target: command target
_units: list of all persons in subgroup

## Syntax

```sqf
unit doFSM [fsmName, position, target]
```

**Parameters:**

- `unit`: [Object](../topics/Object.md) or [Array](../topics/Array.md) of [Objects](../topics/Object.md)
- `fsmName`: [String](../topics/String.md)
- `position`: [Position](../topics/Position.md)
- `target`: [Object](../topics/Object.md)

**Returns:** [Nothing](../topics/Nothing.md)

## Examples

### Example 1

```sqf
_soldierOne doFSM ["move.fsm", position player, player];
```

### Example 2

```sqf
units player doFSM ["move.fsm", position player, player];
```

## See also

[FSM](../topics/FSM.md) · [FSM Editor Manual](../topics/FSM_Editor_Manual.md) · [commandFSM](../commands/commandFSM.md) · [completedFSM](../commands/completedFSM.md) · [execFSM](../commands/execFSM.md) · [getFSMVariable](../commands/getFSMVariable.md) · [setFSMVariable](../commands/setFSMVariable.md) · [unitReady](../commands/unitReady.md)

## Community notes

**Rübe** — 2010-08-04

Do not *doStop* a unit in a FSM called with *doFSM* or *commandFSM*. Doing so nevertheless will halt your FSM, since no links are followed anymore (doing so in an end state should be fine though). Also this may crash your game in certain mysterious circumstances.

You may design your FSM so that they may be called with doFSM/commandFSM and execFSM likewise by checking if *_units* or *_this* is nil and then init the variables accordingly. Just remember that you should use the low level *moveTo* (together with *moveToCompleted*, *moveToFailed*) if do-/commandFSM'd, and *doMove* or *commandMove* (together with *unitReady*) if execFSM'd. A *moveTo* in an FSM started with *execFSM* won't do anything, likewise *doMove* in a FSM started with *doFSM* or *commandFSM* wont work either. Think about it for a minute and you will see why. (hint: a unit running a FSM called with *doFSM* or *commandFSM* will _never_ return true for *(unitReady _unit)*)

Anyway, if you want to be able to call your FSM either way, a "ready" condition might look light this: *(moveToCompleted _unit) || (moveToFailed _unit) || (unitReady _unit)*, assuming you have a *moveTo* or a *doMove* (depending on how the fsm is called) in the prior state.

---

**Katulobotomia** — 2015-02-14

Adding to Rübe's note, doFSM can be checked if it has finished by *unitReady* as of 2015 and it will return *true* when your FSM has completed.

<sub>Source: [BI Community Wiki — doFSM](https://community.bistudio.com/wiki/doFSM) (revision 379414).</sub>
