using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
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 HG;
using IL.RoR2;
using Microsoft.CodeAnalysis;
using Mono.Cecil.Cil;
using MonoMod.Cil;
using On.RoR2;
using R2API.AutoVersionGen;
using R2API.ContentManagement;
using RoR2;
using UnityEngine;
using UnityEngine.AddressableAssets;
[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.0.7.0")]
[assembly: AssemblyInformationalVersion("1.0.7+6c745a474257d393e2318ff045264bd02146e04e")]
[assembly: AssemblyProduct("R2API.Elites")]
[assembly: AssemblyTitle("R2API.Elites")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.7.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)
{
//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;
}
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;
EliteRamp = eliteRamp;
}
public CustomElite(EliteDef? eliteDef, IEnumerable<EliteTierDef> eliteTierDefs)
{
EliteDef = eliteDef;
EliteTierDefs = eliteTierDefs;
}
public CustomElite(EliteDef? eliteDef, IEnumerable<EliteTierDef> eliteTierDefs, Texture2D eliteRamp)
{
EliteDef = eliteDef;
EliteTierDefs = eliteTierDefs;
EliteRamp = eliteRamp;
}
}
[AutoVersion]
public static class EliteAPI
{
[CompilerGenerated]
private static class <>O
{
public static Manipulator <0>__RetrieveVanillaEliteTierCount;
public static hook_Init <1>__UseOurCombatDirectorInitInstead;
public static Action <2>__AddElitesToGame;
}
public const string PluginGUID = "com.bepis.r2api.elites";
public const string PluginName = "R2API.Elites";
public static ObservableCollection<CustomElite?>? EliteDefinitions;
private static bool _hooksEnabled;
private static bool _combatDirectorInitialized;
public static int VanillaEliteTierCount;
private static readonly List<EliteTierDef> CustomEliteTierDefs;
public const string PluginVersion = "1.0.7";
[Obsolete("All submodules are automatically loaded and this property is now unused")]
public static bool Loaded => true;
public static EliteTierDef[] VanillaEliteTiers { get; private set; }
public static EliteTierDef VanillaFirstTierDef { get; private set; }
public static EliteTierDef VanillaEliteOnlyFirstTierDef { get; private set; }
public static int CustomEliteTierCount => CustomEliteTierDefs.Count;
static EliteAPI()
{
EliteDefinitions = new ObservableCollection<CustomElite>();
_hooksEnabled = false;
CustomEliteTierDefs = new List<EliteTierDef>();
CombatDirectorInitNoTimingIssue();
VanillaEliteTiers = RetrieveVanillaEliteTiers();
VanillaFirstTierDef = RetrieveFirstVanillaTierDef();
VanillaEliteOnlyFirstTierDef = RetrieveVanillaEliteOnlyFirstTierDef();
ElitesPlugin.Logger.LogDebug((object)"EliteAPI.cctor finished.");
}
internal static void SetHooks()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_0038: Unknown result type (might be due to invalid IL or missing references)
//IL_003d: Unknown result type (might be due to invalid IL or missing references)
//IL_0043: Expected O, but got Unknown
if (!_hooksEnabled)
{
object obj = <>O.<0>__RetrieveVanillaEliteTierCount;
if (obj == null)
{
Manipulator val = RetrieveVanillaEliteTierCount;
<>O.<0>__RetrieveVanillaEliteTierCount = val;
obj = (object)val;
}
CombatDirector.Init += (Manipulator)obj;
object obj2 = <>O.<1>__UseOurCombatDirectorInitInstead;
if (obj2 == null)
{
hook_Init val2 = UseOurCombatDirectorInitInstead;
<>O.<1>__UseOurCombatDirectorInitInstead = val2;
obj2 = (object)val2;
}
CombatDirector.Init += (hook_Init)obj2;
R2APIContentPackProvider.WhenAddingContentPacks = (Action)Delegate.Combine(R2APIContentPackProvider.WhenAddingContentPacks, new Action(AddElitesToGame));
_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
//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.<0>__RetrieveVanillaEliteTierCount;
if (obj == null)
{
Manipulator val = RetrieveVanillaEliteTierCount;
<>O.<0>__RetrieveVanillaEliteTierCount = val;
obj = (object)val;
}
CombatDirector.Init -= (Manipulator)obj;
object obj2 = <>O.<1>__UseOurCombatDirectorInitInstead;
if (obj2 == null)
{
hook_Init val2 = UseOurCombatDirectorInitInstead;
<>O.<1>__UseOurCombatDirectorInitInstead = val2;
obj2 = (object)val2;
}
CombatDirector.Init -= (hook_Init)obj2;
R2APIContentPackProvider.WhenAddingContentPacks = (Action)Delegate.Remove(R2APIContentPackProvider.WhenAddingContentPacks, new Action(AddElitesToGame));
_hooksEnabled = false;
}
private static void UseOurCombatDirectorInitInstead(orig_Init orig)
{
CombatDirectorInitNoTimingIssue();
}
private static void CombatDirectorInitNoTimingIssue()
{
//IL_000e: 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_001e: 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_004f: Unknown result type (might be due to invalid IL or missing references)
//IL_0057: Expected O, but got Unknown
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Expected O, but got Unknown
//IL_007d: Unknown result type (might be due to invalid IL or missing references)
//IL_0082: Unknown result type (might be due to invalid IL or missing references)
//IL_0092: Unknown result type (might be due to invalid IL or missing references)
//IL_0097: 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_00ac: Unknown result type (might be due to invalid IL or missing references)
//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
//IL_00c1: 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_010a: Expected O, but got Unknown
//IL_0132: Unknown result type (might be due to invalid IL or missing references)
//IL_0137: Unknown result type (might be due to invalid IL or missing references)
//IL_0147: Unknown result type (might be due to invalid IL or missing references)
//IL_014c: 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_0161: 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_0176: 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_01bf: Expected O, but got Unknown
//IL_01e7: Unknown result type (might be due to invalid IL or missing references)
//IL_01ec: 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_0201: 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_0226: Unknown result type (might be due to invalid IL or missing references)
//IL_022b: Unknown result type (might be due to invalid IL or missing references)
//IL_023b: Unknown result type (might be due to invalid IL or missing references)
//IL_0240: Unknown result type (might be due to invalid IL or missing references)
//IL_0283: Unknown result type (might be due to invalid IL or missing references)
//IL_0289: Expected O, but got Unknown
//IL_02a2: Unknown result type (might be due to invalid IL or missing references)
//IL_02a7: 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_02bc: Unknown result type (might be due to invalid IL or missing references)
//IL_02cc: Unknown result type (might be due to invalid IL or missing references)
//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
//IL_02e1: 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_02f6: Unknown result type (might be due to invalid IL or missing references)
//IL_02fb: Unknown result type (might be due to invalid IL or missing references)
//IL_033e: Unknown result type (might be due to invalid IL or missing references)
//IL_0344: Expected O, but got Unknown
//IL_0363: Unknown result type (might be due to invalid IL or missing references)
//IL_0368: Unknown result type (might be due to invalid IL or missing references)
//IL_0378: Unknown result type (might be due to invalid IL or missing references)
//IL_037d: Unknown result type (might be due to invalid IL or missing references)
//IL_038d: Unknown result type (might be due to invalid IL or missing references)
//IL_0392: Unknown result type (might be due to invalid IL or missing references)
//IL_03d5: Unknown result type (might be due to invalid IL or missing references)
//IL_03db: Expected O, but got Unknown
//IL_03f4: Unknown result type (might be due to invalid IL or missing references)
//IL_03f9: Unknown result type (might be due to invalid IL or missing references)
if (!_combatDirectorInitialized)
{
List<EliteTierDef> list = new List<EliteTierDef>();
EliteTierDef item = new EliteTierDef
{
costMultiplier = 1f,
eliteTypes = (EliteDef[])(object)new EliteDef[1],
isAvailable = (EliteRules rules) => CombatDirector.NotEliteOnlyArtifactActive(),
canSelectWithoutAvailableEliteDef = true
};
list.Add(item);
EliteTierDef val = new EliteTierDef();
val.costMultiplier = CombatDirector.baseEliteCostMultiplier;
val.eliteTypes = (EliteDef[])(object)new EliteDef[4]
{
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteLightning/edLightning.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteIce/edIce.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteFire/edFire.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/DLC1/EliteEarth/edEarth.asset").WaitForCompletion()
};
val.isAvailable = (EliteRules rules) => CombatDirector.NotEliteOnlyArtifactActive() && (int)rules == 0 && Run.instance.stageClearCount < 2;
val.canSelectWithoutAvailableEliteDef = false;
item = val;
list.Add(item);
val = new EliteTierDef();
val.costMultiplier = Mathf.LerpUnclamped(1f, CombatDirector.baseEliteCostMultiplier, 0.5f);
val.eliteTypes = (EliteDef[])(object)new EliteDef[4]
{
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteLightning/edLightningHonor.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteIce/edIceHonor.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteFire/edFireHonor.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/DLC1/EliteEarth/edEarthHonor.asset").WaitForCompletion()
};
val.isAvailable = (EliteRules rules) => CombatDirector.IsEliteOnlyArtifactActive() && Run.instance.stageClearCount < 2;
val.canSelectWithoutAvailableEliteDef = false;
item = val;
list.Add(item);
val = new EliteTierDef();
val.costMultiplier = Mathf.LerpUnclamped(1f, CombatDirector.baseEliteCostMultiplier, 0.5f);
val.eliteTypes = (EliteDef[])(object)new EliteDef[5]
{
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteLightning/edLightningHonor.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteIce/edIceHonor.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteFire/edFireHonor.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/DLC1/EliteEarth/edEarthHonor.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/DLC2/Elites/EliteAurelionite/edAurelioniteHonor.asset").WaitForCompletion()
};
val.isAvailable = (EliteRules rules) => CombatDirector.IsEliteOnlyArtifactActive() && Run.instance.stageClearCount >= 2;
val.canSelectWithoutAvailableEliteDef = false;
item = val;
list.Add(item);
val = new EliteTierDef();
val.costMultiplier = CombatDirector.baseEliteCostMultiplier;
val.eliteTypes = (EliteDef[])(object)new EliteDef[5]
{
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteLightning/edLightning.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteIce/edIce.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteFire/edFire.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/DLC1/EliteEarth/edEarth.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/DLC2/Elites/EliteAurelionite/edAurelionite.asset").WaitForCompletion()
};
val.isAvailable = (EliteRules rules) => CombatDirector.NotEliteOnlyArtifactActive() && (int)rules == 0 && Run.instance.stageClearCount >= 2;
val.canSelectWithoutAvailableEliteDef = false;
item = val;
list.Add(item);
val = new EliteTierDef();
val.costMultiplier = CombatDirector.baseEliteCostMultiplier * 6f;
val.eliteTypes = (EliteDef[])(object)new EliteDef[3]
{
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/ElitePoison/edPoison.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteHaunted/edHaunted.asset").WaitForCompletion(),
Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/DLC2/Elites/EliteBead/edBead.asset").WaitForCompletion()
};
val.isAvailable = (EliteRules rules) => Run.instance.loopClearCount > 0 && (int)rules == 0;
val.canSelectWithoutAvailableEliteDef = false;
item = val;
list.Add(item);
val = new EliteTierDef();
val.costMultiplier = CombatDirector.baseEliteCostMultiplier;
val.eliteTypes = (EliteDef[])(object)new EliteDef[1] { Addressables.LoadAssetAsync<EliteDef>((object)"RoR2/Base/EliteLunar/edLunar.asset").WaitForCompletion() };
val.isAvailable = (EliteRules rules) => (int)rules == 2;
val.canSelectWithoutAvailableEliteDef = false;
item = val;
list.Add(item);
CombatDirector.eliteTiers = list.ToArray();
_combatDirectorInitialized = true;
}
}
private static void AddElitesToGame()
{
foreach (CustomElite customElite in EliteDefinitions)
{
foreach (EliteTierDef eliteTierDef in customElite.EliteTierDefs)
{
if (eliteTierDef.eliteTypes == null)
{
eliteTierDef.eliteTypes = Array.Empty<EliteDef>();
}
else if (eliteTierDef.eliteTypes.Any((EliteDef e) => (Object)(object)e == (Object)(object)customElite.EliteDef))
{
continue;
}
ArrayUtils.ArrayAppend<EliteDef>(ref eliteTierDef.eliteTypes, ref customElite.EliteDef);
}
if (Object.op_Implicit((Object)(object)customElite.EliteRamp))
{
EliteRamp.AddRamp(customElite.EliteDef, customElite.EliteRamp);
}
}
}
private static void RetrieveVanillaEliteTierCount(ILContext il)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
if (!new ILCursor(il).TryGotoNext(new Func<Instruction, bool>[2]
{
(Instruction i) => ILPatternMatchingExt.MatchLdcI4(i, ref VanillaEliteTierCount),
(Instruction i) => ILPatternMatchingExt.MatchNewarr<EliteTierDef>(i)
}))
{
ElitesPlugin.Logger.LogError((object)"Failed finding IL Instructions. Aborting RetrieveVanillaEliteTierCount IL Hook");
}
}
[MethodImpl(MethodImplOptions.NoInlining)]
public static bool Add(CustomElite? elite)
{
SetHooks();
return AddInternal(elite, Assembly.GetCallingAssembly());
}
internal static bool AddInternal(CustomElite customElite, Assembly addingAssembly)
{
if (!Object.op_Implicit((Object)(object)customElite.EliteDef))
{
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;
}
if (customElite.EliteTierDefs == null || customElite.EliteTierDefs.Count() <= 0)
{
throw new ArgumentNullException("customElite.EliteTierDefs");
}
R2APIContentManager.HandleContentAddition(addingAssembly, (Object)(object)customElite.EliteDef);
EliteDefinitions.Add(customElite);
return true;
}
private static EliteTierDef[] RetrieveVanillaEliteTiers()
{
return CombatDirector.eliteTiers;
}
private static EliteTierDef RetrieveFirstVanillaTierDef()
{
return CombatDirector.eliteTiers[1];
}
private static EliteTierDef RetrieveVanillaEliteOnlyFirstTierDef()
{
return CombatDirector.eliteTiers[2];
}
public static EliteTierDef?[]? GetCombatDirectorEliteTiers()
{
SetHooks();
return CombatDirector.eliteTiers;
}
public static void OverrideCombatDirectorEliteTiers(EliteTierDef?[]? newEliteTiers)
{
SetHooks();
CombatDirector.eliteTiers = newEliteTiers;
}
public static int AppendCustomEliteTier(EliteTierDef? eliteTierDef)
{
SetHooks();
return AddCustomEliteTier(eliteTierDef, -1);
}
public static int AddCustomEliteTier(EliteTierDef? eliteTierDef)
{
EliteTierDef eliteTierDef2 = eliteTierDef;
SetHooks();
int num = Array.FindIndex(GetCombatDirectorEliteTiers(), (EliteTierDef x) => x.costMultiplier >= eliteTierDef2.costMultiplier);
if (num >= 0)
{
return AddCustomEliteTier(eliteTierDef2, num);
}
return AppendCustomEliteTier(eliteTierDef2);
}
public static int AddCustomEliteTier(EliteTierDef? eliteTierDef, int indexToInsertAt = -1)
{
SetHooks();
_ = VanillaEliteTierCount;
_ = CustomEliteTierCount;
EliteTierDef[] combatDirectorEliteTiers = GetCombatDirectorEliteTiers();
if (combatDirectorEliteTiers != null)
{
if (indexToInsertAt == -1)
{
indexToInsertAt = combatDirectorEliteTiers.Length;
ArrayUtils.ArrayAppend<EliteTierDef>(ref combatDirectorEliteTiers, ref eliteTierDef);
}
else
{
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;
}
}
public static class EliteRamp
{
[CompilerGenerated]
private static class <>O
{
public static Manipulator <0>__UpdateRampProperly;
public static Action <1>__SetupDictionary;
public static Action<CharacterModel> <2>__UpdateRampProperly;
}
private static List<(EliteDef, Texture2D)> elitesAndRamps = new List<(EliteDef, Texture2D)>();
private static Dictionary<EliteIndex, Texture2D> eliteIndexToTexture = new Dictionary<EliteIndex, Texture2D>();
private static Texture2D vanillaEliteRamp;
private static bool _hooksEnabled = false;
private static int EliteRampPropertyID => Shader.PropertyToID("_EliteRamp");
internal static void SetHooks()
{
//IL_0018: Unknown result type (might be due to invalid IL or missing references)
//IL_001d: Unknown result type (might be due to invalid IL or missing references)
//IL_0023: Expected O, but got Unknown
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
if (!_hooksEnabled)
{
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.Combine(RoR2Application.onLoad, new Action(SetupDictionary));
vanillaEliteRamp = Addressables.LoadAssetAsync<Texture2D>((object)"RoR2/Base/Common/GlobalTextures/texRampElites.psd").WaitForCompletion();
_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));
vanillaEliteRamp = null;
_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_00b1: Unknown result type (might be due to invalid IL or missing references)
ILCursor val = new ILCursor(il);
bool flag = 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")
});
bool flag2 = val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[1]
{
(Instruction x) => ILPatternMatchingExt.MatchCallOrCallvirt<MaterialPropertyBlock>(x, "SetFloat")
});
if (flag && flag2)
{
val.Emit(OpCodes.Ldarg, 0);
val.EmitDelegate<Action<CharacterModel>>((Action<CharacterModel>)UpdateRampProperly);
}
else
{
ElitesPlugin.Logger.LogError((object)"Elite Ramp ILHook failed");
}
static void UpdateRampProperly(CharacterModel charModel)
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0007: Invalid comparison between Unknown and I4
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
if ((int)charModel.myEliteIndex != -1 && eliteIndexToTexture.TryGetValue(charModel.myEliteIndex, out Texture2D value))
{
charModel.propertyStorage.SetTexture(EliteRampPropertyID, (Texture)(object)value);
}
else
{
charModel.propertyStorage.SetTexture(EliteRampPropertyID, (Texture)(object)vanillaEliteRamp);
}
}
}
private static void SetupDictionary()
{
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
foreach (var (val, value) in elitesAndRamps)
{
eliteIndexToTexture[val.eliteIndex] = value;
}
elitesAndRamps.Clear();
}
public static void AddRamp(EliteDef eliteDef, Texture2D ramp)
{
SetHooks();
try
{
eliteDef.shaderEliteRampIndex = 0;
elitesAndRamps.Add((eliteDef, ramp));
}
catch (Exception ex)
{
ElitesPlugin.Logger.LogError((object)ex);
}
}
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;
}
public static void AddRampToMultipleElites(IEnumerable<EliteDef> eliteDefs, Texture2D ramp)
{
SetHooks();
foreach (EliteDef eliteDef in eliteDefs)
{
AddRamp(eliteDef, ramp);
}
}
}
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.bepis.r2api.elites", "R2API.Elites", "1.0.7")]
public sealed class ElitesPlugin : BaseUnityPlugin
{
internal static ManualLogSource Logger { get; set; }
private void Awake()
{
Logger = ((BaseUnityPlugin)this).Logger;
EliteAPI.SetHooks();
EliteRamp.SetHooks();
}
private void OnDestroy()
{
EliteAPI.UnsetHooks();
EliteRamp.UnsetHooks();
}
}
}
namespace R2API.AutoVersionGen
{
[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
internal class AutoVersionAttribute : Attribute
{
}
}