Plugins¶
MafiaNet’s plugin system allows extending functionality without modifying core code.
Using Plugins¶
Plugins are attached to a RakPeerInterface:
MafiaNet::SomePlugin* plugin = MafiaNet::SomePlugin::GetInstance();
peer->AttachPlugin(plugin);
// Later, to remove
peer->DetachPlugin(plugin);
MafiaNet::SomePlugin::DestroyInstance(plugin);
Available Plugins¶
Networking Plugins
FullyConnectedMesh2- Maintains fully connected peer networksNatPunchthroughClient/Server- NAT traversal supportRouter2- Route packets through intermediate peersUDPProxyClient/Server/Coordinator- UDP relay when NAT fails
Data Transfer Plugins
FileListTransfer- Transfer files with compression and delta updatesDirectoryDeltaTransfer- Sync directory contents between peers
Game Plugins
ReplicaManager3- Object replication and state synchronizationReadyEvent- Synchronize ready state across peersTeamManager- Manage teams and team balancingTeamBalancer- Automatic team balancing
Utility Plugins
RPC4Plugin- Remote procedure callsMessageFilter- Filter messages by typePacketLogger- Log all network trafficTwoWayAuthentication- Secure authentication
ReplicaManager3¶
The ReplicaManager3 plugin handles object replication:
#include "mafianet/ReplicaManager3.h"
class MyReplica : public MafiaNet::Replica3 {
public:
virtual void WriteAllocationID(MafiaNet::Connection_RM3* conn,
MafiaNet::BitStream* bs) const override {
bs->Write(MafiaNet::RakString("MyReplica"));
}
virtual MafiaNet::RM3SerializationResult Serialize(
MafiaNet::SerializeParameters* params) override {
params->outputBitstream[0].Write(position);
params->outputBitstream[0].Write(rotation);
return MafiaNet::RM3SR_BROADCAST_IDENTICALLY;
}
virtual void Deserialize(MafiaNet::DeserializeParameters* params) override {
params->serializationBitstream[0].Read(position);
params->serializationBitstream[0].Read(rotation);
}
};
RPC4Plugin¶
Call functions on remote peers:
#include "mafianet/RPC4Plugin.h"
MafiaNet::RPC4* rpc = MafiaNet::RPC4::GetInstance();
peer->AttachPlugin(rpc);
// Register a function. The trailing pointer is an opaque user context
// passed back to the handler on every call (here: nullptr, none needed).
// SpawnPlayerCallback's signature ends with `void* context`.
rpc->RegisterSlot("SpawnPlayer", SpawnPlayerCallback, nullptr, 0);
// Call remotely
MafiaNet::BitStream bs;
bs.Write(playerId);
bs.Write(spawnPosition);
rpc->Signal("SpawnPlayer", &bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0,
targetAddress, false, false);
Creating Custom Plugins¶
Extend PluginInterface2:
class MyPlugin : public MafiaNet::PluginInterface2 {
public:
virtual MafiaNet::PluginReceiveResult OnReceive(
MafiaNet::Packet* packet) override {
// Process packets before they reach the application
if (packet->data[0] == MY_CUSTOM_MESSAGE) {
HandleCustomMessage(packet);
return MafiaNet::RR_STOP_PROCESSING_AND_DEALLOCATE;
}
return MafiaNet::RR_CONTINUE_PROCESSING;
}
virtual void OnNewConnection(
const MafiaNet::SystemAddress& address,
MafiaNet::RakNetGUID guid,
bool isIncoming) override {
// Handle new connections
}
virtual void OnClosedConnection(
const MafiaNet::SystemAddress& address,
MafiaNet::RakNetGUID guid,
MafiaNet::PI2_LostConnectionReason reason) override {
// Handle disconnections
}
};