From 9afe821b0f83739d8a213553a48d5816c9ccf5b2 Mon Sep 17 00:00:00 2001 From: XtraCube <72575280+XtraCube@users.noreply.github.com> Date: Thu, 27 Mar 2025 18:09:27 -0400 Subject: [PATCH] fix stupid innerscuff code --- MiraAPI/Patches/Roles/RoleManagerPatches.cs | 38 +++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/MiraAPI/Patches/Roles/RoleManagerPatches.cs b/MiraAPI/Patches/Roles/RoleManagerPatches.cs index f326239..63ed61a 100644 --- a/MiraAPI/Patches/Roles/RoleManagerPatches.cs +++ b/MiraAPI/Patches/Roles/RoleManagerPatches.cs @@ -5,6 +5,7 @@ using MiraAPI.Events; using MiraAPI.Events.Vanilla.Gameplay; using MiraAPI.Modifiers; using MiraAPI.Roles; +using UnityEngine; namespace MiraAPI.Patches.Roles; @@ -15,6 +16,43 @@ public static class RoleManagerPatches [HarmonyPatch(nameof(RoleManager.SetRole))] public static void SetRolePatch(RoleManager __instance, PlayerControl targetPlayer, RoleTypes roleType) { + if (!targetPlayer) + { + return; + } + var data = targetPlayer.Data; + if (data == null) + { + Debug.LogError("It shouldn't be possible, but " + targetPlayer.name + " still doesn't have PlayerData during role selection."); + return; + } + if (data.Role) + { + data.Role.Deinitialize(targetPlayer); + Object.Destroy(data.Role.gameObject); + } + var roleBehaviour = Object.Instantiate(__instance.AllRoles.First(r => r.Role == roleType), data.gameObject.transform); + roleBehaviour.Initialize(targetPlayer); + targetPlayer.Data.Role = roleBehaviour; + targetPlayer.Data.RoleType = roleType; + + // basically everything is the same except this one if statement + // innersloth decided to check the roleType manually instead of the role behaviour. + if (!roleBehaviour.IsDead) + { + targetPlayer.Data.RoleWhenAlive = new Il2CppSystem.Nullable(roleType); + } + roleBehaviour.AdjustTasks(targetPlayer); + switch (roleBehaviour.IsDead) + { + case true when !targetPlayer.Data.IsDead: + targetPlayer.Die(DeathReason.Kill, false); + return; + case false when targetPlayer.Data.IsDead: + targetPlayer.Revive(); + break; + } + var @event = new SetRoleEvent(targetPlayer, roleType); MiraEventManager.InvokeEvent(@event); }