# RakNet::ReplicaManager3 Class Reference

System to help automate game object construction, destruction, and serialization ReplicaManager3 tracks your game objects and automates the networking for replicating them across the network As objects are created, destroyed, or serialized differently, those changes are pushed out to other systems To use: 1. Derive from Connection_RM3 and implement Connection_RM3::AllocReplica(). This is a factory function where given an identifier for a class (such as name) return an instance of that class. Should be able to return any networked object in your game. 2. Derive from ReplicaManager3 and implement AllocConnection() and DeallocConnection() to return the class you created in step 1. 3. Derive your networked game objects from Replica3. All pure virtuals have to be implemented, however defaults are provided for Replica3::QueryConstruction(), Replica3::QueryRemoteConstruction(), and Replica3::QuerySerialization() depending on your network architecture. 4. When a new game object is created on the local system, pass it to ReplicaManager3::Reference(). 5. When a game object is destroyed on the local system, and you want other systems to know about it, call Replica3::BroadcastDestruction(). More...

`#include <ReplicaManager3.h>`

Inheritance diagram for RakNet::ReplicaManager3:

List of all members.

## Public Member Functions

virtual Connection_RM3 * | AllocConnection (SystemAddress systemAddress, RakNetGUID rakNetGUID) const =0

Implement to return a game specific derivation of Connection_RM3 The connection object represents a remote system connected to you that is using the ReplicaManager3 system It has functions to perform operations per-connection AllocConnection() and DeallocConnection() are factory functions to create and destroy instances of the connection object It is used if connections are automanaged (which they are by default).

virtual void | DeallocConnection (Connection_RM3 *connection) const =0
| Implement to destroy a class instanced returned by AllocConnection() Most likely just implement as {delete connection;}.
void | SetAutoManageConnections (bool autoCreate, bool autoDestroy)

Enable or disable automatically assigning connections to new instances of Connection_RM3 ReplicaManager3 can automatically create and/or destroy Connection_RM3 as systems connect or disconnect from RakPeerInterface By default this is on, to make the system faster to setup If you don't want all connections to take part in the game, or you want to delay when a connection downloads the game, set autoCreate to false If you want to delay deleting a connection that has dropped, set autoDestroy to false. If you do this, then you must call PopConnection() to remove that connection from being internally tracked. You'll also have to delete the connection instance on your own.

bool | PushConnection (RakNet::Connection_RM3 *newConnection)
| Track a new Connection_RM3 instance If autoCreate is false for SetAutoManageConnections(), then you need to add new instances of Connection_RM3 yourself Use PushConnection() to do so You don't need to track this pointer yourself, you can get it with GetConnectionAtIndex(), GetConnectionByGUID(), or GetConnectionBySystemAddress().
RakNet::Connection_RM3 * | PopConnection (RakNetGUID guid, bool alsoDeleteCreatedReplicas)

Stop tracking a connection, and optionally destroy all objects created by that system If autoDestroy is false for SetAutoManageConnections(), then you need to manually have the system stop connections. PopConnection() will do so, and return that connection instance to you. If alsoDeleteCreatedReplicas is true, then the system will call GetReplicasCreatedByGuid() to get all objects that that system originally created, BroadcastDestructionList() to send destruction packets for them all, and Replica3::DeallocReplica() to destroy them.

