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 Silksong Mouse Inventory Use v0.1.7
inventory_mouse_use.dll
Decompiled 7 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using HarmonyLib; using InControl; using Microsoft.CodeAnalysis; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Bigfootmech")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyCopyright("Bigfootmech")] [assembly: AssemblyDescription("Use Mouse in the Inventory (Work in Progress).")] [assembly: AssemblyFileVersion("0.1.7.0")] [assembly: AssemblyInformationalVersion("0.1.7+ff7137623f3f1da7b8d9e1cd840f9413a41efb54")] [assembly: AssemblyProduct("Inventory Mouse for Silksong")] [assembly: AssemblyTitle("inventory_mouse_use")] [assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/Bigfootmech/Silksong_mouse_inventory")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.1.7.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.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace inventory_mouse_use { [BepInPlugin("com.bigfootmech.silksong.inventory_mouse", "Inventory Mouse for Silksong", "0.1.7")] public class Plugin : BaseUnityPlugin { public class OnClickClass : MonoBehaviour { private bool MouseAlreadyIn; public void OnMouseUp() { CurrentPanesCursorControlFsm.SendEvent("UI CONFIRM RELEASED"); } public void OnMouseDown() { if (IsInventoryOpen() && !IsScrolling()) { ClickFunction(); } } public virtual void OnMouseOver() { if (IsInventoryOpen() && !IsScrolling()) { WhileMouseOvered(); if (!MouseAlreadyIn || SwitchedPanesThisFrame) { MouseAlreadyIn = true; MouseOverFunction(); } } } public virtual void OnMouseExit() { MouseAlreadyIn = false; } protected virtual void ClickFunction() { CurrentPanesCursorControlFsm.SendEvent("UI CONFIRM"); } protected virtual void MouseOverFunction() { CurrentPanesCursorControlFsm.SetState("Accept Input"); } protected virtual void WhileMouseOvered() { } protected void VisualSelectMyObj() { CurrentPaneObject.GetComponent<InventoryItemManager>().SetSelected(((Component)this).gameObject, false); } } public class OnClickBorderArrow : OnClickClass { public string stateName; protected override void ClickFunction() { base.ClickFunction(); } protected override void MouseOverFunction() { CurrentPanesCursorControlFsm.SetState(stateName); } } public class OnClickTab : OnClickClass { protected override void ClickFunction() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) SwitchInventoryTabTo(GetTargetPane()); } protected override void MouseOverFunction() { VisualSelectMyObj(); } private PaneTypes GetTargetPane() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) InventoryPaneListItem component = ((Component)this).gameObject.GetComponent<InventoryPaneListItem>(); return GetPaneType(component.currentPane); } private PaneTypes GetPaneType(InventoryPane pane) { return (PaneTypes)PaneList.GetPaneIndex(pane); } private PaneTypes GetPaneType(string paneName) { return (PaneTypes)PaneList.GetPaneIndex(paneName); } } public class OnClickInventoryItem : OnClickClass { protected override void MouseOverFunction() { if (!((Object)(object)CurrentPaneObject == (Object)null)) { InventoryItemSelectable ownSelectable = GetOwnSelectable(); if ((Object)(object)ownSelectable == (Object)null) { Logger.LogError((object)("selectable is null for " + ((Object)((Component)this).gameObject).name)); return; } CurrentPaneObject.GetComponent<InventoryItemManager>().SetSelected(ownSelectable, (SelectionDirection?)null, false); base.MouseOverFunction(); } } private InventoryItemSelectable GetOwnSelectable() { return ((Component)this).gameObject.GetComponent<InventoryItemSelectable>(); } } public class OnMouseoverRosaryCannon : OnClickInventoryItem { public override void OnMouseOver() { PreventBackOut = true; base.OnMouseOver(); } public override void OnMouseExit() { PreventBackOut = false; base.OnMouseExit(); } } public class OnMouseoverAttackSlotAuxRosaryCannon : OnClickInventoryItem { private InventoryToolCrestSlot slotScript; public override void OnMouseOver() { if ((Object)(object)slotScript == (Object)null) { slotScript = ((Component)this).gameObject.GetComponent<InventoryToolCrestSlot>(); } if ((Object)(object)slotScript != (Object)null && ((InventoryItemSelectable)slotScript).DisplayName == "Rosary Cannon") { PreventBackOut = true; } base.OnMouseOver(); } public override void OnMouseExit() { PreventBackOut = false; base.OnMouseExit(); } } public class MarkerClicker : OnClickClass { public MapMarkerMenu MarkerController; public int Index = -1; protected override void ClickFunction() { if (IsInventoryOpen() && MarkerController.inPlacementMode) { MarkerController.timer = MarkerController.uiPause; MarkerController.selectedIndex = Index; MarkerController.MarkerSelect(MarkerController.selectedIndex, false); } } } public class ShowHideCompletedQuestsClicker : OnClickClass { protected override void ClickFunction() { DoInjectMenuSuperForCompletedQuestToggle = true; } protected override void MouseOverFunction() { VisualSelectMyObj(); } } public class TestClicker : OnClickClass { protected override void ClickFunction() { Logger.LogInfo((object)("Click Test: " + SafeToString(((Object)((Component)this).gameObject).name))); } protected override void MouseOverFunction() { Logger.LogInfo((object)("Mouseover Test: " + SafeToString(((Object)((Component)this).gameObject).name))); VisualSelectMyObj(); } protected override void WhileMouseOvered() { Logger.LogInfo((object)("do this every frame for obj: " + SafeToString(((Object)((Component)this).gameObject).name))); } } public class ScrollArrowHover : OnClickClass { internal enum Dir { Up, Down } private const float SPEED = 0.2f; public ScrollView ScrollControllerScript; private Vector3 TravelVector = new Vector3(0f, 0.2f, 0f); protected override void WhileMouseOvered() { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) Transform transform = ((Component)ScrollControllerScript).transform; transform.localPosition += TravelVector; } internal void SetDirection(Dir direction) { if (direction == Dir.Down) { TravelVector.y = 0.2f; } else { TravelVector.y = -0.2f; } } } public class ScrollHover : MonoBehaviour { private const float SCROLL_WHEEL_SPEED = 8f; public PaneTypes MyPane; public ScrollView ScrollControllerScript; public bool CheckMouseOver() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) Vector2 val = Vector2.op_Implicit(((Component)this).transform.position); Vector2 val2 = GetLocalMousePos() - val; return ((Bounds)(ref ScrollControllerScript.contentBounds)).Contains(Vector2.op_Implicit(val2)); } public void Update() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) if (IsInventoryOpen() && CurrentPaneType == MyPane) { if (!CheckMouseOver()) { SetScrolling(setVal: false, instant: true); } else { Scroll(); } } } private void Scroll() { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) float axisRaw = Input.GetAxisRaw("Mouse ScrollWheel"); if (axisRaw != 0f) { SetScrolling(setVal: true); float num = axisRaw * 8f; Transform transform = ((Component)ScrollControllerScript).transform; transform.localPosition -= new Vector3(0f, num, 0f); } else { SetScrolling(setVal: false); } } } public class DraggingAction { public bool IsDragging; private Vector2 MouseLastPos; public void Update() { if (IsDragging) { DoDragAction(); } if (Input.GetMouseButtonDown(0) && !IsDragging) { StartDragging(); } if (Input.GetMouseButtonUp(0) && IsDragging) { Release(); } } private void StartDragging() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) IsDragging = true; MouseLastPos = GetLocalMousePos(); } public void Stop() { Release(); } private void Release() { IsDragging = false; } private void DoDragAction() { if (!IsInventoryOpen()) { Release(); } else { SetMapCoordsByMouse(); } } private Vector2 GetMouseDragDelta() { //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) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) Vector2 localMousePos = GetLocalMousePos(); Vector2 result = localMousePos - MouseLastPos; MouseLastPos = localMousePos; return result; } private void SetMapCoordsByMouse() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Invalid comparison between Unknown and I4 //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //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_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) if ((int)CurrentPaneType != 4 || MapZoomStateFsm.ActiveStateName != "Zoomed In") { Release(); return; } Vector2 mouseDragDelta = GetMouseDragDelta(); Vector2 val = Vector2.op_Implicit(((Component)ZoomedMapControl).transform.localPosition); ZoomedMapControl.UpdateMapPosition(val + mouseDragDelta); } } [HarmonyPatch(typeof(InventoryPaneList), "Start")] public class AfterInventoryIsCreated_Setup { [HarmonyPostfix] private static void Postfix(InventoryPaneList __instance) { //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Expected O, but got Unknown //IL_02ba: Unknown result type (might be due to invalid IL or missing references) //IL_02bf: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance == (Object)null) { Logger.LogError((object)"Inventory Setup Hook Failed"); } PaneList = __instance; Transform transform = ((Component)__instance).transform; try { HudCamera = ((Component)((Component)__instance).transform.parent.parent).GetComponent<Camera>(); } catch (Exception ex) { Logger.LogError((object)"Getting Hud Camera Failed"); Logger.LogError((object)ex.Message); } try { TabbingControlFSM = ((Component)((Component)__instance).transform).GetComponent<PlayMakerFSM>(); } catch (Exception ex2) { Logger.LogError((object)"Getting Tabbing Control FSM (\"Inventory Control\") Failed"); Logger.LogError((object)ex2.Message); } try { Transform obj = transform.Find("Border").Find("Arrows"); ((Component)obj.Find("Arrow Left")).gameObject.AddComponent<OnClickBorderArrow>().stateName = "L Arrow"; ((Component)obj.Find("Arrow Right")).gameObject.AddComponent<OnClickBorderArrow>().stateName = "R Arrow"; } catch (Exception ex3) { Logger.LogError((object)"Setting up Arrow click scripts Failed"); Logger.LogError((object)ex3.Message); } try { foreach (Transform item in transform.Find("Border").Find("PaneListDisplay").Find("List Items")) { ((Component)item).gameObject.AddComponent<BoxCollider2D>(); ((Component)item).gameObject.AddComponent<OnClickTab>(); } } catch (Exception ex4) { Logger.LogError((object)"Getting Tabs Failed"); Logger.LogError((object)ex4.Message); } try { foreach (Transform item2 in transform.Find("Inv").Find("Inv_Items").Find("Needle Shift")) { Transform val2 = item2; if (((Object)val2).name != "Spool Group") { ((Component)val2).gameObject.AddComponent<OnClickInventoryItem>(); } } } catch (Exception ex5) { Logger.LogError((object)"Failed attaching onclick to missed inv items"); Logger.LogError((object)ex5.Message); } try { MapZoomStateFsm = FSMUtility.LocateMyFSM(((Component)transform.Find("Map")).gameObject, "UI Control"); } catch (Exception ex6) { Logger.LogError((object)"Failed setting up map zoom control."); Logger.LogError((object)ex6.Message); } try { foreach (Transform item3 in transform.Find("Map").Find("World Map").Find("Map Offset") .GetChild(0)) { GameObject gameObject = ((Component)item3).gameObject; if (((Object)((Component)item3).gameObject).name.StartsWith("Wide_map_")) { gameObject.AddComponent<BoxCollider2D>(); gameObject.AddComponent<OnClickInventoryItem>(); } } } catch (Exception ex7) { Logger.LogError((object)"Failed attaching onclick to missed overmap items"); Logger.LogError((object)ex7.Message); } try { Transform obj2 = transform.Find("Quests").Find("Toggle Completed Action").Find("ActionButtonIcon"); ((Component)obj2).gameObject.AddComponent<ShowHideCompletedQuestsClicker>(); ((Component)obj2).gameObject.AddComponent<BoxCollider2D>(); Logger.LogInfo((object)"Attached comps"); } catch (Exception ex8) { Logger.LogError((object)"Failed attaching onclick to missed inv items"); Logger.LogError((object)ex8.Message); } } private static void AttachTestClicker(Transform tfm) { AttachTestClicker(((Component)tfm).gameObject); } private static void AttachTestClicker(GameObject go) { go.AddComponent<TestClicker>(); go.AddComponent<BoxCollider2D>(); } } [HarmonyPatch(typeof(ScrollView), "Start")] public class GetAllScrollViews { [HarmonyPostfix] private static void Postfix(ScrollView __instance) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006c: 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) ScrollArrowHover scrollArrowHover = ((Component)((Component)__instance.upArrow).transform.parent).gameObject.AddComponent<ScrollArrowHover>(); ScrollArrowHover scrollArrowHover2 = ((Component)((Component)__instance.downArrow).transform.parent).gameObject.AddComponent<ScrollArrowHover>(); scrollArrowHover.ScrollControllerScript = __instance; scrollArrowHover2.ScrollControllerScript = __instance; scrollArrowHover.SetDirection(ScrollArrowHover.Dir.Up); scrollArrowHover2.SetDirection(ScrollArrowHover.Dir.Down); ScrollHover scrollHover = ((Component)__instance).gameObject.AddComponent<ScrollHover>(); scrollHover.ScrollControllerScript = __instance; RegisterScroller(scrollHover.MyPane = FindPaneTypeForThis(__instance), scrollHover); } private static void RegisterScroller(PaneTypes paneType, ScrollHover testH) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) if ((int)paneType != -1) { ScrollHoverSet.Add(paneType, testH); } } private static PaneTypes FindPaneTypeForThis(ScrollView instance) { return (PaneTypes)(((Object)((Component)instance).gameObject).name switch { "Equipment" => 0, "Tool List" => 1, "Quest List" => 2, "Enemy List" => 3, _ => -1, }); } } [HarmonyPatch(typeof(GameMap), "Start")] public class HookRealMapStart { [HarmonyPostfix] private static void Postfix(GameMap __instance) { ZoomedMapControl = __instance; } } [HarmonyPatch(typeof(InventoryItemSelectable), "add_OnSelected")] public class TryOnSelected { [HarmonyPrefix] private static void Prefix(InventoryItemSelectable __instance, Action<InventoryItemSelectable> __0) { GameObject gameObject = ((Component)__instance).gameObject; OnClickInventoryItem onClickInventoryItem = default(OnClickInventoryItem); bool flag = gameObject.TryGetComponent<OnClickInventoryItem>(ref onClickInventoryItem); if (((Object)gameObject).name == "Rosary Cannon") { if (flag) { Object.Destroy((Object)(object)onClickInventoryItem); } gameObject.AddComponent<OnMouseoverRosaryCannon>(); } else if (((Object)gameObject).name == "Attack Slot(Clone)") { if (flag) { Object.Destroy((Object)(object)onClickInventoryItem); } gameObject.AddComponent<OnMouseoverAttackSlotAuxRosaryCannon>(); } else if (!flag) { gameObject.AddComponent<OnClickInventoryItem>(); } } } [HarmonyPatch(typeof(InputHandler), "SetCursorVisible")] public class OverrideCursorVisible { [HarmonyPrefix] private static void Prefix(InputHandler __instance, ref bool value) { if (IsInventoryOpen()) { value = true; } } } [HarmonyPatch(typeof(InputHandler), "Update")] public class DisableAttackForMouseClickJank { [HarmonyPrefix] private static void Prefix(InputHandler __instance) { if (IsInventoryOpen()) { ((OneAxisInputControl)__instance.inputActions.Attack).Enabled = false; } else { ((OneAxisInputControl)__instance.inputActions.Attack).Enabled = true; } } } [HarmonyPatch(typeof(InventoryPaneInput), "Update")] public class OnUpdateDo { [HarmonyPostfix] private static void Postfix(InventoryPaneInput __instance, ref InventoryPaneList ___paneList, ref PaneTypes ___paneControl) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Invalid comparison between Unknown and I4 //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Invalid comparison between Unknown and I4 //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Invalid comparison between Unknown and I4 try { SwitchedPanesThisFrame = false; if ((int)CurrentPaneType != (int)___paneControl) { SwitchedPanesThisFrame = true; CurrentPaneType = ___paneControl; CurrentPaneObject = ((Component)__instance).gameObject; CurrentPanesCursorControlFsm = FSMUtility.LocateMyFSM(CurrentPaneObject, "Inventory Proxy"); } bool mouseButtonDown = Input.GetMouseButtonDown(1); bool mouseButtonDown2 = Input.GetMouseButtonDown(3); bool mouseButtonDown3 = Input.GetMouseButtonDown(4); if ((int)CurrentPaneType != 1) { PreventBackOut = false; } if (mouseButtonDown) { InventoryBack(); } if (mouseButtonDown2) { MapZoomStateFsm.SendEvent("UI CANCEL"); } ScrollHover scrollHoverForPane = GetScrollHoverForPane(CurrentPaneType); if ((Object)(object)scrollHoverForPane != (Object)null) { scrollHoverForPane.Update(); } if ((int)CurrentPaneType != 4) { return; } if (MapZoomStateFsm.ActiveStateName == "Wide Map") { if (Input.GetAxisRaw("Mouse ScrollWheel") > 0f || mouseButtonDown3) { CurrentPanesCursorControlFsm.SendEvent("UI CONFIRM"); } MapDragging.Stop(); } UnstuckZoomControls(); if (MapZoomStateFsm.ActiveStateName == "Zoomed In") { if (Input.GetAxisRaw("Mouse ScrollWheel") < 0f) { MapBack(); } bool flag = WasDoubleClick(); if (flag) { JustEnteredMarkerState = true; } if (mouseButtonDown3 || flag) { MapZoomStateFsm.SendEvent("UI CONFIRM"); } MapDragging.Update(); } if (MapZoomStateFsm.ActiveStateName == "Marker Select Menu") { MapDragging.Stop(); } } catch (Exception ex) { Logger.LogError((object)("Error: " + ex.Message)); } } private static bool WasDoubleClick() { DoubleClickTimer -= Time.unscaledDeltaTime; DoubleClickTimer = Math.Max(DoubleClickTimer, 0f); bool mouseButtonDown = Input.GetMouseButtonDown(0); if (Input.GetMouseButtonUp(0)) { AwaitMouseUp = false; } if (!mouseButtonDown || AwaitMouseUp) { return false; } if (DoubleClickTimer != 0f) { DoubleClickTimer = 0f; return true; } DoubleClickTimer = 0.25f; AwaitMouseUp = true; return false; } private static void UnstuckZoomControls() { if (MapZoomStateFsm.ActiveStateName == "Map Zoom") { CountTransitionFrames--; if (CountTransitionFrames == 0) { CountTransitionFrames = 3; MapZoomStateFsm.SendEvent("ZOOMED IN"); } } if (MapZoomStateFsm.ActiveStateName == "Zoom Out") { CountTransitionFrames--; if (CountTransitionFrames == 0) { CountTransitionFrames = 3; MapZoomStateFsm.SendEvent("ZOOMED OUT"); } } } private static void InventoryBack() { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Invalid comparison between Unknown and I4 if (!PreventBackOut) { if ((int)CurrentPaneType != 4) { TabbingControlFSM.SendEvent("BACK"); } else { MapBack(); } } } private static void MapBack() { PlayMakerFSM val = FSMUtility.LocateMyFSM(CurrentPaneObject, "UI Control"); if (val.ActiveStateName == "Wide Map") { TabbingControlFSM.SendEvent("BACK"); } else { val.SendEvent("UI CANCEL"); } } } [HarmonyPatch(typeof(MapMarkerMenu), "Start")] public class MapMarkerStartInject { [HarmonyPostfix] private static void Postfix(MapMarkerMenu __instance) { for (int i = 0; i < __instance.markers.Length; i++) { GameObject gameObject = ((Component)__instance.markers[i]).gameObject; gameObject.AddComponent<BoxCollider2D>(); MarkerClicker markerClicker = gameObject.AddComponent<MarkerClicker>(); markerClicker.MarkerController = __instance; markerClicker.Index = i; } } } [HarmonyPatch(typeof(MapMarkerMenu), "Update")] public class PinsCursorMouseControl { [HarmonyPostfix] private static void Postfix(MapMarkerMenu __instance, ref GameObject ___placementCursor, ref List<GameObject> ___collidingMarkers, ref GameMap ___gameMap, ref GameObject ___gameMapObject, ref bool ___inPlacementMode, ref float ___placementTimer, ref float ___panSpeed) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_008e: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) if (!___inPlacementMode) { return; } if (((OneAxisInputControl)ManagerSingleton<InputHandler>.Instance.inputActions.QuickMap).WasPressed) { __instance.MarkerSelectRight(); } Vector2 mousePosLimited = GetLocalMousePos(); Bounds mapMarkerScrollArea = ___gameMap.mapMarkerScrollArea; bool num = IsMousePastEdge(mapMarkerScrollArea, mousePosLimited); if (num) { Vector3 panVecAndConstrainMouse = GetPanVecAndConstrainMouse(ref mousePosLimited, mapMarkerScrollArea, ___panSpeed, ___placementTimer); if (___gameMap.CanMarkerPan()) { Transform transform = ___gameMapObject.transform; transform.localPosition -= panVecAndConstrainMouse; ___gameMap.KeepWithinBounds(Vector2.op_Implicit(InventoryMapManager.SceneMapMarkerZoomScale)); } } bool flag = false; if (!num && IsAPinSelected(___collidingMarkers)) { flag = AreTwoPointsClose(p2: GetPinCorrectedPos(___collidingMarkers, ___gameMap), p1: mousePosLimited); } ProcessMouseCursorMovement(ref ___placementCursor, flag, mousePosLimited); if (!num && Input.GetMouseButtonDown(0)) { ProcessMarkerPutRemove(__instance, flag); } if (Input.GetAxisRaw("Mouse ScrollWheel") < 0f) { __instance.MarkerSelectLeft(); } if (Input.GetAxisRaw("Mouse ScrollWheel") > 0f) { __instance.MarkerSelectRight(); } JustEnteredMarkerState = false; } private static Vector3 GetPanVecAndConstrainMouse(ref Vector2 mousePosLimited, Bounds bounds, float ___panSpeed, float ___placementTimer) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: 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_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) Vector3 val = ((Bounds)(ref bounds)).center - ((Bounds)(ref bounds)).extents; Vector3 val2 = ((Bounds)(ref bounds)).center + ((Bounds)(ref bounds)).extents; float num = PIN_MAP_PAN_SPEED * ___panSpeed * Time.unscaledDeltaTime; Vector3 result = default(Vector3); if (mousePosLimited.x < val.x) { mousePosLimited.x = val.x; if (___placementTimer <= 0f) { result.x = 0f - num; } } else if (mousePosLimited.x > val2.x) { mousePosLimited.x = val2.x; if (___placementTimer <= 0f) { result.x = num; } } if (mousePosLimited.y < val.y) { mousePosLimited.y = val.y; if (___placementTimer <= 0f) { result.y = 0f - num; } } else if (mousePosLimited.y > val2.y) { mousePosLimited.y = val2.y; if (___placementTimer <= 0f) { result.y = num; } } return result; } private static bool IsMousePastEdge(Bounds bounds, Vector2 mousePosLimited) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0003: Unknown result type (might be due to invalid IL or missing references) return !((Bounds)(ref bounds)).Contains(Vector2.op_Implicit(mousePosLimited)); } private static void ProcessMouseCursorMovement(ref GameObject placementCursor, bool mouseoverPin, Vector2 mousePos) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) if (JustEnteredMarkerState) { MoveCursorToMouse(ref placementCursor, mousePos); } if (!mouseoverPin && HasMouseMoved()) { MoveCursorToMouse(ref placementCursor, mousePos); } } private static Vector2 GetPinCorrectedPos(List<GameObject> collidingMarkers, GameMap gameMap) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) return Vector2.op_Implicit(collidingMarkers.Last().transform.position - ((Component)gameMap).transform.parent.position); } private static bool AreTwoPointsClose(Vector2 p1, Vector2 p2) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) Vector2 val = p1 - p2; return ((Vector2)(ref val)).magnitude < MAGIC_GAME_PIN_COLLIDER_DISTANCE; } private static bool IsAPinSelected(List<GameObject> collidingMarkers) { return collidingMarkers.Count > 0; } private static void MoveCursorToMouse(ref GameObject placementCursor, Vector2 mousePos) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) placementCursor.transform.position = Vector2.op_Implicit(mousePos); } private static void ProcessMarkerPutRemove(MapMarkerMenu instance, bool mouseover) { if (mouseover) { instance.RemoveMarker(); } else { instance.PlaceMarker(); } } private static bool IsMouseWithinBounds(Vector2 mousePos, float placementCursorMinX, float placementCursorMaxX, float placementCursorMinY, float placementCursorMaxY) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) if (mousePos.x < placementCursorMinX) { return false; } if (mousePos.x > placementCursorMaxX) { return false; } if (mousePos.x < placementCursorMinY) { return false; } if (mousePos.x > placementCursorMaxY) { return false; } return true; } private static bool HasMouseMoved() { if (Input.GetAxis("Mouse X") == 0f) { return Input.GetAxis("Mouse Y") != 0f; } return true; } } [HarmonyPatch(typeof(InventoryItemQuestManager), "Update")] public class InjectSuperCommandForCompletedQuestToggle { [HarmonyPrefix] private static void Prefix(InventoryItemQuestManager __instance) { if (DoInjectMenuSuperForCompletedQuestToggle) { ((OneAxisInputControl)ManagerSingleton<InputHandler>.Instance.inputActions.MenuSuper).thisState.State = true; DoInjectMenuSuperForCompletedQuestToggle = false; } } } private const string modGUID = "com.bigfootmech.silksong.inventory_mouse"; internal static ManualLogSource Logger; private readonly Harmony harmony = new Harmony("com.bigfootmech.silksong.inventory_mouse"); private const string CURSOR_CONTROL_FSM_NAME = "Inventory Proxy"; private const string MAP_STATE_OVERMAP = "Wide Map"; private const string MAP_STATE_ZOOMED = "Zoomed In"; private const string MAP_STATE_HALF_ZOOM = "Map Zoom"; private const string MAP_STATE_HALF_UNZOOM = "Zoom Out"; private const string MAP_STATE_MARKERING = "Marker Select Menu"; private static bool SwitchedPanesThisFrame = false; private static bool Scrolling = false; private const int FRAMES_TO_BLOCK_MOUSEOVER_WHILE_SCROLLING = 100; private static int ScrollSmoothCountdown = 0; private static float MAGIC_GAME_PIN_COLLIDER_DISTANCE = 0.57f; private static float PIN_MAP_PAN_SPEED = 3f; private const float DOUBLE_CLICK_DELAY_MAX = 0.25f; private const int FRAMES_TO_TRANSITION = 3; private static int CountTransitionFrames = 3; private static Camera HudCamera = null; private static PlayMakerFSM TabbingControlFSM = null; private static InventoryPaneList PaneList = null; private static PaneTypes CurrentPaneType = (PaneTypes)(-1); private static GameObject CurrentPaneObject = null; private static PlayMakerFSM CurrentPanesCursorControlFsm = null; private static PlayMakerFSM MapZoomStateFsm = null; private static GameMap ZoomedMapControl = null; private static DraggingAction MapDragging = new DraggingAction(); private static Dictionary<PaneTypes, ScrollHover> ScrollHoverSet = new Dictionary<PaneTypes, ScrollHover>(); private static float DoubleClickTimer = 0f; private static bool AwaitMouseUp = false; private static bool JustEnteredMarkerState = false; private static bool DoInjectMenuSuperForCompletedQuestToggle = false; private static bool PreventBackOut = false; private static bool IsInventoryOpen() { if ((Object)(object)TabbingControlFSM == (Object)null) { return false; } string activeStateName = TabbingControlFSM.ActiveStateName; if (activeStateName == "Closed" || activeStateName == "Init") { return false; } return true; } private static bool IsScrolling() { if (!Scrolling) { return Input.GetAxisRaw("Mouse ScrollWheel") != 0f; } return true; } private static void SetScrolling(bool setVal, bool instant = false) { if (setVal) { Scrolling = true; ScrollSmoothCountdown = 100; return; } if (instant) { ScrollSmoothCountdown = 0; } else if (ScrollSmoothCountdown > 0) { ScrollSmoothCountdown--; } if (ScrollSmoothCountdown <= 0) { Scrolling = false; } } public static Vector2 GetLocalMousePos() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) return Vector2.op_Implicit(HudCamera.ScreenToWorldPoint(Input.mousePosition)); } private static ScrollHover GetScrollHoverForPane(PaneTypes currentPaneType) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) return GeneralExtensions.GetValueSafe<PaneTypes, ScrollHover>(ScrollHoverSet, currentPaneType); } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; Logger.LogInfo((object)"Plugin inventory_mouse_use is loaded!"); harmony.PatchAll(); } private static string SafeToString(object ob) { return ob?.ToString() ?? "null"; } private static void SwitchInventoryTabTo(PaneTypes pane) { //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected I4, but got Unknown if (!((Object)(object)TabbingControlFSM == (Object)null)) { TabbingControlFSM.FsmVariables.FindFsmInt("Target Pane Index").Value = (int)pane; TabbingControlFSM.SendEvent("MOVE PANE TO"); } } } public static class MyPluginInfo { public const string PLUGIN_GUID = "inventory_mouse_use"; public const string PLUGIN_NAME = "Inventory Mouse for Silksong"; public const string PLUGIN_VERSION = "0.1.7"; } }