Skip to main content

Custom RPCs

What is a RPC?​

RPC is a method of sending calling a method over a network. In case of Among Us it means that we can send data to other players in the lobby and make them run a method.

How to make a RPC?​

There are 2 methods of making RPCs using Reactor:

  • method rpc - the easiest and faster way
  • extending CustomRpc class - the most flexible but clunky

In boths cases you will need a CustomRpcCalls enum, which will store ids for all your rpcs.

public enum CustomRpcCalls : uint
{
SayHello = 0
}

Method RPC​

To define a method rpc all you need is:

[MethodRpc((uint) CustomRpcCalls.SayHello)]
public static void RpcSayHello(PlayerControl player, string text)
{
Logger<ExamplePlugin>.Info($"{player.Data.PlayerName} said: {text}");
}

To call it just:

RpcSayHello(PlayerControl.LocalPlayer, "Hello from docs.reactor.gg!");
tip

Method rpc can be an extension method

Class RPC​

caution

You should only do this if you are already experienced with Hazel and MessageConverter api is not enough for you.

To define a class:

[RegisterCustomRpc((uint) CustomRpcCalls.SayHello)]
public class SayHelloRpc : PlayerCustomRpc<ExamplePlugin, SayHelloRpc.Data>
{
public SayHelloRpc(ExamplePlugin plugin, uint id) : base(plugin, id)
{
}

public override RpcLocalHandling LocalHandling => RpcLocalHandling.Before;

public readonly struct Data
{
public readonly string Message;

public Data(string message)
{
Message = message;
}
}

public override void Write(MessageWriter writer, Data data)
{
writer.Write(data.Message);
}

public override Data Read(MessageReader reader)
{
return new Data(reader.ReadString());
}

public override void Handle(PlayerControl player, Data data)
{
Logger<ExamplePlugin>.Info($"{player.Data.PlayerName} said: {data.Message}");
}
}

To call it just:

Rpc<SayHelloRpc>.Instance.Send(new SayHelloRpc.Data("Hello from docs.reactor.gg!"));
tip

Rpc<T>.Instance returns an instance of T, so you can call access members on the rpc, you can use that to create helper methods.