using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using Crest; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("HooksHangMore")] [assembly: AssemblyDescription("https://github.com/bryon82/SailwindHooksHangMore")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("raddude")] [assembly: AssemblyProduct("HooksHangMore")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("7fbc1d41-251b-4cf2-8ee9-13edaafcc6ee")] [assembly: AssemblyFileVersion("2.2.1.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.2.1.0")] [module: UnverifiableCode] namespace HooksHangMore { [BepInPlugin("com.raddude.hookshangmore", "HooksHangMore", "2.2.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class HHM_Plugin : BaseUnityPlugin { public const string PLUGIN_GUID = "com.raddude.hookshangmore"; public const string PLUGIN_NAME = "HooksHangMore"; public const string PLUGIN_VERSION = "2.2.1"; public const string IDLE_FISHING_GUID = "com.isa_idlefishing.patch"; public const string COOKED_INFO_GUID = "pr0skynesis.cookedinfo"; public const string NAND_FIXES_GUID = "com.nandbrew.nandfixes"; private static ManualLogSource _logger; internal static HHM_Plugin Instance { get; private set; } internal static bool IdleFishingFound { get; private set; } internal static Dictionary AttachedItems { get; set; } internal static void LogDebug(string message) { _logger.LogDebug((object)message); } internal static void LogInfo(string message) { _logger.LogInfo((object)message); } internal static void LogWarning(string message) { _logger.LogWarning((object)message); } internal static void LogError(string message) { _logger.LogError((object)message); } 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; _logger = ((BaseUnityPlugin)this).Logger; AttachedItems = new Dictionary(); bool flag = false; foreach (KeyValuePair pluginInfo in Chainloader.PluginInfos) { BepInPlugin metadata = pluginInfo.Value.Metadata; if (metadata.GUID.Equals("com.isa_idlefishing.patch")) { LogInfo("Idle Fishing found"); IdleFishingFound = true; } if (metadata.GUID.Equals("pr0skynesis.cookedinfo")) { LogInfo("Cooked Info found"); HangableFoodPatches.GetNonBurnableDescription(); flag = true; } if (IdleFishingFound && flag) { break; } } Configs.InitializeConfigs(); Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.raddude.hookshangmore"); } } internal class AttachableAnchorPatches { [HarmonyPatch(typeof(Anchor))] private class AnchorPatches { [HarmonyPostfix] [HarmonyPatch("Awake")] public static void AwakePatch(Anchor __instance, SaveableObject ___boatSaveable) { //IL_007f: Unknown result type (might be due to invalid IL or missing references) //IL_009a: 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_0045: Unknown result type (might be due to invalid IL or missing references) _boatAnchors[___boatSaveable.sceneIndex] = __instance; AttachableItem attachableItem = ((Component)__instance).gameObject.AddComponent(); if (Offsets.AttachedItems.TryGetOffset(((Object)__instance).name, out var offset)) { attachableItem.PositionOffset = offset.Position; attachableItem.RotationOffset = offset.Rotation; } else { HHM_Plugin.LogWarning("Attachable anchor offsets not found for " + ((Object)__instance).name + ". Using default offsets."); attachableItem.PositionOffset = new Vector3(0f, 0.2f, -0.13f); attachableItem.RotationOffset = new Vector3(270f, 0f, 0f); } } [HarmonyPostfix] [HarmonyPatch("ExtraFixedUpdate")] public static void Postfix(Anchor __instance) { AttachableItem component = ((Component)__instance).GetComponent(); if (!((Object)(object)component != (Object)null) || component.IsAttached) { ((Component)__instance).GetComponent().isKinematic = true; ((Collider)((Component)__instance).GetComponent()).isTrigger = true; } } } [HarmonyPatch(typeof(GoPointerButton))] private class GoPointerButtonPatches { [HarmonyPostfix] [HarmonyPatch("AllowOnItemClick")] public static void AllowOnItemClick(GoPointerButton __instance, GoPointerButton lookedAtButton, ref bool __result) { if (__instance is Anchor && (Object)(object)((Component)__instance).GetComponent() != (Object)null && (Object)(object)((Component)lookedAtButton).GetComponent() != (Object)null && !((Component)lookedAtButton).GetComponent().IsOccupied) { __result = true; } } } [HarmonyPatch(typeof(GPButtonRopeWinch), "LimitTurning")] private class GPButtonRopeWinchLimitTurningPatch { public static void Postfix(GPButtonRopeWinch __instance, ref float ___currentInput) { //IL_006c: 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) if (!((Object)__instance).name.Contains("anchor")) { return; } RopeController rope = __instance.rope; RopeControllerAnchor val = (RopeControllerAnchor)(object)((rope is RopeControllerAnchor) ? rope : null); object obj; if (val == null) { obj = null; } else { ConfigurableJoint joint = val.joint; obj = ((joint != null) ? ((Component)joint).GetComponent() : null); } PickupableItem val2 = (PickupableItem)obj; AttachableItemHolder attachableItemHolder = ((val2 == null) ? null : ((Component)val2).GetComponent()?.Holder); if (!((Object)(object)attachableItemHolder == (Object)null)) { float num = Vector3.Distance(((Component)val).transform.position, ((Component)attachableItemHolder).transform.position); float num2 = Mathf.InverseLerp(0f, val.maxLength, num); if (__instance.rope.currentLength - num2 < 0.02f && ___currentInput > 0f) { ___currentInput = 0f; } } } } [HarmonyPatch(typeof(SaveablePrefab))] private class SaveablePrefabPatches { [HarmonyPostfix] [HarmonyPatch("PrepareSaveData")] public static void SaveAnchorAttached(ShipItem ___item, ref SavePrefabData __result) { if (!(___item is ShipItemLampHook)) { return; } AttachableItemHolder component = ((Component)___item).GetComponent(); if (!((Object)(object)component == (Object)null) && component.IsOccupied) { PickupableItem attachedItem = component.AttachedItem; Anchor val = (Anchor)(object)((attachedItem is Anchor) ? attachedItem : null); if (val != null && !((Object)(object)((Component)val).gameObject.GetComponent() == (Object)null)) { __result.extraValue0 = val.GetPrivateField("boatSaveable").sceneIndex; } } } [HarmonyPrefix] [HarmonyPatch("Load")] public static void LoadAnchorAttached(SavePrefabData data, SaveablePrefab __instance) { ShipItemLampHook component = ((Component)__instance).GetComponent(); if (!((Object)(object)component == (Object)null) && !(data.extraValue0 <= 0f)) { HHM_Plugin.LogDebug("Loading attached anchor"); ((MonoBehaviour)__instance).StartCoroutine(AttachAnchor(component, (int)data.extraValue0)); } } } private static readonly Dictionary _boatAnchors = new Dictionary(); internal static IEnumerator AttachAnchor(ShipItemLampHook hook, int sceneIndex) { yield return (object)new WaitUntil((Func)(() => _boatAnchors.ContainsKey(sceneIndex) || !GameState.loadingBoatLocalItems)); if (!_boatAnchors.TryGetValue(sceneIndex, out var anchor)) { HHM_Plugin.LogError($"Could not find anchor {sceneIndex} for hook"); yield break; } HHM_Plugin.LogDebug("Attaching " + ((Object)anchor).name + " to hook on " + ((Object)((Component)hook).transform.parent).name); PickupableItem anchorPickupable = ((Component)anchor).GetComponent(); AttachableItemHolder holder = ((Component)hook).GetComponent(); holder.AttachItem(anchorPickupable); ((Component)anchorPickupable).GetComponent().Holder = holder; } } internal class AttachableChipLogPatches { [HarmonyPatch(typeof(ShipItemChipLog), "OnLoad")] private class ShipItemChipLogPatches { public static void Postfix(ShipItemChipLog __instance) { //IL_001e: Unknown result type (might be due to invalid IL or missing references) AttachableItem attachableItem = ((Component)__instance).gameObject.AddComponent(); attachableItem.PositionOffset = Offsets.AttachedItems.GetOffset(((ShipItem)__instance).name).Position; } } } internal class AttachableKnifePatches { [HarmonyPatch(typeof(ShipItemKnife))] private class ShipItemKnifePatches { [HarmonyPostfix] [HarmonyPatch("OnLoad")] public static void AddComponent(ShipItemKnife __instance) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0055: 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_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) AttachableItem attachableItem = ((Component)__instance).gameObject.AddComponent(); Offsets offset = Offsets.AttachedItems.GetOffset(((ShipItem)__instance).name); attachableItem.PositionOffset = offset.Position; attachableItem.RotationOffset = offset.Rotation; if (Configs.flipKnifeRotation.Value) { attachableItem.PositionOffset = new Vector3(0f - attachableItem.PositionOffset.x, 0f - attachableItem.PositionOffset.y, attachableItem.PositionOffset.z); attachableItem.RotationOffset = new Vector3(attachableItem.RotationOffset.x - 180f, attachableItem.RotationOffset.y, attachableItem.RotationOffset.z); } } [HarmonyPrefix] [HarmonyPatch("AllowOnItemClick")] public static bool AllowOnItemClick(ShipItemKnife __instance, GoPointerButton lookedAtButton, ref bool __result) { if (!((ShipItem)__instance).sold) { return true; } if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && (Object)(object)((Component)lookedAtButton).GetComponent() != (Object)null && !((Component)lookedAtButton).GetComponent().IsOccupied) { __result = true; return false; } return true; } } } internal class HangableBottlePatches { [HarmonyPatch(typeof(ShipItemBottle))] private class ShipItemBottlePatches { [HarmonyPrefix] [HarmonyPatch("AllowOnItemClick")] public static bool AllowOnItemClick(ShipItemBottle __instance, GoPointerButton lookedAtButton, ref bool __result) { if (!Offsets.HangingItems.IsHangable(((Object)((Component)__instance).transform).name) || !((ShipItem)__instance).sold) { return true; } if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && (Object)(object)((Component)lookedAtButton).GetComponent() != (Object)null && !((Component)lookedAtButton).GetComponent().IsOccupied) { __result = true; return false; } return true; } [HarmonyPrefix] [HarmonyPatch("OnItemClick")] public static bool OnItemClick(ShipItemSoup __instance, PickupableItem heldItem, ref bool __result) { if (!Offsets.HangingItems.IsHangable(((Object)((Component)__instance).transform).name) || !((ShipItem)__instance).sold) { return true; } AttachableItem component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null && component.IsAttached && Object.op_Implicit((Object)(object)((Component)heldItem).GetComponent())) { NotificationUi.instance.ShowNotification("Cannot fill\nwhile it is hanging"); __result = false; return false; } return true; } } [HarmonyPatch(typeof(Mug), "Update")] private class MugPatches { public static void Postfix(Mug __instance) { //IL_0048: 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) if (GameState.playing && ((Object)__instance).name.Contains("bucket")) { HangableItem component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null && component.IsHanging()) { __instance.bucketHandle.localRotation = Quaternion.Euler(Vector3.zero); } } } } [HarmonyPatch(typeof(SaveablePrefab))] private class SaveablePrefabPatches { [HarmonyPostfix] [HarmonyPatch("PrepareSaveData")] public static void SaveBucketHanging(ShipItem ___item, ref SavePrefabData __result) { if (___item is ShipItemBottle && !(___item.name != "bucket")) { HangableItem component = ((Component)___item).GetComponent(); if (!((Object)(object)component == (Object)null) && component.IsHanging()) { __result.extraValue0 = 1f; } } } [HarmonyPrefix] [HarmonyPatch("Load")] public static void LoadBucketHanging(SavePrefabData data, SaveablePrefab __instance) { ShipItemBottle component = ((Component)__instance).GetComponent(); if (!((Object)(object)component == (Object)null) && !(((ShipItem)component).name != "bucket") && data.extraValue0 == 1f) { HHM_Plugin.LogDebug("Loading hanging bucket"); ((MonoBehaviour)__instance).StartCoroutine(HangBucket(component)); } } } internal static IEnumerator HangBucket(ShipItemBottle bucket) { HHM_Plugin.LogDebug("Shifting bucket box collider up"); BoxCollider col = ((Component)bucket).GetComponent(); col.center = new Vector3(col.center.x, 0.105417f, col.center.z); yield return (object)new WaitUntil((Func)(() => (Object)(object)((Component)bucket).GetComponent() != (Object)null && ((Component)bucket).GetComponent().IsHanging())); col.center = new Vector3(col.center.x, -0.055417f, col.center.z); HHM_Plugin.LogDebug("Shifted bucket box collider back down"); } } internal class HangableKettlePatches { [HarmonyPatch(typeof(ShipItemKettle))] private class ShipItemKettlePatches { [HarmonyPrefix] [HarmonyPatch("AllowOnItemClick")] public static bool AllowOnItemClick(ShipItemKettle __instance, GoPointerButton lookedAtButton, ref bool __result) { if (!((ShipItem)__instance).sold) { return true; } if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && (Object)(object)((Component)lookedAtButton).GetComponent() != (Object)null && !((Component)lookedAtButton).GetComponent().IsOccupied) { __result = true; return false; } return true; } } } internal class HangablePotPatches { [HarmonyPatch(typeof(ShipItemSoup))] private class ShipItemSoupPatches { [HarmonyPostfix] [HarmonyPatch("OnLoad")] public static void AddComponent(ShipItemSoup __instance) { if (Offsets.HangingItems.IsHangable(((Object)((Component)__instance).transform).name)) { ((Component)__instance).gameObject.AddComponent(); } } [HarmonyPrefix] [HarmonyPatch("AllowOnItemClick")] public static bool AllowOnItemClick(ShipItemSoup __instance, GoPointerButton lookedAtButton, ref bool __result) { if (!((ShipItem)__instance).sold) { return true; } if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && (Object)(object)((Component)lookedAtButton).GetComponent() != (Object)null && !((Component)lookedAtButton).GetComponent().IsOccupied) { __result = true; return false; } return true; } [HarmonyPrefix] [HarmonyPatch("OnItemClick")] public static bool OnItemClick(ShipItemSoup __instance, PickupableItem heldItem, ref bool __result) { if (!((ShipItem)__instance).sold) { return true; } HangableItem component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null && component.IsHanging() && Object.op_Implicit((Object)(object)((Component)heldItem).GetComponent())) { NotificationUi.instance.ShowNotification("Cannot fill\nwhile it is hanging"); __result = false; return false; } return true; } } } internal class ShipItemRotationPatches { [HarmonyPatch(typeof(ShipItem))] private class ShipItemPatches { [HarmonyPostfix] [HarmonyPatch("OnLoad")] public static void RemoveDescription(ShipItem __instance) { if (__instance is ShipItemLampHook) { ((Component)__instance).gameObject.AddComponent(); } } [HarmonyPrefix] [HarmonyPatch("Update")] public static bool RotateAttachments(ShipItem __instance, Transform ___itemRigidbody, ref bool ___inRangeOfWall, ref Vector3 ___attachPos, ref Quaternion ___attachRot) { //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_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: 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_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: 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_0124: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: 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_00e3: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)((PickupableItem)__instance).held) && __instance.wallAttachment) { PickupableItemAddOns component = ((Component)__instance).GetComponent(); if ((Object)(object)component == (Object)null) { return true; } float heldRotationYOffset = component.heldRotationYOffset; Vector3 forward = ___itemRigidbody.forward; RaycastHit val = default(RaycastHit); if (Physics.Raycast(new Ray(___itemRigidbody.position, forward), ref val, 1.3f)) { if (((RaycastHit)(ref val)).distance < 0.1f) { ___inRangeOfWall = false; } else { ___attachPos = ((RaycastHit)(ref val)).point; Quaternion val2 = Quaternion.LookRotation(-((RaycastHit)(ref val)).normal, Vector3.up); if (((RaycastHit)(ref val)).normal.y > 0.8f) { val2 = Quaternion.LookRotation(-((RaycastHit)(ref val)).normal, ((Component)__instance).transform.up); } Quaternion val3 = Quaternion.AngleAxis(heldRotationYOffset, Vector3.forward); ___attachRot = val2 * val3; ___inRangeOfWall = true; __instance.InvokePrivateMethod("SetUpTargeter", ___attachPos, ___attachRot, ((Component)__instance).GetComponent().sharedMesh); } } else { ___inRangeOfWall = false; } } else { ___inRangeOfWall = false; } if (__instance.GetPrivateField("isLookedAt")) { __instance.UpdateLookText(); } __instance.InvokePrivateMethod("ProcessSaveable"); return false; } } [HarmonyPatch(typeof(GoPointer), "LateUpdate")] private class GoPointerPatches { public static void Postfix(PickupableItem ___heldItem) { //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: 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) if (!((Object)(object)___heldItem == (Object)null) && !___heldItem.big) { PickupableItemAddOns component = ((Component)___heldItem).GetComponent(); if (!((Object)(object)component == (Object)null) && component.heldRotationYOffset != 0f) { Transform transform = ((Component)___heldItem).transform; transform.rotation *= Quaternion.AngleAxis(component.heldRotationYOffset, Vector3.forward); } } } } } internal class PickupableItemAddOns : MonoBehaviour { public float heldRotationYOffset; private void Start() { heldRotationYOffset = 0f; } private void Update() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) float num = GameInput.GetScrollAxis() * 25f + OVRInput.Get((Axis2D)2, (Controller)int.MinValue).y; if ((double)num != 0.0 && GameInput.GetKey((InputName)11)) { heldRotationYOffset += num * 4f; heldRotationYOffset = Mathf.Clamp(heldRotationYOffset, -90f, 90f); } } } internal static class Extensions { public static object InvokePrivateMethod(this object obj, string method, params object[] parameters) { return AccessTools.Method(obj.GetType(), method, (Type[])null, (Type[])null).Invoke(obj, parameters); } public static T GetPrivateField(this object obj, string field) { return (T)Traverse.Create(obj).Field(field).GetValue(); } } internal class Offsets { public static readonly Dictionary HangingItems = new Dictionary { { "70 bucket(Clone)", new Offsets(new Vector3(0f, -0.245f, 0f)) }, { "382 kettle A(Clone)", new Offsets(new Vector3(0f, -0.289f, 0f)) }, { "383 kettle E(Clone)", new Offsets(new Vector3(0f, -0.2f, -0.01f)) }, { "384 kettle M(Clone)", new Offsets(new Vector3(0f, -0.26f, 0f)) }, { "156 pot(Clone)", new Offsets(new Vector3(0.02f, -0.175f, -0.11f), default(Vector3), isFish: false, 0f, 270f, 40f) }, { "157 pot big(Clone)", new Offsets(new Vector3(0.025f, -0.205f, -0.13f), default(Vector3), isFish: false, 0f, 270f, 50f) }, { "102 mug metal(Clone)", new Offsets(new Vector3(0f, -0.12f, -0.02f), default(Vector3), isFish: false, 0f, 90f, -28f) }, { "102 mug metal", new Offsets(new Vector3(0f, -0.12f, -0.02f), default(Vector3), isFish: false, 0f, 90f, -28f) }, { "103 mug metal gold(Clone)", new Offsets(new Vector3(0f, -0.12f, -0.02f), default(Vector3), isFish: false, 0f, 90f, -20f) }, { "100 mug wood(Clone)", new Offsets(new Vector3(-0.07f, -0.075f, -0.02f), default(Vector3), isFish: false, 0f, 0f, 270f) }, { "100 mug wood", new Offsets(new Vector3(-0.07f, -0.075f, -0.02f), default(Vector3), isFish: false, 0f, 0f, 270f) }, { "31 templefish (A)(Clone)", new Offsets(new Vector3(-0.035f, -0.14f, 0f), default(Vector3), isFish: true) }, { "32 sunspot fish (A)(Clone)", new Offsets(new Vector3(-0.05f, -0.21f, 0f), default(Vector3), isFish: true) }, { "46 tuna (A)(Clone)", new Offsets(new Vector3(0f, -0.27f, 0f), default(Vector3), isFish: true) }, { "33 salmon (E)(Clone)", new Offsets(new Vector3(-0.035f, -0.3f, 0f), default(Vector3), isFish: true) }, { "34 eel (E)(Clone)", new Offsets(new Vector3(-0.006f, -0.65f, 0.01f), default(Vector3), isFish: true) }, { "35 shimmertail (E)(Clone)", new Offsets(new Vector3(-0.05f, -0.28f, 0f), default(Vector3), isFish: true) }, { "36 trout (M)(Clone)", new Offsets(new Vector3(-0.04f, -0.28f, 0f), default(Vector3), isFish: true) }, { "37 north fish (M)(Clone)", new Offsets(new Vector3(-0.03f, -0.2f, 0f), default(Vector3), isFish: true) }, { "38 blackfin hunter (M)(Clone)", new Offsets(new Vector3(-0.035f, -0.245f, 0f), default(Vector3), isFish: true) }, { "140 gold albacore(Clone)", new Offsets(new Vector3(0f, -0.27f, 0f), default(Vector3), isFish: true) }, { "141 swamp fish 1 (snapper(Clone)", new Offsets(new Vector3(-0.035f, -0.265f, 0f), default(Vector3), isFish: true) }, { "142 swamp fish 2 (bubbler)(Clone)", new Offsets(new Vector3(-0.045f, -0.19f, 0f), default(Vector3), isFish: true) }, { "148 swamp fish 3(Clone)", new Offsets(new Vector3(-0.065f, -0.2f, 0f), default(Vector3), isFish: true) } }; public static readonly Dictionary AttachedItems = new Dictionary { { "fishing rod", new Offsets(new Vector3(0.309f, 1.1f, -0.38f), new Vector3(-40f, 180f, 0f)) }, { "broom", new Offsets(new Vector3(0f, -0.25f, -0.11f)) }, { "chip log", new Offsets(new Vector3(0.002f, 0.25f, -0.12f)) }, { "oar", new Offsets(new Vector3(0f, -0.65f, -0.11f), new Vector3(180f, 0f, 0f)) }, { "quadrant", new Offsets(new Vector3(-0.0155f, 0.164f, -0.115f), new Vector3(90f, -90f, 0f)) }, { "knife", new Offsets(new Vector3(0.05f, -0.115f, -0.182f), new Vector3(270f, 270f, 0f)) }, { "hammer", new Offsets(new Vector3(0f, -0.3f, -0.22f), new Vector3(270f, 270f, 0f)) }, { "anchor_E (1)", new Offsets(new Vector3(0f, 0.2f, -0.13f), new Vector3(270f, 0f, 0f)) }, { "anchor_E", new Offsets(new Vector3(0f, 0.2f, -0.13f), new Vector3(270f, 0f, 0f)) }, { "anchor_M", new Offsets(new Vector3(0f, 0.2f, -0.13f), new Vector3(270f, 0f, 0f)) }, { "anchor_A", new Offsets(new Vector3(0f, 0.2f, -0.13f), new Vector3(270f, 0f, 0f)) } }; public Vector3 Position { get; } public Vector3 Rotation { get; } public float RotX { get; } public float RotY { get; } public float RotZ { get; } public bool LockX { get; } public bool LockZ { get; } public Offsets(Vector3 positionOffset, Vector3 rotationOffset = default(Vector3), bool isFish = false, float rotX = 0f, float rotY = 0f, float rotZ = 0f, bool lockX = true, bool lockZ = true) { //IL_0009: 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_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) Position = positionOffset; Rotation = rotationOffset; RotX = rotX; RotY = rotY; RotZ = rotZ; LockX = lockX; LockZ = lockZ; if (isFish) { RotY = 90f; RotZ = 270f; } } } internal static class OffsetsExtensions { public static bool TryGetOffset(this Dictionary dict, string itemName, out Offsets offset) { return dict.TryGetValue(itemName, out offset); } public static Offsets GetOffset(this Dictionary dict, string itemName) { Offsets value; return dict.TryGetValue(itemName, out value) ? value : null; } public static bool IsHangable(this Dictionary dict, string itemName) { return dict.ContainsKey(itemName); } } internal class HangableFoodPatches { private delegate void NonBurnableDescDelegate(ref string description, float amount); [HarmonyPatch(typeof(FoodState))] private class FoodStatePatches { [HarmonyPostfix] [HarmonyPatch("Update")] public static void HangDry(FoodState __instance, ShipItemFood ___food) { HangableItem component = ((Component)__instance).GetComponent(); if (GameState.playing && !__instance.inWater && ((ShipItem)___food).sold && !((Object)(object)component == (Object)null) && component.IsHanging()) { float num = Time.deltaTime * Sun.sun.timescale / (30f * ___food.GetEnergyPerBite()); num *= Mathf.Lerp(1f, 10f, __instance.salted); num *= 1.5f; if (((ShipItem)___food).name == "eel") { num *= 1.5f; } if (((Component)__instance).gameObject.layer == 26) { num = 0f; } __instance.dried += num; } } [HarmonyPrefix] [HarmonyPatch("UpdateLookText")] public static bool UpdateDescription(FoodState __instance, ShipItemFood ___food) { if (__instance.spoiled > 0.9f || ((ShipItem)___food).amount >= 1.5f || (__instance.salted >= 0.99f && __instance.smoked >= 0.99f) || __instance.smoked >= 0.99f) { return true; } if (__instance.salted >= 0.99f && __instance.dried >= 0.99f) { ((GoPointerButton)___food).description = "salted dried " + ((ShipItem)___food).name; return false; } return true; } [HarmonyBefore(new string[] { "pr0skynesis.cookedinfo" })] [HarmonyPostfix] [HarmonyPatch("UpdateLookText")] public static void UpdateCookedInfo(FoodState __instance, ShipItemFood ___food) { if (_nonBurnableDescription != null) { HangableItem component = ((Component)__instance).GetComponent(); if (!((Object)(object)component == (Object)null) && component.IsHanging()) { string description = ((GoPointerButton)___food).description; _nonBurnableDescription(ref description, __instance.dried / 0.99f); ((GoPointerButton)___food).description = description; } } } } [HarmonyPatch(typeof(ShipItemFood))] private class ShipItemFoodPatches { [HarmonyPrefix] [HarmonyPatch("AllowOnItemClick")] public static bool AllowOnItemClick(GoPointerButton lookedAtButton, ShipItemFood __instance, ref bool __result) { if (!((ShipItem)__instance).sold) { return true; } if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && (Object)(object)((Component)lookedAtButton).GetComponent() != (Object)null && !((Component)lookedAtButton).GetComponent().IsOccupied) { __result = true; return false; } return true; } } private static NonBurnableDescDelegate _nonBurnableDescription; internal static void GetNonBurnableDescription() { Type type = AccessTools.TypeByName("DescriptionBuilder"); MethodInfo methodInfo = AccessTools.Method(type, "NonBurnableDescription", (Type[])null, (Type[])null); if (!(methodInfo == null)) { _nonBurnableDescription = (NonBurnableDescDelegate)Delegate.CreateDelegate(typeof(NonBurnableDescDelegate), methodInfo); } } } internal class AttachableFishingRodPatches { [HarmonyPatch(typeof(ShipItemFishingRod), "OnLoad")] private class ShipItemFishingRodPatches { public static void Postfix(ShipItemFishingRod __instance) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) AttachableItem attachableItem = ((Component)__instance).gameObject.AddComponent(); Offsets offset = Offsets.AttachedItems.GetOffset(((ShipItem)__instance).name); attachableItem.PositionOffset = offset.Position; attachableItem.RotationOffset = offset.Rotation; } } [HarmonyPatch(typeof(FishingRodFish), "Update")] private class FishingRodFishPatches { [HarmonyBefore(new string[] { "com.isa_idlefishing.patch" })] public static void Postfix(FishingRodFish __instance, ShipItemFishingRod ___rod, SimpleFloatingObject ___floater, ConfigurableJoint ___bobberJoint, ref float ___fishTimer) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance.currentFish != (Object)null || ((ShipItem)___rod).health <= 0f || !HHM_Plugin.AttachedItems.ContainsKey((PickupableItem)(object)___rod) || !((FloatingObjectBase)___floater).InWater) { return; } SoftJointLimit linearLimit = ___bobberJoint.linearLimit; if (((SoftJointLimit)(ref linearLimit)).limit <= 1f || ((Component)__instance).gameObject.layer == 16) { return; } float num = ((!(GameState.distanceToLand < 500f)) ? (HHM_Plugin.IdleFishingFound ? 10f : 5.13f) : (HHM_Plugin.IdleFishingFound ? 20f : 6.67f)); ___fishTimer -= Time.deltaTime; float num2 = Vector3.Distance(((Component)__instance).transform.position, ((Component)___rod).transform.position); float num3 = Mathf.InverseLerp(3f, 20f, num2) * 2.5f + 0.5f; if (___fishTimer <= 0f) { ___fishTimer = 1f; num3 /= num; if (Random.Range(0f, 100f) < num3) { __instance.CatchFish(); } } } } } internal class HangablePatches { [HarmonyPatch(typeof(ShipItem))] private class ShipItemPatches { [HarmonyPostfix] [HarmonyPatch("Awake")] public static void AddComponent(ShipItem __instance) { if (Offsets.HangingItems.IsHangable(((Object)((Component)__instance).transform).name)) { ((Component)__instance).gameObject.AddComponent(); } } [HarmonyPostfix] [HarmonyPatch("OnPickup")] public static void OnPickup(ShipItem __instance) { if (Offsets.HangingItems.IsHangable(((Object)((Component)__instance).transform).name)) { HangableItem component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null) { component.DisconnectJoint(); } } } [HarmonyPostfix] [HarmonyPatch("OnEnterInventory")] public static void OnEnterInventory(ShipItem __instance) { if (Offsets.HangingItems.IsHangable(((Object)((Component)__instance).transform).name)) { HangableItem component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null) { component.DisconnectJoint(); } } } } [HarmonyPatch(typeof(HangableItem))] private class HangableItemPatches { [HarmonyPostfix] [HarmonyPatch("ConnectJoint")] public static void AdjustAnchor(HangableItem __instance) { //IL_0037: 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_0054: Unknown result type (might be due to invalid IL or missing references) if (!GameState.currentlyLoading && !GameState.loadingBoatLocalItems && Offsets.HangingItems.TryGetOffset(((Object)__instance).name, out var offset)) { Vector3 eulerAngles = ((Component)__instance).transform.eulerAngles; eulerAngles.y += offset.RotY; ((Component)__instance).transform.eulerAngles = eulerAngles; } } [HarmonyPrefix] [HarmonyPatch("LateUpdate")] public static bool ApplyPositionOffset(HangableItem __instance, Collider ___currentHook) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_007b: 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_0099: 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_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) if (!__instance.IsHanging()) { return true; } if (!Offsets.HangingItems.TryGetOffset(((Object)__instance).name, out var offset)) { return true; } Vector3 eulerAngles = ((Component)__instance).transform.eulerAngles; if (offset.LockX) { eulerAngles.x = offset.RotX; } if (offset.LockZ) { eulerAngles.z = offset.RotZ; } ((Component)__instance).transform.eulerAngles = eulerAngles; ((Component)__instance).transform.position = ((Component)___currentHook).transform.position + ((Component)___currentHook).transform.forward * (-0.128f + offset.Position.z) + ((Component)___currentHook).transform.right * offset.Position.x; ((Component)__instance).transform.position = new Vector3(((Component)__instance).transform.position.x, ((Component)__instance).transform.position.y + offset.Position.y, ((Component)__instance).transform.position.z); return false; } [HarmonyPrefix] [HarmonyPatch("OnTriggerEnter")] public static bool OnTriggerEnter(HangableItem __instance, Collider other) { bool flag = ((Object)(object)((Component)other).GetComponent() != (Object)null && ((Component)other).GetComponent().IsOccupied) || ((Object)(object)((Component)other).GetComponent() != (Object)null && ((Component)other).GetComponent().GetPrivateField("occupied")); if (__instance.IsHanging() || flag) { return false; } return true; } } } internal class AttachablePatches { [HarmonyPatch(typeof(ShipItem))] private class ShipItemPatches { [HarmonyBefore(new string[] { "com.nandbrew.nandfixes" })] [HarmonyPostfix] [HarmonyPatch("Awake")] public static void AddItemHolderAndAttachable(ShipItem __instance) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) if (__instance is ShipItemLampHook) { ((Component)__instance).gameObject.AddComponent(); } if (Offsets.AttachedItems.TryGetOffset(__instance.name, out var offset)) { AttachableItem attachableItem = ((Component)__instance).gameObject.AddComponent(); attachableItem.PositionOffset = offset.Position; attachableItem.RotationOffset = offset.Rotation; } } [HarmonyPrefix] [HarmonyPatch("AllowOnItemClick")] public static bool AllowOnItemClick(GoPointerButton lookedAtButton, ShipItem __instance, ref bool __result) { if (!__instance.sold) { return true; } if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && (Object)(object)((Component)lookedAtButton).GetComponent() != (Object)null && !((Component)lookedAtButton).GetComponent().IsOccupied) { __result = true; return false; } return true; } [HarmonyPrefix] [HarmonyPatch("OnPickup")] public static void OnShipItemPickup(ShipItem __instance) { if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && HHM_Plugin.AttachedItems.ContainsKey((PickupableItem)(object)__instance)) { AttachableItemHolder attachableItemHolder = HHM_Plugin.AttachedItems[(PickupableItem)(object)__instance]; if ((Object)(object)attachableItemHolder != (Object)null && (Object)(object)attachableItemHolder.AttachedItem == (Object)(object)__instance) { attachableItemHolder.DetachItem(); } } } } [HarmonyPatch(typeof(PickupableItem), "OnPickup")] private class PickupableItemOnPickupPatch { [HarmonyPostfix] public static void OnPickup(PickupableItem __instance) { if ((Object)(object)((Component)__instance).GetComponent() != (Object)null && HHM_Plugin.AttachedItems.ContainsKey(__instance)) { AttachableItemHolder attachableItemHolder = HHM_Plugin.AttachedItems[__instance]; if ((Object)(object)attachableItemHolder != (Object)null && (Object)(object)attachableItemHolder.AttachedItem == (Object)(object)__instance) { attachableItemHolder.DetachItem(); } } } } [HarmonyPatch(typeof(ShipItemLampHook))] private class ShipItemLampHookPatches { [HarmonyPostfix] [HarmonyPatch("OnPickup")] public static void OnPickup(ShipItemLampHook __instance) { AttachableItemHolder component = ((Component)__instance).GetComponent(); if (component.IsOccupied) { component.DetachItem(); } } [HarmonyPostfix] [HarmonyPatch("OnEnterInventory")] public static void OnEnterInventory(ShipItemLampHook __instance) { AttachableItemHolder component = ((Component)__instance).GetComponent(); if (component.IsOccupied) { component.DetachItem(); } } [HarmonyPrefix] [HarmonyPatch("OnItemClick")] public static bool OnItemClick(PickupableItem heldItem, ShipItemLampHook __instance, bool ___occupied, ref bool __result) { AttachableItemHolder component = ((Component)__instance).GetComponent(); if (component.IsOccupied || ___occupied) { __result = false; return false; } ShipItem val = (ShipItem)(object)((heldItem is ShipItem) ? heldItem : null); if (val != null) { if (!val.sold) { return true; } ShipItemSoup val2 = (ShipItemSoup)(object)((val is ShipItemSoup) ? val : null); if (val2 == null || !(val2.currentWater > 0f)) { ShipItemBottle val3 = (ShipItemBottle)(object)((val is ShipItemBottle) ? val : null); if (val3 == null || !(((ShipItem)val3).health > 0f)) { goto IL_00a3; } } NotificationUi.instance.ShowNotification("Cannot hang\nit is not empty"); __result = false; return false; } goto IL_00a3; IL_00a3: AttachableItem component2 = ((Component)heldItem).GetComponent(); if ((Object)(object)component2 != (Object)null) { component.AttachItem(heldItem); component2.Holder = component; __result = true; return false; } return true; } } [HarmonyPatch(typeof(SaveablePrefab), "Load")] private class SaveablePrefabPAtches { public static void Prefix(SavePrefabData data, SaveablePrefab __instance) { if (data.inventorySlot > -1) { AttachableItem component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null) { component.LoadInInventory(); } } } } } internal class AttachableQuadrantPatches { [HarmonyPatch(typeof(ShipItemQuadrant))] private class ShipItemQuadrantPatches { [HarmonyPostfix] [HarmonyPatch("OnLoad")] public static void AddAttachable(ShipItemQuadrant __instance) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) AttachableItem attachableItem = ((Component)__instance).gameObject.AddComponent(); Offsets offset = Offsets.AttachedItems.GetOffset(((ShipItem)__instance).name); attachableItem.PositionOffset = offset.Position; attachableItem.RotationOffset = offset.Rotation; } [HarmonyPostfix] [HarmonyPatch("ExtraLateUpdate")] public static void Postfix(ShipItemQuadrant __instance) { if (GameState.playing) { AttachableItem component = ((Component)__instance).GetComponent(); if ((Object)(object)component != (Object)null && component.IsAttached) { __instance.lockX = false; } else { __instance.lockX = true; } } } } } public class AttachableItem : MonoBehaviour { private ShipItem _shipItem; private PickupableItem _pickupable; private bool _disallowHangingOnTrigger; private float _framesAfterAwake; internal AttachableItemHolder Holder { get; set; } public Vector3 PositionOffset { get; set; } public Vector3 RotationOffset { get; set; } public bool IsAttached => (Object)(object)Holder != (Object)null; private void Awake() { //IL_0034: 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) _pickupable = ((Component)this).GetComponent(); _shipItem = ((Component)this).GetComponent(); Holder = null; _disallowHangingOnTrigger = false; _framesAfterAwake = 0f; PositionOffset = Vector3.zero; RotationOffset = Vector3.zero; } private void LateUpdate() { //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) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_pickupable != (Object)null) { PickupableItem pickupable = _pickupable; Anchor val = (Anchor)(object)((pickupable is Anchor) ? pickupable : null); if (val != null && IsAttached) { ((Component)val).transform.position = ((Component)Holder).transform.TransformPoint(PositionOffset); ((Component)val).transform.rotation = ((Component)Holder).transform.rotation * Quaternion.Euler(RotationOffset); } } } private void FixedUpdate() { if (_framesAfterAwake < 3f) { _framesAfterAwake += 1f; } } public void LoadInInventory() { _disallowHangingOnTrigger = true; } public void OnTriggerEnter(Collider other) { AttachableItemHolder component = ((Component)other).GetComponent(); bool flag = (_framesAfterAwake < 3f || GameState.currentlyLoading || GameState.loadingBoatLocalItems) && !Object.op_Implicit((Object)(object)_pickupable.held) && !_disallowHangingOnTrigger && ((Component)other).CompareTag("Hook") && (Object)(object)component != (Object)null && !component.IsOccupied && !IsAttached; if ((Object)(object)_shipItem != (Object)null) { flag = flag && _shipItem.sold && _shipItem.GetCurrentInventorySlot() == -1; } if (flag) { HHM_Plugin.LogDebug("Attaching " + ((Object)_pickupable).name + " during load."); component.AttachItem(_pickupable); Holder = component; } } public void DetachHolder() { if ((Object)(object)Holder != (Object)null) { Holder = null; } } public void OnDestroy() { Holder?.DetachItem(); _disallowHangingOnTrigger = false; } } public class AttachableItemHolder : MonoBehaviour { private Transform _itemRigidBody; public PickupableItem AttachedItem { get; private set; } public bool IsOccupied => (Object)(object)AttachedItem != (Object)null; private void Awake() { _itemRigidBody = ((Component)((ShipItem)((Component)((Component)this).transform).GetComponent()).itemRigidbodyC).transform; } internal void AttachItem(PickupableItem item) { //IL_00f1: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005d: 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_0071: 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_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) AttachableItem component = ((Component)item).GetComponent(); if ((Object)(object)component == (Object)null) { HHM_Plugin.LogError("HolderAttachable is null, cannot hang item"); return; } AttachedItem = item; ShipItem val = (ShipItem)(object)((item is ShipItem) ? item : null); if (val != null) { Vector3 position = _itemRigidBody.TransformPoint(component.PositionOffset); ((Component)val.itemRigidbodyC).transform.position = position; Quaternion rotation = _itemRigidBody.rotation * Quaternion.Euler(component.RotationOffset); ((Component)val.itemRigidbodyC).transform.rotation = rotation; val.itemRigidbodyC.attached = true; HHM_Plugin.LogDebug($"{val.name} item localpos: {((Component)val.itemRigidbodyC).transform.localPosition}, item parent: {((Component)val.itemRigidbodyC).transform.parent}"); } else { HHM_Plugin.LogDebug($"{((Object)item).name} item localpos: {((Component)item).transform.localPosition}, item parent: {((Component)item).transform.parent}"); } HHM_Plugin.AttachedItems.Add(item, this); } internal void DetachItem() { if ((Object)(object)AttachedItem == (Object)null) { return; } PickupableItem attachedItem = AttachedItem; ShipItem val = (ShipItem)(object)((attachedItem is ShipItem) ? attachedItem : null); if (val != null) { val.itemRigidbodyC.attached = false; } else { CapsuleCollider component = ((Component)AttachedItem).GetComponent(); if ((Object)(object)component != (Object)null) { ((Collider)component).isTrigger = false; } } HHM_Plugin.AttachedItems.Remove(AttachedItem); ((Component)AttachedItem).GetComponent().DetachHolder(); AttachedItem = null; } private void OnDestroy() { if (IsOccupied) { DetachItem(); } } } internal class Configs { internal static ConfigEntry flipKnifeRotation; internal static void InitializeConfigs() { ConfigFile config = ((BaseUnityPlugin)HHM_Plugin.Instance).Config; flipKnifeRotation = config.Bind("Settings", "Knife hangs down", false, "Knife hangs down in the lamp hook instead of pointing up."); } } } namespace HooksHangMore.Patches { internal class UIPatches { [HarmonyPatch(typeof(LookUI), "ShowLookText")] private class LookUIPatches { public static void Postfix(GoPointerButton button, TextMesh ___controlsText, GoPointer ___pointer, TextMesh ___textLicon, TextMesh ___textRIcon, ref bool ___showingIcon) { ShipItemLampHook val = (((Object)(object)button == (Object)null) ? null : ((Component)button).GetComponent()); AttachableItemHolder attachableItemHolder = (((Object)(object)val == (Object)null) ? null : ((Component)val).GetComponent()); PickupableItem val2 = (((Object)(object)___pointer == (Object)null) ? null : ___pointer.GetHeldItem()); AttachableItem attachableItem = (((Object)(object)val2 == (Object)null) ? null : ((Component)val2).GetComponent()); HangableItem val3 = (((Object)(object)val2 == (Object)null) ? null : ((Component)val2).GetComponent()); if ((Object)(object)val != (Object)null && (Object)(object)val2 != (Object)null && (Object)(object)attachableItemHolder != (Object)null && attachableItemHolder.IsOccupied) { ((Component)___textLicon).gameObject.SetActive(false); ___showingIcon = false; ___controlsText.text = ""; if (Object.op_Implicit((Object)(object)((Component)val2).GetComponent()) && ShipItemHammer.CanNail(((Component)button).GetComponent())) { ___showingIcon = true; if (((Component)button).GetComponent().nailed) { ((Component)___textRIcon).gameObject.SetActive(true); ___controlsText.text = "\nunlock"; } else { ((Component)___textRIcon).gameObject.SetActive(true); ___controlsText.text = "\nlock"; } } } else { if (!((Object)(object)val != (Object)null) || !((Object)(object)val2 != (Object)null) || (!((Object)(object)attachableItem != (Object)null) && !((Object)(object)val3 != (Object)null)) || attachableItemHolder.IsOccupied) { return; } string text = ((Component)val2).GetComponent()?.name ?? "anchor"; ((Component)___textLicon).gameObject.SetActive(true); ___showingIcon = true; ___controlsText.text = "attach " + text + "\n"; if (Object.op_Implicit((Object)(object)((Component)val2).GetComponent()) && ShipItemHammer.CanNail(((Component)button).GetComponent())) { if (((Component)button).GetComponent().nailed) { ((Component)___textRIcon).gameObject.SetActive(true); ___controlsText.text = "attach " + text + "\nunlock"; } else { ((Component)___textRIcon).gameObject.SetActive(true); ___controlsText.text = "attach " + text + "\nlock"; } } } } } } }