Decompiled source of ThirdHand v1.0.0

plugins/galfarious.ThirdHand.dll

Decompiled a week ago
using 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 Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("galfarious.ThirdHand")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("Third Hand Mod")]
[assembly: AssemblyTitle("galfarious.ThirdHand")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.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 ThirdHand
{
	public static class LogManager
	{
		private static ManualLogSource _log;

		public static void Init(ManualLogSource log)
		{
			_log = log;
		}

		public static void Info(object message)
		{
			_log.LogInfo(message);
		}

		public static void Error(object message)
		{
			_log.LogError(message);
		}

		public static void Debug(object message)
		{
			_log.LogDebug(message);
		}

		public static void Warn(object message)
		{
			_log.LogWarning(message);
		}
	}
	[BepInPlugin("galfarious.ThirdHand", "Third Hand Mod", "1.0.0")]
	public class ThirdHandMod : BaseUnityPlugin
	{
		private void Awake()
		{
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Expected O, but got Unknown
			LogManager.Init(((BaseUnityPlugin)this).Logger);
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin galfarious.ThirdHand is loaded!");
			SceneManager.sceneLoaded += OnSceneLoaded;
			Harmony val = new Harmony("galfarious.ThirdHand.patches");
			val.PatchAll();
		}

		private void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			if (((Scene)(ref scene)).name == "Game-Main")
			{
				GameObject.Find("CL_Player").AddComponent<ThirdHandController>();
			}
		}
	}
	public class ThirdHandController : MonoBehaviour
	{
		private GameObject _handsParent;

		private Transform _middleHand;

		private Image _middleUiHand;

		private bool _isInitialized = false;

		private void Awake()
		{
			CL_GameManager.gMan.allowScores = false;
			if (!_isInitialized)
			{
				_handsParent = GameObject.Find("CL_Player/Main Cam Root/Main Camera Shake Root/Main Camera/Inventory Camera/Inventory-Root");
				SetupContainer();
			}
		}

		private void SetupContainer()
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			//IL_0034: 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)
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Expected O, but got Unknown
			//IL_0071: Unknown result type (might be due to invalid IL or missing references)
			//IL_0077: Expected O, but got Unknown
			//IL_00a3: 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_00c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e6: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ed: Expected O, but got Unknown
			//IL_0116: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: 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_01b6: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02cc: Expected O, but got Unknown
			Hand[] hands = ENT_Player.playerObject.hands;
			GameObject val = new GameObject("Middle_Hand_Item");
			val.transform.SetParent(_handsParent.transform);
			val.transform.localPosition = Vector3.zero;
			val.transform.localRotation = Quaternion.identity;
			Hand val2 = new Hand();
			val2.fireButton = "Hand-Swap";
			val2.throwButton = "Rotate";
			GameObject val3 = new GameObject("Middle_Hand_Target");
			val3.transform.SetParent(_handsParent.transform);
			val3.transform.localPosition = new Vector3(0f, 0f, 0f);
			val3.transform.localRotation = Quaternion.identity;
			val3.transform.localScale = Vector3.one;
			val3.layer = LayerMask.NameToLayer("Player");
			GameObject val4 = new GameObject("Item_Hand_Middle");
			val4.transform.SetParent(val3.transform);
			val4.transform.localPosition = new Vector3(0f, 0f, 0f);
			val4.layer = LayerMask.NameToLayer("Player");
			ViewSway val5 = val4.AddComponent<ViewSway>();
			val5.targetOffset = new Vector3(0f, 0f, 0f);
			val5.Initialize(val2);
			Transform val6 = _handsParent.transform.Find("Right_Hand_Target/Item_Hand_Right/Item_Hands_Right");
			_middleHand = Object.Instantiate<Transform>(val6, val4.transform);
			((Object)_middleHand).name = "Item_Hands_Middle";
			((Component)_middleHand).transform.localPosition = new Vector3(0f, 0f, 0f);
			((Component)_middleHand).gameObject.layer = LayerMask.NameToLayer("Player");
			val2.handModel = val4.transform;
			val2.handSprite = ((Component)_middleHand).GetComponent<SpriteRenderer>();
			val2.dragMult = 10f;
			val2.grabSprite = ((IEnumerable<Sprite>)Resources.FindObjectsOfTypeAll<Sprite>()).FirstOrDefault((Func<Sprite, bool>)((Sprite x) => ((Object)x).name == "Hands_grip"));
			val2.id = 2;
			val2.normalSprite = ((IEnumerable<Sprite>)Resources.FindObjectsOfTypeAll<Sprite>()).FirstOrDefault((Func<Sprite, bool>)((Sprite x) => ((Object)x).name == "Hands_idle"));
			val2.openSprite = ((IEnumerable<Sprite>)Resources.FindObjectsOfTypeAll<Sprite>()).FirstOrDefault((Func<Sprite, bool>)((Sprite x) => ((Object)x).name == "HandsReach"));
			val2.memoryTime = 0.2f;
			val2.uiInteract = SetupUIHand();
			Inventory component = ((Component)ENT_Player.playerObject).GetComponent<Inventory>();
			ItemHand[] itemHands = component.itemHands;
			ItemHand val7 = new ItemHand();
			val7.hand = val2;
			val7.handInventoryRoot = val.transform;
			val7.handModel = val5;
			val7.currentItem = null;
			val7.currentItemNumber = -1;
			val2.inventoryHand = val7;
			component.itemHands = (ItemHand[])(object)new ItemHand[3]
			{
				itemHands[0],
				itemHands[1],
				val7
			};
			val2.gripStrength = ENT_Player.playerObject.gripStrengthTimer;
			val2.Initialize(ENT_Player.playerObject);
			ENT_Player.playerObject.hands = (Hand[])(object)new Hand[3]
			{
				hands[0],
				hands[1],
				val2
			};
			SetupFakeHandhold();
			SetupPocket();
			_isInitialized = true;
		}

		private void SetupFakeHandhold()
		{
			Transform transform = GameObject.Find("CL_Player/Fake Handholds").transform;
			Transform val = transform.Find("Player_Fake_Handhold.01");
			Transform val2 = Object.Instantiate<Transform>(val, transform);
			((Object)val2).name = "Player_Fake_Handhold.02";
			CL_Handhold component = ((Component)val2).GetComponent<CL_Handhold>();
			CL_Handhold[] grabAnywhereFakeHandholds = ENT_Player.playerObject.grabAnywhereFakeHandholds;
			ENT_Player.playerObject.grabAnywhereFakeHandholds = (CL_Handhold[])(object)new CL_Handhold[3]
			{
				grabAnywhereFakeHandholds[0],
				grabAnywhereFakeHandholds[1],
				component
			};
		}

		private Image SetupUIHand()
		{
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = GameObject.Find("GameManager/Canvas/Game UI/Crosshairs/InteractHands");
			Transform val2 = val.transform.Find("Interact_L");
			Transform val3 = Object.Instantiate<Transform>(val2, val.transform);
			Object.Destroy((Object)(object)((Component)val3).GetComponent<UT_Wiggle>());
			((Object)val3).name = "Interact_M";
			((Component)val3).transform.localPosition = new Vector3(0f, 40f, 0f);
			UT_Wiggle val4 = ((Component)val3).gameObject.AddComponent<UT_Wiggle>();
			val4.wiggleAmplitude = 1.5f;
			val4.wiggleSpeed = 4f;
			val4.wiggleOffset = 3f;
			_middleUiHand = ((Component)val3).gameObject.GetComponent<Image>();
			return _middleUiHand;
		}

		private void SetupPocket()
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_003f: Expected O, but got Unknown
			//IL_0057: 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_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			GameObject val = GameObject.Find("CL_Player/Main Cam Root/Main Camera Shake Root/Main Camera/Inventory Camera/InventoryBagCamera/Inventory-Bag/Homing Circle");
			val.SetActive(true);
			val.transform.localPosition = new Vector3(0f, -1f, 1.25f);
			GameObject val2 = new GameObject("Middle Pocket");
			val2.transform.SetParent(val.transform);
			val2.transform.localPosition = Vector3.zero;
			val2.transform.localScale = Vector3.one;
			Pocket val3 = new Pocket();
			val3.key = "Pocket-Right";
			val3.targetHandID = 2;
			val3.transform = val2.transform;
			Inventory.instance.pockets.Add(val3);
		}
	}
	public static class MyPluginInfo
	{
		public const string PLUGIN_GUID = "galfarious.ThirdHand";

		public const string PLUGIN_NAME = "Third Hand Mod";

		public const string PLUGIN_VERSION = "1.0.0";
	}
}
namespace ThirdHand.Patches
{
	[HarmonyPatch]
	public class EntPlayerPatches
	{
		[HarmonyPatch(typeof(ENT_Player), "Awake")]
		[HarmonyPrefix]
		private static bool AwakePatch(ENT_Player __instance)
		{
			Traverse.Create((object)__instance).Field<Vector3[]>("grabAnywherePosition").Value = (Vector3[])(object)new Vector3[3];
			Traverse.Create((object)__instance).Field<Transform[]>("grabAnywhereHit").Value = (Transform[])(object)new Transform[3];
			return true;
		}

