Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of Hardcore v1.0.0
Hardcore-IL2CPP.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using Hardcore; using Hardcore.Helpers; using Hardcore.Patches; using HarmonyLib; using Il2CppFishNet; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Il2CppScheduleOne; using Il2CppScheduleOne.DevUtilities; using Il2CppScheduleOne.ItemFramework; using Il2CppScheduleOne.Persistence; using Il2CppScheduleOne.PlayerScripts; using Il2CppScheduleOne.UI; using Il2CppScheduleOne.UI.MainMenu; using Il2CppSystem; using Il2CppSystem.Collections.Generic; using Il2CppTMPro; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using S1API.Internal.Abstraction; using S1API.Saveables; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(global::Hardcore.Hardcore), "Hardcore", "1.0.0", "k073l", null)] [assembly: MelonColor(1, 255, 0, 0)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("Hardcore-IL2CPP")] [assembly: AssemblyConfiguration("Release IL2CPP")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+bead19bfee33487deb72cf5e424a015fea248be8")] [assembly: AssemblyProduct("Hardcore-IL2CPP")] [assembly: AssemblyTitle("Hardcore-IL2CPP")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Hardcore { public class HardcoreData { public bool HardcoreMode; public string Version = "1.0.0"; public bool Died; public string Reason = ""; } public class HardcoreSave : Saveable { [SaveableField("hardcore_mode")] public HardcoreData HardcoreModeData = new HardcoreData(); public static HardcoreSave Instance { get; } = new HardcoreSave(); protected override void OnSaved() { Melon<Hardcore>.Logger.Msg("Game Saved!"); Melon<Hardcore>.Logger.Msg($"Hardcore Mode is: {HardcoreModeData.HardcoreMode}"); } protected override void OnLoaded() { Melon<Hardcore>.Logger.Msg("Game Loaded!"); Melon<Hardcore>.Logger.Msg($"Hardcore Mode is: {HardcoreModeData.HardcoreMode}"); } } public static class BuildInfo { public const string Name = "Hardcore"; public const string Description = "Adds a Hardcore mode to the game"; public const string Author = "k073l"; public const string Version = "1.0.0"; } public class Hardcore : MelonMod { [CompilerGenerated] private sealed class <CheckHardcore>d__11 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CheckHardcore>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; case 1: <>1__state = -1; _logger.Msg("Hardcore mode is " + (HardcoreSave.Instance.HardcoreModeData.HardcoreMode ? "enabled" : "disabled")); DeathScreenPatch.AddDeathUIInfo(); if (HardcoreSave.Instance.HardcoreModeData.Died) { PlayerCameraPatch.FreeCamPlayerInvisible(); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static Instance _logger; private static Texture2D _heartTexture2D; private static MelonPreferences_Category _category; private static MelonPreferences_Entry<bool> _showHeartHUD; private static MelonPreferences_Entry<int> _heartHUDsize; private static MelonPreferences_Entry<int> _heartHUDXOffset; private static MelonPreferences_Entry<int> _heartHUDYOffset; public override void OnInitializeMelon() { _logger = ((MelonBase)this).LoggerInstance; _logger.Msg("Hardcore initialized"); _category = MelonPreferences.CreateCategory("Hardcore"); _showHeartHUD = _category.CreateEntry<bool>("ShowHeartHUD", true, "Show Heart HUD", "Show a heart icon in the HUD when in Hardcore mode", false, false, (ValueValidator)null, (string)null); _heartHUDsize = _category.CreateEntry<int>("HeartHUDSize", 32, "Heart HUD Size", "Size of the heart icon in the HUD", false, false, (ValueValidator)null, (string)null); _heartHUDXOffset = _category.CreateEntry<int>("HeartHUDXOffset", 5, "Heart HUD Position (horizontal)", "Horizontal offset from the right side of the screen (in px)", false, false, (ValueValidator)null, (string)null); _heartHUDYOffset = _category.CreateEntry<int>("HeartHUDYOffset", 5, "Heart HUD Position (vertical)", "Vertical offset from the top of the screen (in px)", false, false, (ValueValidator)null, (string)null); ModSaveableRegistry.Register((Saveable)(object)HardcoreSave.Instance, (string)null); LoadEmbeddedImage(); } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { _logger.Debug("Scene loaded: " + sceneName); if (!(sceneName == "Menu")) { if (sceneName == "Main") { _logger.Debug("Main scene loaded, waiting for player"); MelonCoroutines.Start(Utils.WaitForPlayer(CheckHardcore())); } } else { HardcoreSave.Instance.HardcoreModeData = new HardcoreData(); } } private void LoadEmbeddedImage() { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream("Hardcore.assets.heart.png"); if (stream == null) { _logger.Error("Embedded image not found!"); return; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); _heartTexture2D = new Texture2D(2, 2); if (!ImageConversion.LoadImage(_heartTexture2D, Il2CppStructArray<byte>.op_Implicit(array))) { _logger.Error("Failed to load image data into Texture2D."); } } public override void OnGUI() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); if (!(((Scene)(ref activeScene)).name != "Main") && !((Object)(object)_heartTexture2D == (Object)null) && HardcoreSave.Instance.HardcoreModeData.HardcoreMode && _showHeartHUD.Value) { float num = _heartHUDsize.Value; float num2 = (float)Screen.width - num - (float)_heartHUDXOffset.Value; float num3 = _heartHUDYOffset.Value; GUI.DrawTexture(new Rect(num2, num3, num, num), (Texture)(object)_heartTexture2D); } } [IteratorStateMachine(typeof(<CheckHardcore>d__11))] private static IEnumerator CheckHardcore() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CheckHardcore>d__11(0); } } } namespace Hardcore.Patches { [HarmonyPatch(typeof(DeathScreen))] public class DeathScreenPatch { [HarmonyPatch("Open")] [HarmonyPostfix] public static void SaveDeath(DeathScreen __instance) { if (HardcoreSave.Instance.HardcoreModeData.HardcoreMode) { Melon<Hardcore>.Logger.Msg("Player has died in Hardcore."); if (!string.IsNullOrEmpty(HardcoreSave.Instance.HardcoreModeData.Reason)) { Melon<Hardcore>.Logger.Msg("Death Reason: " + HardcoreSave.Instance.HardcoreModeData.Reason); } HardcoreSave.Instance.HardcoreModeData.Died = true; Singleton<SaveManager>.Instance.Save(); } } public static void AddDeathUIInfo() { if (HardcoreSave.Instance.HardcoreModeData.HardcoreMode) { Transform val = ((Component)Singleton<DeathScreen>.Instance).transform.Find("Container"); Transform val2 = val.Find("Title"); Transform button = val.Find("Respawn"); Transform button2 = val.Find("Load"); EditButton(button); EditButton(button2); } } public static void EditButton(Transform button) { Button component = ((Component)button).GetComponent<Button>(); if ((Object)(object)component != (Object)null) { ((UnityEventBase)component.onClick).RemoveAllListeners(); ((UnityEvent)component.onClick).AddListener(UnityAction.op_Implicit((Action)GhostMode)); } TextMeshProUGUI componentInChildren = ((Component)button).GetComponentInChildren<TextMeshProUGUI>(); if ((Object)(object)componentInChildren != (Object)null) { ((TMP_Text)componentInChildren).text = "Become a Ghost"; } } public static void GhostMode() { Singleton<DeathScreen>.Instance.Close(); PlayerSingleton<PlayerCamera>.Instance.LockMouse(); PlayerCameraPatch.FreeCamPlayerInvisible(); } } [HarmonyPatch(typeof(PlayerCamera))] public class PlayerCameraPatch { [HarmonyPatch("Exit")] [HarmonyPostfix] public static void FreecamJailPost() { if (HardcoreSave.Instance.HardcoreModeData.HardcoreMode && HardcoreSave.Instance.HardcoreModeData.Died) { FreeCamPlayerInvisible(); if (Singleton<PauseMenu>.Instance.IsPaused) { Singleton<PauseMenu>.Instance.Resume(); } else { Singleton<PauseMenu>.Instance.Pause(); } } } public static void FreeCamPlayerInvisible() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) PlayerSingleton<PlayerCamera>.Instance.FreeCamEnabled = true; ((Behaviour)Singleton<HUD>.Instance.canvas).enabled = false; PlayerSingleton<PlayerMovement>.Instance.canMove = false; Player.Local.SetVisibleToLocalPlayer(false); PlayerSingleton<PlayerCamera>.Instance.OverrideTransform(((Component)PlayerSingleton<PlayerCamera>.Instance).transform.position, ((Component)PlayerSingleton<PlayerCamera>.Instance).transform.rotation, 0f, false); PlayerSingleton<PlayerCamera>.Instance.AddActiveUIElement(((Object)PlayerSingleton<PlayerCamera>.Instance).name); } } [HarmonyPatch(typeof(SetupScreen))] public class SetupScreenPatch { public static Toggle hardcoreToggle; public static TextMeshProUGUI hardcoreToggleLabel; public static GameObject hardcoreToggleContainer; [HarmonyPatch("Start")] [HarmonyPostfix] public static void AddHardcoreToggle(SetupScreen __instance) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Expected O, but got Unknown //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Expected O, but got Unknown //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_0276: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_0309: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) //IL_04f7: Unknown result type (might be due to invalid IL or missing references) //IL_0418: Unknown result type (might be due to invalid IL or missing references) //IL_0434: Unknown result type (might be due to invalid IL or missing references) //IL_0479: Unknown result type (might be due to invalid IL or missing references) //IL_0488: Unknown result type (might be due to invalid IL or missing references) //IL_0497: Unknown result type (might be due to invalid IL or missing references) //IL_04a6: Unknown result type (might be due to invalid IL or missing references) //IL_04b5: Unknown result type (might be due to invalid IL or missing references) //IL_04c4: Unknown result type (might be due to invalid IL or missing references) //IL_04d3: Unknown result type (might be due to invalid IL or missing references) //IL_05a4: Unknown result type (might be due to invalid IL or missing references) //IL_05ab: Expected O, but got Unknown //IL_05d7: Unknown result type (might be due to invalid IL or missing references) //IL_05ee: Unknown result type (might be due to invalid IL or missing references) //IL_0605: Unknown result type (might be due to invalid IL or missing references) //IL_061c: Unknown result type (might be due to invalid IL or missing references) //IL_0633: Unknown result type (might be due to invalid IL or missing references) //IL_0698: Unknown result type (might be due to invalid IL or missing references) //IL_06aa: Unknown result type (might be due to invalid IL or missing references) //IL_06bc: Unknown result type (might be due to invalid IL or missing references) //IL_06fd: Unknown result type (might be due to invalid IL or missing references) //IL_0702: Unknown result type (might be due to invalid IL or missing references) //IL_0706: Unknown result type (might be due to invalid IL or missing references) //IL_070d: Unknown result type (might be due to invalid IL or missing references) //IL_071a: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)__instance).transform; Transform val = transform.Find("SkipIntro"); Transform val2 = transform.Find("Confirm"); if ((Object)(object)val == (Object)null) { Melon<Hardcore>.Logger.Error("SkipIntro not found!"); return; } Toggle component = ((Component)val).GetComponent<Toggle>(); TextMeshProUGUI componentInChildren = ((Component)val).GetComponentInChildren<TextMeshProUGUI>(); hardcoreToggleContainer = new GameObject("HardcoreMode"); hardcoreToggleContainer.transform.SetParent(transform); hardcoreToggleContainer.transform.localScale = Vector3.one; RectTransform val3 = hardcoreToggleContainer.AddComponent<RectTransform>(); RectTransform component2 = ((Component)val).GetComponent<RectTransform>(); val3.anchorMin = new Vector2(0.5f, 0.5f); val3.anchorMax = new Vector2(0.5f, 0.5f); val3.pivot = new Vector2(0.5f, 0.5f); val3.sizeDelta = component2.sizeDelta; val3.anchoredPosition = new Vector2(0f, component2.anchoredPosition.y - component2.sizeDelta.y - 30f); RectTransform component3 = ((Component)val2).GetComponent<RectTransform>(); component3.anchoredPosition = new Vector2(component3.anchoredPosition.x, component3.anchoredPosition.y - 35f); GameObject val4 = new GameObject("Toggle"); val4.transform.SetParent(hardcoreToggleContainer.transform); RectTransform val5 = val4.AddComponent<RectTransform>(); val5.anchorMin = new Vector2(0.5f, 0.5f); val5.anchorMax = new Vector2(0.5f, 0.5f); val5.pivot = new Vector2(0.5f, 0.5f); val5.anchoredPosition = new Vector2(-48f, 0f); val5.sizeDelta = new Vector2(25f, 25f); Image val6 = val4.AddComponent<Image>(); hardcoreToggle = val4.AddComponent<Toggle>(); ((Selectable)hardcoreToggle).targetGraphic = (Graphic)(object)val6; hardcoreToggle.isOn = false; GameObject val7 = new GameObject("Checkmark"); val7.transform.SetParent(val4.transform); RectTransform val8 = val7.AddComponent<RectTransform>(); Image val9 = val7.AddComponent<Image>(); hardcoreToggle.graphic = (Graphic)(object)val9; ((Selectable)hardcoreToggle).transition = ((Selectable)component).transition; ((Selectable)hardcoreToggle).colors = ((Selectable)component).colors; ((Selectable)hardcoreToggle).spriteState = ((Selectable)component).spriteState; ((Selectable)hardcoreToggle).animationTriggers = ((Selectable)component).animationTriggers; Image val10 = null; Graphic targetGraphic = ((Selectable)component).targetGraphic; Image val11 = (Image)(object)((targetGraphic is Image) ? targetGraphic : null); if (val11 != null) { val10 = val11; } else if ((Object)(object)((Selectable)component).targetGraphic != (Object)null) { val10 = ((Component)((Selectable)component).targetGraphic).GetComponent<Image>(); } if ((Object)(object)val10 != (Object)null) { val6.sprite = val10.sprite; val6.type = val10.type; ((Graphic)val6).color = ((Graphic)val10).color; ((Graphic)val6).material = ((Graphic)val10).material; ((Graphic)val6).raycastTarget = ((Graphic)val10).raycastTarget; } else { val6.type = (Type)1; ((Graphic)val6).color = Color.gray; ((Graphic)val6).raycastTarget = true; if ((Object)(object)((Selectable)component).targetGraphic != (Object)null) { ((Graphic)val6).material = ((Selectable)component).targetGraphic.material; ((Graphic)val6).raycastTarget = ((Selectable)component).targetGraphic.raycastTarget; } Melon<Hardcore>.Logger.Warning("Using fallback background configuration"); } Image val12 = null; Graphic graphic = component.graphic; Image val13 = (Image)(object)((graphic is Image) ? graphic : null); if (val13 != null) { val12 = val13; } else if ((Object)(object)component.graphic != (Object)null) { val12 = ((Component)component.graphic).GetComponent<Image>(); } if ((Object)(object)val12 != (Object)null) { val9.sprite = val12.sprite; val9.type = val12.type; ((Graphic)val9).color = new Color(14f / 15f, 0.29411766f, 0.16862746f); ((Graphic)val9).material = ((Graphic)val12).material; ((Graphic)val9).raycastTarget = ((Graphic)val12).raycastTarget; RectTransform component4 = ((Component)val12).GetComponent<RectTransform>(); if ((Object)(object)component4 != (Object)null) { val8.anchorMin = component4.anchorMin; val8.anchorMax = component4.anchorMax; val8.pivot = component4.pivot; val8.anchoredPosition = component4.anchoredPosition; val8.sizeDelta = component4.sizeDelta; val8.offsetMin = component4.offsetMin; val8.offsetMax = component4.offsetMax; } } else { ((Graphic)val9).color = new Color(14f / 15f, 0.29411766f, 0.16862746f); val9.type = (Type)0; if ((Object)(object)component.graphic != (Object)null) { ((Graphic)val9).material = component.graphic.material; ((Graphic)val9).raycastTarget = component.graphic.raycastTarget; } Il2CppArrayBase<Sprite> source = Resources.FindObjectsOfTypeAll<Sprite>(); Sprite val14 = ((IEnumerable<Sprite>)source).FirstOrDefault((Func<Sprite, bool>)((Sprite s) => ((Object)s).name.ToLower().Contains("check") || ((Object)s).name.ToLower().Contains("tick") || ((Object)s).name.ToLower().Contains("mark"))); if ((Object)(object)val14 != (Object)null) { val9.sprite = val14; } Melon<Hardcore>.Logger.Warning("Using fallback checkmark configuration"); } GameObject val15 = new GameObject("Label"); val15.transform.SetParent(hardcoreToggleContainer.transform); RectTransform val16 = val15.AddComponent<RectTransform>(); val16.anchorMin = new Vector2(0.5f, 0.5f); val16.anchorMax = new Vector2(0.5f, 0.5f); val16.pivot = new Vector2(0f, 0.5f); val16.anchoredPosition = new Vector2(-30f, 0f); val16.sizeDelta = new Vector2(200f, 20f); hardcoreToggleLabel = val15.AddComponent<TextMeshProUGUI>(); ((TMP_Text)hardcoreToggleLabel).text = "Hardcore Mode"; ((TMP_Text)hardcoreToggleLabel).font = ((TMP_Text)componentInChildren).font; ((TMP_Text)hardcoreToggleLabel).fontSize = ((TMP_Text)componentInChildren).fontSize * 1.25f; ((Graphic)hardcoreToggleLabel).color = new Color(44f / 51f, 4f / 51f, 0.23529412f); ((TMP_Text)hardcoreToggleLabel).alignment = ((TMP_Text)componentInChildren).alignment; ((TMP_Text)hardcoreToggleLabel).fontStyle = ((TMP_Text)componentInChildren).fontStyle; ((TMP_Text)hardcoreToggleLabel).lineSpacing = ((TMP_Text)componentInChildren).lineSpacing; ((Selectable)hardcoreToggle).interactable = true; Transform val17 = transform.Find("Background"); RectTransform component5 = ((Component)val17).GetComponent<RectTransform>(); Vector2 sizeDelta = component5.sizeDelta; component5.sizeDelta = new Vector2(sizeDelta.x, sizeDelta.y + 65f); Melon<Hardcore>.Logger.Msg("Hardcore toggle created successfully!"); } [HarmonyPatch("StartGame")] [HarmonyPostfix] public static void ApplyHardcoreSetting(SetupScreen __instance) { HardcoreSave.Instance.HardcoreModeData.HardcoreMode = hardcoreToggle.isOn; } } } namespace Hardcore.Helpers { public static class MelonLoggerExtensions { public static void Debug(this Instance logger, string message, bool stacktrace = true) { } private static string GetLoggerName(Instance logger) { return typeof(Instance).GetField("Name", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(logger) as string; } private static void InvokeNativeMsg(Color namesectionColor, Color textColor, string nameSection, string message) { typeof(MelonLogger).GetMethod("NativeMsg", BindingFlags.Static | BindingFlags.NonPublic)?.Invoke(null, new object[5] { namesectionColor, textColor, nameSection, message ?? "null", false }); } private static string GetCallerInfo() { StackTrace stackTrace = new StackTrace(); for (int i = 2; i < stackTrace.FrameCount; i++) { StackFrame frame = stackTrace.GetFrame(i); MethodBase method = frame.GetMethod(); if (!(method?.DeclaringType == null)) { return method.DeclaringType.FullName + "." + method.Name; } } return "unknown"; } } public static class Il2CppListExtensions { public static IEnumerable<T> AsEnumerable<T>(this List<T> list) { return list ?? new List<T>(); } public static List<T> ToIl2CppList<T>(this IEnumerable<T> source) { List<T> val = new List<T>(); foreach (T item in source) { val.Add(item); } return val; } public static List<T> ConvertToList<T>(List<T> il2CppList) { List<T> list = new List<T>(); T[] collection = Il2CppArrayBase<T>.op_Implicit(il2CppList.ToArray()); list.AddRange(collection); return list; } public static IEnumerable<T> AsEnumerable<T>(this List<T> list) { IEnumerable<T> result; if (list != null) { result = ((IEnumerable<T>)list._items).Take(list._size); } else { IEnumerable<T> enumerable = Array.Empty<T>(); result = enumerable; } return result; } } public static class Utils { [CompilerGenerated] private sealed class <WaitForNetwork>d__6 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public IEnumerator routine; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNetwork>d__6(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if (!InstanceFinder.IsServer && !InstanceFinder.IsClient) { <>2__current = null; <>1__state = 1; return true; } MelonCoroutines.Start(routine); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <WaitForNetworkSingleton>d__8<T> : IEnumerator<object>, IEnumerator, IDisposable where T : notnull, NetworkSingleton<T> { private int <>1__state; private object <>2__current; public IEnumerator coroutine; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNetworkSingleton>d__8(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_0044; case 1: <>1__state = -1; goto IL_0044; case 2: { <>1__state = -1; return false; } IL_0044: if (!NetworkSingleton<T>.InstanceExists) { <>2__current = null; <>1__state = 1; return true; } <>2__current = coroutine; <>1__state = 2; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <WaitForNotNull>d__7 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public object obj; public float timeout; public Action onTimeout; public Action onFinish; private float <startTime>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNotNull>d__7(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <startTime>5__1 = Time.time; break; case 1: <>1__state = -1; break; } if (obj == null) { if (!float.IsNaN(timeout) && Time.time - <startTime>5__1 > timeout) { onTimeout?.Invoke(); return false; } <>2__current = null; <>1__state = 1; return true; } onFinish?.Invoke(); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <WaitForPlayer>d__5 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public IEnumerator routine; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForPlayer>d__5(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if ((Object)(object)Player.Local == (Object)null || (Object)(object)((Component)Player.Local).gameObject == (Object)null) { <>2__current = null; <>1__state = 1; return true; } MelonCoroutines.Start(routine); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static readonly Instance Logger = new Instance("Hardcore-Utils"); public static T FindObjectByName<T>(string objectName) where T : Object { try { foreach (T item in Resources.FindObjectsOfTypeAll<T>()) { if (((Object)item).name != objectName) { continue; } Logger.Debug($"Found {typeof(T).Name} '{objectName}' directly in loaded objects"); return item; } return default(T); } catch (Exception ex) { Logger.Error($"Error finding {typeof(T).Name} '{objectName}': {ex.Message}"); return default(T); } } public static List<T> GetAllComponentsInChildrenRecursive<T>(GameObject obj) where T : Component { List<T> list = new List<T>(); if ((Object)(object)obj == (Object)null) { return list; } T[] array = Il2CppArrayBase<T>.op_Implicit(obj.GetComponents<T>()); if (array.Length != 0) { list.AddRange(array); } for (int i = 0; i < obj.transform.childCount; i++) { Transform child = obj.transform.GetChild(i); list.AddRange(GetAllComponentsInChildrenRecursive<T>(((Component)child).gameObject)); } return list; } public static bool Is<T>(object obj, out T result) where T : Object { Object val = (Object)((obj is Object) ? obj : null); if (val != null) { Type val2 = Il2CppType.Of<T>(); Type il2CppType = val.GetIl2CppType(); if (val2.IsAssignableFrom(il2CppType)) { result = ((Il2CppObjectBase)val).TryCast<T>(); return result != null; } } result = default(T); return false; } public static List<StorableItemDefinition> GetAllStorableItemDefinitions() { List<ItemRegister> list = Il2CppListExtensions.ConvertToList<ItemRegister>(Singleton<Registry>.Instance.ItemRegistry); List<StorableItemDefinition> list2 = new List<StorableItemDefinition>(); foreach (ItemRegister item in list) { if (Utils.Is<StorableItemDefinition>((object)item.Definition, out StorableItemDefinition result)) { list2.Add(result); } else { Logger.Warning("Definition " + ((object)item.Definition)?.GetType().FullName + " is not a StorableItemDefinition"); } } return list2.ToList(); } [IteratorStateMachine(typeof(<WaitForPlayer>d__5))] public static IEnumerator WaitForPlayer(IEnumerator routine) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForPlayer>d__5(0) { routine = routine }; } [IteratorStateMachine(typeof(<WaitForNetwork>d__6))] public static IEnumerator WaitForNetwork(IEnumerator routine) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNetwork>d__6(0) { routine = routine }; } [IteratorStateMachine(typeof(<WaitForNotNull>d__7))] public static IEnumerator WaitForNotNull(object? obj, float timeout = float.NaN, Action onTimeout = null, Action onFinish = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNotNull>d__7(0) { obj = obj, timeout = timeout, onTimeout = onTimeout, onFinish = onFinish }; } [IteratorStateMachine(typeof(<WaitForNetworkSingleton>d__8<>))] public static IEnumerator WaitForNetworkSingleton<T>(IEnumerator coroutine) where T : NetworkSingleton<T> { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNetworkSingleton>d__8<T>(0) { coroutine = coroutine }; } } }
Hardcore-Mono.dll
Decompiled 2 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using FishNet; using Hardcore; using Hardcore.Helpers; using Hardcore.Patches; using HarmonyLib; using MelonLoader; using MelonLoader.Preferences; using Microsoft.CodeAnalysis; using S1API.Internal.Abstraction; using S1API.Saveables; using ScheduleOne; using ScheduleOne.DevUtilities; using ScheduleOne.ItemFramework; using ScheduleOne.Persistence; using ScheduleOne.PlayerScripts; using ScheduleOne.UI; using ScheduleOne.UI.MainMenu; using TMPro; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: MelonInfo(typeof(global::Hardcore.Hardcore), "Hardcore", "1.0.0", "k073l", null)] [assembly: MelonColor(1, 255, 0, 0)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: IgnoresAccessChecksTo("Assembly-CSharp")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Hardcore-Mono")] [assembly: AssemblyConfiguration("Release Mono")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+58d2af4bb65b9d140f39e7a6e10086edba77961f")] [assembly: AssemblyProduct("Hardcore-Mono")] [assembly: AssemblyTitle("Hardcore-Mono")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Hardcore { public class HardcoreData { public bool HardcoreMode; public string Version = "1.0.0"; public bool Died; public string Reason = ""; } public class HardcoreSave : Saveable { [SaveableField("hardcore_mode")] public HardcoreData HardcoreModeData = new HardcoreData(); public static HardcoreSave Instance { get; } = new HardcoreSave(); protected override void OnSaved() { Melon<Hardcore>.Logger.Msg("Game Saved!"); Melon<Hardcore>.Logger.Msg($"Hardcore Mode is: {HardcoreModeData.HardcoreMode}"); } protected override void OnLoaded() { Melon<Hardcore>.Logger.Msg("Game Loaded!"); Melon<Hardcore>.Logger.Msg($"Hardcore Mode is: {HardcoreModeData.HardcoreMode}"); } } public static class BuildInfo { public const string Name = "Hardcore"; public const string Description = "Adds a Hardcore mode to the game"; public const string Author = "k073l"; public const string Version = "1.0.0"; } public class Hardcore : MelonMod { [CompilerGenerated] private sealed class <CheckHardcore>d__11 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <CheckHardcore>d__11(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = (object)new WaitForSeconds(1f); <>1__state = 1; return true; case 1: <>1__state = -1; _logger.Msg("Hardcore mode is " + (HardcoreSave.Instance.HardcoreModeData.HardcoreMode ? "enabled" : "disabled")); DeathScreenPatch.AddDeathUIInfo(); if (HardcoreSave.Instance.HardcoreModeData.Died) { PlayerCameraPatch.FreeCamPlayerInvisible(); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static Instance _logger; private static Texture2D _heartTexture2D; private static MelonPreferences_Category _category; private static MelonPreferences_Entry<bool> _showHeartHUD; private static MelonPreferences_Entry<int> _heartHUDsize; private static MelonPreferences_Entry<int> _heartHUDXOffset; private static MelonPreferences_Entry<int> _heartHUDYOffset; public override void OnInitializeMelon() { _logger = ((MelonBase)this).LoggerInstance; _logger.Msg("Hardcore initialized"); _category = MelonPreferences.CreateCategory("Hardcore"); _showHeartHUD = _category.CreateEntry<bool>("ShowHeartHUD", true, "Show Heart HUD", "Show a heart icon in the HUD when in Hardcore mode", false, false, (ValueValidator)null, (string)null); _heartHUDsize = _category.CreateEntry<int>("HeartHUDSize", 32, "Heart HUD Size", "Size of the heart icon in the HUD", false, false, (ValueValidator)null, (string)null); _heartHUDXOffset = _category.CreateEntry<int>("HeartHUDXOffset", 5, "Heart HUD Position (horizontal)", "Horizontal offset from the right side of the screen (in px)", false, false, (ValueValidator)null, (string)null); _heartHUDYOffset = _category.CreateEntry<int>("HeartHUDYOffset", 5, "Heart HUD Position (vertical)", "Vertical offset from the top of the screen (in px)", false, false, (ValueValidator)null, (string)null); ModSaveableRegistry.Register((Saveable)(object)HardcoreSave.Instance, (string)null); LoadEmbeddedImage(); } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { _logger.Debug("Scene loaded: " + sceneName); if (!(sceneName == "Menu")) { if (sceneName == "Main") { _logger.Debug("Main scene loaded, waiting for player"); MelonCoroutines.Start(Utils.WaitForPlayer(CheckHardcore())); } } else { HardcoreSave.Instance.HardcoreModeData = new HardcoreData(); } } private void LoadEmbeddedImage() { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream("Hardcore.assets.heart.png"); if (stream == null) { _logger.Error("Embedded image not found!"); return; } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); _heartTexture2D = new Texture2D(2, 2); if (!ImageConversion.LoadImage(_heartTexture2D, array)) { _logger.Error("Failed to load image data into Texture2D."); } } public override void OnGUI() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); if (!(((Scene)(ref activeScene)).name != "Main") && !((Object)(object)_heartTexture2D == (Object)null) && HardcoreSave.Instance.HardcoreModeData.HardcoreMode && _showHeartHUD.Value) { float num = _heartHUDsize.Value; float num2 = (float)Screen.width - num - (float)_heartHUDXOffset.Value; float num3 = _heartHUDYOffset.Value; GUI.DrawTexture(new Rect(num2, num3, num, num), (Texture)(object)_heartTexture2D); } } [IteratorStateMachine(typeof(<CheckHardcore>d__11))] private static IEnumerator CheckHardcore() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <CheckHardcore>d__11(0); } } } namespace Hardcore.Patches { [HarmonyPatch(typeof(DeathScreen))] public class DeathScreenPatch { [CompilerGenerated] private static class <>O { public static UnityAction <0>__GhostMode; } [HarmonyPatch("Open")] [HarmonyPostfix] public static void SaveDeath(DeathScreen __instance) { if (HardcoreSave.Instance.HardcoreModeData.HardcoreMode) { Melon<Hardcore>.Logger.Msg("Player has died in Hardcore."); if (!string.IsNullOrEmpty(HardcoreSave.Instance.HardcoreModeData.Reason)) { Melon<Hardcore>.Logger.Msg("Death Reason: " + HardcoreSave.Instance.HardcoreModeData.Reason); } HardcoreSave.Instance.HardcoreModeData.Died = true; Singleton<SaveManager>.Instance.Save(); } } public static void AddDeathUIInfo() { if (HardcoreSave.Instance.HardcoreModeData.HardcoreMode) { Transform val = ((Component)Singleton<DeathScreen>.Instance).transform.Find("Container"); Transform val2 = val.Find("Title"); Transform button = val.Find("Respawn"); Transform button2 = val.Find("Load"); EditButton(button); EditButton(button2); } } public static void EditButton(Transform button) { //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown Button component = ((Component)button).GetComponent<Button>(); if ((Object)(object)component != (Object)null) { ((UnityEventBase)component.onClick).RemoveAllListeners(); ButtonClickedEvent onClick = component.onClick; object obj = <>O.<0>__GhostMode; if (obj == null) { UnityAction val = GhostMode; <>O.<0>__GhostMode = val; obj = (object)val; } ((UnityEvent)onClick).AddListener((UnityAction)obj); } TextMeshProUGUI componentInChildren = ((Component)button).GetComponentInChildren<TextMeshProUGUI>(); if ((Object)(object)componentInChildren != (Object)null) { ((TMP_Text)componentInChildren).text = "Become a Ghost"; } } public static void GhostMode() { Singleton<DeathScreen>.Instance.Close(); PlayerSingleton<PlayerCamera>.Instance.LockMouse(); PlayerCameraPatch.FreeCamPlayerInvisible(); } } [HarmonyPatch(typeof(PlayerCamera))] public class PlayerCameraPatch { [HarmonyPatch("Exit")] [HarmonyPostfix] public static void FreecamJailPost() { if (HardcoreSave.Instance.HardcoreModeData.HardcoreMode && HardcoreSave.Instance.HardcoreModeData.Died) { FreeCamPlayerInvisible(); if (Singleton<PauseMenu>.Instance.IsPaused) { Singleton<PauseMenu>.Instance.Resume(); } else { Singleton<PauseMenu>.Instance.Pause(); } } } public static void FreeCamPlayerInvisible() { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) PlayerSingleton<PlayerCamera>.Instance.FreeCamEnabled = true; ((Behaviour)Singleton<HUD>.Instance.canvas).enabled = false; PlayerSingleton<PlayerMovement>.Instance.canMove = false; Player.Local.SetVisibleToLocalPlayer(false); PlayerSingleton<PlayerCamera>.Instance.OverrideTransform(((Component)PlayerSingleton<PlayerCamera>.Instance).transform.position, ((Component)PlayerSingleton<PlayerCamera>.Instance).transform.rotation, 0f, false); PlayerSingleton<PlayerCamera>.Instance.AddActiveUIElement(((Object)PlayerSingleton<PlayerCamera>.Instance).name); } } [HarmonyPatch(typeof(SetupScreen))] public class SetupScreenPatch { public static Toggle hardcoreToggle; public static TextMeshProUGUI hardcoreToggleLabel; public static GameObject hardcoreToggleContainer; [HarmonyPatch("Start")] [HarmonyPostfix] public static void AddHardcoreToggle(SetupScreen __instance) { //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Expected O, but got Unknown //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: Unknown result type (might be due to invalid IL or missing references) //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Expected O, but got Unknown //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_0286: Unknown result type (might be due to invalid IL or missing references) //IL_034f: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Unknown result type (might be due to invalid IL or missing references) //IL_0317: Unknown result type (might be due to invalid IL or missing references) //IL_04f6: Unknown result type (might be due to invalid IL or missing references) //IL_0417: Unknown result type (might be due to invalid IL or missing references) //IL_0433: Unknown result type (might be due to invalid IL or missing references) //IL_0478: Unknown result type (might be due to invalid IL or missing references) //IL_0487: Unknown result type (might be due to invalid IL or missing references) //IL_0496: Unknown result type (might be due to invalid IL or missing references) //IL_04a5: Unknown result type (might be due to invalid IL or missing references) //IL_04b4: Unknown result type (might be due to invalid IL or missing references) //IL_04c3: Unknown result type (might be due to invalid IL or missing references) //IL_04d2: Unknown result type (might be due to invalid IL or missing references) //IL_05a3: Unknown result type (might be due to invalid IL or missing references) //IL_05aa: Expected O, but got Unknown //IL_05d6: Unknown result type (might be due to invalid IL or missing references) //IL_05ed: Unknown result type (might be due to invalid IL or missing references) //IL_0604: Unknown result type (might be due to invalid IL or missing references) //IL_061b: Unknown result type (might be due to invalid IL or missing references) //IL_0632: Unknown result type (might be due to invalid IL or missing references) //IL_0697: Unknown result type (might be due to invalid IL or missing references) //IL_06a9: Unknown result type (might be due to invalid IL or missing references) //IL_06bb: Unknown result type (might be due to invalid IL or missing references) //IL_06fc: Unknown result type (might be due to invalid IL or missing references) //IL_0701: Unknown result type (might be due to invalid IL or missing references) //IL_0705: Unknown result type (might be due to invalid IL or missing references) //IL_070c: Unknown result type (might be due to invalid IL or missing references) //IL_0719: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)__instance).transform; Transform val = transform.Find("SkipIntro"); Transform val2 = transform.Find("Confirm"); if ((Object)(object)val == (Object)null) { Melon<Hardcore>.Logger.Error("SkipIntro not found!"); return; } Toggle component = ((Component)val).GetComponent<Toggle>(); TextMeshProUGUI componentInChildren = ((Component)val).GetComponentInChildren<TextMeshProUGUI>(); hardcoreToggleContainer = new GameObject("HardcoreMode"); hardcoreToggleContainer.transform.SetParent(transform); hardcoreToggleContainer.transform.localScale = Vector3.one; RectTransform val3 = hardcoreToggleContainer.AddComponent<RectTransform>(); RectTransform component2 = ((Component)val).GetComponent<RectTransform>(); val3.anchorMin = new Vector2(0.5f, 0.5f); val3.anchorMax = new Vector2(0.5f, 0.5f); val3.pivot = new Vector2(0.5f, 0.5f); val3.sizeDelta = component2.sizeDelta; val3.anchoredPosition = new Vector2(0f, component2.anchoredPosition.y - component2.sizeDelta.y - 30f); RectTransform component3 = ((Component)val2).GetComponent<RectTransform>(); component3.anchoredPosition = new Vector2(component3.anchoredPosition.x, component3.anchoredPosition.y - 35f); GameObject val4 = new GameObject("Toggle"); val4.transform.SetParent(hardcoreToggleContainer.transform); RectTransform val5 = val4.AddComponent<RectTransform>(); val5.anchorMin = new Vector2(0.5f, 0.5f); val5.anchorMax = new Vector2(0.5f, 0.5f); val5.pivot = new Vector2(0.5f, 0.5f); val5.anchoredPosition = new Vector2(-48f, 0f); val5.sizeDelta = new Vector2(25f, 25f); Image val6 = val4.AddComponent<Image>(); hardcoreToggle = val4.AddComponent<Toggle>(); ((Selectable)hardcoreToggle).targetGraphic = (Graphic)(object)val6; hardcoreToggle.isOn = false; GameObject val7 = new GameObject("Checkmark"); val7.transform.SetParent(val4.transform); RectTransform val8 = val7.AddComponent<RectTransform>(); Image val9 = val7.AddComponent<Image>(); hardcoreToggle.graphic = (Graphic)(object)val9; ((Selectable)hardcoreToggle).transition = ((Selectable)component).transition; ((Selectable)hardcoreToggle).colors = ((Selectable)component).colors; ((Selectable)hardcoreToggle).spriteState = ((Selectable)component).spriteState; ((Selectable)hardcoreToggle).animationTriggers = ((Selectable)component).animationTriggers; Image val10 = null; Graphic targetGraphic = ((Selectable)component).targetGraphic; Image val11 = (Image)(object)((targetGraphic is Image) ? targetGraphic : null); if (val11 != null) { val10 = val11; } else if ((Object)(object)((Selectable)component).targetGraphic != (Object)null) { val10 = ((Component)((Selectable)component).targetGraphic).GetComponent<Image>(); } if ((Object)(object)val10 != (Object)null) { val6.sprite = val10.sprite; val6.type = val10.type; ((Graphic)val6).color = ((Graphic)val10).color; ((Graphic)val6).material = ((Graphic)val10).material; ((Graphic)val6).raycastTarget = ((Graphic)val10).raycastTarget; } else { val6.type = (Type)1; ((Graphic)val6).color = Color.gray; ((Graphic)val6).raycastTarget = true; if ((Object)(object)((Selectable)component).targetGraphic != (Object)null) { ((Graphic)val6).material = ((Selectable)component).targetGraphic.material; ((Graphic)val6).raycastTarget = ((Selectable)component).targetGraphic.raycastTarget; } Melon<Hardcore>.Logger.Warning("Using fallback background configuration"); } Image val12 = null; Graphic graphic = component.graphic; Image val13 = (Image)(object)((graphic is Image) ? graphic : null); if (val13 != null) { val12 = val13; } else if ((Object)(object)component.graphic != (Object)null) { val12 = ((Component)component.graphic).GetComponent<Image>(); } if ((Object)(object)val12 != (Object)null) { val9.sprite = val12.sprite; val9.type = val12.type; ((Graphic)val9).color = new Color(14f / 15f, 0.29411766f, 0.16862746f); ((Graphic)val9).material = ((Graphic)val12).material; ((Graphic)val9).raycastTarget = ((Graphic)val12).raycastTarget; RectTransform component4 = ((Component)val12).GetComponent<RectTransform>(); if ((Object)(object)component4 != (Object)null) { val8.anchorMin = component4.anchorMin; val8.anchorMax = component4.anchorMax; val8.pivot = component4.pivot; val8.anchoredPosition = component4.anchoredPosition; val8.sizeDelta = component4.sizeDelta; val8.offsetMin = component4.offsetMin; val8.offsetMax = component4.offsetMax; } } else { ((Graphic)val9).color = new Color(14f / 15f, 0.29411766f, 0.16862746f); val9.type = (Type)0; if ((Object)(object)component.graphic != (Object)null) { ((Graphic)val9).material = component.graphic.material; ((Graphic)val9).raycastTarget = component.graphic.raycastTarget; } Sprite[] source = Resources.FindObjectsOfTypeAll<Sprite>(); Sprite val14 = ((IEnumerable<Sprite>)source).FirstOrDefault((Func<Sprite, bool>)((Sprite s) => ((Object)s).name.ToLower().Contains("check") || ((Object)s).name.ToLower().Contains("tick") || ((Object)s).name.ToLower().Contains("mark"))); if ((Object)(object)val14 != (Object)null) { val9.sprite = val14; } Melon<Hardcore>.Logger.Warning("Using fallback checkmark configuration"); } GameObject val15 = new GameObject("Label"); val15.transform.SetParent(hardcoreToggleContainer.transform); RectTransform val16 = val15.AddComponent<RectTransform>(); val16.anchorMin = new Vector2(0.5f, 0.5f); val16.anchorMax = new Vector2(0.5f, 0.5f); val16.pivot = new Vector2(0f, 0.5f); val16.anchoredPosition = new Vector2(-30f, 0f); val16.sizeDelta = new Vector2(200f, 20f); hardcoreToggleLabel = val15.AddComponent<TextMeshProUGUI>(); ((TMP_Text)hardcoreToggleLabel).text = "Hardcore Mode"; ((TMP_Text)hardcoreToggleLabel).font = ((TMP_Text)componentInChildren).font; ((TMP_Text)hardcoreToggleLabel).fontSize = ((TMP_Text)componentInChildren).fontSize * 1.25f; ((Graphic)hardcoreToggleLabel).color = new Color(44f / 51f, 4f / 51f, 0.23529412f); ((TMP_Text)hardcoreToggleLabel).alignment = ((TMP_Text)componentInChildren).alignment; ((TMP_Text)hardcoreToggleLabel).fontStyle = ((TMP_Text)componentInChildren).fontStyle; ((TMP_Text)hardcoreToggleLabel).lineSpacing = ((TMP_Text)componentInChildren).lineSpacing; ((Selectable)hardcoreToggle).interactable = true; Transform val17 = transform.Find("Background"); RectTransform component5 = ((Component)val17).GetComponent<RectTransform>(); Vector2 sizeDelta = component5.sizeDelta; component5.sizeDelta = new Vector2(sizeDelta.x, sizeDelta.y + 65f); Melon<Hardcore>.Logger.Msg("Hardcore toggle created successfully!"); } [HarmonyPatch("StartGame")] [HarmonyPostfix] public static void ApplyHardcoreSetting(SetupScreen __instance) { HardcoreSave.Instance.HardcoreModeData.HardcoreMode = hardcoreToggle.isOn; } } } namespace Hardcore.Helpers { public static class MelonLoggerExtensions { public static void Debug(this Instance logger, string message, bool stacktrace = true) { } private static string GetLoggerName(Instance logger) { return typeof(Instance).GetField("Name", BindingFlags.Instance | BindingFlags.NonPublic)?.GetValue(logger) as string; } private static void InvokeNativeMsg(Color namesectionColor, Color textColor, string nameSection, string message) { typeof(MelonLogger).GetMethod("NativeMsg", BindingFlags.Static | BindingFlags.NonPublic)?.Invoke(null, new object[5] { namesectionColor, textColor, nameSection, message ?? "null", false }); } private static string GetCallerInfo() { StackTrace stackTrace = new StackTrace(); for (int i = 2; i < stackTrace.FrameCount; i++) { StackFrame frame = stackTrace.GetFrame(i); MethodBase method = frame.GetMethod(); if (!(method?.DeclaringType == null)) { return method.DeclaringType.FullName + "." + method.Name; } } return "unknown"; } } public static class Il2CppListExtensions { public static IEnumerable<T> AsEnumerable<T>(this List<T> list) { return list ?? new List<T>(); } } public static class Utils { [CompilerGenerated] private sealed class <WaitForNetwork>d__6 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public IEnumerator routine; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNetwork>d__6(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if (!InstanceFinder.IsServer && !InstanceFinder.IsClient) { <>2__current = null; <>1__state = 1; return true; } MelonCoroutines.Start(routine); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <WaitForNetworkSingleton>d__8<T> : IEnumerator<object>, IEnumerator, IDisposable where T : notnull, NetworkSingleton<T> { private int <>1__state; private object <>2__current; public IEnumerator coroutine; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNetworkSingleton>d__8(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; goto IL_0044; case 1: <>1__state = -1; goto IL_0044; case 2: { <>1__state = -1; return false; } IL_0044: if (!NetworkSingleton<T>.InstanceExists) { <>2__current = null; <>1__state = 1; return true; } <>2__current = coroutine; <>1__state = 2; return true; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <WaitForNotNull>d__7 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public object obj; public float timeout; public Action onTimeout; public Action onFinish; private float <startTime>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForNotNull>d__7(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <startTime>5__1 = Time.time; break; case 1: <>1__state = -1; break; } if (obj == null) { if (!float.IsNaN(timeout) && Time.time - <startTime>5__1 > timeout) { onTimeout?.Invoke(); return false; } <>2__current = null; <>1__state = 1; return true; } onFinish?.Invoke(); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <WaitForPlayer>d__5 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public IEnumerator routine; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <WaitForPlayer>d__5(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; break; case 1: <>1__state = -1; break; } if ((Object)(object)Player.Local == (Object)null || (Object)(object)((Component)Player.Local).gameObject == (Object)null) { <>2__current = null; <>1__state = 1; return true; } MelonCoroutines.Start(routine); return false; } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private static readonly Instance Logger = new Instance("Hardcore-Utils"); public static T FindObjectByName<T>(string objectName) where T : Object { try { T[] array = Resources.FindObjectsOfTypeAll<T>(); foreach (T val in array) { if (!(((Object)val).name != objectName)) { Logger.Debug("Found " + typeof(T).Name + " '" + objectName + "' directly in loaded objects"); return val; } } return default(T); } catch (Exception ex) { Logger.Error("Error finding " + typeof(T).Name + " '" + objectName + "': " + ex.Message); return default(T); } } public static List<T> GetAllComponentsInChildrenRecursive<T>(GameObject obj) where T : Component { List<T> list = new List<T>(); if ((Object)(object)obj == (Object)null) { return list; } T[] components = obj.GetComponents<T>(); if (components.Length != 0) { list.AddRange(components); } for (int i = 0; i < obj.transform.childCount; i++) { Transform child = obj.transform.GetChild(i); list.AddRange(GetAllComponentsInChildrenRecursive<T>(((Component)child).gameObject)); } return list; } public static bool Is<T>(object obj, out T result) where T : class { if (obj is T val) { result = val; return true; } result = null; return false; } public static List<StorableItemDefinition> GetAllStorableItemDefinitions() { List<ItemRegister> list = Singleton<Registry>.Instance.ItemRegistry.ToList(); List<StorableItemDefinition> list2 = new List<StorableItemDefinition>(); foreach (ItemRegister item in list) { if (Is<StorableItemDefinition>(item.Definition, out var result)) { list2.Add(result); } else { Logger.Warning("Definition " + ((object)item.Definition)?.GetType().FullName + " is not a StorableItemDefinition"); } } return list2.ToList(); } [IteratorStateMachine(typeof(<WaitForPlayer>d__5))] public static IEnumerator WaitForPlayer(IEnumerator routine) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForPlayer>d__5(0) { routine = routine }; } [IteratorStateMachine(typeof(<WaitForNetwork>d__6))] public static IEnumerator WaitForNetwork(IEnumerator routine) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNetwork>d__6(0) { routine = routine }; } [IteratorStateMachine(typeof(<WaitForNotNull>d__7))] public static IEnumerator WaitForNotNull(object? obj, float timeout = float.NaN, Action onTimeout = null, Action onFinish = null) { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNotNull>d__7(0) { obj = obj, timeout = timeout, onTimeout = onTimeout, onFinish = onFinish }; } [IteratorStateMachine(typeof(<WaitForNetworkSingleton>d__8<>))] public static IEnumerator WaitForNetworkSingleton<T>(IEnumerator coroutine) where T : NetworkSingleton<T> { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <WaitForNetworkSingleton>d__8<T>(0) { coroutine = coroutine }; } } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } }