Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of moreThings v1.1.6
moreThings.dll
Decompiled 10 months agousing System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using HarmonyLib; using MelonLoader; using MelonLoader.Utils; using Modules; using Newtonsoft.Json; using ScheduleOne.DevUtilities; using ScheduleOne.ItemFramework; using ScheduleOne.ObjectScripts; using ScheduleOne.Persistence; using ScheduleOne.Persistence.Datas; using ScheduleOne.Storage; using ScheduleOne.UI.Phone; using ScheduleOne.UI.Phone.Delivery; using ScheduleOne.UI.Phone.ProductManagerApp; using ScheduleOne.UI.Shop; using UnityEngine; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(Core), "moreThings", "1.0.0", "masterxxstabs", null)] [assembly: MelonGame("TVGS", "Schedule I")] [assembly: HarmonyDontPatchAll] [assembly: AssemblyTitle("moreThings")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("moreThings")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("c059bc93-339c-4454-ab3c-16d5fe22eaee")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] public class Core : MelonMod { private readonly List<IModModule> modules = new List<IModModule>(); public override void OnApplicationStart() { try { MelonLogger.Msg("Loading More Things Modules..."); if (ModuleManager.IsModuleEnabled("BackpackMod")) { modules.Add(new BackpackMod()); } if (ModuleManager.IsModuleEnabled("StackModule")) { modules.Add(new stackModule()); } if (ModuleManager.IsModuleEnabled("gunRunnersModule")) { modules.Add(new gunRunnersModule()); } foreach (IModModule module in modules) { module.OnModInit(); } MelonLogger.Msg($"Loaded {modules.Count} module(s)."); } catch (Exception ex) { MelonLogger.Error("Error initializing modules: " + ex.Message); } } public override void OnSceneWasLoaded(int buildIndex, string sceneName) { foreach (IModModule module in modules) { try { module.OnSceneLoaded(buildIndex, sceneName); } catch (Exception ex) { MelonLogger.Error("Error in OnSceneWasLoaded for module " + module.GetType().Name + ": " + ex.Message); } } } public override void OnUpdate() { foreach (IModModule module in modules) { try { module.OnUpdate(); } catch (Exception ex) { MelonLogger.Error("Error in OnUpdate for module " + module.GetType().Name + ": " + ex.Message); } } if (Input.GetKeyDown((KeyCode)288)) { ModuleManager.ToggleModule("BackpackMod"); } if (Input.GetKeyDown((KeyCode)289)) { ModuleManager.ToggleModule("StackModule"); } } } namespace Modules; public class gunRunnerUI { } public static class ImageLoader { public static Sprite LoadImage(string fileName) { //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), fileName); if (!File.Exists(text)) { MelonLogger.Error("❌ Icon file not found: " + text); return null; } try { byte[] array = File.ReadAllBytes(text); Texture2D val = new Texture2D(2, 2); if (ImageConversion.LoadImage(val, array)) { return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } MelonLogger.Error("❌ Failed to decode image bytes."); } catch (Exception ex) { MelonLogger.Error("❌ Failed to load sprite: " + ex); } return null; } } internal interface IModModule { void OnModInit(); void OnSceneLoaded(int buildIndex, string sceneName); void OnUpdate(); } public static class ModuleManager { private static readonly string ConfigPath; private static Dictionary<string, bool> moduleStates; static ModuleManager() { ConfigPath = Path.Combine(MelonEnvironment.UserDataDirectory, "ModulesConfig.json"); moduleStates = new Dictionary<string, bool>(); LoadConfig(); } public static bool IsModuleEnabled(string moduleName) { if (moduleStates.TryGetValue(moduleName, out var value)) { return value; } moduleStates[moduleName] = true; SaveConfig(); return true; } public static void ToggleModule(string moduleName) { if (moduleStates.ContainsKey(moduleName)) { moduleStates[moduleName] = !moduleStates[moduleName]; } else { moduleStates[moduleName] = false; } MelonLogger.Msg("[ModuleManager] Module '" + moduleName + "' is now " + (moduleStates[moduleName] ? "enabled" : "disabled") + "."); SaveConfig(); } private static void LoadConfig() { if (!File.Exists(ConfigPath)) { MelonLogger.Warning("[ModuleManager] Config file not found. Using default states."); return; } try { moduleStates = JsonConvert.DeserializeObject<Dictionary<string, bool>>(File.ReadAllText(ConfigPath)) ?? new Dictionary<string, bool>(); } catch (Exception ex) { MelonLogger.Error("[ModuleManager] Failed to load config: " + ex.Message); } } private static void SaveConfig() { try { string contents = JsonConvert.SerializeObject((object)moduleStates, (Formatting)1); File.WriteAllText(ConfigPath, contents); } catch (Exception ex) { MelonLogger.Error("[ModuleManager] Failed to save config: " + ex.Message); } } } public class BackpackMod : IModModule { [HarmonyPatch(typeof(SaveManager), "Save", new Type[] { })] public class SaveManagerPatch { [HarmonyPostfix] private static void SavePostfix() { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Expected O, but got Unknown try { if ((Object)(object)backpackEntity == (Object)null) { MelonLogger.Warning("[BackpackMod] Backpack entity is null during save. skipping save"); } ItemSet val = new ItemSet(backpackEntity.ItemSlots); File.WriteAllText(SavePath, val.GetJSON()); MelonLogger.Msg("[BackpackMod] Backpack saved."); } catch (Exception ex) { MelonLogger.Error("[BackpackMod] Save error: " + ex); } } } private const int ROWS = 4; private const int COLUMNS = 3; private const KeyCode TOGGLE_KEY = 98; public static StorageEntity backpackEntity; private bool isInitialized; private const KeyCode saveKey = 286; private const KeyCode loadKey = 287; public static string SavePath => Path.Combine(MelonEnvironment.UserDataDirectory, "BackpackMod.json"); public void OnModInit() { MelonLogger.Msg("[BackpackMod] Initialized"); } public void OnSceneLoaded(int buildIndex, string sceneName) { if (sceneName != "Main") { if ((Object)(object)backpackEntity != (Object)null) { ((Component)backpackEntity).gameObject.SetActive(false); } MelonLogger.Msg("[BackpackMod] Scene not gameplay, disabling."); } else { MelonCoroutines.Start(SetupBackpack()); } } private IEnumerator SetupBackpack() { yield return (object)new WaitForSeconds(1f); try { StorageEntity[] array = Object.FindObjectsOfType<StorageEntity>(); if (array == null || array.Length == 0) { MelonLogger.Error("[BackpackMod] No StorageEntity template found."); yield break; } backpackEntity = Object.Instantiate<StorageEntity>(array[0]); ((Object)backpackEntity).name = "BackpackStorage"; backpackEntity.StorageEntityName = "Backpack"; backpackEntity.SlotCount = 12; backpackEntity.DisplayRowCount = 3; backpackEntity.MaxAccessDistance = 999f; backpackEntity.AccessSettings = (EAccessSettings)2; List<ItemSlot> list = new List<ItemSlot>(); for (int i = 0; i < 12; i++) { list.Add(new ItemSlot()); } backpackEntity.ItemSlots = list; LoadBackpack(); isInitialized = true; MelonLogger.Msg("[BackpackMod] Setup complete."); } catch (Exception ex) { MelonLogger.Error("[BackpackMod] Error during setup: " + ex); } } public void OnUpdate() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); if (((Scene)(ref activeScene)).name != "Main" || !isInitialized) { return; } if (Input.GetKeyDown((KeyCode)98)) { try { if (backpackEntity.IsOpened) { backpackEntity.Close(); } else { backpackEntity.Open(); } } catch (Exception ex) { MelonLogger.Error("[BackpackMod] Toggle error: " + ex); } } if (Input.GetKeyDown((KeyCode)286)) { SaveBackpack(); } if (Input.GetKeyDown((KeyCode)287)) { LoadBackpack(); } } private void SaveBackpack() { //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown try { ItemSet val = new ItemSet(backpackEntity.ItemSlots); File.WriteAllText(SavePath, val.GetJSON()); MelonLogger.Msg("[BackpackMod] Backpack saved."); } catch (Exception ex) { MelonLogger.Error("[BackpackMod] Save error: " + ex); } } private void LoadBackpack() { try { if (!File.Exists(SavePath)) { MelonLogger.Warning("[BackpackMod] No save file found."); return; } string text = File.ReadAllText(SavePath); if (string.IsNullOrWhiteSpace(text)) { MelonLogger.Error("[BackpackMod] Save file is empty or invalid."); return; } MelonLogger.Msg("[BackpackMod] Deserializing JSON: " + text); ItemInstance[] array = ItemSet.Deserialize(text); if (array == null) { MelonLogger.Error("[BackpackMod] Deserialization returned null."); return; } StorageEntity obj = backpackEntity; if (((obj != null) ? obj.ItemSlots : null) == null) { MelonLogger.Error("[BackpackMod] Backpack entity or item slots not initialized properly."); return; } for (int i = 0; i < array.Length && i < backpackEntity.ItemSlots.Count; i++) { ItemSlot val = backpackEntity.ItemSlots[i]; if (val == null) { MelonLogger.Warning($"[BackpackMod] Item slot {i} is null."); } else { val.SetStoredItem(array[i], false); } } MelonLogger.Msg("[BackpackMod] Backpack loaded successfully."); } catch (Exception ex) { MelonLogger.Error("[BackpackMod] Load error: " + ex.Message); } } } public class gunRunnersModule : IModModule { private const KeyCode TOGGLE_KEY = 103; private const KeyCode saveKey = 293; private const KeyCode loadKey = 292; private bool isInitialized; private GameObject appGO; private GameObject _gunRunnersApp; public void OnModInit() { MelonLogger.Msg("[GunRunnersModule] Initialized"); } public void OnSceneLoaded(int buildIndex, string sceneName) { if (sceneName != "Main") { if ((Object)(object)appGO != (Object)null) { appGO.SetActive(false); } MelonLogger.Msg("[GunRunnersModule] Scene not gameplay, disabling."); } else { MelonCoroutines.Start(SetupApp()); } } private IEnumerator SetupApp() { yield return (object)new WaitForSeconds(1f); try { Transform transform = ((Component)PlayerSingleton<AppsCanvas>.Instance.canvas).transform; Transform val = transform.Find("ProductManagerApp"); if ((Object)(object)val == (Object)null) { MelonLogger.Error("ProductManagerApp template not found."); yield break; } appGO = Object.Instantiate<GameObject>(((Component)val).gameObject, transform); ((Object)appGO).name = "GunRunnersApp"; appGO.SetActive(false); ProductManagerApp component = appGO.GetComponent<ProductManagerApp>(); if ((Object)(object)component != (Object)null) { Object.Destroy((Object)(object)component); } Transform obj = appGO.transform.Find("Container"); RectTransform val2 = ((obj != null) ? ((Component)obj).GetComponent<RectTransform>() : null); if ((Object)(object)val2 != (Object)null) { foreach (Transform item in (Transform)val2) { Object.Destroy((Object)(object)((Component)item).gameObject); } } string imagePath = Path.Combine(MelonEnvironment.UserDataDirectory, "rifle_shipment.png"); CreateAppIcon("GunRunnersIcon", "Gun Runners", imagePath, appGO); isInitialized = true; MelonLogger.Msg("[GunRunnersModule] Setup complete."); } catch (Exception ex) { MelonLogger.Error("[GunRunnersModule] Error during setup: " + ex); } } public void OnUpdate() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) Scene activeScene = SceneManager.GetActiveScene(); if (((Scene)(ref activeScene)).name != "Main" || !isInitialized) { return; } if (Input.GetKeyDown((KeyCode)103)) { try { if (appGO.activeSelf) { appGO.SetActive(false); } else { appGO.SetActive(true); } } catch (Exception ex) { MelonLogger.Error("[GunRunnersModule] Toggle error: " + ex); } } if (Input.GetKeyDown((KeyCode)293)) { SaveAppState(); } if (Input.GetKeyDown((KeyCode)292)) { LoadAppState(); } } private void CreateAppIcon(string iconName, string labelText, string imagePath, GameObject appGO) { //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown GameObject iconGrid = GameObject.Find("Player_Local/CameraContainer/Camera/OverlayCamera/GameplayMenu/Phone/phone/HomeScreen/AppIcons"); if ((Object)(object)iconGrid == (Object)null) { MelonLogger.Error("AppIcons grid not found."); return; } foreach (Transform item in iconGrid.transform) { Transform val = item; if (((Object)val).name == iconName) { Object.Destroy((Object)(object)((Component)val).gameObject); } } GameObject val2 = Object.Instantiate<GameObject>(((Component)iconGrid.transform.GetChild(6)).gameObject, iconGrid.transform); ((Object)val2).name = iconName; ((Component)val2.transform.Find("Label")).GetComponent<Text>().text = labelText; Sprite val3 = LoadImage(imagePath); if ((Object)(object)val3 != (Object)null) { ((Component)val2.transform.Find("Mask/Image")).GetComponent<Image>().sprite = val3; } Button component = val2.GetComponent<Button>(); ((UnityEventBase)component.onClick).RemoveAllListeners(); ((UnityEvent)component.onClick).AddListener((UnityAction)delegate { RemoveDuplicateIcon(labelText, iconGrid); appGO.SetActive(true); MelonLogger.Msg("Clicked icon: " + labelText + " - " + iconName); MelonLogger.Msg("Custom UI panel created and shown."); CreateCustomUIPanel(appGO.transform); }); MelonLogger.Msg(iconName + " icon created."); } public GameObject CreateCustomUIPanel(Transform parent) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0152: 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_0191: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Expected O, but got Unknown MelonLogger.Msg("Creating custom UI panel..."); GameObject panel = new GameObject("CustomUIPanel"); panel.transform.SetParent(parent, false); panel.AddComponent<RectTransform>().sizeDelta = new Vector2(400f, 300f); panel.AddComponent<CanvasRenderer>(); ((Graphic)panel.AddComponent<Image>()).color = Color.gray; GameObject val = new GameObject("TitleText"); val.transform.SetParent(panel.transform, false); RectTransform obj = val.AddComponent<RectTransform>(); obj.anchoredPosition = new Vector2(0f, 120f); obj.sizeDelta = new Vector2(380f, 40f); Text obj2 = val.AddComponent<Text>(); obj2.text = "Custom UI Panel"; obj2.font = Resources.GetBuiltinResource<Font>("Arial.ttf"); obj2.fontSize = 24; obj2.alignment = (TextAnchor)4; ((Graphic)obj2).color = Color.black; GameObject val2 = new GameObject("CloseButton"); val2.transform.SetParent(panel.transform, false); RectTransform obj3 = val2.AddComponent<RectTransform>(); obj3.anchoredPosition = new Vector2(0f, -100f); obj3.sizeDelta = new Vector2(200f, 50f); Button val3 = val2.AddComponent<Button>(); ((Graphic)val2.AddComponent<Image>()).color = Color.white; Text obj4 = val2.AddComponent<Text>(); obj4.text = "Close"; obj4.font = Resources.GetBuiltinResource<Font>("Arial.ttf"); obj4.fontSize = 20; obj4.alignment = (TextAnchor)4; ((Graphic)obj4).color = Color.black; ((UnityEvent)val3.onClick).AddListener((UnityAction)delegate { panel.SetActive(false); }); MelonLogger.Msg("Custom UI panel created."); return panel; } private void ShowApp(GameObject appGO) { if ((Object)(object)appGO != (Object)null) { appGO.SetActive(true); appGO.transform.SetAsLastSibling(); } else { MelonLogger.Error("App GameObject is null."); } } private void RemoveDuplicateIcon(string labelText, GameObject iconGrid) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown foreach (Transform item in iconGrid.transform) { Transform val = item; if (((Object)val).name == "AppIcon(Clone)") { Transform obj = ((Component)val).transform.Find("Label"); object obj2; if (obj == null) { obj2 = null; } else { Text component = ((Component)obj).GetComponent<Text>(); obj2 = ((component != null) ? component.text : null); } if ((string?)obj2 == labelText) { Object.Destroy((Object)(object)((Component)val).gameObject); MelonLogger.Msg("Removed duplicate icon '" + labelText + "'"); break; } } } } private Sprite LoadImage(string fileName) { //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), fileName); if (!File.Exists(text)) { MelonLogger.Error("Icon file not found: " + text); return null; } try { byte[] array = File.ReadAllBytes(text); if (array == null || array.Length == 0) { MelonLogger.Error("Failed to load image data."); return null; } Texture2D val = new Texture2D(2, 2); if (ImageConversion.LoadImage(val, array)) { return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } MelonLogger.Error("Failed to load image into texture."); } catch (Exception ex) { MelonLogger.Error("Failed to load sprite: " + ex); } return null; } private void SaveAppState() { MelonLogger.Msg("[GunRunnersModule] App state saved."); } private void LoadAppState() { MelonLogger.Msg("[GunRunnersModule] App state loaded."); } } internal class stackModule : IModModule { [HarmonyPatch(typeof(MixingStation), "Start")] private class MixingStationPatch { private static void Postfix(MixingStation __instance) { __instance.MixTimePerItem = 1; __instance.MaxMixQuantity = 80; } } [HarmonyPatch(typeof(DryingRack), "Awake")] private class DryingRackPatch { private static void Postfix(DryingRack __instance) { __instance.ItemCapacity = 80; } } [HarmonyPatch(typeof(ItemInstance), "get_StackLimit")] private class ItemInstanceStackLimitPatch { private static void Postfix(ItemInstance __instance, ref int __result) { __result = 80; } } [HarmonyPatch(typeof(ShopInterface), "ListingClicked")] public static class ShopInterface_ListingClicked_Patch { public static bool Prefix(ShopInterface __instance, ListingUI listingUI) { //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Expected O, but got Unknown if (listingUI.Listing.Item.IsPurchasable && listingUI.CanAddToCart()) { int num = 1; if (__instance.AmountSelector.IsOpen) { num = __instance.AmountSelector.SelectedAmount; } else if (isStackableOffset((ItemDefinition)listingUI.Listing.Item)) { num = ((ItemDefinition)listingUI.Listing.Item).StackLimit; } __instance.Cart.AddItem(listingUI.Listing, num); __instance.AddItemSound.Play(); } return false; } } [HarmonyPatch(typeof(CartEntry), "Initialize")] public static class CartEntry_Initialize_Patch { public static void Postfix(CartEntry __instance, Cart cart, ShopListing listing, int quantity) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected O, but got Unknown ((UnityEventBase)__instance.IncrementButton.onClick).RemoveAllListeners(); ((UnityEventBase)__instance.DecrementButton.onClick).RemoveAllListeners(); int offset = 1; if (isStackableOffset((ItemDefinition)__instance.Listing.Item)) { offset = ((ItemDefinition)__instance.Listing.Item).StackLimit; } ((UnityEvent)__instance.IncrementButton.onClick).AddListener((UnityAction)delegate { __instance.Cart.AddItem(__instance.Listing, offset); }); ((UnityEvent)__instance.DecrementButton.onClick).AddListener((UnityAction)delegate { __instance.Cart.RemoveItem(__instance.Listing, -offset); }); } } [HarmonyPatch(typeof(ListingEntry), "Initialize")] public static class ListingEntry_Initialize_Patch { public static void Postfix(ListingEntry __instance, ShopListing match) { //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_0099: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown ((UnityEventBase)__instance.IncrementButton.onClick).RemoveAllListeners(); ((UnityEventBase)__instance.DecrementButton.onClick).RemoveAllListeners(); int offset = 1; if (isStackableOffset((ItemDefinition)match.Item)) { offset = ((ItemDefinition)match.Item).StackLimit; } ((UnityEvent)__instance.IncrementButton.onClick).AddListener((UnityAction)delegate { __instance.SetQuantity(__instance.SelectedQuantity + offset, true); }); ((UnityEvent)__instance.DecrementButton.onClick).AddListener((UnityAction)delegate { __instance.SetQuantity(__instance.SelectedQuantity - offset, true); }); } } private const int DefaultStackSize = 20; private const int CustomStackSize = 80; public void OnModInit() { MelonLogger.Msg("[StackModule] Initialized"); } public void OnSceneLoaded(int buildIndex, string sceneName) { if (sceneName != "Main") { MelonLogger.Msg("[StackModule] Scene not gameplay, disabling."); } } public void OnUpdate() { } public static bool isStackableOffset(ItemDefinition item) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Invalid comparison between Unknown and I4 //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Invalid comparison between Unknown and I4 //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Invalid comparison between Unknown and I4 //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Invalid comparison between Unknown and I4 //IL_006f: Unknown result type (might be due to invalid IL or missing references) if ((int)item.Category == 1) { return true; } if ((int)item.Category == 9) { return true; } if ((int)item.Category == 7) { return true; } if ((int)item.Category == 2 && !item.Name.Contains("pot") && !item.Name.Equals("Grow Tent")) { return true; } if ((int)item.Category == 3 && item.Name.Equals("Trash Bag")) { return true; } if ((int)item.Category == 0 && item.Name.Equals("Speed Grow")) { return true; } return false; } }