void | Reference (RakNet::Replica3 *replica3)
| Adds a replicated object to the system. Anytime you create a new object that derives from Replica3, and you want ReplicaManager3 to use it, pass it to Reference() Remote systems already connected will download this object the next time ReplicaManager3::Update() is called, which happens every time you call RakPeerInterface::Receive().
void | Dereference (RakNet::Replica3 *replica3)
| Removes a replicated object from the system. The object is not deallocated, it is up to the caller to do so. This is called automatically from the destructor of Replica3, so you don't need to call it manually unless you want to stop tracking an object before it is destroyed.
void | DereferenceList (DataStructures::Multilist< ML_STACK, Replica3 * > &replicaListIn)
| Removes multiple replicated objects from the system. Same as Dereference(), but for a list of objects. Useful if also using GetReplicasCreatedByGuid(), GetReplicasCreatedByMe(), or GetReferencedReplicaList().
void | GetReplicasCreatedByGuid (RakNetGUID guid, DataStructures::Multilist< ML_STACK, Replica3 * > &replicaListOut)
| Returns all objects originally created by a particular system Originally created is defined as the value of Replica3::creatingSystemGUID, which is automatically assigned in ReplicaManager3::Reference() You do not have to be directly connected to that system to get the objects originally created by that system.
void | GetReplicasCreatedByMe (DataStructures::Multilist< ML_STACK, Replica3 * > &replicaListOut)
| Returns all objects originally created by your system Calls GetReplicasCreatedByGuid() for your own system guid.
void | GetReferencedReplicaList (DataStructures::Multilist< ML_STACK, Replica3 * > &replicaListOut)
| Returns the entire list of Replicas that we know about. This is all Replica3 instances passed to Reference, as well as instances we downloaded and created via Connection_RM3::AllocReference().
unsigned | GetReplicaCount (void) const
| Returns the number of replicas known about Returns the size of the list that would be returned by GetReferencedReplicaList().
Replica3 * | GetReplicaAtIndex (unsigned index)
| Returns a replica by index Returns one of the items in the list that would be returned by GetReferencedReplicaList().
DataStructures::DefaultIndexType | GetConnectionCount (void) const
| Returns the number of connections Returns the number of connections added with ReplicaManager3::PushConnection(), minus the number removed with ReplicaManager3::PopConnection().
Connection_RM3 * | GetConnectionAtIndex (unsigned index) const
Connection_RM3 * | GetConnectionBySystemAddress (SystemAddress sa) const
Connection_RM3 * | GetConnectionByGUID (RakNetGUID guid) const
void | SetDefaultOrderingChannel (char def)
void | SetDefaultPacketPriority (PacketPriority def)
void | SetDefaultPacketReliability (PacketReliability def)
void | SetAutoConstructByQuery (bool autoConstruct)

Enables or disables the automatic object creation and destruction feature. If true, then each ReplicaManager3::Update(), Replica3::QueryConstruction() will be called for each locally created instance of Replica3, for each instance of Connection_RM3 Based on the return value of QueryConstruction(), the object will be created or destroyed on that remote system. Defaults to true This is not efficient for large worlds where higher level culling mechanisms exist. You can narrow the scope of which objects are checked by using Connection_RM3::SetConstructionByList.

void | SetAutoSerializeInterval (RakNetTime intervalMS)
void | GetConnectionsThatHaveReplicaConstructed (Replica3 *replica, DataStructures::Multilist< ML_STACK, Connection_RM3 * > &connectionsThatHaveConstructedThisReplica)
| Return the connections that we think have an instance of the specified Replica3 instance This can be wrong, for example if that system locally deleted the outside the scope of ReplicaManager3, if QueryRemoteConstruction() returned false, or if DeserializeConstruction() returned false.
void | SetWorldID (unsigned char id)

Defines the unique instance of ReplicaManager3 if multiple instances are on the same instance of RakPeerInterface ReplicaManager3 supports multiple instances of itself attached to the same instance of rakPeer, in case your game has multiple worlds Call SetWorldID with a different number for each instance The default worldID is 0 To use multiple worlds, you will also need to call ReplicaManager3::SetNetworkIDManager() to have a different NetworkIDManager instance per world.

unsigned char | GetWorldID (void) const
void | SetNetworkIDManager (NetworkIDManager *_networkIDManager)
NetworkIDManager * | GetNetworkIDManager (void) const
| Returns what was passed to SetNetworkIDManager(), or the instance on RakPeerInterface if unset.
void | BroadcastDestructionList (DataStructures::Multilist< ML_STACK, Replica3 * > &replicaList, SystemAddress exclusionAddress)

## Protected Member Functions

virtual PluginReceiveResult | OnReceive (Packet *packet)
virtual void | Update (void)
| Update is called every time a packet is checked for .
virtual void | OnClosedConnection (SystemAddress systemAddress, RakNetGUID rakNetGUID, PI2_LostConnectionReason lostConnectionReason)
virtual void | OnNewConnection (SystemAddress systemAddress, RakNetGUID rakNetGUID, bool isIncoming)

## Detailed Description

System to help automate game object construction, destruction, and serialization ReplicaManager3 tracks your game objects and automates the networking for replicating them across the network As objects are created, destroyed, or serialized differently, those changes are pushed out to other systems To use: 1. Derive from Connection_RM3 and implement Connection_RM3::AllocReplica(). This is a factory function where given an identifier for a class (such as name) return an instance of that class. Should be able to return any networked object in your game. 2. Derive from ReplicaManager3 and implement AllocConnection() and DeallocConnection() to return the class you created in step 1. 3. Derive your networked game objects from Replica3. All pure virtuals have to be implemented, however defaults are provided for Replica3::QueryConstruction(), Replica3::QueryRemoteConstruction(), and Replica3::QuerySerialization() depending on your network architecture. 4. When a new game object is created on the local system, pass it to ReplicaManager3::Reference(). 5. When a game object is destroyed on the local system, and you want other systems to know about it, call Replica3::BroadcastDestruction().

