From 71461583b3f5110c04f68ea2bce6fd457a4a6a64 Mon Sep 17 00:00:00 2001 From: Ape <155788660+ApeMV@users.noreply.github.com> Date: Fri, 29 May 2026 16:46:00 +0200 Subject: [PATCH] That was not a fun surpirse --- Modules/Utils.cs | 22 +++++++++ Patches/ExilePatch.cs | 112 ++++++++++++++++++++---------------------- 2 files changed, 76 insertions(+), 58 deletions(-) diff --git a/Modules/Utils.cs b/Modules/Utils.cs index 6ce07c4..f20524d 100644 --- a/Modules/Utils.cs +++ b/Modules/Utils.cs @@ -547,4 +547,26 @@ public static class Utils PlayerControl.LocalPlayer.CmdReportDeadBody(null); MeetingHud.Instance.RpcClose(); } + + public static MethodBase GetStateMachineMoveNext(string methodName) + { + var typeName = typeof(T).FullName; + var stateMachine = typeof(T).GetNestedTypes().FirstOrDefault(x => x.Name.Contains(methodName)); + + if (stateMachine == null) + { + Logger.Error($"Failed to find {methodName} state machine for {typeName}", "GetStateMachineMoveNext"); + return null; + } + + var moveNext = AccessTools.Method(stateMachine, "MoveNext"); + if (moveNext == null) + { + Logger.Error($"Failed to find MoveNext method for {typeName}.{methodName}", "GetStateMachineMoveNext"); + return null; + } + + Logger.Info($"Found {methodName}.MoveNext", "GetStateMachineMoveNext"); + return moveNext; + } } \ No newline at end of file diff --git a/Patches/ExilePatch.cs b/Patches/ExilePatch.cs index 6b074ed..30ee3f3 100644 --- a/Patches/ExilePatch.cs +++ b/Patches/ExilePatch.cs @@ -1,78 +1,74 @@ +using System.Reflection; +using Il2CppInterop.Runtime.InteropTypes; + namespace AmongUsRevamped; +[HarmonyPatch] class ExileControllerWrapUpPatch { - [HarmonyPatch(typeof(ExileController), nameof(ExileController.WrapUp))] - class ExileControllerPatch + public static MethodBase TargetMethod() { - public static void Postfix(ExileController __instance) + return AccessTools.Method(typeof(ExileController), nameof(ExileController.WrapUp)); + } + + public static void Postfix(ExileController __instance) + { + AfterExile(__instance.initData.networkedPlayer); + } + + public static void AfterExile(NetworkedPlayerInfo ejectedPlayer) + { + if (!AmongUsClient.Instance.AmHost) return; + if (ejectedPlayer == null) return; + + PlayerControl pc = null; + PlayerControl exiledPlayer = ejectedPlayer.Object; + foreach (var p in PlayerControl.AllPlayerControls) { - AfterExile(__instance.initData.networkedPlayer); - } - - public static void AfterExile(NetworkedPlayerInfo ejectedPlayer) - { - if (!AmongUsClient.Instance.AmHost) return; - - if (ejectedPlayer == null) return; - - PlayerControl pc = null; - PlayerControl exiledPlayer = ejectedPlayer.Object; - foreach (var p in PlayerControl.AllPlayerControls) + if (p.PlayerId == ejectedPlayer.PlayerId) { - if (p.PlayerId == ejectedPlayer.PlayerId) - { - pc = p; - } - - if (ejectedPlayer == PlayerControl.LocalPlayer.Data && !Main.DisableInfoWhenDead.Value) - { - if (p.Data.Role.IsImpostor) - { - p.cosmetics.nameText.text = $"{p.Data.PlayerName}({MurderPlayerPatch.killCount[p.Data.PlayerId]}†)"; - } - else - { - if (!PlayerControlCompleteTaskPatch.playerTasksCompleted.ContainsKey(p)) - { - PlayerControlCompleteTaskPatch.playerTasksCompleted[p] = 0; - } - p.cosmetics.nameText.text = $"{p.Data.PlayerName}({PlayerControlCompleteTaskPatch.playerTasksCompleted[p]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p]})"; - } - } + pc = p; } - Logger.Info($" {ejectedPlayer.PlayerName} was ejected", "ExileController"); - - if (PlayerControlSetRolePatch.Jesters.Contains(exiledPlayer)) + if (ejectedPlayer == PlayerControl.LocalPlayer.Data && !Main.DisableInfoWhenDead.Value) { - Logger.Info($"Jester {ejectedPlayer.PlayerName} wins", "ExilePatch"); - Utils.CustomWinnerEndGame(exiledPlayer, 1); - NormalGameEndChecker.CheckWinnerText("Jester"); - return; + if (p.Data.Role.IsImpostor) + { + p.cosmetics.nameText.text = $"{p.Data.PlayerName}({MurderPlayerPatch.killCount[p.Data.PlayerId]}†)"; + } + else + { + if (!PlayerControlCompleteTaskPatch.playerTasksCompleted.ContainsKey(p)) + { + PlayerControlCompleteTaskPatch.playerTasksCompleted[p] = 0; + } + p.cosmetics.nameText.text = $"{p.Data.PlayerName}({PlayerControlCompleteTaskPatch.playerTasksCompleted[p]}/{PlayerControlCompleteTaskPatch.tasksPerPlayer[p]})"; + } } + } + Logger.Info($" {ejectedPlayer.PlayerName} was ejected", "ExileController"); + + if (PlayerControlSetRolePatch.Jesters.Contains(exiledPlayer)) + { + Logger.Info($"Jester {ejectedPlayer.PlayerName} wins", "ExilePatch"); + Utils.CustomWinnerEndGame(exiledPlayer, 1); + NormalGameEndChecker.CheckWinnerText("Jester"); + return; } } -#if ANDROID - [HarmonyPatch(typeof(AirshipExileController), nameof(AirshipExileController.WrapUpAndSpawn))] - class AirshipExileControllerPatchAndroid + [HarmonyPatch] + class AirshipExileControllerPatch { - public static void Postfix(AirshipExileController __instance) + public static MethodBase TargetMethod() { - ExileControllerPatch.AfterExile(__instance.initData.networkedPlayer); + return Utils.GetStateMachineMoveNext(nameof(AirshipExileController.WrapUpAndSpawn)); + } + + public static void Postfix(AirshipExileController._WrapUpAndSpawn_d__11 __instance) + { + ExileControllerWrapUpPatch.AfterExile(__instance.__4__this.initData.networkedPlayer); } } -#else - [HarmonyPatch(typeof(AirshipExileController._WrapUpAndSpawn_d__11), nameof(AirshipExileController._WrapUpAndSpawn_d__11.MoveNext))] - class AirshipExileControllerPatchPC - { - public static void Postfix(AirshipExileController._WrapUpAndSpawn_d__11 __instance, ref bool __result) - { - var instance = __instance.__4__this; - ExileControllerPatch.AfterExile(instance.initData.networkedPlayer); - } - } -#endif } \ No newline at end of file