Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of NachoAchievementsGlobalSave v2.3.1
NachoAchievementsGlobalSave.dll
Decompiled a month 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