# Authority transfer

### Overview

The state of network entities that are currently not simulated locally (either because they are being simulated on another game client or on a simulator) cannot be affected directly.

Network [commands ](https://docs.coherence.io/0.5.2/authority/commands)can help us affect state indirectly, but for anything more involved, an authority transfer might be necessary.

### Types of Authority Transfer

In the design phase, **CoherenceSync** objects can be configured to handle authority transfer in different ways:

* **Request**. Authority transfer may be requested, but it may be rejected by the receiving party (i.e. when *Approve requests* is false).
* **Steal.** Authority will always be given to the requesting party on a FCFS ("first come first serve") basis.
* **Not transferable**. Authority cannot be transferred.

<div align="left"><img src="https://1930722764-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWd0ZPEK7vE9nkE0b7G%2F-MYg4378H7LOZ5_vqe4G%2F-MYg4DscnE8e9YZ3fLdm%2Fimage.png?alt=media&#x26;token=5196138c-9efb-4d82-8d70-373c678d8384" alt=""></div>

If you uncheck the Approve Requests, you can use the unity event `OnAuthorityRequested` to respond to the request.

![](https://1930722764-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWd0ZPEK7vE9nkE0b7G%2F-MexxNdGjyZdHQ_27ynC%2F-MexxwMZMnMTQN5KJEmt%2Fimage.png?alt=media\&token=e596061b-b4ab-4010-8bad-6d8c6cb79e3a)

The request can be approved or rejected in the callback.&#x20;

```
public void OnRequest(ushort client)
{
    var coherenceSync = target.GetComponent<CoherenceSync>();
    // do some extra checks
    // transfer authority
    coherenceSync.TransferAuthority(client);
    
    // or reject authority request
    // coherenceSync.RejectAuthorityRequest(client);
}
```

### Requesting Authority in Code

Requesting authority is very straight-forward.

```csharp
var coherenceSync = target.GetComponent<CoherenceSync>();
coherenceSync.RequestAuthority();
```

As the transfer is asynchronous, we have to subscribe to one or more **Unity Events** in **CoherenceSync** to learn the result.

The request will first go to the replication server and be passed onto the receiving simulator or game client, so it may take a few frames to get a response.

```csharp
// There Unity Events in CoherenceSync help us understand 
// what happened with authority requests and act accordingly.

// called when the CoherenceSync entity becomes the simulation authority
public UnityEvent OnAuthorityGained;

// called when the CoherenceSync entity loses simulation authority
public UnityEvent OnAuthorityLost;

// called when a request to assume authority over the CoherenceSync entity
// is rejected
public UnityEvent OnAuthorityTransferRejected;
```

These events are also exposed to the Unity inspector in the *Events on authority transfer* section of the CoherenceSync behaviour.

![Authority events in the CoherenceSync inspector](https://1930722764-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWd0ZPEK7vE9nkE0b7G%2F-Me1G8yGB5v0-hB25aG6%2F-Me1I-ooYkkX8Tj9brQn%2FScreen%20Shot%202021-07-07%20at%2011.44.43%20AM.png?alt=media\&token=2c07f2fe-f861-4963-9fa1-06fb9848603d)
