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(DataManager.CrosshairObject); m_art = m_object.transform.GetChild(0); m_renderer = ((Component)m_art).GetComponent(); 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 m_crosshairs; public static CrosshairManager Instance { get; private set; } public CrosshairManager() { Instance = this; } public void Initialize() { m_crosshairs = new List(); 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 m_showCrosshairEntry; internal static MelonPreferences_Entry m_redColorEntry; internal static MelonPreferences_Entry m_greenColorEntry; internal static MelonPreferences_Entry 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("Red", 255f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); m_greenColorEntry = m_crosshairsCategory.CreateEntry("Green", 255f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null); m_blueColorEntry = m_crosshairsCategory.CreateEntry("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)SetShowCrosshair); m_colorMenu.CreateFunction("Paste From Clipboard", Color.white, (Action)PasteColor); m_redColor = m_colorMenu.CreateFloat("Red", Color.red, 255f, 5f, 0f, 255f, (Action)SetRedColor); m_greenColor = m_colorMenu.CreateFloat("Green", Color.green, 255f, 5f, 0f, 255f, (Action)SetGreenColor); m_blueColor = m_colorMenu.CreateFloat("Blue", Color.blue, 255f, 5f, 0f, 255f, (Action)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 list = new List(); 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 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(); ((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(); 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.op_Implicit(array)); CrosshairTextures.Add(val); } } ((Renderer)((Component)CrosshairObject.transform.GetChild(0)).gameObject.GetComponent()).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; } } }