Some mods target the Mono version of the game, which is available by opting into the Steam beta branch "alternate"
Decompiled source of CtrlSplit Il2cpp v1.3.0
CtrlSplit.dll
Decompiled 10 months agousing System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using CtrlSplit; using HarmonyLib; using Il2CppScheduleOne.ItemFramework; using Il2CppScheduleOne.Persistence.Datas; using Il2CppScheduleOne.UI; using Il2CppScheduleOne.UI.Items; using MelonLoader; using MelonLoader.Preferences; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: MelonInfo(typeof(global::CtrlSplit.CtrlSplit), "CtrlSplit", "1.3.0", "xVilho", null)] [assembly: MelonColor(255, 200, 150, 255)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace CtrlSplit; public class CtrlSplit : MelonMod { private static ItemSlot cachedSlot; private static bool rightClickHeld; private static Instance Logger; private static MelonPreferences_Category cfgCategory; private static MelonPreferences_Entry<int> cfgCtrlStep; private static MelonPreferences_Entry<int> cfgAltStep; public override void OnInitializeMelon() { Logger = ((MelonBase)this).LoggerInstance; Logger.Msg("✅ initialized"); cfgCategory = MelonPreferences.CreateCategory("CtrlSplit"); cfgCtrlStep = cfgCategory.CreateEntry<int>("CtrlStep", 5, "Ctrl Scroll Step", (string)null, false, false, (ValueValidator)null, (string)null); cfgAltStep = cfgCategory.CreateEntry<int>("AltStep", 10, "Alt Scroll Step", (string)null, false, false, (ValueValidator)null, (string)null); ((MelonBase)this).HarmonyInstance.PatchAll(typeof(CtrlSplit)); } [HarmonyPostfix] [HarmonyPatch(typeof(ItemUIManager), "Update")] private static void PostfixUpdate(ItemUIManager __instance) { //IL_018a: Unknown result type (might be due to invalid IL or missing references) if (Input.GetMouseButtonDown(1)) { ItemSlotUI hoveredSlot = __instance.HoveredSlot; cachedSlot = ((hoveredSlot != null) ? hoveredSlot.assignedSlot : null); rightClickHeld = true; } else if (Input.GetMouseButtonUp(1)) { rightClickHeld = false; cachedSlot = null; } if ((rightClickHeld || __instance.draggedAmount > 0) && Input.GetMouseButtonDown(2)) { ItemSlotUI hoveredSlot2 = __instance.HoveredSlot; ItemSlot obj = ((hoveredSlot2 != null) ? hoveredSlot2.assignedSlot : null) ?? cachedSlot; ItemInstance val = ((obj != null) ? obj.ItemInstance : null); if (val != null) { ItemData itemData = val.GetItemData(); if (itemData != null && itemData.Quantity > 1) { int num = Mathf.Max(itemData.Quantity - 1, 1); int num2 = Mathf.Clamp(itemData.Quantity / 2, 1, num); __instance.SetDraggedAmount(num2); Logger.Msg($"MMB half | set to {num2} (stack: {itemData.Quantity})"); } } } if (!rightClickHeld) { return; } bool flag = Input.GetKey((KeyCode)306) || Input.GetKey((KeyCode)305); bool flag2 = Input.GetKey((KeyCode)308) || Input.GetKey((KeyCode)307); if (!flag && !flag2) { return; } int num3 = (flag ? cfgCtrlStep.Value : cfgAltStep.Value); float y = Input.mouseScrollDelta.y; if (Mathf.Abs(y) < 0.01f) { return; } int draggedAmount = __instance.draggedAmount; if (draggedAmount <= 0) { return; } int num4 = ((y > 0f) ? 1 : (-1)); int num5 = 999; ItemSlot obj2 = cachedSlot; ItemInstance val2 = ((obj2 != null) ? obj2.ItemInstance : null); if (val2 != null) { ItemData itemData2 = val2.GetItemData(); if (itemData2 != null) { num5 = Mathf.Max(itemData2.Quantity - 1, 1); } } int num6 = ((num4 <= 0) ? ((draggedAmount <= num3) ? 1 : Mathf.Max((draggedAmount - 1) / num3 * num3, 1)) : ((draggedAmount == 1) ? num3 : Mathf.Min(((draggedAmount - 1) / num3 + 1) * num3, num5))); __instance.SetDraggedAmount(num6); Logger.Msg($"Ctrl+Mb1+Scroll | {draggedAmount} → {num6} (max: {num5 + 1})"); } }