using System.Collections.Generic; using Hazel; using InnerNet; using MiraAPI.GameEnd; using Reactor.Networking.Attributes; using Reactor.Networking.Rpc; using Reactor.Utilities; namespace MiraAPI.Networking; /// /// Custom Game Over RPC. /// /// [RegisterCustomRpc((uint)MiraRpc.CustomGameOver)] public class CustomGameOverRpc(MiraApiPlugin plugin, uint id) : PlayerCustomRpc(plugin, id) { /// public override RpcLocalHandling LocalHandling => RpcLocalHandling.After; /// public override void Write(MessageWriter writer, GameOverData data) { writer.WritePacked(data.Reason); writer.WritePacked(data.Winners.Count); foreach (var player in data.Winners) { writer.WriteNetObject(player); } } /// public override GameOverData Read(MessageReader reader) { var reason = reader.ReadPackedInt32(); var count = reader.ReadPackedInt32(); var data = new List(count); for (var i = 0; i < count; i++) { data.Add(reader.ReadNetObject()); } return new GameOverData(reason, data); } /// public override void Handle(PlayerControl innerNetObject, GameOverData data) { if (GameOverManager.TryGetGameOver(data.Reason, out var gameOver)) { if (!gameOver.VerifyCondition(innerNetObject, [.. data.Winners])) { Logger.Info($"Game over condition not met for {gameOver.GetType().Name}"); return; } CustomGameOver.Instance = gameOver; if (AmongUsClient.Instance.AmHost) { GameManager.Instance.RpcEndGame(gameOver, false); } } else { CustomGameOver.Instance = null; Logger.Error($"Unknown game over reason: {data.Reason}"); } } }