At this point, all new connections will automatically download, get construction messages, get destruction messages, and update serialization automatically.

## Member Function Documentation

virtual Connection_RM3* RakNet::ReplicaManager3::AllocConnection | ( | SystemAddress | systemAddress,
|  | RakNetGUID | rakNetGUID |
| ) |  |  | const`[pure virtual]`

Implement to return a game specific derivation of Connection_RM3 The connection object represents a remote system connected to you that is using the ReplicaManager3 system It has functions to perform operations per-connection AllocConnection() and DeallocConnection() are factory functions to create and destroy instances of the connection object It is used if connections are automanaged (which they are by default).

See also:
  SetAutoManageConnections()

Parameters:

  `[in]` | systemAddress | Address of the system you are adding
  `[in]` | rakNetGUID | GUID of the system you are adding. See Packet::rakNetGUID or RakPeerInterface::GetGUIDFromSystemAddress()

Returns:
  The new connection instance.

void ReplicaManager3::BroadcastDestructionList | ( | DataStructures::Multilist< ML_STACK, Replica3 * > & | replicaList,
|  | SystemAddress | exclusionAddress |
| ) |  |  |

Send a network command to destroy one or more Replica3 instances Usually you won't need this, but use Replica3::BroadcastDestruction() instead. The objects are unaffected locally

Parameters:

  `[in]` | replicaList | List of Replica3 objects to tell other systems to destroy.
  `[in]` | exclusionAddress | Which system to not send to. UNASSIGNED_SYSTEM_ADDRESS to send to all.

virtual void RakNet::ReplicaManager3::DeallocConnection | ( | Connection_RM3 * | connection | ) | const`[pure virtual]`

Implement to destroy a class instanced returned by AllocConnection() Most likely just implement as {delete connection;}.

Parameters:

  `[in]` | connection | The pointer instance to delete

void ReplicaManager3::Dereference | ( | RakNet::Replica3 * | replica3 | ) |

Removes a replicated object from the system. The object is not deallocated, it is up to the caller to do so. This is called automatically from the destructor of Replica3, so you don't need to call it manually unless you want to stop tracking an object before it is destroyed.

Parameters:

  `[in]` | replica3 | The object to stop tracking

void ReplicaManager3::DereferenceList | ( | DataStructures::Multilist< ML_STACK, Replica3 * > & | replicaListIn | ) |

Removes multiple replicated objects from the system. Same as Dereference(), but for a list of objects. Useful if also using GetReplicasCreatedByGuid(), GetReplicasCreatedByMe(), or GetReferencedReplicaList().

Parameters:

  `[in]` | replicaListIn | List of objects

Connection_RM3 * ReplicaManager3::GetConnectionAtIndex | ( | unsigned | index | ) | const

Returns a connection pointer previously added with PushConnection()

Parameters:

  `[in]` | index | An index, from 0 to GetConnectionCount()-1.

Returns:
  A Connection_RM3 pointer

Connection_RM3 * ReplicaManager3::GetConnectionByGUID | ( | RakNetGUID | guid | ) | const

Returns a connection pointer previously added with PushConnection.()

Parameters:

  `[in]` | guid | The guid of the connection to return

Returns:
  A Connection_RM3 pointer, or 0 if not found

Connection_RM3 * ReplicaManager3::GetConnectionBySystemAddress | ( | SystemAddress | sa | ) | const

Returns a connection pointer previously added with PushConnection()

Parameters:

  `[in]` | sa | The system address of the connection to return

Returns:
  A Connection_RM3 pointer, or 0 if not found

DataStructures::DefaultIndexType ReplicaManager3::GetConnectionCount | ( | void |  | ) | const

Returns the number of connections Returns the number of connections added with ReplicaManager3::PushConnection(), minus the number removed with ReplicaManager3::PopConnection().

Returns:
  The number of registered connections

void ReplicaManager3::GetConnectionsThatHaveReplicaConstructed | ( | Replica3 * | replica,
|  | DataStructures::Multilist< ML_STACK, Connection_RM3 * > & | connectionsThatHaveConstructedThisReplica |
| ) |  |  |