		[HarmonyPatch(typeof(ENT_Player), "Actions")]
		[HarmonyPrefix]
		private static bool ActionsPatch(ENT_Player __instance)
		{
			//IL_0009: Unknown result type (might be due to invalid IL or missing references)
			//IL_000f: Invalid comparison between Unknown and I4
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Invalid comparison between Unknown and I4
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_002f: Invalid comparison between Unknown and I4
			//IL_005f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0065: Invalid comparison between Unknown and I4
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Invalid comparison between Unknown and I4
			if ((int)__instance.hands[0].interactState == 4 && (int)__instance.hands[1].interactState == 4 && (int)__instance.hands[2].interactState == 4)
			{
				Traverse.Create((object)__instance).Field<float>("gripStrengthLossRate").Value = 0.33f;
			}
			else if ((int)__instance.hands[0].interactState == 4 && (int)__instance.hands[1].interactState == 4)
			{
				Traverse.Create((object)__instance).Field<float>("gripStrengthLossRate").Value = 0.5f;
			}
			else
			{
				Traverse.Create((object)__instance).Field<float>("gripStrengthLossRate").Value = 1f;
			}
			((Component)__instance.aimCircle).gameObject.SetActive(false);
			if (!Traverse.Create((object)__instance).Field<CL_GameManager>("gMan").Value.isPaused)
			{
				MethodInfo method = ((object)__instance).GetType().GetMethod("InteractCheck", BindingFlags.Instance | BindingFlags.NonPublic);
				if (method != null)
				{
					method.Invoke(__instance, new object[1] { 0 });
					method.Invoke(__instance, new object[1] { 1 });
					method.Invoke(__instance, new object[1] { 2 });
				}
			}
			AudioSet set = __instance.clipHandler.GetGroup("fatigue").GetSet("level");
			if (__instance.IsHanging())
			{
				set.SetVolume(Mathf.Lerp(set.GetCurrentVolume(), (1f - __instance.GetLowestGripStrength() / __instance.gripStrengthTimer - 0.5f) * 2f * set.maxVolume, Time.deltaTime * 3f));
				return false;
			}
			set.SetVolume(Mathf.Lerp(set.GetCurrentVolume(), 0f, Time.deltaTime * 3f));
			return false;
		}

