Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SkongGamemodes v1.2.0
SkongGamemodes.dll
Decompiled 9 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using MonoMod.RuntimeDetour; using TeamCherry.Localization; using UnityEngine; using UnityEngine.EventSystems; 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: AssemblyTitle("SkongGamemodes")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("SkongGamemodes")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("eccc0ef6-90ab-45cb-b3dd-bcf95a22c08d")] [assembly: AssemblyFileVersion("1.2.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.2.0.0")] namespace SkongGamemodes; [BepInPlugin("dervorce.hkss.gamemodemanager", "GameModeManager", "1.2.0")] public class GameModeManagerPlugin : BaseUnityPlugin { public static ManualLogSource LogSrc; public static GameModeManagerPlugin Instance { get; private set; } public GameModeManager Manager { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null) { Object.Destroy((Object)(object)this); return; } Instance = this; LogSrc = ((BaseUnityPlugin)this).Logger; Manager = ((Component)this).gameObject.AddComponent<GameModeManager>(); } } public class GameModeManager : MonoBehaviour { public class GameModeData { public bool Enabled; public string Name; public string Description; public Color? Color; public bool Steel; public Sprite Sprite; } [CompilerGenerated] private sealed class <SetupHooksCoroutine>d__14 : IEnumerator<object>, IDisposable, IEnumerator { private int <>1__state; private object <>2__current; public GameModeManager <>4__this; private Exception <ex>5__1; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <SetupHooksCoroutine>d__14(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <ex>5__1 = null; <>1__state = -2; } private bool MoveNext() { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Expected O, but got Unknown //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Expected O, but got Unknown //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Expected O, but got Unknown switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; try { <>4__this._hookClearSaveFile = new Hook((MethodBase)AccessTools.Method(typeof(SaveSlotButton), "OnSubmit", (Type[])null, (Type[])null), (Delegate)new Action<Action<SaveSlotButton, BaseEventData>, SaveSlotButton, BaseEventData>(<>4__this.SaveSlotButton_OnSubmit_Hook)); <>4__this._hookLoadGame = new Hook((MethodBase)AccessTools.Method(typeof(SaveSlotButton), "ClearSaveFile", (Type[])null, (Type[])null), (Delegate)new Action<Action<SaveSlotButton>, SaveSlotButton>(<>4__this.SaveSlotButton_ClearSaveFile_Hook)); <>4__this._hookStartGameEventTrigger = new Hook((MethodBase)AccessTools.Method(typeof(StartGameEventTrigger), "OnSubmit", (Type[])null, (Type[])null), (Delegate)new Action<Action<StartGameEventTrigger, BaseEventData>, StartGameEventTrigger, BaseEventData>(<>4__this.StartGameEventTrigger_OnSubmit_Hook)); SceneManager.sceneLoaded += <>4__this.OnSceneLoaded; } catch (Exception ex) { <ex>5__1 = ex; GameModeManagerPlugin.LogSrc.LogError((object)$"[Unknown Mode] Hook setup failed: {<ex>5__1}"); } 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 int SaveSlotIndex; private Hook _hookClearSaveFile; private Hook _hookLoadGame; private Hook _hookStartGameEventTrigger; private GameObject holderObject; private readonly List<GameModeData> modes = new List<GameModeData>(); private bool hooksInitialized = false; public static GameModeManager Instance { get; private set; } private void Awake() { if ((Object)(object)Instance != (Object)null && (Object)(object)Instance != (Object)(object)this) { Object.Destroy((Object)(object)((Component)this).gameObject); return; } Instance = this; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); } public GameModeData Init(MonoBehaviour parent, string name, string desc, Color? color = null, bool steel = false, Sprite sprite = null) { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown GameModeData gameModeData = new GameModeData { Name = name, Description = desc, Color = color, Enabled = false, Steel = steel, Sprite = sprite }; modes.Add(gameModeData); holderObject = new GameObject(name + "_Holder"); Object.DontDestroyOnLoad((Object)(object)holderObject); if (!hooksInitialized) { hooksInitialized = true; ((MonoBehaviour)this).StartCoroutine(SetupHooksCoroutine()); } return gameModeData; } [IteratorStateMachine(typeof(<SetupHooksCoroutine>d__14))] private IEnumerator SetupHooksCoroutine() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <SetupHooksCoroutine>d__14(0) { <>4__this = this }; } public void Dispose() { Hook hookLoadGame = _hookLoadGame; if (hookLoadGame != null) { hookLoadGame.Dispose(); } Hook hookClearSaveFile = _hookClearSaveFile; if (hookClearSaveFile != null) { hookClearSaveFile.Dispose(); } Hook hookStartGameEventTrigger = _hookStartGameEventTrigger; if (hookStartGameEventTrigger != null) { hookStartGameEventTrigger.Dispose(); } SceneManager.sceneLoaded -= OnSceneLoaded; if ((Object)(object)holderObject != (Object)null) { Object.Destroy((Object)(object)holderObject); } modes.Clear(); } private void SaveSlotButton_OnSubmit_Hook(Action<SaveSlotButton, BaseEventData> orig, SaveSlotButton self, BaseEventData eventData) { SaveSlotIndex = self.SaveSlotIndex; foreach (GameModeData mode in modes) { string text = $"{mode.Name}_{SaveSlotIndex}"; mode.Enabled = PlayerPrefs.GetInt(text, 0) == 1; } orig(self, eventData); } private void StartGameEventTrigger_OnSubmit_Hook(Action<StartGameEventTrigger, BaseEventData> orig, StartGameEventTrigger self, BaseEventData eventData) { foreach (GameModeData mode in modes) { string text = $"{mode.Name}_{SaveSlotIndex}"; if (((Object)self).name == mode.Name + "Button") { mode.Enabled = true; PlayerPrefs.SetInt(text, 1); } else { mode.Enabled = false; PlayerPrefs.SetInt(text, 0); } } PlayerPrefs.Save(); orig(self, eventData); } private void SaveSlotButton_ClearSaveFile_Hook(Action<SaveSlotButton> orig, SaveSlotButton self) { foreach (GameModeData mode in modes) { string text = $"{mode.Name}_{self.SaveSlotIndex}"; PlayerPrefs.SetInt(text, 0); mode.Enabled = false; } PlayerPrefs.Save(); orig(self); } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { if (!(((Scene)(ref scene)).name == "Menu_Title")) { return; } MenuScreen playModeMenuScreen = UIManager.instance.playModeMenuScreen; MakeScrollable(((Component)playModeMenuScreen).transform); foreach (GameModeData mode2 in modes) { HandleGameModeButton(mode2); } } private void MakeScrollable(Transform playModeMenu) { //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_00de: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Expected O, but got Unknown Transform val = playModeMenu.Find("Content"); if (!((Object)(object)val == (Object)null)) { VerticalLayoutGroup component = ((Component)val).GetComponent<VerticalLayoutGroup>(); if ((Object)(object)component == (Object)null) { component = ((Component)val).gameObject.AddComponent<VerticalLayoutGroup>(); ((HorizontalOrVerticalLayoutGroup)component).childForceExpandHeight = false; ((HorizontalOrVerticalLayoutGroup)component).childForceExpandWidth = true; ((HorizontalOrVerticalLayoutGroup)component).childControlHeight = true; ((HorizontalOrVerticalLayoutGroup)component).childControlWidth = true; ((HorizontalOrVerticalLayoutGroup)component).spacing = 5f; } ContentSizeFitter component2 = ((Component)val).GetComponent<ContentSizeFitter>(); if ((Object)(object)component2 == (Object)null) { component2 = ((Component)val).gameObject.AddComponent<ContentSizeFitter>(); component2.verticalFit = (FitMode)2; component2.horizontalFit = (FitMode)0; } Transform val2 = playModeMenu.Find("Viewport"); if ((Object)(object)val2 == (Object)null) { GameObject val3 = new GameObject("Viewport", new Type[2] { typeof(RectTransform), typeof(RectMask2D) }); val3.transform.SetParent(playModeMenu, false); val2 = val3.transform; } RectTransform component3 = ((Component)val2).GetComponent<RectTransform>(); component3.anchorMin = new Vector2(0f, 0.15f); component3.anchorMax = new Vector2(1f, 0.8f); component3.offsetMin = Vector2.zero; component3.offsetMax = Vector2.zero; val.SetParent(val2, false); ScrollRect val4 = ((Component)playModeMenu).GetComponent<ScrollRect>(); if ((Object)(object)val4 == (Object)null) { val4 = ((Component)playModeMenu).gameObject.AddComponent<ScrollRect>(); } val4.content = ((Component)val).GetComponent<RectTransform>(); val4.viewport = component3; val4.horizontal = false; val4.vertical = true; val4.movementType = (MovementType)2; val4.scrollSensitivity = 30f; } } private void HandleGameModeButton(GameModeData modeData) { //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Invalid comparison between Unknown and I4 //IL_0193: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Invalid comparison between Unknown and I4 //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0263: 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_0287: Unknown result type (might be due to invalid IL or missing references) if (modeData == null) { return; } MenuScreen playModeMenuScreen = UIManager.instance.playModeMenuScreen; string baseButtonName = (modeData.Steel ? "SteelButton" : "NormalButton"); Transform val = ((IEnumerable<Transform>)((Component)playModeMenuScreen).GetComponentsInChildren<Transform>(true)).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name == baseButtonName)); if ((Object)(object)val == (Object)null) { GameModeManagerPlugin.LogSrc.LogWarning((object)("[" + modeData.Name + "] " + baseButtonName + " not found!")); return; } GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject, val.parent); ((Object)val2).name = modeData.Name + "Button"; val2.transform.SetSiblingIndex(val.GetSiblingIndex() + 1); Text val3 = ((IEnumerable<Text>)val2.GetComponentsInChildren<Text>(true)).FirstOrDefault((Func<Text, bool>)((Text t) => ((Object)t).name == "Text")); if ((Object)(object)val3 != (Object)null) { ((Component)val3).gameObject.AddComponent<Localizator>().text = (((int)Language.CurrentLanguage() == 154) ? "." : modeData.Name); } Text val4 = ((IEnumerable<Text>)val2.GetComponentsInChildren<Text>(true)).FirstOrDefault((Func<Text, bool>)((Text t) => ((Object)t).name == "DescriptionText")); if ((Object)(object)val4 != (Object)null) { ((Component)val4).gameObject.AddComponent<Localizator>().text = (((int)Language.CurrentLanguage() == 154) ? "." : modeData.Description); } Image val5 = ((IEnumerable<Image>)val2.GetComponentsInChildren<Image>(true)).FirstOrDefault((Func<Image, bool>)((Image i) => ((Object)i).name == "Image")); if ((Object)(object)val5 != (Object)null) { if (modeData.Color.HasValue) { ((Graphic)val5).color = modeData.Color.Value; } if ((Object)(object)modeData.Sprite != (Object)null) { val5.sprite = modeData.Sprite; ((Graphic)val5).rectTransform.anchorMin = new Vector2(0f, 0f); ((Graphic)val5).rectTransform.anchorMax = new Vector2(0.475f, 1f); ((Graphic)val5).rectTransform.offsetMin = Vector2.zero; ((Graphic)val5).rectTransform.offsetMax = Vector2.zero; } } } } public class Localizator : MonoBehaviour { public string text; private Text textComp; private void Awake() { textComp = ((Component)this).GetComponentInChildren<Text>(true); } private void OnEnable() { ((MonoBehaviour)this).Invoke("ForceText", 0.02f); } private void ForceText() { if ((Object)(object)textComp != (Object)null) { textComp.text = text; } } }