using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Core.Logging.Interpolation; using BepInEx.Logging; using BepInEx.Unity.IL2CPP; using HarmonyLib; using Il2CppInterop.Runtime; using Il2CppInterop.Runtime.InteropTypes; using Il2CppInterop.Runtime.InteropTypes.Arrays; using Microsoft.CodeAnalysis; using SmolMods.Core; using TMPro; using UnityEngine; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] [assembly: AssemblyCompany("smolMods.Crosshair")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+a3231e664cf7d257a8601fb862a89ade69b41d83")] [assembly: AssemblyProduct("smolMods.Crosshair")] [assembly: AssemblyTitle("smolMods.Crosshair")] [assembly: AssemblyVersion("1.0.0.0")] [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 SmolMods.Crosshair { internal static class CrosshairPreviewPanel { internal const float PreviewBaseFontSize = 72f; private static readonly List Previews = new List(); internal static TMP_FontAsset PreviewFont; internal static void Register() { ModSettingsApi.AddPanel(100, (Action)Build); ModSettingsApi.AddMenuTicker((Action)UpdatePreview); } private static void Build(ModPanelContext ctx) { //IL_003b: 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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Expected O, but got Unknown //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_0082: 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_0093: 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) try { GameObject noteGo = ctx.NoteGo; GameObject val = Object.Instantiate(noteGo, noteGo.transform.parent); ((Object)val).name = "ModsCrosshairPreview"; RectTransform component = noteGo.GetComponent(); RectTransform component2 = val.GetComponent(); Vector2 val2 = ctx.NextSlot(new Vector2(380f, 200f), 0f, (float?)150f); if ((Object)(object)component != (Object)null && (Object)(object)component2 != (Object)null) { component2.sizeDelta = new Vector2(Mathf.Max(component.sizeDelta.x, 380f), 200f); component2.anchoredPosition = component.anchoredPosition + val2; } TMP_Text val3 = val.GetComponent() ?? val.GetComponentInChildren(true); if (!((Object)(object)val3 == (Object)null)) { val3.text = "( · )"; val3.fontSize = 72f; val3.alignment = (TextAlignmentOptions)514; val3.enableWordWrapping = false; val3.overflowMode = (TextOverflowModes)0; val3.fontStyle = (FontStyles)0; PreviewFont = val3.font; Previews.Add(val3); ModSettingsApi.RegisterPreviewGraphic((Graphic)(object)val3); ctx.RegisterPanel(val); } } catch (Exception ex) { ManualLogSource logger = Plugin.Logger; if (logger != null) { bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val4 = new BepInExWarningLogInterpolatedStringHandler(35, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val4).AppendLiteral("Crosshair preview creation failed: "); ((BepInExLogInterpolatedStringHandler)val4).AppendFormatted(ex.Message); } logger.LogWarning(val4); } } } private static void UpdatePreview() { //IL_00e3: Unknown result type (might be due to invalid IL or missing references) for (int num = Previews.Count - 1; num >= 0; num--) { TMP_Text val = Previews[num]; if ((Object)(object)val == (Object)null) { Previews.RemoveAt(num); } else if (((Component)val).gameObject.activeInHierarchy) { try { float num2 = Mathf.Clamp((float)CrosshairSizeFeature.CurrentPercent / 100f, 0f, 2f); string text = CrosshairSizeFeature.VanillaCrosshairStyle(); if (text == "off" || num2 <= 0.001f) { val.text = "no crosshair"; val.fontSize = 32.399998f; } else { val.text = ((text == "small") ? "·" : "( · )"); val.fontSize = 72f * num2 * ((text == "small") ? 0.75f : 1f); } val.transform.localScale = Vector3.one; } catch { } } } } } [HarmonyPatch] internal static class CrosshairSizeFeature { private static ModRowDef _row; private static ModRowDef _styleRow; private static readonly Dictionary BaseScales = new Dictionary(); private static TextMeshProUGUI _slickText; private const float SlickBaseFontSize = 72f; private static Image _windupBar; private const float WindupMaxWidth = 220f; private const float WindupHeight = 6f; private static bool _slickMirror; private static float _factorMirror = 1f; private static SettingsHanger _vanillaHanger; private static bool _glyphShown; private static string _glyphText; private static float _glyphSize; private static bool _barShown; private static RectTransform _windupBarRt; private static float _lastBarW = -1f; private const string GlyphFullNormal = "( · )"; private const string GlyphSmallNormal = "·"; private static string _glyphFullOutline = "( o )"; private static string _outlineDot = "o"; private static bool SlickEnabled => _slickMirror; internal static int CurrentPercent { get { ModRowDef row = _row; if (row == null) { return 100; } return row.Value; } } private static float Factor => _factorMirror; internal static void Register() { _row = ModSettingsApi.AddSliderRow(100, "Crosshair size", "settings_mod_crosshairSize", 100, 0, 200, (Action)delegate(int v) { _factorMirror = (float)v / 100f; Apply(); }, (Func)((int v) => $"{v}%")); _styleRow = ModSettingsApi.AddArrayRow(100, "Crosshair style", "settings_mod_crosshairStyle", 0, new int[2] { 0, 1 }, (Func)((int v) => (v != 1) ? "Normal" : "Slick"), (Action)delegate(int v) { _slickMirror = v == 1; Apply(); }, (Func)null); CrosshairPreviewPanel.Register(); ModSettingsApi.AddTicker((Action)TickSlick); } internal static string VanillaCrosshairStyle() { try { SettingsHanger val = _vanillaHanger; if (val == null) { val = (_vanillaHanger = SettingsWardrobe.crosshairHanger); } if (val == null) { return "full"; } return val.value switch { 1 => "small", 2 => "off", _ => "full", }; } catch { return "full"; } } [HarmonyPostfix] [HarmonyPatch(typeof(Crosshair), "OnSettingsChange")] private static void OnSettingsChange_Postfix() { Apply(); } [HarmonyPostfix] [HarmonyPatch(typeof(Crosshair), "SetCrosshairMode")] private static void SetCrosshairMode_Postfix() { Apply(); } internal static void Apply() { //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Expected O, but got Unknown try { Crosshair val; try { val = Crosshair.instance; } catch { val = null; } if (val != null) { bool slickEnabled = SlickEnabled; float factor = (slickEnabled ? 0f : Factor); ScaleTransform(val.crosshairNormal, factor); ScaleTransform(val.crosshairHolding, factor); ScaleTransform((Transform)(object)val.crosshairWindup, factor); ScaleTransform(val.wings, factor); UpdateSlick(val, slickEnabled); } } catch (Exception ex) { ManualLogSource logger = Plugin.Logger; if (logger != null) { bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val2 = new BepInExWarningLogInterpolatedStringHandler(30, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral("Crosshair scale apply failed: "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(ex.Message); } logger.LogWarning(val2); } } } private static void UpdateSlick(Crosshair crosshair, bool slick) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Expected O, but got Unknown try { if (!slick) { if (_glyphShown && (Object)(object)_slickText != (Object)null) { ((Component)_slickText).gameObject.SetActive(false); _glyphShown = false; } } else if (!((Object)(object)_slickText == (Object)null) || CreateSlick(crosshair)) { RefreshSlickVisual(crosshair); } } catch (Exception ex) { ManualLogSource logger = Plugin.Logger; if (logger != null) { bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val = new BepInExWarningLogInterpolatedStringHandler(31, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val).AppendLiteral("Slick crosshair update failed: "); ((BepInExLogInterpolatedStringHandler)val).AppendFormatted(ex.Message); } logger.LogWarning(val); } _slickText = null; _glyphShown = false; _glyphText = null; } } private static TMP_FontAsset FindSlickFont() { if ((Object)(object)CrosshairPreviewPanel.PreviewFont != (Object)null) { return CrosshairPreviewPanel.PreviewFont; } try { Il2CppReferenceArray obj = Resources.FindObjectsOfTypeAll(Il2CppType.Of()); TMP_FontAsset val = null; foreach (Object item in (Il2CppArrayBase)(object)obj) { TMP_FontAsset val2 = ((Il2CppObjectBase)item).TryCast(); if (!((Object)(object)val2 == (Object)null) && ((Object)val2).name != null && ((Object)val2).name.Contains("Courier")) { if (((Object)val2).name.IndexOf("Italic", StringComparison.OrdinalIgnoreCase) < 0) { return val2; } if ((Object)(object)val == (Object)null) { val = val2; } } } return val; } catch { } return null; } internal static void TickSlick() { try { if (!SlickEnabled) { if (_glyphShown) { if ((Object)(object)_slickText != (Object)null) { ((Component)_slickText).gameObject.SetActive(false); } _glyphShown = false; } if (_barShown) { if ((Object)(object)_windupBar != (Object)null) { ((Component)_windupBar).gameObject.SetActive(false); } _barShown = false; } } else { Crosshair val; try { val = Crosshair.instance; } catch { val = null; } if (val != null && (!((Object)(object)_slickText == (Object)null) || CreateSlick(val))) { RefreshSlickVisual(val); TickWindupBar(val); } } } catch { _slickText = null; _windupBar = null; _windupBarRt = null; _glyphShown = false; _glyphText = null; _barShown = false; } } private static void TickWindupBar(Crosshair ch) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Invalid comparison between Unknown and I4 //IL_00ac: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)_windupBar == (Object)null) { return; } if ((int)ch.crosshairMode != 2) { if (_barShown) { ((Component)_windupBar).gameObject.SetActive(false); _barShown = false; } return; } if (!_barShown) { ((Component)_windupBar).gameObject.SetActive(true); _barShown = true; } float num = Mathf.Clamp01(ch.windupPower); float num2 = Mathf.Clamp(Factor, 0.5f, 2f); float num3 = 220f * num2 * num; if ((Object)(object)_windupBarRt != (Object)null && Mathf.Abs(num3 - _lastBarW) > 0.25f) { _windupBarRt.sizeDelta = new Vector2(num3, 6f * num2); _lastBarW = num3; } } private static void RefreshSlickVisual(Crosshair crosshair) { //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Invalid comparison between Unknown and I4 string text = VanillaCrosshairStyle(); float factor = Factor; bool flag = text != "off" && factor > 0.001f; if (_glyphShown != flag) { ((Component)_slickText).gameObject.SetActive(flag); _glyphShown = flag; } if (flag) { bool flag2 = crosshair != null && (int)crosshair.crosshairMode == 1; string text2 = ((!(text == "small")) ? (flag2 ? _glyphFullOutline : "( · )") : (flag2 ? _outlineDot : "·")); if ((object)text2 != _glyphText) { ((TMP_Text)_slickText).text = text2; _glyphText = text2; } float num = 72f * factor * ((text == "small") ? 0.75f : 1f); if (Mathf.Abs(num - _glyphSize) > 0.01f) { ((TMP_Text)_slickText).fontSize = num; _glyphSize = num; } } } private static string PickOutlineDot(TMP_FontAsset font) { char[] array = new char[4] { '◦', '○', '°', 'o' }; for (int i = 0; i < array.Length; i++) { char c = array[i]; try { if ((Object)(object)font != (Object)null && font.HasCharacter(c, false, false)) { return c.ToString(); } } catch { } } return "o"; } private static bool CreateSlick(Crosshair crosshair) { //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Expected O, but got Unknown //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: 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_0094: 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_0067: 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_007f: 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_0178: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_01a2: 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_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) //IL_01f9: Unknown result type (might be due to invalid IL or missing references) try { Transform crosshairNormal = crosshair.crosshairNormal; if ((Object)(object)crosshairNormal == (Object)null || (Object)(object)crosshairNormal.parent == (Object)null) { return false; } GameObject val = new GameObject("crosshair_slick"); val.transform.SetParent(crosshairNormal.parent, false); RectTransform val2 = val.AddComponent(); RectTransform component = ((Component)crosshairNormal).GetComponent(); if ((Object)(object)component != (Object)null) { val2.anchorMin = component.anchorMin; val2.anchorMax = component.anchorMax; val2.pivot = component.pivot; val2.anchoredPosition = component.anchoredPosition; } val2.sizeDelta = new Vector2(400f, 160f); _slickText = val.AddComponent(); ((TMP_Text)_slickText).alignment = (TextAlignmentOptions)514; ((TMP_Text)_slickText).enableWordWrapping = false; ((TMP_Text)_slickText).overflowMode = (TextOverflowModes)0; ((Graphic)_slickText).raycastTarget = false; ((TMP_Text)_slickText).text = "( · )"; ((TMP_Text)_slickText).fontSize = 72f; ((TMP_Text)_slickText).fontStyle = (FontStyles)0; TMP_FontAsset val3 = FindSlickFont(); if ((Object)(object)val3 != (Object)null) { ((TMP_Text)_slickText).font = val3; } _outlineDot = PickOutlineDot(((TMP_Text)_slickText).font); _glyphFullOutline = "( " + _outlineDot + " )"; _glyphShown = true; _glyphText = null; _glyphSize = 72f; _barShown = false; _lastBarW = -1f; GameObject val4 = new GameObject("crosshair_slick_windup"); val4.transform.SetParent(crosshairNormal.parent, false); RectTransform val5 = val4.AddComponent(); val5.anchorMin = val2.anchorMin; val5.anchorMax = val2.anchorMax; val5.pivot = new Vector2(0.5f, 0.5f); val5.anchoredPosition = val2.anchoredPosition + new Vector2(0f, -46f); val5.sizeDelta = new Vector2(0f, 6f); _windupBar = val4.AddComponent(); ((Graphic)_windupBar).raycastTarget = false; _windupBarRt = val5; val4.SetActive(false); ModSettingsApi.RegisterPreviewGraphic((Graphic)(object)_slickText); ModSettingsApi.RegisterPreviewGraphic((Graphic)(object)_windupBar); ManualLogSource logger = Plugin.Logger; if (logger != null) { logger.LogInfo((object)"Slick crosshair created"); } return true; } catch (Exception ex) { ManualLogSource logger2 = Plugin.Logger; if (logger2 != null) { bool flag = default(bool); BepInExWarningLogInterpolatedStringHandler val6 = new BepInExWarningLogInterpolatedStringHandler(33, 1, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val6).AppendLiteral("Slick crosshair creation failed: "); ((BepInExLogInterpolatedStringHandler)val6).AppendFormatted(ex.Message); } logger2.LogWarning(val6); } _slickText = null; return false; } } private static void ScaleTransform(Transform t, float factor) { //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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) if (!((Object)(object)t == (Object)null)) { int instanceID = ((Object)t).GetInstanceID(); if (!BaseScales.TryGetValue(instanceID, out var value)) { value = t.localScale; BaseScales[instanceID] = value; } t.localScale = value * factor; } } } [BepInPlugin("com.smolmods.crosshair", "smolMods.Crosshair", "1.0.2")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class Plugin : BasePlugin { public const string PluginGuid = "com.smolmods.crosshair"; public const string PluginName = "smolMods.Crosshair"; public const string PluginVersion = "1.0.2"; internal static ManualLogSource Logger; public override void Load() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001a: 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_006e: Expected O, but got Unknown Logger = ((BasePlugin)this).Log; CrosshairSizeFeature.Register(); Harmony val = new Harmony("com.smolmods.crosshair"); val.PatchAll(typeof(Plugin).Assembly); int num = 0; foreach (MethodBase patchedMethod in val.GetPatchedMethods()) { _ = patchedMethod; num++; } ManualLogSource log = ((BasePlugin)this).Log; bool flag = default(bool); BepInExInfoLogInterpolatedStringHandler val2 = new BepInExInfoLogInterpolatedStringHandler(27, 3, ref flag); if (flag) { ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("smolMods.Crosshair"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted("1.0.2"); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" loaded, "); ((BepInExLogInterpolatedStringHandler)val2).AppendFormatted(num); ((BepInExLogInterpolatedStringHandler)val2).AppendLiteral(" methods patched."); } log.LogInfo(val2); } } }