NetworkIDObject¶
NetworkIDObject provides a way to assign unique identifiers to objects that all systems can reference.
Purpose¶
In multiplayer games, you need a way to refer to the same object across different machines. NetworkIDObject solves this by:
Assigning unique IDs to objects
Allowing lookup of objects by ID
Managing object ID allocation
Basic Usage¶
Inherit from NetworkIDObject¶
#include "mafianet/NetworkIDObject.h"
class Player : public MafiaNet::NetworkIDObject {
public:
float x, y, z;
int health;
std::string name;
};
Creating and Registering Objects¶
The authority (usually server) creates objects and assigns IDs:
MafiaNet::NetworkIDManager networkIdManager;
// Create a player
Player* player = new Player();
player->SetNetworkIDManager(&networkIdManager);
// ID is automatically assigned
MafiaNet::NetworkID id = player->GetNetworkID();
// Send the ID to clients
MafiaNet::BitStream bs;
bs.Write((MafiaNet::MessageID)ID_SPAWN_PLAYER);
bs.Write(id);
bs.Write(player->x);
bs.Write(player->y);
bs.Write(player->z);
peer->Send(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, addr, true);
Receiving and Looking Up Objects¶
case ID_SPAWN_PLAYER: {
MafiaNet::NetworkID id;
float x, y, z;
bs.Read(id);
bs.Read(x);
bs.Read(y);
bs.Read(z);
// Create local representation
Player* player = new Player();
player->SetNetworkIDManager(&networkIdManager);
player->SetNetworkID(id); // Use the same ID as server
player->x = x;
player->y = y;
player->z = z;
break;
}
case ID_PLAYER_POSITION: {
MafiaNet::NetworkID id;
float x, y, z;
bs.Read(id);
bs.Read(x);
bs.Read(y);
bs.Read(z);
// Look up the player
Player* player = (Player*)networkIdManager.GET_OBJECT_FROM_ID<Player*>(id);
if (player) {
player->x = x;
player->y = y;
player->z = z;
}
break;
}
NetworkIDManager¶
The NetworkIDManager maintains the mapping between IDs and objects.
MafiaNet::NetworkIDManager networkIdManager;
// Set whether this instance is the authority (assigns IDs)
networkIdManager.SetIsNetworkIDAuthority(isServer);
// Look up object by ID
void* obj = networkIdManager.GET_BASE_OBJECT_FROM_ID(id);
// Typed lookup
Player* player = networkIdManager.GET_OBJECT_FROM_ID<Player*>(id);
Object Deletion¶
When destroying networked objects:
// On authority (server)
void DestroyPlayer(Player* player) {
MafiaNet::NetworkID id = player->GetNetworkID();
// Notify clients
MafiaNet::BitStream bs;
bs.Write((MafiaNet::MessageID)ID_DESTROY_PLAYER);
bs.Write(id);
peer->Send(&bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, addr, true);
delete player; // Automatically unregisters from manager
}
// On client
case ID_DESTROY_PLAYER: {
MafiaNet::NetworkID id;
bs.Read(id);
Player* player = networkIdManager.GET_OBJECT_FROM_ID<Player*>(id);
if (player) {
delete player;
}
break;
}
Integration with ReplicaManager3¶
For more advanced object replication, consider using ReplicaManager3, which builds on NetworkIDObject and provides:
Automatic object creation/destruction across network
Serialization management
Scoping (which clients see which objects)
Reference pointer serialization
See Also¶
ReplicaManager3 - Advanced object replication
Creating Packets - Sending object updates