Return the connections that we think have an instance of the specified Replica3 instance This can be wrong, for example if that system locally deleted the outside the scope of ReplicaManager3, if QueryRemoteConstruction() returned false, or if DeserializeConstruction() returned false.

Parameters:

  `[in]` | replica | The replica to check against.
  `[out]` | connectionsThatHaveConstructedThisReplica | Populated with connection instances that we believe have replica allocated

void ReplicaManager3::GetReferencedReplicaList | ( | DataStructures::Multilist< ML_STACK, Replica3 * > & | replicaListOut | ) |

Returns the entire list of Replicas that we know about. This is all Replica3 instances passed to Reference, as well as instances we downloaded and created via Connection_RM3::AllocReference().

Parameters:

  `[out]` | List | of Replica3 instances to be returned

Replica3 * ReplicaManager3::GetReplicaAtIndex | ( | unsigned | index | ) |

Returns a replica by index Returns one of the items in the list that would be returned by GetReferencedReplicaList().

Parameters:

  `[in]` | index | An index, from 0 to GetReplicaCount()-1.

Returns:
  A Replica3 instance

unsigned ReplicaManager3::GetReplicaCount | ( | void |  | ) | const

Returns the number of replicas known about Returns the size of the list that would be returned by GetReferencedReplicaList().

Returns:
  How many replica objects are in the list of replica objects

void ReplicaManager3::GetReplicasCreatedByGuid | ( | RakNetGUID | guid,
|  | DataStructures::Multilist< ML_STACK, Replica3 * > & | replicaListOut |
| ) |  |  |

Returns all objects originally created by a particular system Originally created is defined as the value of Replica3::creatingSystemGUID, which is automatically assigned in ReplicaManager3::Reference() You do not have to be directly connected to that system to get the objects originally created by that system.

Parameters:

  `[in]` | guid | GUID of the system we are referring to. Originally passed as the guid parameter to ReplicaManager3::AllocConnection()
  `[out]` | List | of Replica3 instances to be returned

void ReplicaManager3::GetReplicasCreatedByMe | ( | DataStructures::Multilist< ML_STACK, Replica3 * > & | replicaListOut | ) |

Returns all objects originally created by your system Calls GetReplicasCreatedByGuid() for your own system guid.

Parameters:

  `[out]` | List | of Replica3 instances to be returned

unsigned char ReplicaManager3::GetWorldID | ( | void |  | ) | const

Returns:
  Whatever was passed to SetWorldID(), or 0 if it was never called.

void ReplicaManager3::OnClosedConnection | ( | SystemAddress | systemAddress,
|  | RakNetGUID | rakNetGUID,
|  | PI2_LostConnectionReason | lostConnectionReason |
| ) |  |  | `[protected, virtual]`

Called when a connection is dropped because the user called RakPeer::CloseConnection() for a particular system

Parameters:

  `[in]` | systemAddress | The system whose connection was closed
  `[in]` | rakNetGuid | The guid of the specified system
  `[in]` | lostConnectionReason | How the connection was closed: manually, connection lost, or notification of disconnection

Reimplemented from PluginInterface2.

void ReplicaManager3::OnNewConnection | ( | SystemAddress | systemAddress,
|  | RakNetGUID | rakNetGUID,
|  | bool | isIncoming |
| ) |  |  | `[protected, virtual]`

Called when we got a new connection

Parameters:

  `[in]` | systemAddress | Address of the new connection
  `[in]` | rakNetGuid | The guid of the specified system
  `[in]` | isIncoming | If true, this is ID_NEW_INCOMING_CONNECTION, or the equivalent

Reimplemented from PluginInterface2.

PluginReceiveResult ReplicaManager3::OnReceive | ( | Packet * | packet | ) | `[protected, virtual]`

OnReceive is called for every packet.

Parameters:

  `[in]` | packet | the packet that is being returned to the user

Returns:
  True to allow the game and other plugins to get this message, false to absorb it

Reimplemented from PluginInterface2.

RakNet::Connection_RM3 * ReplicaManager3::PopConnection | ( | RakNetGUID | guid,
|  | bool | alsoDeleteCreatedReplicas |
| ) |  |  |

Stop tracking a connection, and optionally destroy all objects created by that system If autoDestroy is false for SetAutoManageConnections(), then you need to manually have the system stop connections. PopConnection() will do so, and return that connection instance to you. If alsoDeleteCreatedReplicas is true, then the system will call GetReplicasCreatedByGuid() to get all objects that that system originally created, BroadcastDestructionList() to send destruction packets for them all, and Replica3::DeallocReplica() to destroy them.

