> For the complete documentation index, see [llms.txt](https://kinematicsoup.gitbook.io/reactor/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kinematicsoup.gitbook.io/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2.md).

# Class ksBaseRoom\<Player, Entity>

Namespace: [KS.Reactor.Client](/reactor/api-reference/ks.reactor.client.md)\
Assembly: KSUnity.dll

Templated base class for rooms. Rooms are used to connect to server rooms. The room maintains simulation state that is regularly synced with the server.

```csharp
public abstract class ksBaseRoom<Player, Entity> : ksBaseRoom, ksIRoom<Player, Entity> where Player : ksBasePlayer where Entity : ksBaseEntity
```

#### Type Parameters

`Player`

Implementation of [ksBasePlayer](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseplayer.md)

`Entity`

Implementation of [ksBaseEntity](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md)

#### Inheritance

[object](https://learn.microsoft.com/dotnet/api/system.object) â† [ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md) â† [ksBaseRoom\<Player, Entity>](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2.md)

#### Implements

[ksIRoom\<Player, Entity>](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksiroom-2.md)

#### Inherited Members

[ksBaseRoom.MIN\_SEND\_RATE](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_MIN_SEND_RATE), [ksBaseRoom.MAX\_SEND\_RATE](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_MAX_SEND_RATE), [ksBaseRoom.OnStateChange](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_OnStateChange), [ksBaseRoom.ConnectionState](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_ConnectionState), [ksBaseRoom.m\_connectionState](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_m_connectionState), [ksBaseRoom.Id](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_Id), [ksBaseRoom.Address](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_Address), [ksBaseRoom.Info](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_Info), [ksBaseRoom.Time](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_Time), [ksBaseRoom.Physics](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_Physics), [ksBaseRoom.IsConnecting](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_IsConnecting), [ksBaseRoom.IsConnected](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_IsConnected), [ksBaseRoom.IsDisconnecting](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_IsDisconnecting), [ksBaseRoom.SuppressCannotCallRPCWarning](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_SuppressCannotCallRPCWarning), [ksBaseRoom.LocalPlayerId](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_LocalPlayerId), [ksBaseRoom.InputAcknowledged](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_InputAcknowledged), [ksBaseRoom.Gravity](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_Gravity), [ksBaseRoom.ApplyServerTimeScale(float)](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_ApplyServerTimeScale_System_Single_), [ksBaseRoom.RPCLatency](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_RPCLatency), [ksBaseRoom.Latency](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_Latency), [ksBaseRoom.GetTimeAdjuster\<T>()](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_GetTimeAdjuster__1), [ksBaseRoom.GetTime(uint)](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_GetTime_System_UInt32_), [ksBaseRoom.DiagnoseConnectionFailure()](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_DiagnoseConnectionFailure), [ksBaseRoom.CallEntityRPC(ksBaseEntity, uint, params ksMultiType\[\])](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_CallEntityRPC_KS_Reactor_Client_ksBaseEntity_System_UInt32_KS_Reactor_ksMultiType___), [ksBaseRoom.RegisterConnectionFactory(ksConnectionProtocols, ksConnection.Factory)](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_RegisterConnectionFactory_KS_Reactor_ksConnectionProtocols_KS_Reactor_Client_ksConnection_Factory_), [ksBaseRoom.IsIdle](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_IsIdle), [ksBaseRoom.IdleTime](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_IdleTime), [ksBaseRoom.Protocol](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_Protocol), [ksBaseRoom.InvokeRPC(uint, ksMultiType\[\])](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_InvokeRPC_System_UInt32_KS_Reactor_ksMultiType___), [ksBaseRoom.EnableUDPClientFrames](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_EnableUDPClientFrames), [object.Equals(object)](https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals\(system-object\)), [object.Equals(object, object)](https://learn.microsoft.com/dotnet/api/system.object.equals#system-object-equals\(system-object-system-object\)), [object.GetHashCode()](https://learn.microsoft.com/dotnet/api/system.object.gethashcode), [object.GetType()](https://learn.microsoft.com/dotnet/api/system.object.gettype), [object.MemberwiseClone()](https://learn.microsoft.com/dotnet/api/system.object.memberwiseclone), [object.ReferenceEquals(object, object)](https://learn.microsoft.com/dotnet/api/system.object.referenceequals), [object.ToString()](https://learn.microsoft.com/dotnet/api/system.object.tostring)

## Constructors

### ksBaseRoom(ksRoomInfo) <a href="#ks_reactor_client_ksbaseroom_2__ctor_ks_reactor_ksroominfo" id="ks_reactor_client_ksbaseroom_2__ctor_ks_reactor_ksroominfo"></a>

Constructor

```csharp
public ksBaseRoom(ksRoomInfo roomInfo)
```

#### Parameters

`roomInfo` [ksRoomInfo](/reactor/api-reference/ks.reactor/ks.reactor.ksroominfo.md)

Determines where we connect.

### ksBaseRoom() <a href="#ks_reactor_client_ksbaseroom_2__ctor" id="ks_reactor_client_ksbaseroom_2__ctor"></a>

Constructor

```csharp
public ksBaseRoom()
```

## Properties

### ControlledEntities <a href="#ks_reactor_client_ksbaseroom_2_controlledentities" id="ks_reactor_client_ksbaseroom_2_controlledentities"></a>

```csharp
[Obsolete("Use OwnedEntities instead and check for a player controller.")]
public ksConstList<Entity> ControlledEntities { get; }
```

#### Property Value

[ksConstList](/reactor/api-reference/ks.reactor/ks.reactor.ksconstlist-1.md)\<Entity>

### Coroutines <a href="#ks_reactor_client_ksbaseroom_2_coroutines" id="ks_reactor_client_ksbaseroom_2_coroutines"></a>

Coroutines

```csharp
public ksCoroutineManager Coroutines { get; }
```

#### Property Value

[ksCoroutineManager](/reactor/api-reference/ks.reactor/ks.reactor.kscoroutinemanager.md)

### DynamicEntities <a href="#ks_reactor_client_ksbaseroom_2_dynamicentities" id="ks_reactor_client_ksbaseroom_2_dynamicentities"></a>

List of dynamic (non-permanent) entities.

```csharp
public ksConstList<Entity> DynamicEntities { get; }
```

#### Property Value

[ksConstList](/reactor/api-reference/ks.reactor/ks.reactor.ksconstlist-1.md)\<Entity>

### EnableUDPClientFrames <a href="#ks_reactor_client_ksbaseroom_2_enableudpclientframes" id="ks_reactor_client_ksbaseroom_2_enableudpclientframes"></a>

Send client frame data for entity state and timing data using UDP. If the room protocol is set to [WEBSOCKETS](/reactor/api-reference/ks.reactor/ks.reactor.ksconnectionprotocols.md#KS_Reactor_ksConnectionProtocols_WEBSOCKETS) or [DIRECT](/reactor/api-reference/ks.reactor/ks.reactor.ksconnectionprotocols.md#KS_Reactor_ksConnectionProtocols_DIRECT) this property will always be false.

```csharp
public override sealed bool EnableUDPClientFrames { get; set; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### Entities <a href="#ks_reactor_client_ksbaseroom_2_entities" id="ks_reactor_client_ksbaseroom_2_entities"></a>

List of entities in the room.

```csharp
public ksMultiList<Entity> Entities { get; }
```

#### Property Value

[ksMultiList](/reactor/api-reference/ks.reactor/ks.reactor.ksmultilist-1.md)\<Entity>

### IdleTime <a href="#ks_reactor_client_ksbaseroom_2_idletime" id="ks_reactor_client_ksbaseroom_2_idletime"></a>

Amount of time the player has been idle. Negative if the player is not idle.

```csharp
public override sealed double IdleTime { get; }
```

#### Property Value

[double](https://learn.microsoft.com/dotnet/api/system.double)

### Info <a href="#ks_reactor_client_ksbaseroom_2_info" id="ks_reactor_client_ksbaseroom_2_info"></a>

Room Info

```csharp
public override sealed ksRoomInfo Info { get; }
```

#### Property Value

[ksRoomInfo](/reactor/api-reference/ks.reactor/ks.reactor.ksroominfo.md)

### InputAcknowledged <a href="#ks_reactor_client_ksbaseroom_2_inputacknowledged" id="ks_reactor_client_ksbaseroom_2_inputacknowledged"></a>

Has the server acknowledged receiving our first input?

```csharp
public override sealed bool InputAcknowledged { get; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### InputInterval <a href="#ks_reactor_client_ksbaseroom_2_inputinterval" id="ks_reactor_client_ksbaseroom_2_inputinterval"></a>

The interval in seconds at which input updates are generated and sent to the server. An input update is a collection of button, axes, and value states represented by [ksInput](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md). If set to zero, sends one input update for every client frame. If less than zero, input updates are not sent automatically and must be sent by calling [SendInput](/reactor/api-reference/ks.reactor.client.md#KS_Reactor_Client_ksBaseRoom_602_SendInput_System_Boolean_2cSystem_Single_).

```csharp
public float InputInterval { get; set; }
```

#### Property Value

[float](https://learn.microsoft.com/dotnet/api/system.single)

### IsConnected <a href="#ks_reactor_client_ksbaseroom_2_isconnected" id="ks_reactor_client_ksbaseroom_2_isconnected"></a>

Are we connected to the server?

```csharp
public override sealed bool IsConnected { get; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### IsConnecting <a href="#ks_reactor_client_ksbaseroom_2_isconnecting" id="ks_reactor_client_ksbaseroom_2_isconnecting"></a>

Are we in the process of establishing a connection with the server?

```csharp
public override sealed bool IsConnecting { get; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### IsDisconnecting <a href="#ks_reactor_client_ksbaseroom_2_isdisconnecting" id="ks_reactor_client_ksbaseroom_2_isdisconnecting"></a>

Are we disconnecting from the server?

```csharp
public override sealed bool IsDisconnecting { get; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### IsIdle <a href="#ks_reactor_client_ksbaseroom_2_isidle" id="ks_reactor_client_ksbaseroom_2_isidle"></a>

Is the connection idle?

```csharp
public override sealed bool IsIdle { get; set; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### Latency <a href="#ks_reactor_client_ksbaseroom_2_latency" id="ks_reactor_client_ksbaseroom_2_latency"></a>

Round trip latency measured in milliseconds with the connection protocol. -1 if undetermined.

```csharp
public override sealed int Latency { get; }
```

#### Property Value

[int](https://learn.microsoft.com/dotnet/api/system.int32)

### LocalPlayer <a href="#ks_reactor_client_ksbaseroom_2_localplayer" id="ks_reactor_client_ksbaseroom_2_localplayer"></a>

The local player. This will be null until we've received an update from the server. It will also be null if the local player is not visible.

```csharp
public Player LocalPlayer { get; }
```

#### Property Value

Player

### LocalPlayerId <a href="#ks_reactor_client_ksbaseroom_2_localplayerid" id="ks_reactor_client_ksbaseroom_2_localplayerid"></a>

The local player id.

```csharp
public override sealed uint LocalPlayerId { get; set; }
```

#### Property Value

[uint](https://learn.microsoft.com/dotnet/api/system.uint32)

### MultiButtonStateEnabled <a href="#ks_reactor_client_ksbaseroom_2_multibuttonstateenabled" id="ks_reactor_client_ksbaseroom_2_multibuttonstateenabled"></a>

If true and multiple input updates are combined into one input update, a button can be both pressed and released in the same update if it's up/down state changed multiple times in the same update. If false, the up/down state of a button can only change once in one input update.

If [InputInterval](/reactor/api-reference/ks.reactor.client.md#KS_Reactor_Client_ksBaseRoom_602_InputInterval) is zero so one input update is generated for every client frame, this has no effect.

Eg. Three client frames are combined into one input update. The button is up on the first frame, down on the second, and up again on the third. If [MultiButtonStateEnabled](/reactor/api-reference/ks.reactor.client.md#KS_Reactor_Client_ksBaseRoom_602_MultiButtonStateEnabled) is true, this produces one input update where [IsDown](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md#KS_Reactor_ksInput_IsDown_System_UInt32_) returns false, and [IsPressed](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md#KS_Reactor_ksInput_IsPressed_System_UInt32_) and [IsReleased](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md#KS_Reactor_ksInput_IsReleased_System_UInt32_) return true. If [MultiButtonStateEnabled](/reactor/api-reference/ks.reactor.client.md#KS_Reactor_Client_ksBaseRoom_602_MultiButtonStateEnabled) is false, this produces one input update where [IsDown](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md#KS_Reactor_ksInput_IsDown_System_UInt32_) and [IsPressed](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md#KS_Reactor_ksInput_IsPressed_System_UInt32_) return true and [IsReleased](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md#KS_Reactor_ksInput_IsReleased_System_UInt32_) returns false. If the button up/down state does not change again during the next input update, [IsDown](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md#KS_Reactor_ksInput_IsDown_System_UInt32_) will return false and [IsReleased](/reactor/api-reference/ks.reactor/ks.reactor.ksinput.md#KS_Reactor_ksInput_IsReleased_System_UInt32_) will return true on the next input update.

```csharp
public bool MultiButtonStateEnabled { get; set; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### NetStats <a href="#ks_reactor_client_ksbaseroom_2_netstats" id="ks_reactor_client_ksbaseroom_2_netstats"></a>

Network statistic tracking for this room.

```csharp
public ksNetStats NetStats { get; }
```

#### Property Value

[ksNetStats](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksnetstats.md)

### OnPropertyChange <a href="#ks_reactor_client_ksbaseroom_2_onpropertychange" id="ks_reactor_client_ksbaseroom_2_onpropertychange"></a>

Invoked when a room property changes. Indexed by property id. Other properties are not guaranteed to be updated when this fires.

```csharp
public ksEventMap<ksDelegates.PropertyChangeHandler> OnPropertyChange { get; }
```

#### Property Value

[ksEventMap](/reactor/api-reference/ks.reactor/ks.reactor.kseventmap-1.md)<[ksDelegates](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksdelegates.md).[PropertyChangeHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksdelegates/ks.reactor.client.ksdelegates.propertychangehandler.md)>

### OnRPC <a href="#ks_reactor_client_ksbaseroom_2_onrpc" id="ks_reactor_client_ksbaseroom_2_onrpc"></a>

Invoked when the server calls an RPC on the room. Indexed by RPC id.

```csharp
public ksEventMap<ksBaseRoom.RPCHandler> OnRPC { get; }
```

#### Property Value

[ksEventMap](/reactor/api-reference/ks.reactor/ks.reactor.kseventmap-1.md)<[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md).[RPCHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom/ks.reactor.client.ksbaseroom.rpchandler.md)>

### OwnedEntities <a href="#ks_reactor_client_ksbaseroom_2_ownedentities" id="ks_reactor_client_ksbaseroom_2_ownedentities"></a>

List of entities owned by the local player.

```csharp
public ksConstList<Entity> OwnedEntities { get; }
```

#### Property Value

[ksConstList](/reactor/api-reference/ks.reactor/ks.reactor.ksconstlist-1.md)\<Entity>

### PermanentEntities <a href="#ks_reactor_client_ksbaseroom_2_permanententities" id="ks_reactor_client_ksbaseroom_2_permanententities"></a>

List of permanent entities.

```csharp
public ksConstList<Entity> PermanentEntities { get; }
```

#### Property Value

[ksConstList](/reactor/api-reference/ks.reactor/ks.reactor.ksconstlist-1.md)\<Entity>

### Players <a href="#ks_reactor_client_ksbaseroom_2_players" id="ks_reactor_client_ksbaseroom_2_players"></a>

List of players connected to the room.

```csharp
public ksConstList<Player> Players { get; }
```

#### Property Value

[ksConstList](/reactor/api-reference/ks.reactor/ks.reactor.ksconstlist-1.md)\<Player>

### Predictor <a href="#ks_reactor_client_ksbaseroom_2_predictor" id="ks_reactor_client_ksbaseroom_2_predictor"></a>

Predictor for room properties.

```csharp
public ksIPredictor Predictor { get; set; }
```

#### Property Value

[ksIPredictor](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksipredictor.md)

### Properties <a href="#ks_reactor_client_ksbaseroom_2_properties" id="ks_reactor_client_ksbaseroom_2_properties"></a>

Properties

```csharp
public ksPropertyMap Properties { get; }
```

#### Property Value

[ksPropertyMap](/reactor/api-reference/ks.reactor/ks.reactor.kspropertymap.md)

### Protocol <a href="#ks_reactor_client_ksbaseroom_2_protocol" id="ks_reactor_client_ksbaseroom_2_protocol"></a>

Get/Set the network protocol to use for connections.

```csharp
public override sealed ksConnectionProtocols Protocol { get; set; }
```

#### Property Value

[ksConnectionProtocols](/reactor/api-reference/ks.reactor/ks.reactor.ksconnectionprotocols.md)

### RPCLatency <a href="#ks_reactor_client_ksbaseroom_2_rpclatency" id="ks_reactor_client_ksbaseroom_2_rpclatency"></a>

Round trip latency in milliseconds measured with RPC calls. -1 if undetermined.

```csharp
public override sealed int RPCLatency { get; }
```

#### Property Value

[int](https://learn.microsoft.com/dotnet/api/system.int32)

### ReadProgress <a href="#ks_reactor_client_ksbaseroom_2_readprogress" id="ks_reactor_client_ksbaseroom_2_readprogress"></a>

Get the size and progress of the current connection read operation.

```csharp
public ksFrameInfo ReadProgress { get; }
```

#### Property Value

[ksFrameInfo](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksframeinfo.md)

### SendRate <a href="#ks_reactor_client_ksbaseroom_2_sendrate" id="ks_reactor_client_ksbaseroom_2_sendrate"></a>

How many updates we send to the server in one second. Must be between [MIN\_SEND\_RATE](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_MIN_SEND_RATE) and [MAX\_SEND\_RATE](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md#KS_Reactor_Client_ksBaseRoom_MAX_SEND_RATE).

```csharp
public int SendRate { get; set; }
```

#### Property Value

[int](https://learn.microsoft.com/dotnet/api/system.int32)

### SendUnchangedInput <a href="#ks_reactor_client_ksbaseroom_2_sendunchangedinput" id="ks_reactor_client_ksbaseroom_2_sendunchangedinput"></a>

If true, sends all input updates to the server. If false, only sends input updates to the server when the input changed since the last input update. Unless you are using a custom Server.ksIInputProcessor that requires every input update to be sent, there is no reason to set this to true.

```csharp
public bool SendUnchangedInput { get; set; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### SuppressCannotCallRPCWarning <a href="#ks_reactor_client_ksbaseroom_2_suppresscannotcallrpcwarning" id="ks_reactor_client_ksbaseroom_2_suppresscannotcallrpcwarning"></a>

Should we suppress "Cannot call RPC" warnings when disconnected or disconnecting?

```csharp
public override sealed bool SuppressCannotCallRPCWarning { get; set; }
```

#### Property Value

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### Time <a href="#ks_reactor_client_ksbaseroom_2_time" id="ks_reactor_client_ksbaseroom_2_time"></a>

Server time and local frame delta.

```csharp
public override sealed ksClientTime Time { get; }
```

#### Property Value

[ksClientTime](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksclienttime.md)

### TimeAdjusters <a href="#ks_reactor_client_ksbaseroom_2_timeadjusters" id="ks_reactor_client_ksbaseroom_2_timeadjusters"></a>

```csharp
[Obsolete("Use Time.Adjuster instead.")]
public ksConstList<ksITimeAdjuster> TimeAdjusters { get; }
```

#### Property Value

[ksConstList](/reactor/api-reference/ks.reactor/ks.reactor.ksconstlist-1.md)<[ksITimeAdjuster](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksitimeadjuster.md)>

### WriteProgress <a href="#ks_reactor_client_ksbaseroom_2_writeprogress" id="ks_reactor_client_ksbaseroom_2_writeprogress"></a>

Get the size and progress of the current connection write operation.

```csharp
public ksFrameInfo WriteProgress { get; }
```

#### Property Value

[ksFrameInfo](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksframeinfo.md)

## Methods

### AddTimeAdjuster(ksITimeAdjuster) <a href="#ks_reactor_client_ksbaseroom_2_addtimeadjuster_ks_reactor_client_ksitimeadjuster" id="ks_reactor_client_ksbaseroom_2_addtimeadjuster_ks_reactor_client_ksitimeadjuster"></a>

```csharp
[Obsolete("Use Time.Adjuster = value instead.")]
public void AddTimeAdjuster(ksITimeAdjuster timeAdjuster)
```

#### Parameters

`timeAdjuster` [ksITimeAdjuster](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksitimeadjuster.md)

### CallBatchRPC(IList\<Entity>, uint, params ksMultiType\[]) <a href="#ks_reactor_client_ksbaseroom_2_callbatchrpc_system_collections_generic_ilist__1__system_uint32_ks_re" id="ks_reactor_client_ksbaseroom_2_callbatchrpc_system_collections_generic_ilist__1__system_uint32_ks_re"></a>

Calls an entity function on the server. Does nothing if not connected to the server.

```csharp
public void CallBatchRPC(IList<Entity> entities, uint rpcId, params ksMultiType[] arguments)
```

#### Parameters

`entities` [IList](https://learn.microsoft.com/dotnet/api/system.collections.generic.ilist-1)\<Entity>

entities to call rpc on.

`rpcId` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

rpcId of function to call on server.

`arguments` [ksMultiType](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype.md)\[]

arguments to send to server.

### CallEntityRPC(ksBaseEntity, uint, params ksMultiType\[]) <a href="#ks_reactor_client_ksbaseroom_2_callentityrpc_ks_reactor_client_ksbaseentity_system_uint32_ks_reactor" id="ks_reactor_client_ksbaseroom_2_callentityrpc_ks_reactor_client_ksbaseentity_system_uint32_ks_reactor"></a>

Calls an entity function on the server. Does nothing if not connected to the server.

```csharp
public override sealed void CallEntityRPC(ksBaseEntity entity, uint rpcId, params ksMultiType[] arguments)
```

#### Parameters

`entity` [ksBaseEntity](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseentity.md)

Entity to call RPC on.

`rpcId` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

`arguments` [ksMultiType](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype.md)\[]

arguments to send to server.

### CallRPC(uint, params ksMultiType\[]) <a href="#ks_reactor_client_ksbaseroom_2_callrpc_system_uint32_ks_reactor_ksmultitype" id="ks_reactor_client_ksbaseroom_2_callrpc_system_uint32_ks_reactor_ksmultitype"></a>

Calls a function on the server. Does nothing if not connected to the server.

```csharp
public void CallRPC(uint rpcId, params ksMultiType[] arguments)
```

#### Parameters

`rpcId` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

rpcId of function to call on server.

`arguments` [ksMultiType](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype.md)\[]

arguments to send to server.

### CallSpawnRPC(ksSpawnParams, params ksMultiType\[]) <a href="#ks_reactor_client_ksbaseroom_2_callspawnrpc_ks_reactor_ksspawnparams_ks_reactor_ksmultitype" id="ks_reactor_client_ksbaseroom_2_callspawnrpc_ks_reactor_ksspawnparams_ks_reactor_ksmultitype"></a>

Spawns an entity on the client and sends a request to the server to spawn the entity. The entity will have a temporary spawn id until the server validates the spawn. If the server denies the spawn, the entity will be destroyed.

```csharp
protected Entity CallSpawnRPC(ksSpawnParams spawnParams, params ksMultiType[] args)
```

#### Parameters

`spawnParams` [ksSpawnParams](/reactor/api-reference/ks.reactor/ks.reactor.ksspawnparams.md)

Spawn parameters. Must have a non-zero asset id.

`args` [ksMultiType](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype.md)\[]

Additional arguments to send to the server. These will be available in the server player spawn entity event.

#### Returns

Entity

Spawned entity

### CleanUp() <a href="#ks_reactor_client_ksbaseroom_2_cleanup" id="ks_reactor_client_ksbaseroom_2_cleanup"></a>

Destroys all entities and players in the room. Call this after disconnecting. If called while connected, does nothing.

```csharp
public virtual bool CleanUp()
```

#### Returns

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

Returns false if the room was in a state which prevented cleanup.

### ClearTimeAdjusters() <a href="#ks_reactor_client_ksbaseroom_2_cleartimeadjusters" id="ks_reactor_client_ksbaseroom_2_cleartimeadjusters"></a>

```csharp
[Obsolete("Use Time.Adjuster = null instead.")]
public void ClearTimeAdjusters()
```

### Connected() <a href="#ks_reactor_client_ksbaseroom_2_connected" id="ks_reactor_client_ksbaseroom_2_connected"></a>

Called when a connection completes successfully.

```csharp
protected virtual void Connected()
```

### ConnectionStarted() <a href="#ks_reactor_client_ksbaseroom_2_connectionstarted" id="ks_reactor_client_ksbaseroom_2_connectionstarted"></a>

Called when a connection attempt starts. When this method returns false, the connection process will stop and the connect callback handler will be invoked with a ROOM\_INITIALIZE\_ERROR result.

```csharp
protected virtual bool ConnectionStarted()
```

#### Returns

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

Returns true if room initialiation completed successfully.

### CreateEntity() <a href="#ks_reactor_client_ksbaseroom_2_createentity" id="ks_reactor_client_ksbaseroom_2_createentity"></a>

Creates an entity.

```csharp
protected abstract Entity CreateEntity()
```

#### Returns

Entity

Entity

### CreatePlayer(uint) <a href="#ks_reactor_client_ksbaseroom_2_createplayer_system_uint32" id="ks_reactor_client_ksbaseroom_2_createplayer_system_uint32"></a>

Creates a player.

```csharp
protected abstract Player CreatePlayer(uint id)
```

#### Parameters

`id` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

id of player.

#### Returns

Player

Player

### DiagnoseConnectionFailure() <a href="#ks_reactor_client_ksbaseroom_2_diagnoseconnectionfailure" id="ks_reactor_client_ksbaseroom_2_diagnoseconnectionfailure"></a>

Diagnose connection failure to the server.

```csharp
public override sealed string DiagnoseConnectionFailure()
```

#### Returns

[string](https://learn.microsoft.com/dotnet/api/system.string)

error message

### Disconnected() <a href="#ks_reactor_client_ksbaseroom_2_disconnected" id="ks_reactor_client_ksbaseroom_2_disconnected"></a>

Called when the room disconnects.

```csharp
protected virtual void Disconnected()
```

### Equals(ksBaseRoom) <a href="#ks_reactor_client_ksbaseroom_2_equals_ks_reactor_client_ksbaseroom" id="ks_reactor_client_ksbaseroom_2_equals_ks_reactor_client_ksbaseroom"></a>

```csharp
public bool Equals(ksBaseRoom otherRoom)
```

#### Parameters

`otherRoom` [ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md)

#### Returns

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### GetEntity(ksEntityId) <a href="#ks_reactor_client_ksbaseroom_2_getentity_ks_reactor_ksentityid" id="ks_reactor_client_ksbaseroom_2_getentity_ks_reactor_ksentityid"></a>

Gets the entity in this room with the given id.

```csharp
public Entity GetEntity(ksEntityId entityId)
```

#### Parameters

`entityId` [ksEntityId](/reactor/api-reference/ks.reactor/ks.reactor.ksentityid.md)

Id of entity to get.

#### Returns

Entity

Entity with the given id, or null if no entity with that id was found.

### GetPlayer(uint) <a href="#ks_reactor_client_ksbaseroom_2_getplayer_system_uint32" id="ks_reactor_client_ksbaseroom_2_getplayer_system_uint32"></a>

Get a player by id.

```csharp
public Player GetPlayer(uint id)
```

#### Parameters

`id` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

Player id

#### Returns

Player

Player with the given id, or null if none was found.

### GetPrefabScale(ksSpawnParams) <a href="#ks_reactor_client_ksbaseroom_2_getprefabscale_ks_reactor_ksspawnparams" id="ks_reactor_client_ksbaseroom_2_getprefabscale_ks_reactor_ksspawnparams"></a>

Room implementations can override this to get the scale from the prefab the `spawnParams` will spawn. Default implementation returns (1, 1, 1).

```csharp
protected virtual ksVector3 GetPrefabScale(ksSpawnParams spawnParams)
```

#### Parameters

`spawnParams` [ksSpawnParams](/reactor/api-reference/ks.reactor/ks.reactor.ksspawnparams.md)

Spawn parameters to get prefab scale for.

#### Returns

[ksVector3](/reactor/api-reference/ks.reactor/ks.reactor.ksvector3.md)

Prefab scale

### GetPropertyServerValue(uint) <a href="#ks_reactor_client_ksbaseroom_2_getpropertyservervalue_system_uint32" id="ks_reactor_client_ksbaseroom_2_getpropertyservervalue_system_uint32"></a>

Gets property server value. If a property id is not in the map, a [ksMultiType](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype.md) of type [NULL](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype/ks.reactor.ksmultitype.types.md#KS_Reactor_ksMultiType_Types_NULL) is returned.

```csharp
public ksMultiType GetPropertyServerValue(uint propertyId)
```

#### Parameters

`propertyId` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

#### Returns

[ksMultiType](/reactor/api-reference/ks.reactor/ks.reactor.ksmultitype.md)

### GetTime(uint) <a href="#ks_reactor_client_ksbaseroom_2_gettime_system_uint32" id="ks_reactor_client_ksbaseroom_2_gettime_system_uint32"></a>

Gets a player's time object. Each player who owns entities with the transform permission has time a time object that tracks their timing data which can be used to smooth motion for the entities they control.

```csharp
public override ksClientTime GetTime(uint playerId)
```

#### Parameters

`playerId` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

Id of player to get the time object for. If zero, gets [Time](/reactor/api-reference/ks.reactor.client.md#KS_Reactor_Client_ksBaseRoom_602_Time).

#### Returns

[ksClientTime](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksclienttime.md)

The time object for the player, or [Time](/reactor/api-reference/ks.reactor.client.md#KS_Reactor_Client_ksBaseRoom_602_Time) if `playerId` was zero, or null if the player has no owned entities with the transform permission.

### GetTimeAdjuster\<T>() <a href="#ks_reactor_client_ksbaseroom_2_gettimeadjuster__1" id="ks_reactor_client_ksbaseroom_2_gettimeadjuster__1"></a>

```csharp
[Obsolete("Use casting with Time.Adjuster instead.")]
public override sealed T GetTimeAdjuster<T>() where T : class, ksITimeAdjuster
```

#### Returns

T

#### Type Parameters

`T`

### InitializeScripts() <a href="#ks_reactor_client_ksbaseroom_2_initializescripts" id="ks_reactor_client_ksbaseroom_2_initializescripts"></a>

Initializes room scripts. The default implementation does nothing.

```csharp
protected virtual void InitializeScripts()
```

### Initialized() <a href="#ks_reactor_client_ksbaseroom_2_initialized" id="ks_reactor_client_ksbaseroom_2_initialized"></a>

Called when after room scripts and entities are initialized after the first sync.

```csharp
protected virtual void Initialized()
```

### LoadPermanentEntities(List\<Entity>) <a href="#ks_reactor_client_ksbaseroom_2_loadpermanententities_system_collections_generic_list__1" id="ks_reactor_client_ksbaseroom_2_loadpermanententities_system_collections_generic_list__1"></a>

Loads permanent entities from the scene. Not implemented. When constructing permanent entities your implementation must call ksBaseEntity.Initialize(uint, uint, ksTransformState, ksBaseRoom).

```csharp
protected virtual void LoadPermanentEntities(List<Entity> entities)
```

#### Parameters

`entities` [List](https://learn.microsoft.com/dotnet/api/system.collections.generic.list-1)\<Entity>

list to load permanent entities into.

### LoadPlayerScripts(Player) <a href="#ks_reactor_client_ksbaseroom_2_loadplayerscripts__0" id="ks_reactor_client_ksbaseroom_2_loadplayerscripts__0"></a>

Loads and attaches player scripts to a player.

```csharp
protected abstract void LoadPlayerScripts(Player player)
```

#### Parameters

`player` Player

player to attach scripts to.

### RegisterRPC(uint, RPCHandler) <a href="#ks_reactor_client_ksbaseroom_2_registerrpc_system_uint32_ks_reactor_client_ksbaseroom_rpchandler" id="ks_reactor_client_ksbaseroom_2_registerrpc_system_uint32_ks_reactor_client_ksbaseroom_rpchandler"></a>

Register an RPC

```csharp
public void RegisterRPC(uint rpcId, ksBaseRoom.RPCHandler rpcHandler)
```

#### Parameters

`rpcId` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

RPC Id

`rpcHandler` [ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md).[RPCHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom/ks.reactor.client.ksbaseroom.rpchandler.md)

RPC handler

### RemoveTimeAdjuster(ksITimeAdjuster) <a href="#ks_reactor_client_ksbaseroom_2_removetimeadjuster_ks_reactor_client_ksitimeadjuster" id="ks_reactor_client_ksbaseroom_2_removetimeadjuster_ks_reactor_client_ksitimeadjuster"></a>

```csharp
[Obsolete]
public bool RemoveTimeAdjuster(ksITimeAdjuster timeAdjuster)
```

#### Parameters

`timeAdjuster` [ksITimeAdjuster](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksitimeadjuster.md)

#### Returns

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

### RemoveTimeAdjuster\<T>() <a href="#ks_reactor_client_ksbaseroom_2_removetimeadjuster__1" id="ks_reactor_client_ksbaseroom_2_removetimeadjuster__1"></a>

```csharp
[Obsolete]
public bool RemoveTimeAdjuster<T>() where T : ksITimeAdjuster
```

#### Returns

[bool](https://learn.microsoft.com/dotnet/api/system.boolean)

#### Type Parameters

`T`

### SendInput(bool, float) <a href="#ks_reactor_client_ksbaseroom_2_sendinput_system_boolean_system_single" id="ks_reactor_client_ksbaseroom_2_sendinput_system_boolean_system_single"></a>

Generates an input update to send to the server, and calls [InputUpdate](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksipredictor.md#KS_Reactor_Client_ksIPredictor_InputUpdate_KS_Reactor_ksInput_) on predictors for entities with player controllers.

```csharp
public void SendInput(bool forceUpdate = false, float deltaTime = -1)
```

#### Parameters

`forceUpdate` [bool](https://learn.microsoft.com/dotnet/api/system.boolean)

if false, will only send a new input update to server if there were input changes since the last input update.

`deltaTime` [float](https://learn.microsoft.com/dotnet/api/system.single)

the time step to use when calling [InputUpdate](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksipredictor.md#KS_Reactor_Client_ksIPredictor_InputUpdate_KS_Reactor_ksInput_) on predictors. If less than zero, the time deltas are unchanged. Otherwise, they are set to the following: [UnscaledDelta](/reactor/api-reference/ks.reactor/ks.reactor.kstime.md#KS_Reactor_ksTime_UnscaledDelta) = deltaTime [AdjustedUnscaledDelta](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksclienttime.md#KS_Reactor_Client_ksClientTime_AdjustedUnscaledDelta) \*= (deltaTime / [UnscaledDelta](/reactor/api-reference/ks.reactor/ks.reactor.kstime.md#KS_Reactor_ksTime_UnscaledDelta))

### ToString() <a href="#ks_reactor_client_ksbaseroom_2_tostring" id="ks_reactor_client_ksbaseroom_2_tostring"></a>

Returns a string containing the room id, room type, and scene name.

```csharp
public override string ToString()
```

#### Returns

[string](https://learn.microsoft.com/dotnet/api/system.string)

containing the room id, room type, and scene name.

### UnregisterRPC(uint, RPCHandler) <a href="#ks_reactor_client_ksbaseroom_2_unregisterrpc_system_uint32_ks_reactor_client_ksbaseroom_rpchandler" id="ks_reactor_client_ksbaseroom_2_unregisterrpc_system_uint32_ks_reactor_client_ksbaseroom_rpchandler"></a>

Unregister an RPC

```csharp
public void UnregisterRPC(uint rpcId, ksBaseRoom.RPCHandler rpcHandler)
```

#### Parameters

`rpcId` [uint](https://learn.microsoft.com/dotnet/api/system.uint32)

RPC Id

`rpcHandler` [ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md).[RPCHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom/ks.reactor.client.ksbaseroom.rpchandler.md)

RPC handler

### UpdateScripts() <a href="#ks_reactor_client_ksbaseroom_2_updatescripts" id="ks_reactor_client_ksbaseroom_2_updatescripts"></a>

Updates scripts. The default implementation does nothing.

```csharp
protected virtual void UpdateScripts()
```

### OnConnect <a href="#ks_reactor_client_ksbaseroom_2_onconnect" id="ks_reactor_client_ksbaseroom_2_onconnect"></a>

Invoked when the room is connected

```csharp
public event ksBaseRoom.ConnectHandler OnConnect
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md).[ConnectHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom/ks.reactor.client.ksbaseroom.connecthandler.md)

### OnDestroyEntity <a href="#ks_reactor_client_ksbaseroom_2_ondestroyentity" id="ks_reactor_client_ksbaseroom_2_ondestroyentity"></a>

Invoked when an entity is destroyed.

```csharp
public event ksBaseRoom<Player, Entity>.DestroyEntityHandler OnDestroyEntity
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2.md)\<Player, Entity>.[DestroyEntityHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2/ks.reactor.client.ksbaseroom-2.destroyentityhandler.md)

### OnDisconnect <a href="#ks_reactor_client_ksbaseroom_2_ondisconnect" id="ks_reactor_client_ksbaseroom_2_ondisconnect"></a>

Invoked when the room is disconnected

```csharp
public event ksBaseRoom.DisconnectHandler OnDisconnect
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md).[DisconnectHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom/ks.reactor.client.ksbaseroom.disconnecthandler.md)

### OnInputUpdate <a href="#ks_reactor_client_ksbaseroom_2_oninputupdate" id="ks_reactor_client_ksbaseroom_2_oninputupdate"></a>

Invoked on every input update before inputs are sent or calling [InputUpdate](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksipredictor.md#KS_Reactor_Client_ksIPredictor_InputUpdate_KS_Reactor_ksInput_) on the predictors of controlled entities.

```csharp
public event ksBaseRoom.InputUpdateHandler OnInputUpdate
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md).[InputUpdateHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom/ks.reactor.client.ksbaseroom.inputupdatehandler.md)

### OnPlayerJoin <a href="#ks_reactor_client_ksbaseroom_2_onplayerjoin" id="ks_reactor_client_ksbaseroom_2_onplayerjoin"></a>

Invoked when a player joins the room.

```csharp
public event ksBaseRoom<Player, Entity>.PlayerJoinHandler OnPlayerJoin
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2.md)\<Player, Entity>.[PlayerJoinHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2/ks.reactor.client.ksbaseroom-2.playerjoinhandler.md)

### OnPlayerLeave <a href="#ks_reactor_client_ksbaseroom_2_onplayerleave" id="ks_reactor_client_ksbaseroom_2_onplayerleave"></a>

Invoked when a (non-local) player leaves the room.

```csharp
public event ksBaseRoom<Player, Entity>.PlayerLeaveHandler OnPlayerLeave
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2.md)\<Player, Entity>.[PlayerLeaveHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2/ks.reactor.client.ksbaseroom-2.playerleavehandler.md)

### OnSentFrame <a href="#ks_reactor_client_ksbaseroom_2_onsentframe" id="ks_reactor_client_ksbaseroom_2_onsentframe"></a>

Invoked after sending a frame of client data to the server.

```csharp
public event ksBaseRoom.SendFrameHandler OnSentFrame
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md).[SendFrameHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom/ks.reactor.client.ksbaseroom.sendframehandler.md)

### OnSpawnEntity <a href="#ks_reactor_client_ksbaseroom_2_onspawnentity" id="ks_reactor_client_ksbaseroom_2_onspawnentity"></a>

Invoked when an entity is spawned.

```csharp
public event ksBaseRoom<Player, Entity>.SpawnEntityHandler OnSpawnEntity
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2.md)\<Player, Entity>.[SpawnEntityHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom-2/ks.reactor.client.ksbaseroom-2.spawnentityhandler.md)

### PreSendFrame <a href="#ks_reactor_client_ksbaseroom_2_presendframe" id="ks_reactor_client_ksbaseroom_2_presendframe"></a>

Invoked before sending a frame of client data to the server. Use this to set properties you want sent to the server on locally-owned entities with the [PROPERTIES](/reactor/api-reference/ks.reactor/ks.reactor.ksownerpermissions.md#KS_Reactor_ksOwnerPermissions_PROPERTIES) permission.

```csharp
public event ksBaseRoom.SendFrameHandler PreSendFrame
```

#### Event Type

[ksBaseRoom](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom.md).[SendFrameHandler](/reactor/api-reference/ks.reactor.client/ks.reactor.client.ksbaseroom/ks.reactor.client.ksbaseroom.sendframehandler.md)
