using HarmonyLib; using NewHorizons.Utility.OWML; using UnityEngine; using UnityEngine.SceneManagement; namespace NewHorizons.Handlers { [HarmonyPatch] internal class InvulnerabilityHandler { private static bool _invulnerableOverride; public static void MakeInvulnerable(bool invulnerable) { NHLogger.Log($"Toggling immortality: {invulnerable}"); // We're setting our own override because we want to ensure that no other mod that can set _invincible can break this for us _invulnerableOverride = invulnerable; var deathManager = GetDeathManager(); var resources = GetPlayerResouces(); if (invulnerable) { deathManager._invincible = true; } else { resources._currentHealth = 100f; deathManager._invincible = false; } } [HarmonyPrefix] [HarmonyPatch(typeof(DeathManager), nameof(DeathManager.KillPlayer))] [HarmonyPatch(typeof(PlayerResources), nameof(PlayerResources.ApplyInstantDamage))] [HarmonyPatch(typeof(PlayerImpactAudio), nameof(PlayerImpactAudio.OnImpact))] public static bool DeathManager_KillPlayer_Prefix() { // Base game _invincible is still overriden by high speed impacts // We also are avoiding playing impact related effects by just skipping these methods return !_invulnerableOverride; } private static DeathManager GetDeathManager() => GameObject.FindObjectOfType(); private static PlayerResources GetPlayerResouces() => GameObject.FindObjectOfType(); static InvulnerabilityHandler() { // If the scene unloads when _invulnerableOverride is on it might not get turned off SceneManager.sceneUnloaded += (_) => _invulnerableOverride = false; } } }