# Client vs. simulator logic

### Am I a simulator?

Ask `Coherence.SimulatorUtility.IsSimulator`.

```csharp
using Coherence;

if (SimulatorUtility.IsSimulator)
{
    // I'm a simulator!
}
```

There are a few ways you can tell coherence if the instance should behave as a simulator:

* Specifying a `ConnectionType` when connecting via `Coherence.Network.Connect`.
* `COHERENCE_SIMULATOR` preprocessor define.
* `--coherence-simulation-server` command-line argument.
* Toggling on *Simulator* in the sample connection dialog.

#### `Connect` and `ConnectionType`

The `Connect` method on `Coherence.Network` accepts a `ConnectionType` parameter.

```csharp
using Network = Coherence.Network;
using ConnectionType = Replication.Client.Unity.Ecs.ConnectionType;

public class ConnectAsSimulator : MonoBehaviour
{
    void Start()
    {
        if (Network.Connect("127.0.0.1:32001", ConnectionType.Simulator))
        {
            // Connection successful
        }
        else 
        {
            // Connection failed
        }
    }
}
```

#### **COHERENCE\_SIMULATOR**

```csharp
#if COHERENCE_SIMULATOR

// simulator-specific code

#endif
```

Whenever the project compiles with the `COHERENCE_SIMULATOR` preprocessor define, coherence understands that the game will act as a simulator.&#x20;

<div align="left"><img src="https://3643360286-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWd0ZPEK7vE9nkE0b7G%2F-MYgH4a62yzsJTyj2hGm%2F-MYgJGldGsRlo85C5I-v%2Fimage.png?alt=media&#x26;token=2e4dc95c-0984-4148-8b8a-68c0672cdfc9" alt="The custom build pipeline lets us define preprocessor defines like COHERENCE_SIMULATOR"></div>

#### **Command-line argument**

Launching the game with  `--coherence-simulation-server` will let coherence know that the loaded instance must act as a simulator.

{% hint style="info" %}
You can supply **additional parameters** to a simulator that define its area of responsibility, e.g. a sector/quadrant to simulate entities in and take authority over entities wandering into it.

You can also build a special simulator for AI, physics, etc.
{% endhint %}

### Server-side simulation

You can define who simulates the object in the **CoherenceSync** inspector.&#x20;

![](https://3643360286-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWd0ZPEK7vE9nkE0b7G%2F-M_LTdG3xdfvvC9ymtp8%2F-M_LW8y2rn7vcBaXRMKc%2Fsimtype.png?alt=media\&token=045a4d77-0fa4-4c66-8544-c224090a9816)

{% hint style="info" %}
Automatic simulator adoption of CoherenceSync objects is work in progress and will be available in one of the future releases of **coherence.**
{% endhint %}

### **Auto-reconnect**

The [sample UI](https://docs.coherence.io/0.4.14/api-reference/network-sdk/sample-ui) provided includes auto-reconnect behaviour out of the box for simulators. The root GameObject has an AutoReconnect component attached to it.

![AutoReconnect in the sample UI](https://3643360286-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWd0ZPEK7vE9nkE0b7G%2F-M__FDj3l27yZWW85sTu%2F-M__G8V97h10tp9jlu4_%2Fautoreconnect.png?alt=media\&token=585a135c-8f79-4c46-8ecb-1549cfb0a18a)

{% hint style="info" %}
If the simulator is invoked with the `--coherence-play-region` parameter, AutoReconnect will try to reconnect to the server located in that region.
{% endhint %}

If you need a different solution, take a look at its implementation use plug your own.
