using 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);
}
}
}