using Hazel;
using InnerNet;
namespace BetterAmongUs;
static class ExtendedInnerNetClient
{
///
/// Starts the RPC desynchronization process for the given player, call ID, and send option.
///
/// The InnerNetClient instance.
/// The network ID of the player.
/// The RPC call ID.
/// The send option for the RPC.
/// The client ID to ignore. Default is -1, which means no client is ignored.
/// A list of MessageWriter instances for the RPC calls.
///
///
/// List<MessageWriter> messageWriter = AmongUsClient.Instance.StartRpcDesync(PlayerNetId, (byte)RpcCalls, SendOption, ClientId);
/// messageWriter.ForEach(mW => mW.Write("RPC TEST"));
/// AmongUsClient.Instance.FinishRpcDesync(messageWriter);
///
///
/*
List messageWriter = AmongUsClient.Instance.StartRpcDesync(PlayerNetId, (byte)RpcCalls, SendOption, ClientId);
messageWriter.ForEach(mW => mW.Write("RPC TEST"));
AmongUsClient.Instance.FinishRpcDesync(messageWriter);
*/
public static List StartRpcDesync(this InnerNetClient client, uint playerNetId, byte callId, SendOption option, int ignoreClientId = -1, Func clientCheck = null)
{
List messageWriters = new List();
if (ignoreClientId < 0)
{
messageWriters.Add(client.StartRpcImmediately(playerNetId, callId, option, -1));
}
else
{
foreach (var allClients in AmongUsClient.Instance.allClients.ToArray().Where(c => c.Id != ignoreClientId))
{
if (clientCheck == null || clientCheck.Invoke(allClients))
{
messageWriters.Add(client.StartRpcImmediately(playerNetId, callId, option, allClients.Id));
}
}
}
return messageWriters;
}
public static void FinishRpcDesync(this InnerNetClient client, List messageWriters)
{
foreach (var msg in messageWriters)
{
msg.EndMessage();
msg.EndMessage();
client.SendOrDisconnect(msg);
msg.Recycle();
}
}
}