Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of R2API Elites v1.1.0
plugins/R2API.Elites/R2API.Elites.dll
Decompiled 2 days agousing System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; 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 System.Text.RegularExpressions; using BepInEx; using BepInEx.Logging; using HG; using IL.RoR2; using Microsoft.CodeAnalysis; using Mono.Cecil; using Mono.Cecil.Cil; using MonoMod.Cil; using MonoMod.Utils; using On.RoR2; using R2API.AutoVersionGen; using R2API.ContentManagement; using RoR2; using RoR2BepInExPack.GameAssetPaths; using RoR2BepInExPack.GameAssetPaths.Version_1_39_0; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.ResourceManagement.AsyncOperations; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("R2API.Elites")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.1.0.0")] [assembly: AssemblyInformationalVersion("1.1.0+2598e052d6bdcbb09d1c362d7c32ff182e556924")] [assembly: AssemblyProduct("R2API.Elites")] [assembly: AssemblyTitle("R2API.Elites")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.1.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.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [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 System.Diagnostics.CodeAnalysis { [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullAttribute : Attribute { public string[] Members { get; } public MemberNotNullAttribute(string member) { Members = new string[1] { member }; } public MemberNotNullAttribute(params string[] members) { Members = members; } } [AttributeUsage(AttributeTargets.Method | AttributeTargets.Property, Inherited = false, AllowMultiple = true)] [ExcludeFromCodeCoverage] [DebuggerNonUserCode] internal sealed class MemberNotNullWhenAttribute : Attribute { public bool ReturnValue { get; } public string[] Members { get; } public MemberNotNullWhenAttribute(bool returnValue, string member) { ReturnValue = returnValue; Members = new string[1] { member }; } public MemberNotNullWhenAttribute(bool returnValue, params string[] members) { ReturnValue = returnValue; Members = members; } } } namespace R2API { public class CustomElite { public EliteDef EliteDef; public Texture2D? EliteRamp; public IEnumerable<EliteTierDef> EliteTierDefs; public CustomElite(string name, EquipmentDef equipmentDef, Color32 color, string modifierToken, IEnumerable<EliteTierDef> eliteTierDefs) : this(name, equipmentDef, color, modifierToken, eliteTierDefs, null) { }//IL_0003: Unknown result type (might be due to invalid IL or missing references) public CustomElite(string name, EquipmentDef equipmentDef, Color32 color, string modifierToken, IEnumerable<EliteTierDef> eliteTierDefs, Texture2D? eliteRamp) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) EliteDef = ScriptableObject.CreateInstance<EliteDef>(); ((Object)EliteDef).name = name; EliteDef.eliteEquipmentDef = equipmentDef; EliteDef.color = color; EliteDef.modifierToken = modifierToken; EliteTierDefs = eliteTierDefs ?? Array.Empty<EliteTierDef>(); EliteRamp = eliteRamp; } public CustomElite(EliteDef eliteDef, IEnumerable<EliteTierDef> eliteTierDefs) : this(eliteDef, eliteTierDefs, null) { } public CustomElite(EliteDef eliteDef, IEnumerable<EliteTierDef> eliteTierDefs, Texture2D? eliteRamp) { EliteDef = eliteDef; EliteTierDefs = eliteTierDefs ?? Array.Empty<EliteTierDef>(); EliteRamp = eliteRamp; } } [AutoVersion] public static class EliteAPI { [CompilerGenerated] private static class <>O { public static hook_Init <0>__CopyCombatDirectorTiers; public static Manipulator <1>__InitEarlyCombatDirector; public static Func<EliteTierDef, int, EliteTierDef> <2>__UseExistingTierDef; } public const string PluginGUID = "com.bepis.r2api.elites"; public const string PluginName = "R2API.Elites"; public static ObservableCollection<CustomElite> EliteDefinitions = new ObservableCollection<CustomElite>(); public static int VanillaEliteTierCount; private static readonly List<EliteTierDef> CustomEliteTierDefs = new List<EliteTierDef>(); private static EliteTierDef[] _vanillaEliteTiers = Array.Empty<EliteTierDef>(); private static bool _hooksEnabled = false; private static bool _resolvedFields = false; public const string PluginVersion = "1.1.0"; public static EliteTierDef[] VanillaEliteTiers { get { SetHooks(); return _vanillaEliteTiers; } private set { _vanillaEliteTiers = value; } } public static EliteTierDef VanillaFirstTierDef => GetVanillaEliteTierDef(VanillaEliteTier.BaseTier1); public static EliteTierDef VanillaEliteOnlyFirstTierDef => GetVanillaEliteTierDef(VanillaEliteTier.BaseTier1Honor); public static int CustomEliteTierCount => CustomEliteTierDefs.Count; [Obsolete("All submodules are automatically loaded and this property is now unused")] public static bool Loaded => true; public static EliteTierDef GetVanillaEliteTierDef(VanillaEliteTier tier) { return ArrayUtils.GetSafe<EliteTierDef>(VanillaEliteTiers, (int)tier); } internal static void Init() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__CopyCombatDirectorTiers; if (obj == null) { hook_Init val = CopyCombatDirectorTiers; <>O.<0>__CopyCombatDirectorTiers = val; obj = (object)val; } CombatDirector.Init += (hook_Init)obj; } internal static void SetHooks() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Expected O, but got Unknown if (_hooksEnabled) { return; } _hooksEnabled = true; if (CombatDirector.eliteTiers == null) { object obj = <>O.<1>__InitEarlyCombatDirector; if (obj == null) { Manipulator val = InitEarlyCombatDirector; <>O.<1>__InitEarlyCombatDirector = val; obj = (object)val; } CombatDirector.Init += (Manipulator)obj; CombatDirector.Init(); } } internal static void UnsetHooks() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Expected O, but got Unknown object obj = <>O.<1>__InitEarlyCombatDirector; if (obj == null) { Manipulator val = InitEarlyCombatDirector; <>O.<1>__InitEarlyCombatDirector = val; obj = (object)val; } CombatDirector.Init -= (Manipulator)obj; object obj2 = <>O.<0>__CopyCombatDirectorTiers; if (obj2 == null) { hook_Init val2 = CopyCombatDirectorTiers; <>O.<0>__CopyCombatDirectorTiers = val2; obj2 = (object)val2; } CombatDirector.Init -= (hook_Init)obj2; _hooksEnabled = false; } private static void CopyCombatDirectorTiers(orig_Init orig) { orig.Invoke(); if (VanillaEliteTierCount == 0) { VanillaEliteTiers = CombatDirector.eliteTiers.ToArray(); VanillaEliteTierCount = CombatDirector.eliteTiers.Length; } AddElitesToGame(); } private static void InitEarlyCombatDirector(ILContext il) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Expected O, but got Unknown //IL_0017: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); int idx = 0; while (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2] { (Instruction x) => ILPatternMatchingExt.MatchLdcI4(x, ref idx), (Instruction x) => ILPatternMatchingExt.MatchNewobj<EliteTierDef>(x) })) { val.Emit(OpCodes.Ldc_I4, idx); val.EmitDelegate<Func<EliteTierDef, int, EliteTierDef>>((Func<EliteTierDef, int, EliteTierDef>)UseExistingTierDef); } ResolveFieldInfo(il); } private static EliteTierDef UseExistingTierDef(EliteTierDef tierDef, int index) { return ArrayUtils.GetSafe<EliteTierDef>(VanillaEliteTiers, index, ref tierDef); } private static void ResolveFieldInfo(ILContext il) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown //IL_003e: 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) if (_resolvedFields || !TryLoadTokensFromFile(out Dictionary<string, string> assetNameToGuid)) { return; } ILCursor val = new ILCursor(il); FieldReference fieldRef = null; while (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, ref fieldRef) })) { if (!assetNameToGuid.TryGetValue(((MemberReference)fieldRef).Name, out var value)) { continue; } EliteDef val2 = Addressables.LoadAssetAsync<EliteDef>((object)value).WaitForCompletion(); if (val2 == null) { ElitesPlugin.Logger.LogWarning((object)("Failed to load addressable " + ((MemberReference)fieldRef).Name + " | " + value)); continue; } FieldInfo fieldInfo = ReflectionHelper.ResolveReflection(fieldRef); if (fieldInfo.GetValue(null) == null) { fieldInfo.SetValue(null, val2); } } _resolvedFields = true; } private static bool TryLoadTokensFromFile(out Dictionary<string, string> assetNameToGuid) { assetNameToGuid = null; try { string[] array = default(string[]); string[] array2 = default(string[]); GameAssetPathsSerde.Deserialize(Path.Combine(Directory.GetParent(typeof(GameAssetPathsSerde).Assembly.Location).FullName, "GameAssetPaths.bin"), ref array, ref array2); Regex regex = new Regex("RoR2.*/ed[A-Z].*asset"); assetNameToGuid = new Dictionary<string, string>(); for (int i = 0; i < array.Length; i++) { string text = array[i]; if (regex.IsMatch(text)) { string text2 = text.Split('/')[^1]; string key = text2.Substring(2, text2.Length - 6 - 2); assetNameToGuid[key] = array2[i]; } } return true; } catch (Exception ex) { ElitesPlugin.Logger.LogError((object)("Failed to load elite addressable tokens from file: " + ex)); } return false; } [MethodImpl(MethodImplOptions.NoInlining)] public static bool Add(CustomElite? elite) { SetHooks(); return AddInternal(elite, Assembly.GetCallingAssembly()); } public static int AppendCustomEliteTier(EliteTierDef? eliteTierDef) { SetHooks(); return AddCustomEliteTier(eliteTierDef, -1); } public static int AddCustomEliteTier(EliteTierDef? eliteTierDef) { EliteTierDef eliteTierDef2 = eliteTierDef; SetHooks(); if (eliteTierDef2 == null) { ElitesPlugin.Logger.LogError((object)"EliteTierDef cannot be null"); return -1; } int indexToInsertAt = Array.FindIndex(GetCombatDirectorEliteTiers(), (EliteTierDef x) => x.costMultiplier >= eliteTierDef2.costMultiplier); return AddCustomEliteTier(eliteTierDef2, indexToInsertAt); } public static int AddCustomEliteTier(EliteTierDef? eliteTierDef, int indexToInsertAt = -1) { SetHooks(); if (eliteTierDef == null) { ElitesPlugin.Logger.LogError((object)"EliteTierDef cannot be null"); return -1; } EliteTierDef val = eliteTierDef; if (val.eliteTypes == null) { val.eliteTypes = Array.Empty<EliteDef>(); } EliteTierDef[] combatDirectorEliteTiers = GetCombatDirectorEliteTiers(); if (combatDirectorEliteTiers != null) { if (indexToInsertAt == -1) { indexToInsertAt = combatDirectorEliteTiers.Length; } ArrayUtils.ArrayInsert<EliteTierDef>(ref combatDirectorEliteTiers, indexToInsertAt, ref eliteTierDef); OverrideCombatDirectorEliteTiers(combatDirectorEliteTiers); } CustomEliteTierDefs.Add(eliteTierDef); ElitesPlugin.Logger.LogInfo((object)$"Custom Elite Tier : (Index : {indexToInsertAt}) added"); return indexToInsertAt; } internal static bool AddInternal(CustomElite? customElite, Assembly addingAssembly) { if ((Object)(object)customElite?.EliteDef == (Object)null) { throw new ArgumentNullException("customElite.EliteDef"); } if (!CatalogBlockers.GetAvailability<EliteDef>()) { ElitesPlugin.Logger.LogError((object)("Too late ! Tried to add elite: " + customElite.EliteDef.modifierToken + " after the EliteCatalog has initialized!")); return false; } R2APIContentManager.HandleContentAddition(addingAssembly, (Object)(object)customElite.EliteDef); EliteDefinitions.Add(customElite); return true; } private static void AddElitesToGame() { foreach (CustomElite eliteDefinition in EliteDefinitions) { if (Object.op_Implicit((Object)(object)eliteDefinition.EliteRamp)) { EliteRamp.AddRamp(eliteDefinition.EliteDef, eliteDefinition.EliteRamp); } foreach (EliteTierDef eliteTierDef in eliteDefinition.EliteTierDefs) { if (Array.IndexOf(eliteTierDef.eliteTypes, eliteDefinition.EliteDef) == -1) { ArrayUtils.ArrayAppend<EliteDef>(ref eliteTierDef.eliteTypes, ref eliteDefinition.EliteDef); } } } } public static IEnumerable<EliteTierDef> GetEliteTierEnumerable(VanillaEliteTier tier) { return tier switch { VanillaEliteTier.None => Array.Empty<EliteTierDef>(), VanillaEliteTier.BaseTier1 => new <>z__ReadOnlyArray<EliteTierDef>((EliteTierDef[])(object)new EliteTierDef[2] { GetVanillaEliteTierDef(tier), GetVanillaEliteTierDef(VanillaEliteTier.FullTier1) }), VanillaEliteTier.BaseTier1Honor => new <>z__ReadOnlyArray<EliteTierDef>((EliteTierDef[])(object)new EliteTierDef[2] { GetVanillaEliteTierDef(tier), GetVanillaEliteTierDef(VanillaEliteTier.FullTier1Honor) }), _ => new <>z__ReadOnlySingleElementList<EliteTierDef>(GetVanillaEliteTierDef(tier)), }; } public static IEnumerable<EliteTierDef> GetHonorEliteTierEnumerable(VanillaEliteTier tier) { switch (tier) { case VanillaEliteTier.BaseTier1: case VanillaEliteTier.BaseTier1Honor: return new <>z__ReadOnlyArray<EliteTierDef>((EliteTierDef[])(object)new EliteTierDef[2] { GetVanillaEliteTierDef(VanillaEliteTier.BaseTier1Honor), GetVanillaEliteTierDef(VanillaEliteTier.FullTier1Honor) }); case VanillaEliteTier.FullTier1Honor: case VanillaEliteTier.FullTier1: return new <>z__ReadOnlySingleElementList<EliteTierDef>(GetVanillaEliteTierDef(VanillaEliteTier.FullTier1Honor)); default: return Array.Empty<EliteTierDef>(); } } public static EliteTierDef[] GetCombatDirectorEliteTiers() { SetHooks(); return CombatDirector.eliteTiers; } public static void OverrideCombatDirectorEliteTiers(EliteTierDef[] newEliteTiers) { SetHooks(); CombatDirector.eliteTiers = newEliteTiers; } } public static class EliteRamp { [CompilerGenerated] private static class <>O { public static Manipulator <0>__UpdateRampProperly; public static Action <1>__SetupDictionary; public static Action<CharacterModel> <2>__UpdateRampFromModel; } private static readonly Dictionary<EliteDef, Texture2D> _elitesAndRamps = new Dictionary<EliteDef, Texture2D>(); private static readonly Dictionary<EliteIndex, Texture2D> _eliteIndexToTexture = new Dictionary<EliteIndex, Texture2D>(); private static int _eliteRampPropertyID; private static bool _hooksEnabled = false; internal static void SetHooks() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown if (!_hooksEnabled) { AsyncOperationHandle<Texture2D> val = Addressables.LoadAssetAsync<Texture2D>((object)RoR2_Base_Common_GlobalTextures.texRampElites_psd); val.Completed += delegate(AsyncOperationHandle<Texture2D> task) { _eliteIndexToTexture[(EliteIndex)(-1)] = task.Result; }; object obj = <>O.<0>__UpdateRampProperly; if (obj == null) { Manipulator val2 = UpdateRampProperly; <>O.<0>__UpdateRampProperly = val2; obj = (object)val2; } CharacterModel.UpdateMaterials += (Manipulator)obj; RoR2Application.onLoad = (Action)Delegate.Combine(RoR2Application.onLoad, new Action(SetupDictionary)); _hooksEnabled = true; } } internal static void UnsetHooks() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown object obj = <>O.<0>__UpdateRampProperly; if (obj == null) { Manipulator val = UpdateRampProperly; <>O.<0>__UpdateRampProperly = val; obj = (object)val; } CharacterModel.UpdateMaterials -= (Manipulator)obj; RoR2Application.onLoad = (Action)Delegate.Remove(RoR2Application.onLoad, new Action(SetupDictionary)); _hooksEnabled = false; } private static void UpdateRampProperly(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[3] { (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0), (Instruction x) => ILPatternMatchingExt.MatchLdfld<CharacterModel>(x, "propertyStorage"), (Instruction x) => ILPatternMatchingExt.MatchLdsfld(x, typeof(CommonShaderProperties), "_EliteIndex") })) { ElitesPlugin.Logger.LogError((object)"Elite Ramp ILHook failed #1"); return; } if (!val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1] { (Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<MaterialPropertyBlock>(x, "SetFloat") })) { ElitesPlugin.Logger.LogError((object)"Elite Ramp ILHook failed #2"); return; } val.Emit(OpCodes.Ldarg, 0); val.EmitDelegate<Action<CharacterModel>>((Action<CharacterModel>)UpdateRampFromModel); } private static void UpdateRampFromModel(CharacterModel model) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (!_eliteIndexToTexture.TryGetValue(model.myEliteIndex, out Texture2D value)) { value = _eliteIndexToTexture[(EliteIndex)(-1)]; } model.propertyStorage.SetTexture(_eliteRampPropertyID, (Texture)(object)value); } private static void SetupDictionary() { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Invalid comparison between Unknown and I4 //IL_004c: Unknown result type (might be due to invalid IL or missing references) _eliteRampPropertyID = Shader.PropertyToID("_EliteRamp"); foreach (var (val3, value) in _elitesAndRamps) { if (Object.op_Implicit((Object)(object)val3) && (int)val3.eliteIndex != -1) { _eliteIndexToTexture[val3.eliteIndex] = value; } } _elitesAndRamps.Clear(); } public static void AddRamp(EliteDef eliteDef, Texture2D ramp) { SetHooks(); if (!Object.op_Implicit((Object)(object)eliteDef)) { ElitesPlugin.Logger.LogError((object)"Attempted to set a texture ramp for a null elite def!"); return; } if (_elitesAndRamps.TryGetValue(eliteDef, out Texture2D value) && (Object)(object)value != (Object)(object)ramp) { ElitesPlugin.Logger.LogWarning((object)("Texture ramp for " + (((Object)eliteDef).name ?? eliteDef.modifierToken) + " already exists. The new texture will be used instead.")); } eliteDef.shaderEliteRampIndex = 0; _elitesAndRamps[eliteDef] = ramp; } public static void AddRampToMultipleElites(IEnumerable<EliteDef> eliteDefs, Texture2D ramp) { SetHooks(); foreach (EliteDef eliteDef in eliteDefs) { AddRamp(eliteDef, ramp); } } public static bool TryGetRamp(EliteIndex eliteIndex, out Texture2D ramp) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 //IL_0011: Unknown result type (might be due to invalid IL or missing references) SetHooks(); ramp = null; if ((int)eliteIndex != -1) { return _eliteIndexToTexture.TryGetValue(eliteIndex, out ramp); } return false; } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.bepis.r2api.elites", "R2API.Elites", "1.1.0")] public sealed class ElitesPlugin : BaseUnityPlugin { internal static ManualLogSource Logger { get; set; } private void Awake() { Logger = ((BaseUnityPlugin)this).Logger; EliteAPI.Init(); } private void OnDestroy() { EliteAPI.UnsetHooks(); EliteRamp.UnsetHooks(); } } public enum VanillaEliteTier { None, BaseTier1, BaseTier1Honor, FullTier1Honor, FullTier1, Tier2, Lunar } } namespace R2API.AutoVersionGen { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] internal class AutoVersionAttribute : Attribute { } } [CompilerGenerated] internal sealed class <>z__ReadOnlyArray<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { int ICollection.Count => _items.Length; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => _items.Length; T IReadOnlyList<T>.this[int index] => _items[index]; int ICollection<T>.Count => _items.Length; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { return _items[index]; } set { throw new NotSupportedException(); } } public <>z__ReadOnlyArray(T[] items) { _items = items; } IEnumerator IEnumerable.GetEnumerator() { return ((IEnumerable)_items).GetEnumerator(); } void ICollection.CopyTo(Array array, int index) { ((ICollection)_items).CopyTo(array, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return ((IList)_items).Contains(value); } int IList.IndexOf(object value) { return ((IList)_items).IndexOf(value); } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return ((IEnumerable<T>)_items).GetEnumerator(); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return ((ICollection<T>)_items).Contains(item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { ((ICollection<T>)_items).CopyTo(array, arrayIndex); } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { return ((IList<T>)_items).IndexOf(item); } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } } [CompilerGenerated] internal sealed class <>z__ReadOnlySingleElementList<T> : IEnumerable, ICollection, IList, IEnumerable<T>, IReadOnlyCollection<T>, IReadOnlyList<T>, ICollection<T>, IList<T> { private sealed class Enumerator : IDisposable, IEnumerator, IEnumerator<T> { object IEnumerator.Current => _item; T IEnumerator<T>.Current => _item; public Enumerator(T item) { _item = item; } bool IEnumerator.MoveNext() { if (!_moveNextCalled) { return _moveNextCalled = true; } return false; } void IEnumerator.Reset() { _moveNextCalled = false; } void IDisposable.Dispose() { } } int ICollection.Count => 1; bool ICollection.IsSynchronized => false; object ICollection.SyncRoot => this; object IList.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } bool IList.IsFixedSize => true; bool IList.IsReadOnly => true; int IReadOnlyCollection<T>.Count => 1; T IReadOnlyList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } } int ICollection<T>.Count => 1; bool ICollection<T>.IsReadOnly => true; T IList<T>.this[int index] { get { if (index != 0) { throw new IndexOutOfRangeException(); } return _item; } set { throw new NotSupportedException(); } } public <>z__ReadOnlySingleElementList(T item) { _item = item; } IEnumerator IEnumerable.GetEnumerator() { return new Enumerator(_item); } void ICollection.CopyTo(Array array, int index) { array.SetValue(_item, index); } int IList.Add(object value) { throw new NotSupportedException(); } void IList.Clear() { throw new NotSupportedException(); } bool IList.Contains(object value) { return EqualityComparer<T>.Default.Equals(_item, (T)value); } int IList.IndexOf(object value) { if (!EqualityComparer<T>.Default.Equals(_item, (T)value)) { return -1; } return 0; } void IList.Insert(int index, object value) { throw new NotSupportedException(); } void IList.Remove(object value) { throw new NotSupportedException(); } void IList.RemoveAt(int index) { throw new NotSupportedException(); } IEnumerator<T> IEnumerable<T>.GetEnumerator() { return new Enumerator(_item); } void ICollection<T>.Add(T item) { throw new NotSupportedException(); } void ICollection<T>.Clear() { throw new NotSupportedException(); } bool ICollection<T>.Contains(T item) { return EqualityComparer<T>.Default.Equals(_item, item); } void ICollection<T>.CopyTo(T[] array, int arrayIndex) { array[arrayIndex] = _item; } bool ICollection<T>.Remove(T item) { throw new NotSupportedException(); } int IList<T>.IndexOf(T item) { if (!EqualityComparer<T>.Default.Equals(_item, item)) { return -1; } return 0; } void IList<T>.Insert(int index, T item) { throw new NotSupportedException(); } void IList<T>.RemoveAt(int index) { throw new NotSupportedException(); } }