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 networks

  • NatPunchthroughClient/Server - NAT traversal support

  • Router2 - Route packets through intermediate peers

  • UDPProxyClient/Server/Coordinator - UDP relay when NAT fails

Data Transfer Plugins

  • FileListTransfer - Transfer files with compression and delta updates

  • DirectoryDeltaTransfer - Sync directory contents between peers

Game Plugins

  • ReplicaManager3 - Object replication and state synchronization

  • ReadyEvent - Synchronize ready state across peers

  • TeamManager - Manage teams and team balancing

  • TeamBalancer - Automatic team balancing

Utility Plugins

  • RPC4Plugin - Remote procedure calls

  • MessageFilter - Filter messages by type

  • PacketLogger - Log all network traffic

  • TwoWayAuthentication - 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
    }
};