Decompiled source of Crosshairs v1.0.1

Mods/Crosshairs.dll

Decompiled 7 hours ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BoneLib;
using BoneLib.BoneMenu;
using HarmonyLib;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppSLZ.Marrow;
using Il2CppSystem;
using MelonLoader;
using MelonLoader.Preferences;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using NEP.Crosshairs;
using NEP.Crosshairs.Data;
using NEP.Crosshairs.Settings;
using NEP.Crosshairs.Skins;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: AssemblyTitle("Crosshairs")]
[assembly: AssemblyCompany("Not Enough Photons")]
[assembly: AssemblyProduct("Crosshairs")]
[assembly: AssemblyCopyright("Developed by Not Enough Photons")]
[assembly: AssemblyTrademark("Not Enough Photons")]
[assembly: AssemblyFileVersion("1.0.1")]
[assembly: MelonInfo(typeof(Core), "Crosshairs", "1.0.1", "Not Enough Photons", "https://bonelab.thunderstore.io/p/NotEnoughPhotons/Crosshairs")]
[assembly: MelonGame("Stress Level Zero", "BONELAB")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.1.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[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 NEP.Crosshairs
{
	public static class BuildInfo
	{
		public const string Name = "Crosshairs";

		public const string Author = "Not Enough Photons";

		public const string Company = "Not Enough Photons";

		public const string Version = "1.0.1";

		public const string DownloadLink = "https://bonelab.thunderstore.io/p/NotEnoughPhotons/Crosshairs";
	}
	public sealed class Crosshair
	{
		private CrosshairSkin m_skin;

		private GameObject m_object;

		private Transform m_art;

		private MeshRenderer m_renderer;

		private Gun m_gun;

		private Transform m_firePoint;

		private bool m_hidden;

		public Vector3 Position => m_object.transform.position;

		public Gun Gun => m_gun;

		public Crosshair(CrosshairSkin skin)
		{
			m_object = Object.Instantiate<GameObject>(DataManager.CrosshairObject);
			m_art = m_object.transform.GetChild(0);
			m_renderer = ((Component)m_art).GetComponent<MeshRenderer>();
			SetSkin(skin);
			Hide();
		}

		public void Update()
		{
			//IL_0050: Unknown result type (might be due to invalid IL or missing references)
			//IL_0062: 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_0077: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: 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_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d2: 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)
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			if (!m_hidden && Object.op_Implicit((Object)(object)m_object) && Object.op_Implicit((Object)(object)m_renderer))
			{
				((Renderer)m_renderer).material.color = new Color(CrosshairSettings.RedColor / 255f, CrosshairSettings.GreenColor / 255f, CrosshairSettings.BlueColor / 255f);
				Ray val = default(Ray);
				((Ray)(ref val))..ctor(m_firePoint.position, m_firePoint.forward);
				RaycastHit val2 = default(RaycastHit);
				if (Physics.Raycast(val, ref val2))
				{
					m_object.transform.position = ((RaycastHit)(ref val2)).point;
				}
				else
				{
					m_object.transform.position = ((Ray)(ref val)).origin + ((Ray)(ref val)).direction * 10f;
				}
				float num = Vector3.Distance(Player.Head.position, Position);
				m_art.localScale = Vector3.one * Mathf.Max(0.25f, num * 0.1f);
			}
		}

		public void SetSkin(CrosshairSkin skin)
		{
			//IL_0033: Unknown result type (might be due to invalid IL or missing references)
			m_skin = skin;
			((Renderer)m_renderer).material.color = new Color(CrosshairSettings.RedColor / 255f, CrosshairSettings.GreenColor / 255f, CrosshairSettings.BlueColor / 255f);
			((Renderer)m_renderer).material.SetTexture("_MainTex", (Texture)(object)m_skin.Texture);
		}

		public void Hide()
		{
			m_object.SetActive(false);
			((Component)m_art).gameObject.SetActive(false);
			m_hidden = true;
		}

		public void Show()
		{
			m_object.SetActive(true);
			((Component)m_art).gameObject.SetActive(true);
			m_hidden = false;
		}

		public void Attach(Gun gun)
		{
			m_gun = gun;
			m_firePoint = m_gun.firePointTransform;
			Show();
		}

		public void Detach()
		{
			m_gun = null;
			Hide();
		}
	}
	public sealed class CrosshairManager
	{
		private List<Crosshair> m_crosshairs;

		public static CrosshairManager Instance { get; private set; }

		public CrosshairManager()
		{
			Instance = this;
		}

		public void Initialize()
		{
			m_crosshairs = new List<Crosshair>();
			CrosshairSkin skin = new CrosshairSkin(DataManager.CrosshairTextures[0]);
			Crosshair item = new Crosshair(skin);
			Crosshair item2 = new Crosshair(skin);
			m_crosshairs.Add(item);
			m_crosshairs.Add(item2);
		}

		public void Update()
		{
			foreach (Crosshair crosshair in m_crosshairs)
			{
				crosshair.Update();
			}
		}

		public void OnGunAttached(Gun gun)
		{
			if (!CrosshairSettings.ShowCrosshair || !IsGunFromLocalPlayer(gun))
			{
				return;
			}
			foreach (Crosshair crosshair in m_crosshairs)
			{
				if (!Object.op_Implicit((Object)(object)crosshair.Gun))
				{
					crosshair.Attach(gun);
					break;
				}
			}
		}

		public void OnGunDetached(Gun gun)
		{
			if (!CrosshairSettings.ShowCrosshair || !IsGunFromLocalPlayer(gun))
			{
				return;
			}
			foreach (Crosshair crosshair in m_crosshairs)
			{
				if (Object.op_Implicit((Object)(object)crosshair.Gun) && (Object)(object)crosshair.Gun == (Object)(object)gun)
				{
					crosshair.Detach();
				}
			}
		}

		public void HideCrosshairs()
		{
			foreach (Crosshair crosshair in m_crosshairs)
			{
				if (Object.op_Implicit((Object)(object)crosshair.Gun))
				{
					crosshair.Hide();
				}
			}
		}

		public void ShowCrosshairs()
		{
			foreach (Crosshair crosshair in m_crosshairs)
			{
				if (Object.op_Implicit((Object)(object)crosshair.Gun))
				{
					crosshair.Show();
				}
			}
		}

		private bool IsGunFromLocalPlayer(Gun gun)
		{
			return ((Object)gun.host.LastGrabbedProxy.root).Equals((Object)(object)((Component)Player.RigManager).gameObject);
		}
	}
	public class Core : MelonMod
	{
		internal static Instance Logger => new Instance("Crosshairs");

		public override void OnInitializeMelon()
		{
			DataManager.LoadBundle();
			DataManager.LoadObjectsFromBundle();
			DataManager.LoadTextures();
			CrosshairSettings.CreateMelonPrefs();
			CrosshairSettings.CreateMenu();
			Hooking.OnLevelLoaded += OnLevelLoaded;
		}

		public override void OnDeinitializeMelon()
		{
			Hooking.OnLevelLoaded -= OnLevelLoaded;
		}

		public void OnLevelLoaded(LevelInfo _)
		{
			new CrosshairManager();
			CrosshairManager.Instance.Initialize();
		}

		public override void OnUpdate()
		{
			if (CrosshairManager.Instance != null)
			{
				CrosshairManager.Instance.Update();
			}
		}
	}
}
namespace NEP.Crosshairs.Settings
{
	public static class CrosshairSettings
	{
		internal static Page m_root;

		internal static Page m_menu;

		internal static Page m_colorMenu;

		internal static FloatElement m_redColor;

		internal static FloatElement m_greenColor;

		internal static FloatElement m_blueColor;

		internal static MelonPreferences_Category m_crosshairsCategory;

		internal static MelonPreferences_Entry<bool> m_showCrosshairEntry;

		internal static MelonPreferences_Entry<float> m_redColorEntry;

		internal static MelonPreferences_Entry<float> m_greenColorEntry;

		internal static MelonPreferences_Entry<float> m_blueColorEntry;

		public static bool ShowCrosshair { get; private set; } = true;

		public static float RedColor { get; private set; } = 255f;

		public static float GreenColor { get; private set; } = 255f;

		public static float BlueColor { get; private set; } = 255f;

		public static void CreateMelonPrefs()
		{
			m_crosshairsCategory = MelonPreferences.CreateCategory("Crosshairs");
			m_redColorEntry = m_crosshairsCategory.CreateEntry<float>("Red", 255f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
			m_greenColorEntry = m_crosshairsCategory.CreateEntry<float>("Green", 255f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
			m_blueColorEntry = m_crosshairsCategory.CreateEntry<float>("Blue", 255f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
			RedColor = m_redColorEntry.Value;
			GreenColor = m_greenColorEntry.Value;
			BlueColor = m_blueColorEntry.Value;
		}

		public static void CreateMenu()
		{
			//IL_000a: 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)
			//IL_0040: 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_008c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_014c: Unknown result type (might be due to invalid IL or missing references)
			m_root = Page.Root.CreatePage("Not Enough Photons", Color.white, 0, true);
			m_menu = m_root.CreatePage("Crosshairs", Color.white, 0, true);
			m_colorMenu = m_menu.CreatePage("Colors", Color.white, 0, true);
			m_menu.CreateBool("Show Crosshairs", Color.white, true, (Action<bool>)SetShowCrosshair);
			m_colorMenu.CreateFunction("Paste From Clipboard", Color.white, (Action)PasteColor);
			m_redColor = m_colorMenu.CreateFloat("Red", Color.red, 255f, 5f, 0f, 255f, (Action<float>)SetRedColor);
			m_greenColor = m_colorMenu.CreateFloat("Green", Color.green, 255f, 5f, 0f, 255f, (Action<float>)SetGreenColor);
			m_blueColor = m_colorMenu.CreateFloat("Blue", Color.blue, 255f, 5f, 0f, 255f, (Action<float>)SetBlueColor);
		}

		public static Color GetHexColor(string input)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b0: 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_00aa: Unknown result type (might be due to invalid IL or missing references)
			if (string.IsNullOrEmpty(input))
			{
				return Color.white;
			}
			if (input[0] == '#')
			{
				_ = Color.white;
				int i = 1;
				int j = 1;
				List<byte> list = new List<byte>();
				for (; i < input.Length; i++)
				{
					for (; j < i + 1; j += 2)
					{
						int num = j;
						int index = num + 1;
						string s = $"{input[num]}{input[index]}";
						list.Add(byte.Parse(s, NumberStyles.HexNumber));
					}
				}
				return new Color((float)(int)list[0], (float)(int)list[1], (float)(int)list[2], 255f);
			}
			return Color.white;
		}

		private static void PasteColor()
		{
			//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_0015: Unknown result type (might be due to invalid IL or missing references)
			Color hexColor = GetHexColor(GUIUtility.systemCopyBuffer);
			SetRedColor(hexColor.r);
			SetGreenColor(hexColor.g);
			SetBlueColor(hexColor.b);
		}

		private static void SetShowCrosshair(bool show)
		{
			ShowCrosshair = show;
			if (show)
			{
				CrosshairManager.Instance.ShowCrosshairs();
			}
			else
			{
				CrosshairManager.Instance.HideCrosshairs();
			}
		}

		private static void SetRedColor(float red)
		{
			RedColor = red;
			m_redColor.Value = RedColor;
			m_redColorEntry.Value = RedColor;
			m_crosshairsCategory.SaveToFile(false);
		}

		private static void SetGreenColor(float green)
		{
			GreenColor = green;
			m_greenColor.Value = GreenColor;
			m_greenColorEntry.Value = GreenColor;
			m_crosshairsCategory.SaveToFile(false);
		}

		private static void SetBlueColor(float blue)
		{
			BlueColor = blue;
			m_blueColor.Value = BlueColor;
			m_blueColorEntry.Value = BlueColor;
			m_crosshairsCategory.SaveToFile(false);
		}
	}
}
namespace NEP.Crosshairs.Patches
{
	[HarmonyPatch(typeof(Gun))]
	[HarmonyPatch("OnTriggerGripAttached")]
	public static class OnGunAttached
	{
		public static void Postfix(Gun __instance)
		{
			CrosshairManager.Instance.OnGunAttached(__instance);
		}
	}
	[HarmonyPatch(typeof(Gun))]
	[HarmonyPatch("OnTriggerGripDetached")]
	public static class OnGunDetached
	{
		public static void Postfix(Gun __instance)
		{
			CrosshairManager.Instance.OnGunDetached(__instance);
		}
	}
}
namespace NEP.Crosshairs.Data
{
	public static class DataManager
	{
		internal static string m_modDirectory = Path.Combine(MelonEnvironment.UserDataDirectory, "Not Enough Photons/Crosshairs");

		internal static string m_textureDirectory = Path.Combine(m_modDirectory, "Textures");

		public static AssetBundle AssetBundle { get; private set; }

		public static GameObject CrosshairObject { get; private set; }

		public static List<Texture2D> CrosshairTextures { get; private set; }

		public static void LoadBundle()
		{
			if (!Directory.Exists(m_modDirectory))
			{
				Directory.CreateDirectory(m_modDirectory);
				Directory.CreateDirectory(m_textureDirectory);
			}
			if (Directory.GetFiles(m_textureDirectory).Length == 0)
			{
				Core.Logger.Warning("No textures found in the directory. You will see a white square as your crosshair.");
			}
			if (!HelperMethods.IsAndroid())
			{
				AssetBundle = HelperMethods.LoadEmbeddedAssetBundle(Assembly.GetExecutingAssembly(), "NEP.Crosshairs.Resources.crosshairs.pcvr");
			}
			else
			{
				AssetBundle = HelperMethods.LoadEmbeddedAssetBundle(Assembly.GetExecutingAssembly(), "NEP.Crosshairs.Resources.crosshairs.quest");
			}
		}

		public static void LoadObjectsFromBundle()
		{
			CrosshairObject = ((Il2CppObjectBase)AssetBundle.LoadAsset("Crosshair")).Cast<GameObject>();
			((Object)CrosshairObject).hideFlags = (HideFlags)32;
			Core.Logger.Msg("Crosshair object loaded successfully.");
		}

		public static void LoadTextures()
		{
			//IL_0052: Unknown result type (might be due to invalid IL or missing references)
			//IL_0059: Expected O, but got Unknown
			CrosshairTextures = new List<Texture2D>();
			string[] files = Directory.GetFiles(m_textureDirectory);
			foreach (string text in files)
			{
				string text2 = text.Substring(m_textureDirectory.Length + 1);
				Core.Logger.Msg(text2);
				if (text2.StartsWith("crosshair_"))
				{
					byte[] array = File.ReadAllBytes(text);
					Texture2D val = new Texture2D(2, 2);
					((Object)val).hideFlags = (HideFlags)32;
					ImageConversion.LoadImage(val, Il2CppStructArray<byte>.op_Implicit(array));
					CrosshairTextures.Add(val);
				}
			}
			((Renderer)((Component)CrosshairObject.transform.GetChild(0)).gameObject.GetComponent<MeshRenderer>()).material.SetTexture("_BaseMap", (Texture)(object)CrosshairTextures[0]);
		}
	}
}
namespace NEP.Crosshairs.Skins
{
	public sealed class CrosshairSkin
	{
		private Texture2D m_texture;

		private Color m_color;

		public Texture2D Texture => m_texture;

		public Color Color => m_color;

		public CrosshairSkin(Texture2D texture)
		{
			//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)
			m_texture = texture;
			m_color = Color.white;
		}

		public CrosshairSkin(Texture2D texture, Color color)
		{
			//IL_000e: 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)
			m_texture = texture;
			m_color = color;
		}
	}
}