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(); } } }