Decompiled source of VarianceAPI v2.2.0
plugins/VarianceAPI.dll
Decompiled 2 months ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using DebugToolkit; using EntityStates; using EntityStates.Gup; using HG; using HG.Reflection; using IL.EntityStates.Gup; using KinematicCharacterController; using MSU; using MSU.Config; using Mono.Cecil.Cil; using MonoMod.Cil; using On.RoR2; using On.RoR2.UI; using R2API; using R2API.AddressReferencedAssets; using R2API.ScriptableObjects; using R2API.Utils; using RiskOfOptions; using RiskOfOptions.OptionConfigs; using RoR2; using RoR2.CharacterAI; using RoR2.ConVar; using RoR2.ContentManagement; using RoR2.ExpansionManagement; using RoR2.Skills; using RoR2.UI; using UnityEngine; using UnityEngine.AddressableAssets; using UnityEngine.Networking; using UnityEngine.ResourceManagement.AsyncOperations; using UnityEngine.Serialization; using UnityEngine.UI; using VAPI.Components; using VAPI.Modules; using VAPI.RuleSystem; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: OptIn] [assembly: InternalsVisibleTo("VarianceAPI.Editor")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("0.0.0.0")] [module: UnverifiableCode] namespace EntityStates { public class EmptyState : BaseState { public override void FixedUpdate() { ((EntityState)this).FixedUpdate(); ((EntityState)this).outer.SetNextStateToMain(); } } } namespace VAPI { internal static class Commands { [ConCommand(/*Could not decode attribute arguments.*/)] private static void CCvapi_ListBodies(ConCommandArgs args) { //IL_0032: Unknown result type (might be due to invalid IL or missing references) List<string> list = new List<string>(); list.Add("Modified Bodies:"); list.Add("----------------"); foreach (BodyVariantDefProvider instance in BodyVariantDefProvider.instances) { GameObject bodyPrefab = BodyCatalog.GetBodyPrefab(instance.tiedIndex); list.Add($"{((Object)bodyPrefab).name} (VariantDef count: {instance.totalVariantCount})"); } Debug.Log((object)string.Join("\n", list)); } [ConCommand(/*Could not decode attribute arguments.*/)] private static void CCvapi_ListVariants(ConCommandArgs args) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) if (((ConCommandArgs)(ref args)).Count == 0) { Debug.Log((object)"No arguments given."); return; } BodyIndex bodyFromPartial = StringFinder.Instance.GetBodyFromPartial(((ConCommandArgs)(ref args))[0]); if ((int)bodyFromPartial == -1) { Debug.Log((object)"No body could be found with that name. To get a list of bodies that have variants, use \"vapi_list_bodies\"."); return; } BodyVariantDefProvider bodyVariantDefProvider = BodyVariantDefProvider.FindProvider(bodyFromPartial); if (bodyVariantDefProvider == null) { Debug.Log((object)"The body provided does not have a BodyVariantDefProvider. To get a list of bodies that have variants, use \"vapi_list_bodies\"."); return; } List<string> list = new List<string>(); list.Add($"{bodyFromPartial}'s Variants"); list.Add("-----------------------"); for (int i = 0; i < bodyVariantDefProvider.totalVariantCount; i++) { VariantDef variantDef = bodyVariantDefProvider.GetVariantDef(i); list.Add($"{i} - {((Object)variantDef).name}"); } Debug.Log((object)string.Join("\n", list)); } [ConCommand(/*Could not decode attribute arguments.*/)] public static void SpawnVariant(ConCommandArgs args) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0095: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)args.sender == (Object)null) { Debug.Log((object)"Sender does not exist"); return; } if (((ConCommandArgs)(ref args)).Count == 0) { Debug.Log((object)"No Arguments Given."); return; } MasterIndex aiFromPartial = StringFinder.Instance.GetAiFromPartial(((ConCommandArgs)(ref args))[0]); if (aiFromPartial == MasterIndex.none) { Debug.Log((object)"Could not find master."); return; } GameObject masterPrefab = MasterCatalog.GetMasterPrefab(aiFromPartial); string[] array = Array.Empty<string>(); for (int i = 1; i < ((ConCommandArgs)(ref args)).Count; i++) { string text = ((ConCommandArgs)(ref args))[i]; ArrayUtils.ArrayAppend<string>(ref array, ref text); } List<VariantDef> list = new List<VariantDef>(); VariantDef[] allVariants = BodyVariantDefProvider.FindProvider(aiFromPartial).GetAllVariants(filtered: false); string[] array2 = array; foreach (string text2 in array2) { foreach (VariantDef variantDef in allVariants) { if (((Object)variantDef).name.ToLowerInvariant().Contains(text2.ToLowerInvariant())) { list.Add(variantDef); break; } } } Vector3 position = args.sender.master.GetBody().transform.position; VariantSummon variantSummon = new VariantSummon(); variantSummon.variantDefs = list.ToArray(); ((MasterSummon)variantSummon).ignoreTeamMemberLimit = true; ((MasterSummon)variantSummon).useAmbientLevel = false; ((MasterSummon)variantSummon).masterPrefab = masterPrefab; ((MasterSummon)variantSummon).position = position; ((MasterSummon)variantSummon).rotation = Quaternion.identity; ((MasterSummon)variantSummon).summonerBodyObject = null; ((MasterSummon)variantSummon).teamIndexOverride = masterPrefab.GetComponent<CharacterMaster>().teamIndex; variantSummon.PerformSummon(); List<string> list2 = new List<string>(); list2.Add("Spawned a " + ((Object)masterPrefab).name + " with the following VariantDefs"); for (int l = 0; l < list.Count; l++) { list2.Add($"{l} - {((Object)list[l]).name}"); } Debug.Log((object)string.Join("\n", list2)); } [ConCommand(/*Could not decode attribute arguments.*/)] public static void SpawnAsVariant(ConCommandArgs args) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Invalid comparison between Unknown and I4 //IL_0036: 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_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_012c: 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_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Expected O, but got Unknown //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) if (((ConCommandArgs)(ref args)).Count == 0) { Debug.Log((object)"No Arguments Given"); return; } BodyIndex bodyFromPartial = StringFinder.Instance.GetBodyFromPartial(((ConCommandArgs)(ref args))[0]); if ((int)bodyFromPartial == -1) { Debug.Log((object)"No body could be found with that name"); return; } GameObject bodyPrefab = BodyCatalog.GetBodyPrefab(bodyFromPartial); if ((Object)(object)args.sender == (Object)null) { Debug.Log((object)"Sender does not exist"); return; } CharacterMaster senderMaster = ((ConCommandArgs)(ref args)).senderMaster; if (!Object.op_Implicit((Object)(object)senderMaster.GetBody())) { Debug.Log((object)"Master has no body"); return; } string[] array = Array.Empty<string>(); for (int i = 1; i < ((ConCommandArgs)(ref args)).Count; i++) { string text = ((ConCommandArgs)(ref args))[i]; ArrayUtils.ArrayAppend<string>(ref array, ref text); } List<VariantDef> list = new List<VariantDef>(); VariantDef[] allVariants = BodyVariantDefProvider.FindProvider(bodyFromPartial).GetAllVariants(filtered: false); string[] array2 = array; foreach (string text2 in array2) { foreach (VariantDef variantDef in allVariants) { if (((Object)variantDef).name.ToLowerInvariant().Contains(text2.ToLowerInvariant())) { list.Add(variantDef); break; } } } senderMaster.bodyPrefab = bodyPrefab; List<string> list2 = new List<string>(); list2.Add($"{args.sender.userName} is spawning as {bodyFromPartial} with the following VariantDefs:"); BoolConVar val = (BoolConVar)Reflection.GetFieldCached(typeof(Stage), "stage1PodConVar").GetValue(null); bool value = val.value; val.SetBool(false); CharacterBody val2 = senderMaster.Respawn(senderMaster.GetBody().footPosition, senderMaster.GetBody().transform.rotation, false); if (Object.op_Implicit((Object)(object)val2)) { ((Component)val2).gameObject.AddComponent<DoNotTurnIntoVariant>(); BodyVariantManager component = ((Component)val2).GetComponent<BodyVariantManager>(); BodyVariantReward component2 = ((Component)val2).GetComponent<BodyVariantReward>(); if (Object.op_Implicit((Object)(object)component)) { component.AddVariants(list); } if (Object.op_Implicit((Object)(object)component2)) { component2.AddVariants(list); } } for (int l = 0; l < list.Count; l++) { list2.Add($"{l} - {((Object)list[l]).name}"); } Debug.Log((object)string.Join("\n", list2)); val.SetBool(value); } } public enum VariantIndex { None = -1 } public enum VariantTierIndex { None = -1, Common, Uncommon, Rare, Legendary, AssignedAtRuntime } public enum VariantPackIndex { None = -1 } public enum ComponentAttachmentType { Body, Master, Model } public enum OverrideNameType { Prefix, Suffix, Complete } [Flags] public enum BasicAIModifier { Default = 0, Unstable = 1, ForceSprint = 2 } public enum MeshType { Default, Beetle, BeetleGuard, MiniMushrum, MagmaWorm, OverloadingWorm } public class VariantDefIndexComparer : IEqualityComparer<VariantDef> { public bool Equals(VariantDef x, VariantDef y) { VariantIndex num = (Object.op_Implicit((Object)(object)x) ? x.variantIndex : VariantIndex.None); VariantIndex variantIndex = (Object.op_Implicit((Object)(object)y) ? y.variantIndex : VariantIndex.None); return num == variantIndex; } public int GetHashCode(VariantDef obj) { if (!Object.op_Implicit((Object)(object)obj)) { return -1; } return obj.variantIndex.GetHashCode(); } } public static class GupVariantHelper { private static List<VariantDef> _blacklistedVariants = new List<VariantDef>(); private static Dictionary<VariantDef, VariantDef> _gupToGeep = new Dictionary<VariantDef, VariantDef>(new VariantDefIndexComparer()); private static Dictionary<VariantDef, VariantDef> _geepToGip = new Dictionary<VariantDef, VariantDef>(new VariantDefIndexComparer()); public static void AddToBlacklist(VariantDef variantToBlacklist) { _blacklistedVariants.Add(variantToBlacklist); } public static void AddGupProgression(VariantDef gupVariant, VariantDef geepVariant, VariantDef gipVariant) { ((ResourceAvailability)(ref VariantCatalog.availability)).CallWhenAvailable((Action)delegate { _gupToGeep.Add(gupVariant, geepVariant); _geepToGip.Add(geepVariant, gipVariant); }); } internal static void HandleDeathState(ILContext context) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Expected O, but got Unknown ILCursor val = new ILCursor(context); if (!val.TryGotoNext(new Func<Instruction, bool>[4] { (Instruction x) => ILPatternMatchingExt.MatchDup(x), (Instruction x) => ILPatternMatchingExt.MatchLdarg(x, 0), (Instruction x) => ILPatternMatchingExt.MatchLdfld<BaseSplitDeath>(x, "moneyMultiplier"), (Instruction x) => ILPatternMatchingExt.MatchStfld<BodySplitter>(x, "moneyMultiplier") })) { VAPILog.Fatal("Failed to reach specific destination for handling Gup's death states!", 45, "HandleDeathState"); BaseSplitDeath.FixedUpdate -= new Manipulator(HandleDeathState); } else { val.Emit(OpCodes.Dup); val.Emit(OpCodes.Ldarg_0); val.EmitDelegate<Action<BodySplitter, BaseSplitDeath>>((Action<BodySplitter, BaseSplitDeath>)HandleDeath); } static void HandleDeath(BodySplitter splitter, BaseSplitDeath baseSplitDeath) { //IL_0075: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)((EntityState)baseSplitDeath).characterBody)) { MasterSummon masterSummon = splitter.masterSummon; VariantSummon variantSummon = (VariantSummon)(object)(splitter.masterSummon = (MasterSummon)(object)new VariantSummon { masterPrefab = masterSummon.masterPrefab, ignoreTeamMemberLimit = false, useAmbientLevel = null, teamIndexOverride = null }); BodyVariantManager bodyVariantManager = default(BodyVariantManager); if (((Component)((EntityState)baseSplitDeath).characterBody).TryGetComponent<BodyVariantManager>(ref bodyVariantManager)) { variantSummon.variantDefs = FilterVariants(bodyVariantManager.variantsInBody, splitter.masterSummon.masterPrefab, ((EntityState)baseSplitDeath).characterBody.bodyIndex); } } } } private static VariantDef[] FilterVariants(ReadOnlyCollection<VariantDef> variantDefs, GameObject masterSummonPrefb, BodyIndex dyingBodyIndex) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) List<VariantDef> list = new List<VariantDef>(); BodyIndex val = (BodyIndex)(-1); CharacterMaster val2 = default(CharacterMaster); CharacterBody val3 = default(CharacterBody); if (masterSummonPrefb.TryGetComponent<CharacterMaster>(ref val2) && val2.bodyPrefab.TryGetComponent<CharacterBody>(ref val3)) { val = val3.bodyIndex; } foreach (VariantDef variantDef in variantDefs) { if (!_blacklistedVariants.Contains(variantDef)) { VariantDef value; if (val == dyingBodyIndex) { list.Add(variantDef); } else if (_gupToGeep.TryGetValue(variantDef, out value)) { list.Add(value); } else if (_geepToGip.TryGetValue(variantDef, out value)) { list.Add(value); } } } return list.ToArray(); } } public static class VAPIAssets { private const string ASSET_BUNDLE_NAME = "vapiassets"; private const string ASSET_BUNDLE_FOLDER_NAME = "assetbundles"; public static ResourceAvailability assetsAvailability; internal static SkillDef _emptySkillDef; private static AssetBundle _assetBundle; private static string assetBundleFolderPath => Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)VAPIMain.instance).Info.Location), "assetbundles"); public static TAsset LoadAsset<TAsset>(string name) where TAsset : Object { return _assetBundle.LoadAsset<TAsset>(name); } public static VAPIAssetRequest<TAsset> LoadAssetAsync<TAsset>(string name) where TAsset : Object { return new VAPIAssetRequest<TAsset>(_assetBundle.LoadAssetAsync(name)); } public static TAsset[] LoadAssets<TAsset>() where TAsset : Object { return _assetBundle.LoadAllAssets<TAsset>(); } public static VAPIAssetRequest<TAsset> LoadAssetsAsync<TAsset>() where TAsset : Object { return new VAPIAssetRequest<TAsset>(_assetBundle.LoadAllAssetsAsync<TAsset>()); } internal static IEnumerator Initialize() { if (!((ResourceAvailability)(ref assetsAvailability)).available) { VAPILog.Info("Initializing Assets...", 50, "Initialize"); IEnumerator loadRoutine = LoadAssetBundle(); while (!MSUtil.IsDone(loadRoutine)) { yield return null; } ParallelCoroutine coroutine = new ParallelCoroutine(); coroutine.Add(SwapShaders()); coroutine.Add(SwapAddressableShaders()); while (!coroutine.isDone) { yield return null; } ((ResourceAvailability)(ref assetsAvailability)).MakeAvailable(); } } private static IEnumerator LoadAssetBundle() { AssetBundleCreateRequest request = AssetBundle.LoadFromFileAsync(Path.Combine(assetBundleFolderPath, "vapiassets")); while (!((AsyncOperation)request).isDone) { yield return null; } _assetBundle = request.assetBundle; } private static IEnumerator SwapShaders() { return ShaderUtil.SwapStubbedShadersAsync(_assetBundle); } private static IEnumerator SwapAddressableShaders() { return ShaderUtil.LoadAddressableMaterialShadersAsync(_assetBundle); } } public class VAPIAssetRequest<TAsset> : IEnumerator where TAsset : Object { private AssetBundleRequest _request; public TAsset asset => (TAsset)(object)_request.asset; public TAsset[] assets => _request.allAssets.OfType<TAsset>().ToArray(); public bool isDone => ((AsyncOperation)_request).isDone; public float progress => ((AsyncOperation)_request).progress; object IEnumerator.Current => _request.asset; internal VAPIAssetRequest(AssetBundleRequest request) { _request = request; } bool IEnumerator.MoveNext() { return !((AsyncOperation)_request).isDone; } void IEnumerator.Reset() { throw new NotSupportedException(); } } public class VAPIConfig { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static OnConfigChangedDelegate<bool> <>9__26_0; public static OnConfigChangedDelegate<bool> <>9__26_1; public static IsDisabledDelegate <>9__26_2; public static IsDisabledDelegate <>9__26_3; public static IsDisabledDelegate <>9__26_4; internal void <SetConfigs>b__26_0(bool b) { RuleDef varianceArtifactRuleDef = RuleBookExtras._varianceArtifactRuleDef; varianceArtifactRuleDef.FindChoice("On").excludeByDefault = !b; varianceArtifactRuleDef.FindChoice("Off").excludeByDefault = !b; InfiniteTower.AddOrRemoveWave(b); if (Object.op_Implicit((Object)(object)PreGameController.instance) && NetworkServer.active) { PreGameController.instance.RecalculateModifierAvailability(); } } internal void <SetConfigs>b__26_1(bool b) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown if (b) { BaseSplitDeath.FixedUpdate -= new Manipulator(GupVariantHelper.HandleDeathState); BaseSplitDeath.FixedUpdate += new Manipulator(GupVariantHelper.HandleDeathState); } else { BaseSplitDeath.FixedUpdate -= new Manipulator(GupVariantHelper.HandleDeathState); } } internal bool <SetConfigs>b__26_2() { return !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)_enableRewards); } internal bool <SetConfigs>b__26_3() { return !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)_enableRewards); } internal bool <SetConfigs>b__26_4() { return !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)_enableRewards); } } public const string PREFIX = "VAPI."; public const string GENERAL = "VAPI.General"; public const string REWARDS = "VAPI.Rewards"; [AutoConfig] internal static ConfiguredBool _showVariantRuleCategory; [AutoConfig] internal static ConfiguredBool _enableArtifactOfVariance; [AutoConfig] internal static ConfiguredBool _activateMeshReplacementSystem; [AutoConfig] internal static ConfiguredBool _sendArrivalMesssages; [AutoConfig] internal static ConfiguredBool _modifyGupDeathStates; [AutoConfig] internal static ConfiguredColor _variantHealthBarColor; [AutoConfig] internal static ConfiguredBool _enableRewards; [AutoConfig] internal static ConfiguredBool _luckAffectsItemRewards; [AutoConfig] internal static ConfiguredBool _itemRewardsSpawnOnPlayer; [AutoConfig] internal static ConfiguredFloat _hiddenRealmsItemRollChance; internal static ConfigFactory configFactory { get; private set; } public static ConfigFile generalConfig { get; private set; } public static ConfigFile rewardsConfig { get; private set; } internal VAPIConfig(BaseUnityPlugin plugin) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown configFactory = new ConfigFactory(plugin); generalConfig = configFactory.CreateConfigFile("VAPI.General", false); rewardsConfig = configFactory.CreateConfigFile("VAPI.Rewards", false); SetConfigs(); } private void SetConfigs() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0037: 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_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Expected O, but got Unknown //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Unknown result type (might be due to invalid IL or missing references) //IL_00da: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_00f0: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_016b: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01ab: Expected O, but got Unknown //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Unknown result type (might be due to invalid IL or missing references) //IL_01d2: Unknown result type (might be due to invalid IL or missing references) //IL_01dd: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_01e3: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Expected O, but got Unknown //IL_01f4: Expected O, but got Unknown //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01fa: Unknown result type (might be due to invalid IL or missing references) //IL_0205: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) //IL_021b: 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_0227: Unknown result type (might be due to invalid IL or missing references) //IL_022c: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Expected O, but got Unknown //IL_025b: Expected O, but got Unknown //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_026c: Unknown result type (might be due to invalid IL or missing references) //IL_0277: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_028e: Unknown result type (might be due to invalid IL or missing references) //IL_0293: Unknown result type (might be due to invalid IL or missing references) //IL_0241: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Expected O, but got Unknown //IL_02bd: Expected O, but got Unknown //IL_02c2: Expected O, but got Unknown //IL_02c7: 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_02d7: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02ed: Unknown result type (might be due to invalid IL or missing references) //IL_02f8: Unknown result type (might be due to invalid IL or missing references) //IL_02ff: Unknown result type (might be due to invalid IL or missing references) //IL_0300: Unknown result type (might be due to invalid IL or missing references) //IL_0305: Unknown result type (might be due to invalid IL or missing references) //IL_02a8: Unknown result type (might be due to invalid IL or missing references) //IL_02ad: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Expected O, but got Unknown //IL_032a: Unknown result type (might be due to invalid IL or missing references) //IL_0335: Unknown result type (might be due to invalid IL or missing references) //IL_0345: Expected O, but got Unknown //IL_034a: Expected O, but got Unknown //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_031f: Unknown result type (might be due to invalid IL or missing references) //IL_0325: Expected O, but got Unknown _showVariantRuleCategory = new ConfiguredBool(false) { section = "General", key = "Show Variant Rule Category", description = "Uncovers the Variant rule category, allowing you to enable or disable variant spawning from the lobby.", configFile = generalConfig }; _enableArtifactOfVariance = new ConfiguredBool(true) { section = "General", key = "Enable Artifact of Variance", description = "Wether the artifact of Variance is enabled", configFile = generalConfig }.WithConfigChange((OnConfigChangedDelegate<bool>)delegate(bool b) { RuleDef varianceArtifactRuleDef = RuleBookExtras._varianceArtifactRuleDef; varianceArtifactRuleDef.FindChoice("On").excludeByDefault = !b; varianceArtifactRuleDef.FindChoice("Off").excludeByDefault = !b; InfiniteTower.AddOrRemoveWave(b); if (Object.op_Implicit((Object)(object)PreGameController.instance) && NetworkServer.active) { PreGameController.instance.RecalculateModifierAvailability(); } }); _activateMeshReplacementSystem = new ConfiguredBool(true) { section = "General", key = "Activate Mesh Replacecment Systems", description = "Activates the Mesh Replacement System, allowing for some Variants to have different meshes.\nExtremely jank, may not work at all, and could tank performance.", configFile = generalConfig }; _sendArrivalMesssages = new ConfiguredBool(true) { section = "General", key = "Send Arrival Messages", description = "Wether variants which tier's send messages on arrival send said messages.", configFile = generalConfig }; _modifyGupDeathStates = new ConfiguredBool(true) { section = "General", key = "Modify Gup/Geep Death States", description = "Modifies the Death state of Gup and Geep so that the split enemies retain some variant logic. For example, A Variant gup will spleet into Geeps that only have the parent's variant defs. And a variant geep will not spawn from a normal gup.", configFile = generalConfig }.WithConfigChange((OnConfigChangedDelegate<bool>)delegate(bool b) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown if (b) { BaseSplitDeath.FixedUpdate -= new Manipulator(GupVariantHelper.HandleDeathState); BaseSplitDeath.FixedUpdate += new Manipulator(GupVariantHelper.HandleDeathState); } else { BaseSplitDeath.FixedUpdate -= new Manipulator(GupVariantHelper.HandleDeathState); } }); _variantHealthBarColor = new ConfiguredColor(Color32.op_Implicit(new Color32((byte)0, byte.MaxValue, (byte)144, byte.MaxValue))) { section = "General", key = "Variant Healthbar Color", description = "The Healthbar Colour for Variants", configFile = generalConfig }; _enableRewards = new ConfiguredBool(true) { section = "Rewards", key = "Activate Rewards Systems", description = "Activates the Rewards Systems, when enabled, variants drop extra gold and experiencee, alongside a chance for an item.", configFile = rewardsConfig, checkBoxConfig = new CheckBoxConfig { restartRequired = true } }; ConfiguredBool val = new ConfiguredBool(false) { section = "Rewards", key = "Luck affects item rewards", description = "If true, the Luck stat will influence the chance for an Item Reward", configFile = rewardsConfig }; CheckBoxConfig val2 = new CheckBoxConfig(); object obj = <>c.<>9__26_2; if (obj == null) { IsDisabledDelegate val3 = () => !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)_enableRewards); <>c.<>9__26_2 = val3; obj = (object)val3; } ((BaseOptionConfig)val2).checkIfDisabled = (IsDisabledDelegate)obj; val.checkBoxConfig = val2; _luckAffectsItemRewards = val; ConfiguredBool val4 = new ConfiguredBool(false) { section = "Rewards", key = "Item Rewards Spawn on Player", description = "Setting this to true makes item rewards spawn on the player that dealt the killing blow to a variant, instead of the variant's position.", configFile = rewardsConfig }; CheckBoxConfig val5 = new CheckBoxConfig(); object obj2 = <>c.<>9__26_3; if (obj2 == null) { IsDisabledDelegate val6 = () => !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)_enableRewards); <>c.<>9__26_3 = val6; obj2 = (object)val6; } ((BaseOptionConfig)val5).checkIfDisabled = (IsDisabledDelegate)obj2; val4.checkBoxConfig = val5; _itemRewardsSpawnOnPlayer = val4; ConfiguredFloat val7 = new ConfiguredFloat(100f) { section = "Rewards", key = "Chance for ItemDrops in Hidden Realms", description = "The chance for an Item drop in a hidden realm, this check must pass before the variant even has a chance to drop an item.\nSet this to 0 for no item drops in hidden realms.", configFile = rewardsConfig, sliderType = (SliderTypeEnum)1 }; SliderConfig val8 = new SliderConfig(); object obj3 = <>c.<>9__26_4; if (obj3 == null) { IsDisabledDelegate val9 = () => !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)_enableRewards); <>c.<>9__26_4 = val9; obj3 = (object)val9; } ((BaseOptionConfig)val8).checkIfDisabled = (IsDisabledDelegate)obj3; val8.min = 0f; val8.max = 100f; val7.sliderConfig = val8; _hiddenRealmsItemRollChance = val7; } } public class VAPIContent : IContentPackProvider { public static class VariantTiers { public static VariantTierDef Common => Load("Common"); public static VariantTierDef Uncommon => Load("Uncommon"); public static VariantTierDef Rare => Load("Rare"); public static VariantTierDef Legendary => Load("Legendary"); private static VariantTierDef Load(string name) { if (!((ResourceAvailability)(ref VAPIAssets.assetsAvailability)).available) { throw new InvalidOperationException("Cannot load tier " + name + " without VAPIAssets initialized."); } return VAPIAssets.LoadAsset<VariantTierDef>(name); } } public static class Artifacts { public static ArtifactDef Variance; } public static class Buffs { public static BuffDef bdVariant; } public static class Items { public static ItemDef ExtraPrimary; public static ItemDef ExtraSecondary; public static ItemDef ExtraSpecial; public static ItemDef ExtraUtility; public static ItemDef GlobalCDR; public static ItemDef GreenHealthbar; public static ItemDef Plus1Crit; public static ItemDef PrimaryCDR; public static ItemDef SecondaryCDR; public static ItemDef SpecialCDR; public static ItemDef UtilityCDR; } internal static ParallelCoroutine _parallelPreLoadDispatchers; private static Func<IEnumerator>[] _loadDispatchers; internal static ParallelCoroutine _parallelPostLoadDispatchers; private static Action[] _fieldAssignDispatchers; public string identifier => "com.Nebby.VAPI"; public static ReadOnlyContentPack readOnlyContentPack => new ReadOnlyContentPack(contentPack); internal static ContentPack contentPack { get; } public IEnumerator LoadStaticContentAsync(LoadStaticContentAsyncArgs args) { IEnumerator enumerator2 = VAPIAssets.Initialize(); while (!MSUtil.IsDone(enumerator2)) { yield return null; } while (!_parallelPreLoadDispatchers.isDone) { yield return null; } for (int i = 0; i < _loadDispatchers.Length; i++) { args.ReportProgress(Util.Remap((float)(i + 1), 0f, (float)_loadDispatchers.Length, 0.1f, 0.2f)); enumerator2 = _loadDispatchers[i](); while (enumerator2?.MoveNext() ?? false) { yield return null; } } while (!_parallelPostLoadDispatchers.isDone) { yield return null; } for (int j = 0; j < _fieldAssignDispatchers.Length; j++) { args.ReportProgress(Util.Remap((float)(j + 1), 0f, (float)_fieldAssignDispatchers.Length, 0.95f, 0.99f)); _fieldAssignDispatchers[j](); } } public IEnumerator GenerateContentPackAsync(GetContentPackAsyncArgs args) { ContentPack.Copy(contentPack, args.output); args.ReportProgress(1f); yield return null; } public IEnumerator FinalizeAsync(FinalizeAsyncArgs args) { args.ReportProgress(1f); yield break; } private static IEnumerator AddBaseVariantPack() { VAPILog.Info("Adding base VariantPack", 76, "AddBaseVariantPack"); VAPIAssetRequest<VariantPackDef> request = VAPIAssets.LoadAssetAsync<VariantPackDef>("BaseVariantPack"); while (!request.isDone) { yield return null; } VariantPackCatalog.AddVariantPack(request.asset, VAPIConfig.rewardsConfig); } private static void LoadFromAssetBundles() { _parallelPreLoadDispatchers.Add(PopulateWithAssetCollectionContentPack()); _parallelPostLoadDispatchers.Add(LoadEmptySkillDef()); _parallelPostLoadDispatchers.Add(LoadLockedIconAndAssignToExpansionDef()); static IEnumerator LoadEmptySkillDef() { VAPIAssetRequest<SkillDef> request2 = VAPIAssets.LoadAssetAsync<SkillDef>("EmptySkillDef"); while (!request2.isDone) { yield return null; } VAPIAssets._emptySkillDef = request2.asset; } static IEnumerator LoadLockedIconAndAssignToExpansionDef() { ParallelCoroutine coroutine = new ParallelCoroutine(); VAPIAssetRequest<ExpansionDef> request = VAPIAssets.LoadAssetAsync<ExpansionDef>("VarianceExpansion"); AsyncOperationHandle<Sprite> iconRequest = Addressables.LoadAssetAsync<Sprite>((object)"RoR2/Base/Common/MiscIcons/texUnlockIcon.png"); coroutine.Add((IEnumerator)request); coroutine.Add((IEnumerator)(object)iconRequest); while (!MSUtil.IsDone((IEnumerator)coroutine)) { yield return null; } request.asset.disabledIconSprite = iconRequest.Result; } static IEnumerator PopulateWithAssetCollectionContentPack() { VAPIAssetRequest<AssetCollection> request3 = VAPIAssets.LoadAssetAsync<AssetCollection>("acContentPack"); while (!request3.isDone) { yield return null; } ContentUtil.AddContentFromAssetCollection(contentPack, request3.asset); } } private void AddSelf(AddContentPackProviderDelegate addContentPackProviderDelegate) { addContentPackProviderDelegate.Invoke((IContentPackProvider)(object)this); } internal VAPIContent() { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown ContentManager.collectContentPackProviders += new CollectContentPackProvidersDelegate(AddSelf); ((ResourceAvailability)(ref VAPIAssets.assetsAvailability)).CallWhenAvailable((Action)delegate { _parallelPreLoadDispatchers.Add(LanguageFileLoader.AddLanguageFilesFromModAsync((BaseUnityPlugin)(object)VAPIMain.instance, "languages")); LoadFromAssetBundles(); }); } static VAPIContent() { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Expected O, but got Unknown //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Expected O, but got Unknown //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Expected O, but got Unknown contentPack = new ContentPack(); _parallelPreLoadDispatchers = new ParallelCoroutine(); _parallelPostLoadDispatchers = new ParallelCoroutine(); VAPIMain main = VAPIMain.instance; _loadDispatchers = new Func<IEnumerator>[4] { delegate { VAPILog.Info("Initializing Items...", 149, ".cctor"); ItemModule.AddProvider((BaseUnityPlugin)(object)main, ContentUtil.CreateGenericContentPieceProvider<ItemDef>((BaseUnityPlugin)(object)main, contentPack)); return ItemModule.InitializeItems((BaseUnityPlugin)(object)main); }, delegate { VAPILog.Info("Initializing Artifacts...", 155, ".cctor"); ArtifactModule.AddProvider((BaseUnityPlugin)(object)main, ContentUtil.CreateGenericContentPieceProvider<ArtifactDef>((BaseUnityPlugin)(object)main, contentPack)); return ArtifactModule.InitializeArtifacts((BaseUnityPlugin)(object)main); }, AddBaseVariantPack, InfiniteTower.Init }; _fieldAssignDispatchers = new Action[3] { delegate { ContentUtil.PopulateTypeFields<ArtifactDef>(typeof(Artifacts), contentPack.artifactDefs); }, delegate { ContentUtil.PopulateTypeFields<BuffDef>(typeof(Buffs), contentPack.buffDefs); }, delegate { ContentUtil.PopulateTypeFields<ItemDef>(typeof(Items), contentPack.itemDefs); } }; } } internal class VAPILog { private static ManualLogSource logger; public static void Fatal(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)1, data, i, member); } public static void Error(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)2, data, i, member); } public static void Warning(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)4, data, i, member); } public static void Message(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)8, data, i, member); } public static void Info(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)16, data, i, member); } public static void Debug(object data, [CallerLineNumber] int i = 0, [CallerMemberName] string member = "") { Log((LogLevel)32, data, i, member); } private static void Log(LogLevel level, object data, int i, string member) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) LogRuntime(level, data, i, member); } private static void LogEditor(LogLevel level, object data, int i, string member) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Invalid comparison between Unknown and I4 //IL_0004: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Invalid comparison between Unknown and I4 //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Invalid comparison between Unknown and I4 //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Invalid comparison between Unknown and I4 //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Invalid comparison between Unknown and I4 if ((int)level <= 4) { if (level - 1 > 1) { if ((int)level == 4) { Debug.LogWarning((object)Format(data, i, member)); } } else { Debug.LogError((object)Format(data, i, member)); } } else if ((int)level == 8 || (int)level == 16 || (int)level == 32) { Debug.Log((object)Format(data, i, member)); } } private static void LogRuntime(LogLevel level, object data, int i, string member) { //IL_0000: 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_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) object obj = ((((Enum)level).HasFlag((Enum)(object)(LogLevel)4) || ((Enum)level).HasFlag((Enum)(object)(LogLevel)2) || ((Enum)level).HasFlag((Enum)(object)(LogLevel)1)) ? Format(data, i, member) : data); logger.Log(level, obj); } public static string Format(object data, int i, string member) { return $"{data} | Line={i} : Member={member}"; } internal VAPILog(ManualLogSource logger_) { logger = logger_; } } public class BodyVariantDefProvider { internal static List<BodyVariantDefProvider> instances = new List<BodyVariantDefProvider>(); private VariantDef[] variantsForBody = Array.Empty<VariantDef>(); private VariantDef[] filteredUniques = Array.Empty<VariantDef>(); private VariantDef[] filteredNonUniques = Array.Empty<VariantDef>(); public BodyIndex tiedIndex { get; internal set; } public int totalVariantCount => variantsForBody.Length; [SystemInitializer(new Type[] { })] private static void SystemInitializer() { Stage.onStageStartGlobal += delegate { OnStageStartGlobal(SceneInfo.instance, Run.instance); }; } public static void FilterVariants(SceneInfo sceneInfo, Run run) { OnStageStartGlobal(sceneInfo, run); } private static void OnStageStartGlobal(SceneInfo info, Run run) { //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)info) || !Object.op_Implicit((Object)(object)run)) { VAPILog.Error("A Stage (" + Stage.instance.sceneDef.baseSceneNameOverride + ") has started, but there is no Run And/Or SceneInfo instances! Variants will not be filtered." + $"\n(Run: {run}, SceneInfo: {info}", 39, "OnStageStartGlobal"); return; } StageInfo stageInfo = StageInfo.ParseInternalStageName(info.sceneDef.baseSceneName); ExpansionDef[] runExpansions = ExpansionCatalog._expansionDefs.Where((ExpansionDef ed) => run.IsExpansionEnabled(ed)).ToArray(); foreach (BodyVariantDefProvider instance in instances) { instance.FilterVariants(stageInfo, runExpansions, run.ruleBook); } } public static BodyVariantDefProvider FindProvider(string masterOrCharacterName) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0028: 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_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Invalid comparison between Unknown and I4 //IL_0021: Unknown result type (might be due to invalid IL or missing references) MasterIndex val = MasterCatalog.FindMasterIndex(masterOrCharacterName); if (val == MasterIndex.none) { BodyIndex val2 = BodyCatalog.FindBodyIndex(masterOrCharacterName); if ((int)val2 == -1) { return null; } return FindProvider(val2); } return FindProvider(val); } public static BodyVariantDefProvider FindProvider(GameObject prefab) { CharacterMaster component = prefab.GetComponent<CharacterMaster>(); CharacterBody component2 = prefab.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component)) { return FindProvider(component); } if (!Object.op_Implicit((Object)(object)component2)) { return null; } return FindProvider(component2); } public static BodyVariantDefProvider FindProvider(MasterIndex masterIndex) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return FindProvider(MasterCatalog.GetMasterPrefab(masterIndex).GetComponent<CharacterMaster>()); } public static BodyVariantDefProvider FindProvider(CharacterMaster master) { if (master.hasBody) { return FindProvider(master.bodyInstanceObject.GetComponent<CharacterBody>()); } if (!Object.op_Implicit((Object)(object)master.bodyPrefab)) { return null; } return FindProvider(master.bodyPrefab.GetComponent<CharacterBody>()); } public static BodyVariantDefProvider FindProvider(CharacterBody body) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) VariantCatalog.ThrowIfNotInitialized(); return VariantCatalog.GetBodyVariantDefProvider(body.bodyIndex); } public static BodyVariantDefProvider FindProvider(BodyIndex index) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) VariantCatalog.ThrowIfNotInitialized(); return VariantCatalog.GetBodyVariantDefProvider(index); } private void FilterVariants(StageInfo stageInfo, ExpansionDef[] runExpansions, RuleBook runRulebook) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) try { filteredUniques = (from vd in variantsForBody where vd.isUnique where vd.IsAvailable(stageInfo, runExpansions, runRulebook) select vd).ToArray(); filteredNonUniques = (from vd in variantsForBody where !vd.isUnique where vd.IsAvailable(stageInfo, runExpansions, runRulebook) select vd).ToArray(); } catch (Exception arg) { VAPILog.Error($"Could not filter variants for body {BodyCatalog.GetBodyName(tiedIndex)}: {arg}", 155, "FilterVariants"); } } public VariantDef[] GetUniqueVariants(bool filtered) { if (!filtered) { return variantsForBody.Where((VariantDef vd) => vd.isUnique).ToArray(); } return filteredUniques; } public VariantDef[] GetVariants(bool filtered) { if (!filtered) { return variantsForBody.Where((VariantDef vd) => !vd.isUnique).ToArray(); } return filteredNonUniques; } public VariantDef[] GetAllVariants(bool filtered) { if (!filtered) { return variantsForBody; } return filteredUniques.Concat(filteredNonUniques).ToArray(); } public string GetBodyName() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) GameObject bodyPrefab = BodyCatalog.GetBodyPrefab(tiedIndex); if (!Object.op_Implicit((Object)(object)bodyPrefab)) { return null; } return ((Object)bodyPrefab).name; } public VariantDef GetVariantDef(int index) { return ArrayUtils.GetSafe<VariantDef>(variantsForBody, index); } public BodyVariantDefProvider(VariantDef[] variantsForBody, BodyIndex tiedIndex) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) this.variantsForBody = variantsForBody; this.tiedIndex = tiedIndex; instances.Add(this); } } public static class VariantCatalog { public static ResourceAvailability availability = default(ResourceAvailability); internal static VariantDef[] _registeredVariants = Array.Empty<VariantDef>(); private static readonly Dictionary<string, VariantIndex> _nameToIndex = new Dictionary<string, VariantIndex>(StringComparer.OrdinalIgnoreCase); private static readonly Dictionary<BodyIndex, BodyVariantDefProvider> _bodyIndexToDefProvider = new Dictionary<BodyIndex, BodyVariantDefProvider>(); public static int variantCount => _registeredVariants.Length; public static VariantDef GetVariantDef(VariantIndex variantIndex) { ThrowIfNotInitialized(); return ArrayUtils.GetSafe<VariantDef>(_registeredVariants, (int)variantIndex); } public static VariantIndex FindVariantIndex(string variantName) { ThrowIfNotInitialized(); if (_nameToIndex.TryGetValue(variantName, out var value)) { return value; } return VariantIndex.None; } internal static BodyVariantDefProvider GetBodyVariantDefProvider(BodyIndex index) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) if (_bodyIndexToDefProvider.TryGetValue(index, out var value)) { return value; } return null; } [SystemInitializer(new Type[] { typeof(BodyCatalog), typeof(VariantTierCatalog) })] private static void SystemInitializer() { _nameToIndex.Clear(); _registeredVariants = RegisterVariantsFromPacks(VariantPackCatalog._registeredPacks).ToArray(); PopulateBodyIndexToVariants(); VAPILog.Info("Variant Catalog Initialized", 77, "SystemInitializer"); ((ResourceAvailability)(ref availability)).MakeAvailable(); } private static VariantDef[] RegisterVariantsFromPacks(VariantPackDef[] packs) { VAPILog.Info($"Registering VariantDefs from {VariantPackCatalog.variantPackCount} VariantPacks", 83, "RegisterVariantsFromPacks"); List<VariantDef> list = new List<VariantDef>(); foreach (VariantPackDef obj in packs) { ConfigFile variantConfiguration = obj.variantConfiguration; BepInPlugin bepInPlugin = obj.bepInPlugin; VariantDef[] variants = obj.variants; if (variants.Length != 0) { variants = variants.Where(ValidateVariant).ToArray(); if (variantConfiguration != null) { ConfigureVariantsThatPassedFilter(variantConfiguration, bepInPlugin, variants); } list.AddRange(variants); } } list = list.OrderBy((VariantDef vd) => vd.bodyName + "." + ((Object)vd).name).ToList(); int num = list.ToArray().Length; for (VariantIndex variantIndex = (VariantIndex)0; (int)variantIndex < num; variantIndex++) { RegisterVariant(list[(int)variantIndex], variantIndex); } return list.ToArray(); } private static bool ValidateVariant(VariantDef variant) { try { if (string.IsNullOrEmpty(((Object)variant).name) || string.IsNullOrWhiteSpace(((Object)variant).name)) { VAPILog.Error($"Variant {variant} has no object name!", 122, "ValidateVariant"); return false; } if (!BodyCatalog.bodyNames.Contains(variant.bodyName)) { return false; } return true; } catch (Exception arg) { VAPILog.Error($"Could not validate variant {variant}: {arg}", 137, "ValidateVariant"); return false; } } private static void ConfigureVariantsThatPassedFilter(ConfigFile configFile, BepInPlugin plugin, IEnumerable<VariantDef> variants) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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_006a: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: 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_00d1: Expected O, but got Unknown //IL_00d6: Expected O, but got Unknown //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_015e: Unknown result type (might be due to invalid IL or missing references) //IL_0165: 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) foreach (VariantDef variant in variants) { try { variant._spawnRateConfig = new ConfiguredFloat(variant.spawnRate) { section = variant.bodyName + " Variants", key = ((Object)variant).name + " Spawn Rate", description = "Chance for the " + ((Object)variant).name + " variant to spawn\n(Percentage, 0-100)", configFile = configFile, modGUID = plugin.GUID, modName = plugin.Name, sliderType = (SliderTypeEnum)1, sliderConfig = new SliderConfig { min = 0f, max = 100f } }; ((ConfiguredVariable<float>)(object)variant._spawnRateConfig).onConfigChanged += delegate(float f) { variant.spawnRate = f; }; variant._isUniqueConfig = new ConfiguredBool(variant.isUnique) { section = variant.bodyName + " Variants", key = ((Object)variant).name + " Uniqueness", description = "Wether or not " + ((Object)variant).name + " is Unique", configFile = configFile, modGUID = plugin.GUID, modName = plugin.Name }.WithConfigChange((OnConfigChangedDelegate<bool>)delegate(bool b) { variant.isUnique = b; }).DoConfigure(); } catch (Exception ex) { VAPILog.Error($"Error Configuring Variant {variant}: {ex}\n(ConfigFile: {configFile}, Variant: {variant})", 178, "ConfigureVariantsThatPassedFilter"); } } } private static void RegisterVariant(VariantDef variant, VariantIndex index) { try { variant.variantIndex = index; _nameToIndex.Add(((Object)variant).name, index); _ = variant.variantTierDef; } catch (Exception arg) { VAPILog.Error($"Could not register variant {variant}: {arg}", 196, "RegisterVariant"); } } private static void PopulateBodyIndexToVariants() { //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) VAPILog.Info("Creating BodyVariantDefProviders for registered variants", 202, "PopulateBodyIndexToVariants"); foreach (CharacterBody body in BodyCatalog.allBodyPrefabBodyBodyComponents) { VariantDef[] array = _registeredVariants.Where((VariantDef vd) => vd.bodyName.Equals(((Object)body).name, StringComparison.OrdinalIgnoreCase)).ToArray(); if (array.Length != 0) { ((Component)body).gameObject.AddComponent<BodyVariantManager>(); if (ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards)) { ((Component)body).gameObject.AddComponent<BodyVariantReward>(); } _bodyIndexToDefProvider.Add(body.bodyIndex, new BodyVariantDefProvider(array, body.bodyIndex)); } } } internal static void ThrowIfNotInitialized() { if (!((ResourceAvailability)(ref availability)).available) { throw new InvalidOperationException("VariantCatalog not initialized"); } } } public static class VariantPackCatalog { private readonly struct ConfigPair { public readonly ConfigFile tierConfig; public readonly ConfigFile variantConfig; public ConfigPair(ConfigFile configFile) { variantConfig = configFile; tierConfig = configFile; } public ConfigPair(ConfigFile tierFile, ConfigFile variantFile) { tierConfig = tierFile; variantConfig = variantFile; } public override bool Equals(object obj) { if (obj is ConfigPair other) { return Equals(other); } return false; } public bool Equals(ConfigPair other) { if (tierConfig == other.tierConfig) { return variantConfig == other.variantConfig; } return false; } public override int GetHashCode() { return base.GetHashCode(); } public static bool operator ==(ConfigPair lhs, ConfigPair rhs) { return lhs.Equals(rhs); } public static bool operator !=(ConfigPair lhs, ConfigPair rhs) { return !(lhs == rhs); } } public static ResourceAvailability availability = default(ResourceAvailability); private static Dictionary<ConfigPair, List<(VariantPackDef, BepInPlugin)>> _unregisteredPacks = new Dictionary<ConfigPair, List<(VariantPackDef, BepInPlugin)>>(); internal static VariantPackDef[] _registeredPacks = Array.Empty<VariantPackDef>(); private static readonly Dictionary<string, VariantPackIndex> nameToIndex = new Dictionary<string, VariantPackIndex>(StringComparer.OrdinalIgnoreCase); public static int variantPackCount => _registeredPacks.Length; public static VariantPackDef GetVariantPackDef(VariantPackIndex variantPackIndex) { ThrowIfNotInitialized(); return ArrayUtils.GetSafe<VariantPackDef>(_registeredPacks, (int)variantPackIndex); } public static VariantPackIndex FindVariantPackIndex(string packName) { ThrowIfNotInitialized(); if (nameToIndex.TryGetValue(packName, out var value)) { return value; } return VariantPackIndex.None; } public static VariantPackDef FindVariantPackDef(VariantDef variant) { ThrowIfNotInitialized(); VariantPackDef[] registeredPacks = _registeredPacks; foreach (VariantPackDef variantPackDef in registeredPacks) { if (variantPackDef.variants.Contains(variant)) { return variantPackDef; } } return null; } public static VariantPackDef FindVariantPackDef(VariantTierDef variantTier) { ThrowIfNotInitialized(); VariantPackDef[] registeredPacks = _registeredPacks; foreach (VariantPackDef variantPackDef in registeredPacks) { if (variantPackDef.variantTiers.Contains(variantTier)) { return variantPackDef; } } return null; } public static void AddVariantPacks(AssetBundle assetBundle) { ThrowIfInitialized(); ConfigPair configPair = default(ConfigPair); BepInPlugin bepInPlugin = GetBepInPlugin(Assembly.GetCallingAssembly()); VariantPackDef[] array = assetBundle.LoadAllAssets<VariantPackDef>(); for (int i = 0; i < array.Length; i++) { AddPackInternal(array[i], configPair, bepInPlugin); } } public static void AddVariantPacks(AssetBundle assetBundle, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); ConfigPair configPair = default(ConfigPair); BepInPlugin metadata = ownerPlugin.Info.Metadata; VariantPackDef[] array = assetBundle.LoadAllAssets<VariantPackDef>(); for (int i = 0; i < array.Length; i++) { AddPackInternal(array[i], configPair, metadata); } } public static void AddVariantPacks(AssetBundle assetBundle, ConfigFile configFile) { ThrowIfInitialized(); ConfigPair configPair = new ConfigPair(configFile); BepInPlugin bepInPlugin = GetBepInPlugin(Assembly.GetCallingAssembly()); VariantPackDef[] array = assetBundle.LoadAllAssets<VariantPackDef>(); for (int i = 0; i < array.Length; i++) { AddPackInternal(array[i], configPair, bepInPlugin); } } public static void AddVariantPacks(AssetBundle assetBundle, ConfigFile configFile, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); ConfigPair configPair = new ConfigPair(configFile); BepInPlugin metadata = ownerPlugin.Info.Metadata; VariantPackDef[] array = assetBundle.LoadAllAssets<VariantPackDef>(); for (int i = 0; i < array.Length; i++) { AddPackInternal(array[i], configPair, metadata); } } public static void AddVariantPacks(AssetBundle assetBundle, ConfigFile tierConfig, ConfigFile variantConfig) { ThrowIfInitialized(); ConfigPair configPair = new ConfigPair(tierConfig, variantConfig); BepInPlugin bepInPlugin = GetBepInPlugin(Assembly.GetCallingAssembly()); VariantPackDef[] array = assetBundle.LoadAllAssets<VariantPackDef>(); for (int i = 0; i < array.Length; i++) { AddPackInternal(array[i], configPair, bepInPlugin); } } public static void AddVariantPacks(AssetBundle assetBundle, ConfigFile tierConfig, ConfigFile variantConfig, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); ConfigPair configPair = new ConfigPair(tierConfig, variantConfig); BepInPlugin metadata = ownerPlugin.Info.Metadata; VariantPackDef[] array = assetBundle.LoadAllAssets<VariantPackDef>(); for (int i = 0; i < array.Length; i++) { AddPackInternal(array[i], configPair, metadata); } } public static void AddVariantPacks(IEnumerable<VariantPackDef> variantPacks) { ThrowIfInitialized(); BepInPlugin bepInPlugin = GetBepInPlugin(Assembly.GetCallingAssembly()); foreach (VariantPackDef variantPack in variantPacks) { AddPackInternal(variantPack, default(ConfigPair), bepInPlugin); } } public static void AddVariantPacks(IEnumerable<VariantPackDef> variantPacks, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); BepInPlugin metadata = ownerPlugin.Info.Metadata; foreach (VariantPackDef variantPack in variantPacks) { AddPackInternal(variantPack, default(ConfigPair), metadata); } } public static void AddVariantPacks(IEnumerable<VariantPackDef> variantPacks, ConfigFile configFile) { ThrowIfInitialized(); ConfigPair configPair = new ConfigPair(configFile); BepInPlugin bepInPlugin = GetBepInPlugin(Assembly.GetCallingAssembly()); foreach (VariantPackDef variantPack in variantPacks) { AddPackInternal(variantPack, configPair, bepInPlugin); } } public static void AddVariantPacks(IEnumerable<VariantPackDef> variantPacks, ConfigFile configFile, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); ConfigPair configPair = new ConfigPair(configFile); BepInPlugin metadata = ownerPlugin.Info.Metadata; foreach (VariantPackDef variantPack in variantPacks) { AddPackInternal(variantPack, configPair, metadata); } } public static void AddVariantPacks(IEnumerable<VariantPackDef> variantPacks, ConfigFile tierConfig, ConfigFile variantConfig) { ThrowIfInitialized(); ConfigPair configPair = new ConfigPair(tierConfig, variantConfig); BepInPlugin bepInPlugin = GetBepInPlugin(Assembly.GetCallingAssembly()); foreach (VariantPackDef variantPack in variantPacks) { AddPackInternal(variantPack, configPair, bepInPlugin); } } public static void AddVariantPacks(IEnumerable<VariantPackDef> variantPacks, ConfigFile tierConfig, ConfigFile variantConfig, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); ConfigPair configPair = new ConfigPair(tierConfig, variantConfig); BepInPlugin metadata = ownerPlugin.Info.Metadata; foreach (VariantPackDef variantPack in variantPacks) { AddPackInternal(variantPack, configPair, metadata); } } public static void AddVariantPack(VariantPackDef packDef) { ThrowIfInitialized(); AddPackInternal(packDef, default(ConfigPair), GetBepInPlugin(Assembly.GetCallingAssembly())); } public static void AddVariantPack(VariantPackDef packDef, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); AddPackInternal(packDef, default(ConfigPair), ownerPlugin.Info.Metadata); } public static void AddVariantPack(VariantPackDef packDef, ConfigFile configFile) { ThrowIfInitialized(); AddPackInternal(packDef, new ConfigPair(configFile), GetBepInPlugin(Assembly.GetCallingAssembly())); } public static void AddVariantPack(VariantPackDef packDef, ConfigFile configFile, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); AddPackInternal(packDef, new ConfigPair(configFile), ownerPlugin.Info.Metadata); } public static void AddVariantPack(VariantPackDef packDef, ConfigFile tierConfig, ConfigFile variantConfig) { ThrowIfInitialized(); AddPackInternal(packDef, new ConfigPair(tierConfig, variantConfig), GetBepInPlugin(Assembly.GetCallingAssembly())); } public static void AddVariantPack(VariantPackDef packDef, ConfigFile tierConfig, ConfigFile variantConfig, BaseUnityPlugin ownerPlugin) { ThrowIfInitialized(); AddPackInternal(packDef, new ConfigPair(tierConfig, variantConfig), ownerPlugin.Info.Metadata); } private static BepInPlugin GetBepInPlugin(Assembly assembly) { Type[] source = default(Type[]); Reflection.GetTypesSafe(assembly, ref source); return (from t in source where ((MemberInfo)t).GetCustomAttribute<BepInPlugin>() != null select ((MemberInfo)t).GetCustomAttribute<BepInPlugin>()).FirstOrDefault(); } private static void AddPackInternal(VariantPackDef packDef, ConfigPair configPair, BepInPlugin plugin) { if (!_unregisteredPacks.ContainsKey(configPair)) { _unregisteredPacks[configPair] = new List<(VariantPackDef, BepInPlugin)>(); } _unregisteredPacks[configPair].Add((packDef, plugin)); } [SystemInitializer(new Type[] { })] private static void SystemInit() { nameToIndex.Clear(); _registeredPacks = RegisterPacks(); _unregisteredPacks = null; VAPILog.Info("VariantPack Catalog Initialized", 423, "SystemInit"); ((ResourceAvailability)(ref availability)).MakeAvailable(); } private static VariantPackDef[] RegisterPacks() { List<(VariantPackDef, ConfigPair, BepInPlugin)> list = new List<(VariantPackDef, ConfigPair, BepInPlugin)>(); foreach (KeyValuePair<ConfigPair, List<(VariantPackDef, BepInPlugin)>> unregisteredPack in _unregisteredPacks) { unregisteredPack.Deconstruct(out var key, out var value); ConfigPair configPair = key; List<(VariantPackDef, BepInPlugin)> source = value; List<(VariantPackDef, BepInPlugin)> list2 = new List<(VariantPackDef, BepInPlugin)>(); list2 = source.Where(ValidatePack).ToList(); list.AddRange(list2.Select(((VariantPackDef, BepInPlugin) x) => (x.Item1, configPair, x.Item2))); } list = list.OrderBy(((VariantPackDef, ConfigPair, BepInPlugin) vpd) => ((Object)vpd.Item1).name).ToList(); int num = list.ToArray().Length; for (VariantPackIndex variantPackIndex = (VariantPackIndex)0; (int)variantPackIndex < num; variantPackIndex++) { RegisterPack(list[(int)variantPackIndex], variantPackIndex); } return list.Select(((VariantPackDef, ConfigPair, BepInPlugin) x) => x.Item1).ToArray(); } private static bool ValidatePack((VariantPackDef packDef, BepInPlugin plugin) tuple) { try { return true; } catch (Exception arg) { VAPILog.Error($"Could not validate pack {tuple.packDef}: {arg}", 460, "ValidatePack"); return false; } } private static void RegisterPack((VariantPackDef packDef, ConfigPair pair, BepInPlugin plugin) variantPack, VariantPackIndex index) { try { VariantPackDef item = variantPack.packDef; item.tierConfiguration = variantPack.pair.tierConfig; item.variantConfiguration = variantPack.pair.variantConfig; item.bepInPlugin = variantPack.plugin; ModSettingsManager.SetModIcon(item.packEnabledIcon, item.bepInPlugin.GUID, item.bepInPlugin.Name); ModSettingsManager.SetModDescriptionToken(item.descriptionToken, item.bepInPlugin.GUID, item.bepInPlugin.Name); item.variantPackIndex = index; nameToIndex.Add(((Object)item).name, index); } catch (Exception arg) { VAPILog.Error($"Could not register pack {variantPack}: {arg}", 483, "RegisterPack"); } } private static void ThrowIfNotInitialized() { if (!((ResourceAvailability)(ref availability)).available) { throw new InvalidOperationException("VariantPackCatalog not initialized"); } } private static void ThrowIfInitialized() { if (((ResourceAvailability)(ref availability)).available) { throw new InvalidOperationException("VariantPackCatalog already initialized"); } } } public static class VariantTierCatalog { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Func<VariantTierDef, string> <>9__8_0; public static IsDisabledDelegate <>9__10_6; public static IsDisabledDelegate <>9__10_7; public static IsDisabledDelegate <>9__10_8; public static IsDisabledDelegate <>9__10_9; public static IsDisabledDelegate <>9__10_10; internal string <RegisterTiersFromPacks>b__8_0(VariantTierDef vtd) { return ((Object)vtd).name; } internal bool <ConfigureTiersThatPassedFilter>b__10_6() { return !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); } internal bool <ConfigureTiersThatPassedFilter>b__10_7() { return !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); } internal bool <ConfigureTiersThatPassedFilter>b__10_8() { return !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); } internal bool <ConfigureTiersThatPassedFilter>b__10_9() { return !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); } internal bool <ConfigureTiersThatPassedFilter>b__10_10() { return !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); } } public static ResourceAvailability availability = default(ResourceAvailability); private static VariantTierDef[] _registeredTiers; private static readonly Dictionary<VariantTierIndex, VariantTierDef> _tierToDef = new Dictionary<VariantTierIndex, VariantTierDef>(); public static int variantTierCount => _registeredTiers.Length; public static VariantTierDef GetVariantTierDef(VariantTierIndex variantTier) { ThrowIfNotInitialized(); if (_tierToDef.TryGetValue(variantTier, out var value)) { return value; } return null; } public static VariantTierDef FindVariantTierDef(string tierName) { ThrowIfNotInitialized(); VariantTierDef[] registeredTiers = _registeredTiers; foreach (VariantTierDef variantTierDef in registeredTiers) { if (((Object)variantTierDef).name == tierName) { return variantTierDef; } } return null; } [SystemInitializer(new Type[] { typeof(VariantPackCatalog) })] private static void SystemInit() { _tierToDef.Clear(); _registeredTiers = RegisterTiersFromPacks(VariantPackCatalog._registeredPacks); VAPILog.Info("VariantTierCatalog Initialized", 71, "SystemInit"); ((ResourceAvailability)(ref availability)).MakeAvailable(); } private static VariantTierDef[] RegisterTiersFromPacks(VariantPackDef[] packs) { VAPILog.Info($"Registering VariantTierDefs from {VariantPackCatalog.variantPackCount} VariantPacks.", 77, "RegisterTiersFromPacks"); List<VariantTierDef> list = new List<VariantTierDef>(); foreach (VariantPackDef obj in packs) { ConfigFile tierConfiguration = obj.tierConfiguration; BepInPlugin bepInPlugin = obj.bepInPlugin; VariantTierDef[] variantTiers = obj.variantTiers; if (variantTiers.Length != 0) { variantTiers = variantTiers.Where(ValidateTier).ToArray(); if (tierConfiguration != null) { ConfigureTiersThatPassedFilter(tierConfiguration, bepInPlugin, variantTiers); } list.AddRange(variantTiers); } } list = list.OrderBy((VariantTierDef vtd) => ((Object)vtd).name).ToList(); int num = 0; foreach (VariantTierDef item in list) { if (item.tier == VariantTierIndex.AssignedAtRuntime) { item.tier = (VariantTierIndex)(++num + 10); } if (_tierToDef.ContainsKey(item.tier)) { VAPILog.Error($"Duplicate TierDef for tier {item.tier}", 110, "RegisterTiersFromPacks"); } else { _tierToDef.Add(item.tier, item); } } return list.ToArray(); } private static bool ValidateTier(VariantTierDef tierDef) { try { return true; } catch (Exception arg) { VAPILog.Error($"Could not validate tier {tierDef}: {arg}", 128, "ValidateTier"); return false; } } private static void ConfigureTiersThatPassedFilter(ConfigFile configFile, BepInPlugin plugin, IEnumerable<VariantTierDef> tierDefs) { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: Expected O, but got Unknown //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0138: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_017a: Unknown result type (might be due to invalid IL or missing references) //IL_0185: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_00d2: Expected O, but got Unknown //IL_01ba: Expected O, but got Unknown //IL_01eb: Unknown result type (might be due to invalid IL or missing references) //IL_01f0: Unknown result type (might be due to invalid IL or missing references) //IL_020b: 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_0221: Unknown result type (might be due to invalid IL or missing references) //IL_0228: Unknown result type (might be due to invalid IL or missing references) //IL_0234: 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_0247: Unknown result type (might be due to invalid IL or missing references) //IL_0248: Unknown result type (might be due to invalid IL or missing references) //IL_024d: Unknown result type (might be due to invalid IL or missing references) //IL_0258: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b0: Expected O, but got Unknown //IL_028d: Expected O, but got Unknown //IL_02be: Unknown result type (might be due to invalid IL or missing references) //IL_02c3: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e9: Unknown result type (might be due to invalid IL or missing references) //IL_02f4: 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_0307: Unknown result type (might be due to invalid IL or missing references) //IL_0313: Unknown result type (might be due to invalid IL or missing references) //IL_031a: Unknown result type (might be due to invalid IL or missing references) //IL_031b: Unknown result type (might be due to invalid IL or missing references) //IL_0320: Unknown result type (might be due to invalid IL or missing references) //IL_032b: Unknown result type (might be due to invalid IL or missing references) //IL_0336: Unknown result type (might be due to invalid IL or missing references) //IL_0278: Unknown result type (might be due to invalid IL or missing references) //IL_027d: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Expected O, but got Unknown //IL_0360: Expected O, but got Unknown //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_0396: Unknown result type (might be due to invalid IL or missing references) //IL_03b1: Unknown result type (might be due to invalid IL or missing references) //IL_03bc: Unknown result type (might be due to invalid IL or missing references) //IL_03c7: Unknown result type (might be due to invalid IL or missing references) //IL_03ce: Unknown result type (might be due to invalid IL or missing references) //IL_03da: Unknown result type (might be due to invalid IL or missing references) //IL_03e6: Unknown result type (might be due to invalid IL or missing references) //IL_03ed: Unknown result type (might be due to invalid IL or missing references) //IL_03ee: Unknown result type (might be due to invalid IL or missing references) //IL_03f3: Unknown result type (might be due to invalid IL or missing references) //IL_03fe: Unknown result type (might be due to invalid IL or missing references) //IL_0409: Unknown result type (might be due to invalid IL or missing references) //IL_034b: Unknown result type (might be due to invalid IL or missing references) //IL_0350: Unknown result type (might be due to invalid IL or missing references) //IL_0356: Expected O, but got Unknown //IL_0433: Expected O, but got Unknown //IL_0464: Unknown result type (might be due to invalid IL or missing references) //IL_0469: Unknown result type (might be due to invalid IL or missing references) //IL_0484: Unknown result type (might be due to invalid IL or missing references) //IL_048f: Unknown result type (might be due to invalid IL or missing references) //IL_049a: Unknown result type (might be due to invalid IL or missing references) //IL_04a1: Unknown result type (might be due to invalid IL or missing references) //IL_04ad: Unknown result type (might be due to invalid IL or missing references) //IL_04b9: Unknown result type (might be due to invalid IL or missing references) //IL_04c0: Unknown result type (might be due to invalid IL or missing references) //IL_04c1: Unknown result type (might be due to invalid IL or missing references) //IL_04c6: Unknown result type (might be due to invalid IL or missing references) //IL_04d1: Unknown result type (might be due to invalid IL or missing references) //IL_04e1: Expected O, but got Unknown //IL_041e: Unknown result type (might be due to invalid IL or missing references) //IL_0423: Unknown result type (might be due to invalid IL or missing references) //IL_0429: Expected O, but got Unknown foreach (VariantTierDef tierDef in tierDefs) { try { VariantTierDef variantTierDef = tierDef; ConfiguredFloat val = new ConfiguredFloat(tierDef.goldMultiplier) { section = ((Object)tierDef).name + " Tier", key = "Gold Multiplier", description = "The Gold Multiplier for this tier", configFile = configFile, modName = plugin.Name, modGUID = plugin.GUID, sliderType = (SliderTypeEnum)1 }; SliderConfig val2 = new SliderConfig { FormatString = "{0:0.0}", min = 0f, max = 100f }; object obj = <>c.<>9__10_6; if (obj == null) { IsDisabledDelegate val3 = () => !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); <>c.<>9__10_6 = val3; obj = (object)val3; } ((BaseOptionConfig)val2).checkIfDisabled = (IsDisabledDelegate)obj; val.sliderConfig = val2; variantTierDef.goldMultiplier = ConfiguredVariable<float>.op_Implicit((ConfiguredVariable<float>)(object)val.WithConfigChange((OnConfigChangedDelegate<float>)delegate(float f) { tierDef.goldMultiplier = f; }).DoConfigure()); VariantTierDef variantTierDef2 = tierDef; ConfiguredFloat val4 = new ConfiguredFloat(tierDef.experienceMultiplier) { section = ((Object)tierDef).name + " Tier", key = "Experience Multiplier", description = "The Experience Multiplier for this tier", configFile = configFile, modName = plugin.Name, modGUID = plugin.GUID, sliderType = (SliderTypeEnum)1 }; SliderConfig val5 = new SliderConfig { FormatString = "{0:0.0}", min = 0f, max = 100f }; object obj2 = <>c.<>9__10_7; if (obj2 == null) { IsDisabledDelegate val6 = () => !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); <>c.<>9__10_7 = val6; obj2 = (object)val6; } ((BaseOptionConfig)val5).checkIfDisabled = (IsDisabledDelegate)obj2; val4.sliderConfig = val5; variantTierDef2.experienceMultiplier = ConfiguredVariable<float>.op_Implicit((ConfiguredVariable<float>)(object)val4.WithConfigChange((OnConfigChangedDelegate<float>)delegate(float f) { tierDef.experienceMultiplier = f; }).DoConfigure()); VariantTierDef variantTierDef3 = tierDef; ConfiguredFloat val7 = new ConfiguredFloat(tierDef.whiteItemDropChance) { section = ((Object)tierDef).name + " Tier", key = "White Item Drop Chance", description = "The Chance for variants of this tier to drop a White Item", configFile = configFile, modName = plugin.Name, modGUID = plugin.GUID, sliderType = (SliderTypeEnum)1 }; SliderConfig val8 = new SliderConfig { min = 0f, max = 100f }; object obj3 = <>c.<>9__10_8; if (obj3 == null) { IsDisabledDelegate val9 = () => !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); <>c.<>9__10_8 = val9; obj3 = (object)val9; } ((BaseOptionConfig)val8).checkIfDisabled = (IsDisabledDelegate)obj3; val7.sliderConfig = val8; variantTierDef3.whiteItemDropChance = ConfiguredVariable<float>.op_Implicit((ConfiguredVariable<float>)(object)val7.WithConfigChange((OnConfigChangedDelegate<float>)delegate(float f) { tierDef.whiteItemDropChance = f; }).DoConfigure()); VariantTierDef variantTierDef4 = tierDef; ConfiguredFloat val10 = new ConfiguredFloat(tierDef.greenItemDropChance) { section = ((Object)tierDef).name + " Tier", key = "Green Item Drop Chance", description = "The Chance for variants of this tier to drop a Green Item", configFile = configFile, modName = plugin.Name, modGUID = plugin.GUID, sliderType = (SliderTypeEnum)1 }; SliderConfig val11 = new SliderConfig { min = 0f, max = 100f }; object obj4 = <>c.<>9__10_9; if (obj4 == null) { IsDisabledDelegate val12 = () => !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); <>c.<>9__10_9 = val12; obj4 = (object)val12; } ((BaseOptionConfig)val11).checkIfDisabled = (IsDisabledDelegate)obj4; val10.sliderConfig = val11; variantTierDef4.greenItemDropChance = ConfiguredVariable<float>.op_Implicit((ConfiguredVariable<float>)(object)val10.WithConfigChange((OnConfigChangedDelegate<float>)delegate(float f) { tierDef.greenItemDropChance = f; }).DoConfigure()); VariantTierDef variantTierDef5 = tierDef; ConfiguredFloat val13 = new ConfiguredFloat(tierDef.redItemDropChance) { section = ((Object)tierDef).name + " Tier", key = "Red Item Drop Chance", description = "The Chance for variants of this tier to drop a Red Item", configFile = configFile, modName = plugin.Name, modGUID = plugin.GUID, sliderType = (SliderTypeEnum)1 }; SliderConfig val14 = new SliderConfig { min = 0f, max = 100f }; object obj5 = <>c.<>9__10_10; if (obj5 == null) { IsDisabledDelegate val15 = () => !ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._enableRewards); <>c.<>9__10_10 = val15; obj5 = (object)val15; } ((BaseOptionConfig)val14).checkIfDisabled = (IsDisabledDelegate)obj5; val13.sliderConfig = val14; variantTierDef5.redItemDropChance = ConfiguredVariable<float>.op_Implicit((ConfiguredVariable<float>)(object)val13.WithConfigChange((OnConfigChangedDelegate<float>)delegate(float f) { tierDef.redItemDropChance = f; }).DoConfigure()); tierDef.armorBonus = ConfiguredVariable<float>.op_Implicit((ConfiguredVariable<float>)(object)new ConfiguredFloat(tierDef.armorBonus) { section = ((Object)tierDef).name + " Tier", key = "Tier Armor Bonus", description = "Armor bonus applied to variants with this tier, this value stacks if the variant has multiple VariantDefs applied.", configFile = configFile, modName = plugin.Name, modGUID = plugin.GUID, sliderType = (SliderTypeEnum)1, sliderConfig = new SliderConfig { min = 0f, max = 100f } }.WithConfigChange((OnConfigChangedDelegate<float>)delegate(float f) { tierDef.armorBonus = f; }).DoConfigure()); } catch (Exception ex) { VAPILog.Error($"Error configuring tier {tierDef}: {ex}\n(ConfigFile: {configFile}, Tier: {tierDef}", 262, "ConfigureTiersThatPassedFilter"); } } } private static void ThrowIfNotInitialized() { if (!((ResourceAvailability)(ref availability)).available) { throw new InvalidOperationException("VariantCatalog not initialized"); } } } public class VariantDirectorSpawnRequest : DirectorSpawnRequest { public VariantDef[] variantDefs = Array.Empty<VariantDef>(); public bool applyOnStart; public DeathRewards deathRewardsBase; public float deathRewardsCoefficient; public bool supressRewards; public VariantDirectorSpawnRequest(SpawnCard spawnCard, DirectorPlacementRule placementRule, Xoroshiro128Plus rng) : base(spawnCard, placementRule, rng) { } [SystemInitializer(new Type[] { })] private static void SystemInit() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown DirectorCore.TrySpawnObject += new hook_TrySpawnObject(HandleCustomRequest); } private static GameObject HandleCustomRequest(orig_TrySpawnObject orig, DirectorCore self, DirectorSpawnRequest directorSpawnRequest) { GameObject val = orig.Invoke(self, directorSpawnRequest); try { if (directorSpawnRequest is VariantDirectorSpawnRequest variantDirectorSpawnRequest && Object.op_Implicit((Object)(object)val)) { GameObject bodyInstanceObject = val.GetComponent<CharacterMaster>().bodyInstanceObject; if (Object.op_Implicit((Object)(object)bodyInstanceObject)) { DeathRewards component = bodyInstanceObject.GetComponent<DeathRewards>(); if (Object.op_Implicit((Object)(object)variantDirectorSpawnRequest.deathRewardsBase) && Object.op_Implicit((Object)(object)component) && !variantDirectorSpawnRequest.supressRewards) { component.expReward = (uint)((float)variantDirectorSpawnRequest.deathRewardsBase.expReward * variantDirectorSpawnRequest.deathRewardsCoefficient); component.goldReward = (uint)((float)variantDirectorSpawnRequest.deathRewardsBase.goldReward * variantDirectorSpawnRequest.deathRewardsCoefficient); } bodyInstanceObject.AddComponent<DoNotTurnIntoVariant>(); BodyVariantManager component2 = bodyInstanceObject.GetComponent<BodyVariantManager>(); BodyVariantReward component3 = bodyInstanceObject.GetComponent<BodyVariantReward>(); if (Object.op_Implicit((Object)(object)component2) && NetworkServer.active) { component2.AddVariants(variantDirectorSpawnRequest.variantDefs); component2.applyOnStart = variantDirectorSpawnRequest.applyOnStart; } if (Object.op_Implicit((Object)(object)component3)) { if (variantDirectorSpawnRequest.supressRewards) { component3.AddVariants(variantDirectorSpawnRequest.variantDefs); } component3.applyOnStart = variantDirectorSpawnRequest.applyOnStart; } } } } catch (Exception arg) { VAPILog.Error($"Exception on DirectorCore.TrySpawnObject hook for VariantDirectorSpawnRequest: {arg}", 90, "HandleCustomRequest"); } return val; } } public class VariantRewardInfo { public float goldMultiplier; public float experienceMultiplier; public float whiteChance; public float greenChance; public float redChance; protected List<PickupIndex> whiteItems; protected List<PickupIndex> greenItems; protected List<PickupIndex> redItems; protected int nextRedItem; protected int nextGreenItem; protected int nextWhiteItem; public virtual void SetIndicesAndNextItems(Run runInstance) { whiteItems = Run.instance.availableTier1DropList; greenItems = Run.instance.availableTier2DropList; redItems = Run.instance.availableTier3DropList; nextWhiteItem = Run.instance.treasureRng.RangeInt(0, whiteItems.Count); nextGreenItem = Run.instance.treasureRng.RangeInt(0, greenItems.Count); nextRedItem = Run.instance.treasureRng.RangeInt(0, redItems.Count); } public virtual void SetFromAverageOfTiers(IEnumerable<VariantTierDef> tiers, Run runInstance) { List<VariantTierDef> list = tiers.ToList(); if (list.Count == 0) { goldMultiplier = 1f; experienceMultiplier = 1f; whiteChance = 0f; greenChance = 0f; redChance = 0f; return; } goldMultiplier = 0f; experienceMultiplier = 0f; whiteChance = 0f; greenChance = 0f; redChance = 0f; if (list.Count == 1) { VariantTierDef variantTierDef = list.FirstOrDefault(); goldMultiplier = variantTierDef.goldMultiplier; experienceMultiplier = variantTierDef.experienceMultiplier; whiteChance = variantTierDef.whiteItemDropChance; greenChance = variantTierDef.greenItemDropChance; redChance = variantTierDef.redItemDropChance; } else { goldMultiplier = 1f; experienceMultiplier = 1f; whiteChance = 0f; greenChance = 0f; redChance = 0f; foreach (VariantTierDef item in list) { goldMultiplier += item.goldMultiplierMinus1; experienceMultiplier += item.experienceMultiplierMinus1; whiteChance += item.whiteItemDropChance; greenChance += item.greenItemDropChance; redChance += item.redItemDropChance; } int count = list.Count; whiteChance /= count; greenChance /= count; redChance /= count; } SetIndicesAndNextItems(runInstance); } public virtual void TrySpawnDroplet(DamageReport damageReport, CharacterMaster master = null) { //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_00d6: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active) { VAPILog.Warning("TrySpawnDroplet called on client.", 123, "TrySpawnDroplet"); } else if (Util.CheckRoll(redChance, Object.op_Implicit((Object)(object)master) ? master.luck : 0f, (CharacterMaster)null)) { CreateDroplet(redItems[nextRedItem], damageReport); } else if (Util.CheckRoll(redChance + greenChance, Object.op_Implicit((Object)(object)master) ? master.luck : 0f, (CharacterMaster)null)) { CreateDroplet(greenItems[nextGreenItem], damageReport); } else if (Util.CheckRoll(redChance + greenChance + whiteChance, Object.op_Implicit((Object)(object)master) ? master.luck : 0f, (CharacterMaster)null)) { CreateDroplet(whiteItems[nextWhiteItem], damageReport); } } protected virtual void CreateDroplet(PickupIndex dropletIndex, DamageReport report) { //IL_0000: 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_0018: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) PickupDropletController.CreatePickupDroplet(dropletIndex, ConfiguredVariable<bool>.op_Implicit((ConfiguredVariable<bool>)(object)VAPIConfig._itemRewardsSpawnOnPlayer) ? report.attacker.transform.position : ((Component)report.victim).transform.position, Vector3.up * 20f + (Vector3.right * (float)Random.Range(1, 5) + Vector3.forward * (float)Random.Range(1, 5))); } public VariantRewardInfo(float goldMultiplier, float experienceMultiplier, float whiteChance, float greenChance, float redChance) { this.goldMultiplier = goldMultiplier; this.experienceMultiplier = experienceMultiplier; this.whiteChance = whiteChance; this.greenChance = greenChance; this.redChance = redChance; } public VariantRewardInfo() { } } public class VariantSummon : MasterSummon { public struct VariantSummonReport { public CharacterMaster summonMasterInstance; public VariantDef[] summonInstanceVariants; public CharacterMaster leaderMasterInstance; } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_Perform <>9__15_0; internal CharacterMaster <SystemInit>b__15_0(orig_Perform orig, MasterSummon self) { CharacterMaster val = orig.Invoke(self); if (self is VariantSummon variantSummon) { variantSummon.ModifySpawnedInstance(val); } return val; } } public VariantDef[] variantDefs = Array.Empty<VariantDef>(); public bool apply