Decompiled source of NachoAchievementsGlobalSave v2.3.1
NachoAchievementsGlobalSave.dll
Decompiled 3 days ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; 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 TMPro; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.InputSystem.Controls; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyCompany("NachoAchievementsGlobalSave")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Global Save Addon for NachoAchievements")] [assembly: AssemblyFileVersion("1.0.5.0")] [assembly: AssemblyInformationalVersion("1.0.5")] [assembly: AssemblyProduct("NachoAchievementsGlobalSave")] [assembly: AssemblyTitle("NachoAchievementsGlobalSave")] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.5.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; } } [AttributeUsage(AttributeTargets.Assembly, AllowMultiple = true)] internal sealed class IgnoresAccessChecksToAttribute : Attribute { public IgnoresAccessChecksToAttribute(string assemblyName) { } } } namespace NachoAchievementsGlobalSave { public static class AchievementPopupPatches { private static GameObject _popupContainer = null; private const float POPUP_DURATION = 4f; private const float SLIDE_DURATION = 0.4f; private static readonly Color POPUP_BG_COLOR = new Color(0.05f, 0.05f, 0.08f, 0.95f); private static readonly Color GOLD_COLOR = new Color(1f, 0.85f, 0.2f, 1f); private static int _currentBadgeIndex = -1; private static Queue<string> _popupQueue = new Queue<string>(); private static bool _isShowingPopup = false; private static float _nextPopupDelay = 0f; private static int FindBadgeIndex(string achievementKey) { try { if (AccessTools.Field(AccessTools.TypeByName("NachoAchievements.NachoAchievements"), "Achievements")?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary) { int num = 1; foreach (string key in dictionary.Keys) { if (key == achievementKey) { GlobalSavePlugin.Logger.LogInfo((object)$"Found badge index {num} for achievement key: {achievementKey}"); return num; } num++; } } GlobalSavePlugin.Logger.LogWarning((object)("Badge not found for achievement key: " + achievementKey)); } catch (Exception ex) { GlobalSavePlugin.Logger.LogError((object)("FindBadgeIndex error: " + ex.Message)); } return -1; } private static string GetAchievementName(string achievementKey) { try { if (AccessTools.Field(AccessTools.TypeByName("NachoAchievements.NachoAchievements"), "Achievements")?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary && dictionary.ContainsKey(achievementKey)) { Dictionary<string, string> dictionary2 = dictionary[achievementKey]; if (dictionary2.ContainsKey("name")) { return dictionary2["name"]; } } } catch { } return achievementKey; } public static bool CreateEnhancedAchievementPopup(string text) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown try { if (_isShowingPopup && (Object)_popupContainer != (Object)null) { _popupQueue.Enqueue(text); GlobalSavePlugin.Logger.LogInfo((object)$"Achievement queued: {text} (Queue size: {_popupQueue.Count})"); SetOriginalFields(); return false; } ShowPopup(text); return false; } catch (Exception arg) { GlobalSavePlugin.Logger.LogError((object)$"Enhanced popup failed: {arg}"); return true; } } private static void ShowPopup(string achievementKey) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown //IL_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Expected O, but got Unknown //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Expected O, but got Unknown try { CleanupPopup(); _isShowingPopup = true; _currentBadgeIndex = FindBadgeIndex(achievementKey); string achievementName = GetAchievementName(achievementKey); Type type = AccessTools.TypeByName("NachoAchievements.NachoAchievements"); FieldInfo fieldInfo = AccessTools.Field(type, "AchievementsCanvas"); object obj = fieldInfo?.GetValue(null); Canvas val = (Canvas)((obj is Canvas) ? obj : null); if ((Object)val == (Object)null) { AccessTools.Method(type, "CreateAchievementsCanvas", (Type[])null, (Type[])null)?.Invoke(null, null); object obj2 = fieldInfo?.GetValue(null); val = (Canvas)((obj2 is Canvas) ? obj2 : null); } if ((Object)val == (Object)null) { _isShowingPopup = false; return; } CreatePopupUI(val, achievementName); PlayAchievementSound(); AccessTools.Field(type, "destroyTimer")?.SetValue(null, 0f); SetOriginalFields(); StartPopupAnimation(); GlobalSavePlugin.Logger.LogInfo((object)("Showing popup for: " + achievementKey + " (" + achievementName + ")")); } catch (Exception arg) { GlobalSavePlugin.Logger.LogError((object)$"ShowPopup failed: {arg}"); _isShowingPopup = false; } } private static void SetOriginalFields() { //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown try { Type type = AccessTools.TypeByName("NachoAchievements.NachoAchievements"); FieldInfo fieldInfo = AccessTools.Field(type, "achievementGetText"); FieldInfo fieldInfo2 = AccessTools.Field(type, "achievementGetTextSubtitle"); if ((Object)_popupContainer != (Object)null) { fieldInfo?.SetValue(null, _popupContainer); fieldInfo2?.SetValue(null, _popupContainer); } } catch { } } public static void OnPopupComplete() { _isShowingPopup = false; _popupContainer = null; if (_popupQueue.Count > 0) { string text = _popupQueue.Dequeue(); GlobalSavePlugin.Logger.LogInfo((object)$"Showing next queued popup: {text} (Remaining: {_popupQueue.Count})"); ShowPopup(text); } } private static void CreatePopupUI(Canvas canvas, string achievementName) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown //IL_003a: 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_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: 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_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Unknown result type (might be due to invalid IL or missing references) //IL_01d5: 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_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0219: Unknown result type (might be due to invalid IL or missing references) //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_0238: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_02a2: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Unknown result type (might be due to invalid IL or missing references) //IL_02bd: Unknown result type (might be due to invalid IL or missing references) //IL_02d2: Unknown result type (might be due to invalid IL or missing references) //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_02fc: Unknown result type (might be due to invalid IL or missing references) //IL_0310: Unknown result type (might be due to invalid IL or missing references) //IL_0325: Unknown result type (might be due to invalid IL or missing references) //IL_032a: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Unknown result type (might be due to invalid IL or missing references) //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_0388: Unknown result type (might be due to invalid IL or missing references) //IL_039d: Unknown result type (might be due to invalid IL or missing references) //IL_03b2: Unknown result type (might be due to invalid IL or missing references) //IL_03c7: Unknown result type (might be due to invalid IL or missing references) //IL_03db: Unknown result type (might be due to invalid IL or missing references) //IL_03ea: Unknown result type (might be due to invalid IL or missing references) //IL_03ef: Unknown result type (might be due to invalid IL or missing references) //IL_0405: Unknown result type (might be due to invalid IL or missing references) //IL_042f: Unknown result type (might be due to invalid IL or missing references) //IL_0449: Unknown result type (might be due to invalid IL or missing references) //IL_045e: Unknown result type (might be due to invalid IL or missing references) //IL_0473: Unknown result type (might be due to invalid IL or missing references) //IL_0488: Unknown result type (might be due to invalid IL or missing references) //IL_049c: Unknown result type (might be due to invalid IL or missing references) //IL_04ab: Unknown result type (might be due to invalid IL or missing references) //IL_04b1: Expected O, but got Unknown //IL_04e1: Unknown result type (might be due to invalid IL or missing references) //IL_04fc: Unknown result type (might be due to invalid IL or missing references) //IL_0511: Unknown result type (might be due to invalid IL or missing references) //IL_0526: Unknown result type (might be due to invalid IL or missing references) //IL_053b: Unknown result type (might be due to invalid IL or missing references) //IL_054f: Unknown result type (might be due to invalid IL or missing references) //IL_055e: Unknown result type (might be due to invalid IL or missing references) //IL_0563: Unknown result type (might be due to invalid IL or missing references) //IL_0575: Unknown result type (might be due to invalid IL or missing references) //IL_057b: Unknown result type (might be due to invalid IL or missing references) //IL_0585: Unknown result type (might be due to invalid IL or missing references) //IL_0596: Unknown result type (might be due to invalid IL or missing references) //IL_05ab: Unknown result type (might be due to invalid IL or missing references) //IL_05c0: Unknown result type (might be due to invalid IL or missing references) //IL_05cb: Unknown result type (might be due to invalid IL or missing references) //IL_05d5: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) _popupContainer = new GameObject("EnhancedAchievementPopup"); _popupContainer.transform.SetParent(((Component)canvas).transform, false); RectTransform obj = _popupContainer.AddComponent<RectTransform>(); obj.anchorMin = new Vector2(0.5f, 1f); obj.anchorMax = new Vector2(0.5f, 1f); obj.pivot = new Vector2(0.5f, 1f); obj.anchoredPosition = new Vector2(0f, 200f); obj.sizeDelta = new Vector2(700f, 140f); GameObject val = new GameObject("Background"); val.transform.SetParent(_popupContainer.transform, false); ((Graphic)val.AddComponent<Image>()).color = POPUP_BG_COLOR; RectTransform component = val.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.sizeDelta = Vector2.zero; component.anchoredPosition = Vector2.zero; Outline obj2 = val.AddComponent<Outline>(); ((Shadow)obj2).effectColor = GOLD_COLOR; ((Shadow)obj2).effectDistance = new Vector2(3f, 3f); GameObject val2 = new GameObject("TopLine"); val2.transform.SetParent(_popupContainer.transform, false); ((Graphic)val2.AddComponent<Image>()).color = GOLD_COLOR; RectTransform component2 = val2.GetComponent<RectTransform>(); component2.anchorMin = new Vector2(0f, 1f); component2.anchorMax = new Vector2(1f, 1f); component2.pivot = new Vector2(0.5f, 1f); component2.sizeDelta = new Vector2(0f, 4f); component2.anchoredPosition = Vector2.zero; GameObject val3 = new GameObject("BottomLine"); val3.transform.SetParent(_popupContainer.transform, false); ((Graphic)val3.AddComponent<Image>()).color = GOLD_COLOR; RectTransform component3 = val3.GetComponent<RectTransform>(); component3.anchorMin = new Vector2(0f, 0f); component3.anchorMax = new Vector2(1f, 0f); component3.pivot = new Vector2(0.5f, 0f); component3.sizeDelta = new Vector2(0f, 4f); component3.anchoredPosition = Vector2.zero; GameObject val4 = new GameObject("TrophyIcon"); val4.transform.SetParent(_popupContainer.transform, false); Image val5 = val4.AddComponent<Image>(); if (_currentBadgeIndex > 0 && MenuPatches.HasBadgeSprite(_currentBadgeIndex)) { val5.sprite = MenuPatches.GetBadgeSprite(_currentBadgeIndex); val5.preserveAspect = true; ((Graphic)val5).color = Color.white; } else { ((Graphic)val5).color = GOLD_COLOR; } RectTransform component4 = val4.GetComponent<RectTransform>(); component4.anchorMin = new Vector2(0f, 0.5f); component4.anchorMax = new Vector2(0f, 0.5f); component4.pivot = new Vector2(0f, 0.5f); component4.anchoredPosition = new Vector2(25f, 0f); component4.sizeDelta = new Vector2(90f, 90f); val4.AddComponent<BadgeBounceAnimator>(); GameObject val6 = new GameObject("Title"); val6.transform.SetParent(_popupContainer.transform, false); TextMeshProUGUI obj3 = val6.AddComponent<TextMeshProUGUI>(); ((TMP_Text)obj3).text = "★ 도전과제 달성! ★"; ((TMP_Text)obj3).fontSize = 28f; ((TMP_Text)obj3).fontStyle = (FontStyles)1; ((TMP_Text)obj3).alignment = (TextAlignmentOptions)513; ((Graphic)obj3).color = GOLD_COLOR; RectTransform component5 = val6.GetComponent<RectTransform>(); component5.anchorMin = new Vector2(0f, 0.5f); component5.anchorMax = new Vector2(1f, 1f); component5.pivot = new Vector2(0f, 0.5f); component5.anchoredPosition = new Vector2(120f, -15f); component5.sizeDelta = new Vector2(-140f, 50f); GameObject val7 = new GameObject("AchievementName"); val7.transform.SetParent(_popupContainer.transform, false); TextMeshProUGUI obj4 = val7.AddComponent<TextMeshProUGUI>(); ((TMP_Text)obj4).text = achievementName; ((TMP_Text)obj4).fontSize = 24f; ((TMP_Text)obj4).fontStyle = (FontStyles)0; ((TMP_Text)obj4).alignment = (TextAlignmentOptions)513; ((Graphic)obj4).color = Color.white; RectTransform component6 = val7.GetComponent<RectTransform>(); component6.anchorMin = new Vector2(0f, 0f); component6.anchorMax = new Vector2(1f, 0.5f); component6.pivot = new Vector2(0f, 0.5f); component6.anchoredPosition = new Vector2(120f, 15f); component6.sizeDelta = new Vector2(-140f, 50f); GameObject val8 = new GameObject("ProgressBg"); val8.transform.SetParent(_popupContainer.transform, false); ((Graphic)val8.AddComponent<Image>()).color = new Color(0.2f, 0.2f, 0.2f, 1f); RectTransform component7 = val8.GetComponent<RectTransform>(); component7.anchorMin = new Vector2(0f, 0f); component7.anchorMax = new Vector2(1f, 0f); component7.pivot = new Vector2(0f, 0f); component7.anchoredPosition = new Vector2(0f, 4f); component7.sizeDelta = new Vector2(0f, 3f); GameObject val9 = new GameObject("ProgressFill"); val9.transform.SetParent(val8.transform, false); ((Graphic)val9.AddComponent<Image>()).color = GOLD_COLOR; RectTransform component8 = val9.GetComponent<RectTransform>(); component8.anchorMin = new Vector2(0f, 0f); component8.anchorMax = new Vector2(1f, 1f); component8.pivot = new Vector2(0f, 0.5f); component8.anchoredPosition = Vector2.zero; component8.sizeDelta = Vector2.zero; val9.AddComponent<PopupProgressAnimator>().duration = 4f; } private static void PlayAchievementSound() { //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Expected O, but got Unknown try { Type type = AccessTools.TypeByName("HUDManager"); object obj = AccessTools.Property(type, "Instance")?.GetValue(null); if (obj != null) { FieldInfo fieldInfo = AccessTools.Field(type, "UIAudio"); FieldInfo fieldInfo2 = AccessTools.Field(type, "levelIncreaseSFX"); object obj2 = fieldInfo?.GetValue(obj); AudioSource val = (AudioSource)((obj2 is AudioSource) ? obj2 : null); object obj3 = fieldInfo2?.GetValue(obj); AudioClip val2 = (AudioClip)((obj3 is AudioClip) ? obj3 : null); if ((Object)(object)val != (Object)null) { val.PlayOneShot(val2); } } } catch { } } private static void StartPopupAnimation() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown if (!((Object)_popupContainer == (Object)null)) { PopupAnimator popupAnimator = _popupContainer.AddComponent<PopupAnimator>(); popupAnimator.slideInDuration = 0.4f; popupAnimator.displayDuration = 4f; popupAnimator.slideOutDuration = 0.4f; popupAnimator.targetY = -20f; popupAnimator.startY = 200f; } } private static void CleanupPopup() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown if ((Object)_popupContainer != (Object)null) { Object.Destroy((Object)_popupContainer); _popupContainer = null; } } } public class BadgeBounceAnimator : MonoBehaviour { public float bounceDuration = 0.6f; public float bounceScale = 1.3f; public float rotationAmount = 15f; private float _timer; private RectTransform _rect; private Vector3 _originalScale; private bool _animationComplete; private void Start() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) _rect = ((Component)this).GetComponent<RectTransform>(); _originalScale = ((Transform)_rect).localScale; ((Transform)_rect).localScale = Vector3.zero; } private void Update() { //IL_00f2: 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) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) if (!_animationComplete) { _timer += Time.deltaTime; float num = Mathf.Clamp01(_timer / bounceDuration); if (num < 0.5f) { float num2 = num * 2f; float num3 = EaseOutBack(num2) * bounceScale; float num4 = Mathf.Sin(num2 * MathF.PI) * rotationAmount; ((Transform)_rect).localScale = _originalScale * num3; ((Transform)_rect).localRotation = Quaternion.Euler(0f, 0f, num4); } else { float num5 = (num - 0.5f) * 2f; float num6 = Mathf.Lerp(bounceScale, 1f, EaseOutBounce(num5)); float num7 = Mathf.Sin((1f - num5) * MathF.PI * 0.5f) * rotationAmount * 0.3f; ((Transform)_rect).localScale = _originalScale * num6; ((Transform)_rect).localRotation = Quaternion.Euler(0f, 0f, num7); } if (num >= 1f) { _animationComplete = true; ((Transform)_rect).localScale = _originalScale; ((Transform)_rect).localRotation = Quaternion.identity; } } } private float EaseOutBack(float t) { return 1f + 2.70158f * Mathf.Pow(t - 1f, 3f) + 1.70158f * Mathf.Pow(t - 1f, 2f); } private float EaseOutBounce(float t) { if (t < 0.36363637f) { return 7.5625f * t * t; } if (t < 0.72727275f) { return 7.5625f * (t -= 0.54545456f) * t + 0.75f; } if (t < 0.90909094f) { return 7.5625f * (t -= 0.8181818f) * t + 0.9375f; } return 7.5625f * (t -= 21f / 22f) * t + 63f / 64f; } } public static class DebugMenu { private static GameObject _debugMenuObject = null; private static bool _isVisible = false; private static List<string> _logMessages = new List<string>(); private const int MAX_LOG_LINES = 10; private static readonly ulong[] AUTHORIZED_STEAM_IDS = new ulong[1] { 76561198109960444uL }; public static bool IsAuthorizedUser() { ulong cachedSteamId = GlobalSavePlugin.CachedSteamId; ulong[] aUTHORIZED_STEAM_IDS = AUTHORIZED_STEAM_IDS; foreach (ulong num in aUTHORIZED_STEAM_IDS) { if (cachedSteamId == num) { return true; } } return false; } public static void ToggleDebugMenu() { if (_isVisible) { CloseDebugMenu(); } else { OpenDebugMenu(); } } public static void OpenDebugMenu() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Expected O, but got Unknown //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00ec: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_01f7: Unknown result type (might be due to invalid IL or missing references) //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_023c: Unknown result type (might be due to invalid IL or missing references) //IL_0243: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_02b7: Unknown result type (might be due to invalid IL or missing references) //IL_02c2: Unknown result type (might be due to invalid IL or missing references) //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_0306: Unknown result type (might be due to invalid IL or missing references) //IL_0311: Unknown result type (might be due to invalid IL or missing references) //IL_0318: Unknown result type (might be due to invalid IL or missing references) if (!((Object)_debugMenuObject != (Object)null)) { _isVisible = true; _logMessages.Clear(); AddLog("디버그 메뉴 열림 (F9로 닫기)"); Canvas val = Object.FindObjectOfType<Canvas>(); if ((Object)val == (Object)null) { GameObject val2 = new GameObject("DebugCanvas"); val = val2.AddComponent<Canvas>(); val.renderMode = (RenderMode)0; val.sortingOrder = 9999; val2.AddComponent<CanvasScaler>(); val2.AddComponent<GraphicRaycaster>(); } _debugMenuObject = new GameObject("DebugMenu"); _debugMenuObject.transform.SetParent(((Component)val).transform, false); RectTransform obj = _debugMenuObject.AddComponent<RectTransform>(); obj.anchorMin = new Vector2(0f, 0f); obj.anchorMax = new Vector2(0.4f, 1f); obj.pivot = new Vector2(0f, 0.5f); obj.offsetMin = new Vector2(10f, 10f); obj.offsetMax = new Vector2(-10f, -10f); ((Graphic)_debugMenuObject.AddComponent<Image>()).color = new Color(0.1f, 0.1f, 0.15f, 0.95f); CreateLabel(_debugMenuObject.transform, "=== 디버그 메뉴 (F9) ===", new Vector2(0.5f, 1f), new Vector2(0f, -20f), 24, Color.yellow); float num = -60f; CreateLabel(_debugMenuObject.transform, $"Steam ID: {GlobalSavePlugin.CachedSteamId}", new Vector2(0f, 1f), new Vector2(20f, num), 16, Color.white); num -= 25f; CreateLabel(_debugMenuObject.transform, $"Initialized: {GlobalSavePlugin.IsInitialized}", new Vector2(0f, 1f), new Vector2(20f, num), 16, Color.white); num -= 25f; CreateLabel(_debugMenuObject.transform, $"Badge Count: {MenuPatches.GetBadgeCount()}", new Vector2(0f, 1f), new Vector2(20f, num), 16, Color.white); num -= 40f; string[] array = new string[8] { "[1] 팝업 테스트 (첫번째 도전과제)", "[2] 팝업 테스트 (랜덤 도전과제)", "[3] 연속 팝업 테스트 (3개)", "[4] 뱃지 로드 상태 확인", "[5] 도전과제 목록 출력", "[6] 모든 도전과제 완료 처리", "[7] 모든 도전과제 초기화", "[8] 도전과제 메뉴 열기" }; for (int i = 0; i < array.Length; i++) { CreateLabel(_debugMenuObject.transform, array[i], new Vector2(0f, 1f), new Vector2(20f, num), 18, Color.cyan); num -= 30f; } num -= 20f; CreateLabel(_debugMenuObject.transform, "--- 로그 ---", new Vector2(0f, 1f), new Vector2(20f, num), 16, Color.gray); _debugMenuObject.AddComponent<DebugMenuUpdater>().Initialize(); GlobalSavePlugin.Logger.LogInfo((object)"Debug menu opened."); } } public static void CloseDebugMenu() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown if ((Object)_debugMenuObject != (Object)null) { Object.Destroy((Object)_debugMenuObject); _debugMenuObject = null; } _isVisible = false; GlobalSavePlugin.Logger.LogInfo((object)"Debug menu closed."); } private static void CreateLabel(Transform parent, string text, Vector2 anchor, Vector2 position, int fontSize, Color color) { //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_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001e: 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_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("Label"); val.transform.SetParent(parent, false); RectTransform obj = val.AddComponent<RectTransform>(); obj.anchorMin = anchor; obj.anchorMax = anchor; obj.pivot = anchor; obj.anchoredPosition = position; obj.sizeDelta = new Vector2(500f, 30f); TextMeshProUGUI obj2 = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)obj2).text = text; ((TMP_Text)obj2).fontSize = fontSize; ((Graphic)obj2).color = color; ((TMP_Text)obj2).alignment = (TextAlignmentOptions)513; } public static void AddLog(string message) { _logMessages.Add($"[{DateTime.Now:HH:mm:ss}] {message}"); if (_logMessages.Count > 10) { _logMessages.RemoveAt(0); } GlobalSavePlugin.Logger.LogInfo((object)("[DebugMenu] " + message)); } public static string GetLogText() { return string.Join("\n", _logMessages); } public static void ExecuteCommand(int command) { switch (command) { case 1: TestPopupFirst(); break; case 2: TestPopupRandom(); break; case 3: TestMultiplePopups(); break; case 4: CheckBadgeStatus(); break; case 5: ListAchievements(); break; case 6: CompleteAllAchievements(); break; case 7: ResetAllAchievements(); break; case 8: OpenAchievementMenu(); break; } } private static void TestPopupFirst() { try { if (GlobalSavePlugin.AchievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary && dictionary.Count > 0) { string text = dictionary.Keys.First(); AddLog("팝업 테스트: " + text); AchievementPopupPatches.CreateEnhancedAchievementPopup(text); } else { AddLog("도전과제 없음!"); } } catch (Exception ex) { AddLog("에러: " + ex.Message); } } private static void TestPopupRandom() { try { if (GlobalSavePlugin.AchievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary && dictionary.Count > 0) { List<string> list = dictionary.Keys.ToList(); string text = list[Random.Range(0, list.Count)]; AddLog("팝업 테스트: " + text); AchievementPopupPatches.CreateEnhancedAchievementPopup(text); } else { AddLog("도전과제 없음!"); } } catch (Exception ex) { AddLog("에러: " + ex.Message); } } private static void TestMultiplePopups() { try { if (GlobalSavePlugin.AchievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary && dictionary.Count >= 3) { List<string> list = dictionary.Keys.ToList(); AddLog("연속 팝업 테스트 (3개):"); for (int i = 0; i < 3 && i < list.Count; i++) { AddLog(" → " + list[i]); AchievementPopupPatches.CreateEnhancedAchievementPopup(list[i]); } } else { AddLog("도전과제가 3개 미만!"); } } catch (Exception ex) { AddLog("에러: " + ex.Message); } } private static void CheckBadgeStatus() { try { int badgeCount = MenuPatches.GetBadgeCount(); AddLog($"로드된 뱃지: {badgeCount}개"); for (int i = 1; i <= Math.Min(5, badgeCount); i++) { AddLog(string.Format(" 뱃지 {0}: {1}", i, MenuPatches.HasBadgeSprite(i) ? "OK" : "없음")); } } catch (Exception ex) { AddLog("에러: " + ex.Message); } } private static void ListAchievements() { try { if (!(GlobalSavePlugin.AchievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary)) { return; } AddLog($"총 {dictionary.Count}개 도전과제:"); int num = 0; foreach (KeyValuePair<string, Dictionary<string, string>> item in dictionary) { if (num >= 5) { AddLog($" ... 외 {dictionary.Count - 5}개"); break; } string arg = (item.Value.ContainsKey("name") ? item.Value["name"] : item.Key); string arg2 = (item.Value.ContainsKey("completed") ? item.Value["completed"] : "?"); AddLog($" {num + 1}. {arg} [{arg2}]"); num++; } } catch (Exception ex) { AddLog("에러: " + ex.Message); } } private static void CompleteAllAchievements() { try { if (!(GlobalSavePlugin.AchievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary)) { return; } int num = 0; foreach (KeyValuePair<string, Dictionary<string, string>> item in dictionary) { if (item.Value.ContainsKey("completed")) { item.Value["completed"] = "True"; num++; } if (item.Value.ContainsKey("progress") && item.Value.ContainsKey("count")) { item.Value["progress"] = item.Value["count"]; } } AddLog($"{num}개 도전과제 완료 처리!"); AccessTools.Method(AccessTools.TypeByName("NachoAchievements.NachoAchievements"), "WriteAchievements", (Type[])null, (Type[])null)?.Invoke(null, null); } catch (Exception ex) { AddLog("에러: " + ex.Message); } } private static void ResetAllAchievements() { try { GlobalSavePlugin.ResetAchievementsInMemory(); AddLog("모든 도전과제 초기화됨!"); } catch (Exception ex) { AddLog("에러: " + ex.Message); } } private static void OpenAchievementMenu() { try { CloseDebugMenu(); AccessTools.Method(AccessTools.TypeByName("NachoAchievements.NachoAchievements"), "CreateAchievementCards", (Type[])null, (Type[])null)?.Invoke(null, null); AddLog("도전과제 메뉴 열기 시도"); } catch (Exception ex) { AddLog("에러: " + ex.Message); } } } public class DebugMenuUpdater : MonoBehaviour { private TextMeshProUGUI _logText; private float _keyDelay; public void Initialize() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0058: 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_0081: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) GameObject val = new GameObject("LogText"); val.transform.SetParent(((Component)this).transform, false); RectTransform obj = val.AddComponent<RectTransform>(); obj.anchorMin = new Vector2(0f, 0f); obj.anchorMax = new Vector2(1f, 0.4f); obj.pivot = new Vector2(0.5f, 0f); obj.offsetMin = new Vector2(20f, 20f); obj.offsetMax = new Vector2(-20f, -10f); _logText = val.AddComponent<TextMeshProUGUI>(); ((TMP_Text)_logText).fontSize = 14f; ((Graphic)_logText).color = Color.green; ((TMP_Text)_logText).alignment = (TextAlignmentOptions)257; } private void Update() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown if ((Object)_logText != (Object)null) { ((TMP_Text)_logText).text = DebugMenu.GetLogText(); } _keyDelay -= Time.deltaTime; if (_keyDelay > 0f || Keyboard.current == null) { return; } for (int i = 1; i <= 8; i++) { if (i switch { 1 => ((ButtonControl)Keyboard.current.digit1Key).wasPressedThisFrame || ((ButtonControl)Keyboard.current.numpad1Key).wasPressedThisFrame, 2 => ((ButtonControl)Keyboard.current.digit2Key).wasPressedThisFrame || ((ButtonControl)Keyboard.current.numpad2Key).wasPressedThisFrame, 3 => ((ButtonControl)Keyboard.current.digit3Key).wasPressedThisFrame || ((ButtonControl)Keyboard.current.numpad3Key).wasPressedThisFrame, 4 => ((ButtonControl)Keyboard.current.digit4Key).wasPressedThisFrame || ((ButtonControl)Keyboard.current.numpad4Key).wasPressedThisFrame, 5 => ((ButtonControl)Keyboard.current.digit5Key).wasPressedThisFrame || ((ButtonControl)Keyboard.current.numpad5Key).wasPressedThisFrame, 6 => ((ButtonControl)Keyboard.current.digit6Key).wasPressedThisFrame || ((ButtonControl)Keyboard.current.numpad6Key).wasPressedThisFrame, 7 => ((ButtonControl)Keyboard.current.digit7Key).wasPressedThisFrame || ((ButtonControl)Keyboard.current.numpad7Key).wasPressedThisFrame, 8 => ((ButtonControl)Keyboard.current.digit8Key).wasPressedThisFrame || ((ButtonControl)Keyboard.current.numpad8Key).wasPressedThisFrame, _ => false, }) { DebugMenu.ExecuteCommand(i); _keyDelay = 0.3f; break; } } } } [BepInPlugin("mine9289.nachoachievementsglobalsave", "NachoAchievementsGlobalSave", "2.3.1")] [BepInDependency(/*Could not decode attribute arguments.*/)] public class GlobalSavePlugin : BaseUnityPlugin { public const string GUID = "mine9289.nachoachievementsglobalsave"; public const string NAME = "NachoAchievementsGlobalSave"; public const string VERSION = "2.3.1"; private const string RESET_VERSION = "2.0.3"; private const string VersionKey = "NachoGlobalSave_Version"; internal static ManualLogSource Logger; private static Harmony _harmony; internal static FieldInfo AchievementsField; internal static MethodInfo ES3SaveMethod; internal static MethodInfo ES3LoadMethod; internal static MethodInfo ES3KeyExistsMethod; internal static MethodInfo ES3DeleteKeyMethod; internal static ulong CachedSteamId; internal static bool IsInitialized; private const string SaveFileName = "LCGeneralSaveData"; private void Awake() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001a: Expected O, but got Unknown //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Expected O, but got Unknown //IL_02c9: Unknown result type (might be due to invalid IL or missing references) //IL_02d6: Expected O, but got Unknown //IL_0338: Unknown result type (might be due to invalid IL or missing references) //IL_0345: Expected O, but got Unknown //IL_03fe: Unknown result type (might be due to invalid IL or missing references) //IL_040c: Expected O, but got Unknown //IL_03a7: Unknown result type (might be due to invalid IL or missing references) //IL_03b4: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; _harmony = new Harmony("NachoAchievementsGlobalSave"); Logger.LogInfo((object)"Initializing Global Save Add-on v2.3.0 (Steam ID Mode)..."); Type type = AccessTools.TypeByName("NachoAchievements.NachoAchievements"); if (type == null) { Logger.LogError((object)"Could not find NachoAchievements. Is the mod installed?"); return; } AchievementsField = AccessTools.Field(type, "Achievements"); Type type2 = AccessTools.TypeByName("ES3"); if (type2 != null) { foreach (MethodInfo declaredMethod in AccessTools.GetDeclaredMethods(type2)) { ParameterInfo[] parameters = declaredMethod.GetParameters(); if (declaredMethod.Name == "Save" && declaredMethod.IsGenericMethod && parameters.Length == 3 && parameters[2].ParameterType == typeof(string)) { ES3SaveMethod = declaredMethod; } if (declaredMethod.Name == "Load" && declaredMethod.IsGenericMethod && parameters.Length == 3 && parameters[1].ParameterType == typeof(string) && parameters[2].ParameterType.IsGenericParameter) { ES3LoadMethod = declaredMethod; } if (declaredMethod.Name == "KeyExists" && !declaredMethod.IsGenericMethod && parameters.Length == 2 && parameters[0].ParameterType == typeof(string) && parameters[1].ParameterType == typeof(string)) { ES3KeyExistsMethod = declaredMethod; } if (declaredMethod.Name == "DeleteKey" && !declaredMethod.IsGenericMethod && parameters.Length == 2 && parameters[0].ParameterType == typeof(string) && parameters[1].ParameterType == typeof(string)) { ES3DeleteKeyMethod = declaredMethod; } } Logger.LogInfo((object)"Applying patches manually..."); MethodInfo methodInfo = AccessTools.Method(type, "CreateAchievements", (Type[])null, (Type[])null); MethodInfo methodInfo2 = AccessTools.Method(type, "WriteAchievements", (Type[])null, (Type[])null); MethodInfo methodInfo3 = AccessTools.Method(typeof(SavePatches), "PostCreateAchievements", (Type[])null, (Type[])null); MethodInfo methodInfo4 = AccessTools.Method(typeof(SavePatches), "PostWriteAchievements", (Type[])null, (Type[])null); if (methodInfo != null && methodInfo3 != null) { _harmony.Patch((MethodBase)methodInfo, (HarmonyMethod)null, new HarmonyMethod(methodInfo3), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Logger.LogInfo((object)"Hooked CreateAchievements successfully."); } else { Logger.LogError((object)"Failed to hook CreateAchievements."); } if (methodInfo2 != null && methodInfo4 != null) { _harmony.Patch((MethodBase)methodInfo2, (HarmonyMethod)null, new HarmonyMethod(methodInfo4), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Logger.LogInfo((object)"Hooked WriteAchievements successfully."); } Type type3 = AccessTools.TypeByName("QuickMenuManager"); if (type3 != null) { MethodInfo methodInfo5 = AccessTools.Method(type3, "Update", (Type[])null, (Type[])null); if (methodInfo5 != null) { MethodInfo methodInfo6 = AccessTools.Method(typeof(MenuPatches), "PostQuickMenuUpdate", (Type[])null, (Type[])null); _harmony.Patch((MethodBase)methodInfo5, (HarmonyMethod)null, new HarmonyMethod(methodInfo6), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Logger.LogInfo((object)"Hooked QuickMenuManager.Update for controller support."); } } Type type4 = AccessTools.TypeByName("GameNetcodeStuff.PlayerControllerB"); if (type4 != null) { MethodInfo methodInfo7 = AccessTools.Method(type4, "ConnectClientToPlayerObject", (Type[])null, (Type[])null); if (methodInfo7 != null) { MethodInfo methodInfo8 = AccessTools.Method(typeof(SavePatches), "PostPlayerConnect", (Type[])null, (Type[])null); _harmony.Patch((MethodBase)methodInfo7, (HarmonyMethod)null, new HarmonyMethod(methodInfo8), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Logger.LogInfo((object)"Hooked PlayerControllerB.ConnectClientToPlayerObject for Steam ID caching."); } } MethodInfo methodInfo9 = AccessTools.Method(type, "CreateAchievementGetText", (Type[])null, (Type[])null); if (methodInfo9 != null) { MethodInfo methodInfo10 = AccessTools.Method(typeof(AchievementPopupPatches), "CreateEnhancedAchievementPopup", (Type[])null, (Type[])null); _harmony.Patch((MethodBase)methodInfo9, new HarmonyMethod(methodInfo10), (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null, (HarmonyMethod)null); Logger.LogInfo((object)"Hooked CreateAchievementGetText for enhanced popup UI."); } Logger.LogInfo((object)"Global Save loaded successfully."); } else { Logger.LogError((object)"Could not find ES3. Is Lethal Company loaded correctly?"); } } private void Update() { if (Keyboard.current != null && ((ButtonControl)Keyboard.current.f9Key).wasPressedThisFrame && DebugMenu.IsAuthorizedUser()) { DebugMenu.ToggleDebugMenu(); } } internal static string GetSaveKey() { if (CachedSteamId != 0L) { return $"NachoAchievements_Player_{CachedSteamId}"; } return "NachoAchievements_GlobalData"; } internal static void CheckVersionAndReset() { try { if (ES3LoadMethod == null || ES3SaveMethod == null) { return; } string text = ES3LoadMethod.MakeGenericMethod(typeof(string)).Invoke(null, new object[3] { "NachoGlobalSave_Version", "LCGeneralSaveData", "" }) as string; if (text != "2.0.3") { Logger.LogWarning((object)("Version mismatch detected. Saved: '" + text + "', Current: '2.0.3'")); Logger.LogWarning((object)"Performing one-time achievement data reset for data integrity..."); string text2 = "NachoAchievements_GlobalData"; if (ES3KeyExistsMethod != null && (bool)ES3KeyExistsMethod.Invoke(null, new object[2] { text2, "LCGeneralSaveData" }) && ES3DeleteKeyMethod != null) { ES3DeleteKeyMethod.Invoke(null, new object[2] { text2, "LCGeneralSaveData" }); Logger.LogInfo((object)("Deleted old global data key: " + text2)); } string saveKey = GetSaveKey(); if (ES3KeyExistsMethod != null && saveKey != text2 && (bool)ES3KeyExistsMethod.Invoke(null, new object[2] { saveKey, "LCGeneralSaveData" }) && ES3DeleteKeyMethod != null) { ES3DeleteKeyMethod.Invoke(null, new object[2] { saveKey, "LCGeneralSaveData" }); Logger.LogInfo((object)("Deleted player data key: " + saveKey)); } ResetAchievementsInMemory(); ES3SaveMethod.MakeGenericMethod(typeof(string)).Invoke(null, new object[3] { "NachoGlobalSave_Version", "2.0.3", "LCGeneralSaveData" }); Logger.LogInfo((object)"Saved new version marker: 2.0.3"); } } catch (Exception arg) { Logger.LogError((object)$"Version check failed: {arg}"); } } internal static void ResetAchievementsInMemory() { try { if (AchievementsField == null || !(AchievementsField.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary) || dictionary.Count == 0) { return; } int num = 0; int num2 = 0; foreach (KeyValuePair<string, Dictionary<string, string>> item in dictionary) { string key = item.Key; if (ES3KeyExistsMethod != null && ES3DeleteKeyMethod != null) { try { if ((bool)ES3KeyExistsMethod.Invoke(null, new object[2] { key, "LCGeneralSaveData" })) { ES3DeleteKeyMethod.Invoke(null, new object[2] { key, "LCGeneralSaveData" }); num2++; } } catch { } } if (item.Value.ContainsKey("progress")) { item.Value["progress"] = "0"; } if (item.Value.ContainsKey("completed")) { item.Value["completed"] = "False"; } num++; } Logger.LogInfo((object)$"Reset {num} achievements in memory. Deleted {num2} ES3 keys."); try { string text = null; Type type = AccessTools.TypeByName("NachoAchievements.Util.Paths"); if (type != null) { PropertyInfo propertyInfo = AccessTools.Property(type, "DataFolder"); if (propertyInfo != null) { text = propertyInfo.GetValue(null) as string; } } if (string.IsNullOrEmpty(text)) { text = Path.Combine(Path.GetDirectoryName(Application.dataPath), "BepInEx", "config", "NachosAchievements"); } if (!string.IsNullOrEmpty(text) && Directory.Exists(text)) { Directory.Delete(text, recursive: true); Logger.LogInfo((object)("Deleted NachosAchievements folder: " + text)); } else { Logger.LogInfo((object)"NachosAchievements folder does not exist, skipping deletion."); } } catch (Exception ex) { Logger.LogWarning((object)("Could not delete NachosAchievements folder: " + ex.Message)); } Type type2 = AccessTools.TypeByName("NachoAchievements.NachoAchievements"); if (type2 != null) { AccessTools.Method(type2, "WriteAchievements", (Type[])null, (Type[])null)?.Invoke(null, null); Logger.LogInfo((object)"Wrote fresh achievements to file."); } } catch (Exception arg) { Logger.LogError((object)$"Failed to reset achievements in memory: {arg}"); } } } public static class MenuPatches { private static bool _wasStartPressed = false; private static bool _wasBPressed = false; private static bool _wasDPadUpPressed = false; private static bool _wasDPadDownPressed = false; private static float _stickScrollCooldown = 0f; private const float STICK_SCROLL_DELAY = 0.12f; private static bool _wasUpArrowPressed = false; private static bool _wasDownArrowPressed = false; private static bool _wasEscapePressed = false; private static float _keyboardScrollCooldown = 0f; private static bool _isControllerMode = false; private static float _lastControllerInput = 0f; private static float _lastMouseInput = 0f; private static bool _wasMouseLeftPressed = false; private static bool _isDraggingScrollbar = false; private static int _selectedIndex = 0; private static TMP_FontAsset _gameFont = null; private static bool _fontLoaded = false; private static GameObject _uiContainer = null; private static GameObject _backgroundPanel = null; private static GameObject _contentArea = null; private static GameObject _titleBar = null; private static GameObject _progressBar = null; private static GameObject _scrollbarBg = null; private static GameObject _scrollbarHandle = null; private static GameObject _selectionHighlight = null; private static GameObject _descriptionPanel = null; private static TextMeshProUGUI _descriptionText = null; private static TextMeshProUGUI _titleText = null; private static TextMeshProUGUI _progressText = null; private static bool _cacheInitialized = false; private static Type _nachoType; private static FieldInfo _achievementsTextField; private static FieldInfo _achievementsField; private static FieldInfo _tmpField; private static FieldInfo _prevTextField; private static Type _gameNetworkManagerType; private static PropertyInfo _gnmInstanceProp; private static FieldInfo _localPlayerField; private static FieldInfo _quickMenuField; private static FieldInfo _mainButtonsField; private static readonly Color PANEL_BG_COLOR = new Color(0.08f, 0.08f, 0.12f, 0.95f); private static readonly Color TITLE_BAR_COLOR = new Color(0.15f, 0.12f, 0.08f, 1f); private static readonly Color ACCENT_COLOR = new Color(1f, 0.8f, 0.2f, 1f); private static readonly Color COMPLETED_COLOR = new Color(0.3f, 0.9f, 0.3f, 1f); private static readonly Color LOCKED_COLOR = new Color(0.5f, 0.5f, 0.5f, 1f); private static readonly Color HIGHLIGHT_COLOR = new Color(1f, 0.8f, 0.2f, 0.25f); private static Dictionary<int, Sprite> _badgeSprites = new Dictionary<int, Sprite>(); private static Sprite _unlockedOverlay = null; private static Sprite _lockedOverlay = null; private static bool _badgesLoaded = false; private static string _badgesPath = null; private static AssetBundle _badgeBundle = null; public static int GetBadgeCount() { LoadBadgeImages(); return _badgeSprites.Count; } public static bool HasBadgeSprite(int index) { LoadBadgeImages(); return _badgeSprites.ContainsKey(index); } public static Sprite GetBadgeSprite(int index) { LoadBadgeImages(); if (!_badgeSprites.ContainsKey(index)) { return null; } return _badgeSprites[index]; } private static void LoadBadgeImages() { if (_badgesLoaded) { return; } _badgesLoaded = true; try { string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = Path.Combine(directoryName, "nachoachievementsbadges"); if (File.Exists(text)) { LoadFromAssetBundle(text); if (_badgeSprites.Count > 0) { GlobalSavePlugin.Logger.LogInfo((object)$"Loaded {_badgeSprites.Count} badges from AssetBundle"); return; } } _badgesPath = Path.Combine(directoryName, "Badges"); if (!Directory.Exists(_badgesPath)) { _badgesPath = Path.Combine(Directory.GetParent(directoryName)?.FullName ?? directoryName, "Badges"); } if (!Directory.Exists(_badgesPath)) { GlobalSavePlugin.Logger.LogWarning((object)"No AssetBundle or Badges folder found"); } else { LoadFromPngFolder(); } } catch (Exception arg) { GlobalSavePlugin.Logger.LogError((object)$"Failed to load badges: {arg}"); } } private static void LoadFromAssetBundle(string bundlePath) { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_00d4: 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) try { _badgeBundle = AssetBundle.LoadFromFile(bundlePath); if ((Object)_badgeBundle == (Object)null) { GlobalSavePlugin.Logger.LogWarning((object)"Failed to load AssetBundle"); return; } Sprite[] array = _badgeBundle.LoadAllAssets<Sprite>(); GlobalSavePlugin.Logger.LogInfo((object)$"AssetBundle contains {array.Length} sprites"); if (array.Length != 0) { Sprite[] array2 = array; foreach (Sprite val in array2) { MatchAndStoreBadge(((Object)val).name, val); } return; } Texture2D[] array3 = _badgeBundle.LoadAllAssets<Texture2D>(); GlobalSavePlugin.Logger.LogInfo((object)$"AssetBundle contains {array3.Length} textures"); Texture2D[] array4 = array3; foreach (Texture2D val2 in array4) { try { Sprite sprite = Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), new Vector2(0.5f, 0.5f)); MatchAndStoreBadge(((Object)val2).name, sprite); } catch (Exception ex) { GlobalSavePlugin.Logger.LogWarning((object)("Failed to create sprite from " + ((Object)val2).name + ": " + ex.Message)); } } } catch (Exception ex2) { GlobalSavePlugin.Logger.LogError((object)("AssetBundle load error: " + ex2.Message)); } } private static void MatchAndStoreBadge(string name, Sprite sprite) { for (int i = 1; i <= 32; i++) { string value = $"{i:D2}_"; if (name.StartsWith(value)) { _badgeSprites[i] = sprite; GlobalSavePlugin.Logger.LogInfo((object)$"Loaded badge {i}: {name}"); return; } } if (name.StartsWith("Overlay_Unlocked")) { _unlockedOverlay = sprite; GlobalSavePlugin.Logger.LogInfo((object)("Loaded overlay: " + name)); } else if (name.StartsWith("Overlay_Locked")) { _lockedOverlay = sprite; GlobalSavePlugin.Logger.LogInfo((object)("Loaded overlay: " + name)); } } private static void LoadFromPngFolder() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Expected O, but got Unknown try { GlobalSavePlugin.Logger.LogInfo((object)("Loading badges from " + _badgesPath)); for (int i = 1; i <= 32; i++) { string searchPattern = $"{i:D2}_*.png"; string[] files = Directory.GetFiles(_badgesPath, searchPattern); if (files.Length != 0) { Sprite val = LoadSpriteFromFile(files[0]); if ((Object)val != (Object)null) { _badgeSprites[i] = val; } } } string text = Path.Combine(_badgesPath, "Overlay_Unlocked.png"); string text2 = Path.Combine(_badgesPath, "Overlay_Locked.png"); if (File.Exists(text)) { _unlockedOverlay = LoadSpriteFromFile(text); } if (File.Exists(text2)) { _lockedOverlay = LoadSpriteFromFile(text2); } GlobalSavePlugin.Logger.LogInfo((object)$"Loaded {_badgeSprites.Count} badge images from PNG"); } catch (Exception ex) { GlobalSavePlugin.Logger.LogError((object)("PNG folder load error: " + ex.Message)); } } private static Sprite LoadSpriteFromFile(string filePath) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) try { byte[] array = File.ReadAllBytes(filePath); Texture2D val = new Texture2D(2, 2); if (ImageConversion.LoadImage(val, array)) { ((Texture)val).filterMode = (FilterMode)1; return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } } catch { } return null; } private static void LoadGameFont() { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown if (_fontLoaded) { return; } _fontLoaded = true; try { if (_nachoType != null) { FieldInfo fieldInfo = AccessTools.Field(_nachoType, "AchievementsFont"); if (fieldInfo != null) { object value = fieldInfo.GetValue(null); _gameFont = (TMP_FontAsset)((value is TMP_FontAsset) ? value : null); if ((Object)_gameFont != (Object)null) { GlobalSavePlugin.Logger.LogInfo((object)"Using NachoAchievements font"); return; } } } TMP_FontAsset[] array = Resources.FindObjectsOfTypeAll<TMP_FontAsset>(); TMP_FontAsset[] array2 = array; foreach (TMP_FontAsset val in array2) { if (((Object)val).name.Contains("3270")) { _gameFont = val; GlobalSavePlugin.Logger.LogInfo((object)("Found game font: " + ((Object)val).name)); return; } } if (array.Length != 0) { _gameFont = array[0]; GlobalSavePlugin.Logger.LogInfo((object)("Using fallback font: " + ((Object)_gameFont).name)); } } catch (Exception arg) { GlobalSavePlugin.Logger.LogError((object)$"Failed to load game font: {arg}"); } } private static void InitializeCache() { if (!_cacheInitialized) { _nachoType = AccessTools.TypeByName("NachoAchievements.NachoAchievements"); if (_nachoType != null) { _achievementsTextField = AccessTools.Field(_nachoType, "AchievementsText"); _achievementsField = AccessTools.Field(_nachoType, "Achievements"); _tmpField = AccessTools.Field(_nachoType, "TMP"); _prevTextField = AccessTools.Field(_nachoType, "prevText"); } _gameNetworkManagerType = AccessTools.TypeByName("GameNetworkManager"); if (_gameNetworkManagerType != null) { _gnmInstanceProp = AccessTools.Property(_gameNetworkManagerType, "Instance"); _localPlayerField = AccessTools.Field(_gameNetworkManagerType, "localPlayerController"); } _cacheInitialized = true; } } public static void PostQuickMenuUpdate(object __instance) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown try { if (!_cacheInitialized) { InitializeCache(); } if (_nachoType == null || _achievementsTextField == null) { return; } if (_achievementsTextField.GetValue(null) is IList list && list.Count != 0) { if ((Object)_uiContainer == (Object)null) { CreateEnhancedUI(list); _selectedIndex = 0; } DetectInputMode(); Gamepad current = Gamepad.current; if (current != null) { HandleGamepadInput(current, list); } Keyboard current2 = Keyboard.current; if (current2 != null) { HandleKeyboardInput(current2, list); } ClearMouseDescription(); UpdateUI(list); } else { CleanupUI(); } } catch (Exception arg) { GlobalSavePlugin.Logger.LogError((object)$"Menu update failed: {arg}"); } } private static void DetectInputMode() { //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00df: Unknown result type (might be due to invalid IL or missing references) Gamepad current = Gamepad.current; if (current != null && (current.dpad.up.isPressed || current.dpad.down.isPressed || Mathf.Abs(((InputControl<float>)(object)((Vector2Control)current.leftStick).y).ReadValue()) > 0.3f || current.buttonSouth.isPressed || current.buttonEast.isPressed)) { _lastControllerInput = Time.time; _isControllerMode = true; } Keyboard current2 = Keyboard.current; if (current2 != null && (((ButtonControl)current2.upArrowKey).isPressed || ((ButtonControl)current2.downArrowKey).isPressed || ((ButtonControl)current2.wKey).isPressed || ((ButtonControl)current2.sKey).isPressed)) { _lastControllerInput = Time.time; _isControllerMode = true; } Mouse current3 = Mouse.current; if (current3 == null) { return; } Vector2 val = ((InputControl<Vector2>)(object)((Pointer)current3).delta).ReadValue(); if (((Vector2)(ref val)).magnitude > 5f) { _lastMouseInput = Time.time; if (_isControllerMode && Time.time - _lastControllerInput > 0.5f) { _isControllerMode = false; } } } private static void ClearMouseDescription() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Expected O, but got Unknown try { if (_tmpField != null) { object value = _tmpField.GetValue(null); if (value != null) { Object.Destroy((!(value is Object)) ? ((Object)null) : ((Object)value)); _tmpField.SetValue(null, null); } } if (_prevTextField != null) { _prevTextField.SetValue(null, string.Empty); } if (!(_achievementsTextField != null) || !(_achievementsTextField.GetValue(null) is IList list)) { return; } foreach (object item in list) { GameObject val = (GameObject)((item is GameObject) ? item : null); if ((Object)val != (Object)null && val.activeSelf) { val.SetActive(false); } } } catch { } } private static void HandleGamepadInput(Gamepad gamepad, IList achievementsText) { bool isPressed = gamepad.startButton.isPressed; bool isPressed2 = gamepad.buttonEast.isPressed; bool isPressed3 = gamepad.dpad.up.isPressed; bool isPressed4 = gamepad.dpad.down.isPressed; float num = ((InputControl<float>)(object)((Vector2Control)gamepad.leftStick).y).ReadValue(); if (_wasStartPressed && !isPressed) { CloseAchievementsMenu(achievementsText); } else if (_wasBPressed && !isPressed2) { CloseAchievementsMenu(achievementsText); } if (isPressed3 && !_wasDPadUpPressed) { NavigateUp(achievementsText); } if (isPressed4 && !_wasDPadDownPressed) { NavigateDown(achievementsText); } _stickScrollCooldown -= Time.deltaTime; if (_stickScrollCooldown <= 0f) { if (num > 0.5f) { NavigateUp(achievementsText); _stickScrollCooldown = 0.12f; } else if (num < -0.5f) { NavigateDown(achievementsText); _stickScrollCooldown = 0.12f; } } _wasStartPressed = isPressed; _wasBPressed = isPressed2; _wasDPadUpPressed = isPressed3; _wasDPadDownPressed = isPressed4; } private static void HandleKeyboardInput(Keyboard keyboard, IList achievementsText) { bool flag = ((ButtonControl)keyboard.upArrowKey).isPressed || ((ButtonControl)keyboard.wKey).isPressed; bool flag2 = ((ButtonControl)keyboard.downArrowKey).isPressed || ((ButtonControl)keyboard.sKey).isPressed; bool isPressed = ((ButtonControl)keyboard.escapeKey).isPressed; if (_wasEscapePressed && !isPressed) { CloseAchievementsMenu(achievementsText); } if (flag && !_wasUpArrowPressed) { NavigateUp(achievementsText); _keyboardScrollCooldown = 0.4f; } else if (flag2 && !_wasDownArrowPressed) { NavigateDown(achievementsText); _keyboardScrollCooldown = 0.4f; } else if (_keyboardScrollCooldown > 0f) { _keyboardScrollCooldown -= Time.deltaTime; } else if (_keyboardScrollCooldown <= 0f) { if (flag && _wasUpArrowPressed) { NavigateUp(achievementsText); _keyboardScrollCooldown = 0.12f; } else if (flag2 && _wasDownArrowPressed) { NavigateDown(achievementsText); _keyboardScrollCooldown = 0.12f; } } _wasUpArrowPressed = flag; _wasDownArrowPressed = flag2; _wasEscapePressed = isPressed; } private static void NavigateUp(IList achievementsText) { if (_selectedIndex > 0) { _selectedIndex--; ScrollToSelectedItem(achievementsText); UpdateDescription(); } } private static void NavigateDown(IList achievementsText) { if (_selectedIndex < achievementsText.Count - 1) { _selectedIndex++; ScrollToSelectedItem(achievementsText); UpdateDescription(); } } private static void ScrollToSelectedItem(IList achievementsText) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Expected O, but got Unknown //IL_0064: Unknown result type (might be due to invalid IL or missing references) if (achievementsText.Count == 0 || (Object)_contentArea == (Object)null) { return; } Transform val = _contentArea.transform.Find($"Card_{_selectedIndex}"); if ((Object)val == (Object)null) { return; } RectTransform component = ((Component)val).GetComponent<RectTransform>(); if (!((Object)component == (Object)null)) { float y = component.anchoredPosition.y; float num = 200f; float num2 = -200f; if (y > num) { float num3 = y - num + 20f; ScrollAllCards(0f - num3); } else if (y < num2) { ScrollAllCards(num2 - y + 20f); } } } private static void ScrollAllCards(float delta) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) if ((Object)_contentArea == (Object)null) { return; } foreach (Transform item in _contentArea.transform) { Transform val = item; if (!(((Object)val).name == "SelectionHighlight")) { RectTransform component = ((Component)val).GetComponent<RectTransform>(); if ((Object)component != (Object)null) { component.anchoredPosition += new Vector2(0f, delta); } } } } private static void ScrollAllItems(IList achievementsText, float delta) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) foreach (object item in achievementsText) { GameObject val = (GameObject)((item is GameObject) ? item : null); if ((Object)val != (Object)null) { RectTransform component = val.GetComponent<RectTransform>(); if ((Object)component != (Object)null) { component.anchoredPosition += new Vector2(0f, delta); } } } } private static void CreateEnhancedUI(IList achievementsText) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Expected O, but got Unknown //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00eb: 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_0122: Unknown result type (might be due to invalid IL or missing references) //IL_0131: 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_016d: Unknown result type (might be due to invalid IL or missing references) //IL_017c: 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_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0217: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Expected O, but got Unknown //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02b4: Unknown result type (might be due to invalid IL or missing references) //IL_02d7: Unknown result type (might be due to invalid IL or missing references) //IL_02e6: Unknown result type (might be due to invalid IL or missing references) //IL_02ff: Unknown result type (might be due to invalid IL or missing references) //IL_030f: Unknown result type (might be due to invalid IL or missing references) //IL_0314: Unknown result type (might be due to invalid IL or missing references) //IL_0326: Unknown result type (might be due to invalid IL or missing references) //IL_032c: Unknown result type (might be due to invalid IL or missing references) //IL_0336: Unknown result type (might be due to invalid IL or missing references) //IL_0347: Unknown result type (might be due to invalid IL or missing references) //IL_035c: Unknown result type (might be due to invalid IL or missing references) //IL_0371: Unknown result type (might be due to invalid IL or missing references) //IL_037c: Unknown result type (might be due to invalid IL or missing references) //IL_0386: Unknown result type (might be due to invalid IL or missing references) //IL_039c: Unknown result type (might be due to invalid IL or missing references) //IL_03a1: Unknown result type (might be due to invalid IL or missing references) //IL_03b3: Unknown result type (might be due to invalid IL or missing references) //IL_03c3: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Expected O, but got Unknown //IL_0402: Unknown result type (might be due to invalid IL or missing references) //IL_0412: Unknown result type (might be due to invalid IL or missing references) //IL_041d: Unknown result type (might be due to invalid IL or missing references) //IL_0427: Unknown result type (might be due to invalid IL or missing references) //IL_0438: Expected O, but got Unknown //IL_043d: Unknown result type (might be due to invalid IL or missing references) //IL_0447: Expected O, but got Unknown //IL_0476: Unknown result type (might be due to invalid IL or missing references) //IL_048a: Unknown result type (might be due to invalid IL or missing references) //IL_04b2: Unknown result type (might be due to invalid IL or missing references) //IL_04fa: Unknown result type (might be due to invalid IL or missing references) //IL_0509: Unknown result type (might be due to invalid IL or missing references) //IL_0522: Unknown result type (might be due to invalid IL or missing references) //IL_054a: Unknown result type (might be due to invalid IL or missing references) //IL_0559: Unknown result type (might be due to invalid IL or missing references) //IL_055e: Unknown result type (might be due to invalid IL or missing references) //IL_0586: Unknown result type (might be due to invalid IL or missing references) //IL_0595: Unknown result type (might be due to invalid IL or missing references) //IL_05ae: Unknown result type (might be due to invalid IL or missing references) //IL_05c2: Unknown result type (might be due to invalid IL or missing references) //IL_05c7: Unknown result type (might be due to invalid IL or missing references) //IL_05dd: Unknown result type (might be due to invalid IL or missing references) //IL_05fc: Unknown result type (might be due to invalid IL or missing references) //IL_0607: Expected O, but got Unknown //IL_064f: Unknown result type (might be due to invalid IL or missing references) //IL_065f: Unknown result type (might be due to invalid IL or missing references) //IL_066a: Unknown result type (might be due to invalid IL or missing references) //IL_0674: Unknown result type (might be due to invalid IL or missing references) try { object obj = AccessTools.Field(_nachoType, "AchievementsCanvas")?.GetValue(null); Canvas val = (Canvas)((obj is Canvas) ? obj : null); if (!((Object)val == (Object)null)) { _uiContainer = new GameObject("EnhancedAchievementsUI"); _uiContainer.transform.SetParent(((Component)val).transform, false); RectTransform obj2 = _uiContainer.AddComponent<RectTransform>(); obj2.anchorMin = new Vector2(0.5f, 0.5f); obj2.anchorMax = new Vector2(0.5f, 0.5f); obj2.pivot = new Vector2(0.5f, 0.5f); obj2.anchoredPosition = Vector2.zero; obj2.sizeDelta = new Vector2(750f, 700f); _backgroundPanel = CreatePanel(_uiContainer.transform, "BackgroundPanel", Vector2.zero, new Vector2(700f, 680f), new Color(0.05f, 0.05f, 0.08f, 0.97f)); CreatePanel(_backgroundPanel.transform, "OuterBorder", Vector2.zero, new Vector2(704f, 684f), new Color(0.4f, 0.35f, 0.15f, 1f)).transform.SetAsFirstSibling(); CreatePanel(_backgroundPanel.transform, "InnerBorder", Vector2.zero, new Vector2(702f, 682f), new Color(0.2f, 0.18f, 0.08f, 1f)).transform.SetSiblingIndex(1); GameObject val2 = CreatePanel(_backgroundPanel.transform, "Header", new Vector2(0f, 300f), new Vector2(680f, 70f), new Color(0.12f, 0.1f, 0.06f, 1f)); LoadGameFont(); GameObject val3 = new GameObject("TitleText"); val3.transform.SetParent(val2.transform, false); _titleText = val3.AddComponent<TextMeshProUGUI>(); ((TMP_Text)_titleText).text = "★ 도 전 과 제 ★"; if ((Object)_gameFont != (Object)null) { ((TMP_Text)_titleText).font = _gameFont; } ((TMP_Text)_titleText).fontSize = 36f; ((TMP_Text)_titleText).alignment = (TextAlignmentOptions)514; ((Graphic)_titleText).color = ACCENT_COLOR; ((TMP_Text)_titleText).fontStyle = (FontStyles)1; ((TMP_Text)_titleText).characterSpacing = 8f; RectTransform component = val3.GetComponent<RectTransform>(); component.anchorMin = Vector2.zero; component.anchorMax = Vector2.one; component.sizeDelta = Vector2.zero; GameObject val4 = CreatePanel(_backgroundPanel.transform, "ProgressBg", new Vector2(0f, 255f), new Vector2(660f, 25f), new Color(0.15f, 0.15f, 0.18f, 1f)); GameObject val5 = new GameObject("ProgressFill"); val5.transform.SetParent(val4.transform, false); ((Graphic)val5.AddComponent<Image>()).color = ACCENT_COLOR; RectTransform component2 = val5.GetComponent<RectTransform>(); component2.anchorMin = new Vector2(0f, 0f); component2.anchorMax = new Vector2(0f, 1f); component2.pivot = new Vector2(0f, 0.5f); component2.offsetMin = Vector2.zero; component2.offsetMax = Vector2.zero; float maxWidth = 660f; GameObject val6 = new GameObject("ProgressText"); val6.transform.SetParent(val4.transform, false); _progressText = val6.AddComponent<TextMeshProUGUI>(); if ((Object)_gameFont != (Object)null) { ((TMP_Text)_progressText).font = _gameFont; } ((TMP_Text)_progressText).fontSize = 16f; ((TMP_Text)_progressText).alignment = (TextAlignmentOptions)514; ((Graphic)_progressText).color = Color.white; RectTransform component3 = val6.GetComponent<RectTransform>(); component3.anchorMin = Vector2.zero; component3.anchorMax = Vector2.one; component3.sizeDelta = Vector2.zero; UpdateProgressBar(val5, maxWidth); _contentArea = new GameObject("ContentArea"); _contentArea.transform.SetParent(_backgroundPanel.transform, false); RectTransform obj3 = _contentArea.AddComponent<RectTransform>(); obj3.anchoredPosition = new Vector2(0f, -30f); obj3.sizeDelta = new Vector2(670f, 500f); ((Graphic)_contentArea.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.01f); _contentArea.AddComponent<Mask>().showMaskGraphic = false; CreateAchievementCards(achievementsText, _contentArea.transform, 650f); _scrollbarBg = CreatePanel(_backgroundPanel.transform, "ScrollbarBg", new Vector2(335f, -30f), new Vector2(8f, 480f), new Color(0.2f, 0.2f, 0.25f, 0.6f)); _scrollbarHandle = CreatePanel(_scrollbarBg.transform, "ScrollbarHandle", new Vector2(0f, 200f), new Vector2(8f, 60f), ACCENT_COLOR); _descriptionPanel = CreatePanel(_backgroundPanel.transform, "DescriptionPanel", new Vector2(0f, -305f), new Vector2(680f, 60f), new Color(0.08f, 0.08f, 0.1f, 1f)); GameObject val7 = new GameObject("DescriptionText"); val7.transform.SetParent(_descriptionPanel.transform, false); _descriptionText = val7.AddComponent<TextMeshProUGUI>(); ((TMP_Text)_descriptionText).text = "▲ ▼ 도전과제를 선택하세요"; if ((Object)_gameFont != (Object)null) { ((TMP_Text)_descriptionText).font = _gameFont; } ((TMP_Text)_descriptionText).fontSize = 18f; ((TMP_Text)_descriptionText).alignment = (TextAlignmentOptions)514; ((Graphic)_descriptionText).color = new Color(0.7f, 0.7f, 0.7f, 1f); RectTransform component4 = val7.GetComponent<RectTransform>(); component4.anchorMin = Vector2.zero; component4.anchorMax = Vector2.one; component4.sizeDelta = Vector2.zero; HideOriginalItems(achievementsText); if (achievementsText.Count > 0) { _selectedIndex = 0; UpdateDescription(); } } } catch (Exception arg) { GlobalSavePlugin.Logger.LogError((object)$"Failed to create enhanced UI: {arg}"); } } private static void UpdateProgressBar(GameObject progressFill, float maxWidth) { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_009c: 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_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00d0: Expected O, but got Unknown //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Expected O, but got Unknown //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Expected O, but got Unknown //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Expected O, but got Unknown //IL_0162: 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_0160: Expected O, but got Unknown //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Expected O, but got Unknown //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_020a: 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_0185: Expected O, but got Unknown try { if (!(_achievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary)) { return; } int count = dictionary.Count; int num = dictionary.Values.Count((Dictionary<string, string> a) => a.ContainsKey("completed") && a["completed"] == "True"); float num2 = ((count > 0) ? ((float)num / (float)count) : 0f); bool flag = num == count && count > 0; RectTransform component = progressFill.GetComponent<RectTransform>(); Image component2 = progressFill.GetComponent<Image>(); component.anchorMin = new Vector2(0f, 0f); component.anchorMax = new Vector2(num2, 1f); component.offsetMin = Vector2.zero; component.offsetMax = Vector2.zero; if (flag) { if ((Object)progressFill.GetComponent<RainbowGradientAnimator>() == (Object)null) { RainbowGradientAnimator rainbowGradientAnimator = progressFill.AddComponent<RainbowGradientAnimator>(); rainbowGradientAnimator.speed = 0.4f; rainbowGradientAnimator.waveLength = 0.6f; rainbowGradientAnimator.saturation = 0.65f; rainbowGradientAnimator.brightness = 0.95f; } ProgressGlowAnimator component3 = progressFill.GetComponent<ProgressGlowAnimator>(); if ((Object)component3 != (Object)null) { Object.Destroy((Object)component3); } } else if ((Object)component2 != (Object)null) { RainbowGradientAnimator component4 = progressFill.GetComponent<RainbowGradientAnimator>(); if ((Object)component4 != (Object)null) { Object.Destroy((Object)component4); } ((Graphic)component2).color = ACCENT_COLOR; if (num2 > 0.01f && (Object)progressFill.GetComponent<ProgressGlowAnimator>() == (Object)null) { ProgressGlowAnimator progressGlowAnimator = progressFill.AddComponent<ProgressGlowAnimator>(); progressGlowAnimator.pulseSpeed = 3f; progressGlowAnimator.minAlpha = 0.4f; progressGlowAnimator.maxAlpha = 0.9f; progressGlowAnimator.glowWidth = 12f; } } if ((Object)_progressText != (Object)null) { if (flag) { ((TMP_Text)_progressText).text = $"★ {num}/{count} (100%) - 완전 정복! ★"; ((Graphic)_progressText).color = new Color(0.15f, 0.1f, 0f, 1f); ((TMP_Text)_progressText).fontStyle = (FontStyles)1; } else { ((TMP_Text)_progressText).text = $"{num}/{count} ({num2 * 100f:F1}%)"; ((Graphic)_progressText).color = Color.white; ((TMP_Text)_progressText).fontStyle = (FontStyles)0; } } } catch { } } private static void CreateAchievementCards(IList achievementsText, Transform parent, float cardWidth) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01fc: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_027c: Unknown result type (might be due to invalid IL or missing references) //IL_028b: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_0376: Unknown result type (might be due to invalid IL or missing references) //IL_037b: Unknown result type (might be due to invalid IL or missing references) //IL_038e: Unknown result type (might be due to invalid IL or missing references) //IL_02d3: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02eb: Unknown result type (might be due to invalid IL or missing references) //IL_03ae: Unknown result type (might be due to invalid IL or missing references) //IL_03b5: Expected O, but got Unknown //IL_0348: Unknown result type (might be due to invalid IL or missing references) //IL_0341: Unknown result type (might be due to invalid IL or missing references) //IL_0367: Unknown result type (might be due to invalid IL or missing references) //IL_03f1: Unknown result type (might be due to invalid IL or missing references) //IL_03fc: Expected O, but got Unknown //IL_0443: Unknown result type (might be due to invalid IL or missing references) //IL_043c: Unknown result type (might be due to invalid IL or missing references) //IL_0469: Unknown result type (might be due to invalid IL or missing references) //IL_047f: Unknown result type (might be due to invalid IL or missing references) //IL_048e: Unknown result type (might be due to invalid IL or missing references) //IL_0493: Unknown result type (might be due to invalid IL or missing references) //IL_04a6: Unknown result type (might be due to invalid IL or missing references) //IL_04ca: Unknown result type (might be due to invalid IL or missing references) //IL_04d5: Expected O, but got Unknown //IL_0530: Unknown result type (might be due to invalid IL or missing references) //IL_0515: Unknown result type (might be due to invalid IL or missing references) //IL_054a: Unknown result type (might be due to invalid IL or missing references) //IL_0560: Unknown result type (might be due to invalid IL or missing references) if (!(_achievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary)) { return; } LoadBadgeImages(); LoadGameFont(); string[] array = dictionary.Keys.ToArray(); float num = 220f; float num2 = 70f; float num3 = 8f; _selectionHighlight = CreatePanel(parent, "SelectionHighlight", new Vector2(0f, num), new Vector2(cardWidth, num2), HIGHLIGHT_COLOR); _selectionHighlight.transform.SetAsFirstSibling(); for (int i = 0; i < achievementsText.Count && i < array.Length; i++) { string text = array[i]; Dictionary<string, string> dictionary2 = dictionary[text]; bool flag = dictionary2.ContainsKey("completed") && dictionary2["completed"] == "True"; float num4 = num - (float)i * (num2 + num3); GameObject val = CreatePanel(parent, $"Card_{i}", new Vector2(0f, num4), new Vector2(cardWidth, num2), flag ? new Color(0.12f, 0.18f, 0.12f, 0.9f) : new Color(0.1f, 0.1f, 0.12f, 0.9f)); CreatePanel(val.transform, "Border", Vector2.zero, new Vector2(cardWidth + 2f, num2 + 2f), flag ? new Color(0.4f, 0.6f, 0.3f, 0.5f) : new Color(0.3f, 0.3f, 0.35f, 0.5f)).transform.SetAsFirstSibling(); int key = i + 1; bool flag2 = _badgeSprites.ContainsKey(key) && flag; GameObject val2 = CreatePanel(val.transform, "IconBg", new Vector2(0f - cardWidth / 2f + 45f, 0f), new Vector2(75f, 75f), flag2 ? Color.clear : (flag ? ACCENT_COLOR : LOCKED_COLOR)); if (flag2) { GameObject val3 = new GameObject("BadgeImage"); val3.transform.SetParent(val2.transform, false); Image obj = val3.AddComponent<Image>(); obj.sprite = _badgeSprites[key]; obj.preserveAspect = true; RectTransform component = val3.GetComponent<RectTransform>(); component.sizeDelta = new Vector2(70f, 70f); component.anchoredPosition = Vector2.zero; } else { CreatePanel(val2.transform, "IconInner", Vector2.zero, new Vector2(65f, 65f), flag ? new Color(0.2f, 0.15f, 0.05f, 1f) : new Color(0.25f, 0.25f, 0.28f, 1f)); GameObject val4 = new GameObject("Symbol"); val4.transform.SetParent(val2.transform, false); TextMeshProUGUI obj2 = val4.AddComponent<TextMeshProUGUI>(); ((TMP_Text)obj2).text = (flag ? "✓" : "?"); ((TMP_Text)obj2).fontSize = (flag ? 28f : 32f); ((TMP_Text)obj2).alignment = (TextAlignmentOptions)514; ((Graphic)obj2).color = (Color)(flag ? ACCENT_COLOR : new Color(0.5f, 0.5f, 0.5f, 1f)); ((TMP_Text)obj2).fontStyle = (FontStyles)1; val4.GetComponent<RectTransform>().sizeDelta = new Vector2(55f, 55f); } GameObject val5 = new GameObject("Title"); val5.transform.SetParent(val.transform, false); TextMeshProUGUI val6 = val5.AddComponent<TextMeshProUGUI>(); object obj3 = achievementsText[i]; GameObject val7 = (GameObject)((obj3 is GameObject) ? obj3 : null); TextMeshProUGUI val8 = (((Object)(object)val7 != (Object)null) ? val7.GetComponent<TextMeshProUGUI>() : null); ((TMP_Text)val6).text = (((Object)(object)val8 != (Object)null) ? ((TMP_Text)val8).text : null) ?? text; if ((Object)_gameFont != (Object)null) { ((TMP_Text)val6).font = _gameFont; } ((TMP_Text)val6).fontSize = 20f; ((TMP_Text)val6).alignment = (TextAlignmentOptions)513; ((Graphic)val6).color = (Color)(flag ? COMPLETED_COLOR : new Color(0.85f, 0.85f, 0.85f, 1f)); ((TMP_Text)val6).fontStyle = (FontStyles)flag; RectTransform component2 = val5.GetComponent<RectTransform>(); component2.anchoredPosition = new Vector2(40f, 8f); component2.sizeDelta = new Vector2(cardWidth - 100f, 30f); GameObject val9 = new GameObject("Status"); val9.transform.SetParent(val.transform, false); TextMeshProUGUI val10 = val9.AddComponent<TextMeshProUGUI>(); ((TMP_Text)val10).text = (flag ? "★ 달성 완료" : "○ 미달성"); if ((Object)_gameFont != (Object)null) { ((TMP_Text)val10).font = _gameFont; } ((TMP_Text)val10).fontSize = 14f; ((TMP_Text)val10).alignment = (TextAlignmentOptions)513; ((Graphic)val10).color = (flag ? new Color(0.7f, 0.7f, 0.4f, 1f) : new Color(0.5f, 0.5f, 0.5f, 1f)); RectTransform component3 = val9.GetComponent<RectTransform>(); component3.anchoredPosition = new Vector2(40f, -15f); component3.sizeDelta = new Vector2(cardWidth - 100f, 20f); } } private static void HideOriginalItems(IList achievementsText) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Expected O, but got Unknown //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Expected O, but got Unknown //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00c0: Expected O, but got Unknown //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown foreach (object item in achievementsText) { GameObject val = (GameObject)((item is GameObject) ? item : null); if ((Object)val != (Object)null) { val.SetActive(false); RectTransform component = val.GetComponent<RectTransform>(); if ((Object)component != (Object)null) { component.anchoredPosition = new Vector2(-9999f, -9999f); } } } try { object obj = AccessTools.Field(_nachoType, "AchievementsCanvas")?.GetValue(null); Canvas val2 = (Canvas)((obj is Canvas) ? obj : null); if (!((Object)val2 != (Object)null)) { return; } foreach (Transform item2 in ((Component)val2).transform) { Transform val3 = item2; if (((Object)((Component)val3).gameObject).name.StartsWith("AchievementsText")) { ((Component)val3).gameObject.SetActive(false); } } } catch { } } private static void ReparentAchievementItems(IList achievementsText, Transform parent) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Expected O, but got Unknown //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Expected O, but got Unknown //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) float num = 250f; float num2 = 75f; for (int i = 0; i < achievementsText.Count; i++) { object obj = achievementsText[i]; GameObject val = (GameObject)((obj is GameObject) ? obj : null); if (!((Object)val == (Object)null)) { val.transform.SetParent(parent, false); RectTransform component = val.GetComponent<RectTransform>(); if ((Object)component != (Object)null) { component.anchoredPosition = new Vector2(-50f, num - (float)i * num2); } } } } private static GameObject CreatePanel(Transform parent, string name, Vector2 position, Vector2 size, Color color) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: 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) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) //IL_0027: 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) //IL_0034: Expected O, but got Unknown GameObject val = new GameObject(name); val.transform.SetParent(parent, false); ((Graphic)val.AddComponent<Image>()).color = color; RectTransform component = val.GetComponent<RectTransform>(); component.anchoredPosition = position; component.sizeDelta = size; return val; } private static void StyleAchievementItems(IList achievementsText) { } private static void UpdateProgressText() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown try { if (!((Object)_progressText == (Object)null) && _achievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary) { int count = dictionary.Count; int num = dictionary.Values.Count((Dictionary<string, string> a) => a.ContainsKey("completed") && a["completed"] == "True"); float num2 = ((count > 0) ? ((float)num / (float)count * 100f) : 0f); ((TMP_Text)_progressText).text = $"진행률: {num}/{count} ({num2:F1}%)"; } } catch { } } private static void UpdateDescription() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Expected O, but got Unknown //IL_0093: Unknown result type (might be due to invalid IL or missing references) try { if ((Object)_descriptionText == (Object)null || !(_achievementsField?.GetValue(null) is Dictionary<string, Dictionary<string, string>> dictionary)) { return; } string[] array = dictionary.Keys.ToArray(); if (_selectedIndex >= 0 && _selectedIndex < array.Length) { string key = array[_selectedIndex]; if (dictionary[key].ContainsKey("description")) { ((TMP_Text)_descriptionText).text = dictio