Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of AchievementPins v1.0.2
AchievementPins.dll
Decompiled a year agousing System; 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.Configuration; using BepInEx.Logging; using IL.RoR2.UI.LogBook; using Microsoft.CodeAnalysis; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using On.RoR2.Achievements; using On.RoR2.UI; using On.RoR2.UI.LogBook; using RoR2; using RoR2.Achievements; using RoR2.Achievements.Artifacts; using RoR2.Achievements.Croco; using RoR2.UI; using RoR2.UI.LogBook; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("AchievementPins")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+79cbeb90485d5189411d71a1b9230d5192ffc0ae")] [assembly: AssemblyProduct("AchievementPins")] [assembly: AssemblyTitle("AchievementPins")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.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; } } } namespace AchievementPins { [BepInPlugin("prodzpod.AchievementPins", "AchievementPins", "1.0.0")] public class Main : BaseUnityPlugin { public class AchievementClass : ObjectiveTracker { public bool _invopen = false; public AchievementDef def; public AchievementClass() { def = pins[pinIndex]; base.baseToken = pins[pinIndex].nameToken; pinIndex++; trackers.Add(this); _invopen = !invopen; } public override string GenerateString() { return Language.GetString(invopen ? def.descriptionToken : def.nameToken); } public override bool IsDirty() { if (invopen != _invopen) { _invopen = invopen; return true; } return false; } } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_OnEnable <>9__18_0; public static hook_OnDisable <>9__18_1; public static hook_InitializeChallenge <>9__18_2; public static Func<Instruction, bool> <>9__18_11; public static Func<Instruction, bool> <>9__18_12; public static Manipulator <>9__18_3; public static Action<CharacterMaster, List<ObjectiveSourceDescriptor>> <>9__18_4; public static hook_OnInstall <>9__18_5; public static hook_OnInstall <>9__18_6; public static hook_OnUninstall <>9__18_7; public static hook_Grant <>9__18_8; public static Func<AchievementDef, bool> <>9__18_13; public static Func<AchievementDef, bool> <>9__18_14; public static Action<Run> <>9__18_9; public static Predicate<AchievementDef> <>9__18_15; public static Action<Run> <>9__18_10; public static Func<AchievementDef, bool> <>9__19_0; public static Func<NetworkUser, bool> <>9__20_0; public static Func<NetworkUser, bool> <>9__20_1; public static Predicate<AchievementDef> <>9__21_0; internal void <Awake>b__18_0(orig_OnEnable orig, ScoreboardController self) { orig.Invoke(self); invopen = true; } internal void <Awake>b__18_1(orig_OnDisable orig, ScoreboardController self) { orig.Invoke(self); invopen = false; } internal void <Awake>b__18_2(orig_InitializeChallenge orig, GameObject obj, Entry entry, EntryStatus status, UserProfile profile) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Invalid comparison between Unknown and I4 //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown orig.Invoke(obj, entry, status, profile); if ((int)status != 3) { return; } HGButton component = obj.GetComponent<HGButton>(); if ((int)status == 3) { ((MPButton)component).disableGamepadClick = false; ((MPButton)component).disablePointerClick = false; if (pins.Contains((AchievementDef)entry.extraData)) { ((Component)((Component)component).transform.Find("BGImage").Find("HasBeenUnlocked")).gameObject.SetActive(true); ((Behaviour)((Component)((Component)component).transform.Find("BGImage").Find("HasBeenUnlocked")).GetComponent<Image>()).enabled = false; } ((UnityEvent)((Button)component).onClick).AddListener(new UnityAction(ToggleAchievement(component, (AchievementDef)entry.extraData).Invoke)); } } internal void <Awake>b__18_3(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); val.GotoNext(new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, 13), (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 4) }); int index = val.Index; val.Index = index + 1; val.Remove(); val.Emit(OpCodes.Ldc_I4_3); } internal bool <Awake>b__18_11(Instruction x) { return ILPatternMatchingExt.MatchLdloc(x, 13); } internal bool <Awake>b__18_12(Instruction x) { return ILPatternMatchingExt.MatchLdcI4(x, 4); } internal void <Awake>b__18_4(CharacterMaster master, List<ObjectiveSourceDescriptor> list) { //IL_002b: 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) pinIndex = 0; trackers.Clear(); foreach (GameObject pinObject in pinObjects) { list.Add(new ObjectiveSourceDescriptor { source = (Object)(object)pinObject, master = master, objectiveType = typeof(AchievementClass) }); } } internal void <Awake>b__18_5(orig_OnInstall orig, UserAchievementManager self, LocalUser user) { Log.LogDebug((object)"Adding Achievements..."); defToClass.Clear(); orig.Invoke(self, user); Log.LogDebug((object)("Achievements: " + defToClass.Count)); } internal void <Awake>b__18_6(orig_OnInstall orig, BaseAchievement self) { orig.Invoke(self); defToClass.Add(self.achievementDef, self); } internal void <Awake>b__18_7(orig_OnUninstall orig, BaseAchievement self) { orig.Invoke(self); RemovePin(self.achievementDef); } internal void <Awake>b__18_8(orig_Grant orig, BaseAchievement self) { orig.Invoke(self); RemovePin(self.achievementDef); } internal void <Awake>b__18_9(Run run) { //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown pins = pins.Where((AchievementDef x) => defToClass.ContainsKey(x) && BetterBodyCheck(defToClass[x])).ToList(); tempPins.Clear(); Log.LogDebug((object)"Fetching Random Pins"); for (int i = pins.Count; i < RandomPins.Value; i++) { AchievementDef[] array = (from x in defToClass.Keys.Except(pins) where BetterBodyCheck(defToClass[x]) && TrialCheck(x) select x).ToArray(); if (array.Length == 0) { break; } AchievementDef item = RoR2Application.rng.NextElementUniform<AchievementDef>(array); pins.Add(item); tempPins.Add(item); } foreach (GameObject pinObject in pinObjects) { Object.Destroy((Object)(object)pinObject); } pinObjects.Clear(); foreach (AchievementDef pin in pins) { GameObject val = new GameObject("Achievement Pin Holder"); pinObjects.Add(val); val.transform.parent = ((Component)Run.instance).transform; } } internal bool <Awake>b__18_13(AchievementDef x) { return defToClass.ContainsKey(x) && BetterBodyCheck(defToClass[x]); } internal bool <Awake>b__18_14(AchievementDef x) { return BetterBodyCheck(defToClass[x]) && TrialCheck(x); } internal void <Awake>b__18_10(Run _) { pins.RemoveAll((AchievementDef x) => tempPins.Contains(x)); } internal bool <Awake>b__18_15(AchievementDef x) { return tempPins.Contains(x); } internal bool <RemovePin>b__19_0(AchievementDef x) { return BetterBodyCheck(defToClass[x]) && TrialCheck(x); } internal bool <BetterBodyCheck>b__20_0(NetworkUser x) { return ((NetworkBehaviour)x).isLocalPlayer; } internal bool <BetterBodyCheck>b__20_1(NetworkUser x) { return ((NetworkBehaviour)x).isLocalPlayer; } internal bool <TrialCheck>b__21_0(AchievementDef x) { return defToClass[x] is BaseObtainArtifactAchievement; } } public const string PluginGUID = "prodzpod.AchievementPins"; public const string PluginAuthor = "prodzpod"; public const string PluginName = "AchievementPins"; public const string PluginVersion = "1.0.0"; public static ManualLogSource Log; public static PluginInfo pluginInfo; public static ConfigFile Config; public static ConfigEntry<bool> ShowOnTab; public static ConfigEntry<bool> RemoveOnComplete; public static ConfigEntry<int> RandomPins; public static ConfigEntry<bool> RegenPins; public static List<AchievementDef> pins = new List<AchievementDef>(); public static int pinIndex = 0; public static List<AchievementClass> trackers = new List<AchievementClass>(); public static Dictionary<AchievementDef, BaseAchievement> defToClass = new Dictionary<AchievementDef, BaseAchievement>(); public static List<GameObject> pinObjects = new List<GameObject>(); public static List<AchievementDef> tempPins = new List<AchievementDef>(); public static bool invopen = false; public void Awake() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Expected O, but got Unknown //IL_00e6: 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_00f1: Expected O, but got Unknown //IL_010b: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Expected O, but got Unknown //IL_0130: 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_013b: Expected O, but got Unknown //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Expected O, but got Unknown //IL_019f: 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_01aa: Expected O, but got Unknown //IL_01c4: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: Expected O, but got Unknown //IL_01e9: 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_01f4: Expected O, but got Unknown pluginInfo = ((BaseUnityPlugin)this).Info; Log = ((BaseUnityPlugin)this).Logger; Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "prodzpod.AchievementPins.cfg"), true); ShowOnTab = Config.Bind<bool>("General", "Hide Without Inventory Key", false, "Hide pinlist until tab is pressed."); RemoveOnComplete = Config.Bind<bool>("General", "Remove on Complete", false, "Remove pin when it's completed."); RandomPins = Config.Bind<int>("General", "Pin Random Achievements", 0, "Every run will have random pins up to that amount. Manual pins overrides it."); RegenPins = Config.Bind<bool>("General", "Regenerate Pins", false, "Automatically adds a new pin upon clearing one."); object obj2 = <>c.<>9__18_0; if (obj2 == null) { hook_OnEnable val = delegate(orig_OnEnable orig, ScoreboardController self) { orig.Invoke(self); invopen = true; }; <>c.<>9__18_0 = val; obj2 = (object)val; } ScoreboardController.OnEnable += (hook_OnEnable)obj2; object obj3 = <>c.<>9__18_1; if (obj3 == null) { hook_OnDisable val2 = delegate(orig_OnDisable orig, ScoreboardController self) { orig.Invoke(self); invopen = false; }; <>c.<>9__18_1 = val2; obj3 = (object)val2; } ScoreboardController.OnDisable += (hook_OnDisable)obj3; object obj4 = <>c.<>9__18_2; if (obj4 == null) { hook_InitializeChallenge val3 = delegate(orig_InitializeChallenge orig, GameObject obj, Entry entry, EntryStatus status, UserProfile profile) { //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Invalid comparison between Unknown and I4 //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Invalid comparison between Unknown and I4 //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Expected O, but got Unknown //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Expected O, but got Unknown //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown orig.Invoke(obj, entry, status, profile); if ((int)status == 3) { HGButton component = obj.GetComponent<HGButton>(); if ((int)status == 3) { ((MPButton)component).disableGamepadClick = false; ((MPButton)component).disablePointerClick = false; if (pins.Contains((AchievementDef)entry.extraData)) { ((Component)((Component)component).transform.Find("BGImage").Find("HasBeenUnlocked")).gameObject.SetActive(true); ((Behaviour)((Component)((Component)component).transform.Find("BGImage").Find("HasBeenUnlocked")).GetComponent<Image>()).enabled = false; } ((UnityEvent)((Button)component).onClick).AddListener(new UnityAction(ToggleAchievement(component, (AchievementDef)entry.extraData).Invoke)); } } }; <>c.<>9__18_2 = val3; obj4 = (object)val3; } CategoryDef.InitializeChallenge += (hook_InitializeChallenge)obj4; object obj5 = <>c.<>9__18_3; if (obj5 == null) { Manipulator val4 = delegate(ILContext il) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) ILCursor val10 = new ILCursor(il); val10.GotoNext(new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdloc(x, 13), (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, 4) }); int index = val10.Index; val10.Index = index + 1; val10.Remove(); val10.Emit(OpCodes.Ldc_I4_3); }; <>c.<>9__18_3 = val4; obj5 = (object)val4; } LogBookController.BuildEntriesPage += (Manipulator)obj5; ObjectivePanelController.collectObjectiveSources += delegate(CharacterMaster master, List<ObjectiveSourceDescriptor> list) { //IL_002b: 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) pinIndex = 0; trackers.Clear(); foreach (GameObject pinObject in pinObjects) { list.Add(new ObjectiveSourceDescriptor { source = (Object)(object)pinObject, master = master, objectiveType = typeof(AchievementClass) }); } }; object obj6 = <>c.<>9__18_5; if (obj6 == null) { hook_OnInstall val5 = delegate(orig_OnInstall orig, UserAchievementManager self, LocalUser user) { Log.LogDebug((object)"Adding Achievements..."); defToClass.Clear(); orig.Invoke(self, user); Log.LogDebug((object)("Achievements: " + defToClass.Count)); }; <>c.<>9__18_5 = val5; obj6 = (object)val5; } UserAchievementManager.OnInstall += (hook_OnInstall)obj6; object obj7 = <>c.<>9__18_6; if (obj7 == null) { hook_OnInstall val6 = delegate(orig_OnInstall orig, BaseAchievement self) { orig.Invoke(self); defToClass.Add(self.achievementDef, self); }; <>c.<>9__18_6 = val6; obj7 = (object)val6; } BaseAchievement.OnInstall += (hook_OnInstall)obj7; object obj8 = <>c.<>9__18_7; if (obj8 == null) { hook_OnUninstall val7 = delegate(orig_OnUninstall orig, BaseAchievement self) { orig.Invoke(self); RemovePin(self.achievementDef); }; <>c.<>9__18_7 = val7; obj8 = (object)val7; } BaseAchievement.OnUninstall += (hook_OnUninstall)obj8; object obj9 = <>c.<>9__18_8; if (obj9 == null) { hook_Grant val8 = delegate(orig_Grant orig, BaseAchievement self) { orig.Invoke(self); RemovePin(self.achievementDef); }; <>c.<>9__18_8 = val8; obj9 = (object)val8; } BaseAchievement.Grant += (hook_Grant)obj9; Run.onRunStartGlobal += delegate { //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Expected O, but got Unknown pins = pins.Where((AchievementDef x) => defToClass.ContainsKey(x) && BetterBodyCheck(defToClass[x])).ToList(); tempPins.Clear(); Log.LogDebug((object)"Fetching Random Pins"); for (int i = pins.Count; i < RandomPins.Value; i++) { AchievementDef[] array = (from x in defToClass.Keys.Except(pins) where BetterBodyCheck(defToClass[x]) && TrialCheck(x) select x).ToArray(); if (array.Length == 0) { break; } AchievementDef item = RoR2Application.rng.NextElementUniform<AchievementDef>(array); pins.Add(item); tempPins.Add(item); } foreach (GameObject pinObject2 in pinObjects) { Object.Destroy((Object)(object)pinObject2); } pinObjects.Clear(); foreach (AchievementDef pin in pins) { GameObject val9 = new GameObject("Achievement Pin Holder"); pinObjects.Add(val9); val9.transform.parent = ((Component)Run.instance).transform; } }; Run.onRunDestroyGlobal += delegate { pins.RemoveAll((AchievementDef x) => tempPins.Contains(x)); }; } public static void RemovePin(AchievementDef def) { //IL_00d9: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown int num = pins.IndexOf(def); if (num == -1) { return; } pins.RemoveAt(num); tempPins.Remove(def); Object.Destroy((Object)(object)pinObjects[num]); pinObjects.RemoveAt(num); if (RegenPins.Value) { AchievementDef[] array = (from x in defToClass.Keys.Except(pins) where BetterBodyCheck(defToClass[x]) && TrialCheck(x) select x).ToArray(); if (array.Length != 0) { AchievementDef item = RoR2Application.rng.NextElementUniform<AchievementDef>(array); pins.Add(item); tempPins.Add(item); GameObject val = new GameObject("Achievement Pin Holder"); pinObjects.Add(val); val.transform.parent = ((Component)Run.instance).transform; } } } public static bool BetterBodyCheck(BaseAchievement bc) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Invalid comparison between Unknown and I4 //IL_0068: Unknown result type (might be due to invalid IL or missing references) if (bc is CrocoTotalInfectionsMilestoneAchievement || bc is CrocoKillWeakEnemiesMilestoneAchievement) { return ((Object)NetworkUser.readOnlyInstancesList.First((NetworkUser x) => ((NetworkBehaviour)x).isLocalPlayer).master.bodyPrefab).name == "CrocoBody"; } return (int)bc.LookUpRequiredBodyIndex() == -1 || BodyCatalog.GetBodyName(bc.LookUpRequiredBodyIndex()) == ((Object)NetworkUser.readOnlyInstancesList.First((NetworkUser x) => ((NetworkBehaviour)x).isLocalPlayer).master.bodyPrefab).name; } public static bool TrialCheck(AchievementDef x) { if (!pins.Exists((AchievementDef x) => defToClass[x] is BaseObtainArtifactAchievement)) { return true; } return !(defToClass[x] is BaseObtainArtifactAchievement); } public static Action ToggleAchievement(HGButton self, AchievementDef def) { return delegate { if (pins.Contains(def)) { UnpinAchievement(self, def); } else { PinAchievement(self, def); } }; } public static void PinAchievement(HGButton self, AchievementDef def) { pins.Add(def); ((Component)((Component)self).transform.Find("BGImage").Find("HasBeenUnlocked")).gameObject.SetActive(true); ((Behaviour)((Component)((Component)self).transform.Find("BGImage").Find("HasBeenUnlocked")).GetComponent<Image>()).enabled = false; Util.PlaySound("Play_UI_skill_unlock", ((Component)RoR2Application.instance).gameObject); } public static void UnpinAchievement(HGButton self, AchievementDef def) { pins.Remove(def); ((Component)((Component)self).transform.Find("BGImage").Find("HasBeenUnlocked")).gameObject.SetActive(false); Util.PlaySound("Play_UI_achievementUnlock", ((Component)RoR2Application.instance).gameObject); } } }