		[HarmonyPatch(typeof(ENT_Player), "DropEverything")]
		[HarmonyPrefix]
		private static bool DropEverythingPatch(ENT_Player __instance)
		{
			__instance.DropHang(5f);
			Hand[] hands = __instance.hands;
			foreach (Hand val in hands)
			{
				val.DestroyItem();
				((Component)val.uiInteract).gameObject.SetActive(false);
			}
			return false;
		}

		[HarmonyPatch(typeof(ENT_Player), "StashItemsInHand")]
		[HarmonyPrefix]
		private static bool StashItemPatch(ENT_Player __instance)
		{
			//IL_0023: Unknown result type (might be due to invalid IL or missing references)
			Inventory value = Traverse.Create((object)__instance).Field<Inventory>("inventory").Value;
			for (int i = 0; i < __instance.hands.Length; i++)
			{
				value.DropItemFromHand(value.inventoryCenterLocator.position, i, true);
			}
			return false;
		}
	}
	[HarmonyPatch]
	public class InventoryPatches
	{
		[HarmonyPatch(typeof(Inventory), "SwapHands")]
		[HarmonyPrefix]
		private static bool SwapHandsPatch(Inventory __instance)
		{
			return false;
		}
	}
	[HarmonyPatch]
	public class OSManagerPatches
	{
		[HarmonyPatch(typeof(OS_Computer_Interface), "Start")]
		[HarmonyPrefix]
		private static void OSComputerInterfaceStartPatch(OS_Computer_Interface __instance)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("MiddleHandPosition");
			val.transform.SetParent(((Component)__instance).transform);
			val.transform.localPosition = new Vector3(0.371f, -0.7f, 1.4f);
			Transform[] array = ObjectExtensions.Copy<Transform[]>(__instance.handPositions);
			__instance.handPositions = (Transform[])(object)new Transform[3]
			{
				array[0],
				array[1],
				val.transform
			};
		}

		[HarmonyPatch(typeof(OS_Computer_Interface), "Update")]
		[HarmonyPrefix]
		private static bool OSComputerInterfaceUpdatePatch(OS_Computer_Interface __instance)
		{
			return false;
		}
	}
}