Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of VoidQoL v1.1.6
plugins/VoidQoL/VoidQoL.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using EntityStates; using EntityStates.Missions.Arena.NullWard; using HG.Reflection; using Microsoft.CodeAnalysis; using RoR2; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("VoidQoL")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("VoidQoL")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: AssemblyFileVersion("9999.1.1.6")] [assembly: OptIn] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("9999.1.1.6")] [module: UnverifiableCode] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } } namespace VoidQoL { internal static class Config { internal static ConfigEntry<bool> voidFieldsIncreaseChargeOnKill; internal static ConfigEntry<bool> voidFieldsIncreaseChargeBasedOnSize; internal static ConfigEntry<float> voidFieldsIncreaseChargePercentagePerKill; internal static ConfigEntry<bool> voidFieldsEnemyHasteOnSpawn; internal static ConfigEntry<float> voidFieldsEnemyHasteDuration; internal static ConfigEntry<bool> voidFieldsHealOnRoundStart; internal static ConfigEntry<bool> voidFieldsReviveOnRoundStart; internal static ConfigEntry<bool> voidFieldsReviveOnArenaEnd; internal static ConfigEntry<float> voidFieldsHoldoutZoneRadiusMult; internal static ConfigEntry<bool> voidLocusIncreaseChargeOnKill; internal static ConfigEntry<bool> voidLocusPlayerFogHaste; internal static ConfigEntry<bool> voidLocusSupressNPCEntry; internal static ConfigEntry<bool> voidLocusDecreaseRadiusIfEnemyInvades; internal static ConfigEntry<bool> voidLocusVoidMonsterNoVoidItem; internal static ConfigEntry<bool> voidLocusHoldoutZoneVerticalTube; internal static ConfigEntry<float> voidLocusHoldoutZoneRadiusExtra; internal static ConfigEntry<float> voidLocusHoldoutZoneAutoCharge; internal static ConfigEntry<float> voidLocusHoldoutZonePlayerScaling; internal static ConfigEntry<float> voidLocusHoldoutZoneDischargeRate; public static void Initialize() { voidFieldsIncreaseChargeOnKill = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Fields", "Charge On Kill : Active", true, "Should the holdout zones gain charge from monster kills."); voidFieldsIncreaseChargeBasedOnSize = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Fields", "Charge On Kill : Gain based on enemy Size", true, "Should the holdout zones gain charge from monster kills based on their size divided by 1.5. Champions always give flat 5%. Needs: Charge On Kill : Active"); voidFieldsIncreaseChargePercentagePerKill = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<float>("VoidQoL :: Void Fields", "Charge On Kill : Flat gain per skill", 0f, "Flat amount of charge the holdout zones will gain with each kill. Needs: Charge On Kill : Active"); voidFieldsEnemyHasteOnSpawn = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Fields", "Hasten Enemies : Active", true, "Should monsters spawning get a speedboost when spawning."); voidFieldsEnemyHasteDuration = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<float>("VoidQoL :: Void Fields", "Hasten Enemies : Buff Duration", 16f, "Base amount in seconds which the cloak speed boost buff will last in enemies spawning. Substracted by their current speed, so fast enemies / enemies with items don't go overdrive. Needs: Hasten Enemies : Active"); voidFieldsHealOnRoundStart = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Fields", "Round Heal", true, "Should the players inside the Void Vent get healed when starting a new wave."); voidFieldsReviveOnRoundStart = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Fields", "Round Revival", false, "Should dead players revive when starting a new wave."); voidFieldsReviveOnArenaEnd = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Fields", "Clear Revival", false, "Should dead players revive when the arena has been cleared."); voidFieldsHoldoutZoneRadiusMult = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<float>("VoidQoL :: Void Fields", "Radius Multiplication", 1f, "By what number should the Holdout Zone multiply its radius for."); voidLocusIncreaseChargeOnKill = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Locus", "Charge On Kill", false, "Should the holdout zones gain charge from monster kills."); voidLocusPlayerFogHaste = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Locus", "Apply haste if inside fog on new round start.", true, "If true, it will grant a speed boost to all players in the fog whenever a zone gets activated."); voidLocusSupressNPCEntry = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Locus", "Supress NPC entry.", false, "If true, NPCs like drones won't be allowed in the stage. Bazaar between Time functions in the same way."); voidLocusDecreaseRadiusIfEnemyInvades = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Locus", "Decrease If Enemy Invades", true, "If true, the radius of the charging zone will decrease if there's enemies inside."); voidLocusVoidMonsterNoVoidItem = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Locus", "Remove void items from void enemies", true, "If true, any void enemies that spawn will get their void items taken away."); voidLocusHoldoutZoneVerticalTube = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<bool>("VoidQoL :: Void Locus", "Vertical Tube", true, "If true, it will change the zones to be a vertical tube instead of a sphere."); voidLocusHoldoutZoneRadiusExtra = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<float>("VoidQoL :: Void Locus", "Radius Increase", 5f, "By what number should the Holdout Zone increase its radius. Vanilla has a base radius of 20m, and it cannot be smaller than 5m."); voidLocusHoldoutZoneAutoCharge = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<float>("VoidQoL :: Void Locus", "Auto charging percentage", 0f, "What percentage should the Holdout Zone gain charge each second."); voidLocusHoldoutZonePlayerScaling = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<float>("VoidQoL :: Void Locus", "Player scale value", 0.75f, "How much players affect the charging rate while inside the zone. Default is 1. Math operation is (PlayersInRadius / AlivePlayers) ^ this."); voidLocusHoldoutZoneDischargeRate = ((BaseUnityPlugin)UnityPlugin.instance).Config.Bind<float>("VoidQoL :: Void Locus", "Discharge Rate", -0.005f, "By how much should the zone discharge when there's no players inside. Negative values add to the charge percentage."); Debug.Log((object)("The config values are:\nvoidFieldsIncreaseChargeOnKill " + voidFieldsIncreaseChargeOnKill.Value + "\nvoidFieldsHealOnRoundStart " + voidFieldsHealOnRoundStart.Value + "\nvoidFieldsReviveOnRoundStart " + voidFieldsReviveOnRoundStart.Value + "\nvoidFieldsReviveOnArenaEnd" + voidFieldsReviveOnArenaEnd.Value + "\nvoidFieldsHoldoutZoneRadiusMult" + voidFieldsHoldoutZoneRadiusMult.Value + "\n\nvoidLocusIncreaseChargeOnKill " + voidLocusIncreaseChargeOnKill.Value + "\nvoidLocusPlayerFogHaste " + voidLocusPlayerFogHaste.Value + "\voidLocusDecreaseRadiusIfEnemyInvades " + voidLocusDecreaseRadiusIfEnemyInvades.Value + "\nvoidLocusHoldoutZoneVerticalTube " + voidLocusHoldoutZoneVerticalTube.Value + "\voidLocusHoldoutZoneRadiusExtra " + voidLocusHoldoutZoneRadiusExtra.Value + "\nvoidLocusHoldoutZoneAutoCharge" + voidLocusHoldoutZoneAutoCharge.Value + "\nvoidLocusHoldoutZonePlayerScaling " + voidLocusHoldoutZonePlayerScaling.Value)); } } [BepInPlugin("com.Anreol.VoidQoL", "VoidQoL", "9999.1.1.6")] public class UnityPlugin : BaseUnityPlugin { internal const string ModVer = "9999.1.1.6"; internal const string ModIdentifier = "VoidQoL"; internal const string ModGuid = "com.Anreol.VoidQoL"; public static UnityPlugin instance; public void Awake() { instance = this; Config.Initialize(); } } } namespace VoidQoL.Modules { internal class VoidFieldsQoL { private static VoidFieldsQoLServerListener instance; [SystemInitializer(new Type[] { typeof(SceneCatalog) })] public static void Init() { ArenaMissionController.onInstanceChangedGlobal += onInstanceChangedGlobal; ArenaMissionController.onBeatArena += RemoveComponent; } private static void RemoveComponent() { if ((Object)(object)instance != (Object)null) { Object.Destroy((Object)(object)instance); } } private static void onInstanceChangedGlobal() { if ((Object)(object)instance == (Object)null && NetworkServer.active) { instance = ((Component)ArenaMissionController.instance).gameObject.AddComponent<VoidFieldsQoLServerListener>(); } } } internal class VoidFieldsQoLServerListener : MonoBehaviour { private float accumulatedCharge; private float totalAccumulatedChargeInCurrentRound; private int nOfClearedRounds; private bool awaitActivation = false; private EntityStateMachine cachedMachineOfCurrentRound; private void OnEnable() { //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008e: Expected O, but got Unknown //IL_0098: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Expected O, but got Unknown cachedMachineOfCurrentRound = ArenaMissionController.instance.nullWards[0].GetComponent<EntityStateMachine>(); if (Config.voidFieldsIncreaseChargeOnKill.Value) { GlobalEventManager.onCharacterDeathGlobal += onCharacterDeathGlobal; } if (Config.voidFieldsEnemyHasteOnSpawn.Value) { CharacterBody.onBodyStartGlobal += onBodyStartGlobal; } GameObject[] nullWards = ArenaMissionController.instance.nullWards; foreach (GameObject val in nullWards) { HoldoutZoneController component = val.GetComponent<HoldoutZoneController>(); component.calcAccumulatedCharge += new CalcAccumulatedChargeDelegate(calcAccumulatedCharge); component.calcRadius += new CalcRadiusDelegate(calcRadius); } } private void onBodyStartGlobal(CharacterBody obj) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) if (TeamManager.IsTeamEnemy(obj.teamComponent.teamIndex, (TeamIndex)1)) { obj.AddTimedBuff(Buffs.CloakSpeed, Config.voidFieldsEnemyHasteDuration.Value - obj.moveSpeed); obj.AddTimedBuff(Buffs.HiddenInvincibility, 0.75f); } } private void calcRadius(ref float radius) { if (Config.voidFieldsHoldoutZoneRadiusMult.Value != 1f) { radius *= Config.voidFieldsHoldoutZoneRadiusMult.Value; } } private void OnDisable() { //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Expected O, but got Unknown GlobalEventManager.onCharacterDeathGlobal -= onCharacterDeathGlobal; GameObject[] nullWards = ArenaMissionController.instance.nullWards; foreach (GameObject val in nullWards) { HoldoutZoneController component = val.GetComponent<HoldoutZoneController>(); component.calcAccumulatedCharge -= new CalcAccumulatedChargeDelegate(calcAccumulatedCharge); } } private void OnDestroy() { //IL_00aa: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: 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_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_015a: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) Debug.LogWarning((object)"Destroyed!"); SphereZone component = ((Component)cachedMachineOfCurrentRound).gameObject.GetComponent<SphereZone>(); if (Run.instance.isGameOverServer || !Config.voidFieldsReviveOnArenaEnd.Value) { return; } Debug.LogWarning((object)"Reviving players at round end!"); foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances) { Debug.LogWarning((object)("Checking for revival " + instance.GetDisplayName())); CharacterMaster master = instance.master; if (!instance.isConnected || !master.IsDeadAndOutOfLivesServer() || !Config.voidFieldsReviveOnRoundStart.Value) { continue; } Vector3 val = master.deathFootPosition; if (Object.op_Implicit((Object)(object)component)) { val = TeleportHelper.FindSafeTeleportDestination(((Component)component).transform.position, master.bodyPrefab.GetComponent<CharacterBody>(), RoR2Application.rng).GetValueOrDefault(val); } master.Respawn(val, Quaternion.Euler(0f, Random.Range(0f, 360f), 0f), false); CharacterBody body = master.GetBody(); if (Object.op_Implicit((Object)(object)body)) { body.AddTimedBuff(Buffs.Immune, 3f); EntityStateMachine[] components = ((Component)body).GetComponents<EntityStateMachine>(); foreach (EntityStateMachine val2 in components) { val2.initialStateType = val2.mainStateType; } } } } private void FixedUpdate() { //IL_0145: 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_0282: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_0290: Unknown result type (might be due to invalid IL or missing references) //IL_0295: Unknown result type (might be due to invalid IL or missing references) //IL_029d: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Expected O, but got Unknown //IL_02d3: 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_0301: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01d0: 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_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018a: Unknown result type (might be due to invalid IL or missing references) //IL_018f: Unknown result type (might be due to invalid IL or missing references) //IL_033f: Unknown result type (might be due to invalid IL or missing references) //IL_0345: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) if (nOfClearedRounds != ArenaMissionController.instance.clearedRounds) { Debug.LogWarning((object)"Awaiting new Round!"); Debug.LogWarning((object)("Amount of charge accumulated in the previous round by kills: " + totalAccumulatedChargeInCurrentRound)); totalAccumulatedChargeInCurrentRound = 0f; cachedMachineOfCurrentRound = ArenaMissionController.instance.nullWards[ArenaMissionController.instance.currentRound].GetComponent<EntityStateMachine>(); nOfClearedRounds = ArenaMissionController.instance.clearedRounds; awaitActivation = true; } if (!awaitActivation) { return; } EntityState state = cachedMachineOfCurrentRound.state; Active val = (Active)(object)((state is Active) ? state : null); if (val == null) { return; } Debug.LogWarning((object)"New Round!"); awaitActivation = false; if (Run.instance.isGameOverServer) { return; } for (int i = 0; i < PlayerCharacterMasterController.instances.Count; i++) { Debug.LogWarning((object)("Checking for healing & Revival: " + PlayerCharacterMasterController.instances[i].GetDisplayName())); CharacterMaster master = PlayerCharacterMasterController.instances[i].master; if (PlayerCharacterMasterController.instances[i].isConnected && master.IsDeadAndOutOfLivesServer() && Config.voidFieldsReviveOnRoundStart.Value) { Vector3 val2 = master.deathFootPosition; if (Object.op_Implicit((Object)(object)((NullWardBaseState)val).sphereZone)) { val2 = TeleportHelper.FindSafeTeleportDestination(((Component)((NullWardBaseState)val).sphereZone).transform.position, master.bodyPrefab.GetComponent<CharacterBody>(), RoR2Application.rng).GetValueOrDefault(val2); } Debug.LogWarning((object)("Respawning " + PlayerCharacterMasterController.instances[i].GetDisplayName())); master.Respawn(val2, Quaternion.Euler(0f, Random.Range(0f, 360f), 0f), false); CharacterBody body = master.GetBody(); if (Object.op_Implicit((Object)(object)body)) { body.AddTimedBuff(Buffs.Immune, 3f); EntityStateMachine[] components = ((Component)body).GetComponents<EntityStateMachine>(); foreach (EntityStateMachine val3 in components) { val3.initialStateType = val3.mainStateType; } } } CharacterBody body2 = master.GetBody(); if (Config.voidFieldsHealOnRoundStart.Value) { Debug.LogWarning((object)("Healing " + master.GetBody().GetDisplayName())); body2.healthComponent.HealFraction(0.05f, default(ProcChainMask)); EffectData val4 = new EffectData { origin = body2.transform.position }; val4.SetNetworkedObjectReference(((Component)body2).gameObject); EffectManager.SpawnEffect(LegacyResourcesAPI.Load<GameObject>("Prefabs/Effects/MedkitHealEffect"), val4, true); bool flag = Vector3.Distance(body2.transform.position, ((EntityState)val).transform.position) <= 5f; if (((BaseZoneBehavior)((NullWardBaseState)val).sphereZone).IsInBounds(body2.transform.position) || flag) { Debug.LogWarning((object)("Healing more since was inside void cell " + master.GetBody().GetDisplayName())); body2.healthComponent.HealFraction(0.45f, default(ProcChainMask)); } } } } private void calcAccumulatedCharge(ref float charge) { if (charge >= 0.05f) { charge += accumulatedCharge / 100f; accumulatedCharge = 0f; } } private void onCharacterDeathGlobal(DamageReport obj) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) if (TeamManager.IsTeamEnemy(obj.victimTeamIndex, (TeamIndex)1) && (cachedMachineOfCurrentRound.state is Active || !awaitActivation)) { if (Config.voidFieldsIncreaseChargeBasedOnSize.Value) { accumulatedCharge += (obj.victimIsChampion ? 5f : (obj.victimBody.bestFitRadius / 1.5f)); totalAccumulatedChargeInCurrentRound += (obj.victimIsChampion ? 5f : (obj.victimBody.bestFitRadius / 1.5f)); } if (Config.voidFieldsIncreaseChargePercentagePerKill.Value > 0f) { accumulatedCharge += Config.voidFieldsIncreaseChargePercentagePerKill.Value; totalAccumulatedChargeInCurrentRound += Config.voidFieldsIncreaseChargePercentagePerKill.Value; } } } } public class VoidLocusQoL { public static VoidLocusQoLMissionControllerListener instance; [SystemInitializer(new Type[] { typeof(SceneCatalog) })] public static void Init() { Stage.onStageStartGlobal += onStageStartGlobal; CharacterBody.onBodyStartGlobal += onBodyStartGlobal; SceneCatalog.GetSceneDefFromSceneName("voidstage").suppressNpcEntry = Config.voidLocusSupressNPCEntry.Value; } private static void onBodyStartGlobal(CharacterBody obj) { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Invalid comparison between Unknown and I4 //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_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Invalid comparison between Unknown and I4 //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Invalid comparison between Unknown and I4 //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Invalid comparison between Unknown and I4 //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Invalid comparison between Unknown and I4 //IL_00d5: 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_00e3: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || !((Object)(object)instance != (Object)null) || !Config.voidLocusVoidMonsterNoVoidItem.Value || (int)obj.teamComponent.teamIndex != 4) { return; } List<ItemIndex> list = new List<ItemIndex>(); foreach (ItemIndex item in obj.inventory.itemAcquisitionOrder) { ItemDef itemDef = ItemCatalog.GetItemDef(item); if ((int)itemDef.tier == 6 || (int)itemDef.tier == 7 || (int)itemDef.tier == 8 || (int)itemDef.tier == 9) { list.Add(item); } } foreach (ItemIndex item2 in list) { obj.inventory.ResetItem(item2); } } public static void onStageStartGlobal(Stage obj) { if (Object.op_Implicit((Object)(object)VoidStageMissionController.instance) && (Object)(object)instance == (Object)null) { instance = ((Component)VoidStageMissionController.instance).gameObject.AddComponent<VoidLocusQoLMissionControllerListener>(); } } } public class VoidLocusQoLMissionControllerListener : MonoBehaviour { private int cachedFogCount; private void FixedUpdate() { ScanForHoldoutZones(); } private void ScanForHoldoutZones() { List<HoldoutZoneController> instancesList = InstanceTracker.GetInstancesList<HoldoutZoneController>(); foreach (HoldoutZoneController item in instancesList) { if (Object.op_Implicit((Object)(object)((Component)item).gameObject.GetComponent<VoidLocusQoLHoldoutZoneController>())) { continue; } Debug.LogWarning((object)("Gave " + ((object)item)?.ToString() + " its own VoidLocusQoL controller")); ((Component)item).gameObject.AddComponent<VoidLocusQoLHoldoutZoneController>(); if (!Config.voidLocusPlayerFogHaste.Value || !NetworkServer.active) { continue; } Debug.Log((object)"Applying haste!"); IEnumerable<CharacterBody> affectedBodiesOnTeam = VoidStageMissionController.instance.fogDamageController.GetAffectedBodiesOnTeam((TeamIndex)1); foreach (CharacterBody item2 in affectedBodiesOnTeam) { item2.AddTimedBuff(Buffs.KillMoveSpeed, 6f); item2.AddTimedBuff(Buffs.KillMoveSpeed, 6f); item2.AddTimedBuff(Buffs.KillMoveSpeed, 6f); item2.AddTimedBuff(Buffs.KillMoveSpeed, 6f); item2.AddTimedBuff(Buffs.KillMoveSpeed, 6f); Debug.Log((object)("Applied haste to " + (object)item2)); } } } } internal class VoidLocusQoLHoldoutZoneController : MonoBehaviour { private HoldoutZoneController disThing; private SphereSearch sphereSearch; private List<HurtBox> enemyHurtboxList; private TeamMask voidTeam; private float chargeFromKilling; private float stopwatch; private void OnEnable() { //IL_0089: 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) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_013f: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Expected O, but got Unknown //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_0161: Expected O, but got Unknown //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Unknown result type (might be due to invalid IL or missing references) //IL_00f4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Expected O, but got Unknown InstanceTracker.Add<VoidLocusQoLHoldoutZoneController>(this); disThing = ((Component)this).gameObject.GetComponent<HoldoutZoneController>(); if ((Object)(object)disThing == (Object)null) { Debug.LogError((object)"Destroying self, theres no HoldoutZoneController to attach ourselves to!"); Object.Destroy((Object)(object)this); return; } if (Config.voidLocusHoldoutZoneVerticalTube.Value) { Debug.Log((object)"Tubifying the zone..."); ((Component)((Component)disThing.radiusIndicator).gameObject.transform.parent).transform.localScale = new Vector3(1f, 50f, 1f); disThing.holdoutZoneShape = (HoldoutZoneShape)1; } if (NetworkServer.active) { voidTeam = default(TeamMask); ((TeamMask)(ref voidTeam)).AddTeam((TeamIndex)4); if (Config.voidLocusDecreaseRadiusIfEnemyInvades.Value) { Debug.Log((object)"Initializing sphere search..."); enemyHurtboxList = new List<HurtBox>(); sphereSearch = new SphereSearch { queryTriggerInteraction = (QueryTriggerInteraction)2, mask = ((LayerIndex)(ref LayerIndex.entityPrecise)).mask, origin = ((Component)this).transform.position }; } GlobalEventManager.onCharacterDeathGlobal += onCharacterDeathGlobal; disThing.calcAccumulatedCharge += new CalcAccumulatedChargeDelegate(calcAccumulatedCharge); disThing.calcRadius += new CalcRadiusDelegate(calcRadius); disThing.playerCountScaling = Config.voidLocusHoldoutZonePlayerScaling.Value; disThing.dischargeRate = Config.voidLocusHoldoutZoneDischargeRate.Value; } } private void FixedUpdate() { if (disThing.wasCharged) { Object.Destroy((Object)(object)this); } } private void OnDisable() { InstanceTracker.Remove<VoidLocusQoLHoldoutZoneController>(this); } private void onCharacterDeathGlobal(DamageReport obj) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) if (TeamManager.IsTeamEnemy(obj.victimTeamIndex, (TeamIndex)1)) { chargeFromKilling += (obj.victimIsChampion ? 5f : (obj.victimBody.bestFitRadius / 5f)); } } private void calcRadius(ref float radius) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) float num = 0f; if (Config.voidLocusDecreaseRadiusIfEnemyInvades.Value && sphereSearch != null) { sphereSearch.radius = disThing.currentRadius; enemyHurtboxList.Clear(); sphereSearch.RefreshCandidates().FilterCandidatesByDistinctHurtBoxEntities().FilterCandidatesByHurtBoxTeam(voidTeam) .GetHurtBoxes(enemyHurtboxList); foreach (HurtBox enemyHurtbox in enemyHurtboxList) { if (Object.op_Implicit((Object)(object)enemyHurtbox) && Object.op_Implicit((Object)(object)enemyHurtbox.healthComponent) && Object.op_Implicit((Object)(object)enemyHurtbox.healthComponent.body)) { num -= ((enemyHurtbox.healthComponent.body.bestFitRadius > 1f) ? 1f : enemyHurtbox.healthComponent.body.bestFitRadius); } } } num += Config.voidLocusHoldoutZoneRadiusExtra.Value; radius += num; } private void calcAccumulatedCharge(ref float charge) { if (charge >= 0.01f) { stopwatch += Time.fixedDeltaTime; if (stopwatch >= 1f) { stopwatch = 0f; charge += Config.voidLocusHoldoutZoneAutoCharge.Value; } if (Config.voidLocusIncreaseChargeOnKill.Value) { charge += chargeFromKilling / 100f; chargeFromKilling = 0f; } } } } }