# Simulation Server

**coherence** uses the concept of *ownership* to determine who is responsible for simulating each entity in the game world. By default, each client that connects to the server owns and simulates the entities they create. There are a lot of situations where this setup is not adequate. For example:

* The number of entities in the game world could be too large to be simulated by the players on their own, especially if there are few players and the world is very large.
* The game might have an advanced AI that requires a lot of coordination, which makes it hard to split up the work between clients.
* It's often desirable to have an authoritative object that ensures a single source of truth for certain data. State replication and "eventual correctness" doesn't give us these guarantees.
* Perhaps the game should run a persistent simulation, even while no one is playing.

With **coherence**, all of these situations are can be solved using dedicated *simulation servers*. They behave very much like normal game clients, except they run on their own with no player involved. Usually they also have special code that only they run (and not the clients). It is up to the game developer to create and run these programs somewhere in the cloud, based on the demands of their particular game.

## Creating a simulation server

If you have determined that you need one or more simulation servers for your game, there are multiple ways you can go about implementing these. You could create a separate Unity project and write the specific code for the simulation server there (while making sure you use the same schema as your original project).

An easier way is to use your existing Unity project and modify it in a way so that it can be started either as a normal game client, *or* as a simulation server. This will ensure that you maximize code sharing between clients and servers -- they both do simulation of entities in the same game world after all.

{% hint style="info" %}
Please note that to build a simulation server, you have to build for the Linux platform.&#x20;
{% endhint %}

To determine whether to start a build as client or simulation server, you can use command line arguments:

#### Reading command line arguments

```
using System;

class Boot : MonoBehaviour 
{ 
    void Start() 
    { 
        var args = Environment.GetCommandLineArgs(); 
        var isSimulationServer = false;
    
        foreach (var arg in args) {
            if(arg == "--coherence-simulation-server") {
                isSimulationServer = true;
            }
        }
    
        /* do things based on 'isSimulationServer' here... */
    }
}
```

&#x20; To pass the command line argument, start the application like this:

```
$ ./Game --coherence-simulation-server  
```

When building stand-alone builds, Unity also has an option for [headless mode](https://docs.unity3d.com/ScriptReference/BuildOptions.EnableHeadlessMode.html). This is great for simulation servers since we're not interested in rendering any graphics on these anyway, and you can use it from code. By using headless mode we get a leaner executable that is easier to deploy in the cloud.

To build server build change your build target to be Linux and tick Server build.&#x20;

![](/files/UeO1iRIOOo6b4Khz5nVC)

## Build and deploy

Refer to the [Simulator: Build and deploy section](/0.5.2/simulators/build-deploy-simulators.md).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.coherence.io/0.5.2/api-reference/simulation-server.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