Parameters:

  `[in]` | guid | of the connection to get. Passed to ReplicaManager3::AllocConnection() originally.
  `[in]` | alsoDeleteCreatedReplicas | If true, destroy all Replica3 instances passed to ReplicaManager3::Reference() that this system originally created.

bool ReplicaManager3::PushConnection | ( | RakNet::Connection_RM3 * | newConnection | ) |

Track a new Connection_RM3 instance If autoCreate is false for SetAutoManageConnections(), then you need to add new instances of Connection_RM3 yourself Use PushConnection() to do so You don't need to track this pointer yourself, you can get it with GetConnectionAtIndex(), GetConnectionByGUID(), or GetConnectionBySystemAddress().

Parameters:

  `[in]` | newConnection | The new connection instance to track.

void ReplicaManager3::Reference | ( | RakNet::Replica3 * | replica3 | ) |

Adds a replicated object to the system. Anytime you create a new object that derives from Replica3, and you want ReplicaManager3 to use it, pass it to Reference() Remote systems already connected will download this object the next time ReplicaManager3::Update() is called, which happens every time you call RakPeerInterface::Receive().

Parameters:

  `[in]` | replica3 | The object to start tracking

void ReplicaManager3::SetAutoConstructByQuery | ( | bool | autoConstruct | ) |

Enables or disables the automatic object creation and destruction feature. If true, then each ReplicaManager3::Update(), Replica3::QueryConstruction() will be called for each locally created instance of Replica3, for each instance of Connection_RM3 Based on the return value of QueryConstruction(), the object will be created or destroyed on that remote system. Defaults to true This is not efficient for large worlds where higher level culling mechanisms exist. You can narrow the scope of which objects are checked by using Connection_RM3::SetConstructionByList.

Note:
  Connection_RM3::SetConstructionByList and ReplicaManager3::SetAutoConstructByQuery are mutually exclusive. Do not use both at the same time.

Parameters:

  `[in]` | autoConstruct | True to enable, false to disable.

void ReplicaManager3::SetAutoManageConnections | ( | bool | autoCreate,
|  | bool | autoDestroy |
| ) |  |  |

Enable or disable automatically assigning connections to new instances of Connection_RM3 ReplicaManager3 can automatically create and/or destroy Connection_RM3 as systems connect or disconnect from RakPeerInterface By default this is on, to make the system faster to setup If you don't want all connections to take part in the game, or you want to delay when a connection downloads the game, set autoCreate to false If you want to delay deleting a connection that has dropped, set autoDestroy to false. If you do this, then you must call PopConnection() to remove that connection from being internally tracked. You'll also have to delete the connection instance on your own.

Parameters:

  `[in]` | autoCreate | Automatically call ReplicaManager3::AllocConnection() for each new connection. Defaults to true.
  `[in]` | autoDestroy | Automatically call ReplicaManager3::DeallocConnection() for each dropped connection. Defaults to true.

void ReplicaManager3::SetAutoSerializeInterval | ( | RakNetTime | intervalMS | ) |

Every intervalMS milliseconds, Connection_RM3::OnAutoserializeInterval() will be called Defaults to 30 Pass with 0 to disable If you want to control the update interval with more granularity, use the return values from Replica3::Serialize()

Parameters:

  `[in]` | intervalMS | How frequently to autoserialize all objects. This controls the maximum number of game object updates per second.

void ReplicaManager3::SetDefaultOrderingChannel | ( | char | def | ) |

Parameters:

  `[in]` | Default | ordering channel to use for object creation, destruction, and serializations

void ReplicaManager3::SetDefaultPacketPriority | ( | PacketPriority | def | ) |

Parameters:

  `[in]` | Default | packet priority to use for object creation, destruction, and serializations

void ReplicaManager3::SetDefaultPacketReliability | ( | PacketReliability | def | ) |

Parameters:

  `[in]` | Default | packet reliability to use for object creation, destruction, and serializations

void ReplicaManager3::SetNetworkIDManager | ( | NetworkIDManager * | _networkIDManager | ) |

Sets the networkIDManager instance that this plugin relys upon. Uses whatever instance is attached to RakPeerInterface if unset. To support multiple worlds, you should set it to a different manager for each instance of the plugin

Parameters:

  `[in]` | _networkIDManager | The externally allocated NetworkIDManager instance for this plugin to use.

The documentation for this class was generated from the following files:

- C:/RakNet/Source/ReplicaManager3.h
- C:/RakNet/Source/ReplicaManager3.cpp