Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of FasterBossWait2 v1.1.9
EvenFasterBossWait.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using On.RoR2; using R2API; using R2API.Utils; using RoR2; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("EvenFasterBossWait")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+6a5c6aebb9dbedb597f46ed9edca8b69d77e2b77")] [assembly: AssemblyProduct("EvenFasterBossWait")] [assembly: AssemblyTitle("EvenFasterBossWait")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace EvenFasterBossWait { public static class Extensions { public static bool victimIsMiniboss(this DamageReport report) { return (report?.victimMaster?.isMiniboss()).GetValueOrDefault(); } public static bool isMiniboss(this CharacterBody body) { return ((body == null) ? null : body.master?.isMiniboss()).GetValueOrDefault(); } public static bool isMiniboss(this CharacterMaster master) { //IL_0010: 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) return Hooks.Minibosses.Contains((master != null) ? master.masterIndex : MasterIndex.none); } public static EliteDef[] affixes(this CharacterBody body) { return body?.activeBuffsList?.ToList()?.FindAll(delegate(BuffIndex x) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) BuffDef buffDef = BuffCatalog.GetBuffDef(x); return buffDef != null && buffDef.isElite; }).ConvertAll((BuffIndex x) => BuffCatalog.GetBuffDef(x).eliteDef).ToArray() ?? Array.Empty<EliteDef>(); } public static bool isT2(this EliteDef elite) { return (CombatDirector.eliteTiers?.First((EliteTierDef x) => x.eliteTypes.Contains(Elites.Poison))?.eliteTypes?.Contains(elite)).GetValueOrDefault(); } } public class Hooks { [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static Action<Run> <>9__4_0; public static Predicate<Category> <>9__4_11; public static hook_GenerateDirectorCardWeightedSelection <>9__4_1; public static hook_OnEnable <>9__4_2; public static hook_FixedUpdate <>9__4_3; public static hook_OnDisable <>9__4_4; public static hook_OnEnable <>9__4_5; public static Func<EliteDef, bool> <>9__4_16; public static Func<EliteDef, bool> <>9__4_15; public static Action<DamageReport> <>9__4_6; public static Action<BossGroup> <>9__4_7; public static hook_OnDisable <>9__4_8; public static hook_ApplyRate <>9__4_9; public static hook_ApplyRadius <>9__4_10; internal void <Patch>b__4_0(Run _) { ActiveZones.Clear(); BossKilled.Clear(); ChargeCredit.Clear(); } internal WeightedSelection<DirectorCard> <Patch>b__4_1(orig_GenerateDirectorCardWeightedSelection orig, DirectorCardCategorySelection self) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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) Category val = self.categories.ToList().Find((Category x) => x.name == Helpers.GetVanillaMonsterCategoryName((MonsterCategory)3)); if (!((object)(Category)(ref val)).Equals((object)default(Category))) { Minibosses.Clear(); DirectorCard[] cards = val.cards; foreach (DirectorCard val2 in cards) { if (!val2.IsAvailable()) { continue; } object obj; if (val2 == null) { obj = null; } else { SpawnCard spawnCard = val2.spawnCard; if (spawnCard == null) { obj = null; } else { GameObject prefab = spawnCard.prefab; obj = ((prefab != null) ? prefab.GetComponent<CharacterMaster>() : null); } } if (obj == null) { obj = null; } CharacterMaster val3 = (CharacterMaster)obj; if (!((Object)(object)val3 == (Object)null)) { Minibosses.Add(val3.masterIndex); } } Main.Log.LogDebug((object)("Repopulated miniboss list with " + Minibosses.Count + " element(s).")); } return orig.Invoke(self); } internal bool <Patch>b__4_11(Category x) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) return x.name == Helpers.GetVanillaMonsterCategoryName((MonsterCategory)3); } internal void <Patch>b__4_2(orig_OnEnable orig, OutsideInteractableLocker self) { if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid"))) { orig.Invoke(self); } } internal void <Patch>b__4_3(orig_FixedUpdate orig, OutsideInteractableLocker self) { if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid"))) { orig.Invoke(self); } } internal void <Patch>b__4_4(orig_OnDisable orig, OutsideInteractableLocker self) { if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid"))) { orig.Invoke(self); } } internal void <Patch>b__4_5(orig_OnEnable orig, HoldoutZoneController self) { //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0297: Expected O, but got Unknown //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_02f1: Expected O, but got Unknown //IL_0654: Unknown result type (might be due to invalid IL or missing references) //IL_065e: Expected O, but got Unknown <>c__DisplayClass4_0 CS$<>8__locals0 = new <>c__DisplayClass4_0 { self = self }; if (Run.instance is InfiniteTowerRun) { return; } foreach (Main.HoldoutMultiplierInfo holdoutMultiplier in Main.HoldoutMultipliers) { if (((Object)((Component)CS$<>8__locals0.self).gameObject).name.Contains(holdoutMultiplier.name)) { ActiveZones.Add(CS$<>8__locals0.self, holdoutMultiplier); } } if (!ActiveZones.ContainsKey(CS$<>8__locals0.self)) { ActiveZones.Add(CS$<>8__locals0.self, Main.DefaultHoldoutInfo); } BossKilled.Add(CS$<>8__locals0.self, value: false); ChargeCredit.Add(CS$<>8__locals0.self, 0f); if (ActiveZones[CS$<>8__locals0.self].time >= 0f) { CS$<>8__locals0.self.baseChargeDuration = ActiveZones[CS$<>8__locals0.self].time * Mathf.Lerp(1f, Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount), ActiveZones[CS$<>8__locals0.self].mult); } if (ActiveZones[CS$<>8__locals0.self].area >= 0f) { CS$<>8__locals0.self.baseRadius = ActiveZones[CS$<>8__locals0.self].area * Mathf.Lerp(1f, Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount), ActiveZones[CS$<>8__locals0.self].mult); } if ((Object)(object)((Component)CS$<>8__locals0.self).gameObject.GetComponent<BossGroup>() != (Object)null && ActiveZones[CS$<>8__locals0.self].multBoss >= 0f) { CS$<>8__locals0.self.calcChargeRate += (CalcChargeRateDelegate)delegate(ref float rate) { if (BossKilled[CS$<>8__locals0.self]) { rate *= ActiveZones[CS$<>8__locals0.self].multBoss; } }; } if ((Object)(object)((Component)CS$<>8__locals0.self).gameObject.GetComponent<BossGroup>() != (Object)null && ActiveZones[CS$<>8__locals0.self].areaBoss >= 0f) { CS$<>8__locals0.self.calcRadius += (CalcRadiusDelegate)delegate(ref float radius) { if (BossKilled[CS$<>8__locals0.self]) { radius *= ActiveZones[CS$<>8__locals0.self].areaBoss / ActiveZones[CS$<>8__locals0.self].area; } }; } if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("Holdout Zone Begin, boss: " + (object)((Component)CS$<>8__locals0.self).gameObject.GetComponent<BossGroup>() != null)); Main.Log.LogInfo((object)$"Zone Info ({ActiveZones[CS$<>8__locals0.self].name}): {ActiveZones[CS$<>8__locals0.self].time} time, {ActiveZones[CS$<>8__locals0.self].mult} mult, {ActiveZones[CS$<>8__locals0.self].area} area, {ActiveZones[CS$<>8__locals0.self].multBoss} multBoss, {ActiveZones[CS$<>8__locals0.self].areaBoss} areaBoss"); Main.Log.LogInfo((object)$"Config: {Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1)}({Main.ModePerPerson.Value} {Main.ValuePerPerson.Value}x{Run.instance.participatingPlayerCount - 1}) / {Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount)}({Main.ModePerPersonArea.Value} {Main.ValuePerPersonArea.Value}x{Run.instance.participatingPlayerCount - 1})(area) per person, {Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount)}({Main.ModePerStage.Value} {Main.ValuePerStage.Value}x{Run.instance.stageClearCount}) per stage, {Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)}({Main.ModePerLoop.Value} {Main.ValuePerLoop.Value}x{Run.instance.loopClearCount}) per loop"); Main.Log.LogInfo((object)$"Result: {CS$<>8__locals0.self.baseChargeDuration}(x{ActiveZones[CS$<>8__locals0.self].multBoss}b) time, {CS$<>8__locals0.self.baseRadius}(x{ActiveZones[CS$<>8__locals0.self].areaBoss / ActiveZones[CS$<>8__locals0.self].area}b) area"); } CS$<>8__locals0.self.calcAccumulatedCharge += (CalcAccumulatedChargeDelegate)delegate(ref float charge) { if (ChargeCredit[CS$<>8__locals0.self] > 0f) { charge += ChargeCredit[CS$<>8__locals0.self]; ChargeCredit[CS$<>8__locals0.self] = 0f; } }; orig.Invoke(CS$<>8__locals0.self); } internal void <Patch>b__4_6(DamageReport report) { //IL_0020: 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) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_03c1: Unknown result type (might be due to invalid IL or missing references) //IL_0471: Unknown result type (might be due to invalid IL or missing references) if (report == null) { return; } CharacterBody victimBody = report.victimBody; if (victimBody == null) { return; } TeamComponent teamComponent = victimBody.teamComponent; if (teamComponent == null) { return; } _ = teamComponent.teamIndex; if (false || report == null) { return; } CharacterBody attackerBody = report.attackerBody; if (attackerBody == null) { return; } TeamComponent teamComponent2 = attackerBody.teamComponent; if (teamComponent2 == null) { return; } _ = teamComponent2.teamIndex; if (false || !TeamManager.IsTeamEnemy((TeamIndex)1, report.victimBody.teamComponent.teamIndex) || (int)report.attackerBody.teamComponent.teamIndex != 1) { return; } foreach (HoldoutZoneController key in ActiveZones.Keys) { if (report.victimIsBoss || key.baseChargeDuration <= 0f) { continue; } if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("Kill Credited, base: " + ActiveZones[key].kill)); } if (ActiveZones[key].kill == 0f) { continue; } float num = Main.Value.Value + report.victimBody.baseMaxHealth * Main.ValuePerHP.Value; if (Main.DebugMode.Value) { Main.Log.LogInfo((object)$"base: {Main.Value.Value}({Main.Value.Value}+{report.victimBody.baseMaxHealth}x{Main.ValuePerHP.Value})"); } if (report.victimIsElite) { num += Main.EliteBonus.Value; } if (report.victimBody.affixes().Any((EliteDef x) => x.isT2())) { num += Main.EliteT2Bonus.Value; } if (report.victimIsMiniboss()) { num += Main.MinibossBonus.Value; } if (report.victimIsChampion) { num += Main.BossBonus.Value; } if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("bonuses: " + (report.victimIsElite ? $"+{Main.EliteBonus.Value} (elite)" : "") + (report.victimBody.affixes().Any((EliteDef x) => x.isT2()) ? $"+{Main.EliteT2Bonus.Value} (T2)" : "") + (report.victimIsMiniboss() ? $"+{Main.MinibossBonus.Value} (miniboss)" : "") + (report.victimIsChampion ? $"+{Main.BossBonus.Value} (champion)" : ""))); } num *= ActiveZones[key].kill; if ((Object)(object)((Component)key).gameObject.GetComponent<BossGroup>() != (Object)null && !BossKilled[key]) { num *= Main.PreBossKillPenalty.Value; } if (!((BaseZoneBehavior)key).IsInBounds(report.attackerBody.footPosition)) { num *= Main.OutsideRangePenalty.Value; } if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("multipliers: " + ActiveZones[key].kill + (((Object)(object)((Component)key).gameObject.GetComponent<BossGroup>() != (Object)null && !BossKilled[key]) ? $"x{Main.PreBossKillPenalty.Value} (prebosskill)" : "") + ((!((BaseZoneBehavior)key).IsInBounds(report.attackerBody.footPosition)) ? $"x{Main.OutsideRangePenalty.Value} (outsiderange)" : "") + (Main.UseFixedTime.Value ? $"x1s(out of {key.baseChargeDuration})" : "x1%"))); } if (num == 0f) { break; } ChargeCredit[key] += num * (Main.UseFixedTime.Value ? (1f / key.baseChargeDuration) : 0.01f); if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("Return:" + num * (Main.UseFixedTime.Value ? (1f / key.baseChargeDuration) : 0.01f))); } if (Main.CompensateKills.Value == 0f) { continue; } if (!Main.UseFixedTime.Value) { float num2 = 1f / key.baseChargeDuration; CalcChargeRateDelegate val = AccessTools.FieldRefAccess<CalcChargeRateDelegate>(typeof(HoldoutZoneController), "calcChargeRate").Invoke((object)key); if (val != null) { val.Invoke(ref num2); } num *= 0.01f / num2; if (Main.DebugMode.Value) { Main.Log.LogInfo((object)"ChargeRate accessed"); } } if (Main.GeneralScalingCompensation.Value != 0f) { num /= Mathf.Lerp(ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)), 1f, Main.GeneralScalingCompensation.Value); } Run.instance.SetRunStopwatch(Run.instance.GetRunStopwatch() + num * Main.CompensateKills.Value); if (Main.DebugMode.Value) { Main.Log.LogInfo((object)"Time Compensated"); Main.Log.LogInfo((object)$"Config: {Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1)}({Main.ModePerPerson.Value} {Main.ValuePerPerson.Value}x{Run.instance.participatingPlayerCount - 1}) / {Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount)}({Main.ModePerPersonArea.Value} {Main.ValuePerPersonArea.Value}x{Run.instance.participatingPlayerCount - 1})(area) per person, {Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount)}({Main.ModePerStage.Value} {Main.ValuePerStage.Value}x{Run.instance.stageClearCount}) per stage, {Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)}({Main.ModePerLoop.Value} {Main.ValuePerLoop.Value}x{Run.instance.loopClearCount}) per loop"); Main.Log.LogInfo((object)$"Result: a{ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount))}, b{Mathf.Lerp(ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)), 1f, Main.GeneralScalingCompensation.Value)}({ActiveZones[key].mult} mult), charge{num}, d{Main.CompensateKills.Value}"); } } } internal bool <Patch>b__4_16(EliteDef x) { return x.isT2(); } internal bool <Patch>b__4_15(EliteDef x) { return x.isT2(); } internal void <Patch>b__4_7(BossGroup group) { if ((Object)(object)TeleporterInteraction.instance?.bossGroup != (Object)null && (Object)(object)TeleporterInteraction.instance.bossGroup == (Object)(object)group && BossKilled.ContainsKey(TeleporterInteraction.instance.holdoutZoneController)) { BossKilled[TeleporterInteraction.instance.holdoutZoneController] = true; if (Main.UnlockInteractablesPostBoss.Value && Object.op_Implicit((Object)(object)TeleporterInteraction.instance.outsideInteractableLocker)) { ((Behaviour)TeleporterInteraction.instance.outsideInteractableLocker).enabled = false; } } } internal void <Patch>b__4_8(orig_OnDisable orig, HoldoutZoneController self) { if (ActiveZones.ContainsKey(self)) { ActiveZones.Remove(self); } if (BossKilled.ContainsKey(self)) { BossKilled.Remove(self); } if (ChargeCredit.ContainsKey(self)) { ChargeCredit.Remove(self); } orig.Invoke(self); } internal void <Patch>b__4_9(orig_ApplyRate orig, MonoBehaviour self, ref float rate) { //IL_0002: 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_0022: Unknown result type (might be due to invalid IL or missing references) int currentFocusConvergenceCount = ((FocusConvergenceController)self).currentFocusConvergenceCount; if (Main.FocusedConvergenceRateLimit.Value >= 0) { ((FocusConvergenceController)self).currentFocusConvergenceCount = (int)MathF.Min(currentFocusConvergenceCount, Main.FocusedConvergenceRateLimit.Value); } orig.Invoke(self, ref rate); ((FocusConvergenceController)self).currentFocusConvergenceCount = currentFocusConvergenceCount; } internal void <Patch>b__4_10(orig_ApplyRadius orig, MonoBehaviour self, ref float radius) { //IL_0002: 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_0022: Unknown result type (might be due to invalid IL or missing references) int currentFocusConvergenceCount = ((FocusConvergenceController)self).currentFocusConvergenceCount; if (Main.FocusedConvergenceRangeLimit.Value >= 0) { ((FocusConvergenceController)self).currentFocusConvergenceCount = (int)MathF.Min(currentFocusConvergenceCount, Main.FocusedConvergenceRangeLimit.Value); } orig.Invoke(self, ref radius); ((FocusConvergenceController)self).currentFocusConvergenceCount = currentFocusConvergenceCount; } } [CompilerGenerated] private sealed class <>c__DisplayClass4_0 { public HoldoutZoneController self; internal void <Patch>b__12(ref float rate) { if (BossKilled[self]) { rate *= ActiveZones[self].multBoss; } } internal void <Patch>b__13(ref float radius) { if (BossKilled[self]) { radius *= ActiveZones[self].areaBoss / ActiveZones[self].area; } } internal void <Patch>b__14(ref float charge) { if (ChargeCredit[self] > 0f) { charge += ChargeCredit[self]; ChargeCredit[self] = 0f; } } } public static List<MasterIndex> Minibosses = new List<MasterIndex>(); public static Dictionary<HoldoutZoneController, Main.HoldoutMultiplierInfo> ActiveZones = new Dictionary<HoldoutZoneController, Main.HoldoutMultiplierInfo>(); public static Dictionary<HoldoutZoneController, bool> BossKilled = new Dictionary<HoldoutZoneController, bool>(); public static Dictionary<HoldoutZoneController, float> ChargeCredit = new Dictionary<HoldoutZoneController, float>(); public static void Patch() { //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_0045: Expected O, but got Unknown //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Expected O, but got Unknown //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Expected O, but got Unknown //IL_00a9: 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_00b4: Expected O, but got Unknown //IL_00ce: Unknown result type (might be due to invalid IL or missing references) //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d9: Expected O, but got Unknown //IL_013d: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0148: Expected O, but got Unknown //IL_016c: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Expected O, but got Unknown //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Expected O, but got Unknown Run.onRunStartGlobal += delegate { ActiveZones.Clear(); BossKilled.Clear(); ChargeCredit.Clear(); }; object obj = <>c.<>9__4_1; if (obj == null) { hook_GenerateDirectorCardWeightedSelection val = delegate(orig_GenerateDirectorCardWeightedSelection orig, DirectorCardCategorySelection self) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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) Category val10 = self.categories.ToList().Find((Category x) => x.name == Helpers.GetVanillaMonsterCategoryName((MonsterCategory)3)); if (!((object)(Category)(ref val10)).Equals((object)default(Category))) { Minibosses.Clear(); DirectorCard[] cards = val10.cards; foreach (DirectorCard val11 in cards) { if (val11.IsAvailable()) { object obj9; if (val11 == null) { obj9 = null; } else { SpawnCard spawnCard = val11.spawnCard; if (spawnCard == null) { obj9 = null; } else { GameObject prefab = spawnCard.prefab; obj9 = ((prefab != null) ? prefab.GetComponent<CharacterMaster>() : null); } } if (obj9 == null) { obj9 = null; } CharacterMaster val12 = (CharacterMaster)obj9; if (!((Object)(object)val12 == (Object)null)) { Minibosses.Add(val12.masterIndex); } } } Main.Log.LogDebug((object)("Repopulated miniboss list with " + Minibosses.Count + " element(s).")); } return orig.Invoke(self); }; <>c.<>9__4_1 = val; obj = (object)val; } DirectorCardCategorySelection.GenerateDirectorCardWeightedSelection += (hook_GenerateDirectorCardWeightedSelection)obj; object obj2 = <>c.<>9__4_2; if (obj2 == null) { hook_OnEnable val2 = delegate(orig_OnEnable orig, OutsideInteractableLocker self) { if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid"))) { orig.Invoke(self); } }; <>c.<>9__4_2 = val2; obj2 = (object)val2; } OutsideInteractableLocker.OnEnable += (hook_OnEnable)obj2; object obj3 = <>c.<>9__4_3; if (obj3 == null) { hook_FixedUpdate val3 = delegate(orig_FixedUpdate orig, OutsideInteractableLocker self) { if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid"))) { orig.Invoke(self); } }; <>c.<>9__4_3 = val3; obj3 = (object)val3; } OutsideInteractableLocker.FixedUpdate += (hook_FixedUpdate)obj3; object obj4 = <>c.<>9__4_4; if (obj4 == null) { hook_OnDisable val4 = delegate(orig_OnDisable orig, OutsideInteractableLocker self) { if (!Main.UnlockInteractables.Value && (!Main.UnlockVoidSeeds.Value || !(((Object)self.lockPrefab).name == "PurchaseLockVoid"))) { orig.Invoke(self); } }; <>c.<>9__4_4 = val4; obj4 = (object)val4; } OutsideInteractableLocker.OnDisable += (hook_OnDisable)obj4; object obj5 = <>c.<>9__4_5; if (obj5 == null) { hook_OnEnable val5 = delegate(orig_OnEnable orig, HoldoutZoneController self) { //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0297: Expected O, but got Unknown //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_02f1: Expected O, but got Unknown //IL_0654: Unknown result type (might be due to invalid IL or missing references) //IL_065e: Expected O, but got Unknown if (!(Run.instance is InfiniteTowerRun)) { foreach (Main.HoldoutMultiplierInfo holdoutMultiplier in Main.HoldoutMultipliers) { if (((Object)((Component)self).gameObject).name.Contains(holdoutMultiplier.name)) { ActiveZones.Add(self, holdoutMultiplier); } } if (!ActiveZones.ContainsKey(self)) { ActiveZones.Add(self, Main.DefaultHoldoutInfo); } BossKilled.Add(self, value: false); ChargeCredit.Add(self, 0f); if (ActiveZones[self].time >= 0f) { self.baseChargeDuration = ActiveZones[self].time * Mathf.Lerp(1f, Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount), ActiveZones[self].mult); } if (ActiveZones[self].area >= 0f) { self.baseRadius = ActiveZones[self].area * Mathf.Lerp(1f, Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount), ActiveZones[self].mult); } if ((Object)(object)((Component)self).gameObject.GetComponent<BossGroup>() != (Object)null && ActiveZones[self].multBoss >= 0f) { self.calcChargeRate += (CalcChargeRateDelegate)delegate(ref float rate) { if (BossKilled[self]) { rate *= ActiveZones[self].multBoss; } }; } if ((Object)(object)((Component)self).gameObject.GetComponent<BossGroup>() != (Object)null && ActiveZones[self].areaBoss >= 0f) { self.calcRadius += (CalcRadiusDelegate)delegate(ref float radius) { if (BossKilled[self]) { radius *= ActiveZones[self].areaBoss / ActiveZones[self].area; } }; } if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("Holdout Zone Begin, boss: " + (object)((Component)self).gameObject.GetComponent<BossGroup>() != null)); Main.Log.LogInfo((object)$"Zone Info ({ActiveZones[self].name}): {ActiveZones[self].time} time, {ActiveZones[self].mult} mult, {ActiveZones[self].area} area, {ActiveZones[self].multBoss} multBoss, {ActiveZones[self].areaBoss} areaBoss"); Main.Log.LogInfo((object)$"Config: {Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1)}({Main.ModePerPerson.Value} {Main.ValuePerPerson.Value}x{Run.instance.participatingPlayerCount - 1}) / {Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount)}({Main.ModePerPersonArea.Value} {Main.ValuePerPersonArea.Value}x{Run.instance.participatingPlayerCount - 1})(area) per person, {Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount)}({Main.ModePerStage.Value} {Main.ValuePerStage.Value}x{Run.instance.stageClearCount}) per stage, {Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)}({Main.ModePerLoop.Value} {Main.ValuePerLoop.Value}x{Run.instance.loopClearCount}) per loop"); Main.Log.LogInfo((object)$"Result: {self.baseChargeDuration}(x{ActiveZones[self].multBoss}b) time, {self.baseRadius}(x{ActiveZones[self].areaBoss / ActiveZones[self].area}b) area"); } self.calcAccumulatedCharge += (CalcAccumulatedChargeDelegate)delegate(ref float charge) { if (ChargeCredit[self] > 0f) { charge += ChargeCredit[self]; ChargeCredit[self] = 0f; } }; orig.Invoke(self); } }; <>c.<>9__4_5 = val5; obj5 = (object)val5; } HoldoutZoneController.OnEnable += (hook_OnEnable)obj5; GlobalEventManager.onCharacterDeathGlobal += delegate(DamageReport report) { //IL_0020: 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) //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_03c1: Unknown result type (might be due to invalid IL or missing references) //IL_0471: Unknown result type (might be due to invalid IL or missing references) if (report != null) { CharacterBody victimBody = report.victimBody; if (victimBody != null) { TeamComponent teamComponent = victimBody.teamComponent; if (teamComponent != null) { _ = teamComponent.teamIndex; if (0 == 0 && report != null) { CharacterBody attackerBody = report.attackerBody; if (attackerBody != null) { TeamComponent teamComponent2 = attackerBody.teamComponent; if (teamComponent2 != null) { _ = teamComponent2.teamIndex; if (0 == 0 && TeamManager.IsTeamEnemy((TeamIndex)1, report.victimBody.teamComponent.teamIndex) && (int)report.attackerBody.teamComponent.teamIndex == 1) { foreach (HoldoutZoneController key in ActiveZones.Keys) { if (!report.victimIsBoss && !(key.baseChargeDuration <= 0f)) { if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("Kill Credited, base: " + ActiveZones[key].kill)); } if (ActiveZones[key].kill != 0f) { float num = Main.Value.Value + report.victimBody.baseMaxHealth * Main.ValuePerHP.Value; if (Main.DebugMode.Value) { Main.Log.LogInfo((object)$"base: {Main.Value.Value}({Main.Value.Value}+{report.victimBody.baseMaxHealth}x{Main.ValuePerHP.Value})"); } if (report.victimIsElite) { num += Main.EliteBonus.Value; } if (report.victimBody.affixes().Any((EliteDef x) => x.isT2())) { num += Main.EliteT2Bonus.Value; } if (report.victimIsMiniboss()) { num += Main.MinibossBonus.Value; } if (report.victimIsChampion) { num += Main.BossBonus.Value; } if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("bonuses: " + (report.victimIsElite ? $"+{Main.EliteBonus.Value} (elite)" : "") + (report.victimBody.affixes().Any((EliteDef x) => x.isT2()) ? $"+{Main.EliteT2Bonus.Value} (T2)" : "") + (report.victimIsMiniboss() ? $"+{Main.MinibossBonus.Value} (miniboss)" : "") + (report.victimIsChampion ? $"+{Main.BossBonus.Value} (champion)" : ""))); } num *= ActiveZones[key].kill; if ((Object)(object)((Component)key).gameObject.GetComponent<BossGroup>() != (Object)null && !BossKilled[key]) { num *= Main.PreBossKillPenalty.Value; } if (!((BaseZoneBehavior)key).IsInBounds(report.attackerBody.footPosition)) { num *= Main.OutsideRangePenalty.Value; } if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("multipliers: " + ActiveZones[key].kill + (((Object)(object)((Component)key).gameObject.GetComponent<BossGroup>() != (Object)null && !BossKilled[key]) ? $"x{Main.PreBossKillPenalty.Value} (prebosskill)" : "") + ((!((BaseZoneBehavior)key).IsInBounds(report.attackerBody.footPosition)) ? $"x{Main.OutsideRangePenalty.Value} (outsiderange)" : "") + (Main.UseFixedTime.Value ? $"x1s(out of {key.baseChargeDuration})" : "x1%"))); } if (num == 0f) { break; } ChargeCredit[key] += num * (Main.UseFixedTime.Value ? (1f / key.baseChargeDuration) : 0.01f); if (Main.DebugMode.Value) { Main.Log.LogInfo((object)("Return:" + num * (Main.UseFixedTime.Value ? (1f / key.baseChargeDuration) : 0.01f))); } if (Main.CompensateKills.Value != 0f) { if (!Main.UseFixedTime.Value) { float num2 = 1f / key.baseChargeDuration; CalcChargeRateDelegate val9 = AccessTools.FieldRefAccess<CalcChargeRateDelegate>(typeof(HoldoutZoneController), "calcChargeRate").Invoke((object)key); if (val9 != null) { val9.Invoke(ref num2); } num *= 0.01f / num2; if (Main.DebugMode.Value) { Main.Log.LogInfo((object)"ChargeRate accessed"); } } if (Main.GeneralScalingCompensation.Value != 0f) { num /= Mathf.Lerp(ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)), 1f, Main.GeneralScalingCompensation.Value); } Run.instance.SetRunStopwatch(Run.instance.GetRunStopwatch() + num * Main.CompensateKills.Value); if (Main.DebugMode.Value) { Main.Log.LogInfo((object)"Time Compensated"); Main.Log.LogInfo((object)$"Config: {Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount - 1)}({Main.ModePerPerson.Value} {Main.ValuePerPerson.Value}x{Run.instance.participatingPlayerCount - 1}) / {Main.Calc(Main.ModePerPersonArea.Value, Main.ValuePerPersonArea.Value, Run.instance.participatingPlayerCount)}({Main.ModePerPersonArea.Value} {Main.ValuePerPersonArea.Value}x{Run.instance.participatingPlayerCount - 1})(area) per person, {Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount)}({Main.ModePerStage.Value} {Main.ValuePerStage.Value}x{Run.instance.stageClearCount}) per stage, {Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)}({Main.ModePerLoop.Value} {Main.ValuePerLoop.Value}x{Run.instance.loopClearCount}) per loop"); Main.Log.LogInfo((object)$"Result: a{ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount))}, b{Mathf.Lerp(ActiveZones[key].mult * (Main.Calc(Main.ModePerPerson.Value, Main.ValuePerPerson.Value, Run.instance.participatingPlayerCount + 1) * Main.Calc(Main.ModePerStage.Value, Main.ValuePerStage.Value, Run.instance.stageClearCount) * Main.Calc(Main.ModePerLoop.Value, Main.ValuePerLoop.Value, Run.instance.loopClearCount)), 1f, Main.GeneralScalingCompensation.Value)}({ActiveZones[key].mult} mult), charge{num}, d{Main.CompensateKills.Value}"); } } } } } } } } } } } } }; BossGroup.onBossGroupDefeatedServer += delegate(BossGroup group) { if ((Object)(object)TeleporterInteraction.instance?.bossGroup != (Object)null && (Object)(object)TeleporterInteraction.instance.bossGroup == (Object)(object)group && BossKilled.ContainsKey(TeleporterInteraction.instance.holdoutZoneController)) { BossKilled[TeleporterInteraction.instance.holdoutZoneController] = true; if (Main.UnlockInteractablesPostBoss.Value && Object.op_Implicit((Object)(object)TeleporterInteraction.instance.outsideInteractableLocker)) { ((Behaviour)TeleporterInteraction.instance.outsideInteractableLocker).enabled = false; } } }; object obj6 = <>c.<>9__4_8; if (obj6 == null) { hook_OnDisable val6 = delegate(orig_OnDisable orig, HoldoutZoneController self) { if (ActiveZones.ContainsKey(self)) { ActiveZones.Remove(self); } if (BossKilled.ContainsKey(self)) { BossKilled.Remove(self); } if (ChargeCredit.ContainsKey(self)) { ChargeCredit.Remove(self); } orig.Invoke(self); }; <>c.<>9__4_8 = val6; obj6 = (object)val6; } HoldoutZoneController.OnDisable += (hook_OnDisable)obj6; FocusConvergenceController.cap = int.MaxValue; object obj7 = <>c.<>9__4_9; if (obj7 == null) { hook_ApplyRate val7 = delegate(orig_ApplyRate orig, MonoBehaviour self, ref float rate) { //IL_0002: 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_0022: Unknown result type (might be due to invalid IL or missing references) int currentFocusConvergenceCount2 = ((FocusConvergenceController)self).currentFocusConvergenceCount; if (Main.FocusedConvergenceRateLimit.Value >= 0) { ((FocusConvergenceController)self).currentFocusConvergenceCount = (int)MathF.Min(currentFocusConvergenceCount2, Main.FocusedConvergenceRateLimit.Value); } orig.Invoke(self, ref rate); ((FocusConvergenceController)self).currentFocusConvergenceCount = currentFocusConvergenceCount2; }; <>c.<>9__4_9 = val7; obj7 = (object)val7; } FocusConvergenceController.ApplyRate += (hook_ApplyRate)obj7; object obj8 = <>c.<>9__4_10; if (obj8 == null) { hook_ApplyRadius val8 = delegate(orig_ApplyRadius orig, MonoBehaviour self, ref float radius) { //IL_0002: 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_0022: Unknown result type (might be due to invalid IL or missing references) int currentFocusConvergenceCount = ((FocusConvergenceController)self).currentFocusConvergenceCount; if (Main.FocusedConvergenceRangeLimit.Value >= 0) { ((FocusConvergenceController)self).currentFocusConvergenceCount = (int)MathF.Min(currentFocusConvergenceCount, Main.FocusedConvergenceRangeLimit.Value); } orig.Invoke(self, ref radius); ((FocusConvergenceController)self).currentFocusConvergenceCount = currentFocusConvergenceCount; }; <>c.<>9__4_10 = val8; obj8 = (object)val8; } FocusConvergenceController.ApplyRadius += (hook_ApplyRadius)obj8; } } [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInPlugin("prodzpod.FasterBossWait2", "FasterBossWait2", "1.1.9")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class Main : BaseUnityPlugin { public struct HoldoutMultiplierInfo { public string name; public float time; public float mult; public float multBoss; public float kill; public float area; public float areaBoss; } public enum StackingMode { Linear, Exponential, Hyperbolic, Asymptotic } [Serializable] [CompilerGenerated] private sealed class <>c { public static readonly <>c <>9 = new <>c(); public static hook_ShouldUpdateRunStopwatch <>9__78_0; internal bool <Awake>b__78_0(orig_ShouldUpdateRunStopwatch orig, Run self) { //IL_005b: 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) //IL_006c: Unknown result type (might be due to invalid IL or missing references) bool result = orig.Invoke(self); TeleporterInteraction instance = TeleporterInteraction.instance; if (instance != null && instance.isCharged) { foreach (NetworkUser instances in NetworkUser.instancesList) { CharacterBody currentBody = instances.GetCurrentBody(); if (!((Object)(object)currentBody == (Object)null)) { Vector3 val = ((Component)TeleporterInteraction.instance).transform.position - currentBody.corePosition; if (((Vector3)(ref val)).magnitude > TeleporterTimestopArea.Value) { return result; } } } if (DebugMode.Value) { Log.LogInfo((object)"Time Stopped"); } return false; } return result; } } public const string PluginGUID = "prodzpod.FasterBossWait2"; public const string PluginAuthor = "prodzpod"; public const string PluginName = "FasterBossWait2"; public const string PluginVersion = "1.1.9"; public static ManualLogSource Log; internal static PluginInfo pluginInfo; public static ConfigFile Config; public static ConfigEntry<bool> UseFixedTime; public static ConfigEntry<float> CompensateKills; public static ConfigEntry<float> GeneralScalingCompensation; public static ConfigEntry<float> Value; public static ConfigEntry<float> ValuePerHP; public static ConfigEntry<float> EliteBonus; public static ConfigEntry<float> EliteT2Bonus; public static ConfigEntry<float> VariantBonus; public static ConfigEntry<float> MinibossBonus; public static ConfigEntry<float> BossBonus; public static ConfigEntry<float> PreBossKillPenalty; public static ConfigEntry<float> OutsideRangePenalty; public static ConfigEntry<bool> UnlockInteractables; public static ConfigEntry<bool> UnlockInteractablesPostBoss; public static ConfigEntry<bool> UnlockVoidSeeds; public static ConfigEntry<StackingMode> ModePerPerson; public static ConfigEntry<float> ValuePerPerson; public static ConfigEntry<StackingMode> ModePerPersonArea; public static ConfigEntry<float> ValuePerPersonArea; public static ConfigEntry<StackingMode> ModePerStage; public static ConfigEntry<float> ValuePerStage; public static ConfigEntry<StackingMode> ModePerLoop; public static ConfigEntry<float> ValuePerLoop; public static ConfigEntry<int> FocusedConvergenceRateLimit; public static ConfigEntry<int> FocusedConvergenceRangeLimit; public static ConfigEntry<float> TeleporterTime; public static ConfigEntry<float> TeleporterMult; public static ConfigEntry<float> TeleporterKill; public static ConfigEntry<float> TeleporterArea; public static ConfigEntry<float> TeleporterMultBoss; public static ConfigEntry<float> TeleporterAreaBoss; public static ConfigEntry<float> TeleporterTimestopArea; public static ConfigEntry<float> PrimordialTime; public static ConfigEntry<float> PrimordialMult; public static ConfigEntry<float> PrimordialKill; public static ConfigEntry<float> PrimordialArea; public static ConfigEntry<float> PrimordialMultBoss; public static ConfigEntry<float> PrimordialAreaBoss; public static ConfigEntry<float> PillarMassTime; public static ConfigEntry<float> PillarMassMult; public static ConfigEntry<float> PillarMassKill; public static ConfigEntry<float> PillarMassArea; public static ConfigEntry<float> PillarDesignTime; public static ConfigEntry<float> PillarDesignMult; public static ConfigEntry<float> PillarDesignKill; public static ConfigEntry<float> PillarDesignArea; public static ConfigEntry<float> PillarBloodTime; public static ConfigEntry<float> PillarBloodMult; public static ConfigEntry<float> PillarBloodKill; public static ConfigEntry<float> PillarBloodArea; public static ConfigEntry<float> PillarSoulTime; public static ConfigEntry<float> PillarSoulMult; public static ConfigEntry<float> PillarSoulKill; public static ConfigEntry<float> PillarSoulArea; public static ConfigEntry<float> EndingTime; public static ConfigEntry<float> EndingMult; public static ConfigEntry<float> EndingKill; public static ConfigEntry<float> EndingArea; public static ConfigEntry<float> FieldTime; public static ConfigEntry<float> FieldMult; public static ConfigEntry<float> FieldKill; public static ConfigEntry<float> FieldArea; public static ConfigEntry<float> LocusTime; public static ConfigEntry<float> LocusMult; public static ConfigEntry<float> LocusKill; public static ConfigEntry<float> LocusArea; public static ConfigEntry<bool> DebugMode; public static List<HoldoutMultiplierInfo> HoldoutMultipliers; public static HoldoutMultiplierInfo DefaultHoldoutInfo = new HoldoutMultiplierInfo { name = "", time = -1f, mult = 1f, multBoss = -1f, kill = 1f, area = -1f, areaBoss = -1f }; public void Awake() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_04b1: Unknown result type (might be due to invalid IL or missing references) //IL_04b6: Unknown result type (might be due to invalid IL or missing references) //IL_04bc: Expected O, but got Unknown pluginInfo = ((BaseUnityPlugin)this).Info; Log = ((BaseUnityPlugin)this).Logger; Config = new ConfigFile(Path.Combine(Paths.ConfigPath, "prodzpod.FasterBossWait2.cfg"), true); UseFixedTime = Config.Bind<bool>("Kills to Time", "Use Fixed Time", true, "If true, value will be seconds instead of percent."); CompensateKills = Config.Bind<float>("Kills to Time", "Kill Compensation Ratio", 1f, "Time saved by kills multiplied by this amount will be added to run timer."); GeneralScalingCompensation = Config.Bind<float>("Kills to Time", "General Scaling Compensation Ratio", 1f, "0: Kill Compensation will account for total time. 1: Kill compensation will only account for time before general scaling is applied."); Value = Config.Bind<float>("Kills to Time", "Base Value", 1f, "Charge value per kill."); ValuePerHP = Config.Bind<float>("Kills to Time", "Additional Value Per HP", 0f, "Charge value per base HP of the enemy, takes elites into account but not ambient level."); EliteBonus = Config.Bind<float>("Kills to Time", "Elite Bonus Value", 1f, "Extra charge given for defeating an elite."); EliteT2Bonus = Config.Bind<float>("Kills to Time", "Elite T2 Bonus Value", 10f, "Extra charge given for defeating a tier 2 elite. stacks with general elite bonus."); VariantBonus = Config.Bind<float>("Kills to Time", "Variant Bonus Value", 1f, "Extra charge given for defeating a variant enemy, multiplied by experience multiplier."); MinibossBonus = Config.Bind<float>("Kills to Time", "Miniboss Bonus Value", 2f, "Extra charge given for defeating a miniboss."); BossBonus = Config.Bind<float>("Kills to Time", "Boss Bonus Value", 9f, "Extra charge given for defeating a champion."); PreBossKillPenalty = Config.Bind<float>("Kills to Time", "Pre Bosskill Penalty", 0f, "Every kill % before the boss is defeated will be multiplied by this amount."); OutsideRangePenalty = Config.Bind<float>("Kills to Time", "Outside Range Penalty", 1f, "Every kill % while you're outside the teleporter range will be multiplied by this amount."); UnlockInteractables = Config.Bind<bool>("Unlock Interactables", "Unlock Interactables", false, "Unlock interactables with a teleporter enabled."); UnlockInteractablesPostBoss = Config.Bind<bool>("Unlock Interactables", "Unlock Interactables Post Boss", false, "Unlock interactables with a teleporter enabled."); UnlockVoidSeeds = Config.Bind<bool>("Unlock Interactables", "Unlock Void Seeds", false, "Unlock interactables with void seed enabled."); ModePerPerson = Config.Bind<StackingMode>("General Scaling", "Per Person Multiplier Mode", StackingMode.Exponential, "Linear: Value*Count+1, Exponential: Value^Count, Hyperbolic: Value*(Count/(Count+1))+1, Asymptotic: Value - (Value-1)*(1-0.5^Count)"); ValuePerPerson = Config.Bind<float>("General Scaling", "Multiplier Per Person", 1f, "For people who are well coordinated?? idk"); ModePerPersonArea = Config.Bind<StackingMode>("General Scaling", "Per Person Area Multiplier Mode", StackingMode.Exponential, "Linear: Value*Count+1, Exponential: Value^Count, Hyperbolic: Value*(Count/(Count+1))+1, Asymptotic: Value - (Value-1)*(1-0.5^Count)"); ValuePerPersonArea = Config.Bind<float>("General Scaling", "Area Multiplier Per Person", 1f, "For people who are well coordinated?? idk"); ModePerStage = Config.Bind<StackingMode>("General Scaling", "Per Stage Multiplier Mode", StackingMode.Exponential, "Linear: Value*Count+1, Exponential: Value^Count, Hyperbolic: Value*(Count/(Count+1))+1, Asymptotic: Value - (Value-1)*(1-0.5^Count)"); ValuePerStage = Config.Bind<float>("General Scaling", "Multiplier Per Stage", 1f, "multiplier per stage."); ModePerLoop = Config.Bind<StackingMode>("General Scaling", "Per Loop Multiplier Mode", StackingMode.Linear, "Linear: Value*Count+1, Exponential: Value^Count, Hyperbolic: Value*(Count/(Count+1))+1, Asymptotic: Value - (Value-1)*(1-0.5^Count)"); ValuePerLoop = Config.Bind<float>("General Scaling", "Multiplier Per Loop", 1f, "This is also a ChargeInHalf continuation"); FocusedConvergenceRateLimit = Config.Bind<int>("General Scaling", "Focused Convergence Rate Max Stack", -1, "Set to -1 for infinite."); FocusedConvergenceRangeLimit = Config.Bind<int>("General Scaling", "Focused Convergence Range Max Stack", 3, "Set to -1 for infinite."); TeleporterTime = Config.Bind<float>("Zones", "Teleporter Base Charge Time", 90f, "Good ol' Teleporter."); TeleporterMult = Config.Bind<float>("Zones", "Teleporter Charge Multiplier", 1f, "General Scaling's effect on Teleporters. (except focused convergence)"); TeleporterKill = Config.Bind<float>("Zones", "Teleporter Kills Multiplier", 1f, "Kills to Time's effect on Teleporters."); TeleporterArea = Config.Bind<float>("Zones", "Teleporter Base Area", 60f, ""); TeleporterMultBoss = Config.Bind<float>("Zones", "Teleporter Charge Rate post Bosskill", 1f, ""); TeleporterAreaBoss = Config.Bind<float>("Zones", "Teleporter Base Area post Bosskill", 60f, ""); TeleporterTimestopArea = Config.Bind<float>("Zones", "Telepoter Time Stop Area", 12f, "Radius in meters. Set to 0 to disable."); DebugMode = Config.Bind<bool>("If some configs dont work enable this", "Debug Mode", false, "Enable Detailed Log Messages."); if (TeleporterTimestopArea.Value > 0f) { object obj = <>c.<>9__78_0; if (obj == null) { hook_ShouldUpdateRunStopwatch val = delegate(orig_ShouldUpdateRunStopwatch orig, Run self) { //IL_005b: 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) //IL_006c: Unknown result type (might be due to invalid IL or missing references) bool result = orig.Invoke(self); TeleporterInteraction instance = TeleporterInteraction.instance; if (instance != null && instance.isCharged) { foreach (NetworkUser instances in NetworkUser.instancesList) { CharacterBody currentBody = instances.GetCurrentBody(); if (!((Object)(object)currentBody == (Object)null)) { Vector3 val2 = ((Component)TeleporterInteraction.instance).transform.position - currentBody.corePosition; if (((Vector3)(ref val2)).magnitude > TeleporterTimestopArea.Value) { return result; } } } if (DebugMode.Value) { Log.LogInfo((object)"Time Stopped"); } return false; } return result; }; <>c.<>9__78_0 = val; obj = (object)val; } Run.ShouldUpdateRunStopwatch += (hook_ShouldUpdateRunStopwatch)obj; } PrimordialTime = Config.Bind<float>("Zones", "Primordial Teleporter Base Charge Time", 90f, "Primordial Teleporter, in case you want Stage 5 to be special."); PrimordialMult = Config.Bind<float>("Zones", "Primordial Teleporter Charge Multiplier", 1f, "General Scaling's effect on Primordial Teleporters. (except focused convergence)"); PrimordialKill = Config.Bind<float>("Zones", "Primordial Teleporter Kills Multiplier", 0f, "Kills to Time's effect on Primordial Teleporters."); PrimordialArea = Config.Bind<float>("Zones", "Primordial Teleporter Base Area", 60f, ""); PrimordialMultBoss = Config.Bind<float>("Zones", "Primordial Teleporter Charge Rate post Bosskill", 1f, ""); PrimordialAreaBoss = Config.Bind<float>("Zones", "Primordial Teleporter Base Area post Bosskill", 60f, ""); PillarMassTime = Config.Bind<float>("Zones", "Pillar of Mass Base Charge Time", 60f, "Who doesn't like Moon Pillars?"); PillarMassMult = Config.Bind<float>("Zones", "Pillar of Mass Charge Multiplier", 0f, "General Scaling's effect on Moon Pillars. (except focused convergence)"); PillarMassKill = Config.Bind<float>("Zones", "Pillar of Mass Kills Multiplier", 0f, "Kills to Time's effect on Moon Pillars."); PillarMassArea = Config.Bind<float>("Zones", "Pillar of Mass Base Area", 20f, ""); PillarDesignTime = Config.Bind<float>("Zones", "Pillar of Design Base Charge Time", 30f, "Who doesn't like Moon Pillars?"); PillarDesignMult = Config.Bind<float>("Zones", "Pillar of Design Charge Multiplier", 0f, "General Scaling's effect on Moon Pillars. (except focused convergence)"); PillarDesignKill = Config.Bind<float>("Zones", "Pillar of Design Kills Multiplier", 0f, "Kills to Time's effect on Moon Pillars."); PillarDesignArea = Config.Bind<float>("Zones", "Pillar of Design Base Area", 20f, ""); PillarSoulTime = Config.Bind<float>("Zones", "Pillar of Soul Base Charge Time", 30f, "Who doesn't like Moon Pillars?"); PillarSoulMult = Config.Bind<float>("Zones", "Pillar of Soul Charge Multiplier", 0f, "General Scaling's effect on Moon Pillars. (except focused convergence)"); PillarSoulKill = Config.Bind<float>("Zones", "Pillar of Soul Kills Multiplier", 0f, "Kills to Time's effect on Moon Pillars."); PillarSoulArea = Config.Bind<float>("Zones", "Pillar of Soul Base Area", 20f, ""); PillarBloodTime = Config.Bind<float>("Zones", "Pillar of Blood Base Charge Time", 10f, "Who doesn't like Moon Pillars?"); PillarBloodMult = Config.Bind<float>("Zones", "Pillar of Blood Charge Multiplier", 0f, "General Scaling's effect on Moon Pillars. (except focused convergence)"); PillarBloodKill = Config.Bind<float>("Zones", "Pillar of Blood Kills Multiplier", 0f, "Kills to Time's effect on Moon Pillars."); PillarBloodArea = Config.Bind<float>("Zones", "Pillar of Blood Base Area", 20f, ""); EndingTime = Config.Bind<float>("Zones", "The Final Spacecraft Base Charge Time", 120f, "And so they left..."); EndingMult = Config.Bind<float>("Zones", "The Final Spacecraft Charge Multiplier", 0f, "General Scaling's effect on The Final Spacecraft. (except focused convergence)"); EndingKill = Config.Bind<float>("Zones", "The Final Spacecraft Kills Multiplier", 2f, "Kills to Time's effect on The Final Spacecraft."); EndingArea = Config.Bind<float>("Zones", "The Final Spacecraft Base Area", 40f, ""); FieldTime = Config.Bind<float>("Zones", "Void Field Base Charge Time", 60f, "Void Fields"); FieldMult = Config.Bind<float>("Zones", "Void Field Charge Multiplier", 1f, "General Scaling's effect on Void Fields. (except focused convergence)"); FieldKill = Config.Bind<float>("Zones", "Void Field Kills Multiplier", 1f, "Kills to Time's effect on Void Fields."); FieldArea = Config.Bind<float>("Zones", "Void Field Base Area", 15f, ""); LocusTime = Config.Bind<float>("Zones", "Deep Void Beacon Base Charge Time", 90f, "Deep Void Beacons"); LocusMult = Config.Bind<float>("Zones", "Deep Void Beacon Charge Multiplier", 1f, "General Scaling's effect on Deep Void Beacons. (except focused convergence)"); LocusKill = Config.Bind<float>("Zones", "Deep Void Beacon Kills Multiplier", 1f, "Kills to Time's effect on Deep Void Beacons."); LocusArea = Config.Bind<float>("Zones", "Deep Void Beacon Base Area", 20f, ""); HoldoutMultipliers = new List<HoldoutMultiplierInfo>(9) { new HoldoutMultiplierInfo { name = "Teleporter1", time = TeleporterTime.Value, mult = TeleporterMult.Value, multBoss = TeleporterMultBoss.Value, kill = TeleporterKill.Value, area = TeleporterArea.Value, areaBoss = TeleporterAreaBoss.Value }, new HoldoutMultiplierInfo { name = "LunarTeleporter", time = PrimordialTime.Value, mult = PrimordialMult.Value, multBoss = PrimordialMultBoss.Value, kill = PrimordialKill.Value, area = PrimordialArea.Value, areaBoss = PrimordialAreaBoss.Value }, new HoldoutMultiplierInfo { name = "MoonBatteryMass", time = PillarMassTime.Value, mult = PillarMassMult.Value, multBoss = -1f, kill = PillarMassKill.Value, area = PillarMassArea.Value, areaBoss = -1f }, new HoldoutMultiplierInfo { name = "MoonBatteryDesign", time = PillarDesignTime.Value, mult = PillarDesignMult.Value, multBoss = -1f, kill = PillarDesignKill.Value, area = PillarDesignArea.Value, areaBoss = -1f }, new HoldoutMultiplierInfo { name = "MoonBatteryBlood", time = PillarBloodTime.Value, mult = PillarBloodMult.Value, multBoss = -1f, kill = PillarBloodKill.Value, area = PillarBloodArea.Value, areaBoss = -1f }, new HoldoutMultiplierInfo { name = "MoonBatterySoul", time = PillarSoulTime.Value, mult = PillarSoulMult.Value, multBoss = -1f, kill = PillarSoulKill.Value, area = PillarSoulArea.Value, areaBoss = -1f }, new HoldoutMultiplierInfo { name = "HoldoutZone", time = EndingTime.Value, mult = EndingMult.Value, multBoss = -1f, kill = EndingKill.Value, area = EndingArea.Value, areaBoss = -1f }, new HoldoutMultiplierInfo { name = "NullSafeZone", time = FieldTime.Value, mult = FieldMult.Value, multBoss = -1f, kill = FieldKill.Value, area = FieldArea.Value, areaBoss = -1f }, new HoldoutMultiplierInfo { name = "DeepVoidPortalBattery", time = LocusTime.Value, mult = LocusMult.Value, multBoss = -1f, kill = LocusKill.Value, area = LocusArea.Value, areaBoss = -1f } }; Hooks.Patch(); } public static float Calc(StackingMode mode, float value, float count) { switch (mode) { case StackingMode.Linear: return value * count + 1f; case StackingMode.Exponential: return Mathf.Pow(value, count); case StackingMode.Hyperbolic: return value * count / (count + 1f) + 1f; case StackingMode.Asymptotic: return (1f - value) * (1f - Mathf.Pow(2f, 0f - count)) + value; default: Log.LogError((object)"Invalid Mode??"); return 0f; } } } }