Decompiled source of RescueClawCrosshairMod v1.0.0

nixi-PeakRescueClawMod/PeakRescueClawMod.dll

Decompiled a month ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
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(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]
[assembly: AssemblyCompany("PeakRescueClawMod")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+99151048b447326af5d8c0824b46daf47a9bdf41")]
[assembly: AssemblyProduct("PeakRescueClawMod")]
[assembly: AssemblyTitle("PeakRescueClawMod")]
[assembly: AssemblyVersion("1.0.0.0")]
[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 PeakRescueClawMod
{
	[BepInPlugin("nixi.peakrescueclawmod", "Rescue Claw Crosshair Mod", "1.0.0")]
	public class RescueClawMod : BaseUnityPlugin
	{
		internal static ConfigEntry<string> ColorMode;

		internal static ConfigEntry<string> StaticColor;

		internal static ConfigEntry<int> CustomR;

		internal static ConfigEntry<int> CustomG;

		internal static ConfigEntry<int> CustomB;

		private void Awake()
		{
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0013: Expected O, but got Unknown
			InitializeConfig();
			Harmony val = new Harmony("nixi.peakrescueclawmod");
			val.PatchAll();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"RescueClawMod v1.0.0 загружен!");
		}

		private void InitializeConfig()
		{
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0045: Expected O, but got Unknown
			//IL_00b4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Expected O, but got Unknown
			//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f7: Expected O, but got Unknown
			//IL_0122: Unknown result type (might be due to invalid IL or missing references)
			//IL_012c: Expected O, but got Unknown
			//IL_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Expected O, but got Unknown
			ColorMode = ((BaseUnityPlugin)this).Config.Bind<string>("General", "ColorMode", "Static", new ConfigDescription("Способ выбора цвета прицела при наведении на игрока", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[2] { "Static", "Custom" }), Array.Empty<object>()));
			StaticColor = ((BaseUnityPlugin)this).Config.Bind<string>("General", "StaticColor", "Red", new ConfigDescription("Статичный цвет (используется если ColorMode = Static)", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[8] { "Red", "Green", "Blue", "Yellow", "Cyan", "Magenta", "Orange", "Purple" }), Array.Empty<object>()));
			CustomR = ((BaseUnityPlugin)this).Config.Bind<int>("Custom Color", "R", 255, new ConfigDescription("Красный компонент (0–255)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			CustomG = ((BaseUnityPlugin)this).Config.Bind<int>("Custom Color", "G", 0, new ConfigDescription("Зелёный компонент (0–255)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			CustomB = ((BaseUnityPlugin)this).Config.Bind<int>("Custom Color", "B", 0, new ConfigDescription("Синий компонент (0–255)", (AcceptableValueBase)(object)new AcceptableValueRange<int>(0, 255), Array.Empty<object>()));
			bool flag = false;
			if (CustomR.Value < 0 || CustomR.Value > 255)
			{
				CustomR.Value = Mathf.Clamp(CustomR.Value, 0, 255);
				flag = true;
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Значение R было скорректировано до " + CustomR.Value));
			}
			if (CustomG.Value < 0 || CustomG.Value > 255)
			{
				CustomG.Value = Mathf.Clamp(CustomG.Value, 0, 255);
				flag = true;
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Значение G было скорректировано до " + CustomG.Value));
			}
			if (CustomB.Value < 0 || CustomB.Value > 255)
			{
				CustomB.Value = Mathf.Clamp(CustomB.Value, 0, 255);
				flag = true;
				((BaseUnityPlugin)this).Logger.LogWarning((object)("Значение B было скорректировано до " + CustomB.Value));
			}
			if (flag)
			{
				((BaseUnityPlugin)this).Config.Save();
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Конфигурация сохранена с корректными значениями RGB.");
			}
			string value = ColorMode.Value;
			string value2 = StaticColor.Value;
			int value3 = CustomR.Value;
			int value4 = CustomG.Value;
			int value5 = CustomB.Value;
			((BaseUnityPlugin)this).Config.Save();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Конфигурация инициализирована.");
		}
	}
	[HarmonyPatch]
	public static class CrosshairColorPatch
	{
		private static readonly Color defaultCrosshairColor;

		private static Image currentCrosshairImage;

		private static bool wasAimingAtPlayer;

		private static bool searched;

		private static GameObject reticleShootObject;

		static CrosshairColorPatch()
		{
			//IL_0014: Unknown result type (might be due to invalid IL or missing references)
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			defaultCrosshairColor = new Color(0.8742f, 0.8567f, 0.7615f, 1f);
			wasAimingAtPlayer = false;
			searched = false;
			SceneManager.sceneLoaded += OnSceneLoaded;
		}

		private static void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			ResetCrosshairSearch();
		}

		private static void ResetCrosshairSearch()
		{
			currentCrosshairImage = null;
			searched = false;
			reticleShootObject = null;
			wasAimingAtPlayer = false;
			Debug.Log((object)"[RescueClawMod] Состояние сброшено (новая сцена)");
		}

		private static Color GetSelectedColor()
		{
			//IL_01f5: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01fe: Unknown result type (might be due to invalid IL or missing references)
			//IL_0162: Unknown result type (might be due to invalid IL or missing references)
			//IL_0167: Unknown result type (might be due to invalid IL or missing references)
			//IL_01aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_01af: Unknown result type (might be due to invalid IL or missing references)
			//IL_013e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0143: Unknown result type (might be due to invalid IL or missing references)
			//IL_017a: Unknown result type (might be due to invalid IL or missing references)
			//IL_017f: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_0156: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Unknown result type (might be due to invalid IL or missing references)
			//IL_016e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Unknown result type (might be due to invalid IL or missing references)
			//IL_014f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0192: Unknown result type (might be due to invalid IL or missing references)
			//IL_0197: Unknown result type (might be due to invalid IL or missing references)
			if (RescueClawMod.ColorMode.Value == "Static")
			{
				return (Color)(RescueClawMod.StaticColor.Value switch
				{
					"Red" => Color.red, 
					"Green" => Color.green, 
					"Blue" => Color.blue, 
					"Yellow" => Color.yellow, 
					"Cyan" => Color.cyan, 
					"Magenta" => Color.magenta, 
					"Orange" => new Color(1f, 0.5f, 0f), 
					"Purple" => new Color(0.5f, 0f, 0.5f), 
					_ => Color.red, 
				});
			}
			return new Color((float)RescueClawMod.CustomR.Value / 255f, (float)RescueClawMod.CustomG.Value / 255f, (float)RescueClawMod.CustomB.Value / 255f, 1f);
		}

		private static void FindCrosshairImage()
		{
			if (searched)
			{
				return;
			}
			searched = true;
			GUIManager instance = GUIManager.instance;
			if ((Object)(object)instance == (Object)null)
			{
				return;
			}
			FieldInfo field = typeof(GUIManager).GetField("reticleShoot", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			if (field != null)
			{
				object? value = field.GetValue(instance);
				reticleShootObject = (GameObject)((value is GameObject) ? value : null);
				if ((Object)(object)reticleShootObject != (Object)null)
				{
					currentCrosshairImage = reticleShootObject.GetComponentInChildren<Image>();
					if ((Object)(object)currentCrosshairImage != (Object)null)
					{
						Debug.Log((object)"[RescueClawMod] Найден прицел для стрельбы.");
						return;
					}
				}
			}
			if ((Object)(object)instance.reticleDefaultImage != (Object)null)
			{
				currentCrosshairImage = instance.reticleDefaultImage;
				Debug.Log((object)"[RescueClawMod] Использую reticleDefaultImage.");
			}
			else
			{
				Debug.LogWarning((object)"[RescueClawMod] Прицел не найден!");
			}
		}

		private static bool IsHoldingRescueHook()
		{
			Character localCharacter = Character.localCharacter;
			if ((Object)(object)localCharacter == (Object)null)
			{
				return false;
			}
			Item currentItem = localCharacter.data.currentItem;
			if ((Object)(object)currentItem == (Object)null)
			{
				return false;
			}
			return (Object)(object)((Component)currentItem).GetComponent<RescueHook>() != (Object)null;
		}

		private static void ResetCrosshair()
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)currentCrosshairImage != (Object)null)
			{
				((Graphic)currentCrosshairImage).color = defaultCrosshairColor;
			}
			wasAimingAtPlayer = false;
			Debug.Log((object)"[RescueClawMod] Сброс цвета (локальный игрок убрал крюк)");
		}

		[HarmonyPatch(typeof(RescueHook), "GetHit")]
		[HarmonyPostfix]
		public static void AfterGetHit(RescueHook __instance, ref RaycastHit __result)
		{
			//IL_00a2: 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)
			if (!IsHoldingRescueHook())
			{
				return;
			}
			if ((Object)(object)currentCrosshairImage == (Object)null)
			{
				FindCrosshairImage();
			}
			if (!((Object)(object)currentCrosshairImage == (Object)null))
			{
				bool flag = false;
				Character val = default(Character);
				if ((Object)(object)((RaycastHit)(ref __result)).collider != (Object)null && CharacterRagdoll.TryGetCharacterFromCollider(((RaycastHit)(ref __result)).collider, ref val) && (Object)(object)val != (Object)(object)__instance.playerHoldingItem)
				{
					flag = true;
				}
				if (flag != wasAimingAtPlayer)
				{
					wasAimingAtPlayer = flag;
					((Graphic)currentCrosshairImage).color = (flag ? GetSelectedColor() : defaultCrosshairColor);
					Debug.Log((object)(flag ? "[RescueClawMod] Цвет изменён (игрок)" : "[RescueClawMod] Цвет сброшен"));
				}
			}
		}

		[HarmonyPatch(typeof(GUIManager), "OnSlotEquipped")]
		[HarmonyPostfix]
		public static void OnSlotEquippedPostfix(GUIManager __instance)
		{
			//IL_003c: Unknown result type (might be due to invalid IL or missing references)
			if (!IsHoldingRescueHook())
			{
				ResetCrosshair();
			}
			else if (wasAimingAtPlayer)
			{
				wasAimingAtPlayer = false;
				if ((Object)(object)currentCrosshairImage != (Object)null)
				{
					((Graphic)currentCrosshairImage).color = defaultCrosshairColor;
				}
				Debug.Log((object)"[RescueClawMod] Сброс флага при экипировке RescueHook");
			}
		}

		[HarmonyPatch(typeof(GUIManager), "SetReticle")]
		[HarmonyPostfix]
		public static void AfterSetReticle(GUIManager __instance, GameObject activeReticle)
		{
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			if (IsHoldingRescueHook() && !((Object)(object)currentCrosshairImage == (Object)null) && wasAimingAtPlayer && ((Object)(object)activeReticle == (Object)(object)reticleShootObject || ((Object)(object)activeReticle != (Object)null && (Object)(object)activeReticle.GetComponentInChildren<Image>() == (Object)(object)currentCrosshairImage)))
			{
				((Graphic)currentCrosshairImage).color = GetSelectedColor();
				Debug.Log((object)"[RescueClawMod] Восстановлен цвет после SetReticle");
			}
		}

		[HarmonyPatch(typeof(GUIManager), "UpdateReticle")]
		[HarmonyPostfix]
		public static void AfterUpdateReticle(GUIManager __instance)
		{
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			if (IsHoldingRescueHook() && !((Object)(object)currentCrosshairImage == (Object)null) && wasAimingAtPlayer)
			{
				((Graphic)currentCrosshairImage).color = GetSelectedColor();
				Debug.Log((object)"[RescueClawMod] Восстановлен цвет после UpdateReticle");
			}
		}
	}
}