Decompiled source of NyxLib v0.1.0
NyxLib.dll
Decompiled 6 days 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.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using GameConsole; using HarmonyLib; using Nyxpiri.Collections.Generic; using Nyxpiri.ULTRAKILL.NyxLib; using Nyxpiri.ULTRAKILL.NyxLib.Diagnostics.Debug; using TMPro; using ULTRAKILL.Cheats; using UnityEngine; using UnityEngine.Assertions; using UnityEngine.Events; using UnityEngine.SceneManagement; using UnityEngine.UI; [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: AssemblyVersion("0.0.0.0")] public static class StackDebug { public static string GetStackString() { StackTrace arg = new StackTrace(1, fNeedFileInfo: false); return $"{arg}"; } public static void PrintStack() { StackTrace arg = new StackTrace(1, fNeedFileInfo: false); Log.DebugInfo($"{arg}"); } } public class EnemyModifier : MonoBehaviour { } public class EnemyComponents : MonoBehaviour { public delegate void PreHurtEventHandler(EventMethodCanceler canceler, GameObject target, Vector3 force, Vector3? hitPoint, float multiplier, bool tryForExplode, float critMultiplier, GameObject sourceWeapon, bool ignoreTotalDamageTakenMultiplier, bool fromExplosion); public delegate void PostHurtEventHandler(EventMethodCancelInfo cancelInfo, GameObject target, Vector3 force, Vector3? hitPoint, float multiplier, bool tryForExplode, float critMultiplier, GameObject sourceWeapon, bool ignoreTotalDamageTakenMultiplier, bool fromExplosion); public delegate void PreAnyEnemyHurtEventHandler(EventMethodCanceler canceler, EnemyComponents enemy, GameObject target, Vector3 force, Vector3? hitPoint, float multiplier, bool tryForExplode, float critMultiplier, GameObject sourceWeapon, bool ignoreTotalDamageTakenMultiplier, bool fromExplosion); public delegate void PostAnyEnemyHurtEventHandler(EventMethodCancelInfo cancelInfo, EnemyComponents enemy, GameObject target, Vector3 force, Vector3? hitPoint, float multiplier, bool tryForExplode, float critMultiplier, GameObject sourceWeapon, bool ignoreTotalDamageTakenMultiplier, bool fromExplosion); public delegate void PreEnrageEventHandler(EventMethodCanceler canceler); public delegate void PostEnrageEventHandler(EventMethodCancelInfo cancelInfo); public delegate void PreUnEnrageEventHandler(EventMethodCanceler canceler); public delegate void PostUnEnrageEventHandler(EventMethodCancelInfo cancelInfo); public delegate void PreDeathEventHandler(EventMethodCanceler canceler, bool instakill); public delegate void PostDeathEventHandler(EventMethodCancelInfo cancelInfo, bool instakill); public static MonoRegistrar MonoRegistrar = new MonoRegistrar(); [SerializeField] private EnemyPrefabStore _PrefabStore = null; [SerializeField] private EnemyRadiance _Radiance = null; [SerializeField] private bool _hasDoneSetup = false; [SerializeField] private EnemyRoot _enemyRootMono; public bool AvoidHealthBasedSlowDown = false; [NonSerialized] public bool QueuedForDestruction = false; public EnemyIdentifier Eid = null; public Enemy Enemy = null; [SerializeField] private Collider[] _colliders = null; [SerializeField] private List<MonoBehaviour> _monoBehaviours = null; private bool _isEnemyCompInitializer = false; private object DeathPatchCallerObject = null; private bool PreDeathCalled = false; private bool PostDeathCalled = false; private bool DeathCalled = false; private bool InTheProcessOfHurting = false; private object HurtPatchCallerObject = null; public EnemyPrefabStore PrefabStore { get { return _PrefabStore; } private set { _PrefabStore = value; } } public EnemyRadiance Radiance { get { return _Radiance; } private set { _Radiance = value; } } public EnemyRoot EnemyRootMono => _enemyRootMono; public bool HasDoneSetup => _hasDoneSetup; public bool UniquelySolo { get; private set; } = false; public bool IsEnemyCompInitializer => _isEnemyCompInitializer; public bool EidStarted { get; internal set; } = false; [SerializeField] public float InitialHealth { get; private set; } = -1f; [SerializeField] public float HighestHealth { get; private set; } = -1f; public float Health { get { if ((Object)(object)Enemy != (Object)null) { return Enemy.health; } return Eid.health; } set { if ((Object)(object)Enemy != (Object)null) { Enemy.health = value; } else { Eid.health = value; } } } public GameObject RootGameObject => ((int)Eid.enemyType == 4) ? ((Component)((Component)this).transform.parent).gameObject : ((Component)this).gameObject; public bool InstaKilled { get; private set; } = false; public IReadOnlyList<Collider> Colliders => _colliders; public event PreHurtEventHandler PreHurt; public event PostHurtEventHandler PostHurt; public static event PreAnyEnemyHurtEventHandler PreAnyEnemyHurt; public static event PostAnyEnemyHurtEventHandler PostAnyEnemyHurt; public event PreEnrageEventHandler PreEnrage = null; public event PostEnrageEventHandler PostEnrage = null; public event PreUnEnrageEventHandler PreUnEnrage = null; public event PostUnEnrageEventHandler PostUnEnrage = null; public event PreDeathEventHandler PreDeath; public event PostDeathEventHandler PostDeath; public T GetMonoByIndex<T>(int idx) where T : MonoBehaviour { if (idx < 0) { throw new IndexOutOfRangeException($"Index {idx} was less than 0"); } if (idx > _monoBehaviours.Count) { return default(T); } MonoBehaviour obj = _monoBehaviours[idx]; return (T)(object)((obj is T) ? obj : null); } public void MarkAsUniquelySolo() { UniquelySolo = true; } public void InstaDestroy() { Object.Destroy((Object)(object)RootGameObject); } private void Awake() { Log.TraceExpectedInfo($"EnemyComponents '{((Object)this).name}:{((Object)((Component)this).gameObject).GetInstanceID()}' awakens..."); Setup(); EnemyRootMono.Enemy = this; } internal void Setup() { if (!HasDoneSetup) { Log.TraceExpectedInfo($"EnemyComponents '{((Object)this).name}:{((Object)((Component)this).gameObject).GetInstanceID()}' is setting up..."); Eid = ((Component)this).GetComponent<EnemyIdentifier>(); Enemy = ((Component)this).GetComponent<Enemy>(); Assert.IsNotNull((Object)(object)Eid); _isEnemyCompInitializer = true; _hasDoneSetup = true; _enemyRootMono = GameObjectExtensions.GetOrAddComponent<EnemyRoot>(RootGameObject); CreateMods(); Eid.ForceGetHealth(); InitialHealth = Health; UpdateHighestHealth(); _colliders = ((Component)this).GetComponentsInChildren<Collider>(true); PrefabStore?.StorePrefab(); } } private void UpdateHighestHealth() { if (Health > HighestHealth) { HighestHealth = Health; } } private void Start() { Log.TraceExpectedInfo($"enemy '{((Object)this).name}:{((Object)((Component)this).gameObject).GetInstanceID()}' starts..."); if (_isEnemyCompInitializer) { _colliders = ((Component)this).GetComponentsInChildren<Collider>(); } if (InitialHealth <= 0f) { Eid.ForceGetHealth(); InitialHealth = Health; } PrefabStore?.StorePrefab(); UpdateHighestHealth(); } private void OnDestroy() { Log.TraceExpectedInfo($"enemy '{((Object)this).name}:{((Object)((Component)this).gameObject).GetInstanceID()}' gets instantaneously obliterated (destroyed)..."); } protected void Update() { if (QueuedForDestruction) { Log.TraceExpectedInfo($"enemy '{((Object)this).name}:{((Object)((Component)this).gameObject).GetInstanceID()}' was queued for destruction, so its time has come."); Object.Destroy((Object)(object)RootGameObject); } if (InTheProcessOfHurting) { InTheProcessOfHurting = false; Log.UnexpectedInfo(((Object)this).name + ": InTheProcessOfHurting had to be set to false by Update"); } } protected void FixedUpdate() { UpdateHighestHealth(); } private void OnDisable() { Log.TraceExpectedInfo($"enemy '{((Object)this).name}:{((Object)((Component)this).gameObject).GetInstanceID()}' gets disabled..."); if (QueuedForDestruction) { Log.TraceExpectedInfo($"enemy '{((Object)this).name}:{((Object)((Component)this).gameObject).GetInstanceID()}' was queued for destruction, so its time has come."); Object.Destroy((Object)(object)RootGameObject); } } private void OnEnable() { Log.TraceExpectedInfo($"enemy '{((Object)this).name}:{((Object)((Component)this).gameObject).GetInstanceID()}' gets enabled..."); } private void CreateMods() { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown Log.TraceExpectedInfo(((Object)this).name + ".EnemyAdditions is creating new modules..."); _monoBehaviours = new List<MonoBehaviour>(MonoRegistrar.RegisteredTypes.Count); foreach (Type registeredType in MonoRegistrar.RegisteredTypes) { _monoBehaviours.Add((MonoBehaviour)((Component)this).gameObject.AddComponent(registeredType)); } if (!Options.DontCreateEnemyRadianceComp.Value) { Radiance = GameObjectExtensions.GetOrAddComponent<EnemyRadiance>(((Component)this).gameObject); } if (!Options.DontCreateEnemyPrefabComp.Value) { PrefabStore = ((Component)this).gameObject.AddComponent<EnemyPrefabStore>(); } } internal void TryCallPreDeath(EventMethodCanceler canceler, bool instakill, object patchCallerObject) { if (!PreDeathCalled) { DeathPatchCallerObject = patchCallerObject; PreDeathCalled = true; InstaKilled = instakill; this.PreDeath?.Invoke(canceler, InstaKilled); EnemyEvents.PreDeath?.Invoke(this, InstaKilled); } } internal void TryCallPostDeath(EventMethodCancelInfo cancelInfo, object patchCallerObject) { if (!PostDeathCalled && DeathPatchCallerObject == patchCallerObject) { PostDeathCalled = true; this.PostDeath?.Invoke(cancelInfo, InstaKilled); EnemyEvents.PostDeath?.Invoke(this, InstaKilled); } } internal void TryCallDeath() { if (!DeathCalled) { DeathCalled = true; EnemyEvents.Death?.Invoke(this); } } internal void NotifyOfPreHurt(EventMethodCanceler canceler, GameObject target, Vector3 force, Vector3? hitPoint, float multiplier, float critMultiplier, GameObject sourceWeapon, bool tryForExplode, bool ignoreTotalDamageTakenMultiplier, bool fromExplosion, object hurtPatchCallerObject) { //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Unknown result type (might be due to invalid IL or missing references) if (InTheProcessOfHurting) { if (HurtPatchCallerObject == hurtPatchCallerObject) { Log.TraceExpectedInfo(((Object)this).name + ": had NotifyOfPreHurt called by the same hurtPatchCallerObject when we were in the process of hurting already? ignoring"); } else { Log.TraceExpectedInfo(((Object)this).name + ": had NotifyOfPreHurt called by differing hurtPatchCallerObject when we were in the process of hurting already, ignoring"); } } else { this.PreHurt?.Invoke(canceler, target, force, hitPoint, multiplier, tryForExplode, critMultiplier, sourceWeapon, ignoreTotalDamageTakenMultiplier, fromExplosion); EnemyComponents.PreAnyEnemyHurt?.Invoke(canceler, this, target, force, hitPoint, multiplier, tryForExplode, critMultiplier, sourceWeapon, ignoreTotalDamageTakenMultiplier, fromExplosion); HurtPatchCallerObject = hurtPatchCallerObject; InTheProcessOfHurting = true; } } internal void NotifyOfPostHurt(EventMethodCancelInfo cancellationInfo, GameObject target, Vector3 force, Vector3? hitPoint, float multiplier, float critMultiplier, GameObject sourceWeapon, bool tryForExplode, bool ignoreTotalDamageTakenMultiplier, bool fromExplosion, object hurtPatchCallerObject) { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) if (!InTheProcessOfHurting) { Log.TraceExpectedInfo(((Object)this).name + ": had NotifyOfPostHurt called when we were NOT in the process of hurting already, ignoring"); return; } if (HurtPatchCallerObject != hurtPatchCallerObject) { Log.TraceExpectedInfo(((Object)this).name + ": had NotifyOfPostHurt called when we were in the process of hurting already BUT the hurtPatchCallerObject did not match, ignoring"); return; } this.PostHurt?.Invoke(cancellationInfo, target, force, hitPoint, multiplier, tryForExplode, critMultiplier, sourceWeapon, ignoreTotalDamageTakenMultiplier, fromExplosion); EnemyComponents.PostAnyEnemyHurt?.Invoke(cancellationInfo, this, target, force, hitPoint, multiplier, tryForExplode, critMultiplier, sourceWeapon, ignoreTotalDamageTakenMultiplier, fromExplosion); HurtPatchCallerObject = null; InTheProcessOfHurting = false; } internal bool CallPreEnrage(EventMethodCancellationTracker cancellationTracker) { cancellationTracker.Reset(); this.PreEnrage?.Invoke(cancellationTracker.GetCanceler()); cancellationTracker.TryInvokeReimplementation(); return cancellationTracker.ShouldRunMethod; } internal void CallPostEnrage(EventMethodCancellationTracker cancellationTracker) { this.PostEnrage?.Invoke(cancellationTracker.GetCancelInfo()); } internal bool CallPreUnEnrage(EventMethodCancellationTracker cancellationTracker) { cancellationTracker.Reset(); this.PreUnEnrage?.Invoke(cancellationTracker.GetCanceler()); cancellationTracker.TryInvokeReimplementation(); return cancellationTracker.ShouldRunMethod; } internal void CallPostUnEnrage(EventMethodCancellationTracker cancellationTracker) { this.PostUnEnrage?.Invoke(cancellationTracker.GetCancelInfo()); } static EnemyComponents() { EnemyComponents.PreAnyEnemyHurt = null; EnemyComponents.PostAnyEnemyHurt = null; } } public class EnemyRoot : MonoBehaviour { public EnemyComponents Enemy { get; internal set; } = null; protected void Awake() { } } public static class GamePrefs { [HarmonyPatch(typeof(PrefsManager), "Awake", new Type[] { })] private static class PrefsManagerAwakePatch { public static void Prefix(PrefsManager __instance) { } public static void Postfix(PrefsManager __instance) { _manager = __instance; } } private static PrefsManager _manager; public static PrefsManager Manager { get { if ((Object)(object)_manager == (Object)null && (Object)(object)MonoSingleton<PrefsManager>.Instance != (Object)null) { Log.ExpectedInfo("Had to get PrefsManager via PrefsManager.Instance (then cached the value)"); _manager = MonoSingleton<PrefsManager>.Instance; } return _manager; } } } public static class LevelQuickLoader { private enum LevelQuickLoadState { Needed, AwaitingLoad, WaitingToReturn, Returning, Done } private static Dictionary<string, LevelQuickLoadState> _quickLoadStates = new Dictionary<string, LevelQuickLoadState>(); private static bool _quickLoading = false; private static bool _currentLevelIsFromQuickLoad = false; private static string _quickLoadLevel = null; private static string _preQuickLoadLevel = null; public static void AddQuickLoadLevel(string levelName) { _quickLoadStates.TryAdd(levelName, LevelQuickLoadState.Needed); } internal static void Initialize() { if (Options.DisableQuickLoad.Value) { _quickLoadStates.Clear(); Log.Message("Clearing _quickLoadStates due to DisableQuickLoad being true..."); } UpdateEvents.OnUpdate += Update; } private static bool TryFindQuickLoadLevel() { if (SceneHelper.PendingScene == null && !_quickLoading) { _quickLoadLevel = null; foreach (KeyValuePair<string, LevelQuickLoadState> quickLoadState in _quickLoadStates) { if (quickLoadState.Value == LevelQuickLoadState.Needed) { _quickLoadLevel = quickLoadState.Key; break; } } if (_quickLoadLevel != null) { if (!_currentLevelIsFromQuickLoad) { _preQuickLoadLevel = SceneHelper.CurrentScene; } Log.TraceExpectedInfo("Quickloading " + _quickLoadLevel); SceneHelper.LoadScene(_quickLoadLevel, false); _currentLevelIsFromQuickLoad = true; _quickLoadStates[_quickLoadLevel] = LevelQuickLoadState.AwaitingLoad; _quickLoading = true; return true; } } return false; } private static void Update() { TryFindQuickLoadLevel(); if (!(SceneHelper.CurrentScene == _quickLoadLevel) || SceneHelper.PendingScene != null) { return; } if (_quickLoadStates[_quickLoadLevel] == LevelQuickLoadState.AwaitingLoad) { _quickLoadStates[_quickLoadLevel] = LevelQuickLoadState.WaitingToReturn; } else if (_quickLoadStates[_quickLoadLevel] == LevelQuickLoadState.WaitingToReturn) { Log.TraceExpectedInfo(_quickLoadLevel + " quick load done!"); _quickLoadStates[_quickLoadLevel] = LevelQuickLoadState.Done; _quickLoadLevel = null; _quickLoading = false; if (!TryFindQuickLoadLevel()) { SceneHelper.LoadScene(_preQuickLoadLevel, false); _preQuickLoadLevel = null; _currentLevelIsFromQuickLoad = false; } } } } public class ToggleCheat : ICheat { public Action<ToggleCheat> OnDisable = null; public Action<ToggleCheat, CheatsManager> OnEnable = null; private static Dictionary<string, bool> ToggleCheatStateStore = new Dictionary<string, bool>(); public string LongName { get; private set; } = "Unnamed ToggleCheat"; public string Identifier { get; private set; } = "ukaiw.unnamed-toggle-cheat"; public string ButtonEnabledOverride { get; set; } = null; public string ButtonDisabledOverride { get; set; } = null; public string Icon => null; public bool DefaultState { get; private set; } = false; public StatePersistenceMode PersistenceMode => (StatePersistenceMode)1; public bool IsActive => ToggleCheatStateStore.GetValueOrDefault(Identifier, defaultValue: false); public ToggleCheat(string longName, string identifier, Action<ToggleCheat> onDisable, Action<ToggleCheat, CheatsManager> onEnable) { LongName = longName; Identifier = identifier; DefaultState = ToggleCheatStateStore.GetValueOrDefault(Identifier, defaultValue: false); OnDisable = onDisable; OnEnable = onEnable; } public void Disable() { ToggleCheatStateStore[Identifier] = false; OnDisable?.Invoke(this); } public void Enable(CheatsManager manager) { ToggleCheatStateStore[Identifier] = true; OnEnable?.Invoke(this, manager); } } namespace NyxpiriOS { public class Shaker2D { public float _MinScale = 0f; public float _MaxScale = 1f; private float _MinDistance = 1f; public float _Rate = 50f; public float MinScale { get { return _MinScale; } set { _MinScale = value; } } public float MaxScale { get { return _MaxScale; } set { _MaxScale = value; } } public float MinDistance { get { return _MinDistance; } set { _MinDistance = value; } } public float Rate { get { return _Rate; } set { _Rate = Mathf.Max(0f, value); } } public Vector2 PositionA { get; private set; } = Vector2.zero; public Vector2 PositionB { get; private set; } = Vector2.zero; public float Alpha { get; private set; } = 0f; public Vector2 Position { get { //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //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: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Unknown result type (might be due to invalid IL or missing references) float alpha = Alpha; alpha = Mathf.Sin((alpha + 0.5f) * MathF.PI); alpha = ((!(Alpha < 0.5f)) ? (0.5f + Mathf.Abs(alpha) * 0.5f) : ((1f - alpha) * 0.5f)); return Vector2.op_Implicit(Vector3.Lerp(Vector2.op_Implicit(PositionA), Vector2.op_Implicit(PositionB), alpha)); } } public void NextPosition() { //IL_0003: 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_011e: 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_0016: 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_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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_0031: 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_003b: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0087: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: 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_00c2: 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_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) PositionA = PositionB; for (int i = 0; (i < 10 && Vector3.Distance(Vector2.op_Implicit(PositionB), Vector2.op_Implicit(PositionA)) < MinDistance) || i < 1; i++) { Vector2 val = Random.insideUnitCircle; Vector2 normalized = ((Vector2)(ref val)).normalized; normalized = ((normalized == Vector2.zero) ? Vector2.right : normalized); PositionB = normalized * Random.Range(MinScale, MaxScale); if (!(Vector2.Distance(PositionB, PositionA) < MinDistance)) { continue; } Vector2 positionB = PositionB; val = PositionB - PositionA; PositionB = positionB + ((Vector2)(ref val)).normalized * (MinDistance - Vector2.Distance(PositionB, PositionA)); val = PositionB; if (!(((Vector2)(ref val)).magnitude > MaxScale)) { val = PositionB; if (!(((Vector2)(ref val)).magnitude < MinScale)) { break; } } PositionB = Vector2.zero; } } public void Process(float delta) { Alpha += delta * Rate; if (Alpha > 1f) { Alpha %= 1f; NextPosition(); } } } } namespace Nyxpiri { public class ObjPool<T> where T : class, new() { public Func<T> ConstructObject = null; public Action<T> PrepareObject = delegate { }; public Action<T> UnprepareObject = delegate { }; public Action<T> DestructObject = delegate { }; private Stack<int> _FreeList = new Stack<int>(); private T[] Array = new T[0]; public int Size => Array.Length; public int NumFree => _FreeList.Count; public int NumTaken => Array.Length - _FreeList.Count; public ObjPool(Func<T> constructObject, Action<T> destructObject) { Assert.IsNotNull((object)constructObject, ""); DestructObject = destructObject; ConstructObject = constructObject; } public void Clear() { T[] array = Array; foreach (T obj in array) { DestructObject(obj); } Array = new T[0]; _FreeList.Clear(); } public void EnsureSize(int size) { if (Array.Length < size) { T[] array = Array; Array = new T[size]; for (int i = 0; i < array.Length; i++) { Array[i] = array[i]; } for (int j = array.Length; j < Array.Length; j++) { Array[j] = ConstructObject(); _FreeList.Push(j); Assert.IsNotNull((object)Array[j], ""); } } } public (T, int) TakeUnsafe() { if (_FreeList.Count == 0) { EnsureSize(Size * 2); } int num = _FreeList.Pop(); T val = Array[num]; PrepareObject?.Invoke(val); return (val, num); } public PoolObject<T> Take() { return new PoolObject<T>(this, TakeUnsafe()); } public void Return((T, int) element) { UnprepareObject?.Invoke(element.Item1); _FreeList.Push(element.Item2); } public void Return(PoolObject<T> obj) { obj.Dispose(); } ~ObjPool() { Clear(); } } public class PoolObject<T> : IDisposable where T : class, new() { private ObjPool<T> Pool; private (T, int) Element; public T Obj => Element.Item1; public T Value => Obj; public bool IsValid => Pool != null; internal PoolObject(ObjPool<T> pool, (T, int) element) { Pool = pool; Element = element; } public void Dispose() { if (IsValid) { Pool.Return(Element); Element = (null, -1); Pool = null; } } ~PoolObject() { Dispose(); } } public class RegistrationTracker { private bool _Registered = false; public Func<bool> RegisterAction { private get; set; } = null; public Func<bool> UnregisterAction { private get; set; } = null; public bool Registered { get { return _Registered; } private set { _Registered = value; } } public RegistrationTracker(Func<bool> registerAction, Func<bool> unregisterAction) { RegisterAction = registerAction; UnregisterAction = unregisterAction; } public void Register() { if (!Registered && (RegisterAction?.Invoke()).GetValueOrDefault(false)) { _Registered = true; } } public void Unregister() { if (Registered && (UnregisterAction?.Invoke()).GetValueOrDefault(false)) { _Registered = false; } } } } namespace Nyxpiri.Unity.Collections { public static class CollectionSorting { public static void Shuffle<T>(this IList<T> list) { for (int i = 0; i < list.Count; i++) { int index = Random.Range(0, list.Count - 1); T item = list[i]; list.RemoveAt(i); list.Insert(index, item); } } } } namespace Nyxpiri.Collections.Generic { public class ReserveList<T> : IReadOnlyCollection<T>, IEnumerable<T>, IEnumerable { private struct ReserveListElem { public T Obj; public bool Free; public ReserveListElem(T obj, bool free) { Obj = obj; Free = free; } } private List<ReserveListElem> _List; private Stack<int> _FreeList; public int Count { get; private set; } = 0; public int SoftCapacity => _List.Count; public int Capacity => _List.Capacity; public T this[int index] { get { if (_List[index].Free) { throw new IndexOutOfRangeException("Attempt to access an index that was in the _FreeList"); } return _List[index].Obj; } set { if (_List[index].Free) { throw new IndexOutOfRangeException("Attempt to access an index that was in the _FreeList"); } ReserveListElem value2 = _List[index]; value2.Obj = value; _List[index] = value2; } } ~ReserveList() { } public ReserveList() { _List = new List<ReserveListElem>(); _FreeList = new Stack<int>(); } public ReserveList(int capacity) { _List = new List<ReserveListElem>(capacity); _FreeList = new Stack<int>(capacity); } public int Add(T elem) { Count++; int count; if (_FreeList.Count == 0) { count = _List.Count; _List.Add(new ReserveListElem(elem, free: false)); return count; } count = _FreeList.Pop(); _List[count] = new ReserveListElem(elem, free: false); return count; } public void RemoveAt(int idx) { if (_List[idx].Free) { throw new IndexOutOfRangeException("Attempt to free already freed index"); } Count--; _List[idx] = new ReserveListElem(default(T), free: true); _FreeList.Push(idx); } public bool IsIndexValid(int idx) { if (idx < 0) { return false; } if (_List.Count <= idx) { return false; } if (_List[idx].Free) { return false; } return true; } public IEnumerator<T> GetEnumerator() { foreach (ReserveListElem elem in _List) { if (!elem.Free) { yield return elem.Obj; } } } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } } namespace Nyxpiri.ULTRAKILL.NyxLib { public static class Assets { private static List<Func<bool>> _assetPickers = new List<Func<bool>>(64); public static GameObject LabelPrefab { get; private set; } = null; public static GameObject HarmlessExplosionPrefab { get; private set; } = null; public static GameObject ExplosionPrefab { get; private set; } = null; public static GameObject SuperExplosionPrefab { get; private set; } = null; public static GameObject RocketPrefab { get; private set; } = null; public static GameObject MortarPrefab { get; private set; } = null; public static GameObject HomingProjectilePrefab { get; private set; } = null; private static GameObject FleshPrisonPrefab { get; set; } = null; private static GameObject FleshPanopticonPrefab { get; set; } = null; public static void EnableExplosionsPicking() { LevelQuickLoader.AddQuickLoadLevel("uk_construct"); } public static void EnableProjectilePicking() { LevelQuickLoader.AddQuickLoadLevel("Endless"); } public static void AddAssetPicker<ObjectType>(Func<ObjectType, bool> pickerFunc) where ObjectType : Object { Func<bool> item = delegate { ObjectType val = Object.FindAnyObjectByType<ObjectType>((FindObjectsInactive)1); return !((Object)(object)val == (Object)null) && pickerFunc(val); }; _assetPickers.Add(item); } private static void OnSceneWasLoaded(Scene scene, string levelName, string unitySceneName) { for (int i = 0; i < _assetPickers.Count; i++) { Func<bool> func = _assetPickers[i]; try { if (func()) { _assetPickers.RemoveAt(i); i--; } } catch (Exception ex) { Log.Error($"Caught {ex.GetType()} whilst trying to execute an asset picker!\n{ex}\n"); } } if ((Object)(object)LabelPrefab == (Object)null) { HeatResistance val = Object.FindAnyObjectByType<HeatResistance>((FindObjectsInactive)1); if ((Object)(object)val != (Object)null) { TextMeshProUGUI val2 = null; TextMeshProUGUI[] componentsInChildren = ((Component)val).gameObject.GetComponentsInChildren<TextMeshProUGUI>(true); TextMeshProUGUI[] array = componentsInChildren; foreach (TextMeshProUGUI val3 in array) { if (((TMP_Text)val3).text.Contains("COMPROMISED")) { val2 = val3; break; } } Assert.IsNotNull((Object)(object)val2); LabelPrefab = Object.Instantiate<GameObject>(((Component)val2).gameObject); LabelPrefab.SetActive(false); Object.DontDestroyOnLoad((Object)(object)LabelPrefab); ((TMP_Text)LabelPrefab.GetComponent<TextMeshProUGUI>()).text = "UKAIW-Label!"; } } if ((Object)(object)RocketPrefab == (Object)null) { Grenade[] array2 = Object.FindObjectsByType<Grenade>((FindObjectsInactive)1, (FindObjectsSortMode)0); Grenade[] array3 = array2; foreach (Grenade val4 in array3) { if (val4.rocket) { RocketPrefab = Object.Instantiate<GameObject>(((Component)val4).gameObject); Object.DontDestroyOnLoad((Object)(object)RocketPrefab); RocketPrefab.SetActive(false); } if ((Object)(object)HarmlessExplosionPrefab == (Object)null && (Object)(object)val4.harmlessExplosion != (Object)null) { HarmlessExplosionPrefab = Object.Instantiate<GameObject>(val4.harmlessExplosion); Object.DontDestroyOnLoad((Object)(object)HarmlessExplosionPrefab); HarmlessExplosionPrefab.SetActive(false); GameObjectExtensions.GetOrAddComponent<ExplosionAdditions>(HarmlessExplosionPrefab); } if ((Object)(object)ExplosionPrefab == (Object)null && (Object)(object)val4.explosion != (Object)null) { ExplosionPrefab = Object.Instantiate<GameObject>(val4.explosion); Object.DontDestroyOnLoad((Object)(object)ExplosionPrefab); ExplosionPrefab.SetActive(false); GameObjectExtensions.GetOrAddComponent<ExplosionAdditions>(ExplosionPrefab); } if ((Object)(object)SuperExplosionPrefab == (Object)null && (Object)(object)val4.superExplosion != (Object)null) { SuperExplosionPrefab = Object.Instantiate<GameObject>(val4.superExplosion); Object.DontDestroyOnLoad((Object)(object)SuperExplosionPrefab); SuperExplosionPrefab.SetActive(false); GameObjectExtensions.GetOrAddComponent<ExplosionAdditions>(SuperExplosionPrefab); } if ((Object)(object)SuperExplosionPrefab != (Object)null && (Object)(object)ExplosionPrefab != (Object)null && (Object)(object)HarmlessExplosionPrefab != (Object)null && (Object)(object)RocketPrefab != (Object)null) { break; } } } if ((Object)(object)MortarPrefab == (Object)null) { Mass val5 = Object.FindAnyObjectByType<Mass>((FindObjectsInactive)1); if ((Object)(object)val5 != (Object)null) { MortarPrefab = Object.Instantiate<GameObject>(val5.explosiveProjectile); Object.DontDestroyOnLoad((Object)(object)MortarPrefab); MortarPrefab.SetActive(false); ExplosionPrefab = Object.Instantiate<GameObject>(MortarPrefab.GetComponent<Projectile>().explosionEffect); Object.DontDestroyOnLoad((Object)(object)ExplosionPrefab); ExplosionPrefab.SetActive(false); GameObjectExtensions.GetOrAddComponent<ExplosionAdditions>(ExplosionPrefab); HomingProjectilePrefab = Object.Instantiate<GameObject>(val5.homingProjectile); Object.DontDestroyOnLoad((Object)(object)HomingProjectilePrefab); HomingProjectilePrefab.SetActive(false); } else { Log.ExpectedInfo("We'd like a a hideous mass in order to yoink it's projectile prefabs, but this scene \"" + SceneHelper.CurrentScene + "\" didn't have it yet!"); } } if (!((Object)(object)FleshPrisonPrefab == (Object)null) && !((Object)(object)FleshPanopticonPrefab == (Object)null)) { return; } FleshPrison val6 = Object.FindAnyObjectByType<FleshPrison>((FindObjectsInactive)1); if ((Object)(object)val6 != (Object)null) { if (val6.altVersion) { FleshPanopticonPrefab = Object.Instantiate<GameObject>(((Component)val6).gameObject); Object.DontDestroyOnLoad((Object)(object)FleshPanopticonPrefab); } else { FleshPrisonPrefab = Object.Instantiate<GameObject>(((Component)val6).gameObject); Object.DontDestroyOnLoad((Object)(object)FleshPrisonPrefab); } } else { Log.ExpectedInfo("We'd like a flesh prison in order to yoink it as a prefab, but this scene \"" + SceneHelper.CurrentScene + "\" didn't have it yet!"); } } internal static void Initialize() { ScenesEvents.OnSceneWasLoaded += OnSceneWasLoaded; LevelQuickLoader.AddQuickLoadLevel("Level 0-E"); } } public static class Cheats { public delegate void ReadyForCheatRegistrationEventHandler(CheatsManager cheatsManager); [HarmonyPatch(typeof(CheatsManager), "Start", new Type[] { })] private static class CheatsManagerStartPatch { public static void Prefix(CheatsManager __instance) { _manager = __instance; } public static void Postfix(CheatsManager __instance) { } } [HarmonyPatch(typeof(TeleportCheat), "Teleport")] private static class TeleportCheatTeleportPatch { public static void Prefix(TeleportCheat __instance, Transform target) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (Enabled) { PlayerActivator val = Object.FindAnyObjectByType<PlayerActivator>(); if ((Object)(object)val != (Object)null) { ((Component)val).transform.position = target.position; } } } public static void Postfix(TeleportCheat __instance, Transform target) { } } [HarmonyPatch(typeof(HeatResistance), "Awake")] private static class APatch { public static void Prefix(HeatResistance __instance) { } public static void Postfix(HeatResistance __instance) { } } private static CheatsManager _manager; public const string RadiantAllEnemies = "nyxpiri.radiant-all-enemies"; public const string SandAllEnemies = "nyxpiri.sand-all-enemies"; public const string OverrideCybergrindStartingWave = "nyxpiri.override-cybergrind-starting-wave"; public const string DisableStops = "nyxpiri.disable-stops"; public const string DisableSlowdown = "nyxpiri.disable-slowdown"; public const string UltraStop = "nyxpiri.ultra-stop"; public const string ShortHitStop = "nyxpiri.short-hit-stop"; public const string PlayCleanMusicWithBattle = "nyxpiri.clean-music-with-battle"; public const string AlwaysBattleMusic = "nyxpiri.always-battle-music"; public const string LogEIDInfo = "nyxpiri.dev.log-eid-info"; private static bool WaitingForCheatRegistration; public static CheatsManager Manager { get { if ((Object)(object)_manager == (Object)null && (Object)(object)MonoSingleton<CheatsManager>.Instance != (Object)null) { Log.ExpectedInfo("Had to get CheatsManager via CheatsManager.Instance (then cached the value)"); _manager = MonoSingleton<CheatsManager>.Instance; } return _manager; } } public static bool Enabled => (MonoSingleton<CheatsController>.Instance?.cheatsEnabled).GetValueOrDefault(false); public static event ReadyForCheatRegistrationEventHandler ReadyForCheatRegistration; public static bool IsCheatEnabled(string cheatID) { if (!Enabled) { return false; } return Manager.GetCheatState(cheatID); } public static bool IsCheatDisabled(string cheatID) { return !IsCheatEnabled(cheatID); } public static void Initialize() { ScenesEvents.OnSceneWasLoaded += OnSceneWasLoaded; UpdateEvents.OnUpdate += LateUpdate; } private static void LateUpdate() { if (WaitingForCheatRegistration && !((Object)(object)Manager == (Object)null)) { if (Manager.GetCheatState("nyxpiri.radiant-all-enemies")) { OptionsManager.forceRadiance = true; } if (Manager.GetCheatState("nyxpiri.sand-all-enemies")) { OptionsManager.forceSand = true; } RegisterCheats(); WaitingForCheatRegistration = false; } } private static void OnSceneWasLoaded(Scene scene, string levelName, string unitySceneName) { if (!((Object)(object)Manager == (Object)null)) { WaitingForCheatRegistration = true; } } private static void RegisterCheats() { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown if (Options.RegisterHideCheatsStatusCheat.Value) { Manager.RegisterCheat((ICheat)new HideCheatsStatus(), "meta"); } if (Options.RegisterForceNextWaveCheat.Value) { Manager.RegisterCheat((ICheat)(object)new ToggleCheat("Force Next Wave", "nyxpiri.force-next-cybergrind-wave", delegate { }, delegate { Manager.DisableCheat("nyxpiri.force-next-cybergrind-wave"); if (Cybergrind.IsActive && Cybergrind.IsInCybergrindLevel) { ((Component)Cybergrind.EndlessGrid).GetComponent<ActivateNextWave>().deadEnemies = 99999; } }), "CYBERGRIND"); } if (Options.RegisterOverrideCybergrindStartingWaveCheat.Value) { Manager.RegisterCheat((ICheat)(object)new ToggleCheat("Override Starting Wave", "nyxpiri.override-cybergrind-starting-wave", delegate { }, delegate { }), "CYBERGRIND"); } Manager.RegisterCheat((ICheat)(object)new ToggleCheat("Radiant All Enemies", "nyxpiri.radiant-all-enemies", delegate { }, delegate { }), "SELF SABOTAGE"); if (Options.RegisterSandAllEnemiesCheat.Value) { Manager.RegisterCheat((ICheat)(object)new ToggleCheat("Sand All Enemies", "nyxpiri.sand-all-enemies", delegate { OptionsManager.forceSand = false; }, delegate { OptionsManager.forceSand = true; }), "SELF SABOTAGE"); } Cheats.ReadyForCheatRegistration?.Invoke(Manager); Manager.RebuildMenu(); } } [HarmonyPatch(typeof(CheckPoint), "ActivateCheckPoint", new Type[] { })] internal static class CheckpointGetPatch { public static void Prefix(CheckPoint __instance) { } public static void Postfix(CheckPoint __instance) { } } public static class Cybergrind { public delegate void CybergrindPreBeginEventHandler(EventMethodCanceler canceler, EndlessGrid endlessGrid); public delegate void CybergrindPostBeginEventHandler(EventMethodCancelInfo cancelInfo, EndlessGrid endlessGrid); public delegate void CybergrindPreNextWaveEventHandler(EventMethodCanceler canceler, EndlessGrid endlessGrid); public delegate void CybergrindPostNextWaveEventHandler(EventMethodCancelInfo cancelInfo, EndlessGrid endlessGrid); [HarmonyPatch(typeof(EndlessGrid), "OnTriggerEnter", new Type[] { typeof(Collider) })] private static class CybergrindStartPatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(EndlessGrid __instance, Collider other) { if (!((Component)other).CompareTag("Player")) { return true; } _cancellationTracker.Reset(); Cybergrind.PreCybergrindBegin?.Invoke(_cancellationTracker.GetCanceler(), __instance); _cancellationTracker.TryInvokeReimplementation(); return !_cancellationTracker.Cancelled; } public static void Postfix(EndlessGrid __instance, Collider other) { if (((Component)other).CompareTag("Player")) { Cybergrind.PostCybergrindBegin?.Invoke(_cancellationTracker.GetCancelInfo(), __instance); IsActive = true; } } } [HarmonyPatch(typeof(EndlessGrid), "Start")] private static class EndlessGridStartPatch { public static void Prefix(EndlessGrid __instance) { } public static void Postfix(EndlessGrid __instance) { EndlessGrid = __instance; } } [HarmonyPatch(typeof(EndlessGrid), "NextWave", null)] private static class EndlessGridNextWavePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(EndlessGrid __instance) { _cancellationTracker.Reset(); Cybergrind.PreCybergrindNextWave?.Invoke(_cancellationTracker.GetCanceler(), __instance); _cancellationTracker.TryInvokeReimplementation(); return !_cancellationTracker.Cancelled; } public static void Postfix(EndlessGrid __instance) { Cybergrind.PostCybergrindNextWave?.Invoke(_cancellationTracker.GetCancelInfo(), __instance); } } private static EndlessGrid _endlessGrid; public static EndlessGrid EndlessGrid { get { if ((Object)(object)_endlessGrid != (Object)null) { return _endlessGrid; } _endlessGrid = MonoSingleton<EndlessGrid>.Instance; return _endlessGrid; } set { _endlessGrid = value; } } public static bool IsActive { get; private set; } public static bool IsInCybergrindLevel => (Object)(object)EndlessGrid != (Object)null; public static event CybergrindPreBeginEventHandler PreCybergrindBegin; public static event CybergrindPostBeginEventHandler PostCybergrindBegin; public static event CybergrindPreNextWaveEventHandler PreCybergrindNextWave; public static event CybergrindPostNextWaveEventHandler PostCybergrindNextWave; public static void Initialize() { UpdateEvents.OnFixedUpdate += OnFixedUpdate; ScenesEvents.OnSceneWasLoaded += OnSceneWasLoaded; ScenesEvents.OnSceneWasUnloaded += OnSceneWasUnloaded; PreCybergrindBegin += PreBegin; } private static void PreBegin(EventMethodCanceler canceler, EndlessGrid endlessGrid) { if (Cheats.Enabled && Cheats.IsCheatEnabled("nyxpiri.override-cybergrind-starting-wave")) { endlessGrid.startWave = Options.CybergrindStartingWaveOverride.Value; } } private static void OnSceneWasUnloaded(Scene scene, string levelName, string unitySceneName) { IsActive = false; } private static void OnSceneWasLoaded(Scene scene, string levelName, string unitySceneName) { IsActive = false; } private static void OnFixedUpdate() { } } public static class Assert { public static void IsTrue(bool condition, string additionalMsg = "") { //IL_0020: Unknown result type (might be due to invalid IL or missing references) if (!condition) { throw new AssertionException("Assertion Failed: Condition was false :c; " + additionalMsg, "Assertion Failed: Condition was false :c; " + additionalMsg); } } public static void IsFalse(bool condition, string additionalMsg = "") { //IL_001d: Unknown result type (might be due to invalid IL or missing references) if (condition) { throw new AssertionException("Assertion Failed: Condition was false :c; " + additionalMsg, "Assertion Failed: Condition was false :c; " + additionalMsg); } } public static void IsNotNull(object obj, string additionalMsg = "") { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) if (obj == null) { if (obj == null) { throw new AssertionException("Assertion Failed: Object was null :c; " + additionalMsg, "Assertion Failed: Object was null :c; " + additionalMsg); } throw new AssertionException("Assertion Failed: Object equals null but *'is' not* null :c; " + additionalMsg, "Assertion Failed: Object was null :c; " + additionalMsg); } } public static void IsNull(object obj, string additionalMsg = "") { //IL_0020: Unknown result type (might be due to invalid IL or missing references) if (obj != null) { throw new AssertionException("Assertion Failed: Object is not null :c; " + additionalMsg, "Assertion Failed: Object is not null :c; " + additionalMsg); } } public static void IsNotNull(Object obj, string additionalMsg = "") { //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) if (obj == (Object)null) { if (obj == null) { throw new AssertionException("Assertion Failed: Object was null :c; " + additionalMsg, "Assertion Failed: Object was null :c; " + additionalMsg); } throw new AssertionException("Assertion Failed: Object equals null but *'is' not* null :c; " + additionalMsg, "Assertion Failed: Object was null :c; " + additionalMsg); } } } public static class TryLog { public static void Action(Action action) { try { action(); } catch (Exception arg) { Log.Error($"Exception caught! :c\n{arg}"); throw; } } } [HarmonyPatch(typeof(ActivateNextWave), "AddDeadEnemy")] internal static class CybergrindStartPatch { public static void Prefix() { } public static void Postfix() { } } public enum EnemyGameplayRank { Normal, Miniboss, Boss, Ultraboss } public enum EnemySpeciesType { Husk, Machine, Demon, Angel, Soul, OrganicMachine, Puppet, Unknown, UltraUnknown } public enum EnemySpeciesRank { NotApplicable, Lesser, Greater, Supreme, Prime } public static class EnemyUtils { public static int NumGameplayRanks = 4; public static bool IsEnraged(this EnemyIdentifier eid) { if (eid.Dead) { return false; } IEnrage component = ((Component)eid).GetComponent<IEnrage>(); return ((component != null) ? new bool?(component.isEnraged) : null).GetValueOrDefault(false); } public static bool TryEnrage(this EnemyIdentifier eid) { //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Expected I4, but got Unknown //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Invalid comparison between Unknown and I4 if (eid.Dead) { return false; } IEnrage component = ((Component)eid).GetComponent<IEnrage>(); if (((component != null) ? new bool?(component.isEnraged) : null).GetValueOrDefault(false)) { return false; } if (component != null) { component.Enrage(); return true; } EnemyType enemyType = eid.enemyType; EnemyType val = enemyType; switch ((int)val) { default: if ((int)val != 33) { break; } if (!eid.dead) { Gutterman component4 = ((Component)eid).GetComponent<Gutterman>(); if (component4 != null) { component4.Enrage(); } return true; } return false; case 7: { SwordsMachine component10 = ((Component)eid).GetComponent<SwordsMachine>(); if (component10 != null) { component10.Enrage(); } return true; } case 0: { StatueBoss component7 = ((Component)eid).GetComponent<StatueBoss>(); if (component7 != null) { component7.Enrage(); } return true; } case 1: case 9: { Drone component3 = ((Component)eid).GetComponent<Drone>(); if (component3 != null) { component3.Enrage(); } return true; } case 8: { V2 component8 = ((Component)eid).GetComponent<V2>(); if (component8 != null) { component8.Enrage(); } return true; } case 5: { Mindflayer component9 = ((Component)eid).GetComponent<Mindflayer>(); if (component9 != null) { component9.Enrage(); } return true; } case 2: { Mass component5 = ((Component)eid).GetComponent<Mass>(); if (!((component5 == null) ? null : ((Component)component5).GetComponentInChildren<EnemySimplifier>()?.enraged).GetValueOrDefault(true)) { Mass component6 = ((Component)eid).GetComponent<Mass>(); if (component6 != null) { component6.Enrage(); } return true; } return false; } case 4: { SpiderBody component2 = ((Component)eid).GetComponent<SpiderBody>(); if (component2 != null) { component2.Enrage(); } return true; } case 3: case 6: break; } return false; } public static bool TryUnenrage(this EnemyIdentifier eid) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: 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_001c: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected I4, but got Unknown //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Invalid comparison between Unknown and I4 if (eid.Dead) { return false; } EnemyType enemyType = eid.enemyType; EnemyType val = enemyType; switch ((int)val) { default: if ((int)val != 33) { break; } if (!eid.dead) { Gutterman component2 = ((Component)eid).GetComponent<Gutterman>(); if (component2 != null) { component2.UnEnrage(); } return true; } return false; case 7: { SwordsMachine component5 = ((Component)eid).GetComponent<SwordsMachine>(); if (component5 != null) { component5.UnEnrage(); } return true; } case 0: { StatueBoss component3 = ((Component)eid).GetComponent<StatueBoss>(); if (component3 != null) { component3.UnEnrage(); } return true; } case 1: case 9: { Drone component6 = ((Component)eid).GetComponent<Drone>(); if (component6 != null) { component6.UnEnrage(); } return true; } case 8: { V2 component7 = ((Component)eid).GetComponent<V2>(); if (component7 != null) { component7.UnEnrage(); } return true; } case 5: { Mindflayer component4 = ((Component)eid).GetComponent<Mindflayer>(); if (component4 != null) { component4.UnEnrage(); } return true; } case 4: { SpiderBody component = ((Component)eid).GetComponent<SpiderBody>(); if (component != null) { component.UnEnrage(); } return true; } case 2: case 3: case 6: break; } return false; } public static void ApplyDamage(this EnemyIdentifier eid, Vector3 force, Vector3 hitPoint, float multiplier, float critMultiplier, GameObject sourceWeapon, bool fromExplosion) { //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) eid.DeliverDamage(((Component)eid).gameObject, force, hitPoint, multiplier, false, critMultiplier, sourceWeapon, false, fromExplosion); } public static EnemyGameplayRank GetEnemyGameplayRank(this EnemyIdentifier eid) { //IL_0002: 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_000c: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected I4, but got Unknown EnemyType enemyType = eid.enemyType; if (1 == 0) { } EnemyGameplayRank result = (int)enemyType switch { 37 => EnemyGameplayRank.Ultraboss, 23 => EnemyGameplayRank.Normal, 35 => EnemyGameplayRank.Boss, 0 => eid.isBoss ? EnemyGameplayRank.Boss : EnemyGameplayRank.Normal, 1 => EnemyGameplayRank.Normal, 26 => EnemyGameplayRank.Miniboss, 3 => EnemyGameplayRank.Normal, 30 => EnemyGameplayRank.Ultraboss, 17 => EnemyGameplayRank.Ultraboss, 16 => EnemyGameplayRank.Boss, 28 => EnemyGameplayRank.Boss, 33 => EnemyGameplayRank.Normal, 34 => EnemyGameplayRank.Normal, 2 => (!eid.isBoss) ? EnemyGameplayRank.Miniboss : EnemyGameplayRank.Boss, 21 => EnemyGameplayRank.Normal, 27 => EnemyGameplayRank.Boss, 4 => eid.isBoss ? EnemyGameplayRank.Boss : EnemyGameplayRank.Normal, 25 => EnemyGameplayRank.Ultraboss, 31 => EnemyGameplayRank.Normal, 5 => (!eid.isBoss) ? EnemyGameplayRank.Miniboss : EnemyGameplayRank.Boss, 11 => EnemyGameplayRank.Ultraboss, 18 => EnemyGameplayRank.Ultraboss, 32 => EnemyGameplayRank.Boss, 36 => EnemyGameplayRank.Normal, 14 => EnemyGameplayRank.Normal, 19 => EnemyGameplayRank.Miniboss, 29 => EnemyGameplayRank.Ultraboss, 15 => EnemyGameplayRank.Normal, 12 => EnemyGameplayRank.Normal, 13 => EnemyGameplayRank.Normal, 6 => EnemyGameplayRank.Normal, 7 => (!eid.isBoss) ? EnemyGameplayRank.Miniboss : EnemyGameplayRank.Boss, 20 => EnemyGameplayRank.Normal, 8 => EnemyGameplayRank.Boss, 22 => EnemyGameplayRank.Boss, 24 => EnemyGameplayRank.Boss, 9 => EnemyGameplayRank.Normal, 10 => EnemyGameplayRank.Ultraboss, 38 => EnemyGameplayRank.Normal, 40 => EnemyGameplayRank.Normal, 41 => EnemyGameplayRank.Miniboss, 42 => EnemyGameplayRank.Boss, 39 => EnemyGameplayRank.Normal, _ => throw new NotImplementedException(), }; if (1 == 0) { } return result; } public static EnemySpeciesType GetSpeciesType(this EnemyType enemyType) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected I4, but got Unknown if (1 == 0) { } EnemySpeciesType result = (int)enemyType switch { 3 => EnemySpeciesType.Husk, 37 => EnemySpeciesType.UltraUnknown, 23 => EnemySpeciesType.UltraUnknown, 35 => EnemySpeciesType.Machine, 0 => EnemySpeciesType.Demon, 1 => EnemySpeciesType.Machine, 26 => EnemySpeciesType.Husk, 30 => EnemySpeciesType.OrganicMachine, 17 => EnemySpeciesType.OrganicMachine, 16 => EnemySpeciesType.Angel, 28 => EnemySpeciesType.Angel, 33 => EnemySpeciesType.Machine, 34 => EnemySpeciesType.Machine, 2 => EnemySpeciesType.Demon, 21 => EnemySpeciesType.Demon, 27 => EnemySpeciesType.Demon, 4 => EnemySpeciesType.Demon, 25 => EnemySpeciesType.UltraUnknown, 31 => EnemySpeciesType.Demon, 5 => EnemySpeciesType.Machine, 11 => EnemySpeciesType.Husk, 18 => EnemySpeciesType.Soul, 32 => EnemySpeciesType.Demon, 36 => EnemySpeciesType.Puppet, 14 => EnemySpeciesType.Husk, 19 => EnemySpeciesType.Husk, 29 => EnemySpeciesType.Soul, 15 => EnemySpeciesType.Husk, 12 => EnemySpeciesType.Husk, 13 => EnemySpeciesType.Husk, 6 => EnemySpeciesType.Machine, 7 => EnemySpeciesType.Machine, 20 => EnemySpeciesType.Machine, 8 => EnemySpeciesType.Machine, 22 => EnemySpeciesType.Machine, 24 => EnemySpeciesType.UltraUnknown, 9 => EnemySpeciesType.Angel, 38 => EnemySpeciesType.Angel, 40 => EnemySpeciesType.Angel, 41 => EnemySpeciesType.Husk, 42 => EnemySpeciesType.Demon, 39 => EnemySpeciesType.Demon, 10 => EnemySpeciesType.Unknown, _ => throw new NotImplementedException(), }; if (1 == 0) { } return result; } public static EnemySpeciesRank GetSpeciesRank(this EnemyType enemyType) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Expected I4, but got Unknown if (1 == 0) { } EnemySpeciesRank result = (int)enemyType switch { 37 => EnemySpeciesRank.NotApplicable, 23 => EnemySpeciesRank.Supreme, 35 => EnemySpeciesRank.Supreme, 0 => EnemySpeciesRank.Lesser, 1 => EnemySpeciesRank.Lesser, 26 => EnemySpeciesRank.Supreme, 3 => EnemySpeciesRank.Lesser, 30 => EnemySpeciesRank.Greater, 17 => EnemySpeciesRank.Lesser, 16 => EnemySpeciesRank.Supreme, 28 => EnemySpeciesRank.Supreme, 33 => EnemySpeciesRank.Greater, 34 => EnemySpeciesRank.Greater, 2 => EnemySpeciesRank.Greater, 21 => EnemySpeciesRank.Lesser, 27 => EnemySpeciesRank.Supreme, 4 => EnemySpeciesRank.Lesser, 25 => EnemySpeciesRank.NotApplicable, 31 => EnemySpeciesRank.Lesser, 5 => EnemySpeciesRank.Greater, 11 => EnemySpeciesRank.Supreme, 18 => EnemySpeciesRank.Prime, 32 => EnemySpeciesRank.Supreme, 36 => EnemySpeciesRank.NotApplicable, 14 => EnemySpeciesRank.Greater, 19 => EnemySpeciesRank.Supreme, 29 => EnemySpeciesRank.Prime, 15 => EnemySpeciesRank.Greater, 12 => EnemySpeciesRank.Lesser, 13 => EnemySpeciesRank.Lesser, 6 => EnemySpeciesRank.Lesser, 7 => EnemySpeciesRank.Greater, 20 => EnemySpeciesRank.Greater, 8 => EnemySpeciesRank.Supreme, 22 => EnemySpeciesRank.Supreme, 24 => EnemySpeciesRank.Prime, 9 => EnemySpeciesRank.Lesser, 41 => EnemySpeciesRank.Supreme, 39 => EnemySpeciesRank.Lesser, 42 => EnemySpeciesRank.Supreme, 38 => EnemySpeciesRank.Lesser, 40 => EnemySpeciesRank.Greater, 10 => EnemySpeciesRank.NotApplicable, _ => throw new NotImplementedException(), }; if (1 == 0) { } return result; } public static EnemySpeciesRank GetSpeciesRank(this EnemyIdentifier eid) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return eid.enemyType.GetSpeciesRank(); } public static EnemySpeciesType GetSpeciesType(this EnemyIdentifier eid) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) return eid.enemyType.GetSpeciesType(); } public static Bounds SolveEnemyBounds(this EnemyComponents enemy) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000f: Unknown result type (might be due to invalid IL or missing references) return ((Component)enemy).gameObject.SolveEnemyBounds(); } public static Bounds SolveEnemyBounds(this GameObject enemyGo) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //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_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_0054: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_0073: 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_007c: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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_0095: Unknown result type (might be due to invalid IL or missing references) //IL_022d: Unknown result type (might be due to invalid IL or missing references) //IL_022e: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //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_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: 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_0107: 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_0119: Unknown result type (might be due to invalid IL or missing references) //IL_00ee: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Unknown result type (might be due to invalid IL or missing references) //IL_0152: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_0172: Unknown result type (might be due to invalid IL or missing references) //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_017b: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01bd: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0213: Unknown result type (might be due to invalid IL or missing references) //IL_01f6: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) Bounds result = default(Bounds); Collider component = enemyGo.GetComponent<Collider>(); Collider[] array = CollectionExtensions.AddRangeToArray<Collider>(enemyGo.GetComponents<Collider>(), enemyGo.GetComponentsInChildren<Collider>()); if ((Object)(object)component != (Object)null) { result = component.bounds; } Vector3 extents = ((Bounds)(ref result)).extents; if (((Vector3)(ref extents)).magnitude > 2f) { return result; } Collider[] array2 = array; foreach (Collider val in array2) { Vector3 min = ((Bounds)(ref result)).min; Vector3 max = ((Bounds)(ref result)).max; float x = min.x; Bounds bounds = val.bounds; if (x > ((Bounds)(ref bounds)).min.x) { bounds = val.bounds; min.x = ((Bounds)(ref bounds)).min.x; } float y = min.y; bounds = val.bounds; if (y > ((Bounds)(ref bounds)).min.y) { bounds = val.bounds; min.y = ((Bounds)(ref bounds)).min.y; } float z = min.z; bounds = val.bounds; if (z > ((Bounds)(ref bounds)).min.z) { bounds = val.bounds; min.z = ((Bounds)(ref bounds)).min.z; } float x2 = max.x; bounds = val.bounds; if (x2 < ((Bounds)(ref bounds)).max.x) { bounds = val.bounds; max.x = ((Bounds)(ref bounds)).max.x; } float y2 = max.y; bounds = val.bounds; if (y2 < ((Bounds)(ref bounds)).max.y) { bounds = val.bounds; max.y = ((Bounds)(ref bounds)).max.y; } float z2 = max.z; bounds = val.bounds; if (z2 < ((Bounds)(ref bounds)).max.z) { bounds = val.bounds; max.z = ((Bounds)(ref bounds)).max.z; } ((Bounds)(ref result)).SetMinMax(min, max); } return result; } } [HarmonyPatch(typeof(EnemyIdentifier), "Awake")] internal static class EnemyPreSpawnPatch { public static void Prefix(EnemyIdentifier __instance) { GameObject gameObject = ((Component)__instance).gameObject; try { EnemyComponents orAddComponent = GameObjectExtensions.GetOrAddComponent<EnemyComponents>(gameObject); } catch (Exception arg) { Log.Error($"{arg}"); } } public static void Postfix(EnemyIdentifier __instance) { GameObject gameObject = ((Component)__instance).gameObject; } } [HarmonyPatch(typeof(EnemyIdentifier), "Start")] internal static class EnemyStartPatch { public static void Prefix(EnemyIdentifier __instance) { GameObject gameObject = ((Component)__instance).gameObject; TryLog.Action(delegate { EnemyEvents.PreStart?.Invoke(((Component)__instance).GetComponent<EnemyComponents>()); }); } public static void Postfix(EnemyIdentifier __instance) { //IL_007b: Unknown result type (might be due to invalid IL or missing references) GameObject gameObject = ((Component)__instance).gameObject; EnemyComponents ec = ((Component)__instance).GetComponent<EnemyComponents>(); TryLog.Action(delegate { EnemyEvents.PostStart?.Invoke(ec); }); if (Cheats.IsCheatEnabled("nyxpiri.dev.log-eid-info")) { ec.RootGameObject.DebugPrintChildren(); } ec.EidStarted = true; if (Options.LogEnemyTypeOnStart.Value) { Log.Message($"{((Object)gameObject).name}: enemy type is: {__instance.enemyType}"); } } } [HarmonyPatch(typeof(EnemyComponents), "OnDisable")] internal static class EnemyDisablePatch { public static void Prefix(EnemyComponents __instance) { EnemyComponents enemyComponents = __instance; GameObject gameObject = ((Component)enemyComponents).gameObject; TryLog.Action(delegate { EnemyEvents.PreDisabled?.Invoke(__instance); }); } public static void Postfix(EnemyComponents __instance) { GameObject gameObject = ((Component)__instance).gameObject; } } [HarmonyPatch(typeof(EnemyComponents), "OnDestroy")] internal static class EnemyDestroyPatch { public static void Prefix(EnemyComponents __instance) { EnemyComponents enemyComponents = __instance; GameObject gameObject = ((Component)enemyComponents).gameObject; TryLog.Action(delegate { EnemyEvents.PreDestroy?.Invoke(__instance); }); } public static void Postfix(EnemyComponents __instance) { GameObject gameObject = ((Component)__instance).gameObject; } } [HarmonyPatch(typeof(SpiderBody), "Die", new Type[] { })] internal static class SpiderDiePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(SpiderBody __instance) { return EidDeathPatch.PreDeath(((Component)__instance).gameObject.GetComponent<EnemyIdentifier>(), instakill: false, typeof(SpiderDiePatch), _cancellationTracker); } public static void Postfix(SpiderBody __instance) { EidDeathPatch.PostDeath(((Component)__instance).gameObject.GetComponent<EnemyIdentifier>(), typeof(SpiderDiePatch), _cancellationTracker); } } [HarmonyPatch(typeof(Enemy), "GoLimp", new Type[] { typeof(bool) })] internal static class EnemyLimpPatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(Enemy __instance, bool fromExplosion) { return EidDeathPatch.PreDeath(__instance.EID, instakill: false, typeof(EnemyLimpPatch), _cancellationTracker); } public static void Postfix(Enemy __instance, bool fromExplosion) { EidDeathPatch.PostDeath(__instance.EID, typeof(EnemyLimpPatch), _cancellationTracker); } } [HarmonyPatch(typeof(Drone), "Death", new Type[] { typeof(bool) })] internal static class DroneDeathPatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(Drone __instance, bool fromExplosion) { return EidDeathPatch.PreDeath(((Component)__instance).gameObject.GetComponent<EnemyIdentifier>(), instakill: false, typeof(DroneDeathPatch), _cancellationTracker); } public static void Postfix(Drone __instance, bool fromExplosion) { EidDeathPatch.PostDeath(((Component)__instance).gameObject.GetComponent<EnemyIdentifier>(), typeof(DroneDeathPatch), _cancellationTracker); } } [HarmonyPatch(typeof(EnemyIdentifier), "InstaKill")] internal static class EnemyIdentifierInstakill { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(EnemyIdentifier __instance) { _cancellationTracker.Reset(); EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NullInvalid<EnemyComponents>()?.TryCallPreDeath(_cancellationTracker.GetCanceler(), instakill: true, typeof(EnemyIdentifierInstakill)); _cancellationTracker.TryInvokeReimplementation(); return _cancellationTracker.ShouldRunMethod; } public static void Postfix(EnemyIdentifier __instance) { EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NullInvalid<EnemyComponents>()?.TryCallPostDeath(_cancellationTracker.GetCancelInfo(), typeof(EnemyIdentifierInstakill)); } } [HarmonyPatch(typeof(EnemyIdentifier), "Explode")] internal static class EnemyIdentifierExplodePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(EnemyIdentifier __instance) { _cancellationTracker.Reset(); EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NullInvalid<EnemyComponents>()?.TryCallPreDeath(_cancellationTracker.GetCanceler(), instakill: true, typeof(EnemyIdentifierExplodePatch)); _cancellationTracker.TryInvokeReimplementation(); return _cancellationTracker.ShouldRunMethod; } public static void Postfix(EnemyIdentifier __instance) { EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NullInvalid<EnemyComponents>()?.TryCallPostDeath(_cancellationTracker.GetCancelInfo(), typeof(EnemyIdentifierExplodePatch)); } } [HarmonyPatch(typeof(EnemyIdentifier), "ProcessDeath", new Type[] { typeof(bool) })] internal static class EidDeathPatch { public static GameObject[] ActivateOnDeath; public static bool CalledPreDeath = false; private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool PreDeath(EnemyIdentifier eid, bool instakill, object callerObj, EventMethodCancellationTracker cancellationTracker) { cancellationTracker.Reset(); EnemyComponents component = ((Component)eid).GetComponent<EnemyComponents>(); component.NullInvalid<EnemyComponents>()?.TryCallPreDeath(cancellationTracker.GetCanceler(), instakill, callerObj); cancellationTracker.TryInvokeReimplementation(); return cancellationTracker.ShouldRunMethod; } public static void PostDeath(EnemyIdentifier eid, object callerObj, EventMethodCancellationTracker cancellationTracker) { EnemyComponents component = ((Component)eid).GetComponent<EnemyComponents>(); component.NullInvalid<EnemyComponents>()?.TryCallPostDeath(cancellationTracker.GetCancelInfo(), callerObj); } public static bool Prefix(EnemyIdentifier __instance, bool fromExplosion) { _cancellationTracker.Reset(); EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NullInvalid<EnemyComponents>()?.TryCallPreDeath(_cancellationTracker.GetCanceler(), instakill: false, typeof(EidDeathPatch)); _cancellationTracker.TryInvokeReimplementation(); component.NullInvalid<EnemyComponents>()?.TryCallDeath(); return _cancellationTracker.ShouldRunMethod; } public static void Postfix(EnemyIdentifier __instance, bool fromExplosion) { EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NullInvalid<EnemyComponents>()?.TryCallPostDeath(_cancellationTracker.GetCancelInfo(), typeof(EidDeathPatch)); } } [HarmonyPatch(typeof(StatueBoss), "Enrage")] internal static class StatueEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(StatueBoss __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreEnrage(_cancellationTracker); } public static void Postfix(StatueBoss __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(StatueBoss), "UnEnrage")] internal static class StatueBossUnEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(StatueBoss __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreUnEnrage(_cancellationTracker); } public static void Postfix(StatueBoss __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostUnEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(SwordsMachine), "Enrage")] internal static class SwordsMachineEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(SwordsMachine __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreEnrage(_cancellationTracker); } public static void Postfix(SwordsMachine __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(SwordsMachine), "UnEnrage")] internal static class SwordsMachineUnEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(SwordsMachine __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreUnEnrage(_cancellationTracker); } public static void Postfix(SwordsMachine __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostUnEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(Drone), "Enrage")] internal static class DroneEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(Drone __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreEnrage(_cancellationTracker); } public static void Postfix(Drone __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(Drone), "UnEnrage")] internal static class DroneUnEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(Drone __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreUnEnrage(_cancellationTracker); } public static void Postfix(Drone __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostUnEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(V2), "Enrage", new Type[] { typeof(string) })] internal static class V2EnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(V2 __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreEnrage(_cancellationTracker); } public static void Postfix(V2 __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(V2), "UnEnrage")] internal static class V2UnEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(V2 __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreUnEnrage(_cancellationTracker); } public static void Postfix(V2 __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostUnEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(Mindflayer), "Enrage")] internal static class MindflayerEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(Mindflayer __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreEnrage(_cancellationTracker); } public static void Postfix(Mindflayer __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(Mindflayer), "UnEnrage")] internal static class MindflayerUnEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(Mindflayer __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreUnEnrage(_cancellationTracker); } public static void Postfix(Mindflayer __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostUnEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(SpiderBody), "Enrage")] internal static class SpiderBodyEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(SpiderBody __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreEnrage(_cancellationTracker); } public static void Postfix(SpiderBody __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(SpiderBody), "UnEnrage")] internal static class SpiderBodyUnEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(SpiderBody __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreUnEnrage(_cancellationTracker); } public static void Postfix(SpiderBody __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostUnEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(Gutterman), "Enrage")] internal static class GuttermanEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(Gutterman __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreEnrage(_cancellationTracker); } public static void Postfix(Gutterman __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(Gutterman), "UnEnrage")] internal static class GuttermanUnEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(Gutterman __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreUnEnrage(_cancellationTracker); } public static void Postfix(Gutterman __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostUnEnrage(_cancellationTracker); } } [HarmonyPatch(typeof(Mass), "Enrage")] internal static class MassEnragePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static void Prefix(Mass __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPreEnrage(_cancellationTracker); } public static void Postfix(Mass __instance) { ((Component)__instance).GetComponent<EnemyComponents>().CallPostEnrage(_cancellationTracker); } } public static class EnemyEvents { public static Action<EnemyComponents> PreStart; public static Action<EnemyComponents> PostStart; public static Action<EnemyComponents> PreDisabled; public static Action<EnemyComponents> PreDestroy; public static Action<EnemyComponents, bool> PreDeath; public static Action<EnemyComponents, bool> PostDeath; public static Action<EnemyComponents> Death; } [HarmonyPatch(typeof(EnemyIdentifier), "DeliverDamage")] internal static class EidDeliverDamagePatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(EnemyIdentifier __instance, GameObject target, Vector3 force, Vector3 hitPoint, float multiplier, bool tryForExplode, float critMultiplier = 0f, GameObject sourceWeapon = null, bool ignoreTotalDamageTakenMultiplier = false, bool fromExplosion = false) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); _cancellationTracker.Reset(); component.NotifyOfPreHurt(_cancellationTracker.GetCanceler(), target, force, hitPoint, multiplier, critMultiplier, sourceWeapon, tryForExplode, ignoreTotalDamageTakenMultiplier, fromExplosion, typeof(EidDeliverDamagePatch)); _cancellationTracker.TryInvokeReimplementation(); return !_cancellationTracker.Cancelled; } public static void Postfix(EnemyIdentifier __instance, GameObject target, Vector3 force, Vector3 hitPoint, float multiplier, bool tryForExplode, float critMultiplier = 0f, GameObject sourceWeapon = null, bool ignoreTotalDamageTakenMultiplier = false, bool fromExplosion = false) { //IL_0014: 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) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NotifyOfPostHurt(_cancellationTracker.GetCancelInfo(), target, force, hitPoint, multiplier, critMultiplier, sourceWeapon, tryForExplode, ignoreTotalDamageTakenMultiplier, fromExplosion, typeof(EidDeliverDamagePatch)); } } [HarmonyPatch(typeof(Zombie), "GetHurt")] internal static class ZombieHurtPatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(Zombie __instance, GameObject target, Vector3 force, float multiplier, float critMultiplier, GameObject sourceWeapon = null, bool fromExplosion = false) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); _cancellationTracker.Reset(); component.NotifyOfPreHurt(_cancellationTracker.GetCanceler(), target, force, null, multiplier, critMultiplier, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion, typeof(ZombieHurtPatch)); _cancellationTracker.TryInvokeReimplementation(); return !_cancellationTracker.Cancelled; } public static void Postfix(Zombie __instance, GameObject target, Vector3 force, float multiplier, float critMultiplier, GameObject sourceWeapon = null, bool fromExplosion = false) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NotifyOfPostHurt(_cancellationTracker.GetCancelInfo(), target, force, null, multiplier, critMultiplier, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion, typeof(ZombieHurtPatch)); } } [HarmonyPatch(typeof(Machine), "GetHurt")] internal static class MachineHurtPatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(Machine __instance, GameObject target, Vector3 force, float multiplier, float critMultiplier, GameObject sourceWeapon = null, bool fromExplosion = false) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); _cancellationTracker.Reset(); component.NotifyOfPreHurt(_cancellationTracker.GetCanceler(), target, force, null, multiplier, critMultiplier, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion, typeof(MachineHurtPatch)); _cancellationTracker.TryInvokeReimplementation(); return !_cancellationTracker.Cancelled; } public static void Postfix(Machine __instance, GameObject target, Vector3 force, float multiplier, float critMultiplier, GameObject sourceWeapon = null, bool fromExplosion = false) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NotifyOfPostHurt(_cancellationTracker.GetCancelInfo(), target, force, null, multiplier, critMultiplier, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion, typeof(MachineHurtPatch)); } } [HarmonyPatch(typeof(SpiderBody), "GetHurt")] internal static class SpiderBodyHurtPatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(SpiderBody __instance, GameObject target, Vector3 force, Vector3 hitPoint, float multiplier, GameObject sourceWeapon) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0020: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); _cancellationTracker.Reset(); component.NotifyOfPreHurt(_cancellationTracker.GetCanceler(), target, force, hitPoint, multiplier, 1f, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion: false, typeof(SpiderBodyHurtPatch)); _cancellationTracker.TryInvokeReimplementation(); return !_cancellationTracker.Cancelled; } public static void Postfix(SpiderBody __instance, GameObject target, Vector3 force, Vector3 hitPoint, float multiplier, GameObject sourceWeapon) { //IL_0014: 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) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NotifyOfPostHurt(_cancellationTracker.GetCancelInfo(), target, force, hitPoint, multiplier, 1f, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion: false, typeof(SpiderBodyHurtPatch)); } } [HarmonyPatch(typeof(Statue), "GetHurt")] internal static class StatueHurtPatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(Statue __instance, GameObject target, Vector3 force, float multiplier, float critMultiplier, Vector3 hurtPos, GameObject sourceWeapon = null, bool fromExplosion = false) { //IL_001f: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); _cancellationTracker.Reset(); component.NotifyOfPreHurt(_cancellationTracker.GetCanceler(), target, force, null, multiplier, critMultiplier, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion, typeof(StatueHurtPatch)); _cancellationTracker.TryInvokeReimplementation(); return !_cancellationTracker.Cancelled; } public static void Postfix(Statue __instance, GameObject target, Vector3 force, float multiplier, float critMultiplier, Vector3 hurtPos, GameObject sourceWeapon = null, bool fromExplosion = false) { //IL_0014: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NotifyOfPostHurt(_cancellationTracker.GetCancelInfo(), target, force, null, multiplier, critMultiplier, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion, typeof(StatueHurtPatch)); } } [HarmonyPatch(typeof(Drone), "GetHurt")] internal static class DroneHurtPatch { private static EventMethodCancellationTracker _cancellationTracker = new EventMethodCancellationTracker(); public static bool Prefix(Drone __instance, Vector3 force, float multiplier, GameObject sourceWeapon = null, bool fromExplosion = false) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); _cancellationTracker.Reset(); component.NotifyOfPreHurt(_cancellationTracker.GetCanceler(), ((Component)__instance).gameObject, force, null, multiplier, 1f, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion, typeof(DroneHurtPatch)); _cancellationTracker.TryInvokeReimplementation(); return !_cancellationTracker.Cancelled; } public static void Postfix(Drone __instance, Vector3 force, float multiplier, GameObject sourceWeapon = null, bool fromExplosion = false) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) EnemyComponents component = ((Component)__instance).GetComponent<EnemyComponents>(); component.NotifyOfPostHurt(_cancellationTracker.GetCancelInfo(), ((Component)__instance).gameObject, force, null, multiplier, 1f, sourceWeapon, tryForExplode: false, ignoreTotalDamageTakenMultiplier: false, fromExplosion, typeof(DroneHurtPatch)); } } public static class EnemyPrefabManager { private static int InstanceStoreTickIdx = 0; private static ReserveList<EnemyPrefabStore.InstanceStore> InstanceStores = new ReserveList<EnemyPrefabStore.InstanceStore>(256); private static int _findEidsFrameCountdown; public static bool TickSkipInstantiation { get; private set; } = false; public static void Initialize() { UpdateEvents.OnLateUpdate += LateUpdate; ScenesEvents.OnSceneWasLoaded += delegate { FindEIDs(); _findEidsFrameCountdown = 5; }; } private static void FindEIDs() { EnemyIdentifier[] array = Object.FindObjectsOfType<EnemyIdentifier>(true); EnemyIdentifier[] array2 = array; foreach (EnemyIdentifier val in array2) { EnemyComponents orAddComponent = ComponentExtensions.GetOrAddComponent<EnemyComponents>((Component)(object)val); if (!orAddComponent.HasDoneSetup) { Log.TraceExpectedInfo($"FindEIDs search is setting up an enemycomps on {((Component)val).gameObject}!"); } orAddComponent.Setup(); } } public static void LateUpdate() { if (Options.SkipPrefabManagerTicks.Value || !Cheats.Enabled) { return; } if (_findEidsFrameCountdown >= 0) { if (_findEidsFrameCountdown == 0) { FindEIDs(); } _findEidsFrameCountdown--; } if (TickSkipInstantiation) { TickSkipInstantiation = false; } else { if (InstanceStores.Count <= 0) { return; } int i = 0; int num = 0; for (; i < 50; i++) { if (num >= 1) { break; } InstanceStoreTickIdx = (InstanceStoreTickIdx + 1) % InstanceStores.SoftCapacity; if (InstanceStores.IsIndexValid(InstanceStoreTickIdx)) { EnemyPrefabStore.InstanceStore instanceStore = InstanceStores[InstanceStoreTickIdx]; if (!instanceStore.IsFull) { Assert.IsNotNull((Object)(object)instanceStore); instanceStore.InstantiateAndStore(); num++; } } } } } public static int RegisterInstanceStore(EnemyPrefabStore.InstanceStore instanceStore) { TickSkipInstantiation = true; return InstanceStores.Add(instanceStore); } public static void UnregisterInstanceStore(int idx) { InstanceStores.RemoveAt(idx); } } public class EnemyPrefabStore : EnemyModifier { public class InstanceStore : ScriptableObject { public GameObject Prefab = null; public GameObject PrefabParent = null; private string _debugName = "UNNAMED"; private Stack<GameObject> Instances = new Stack<GameObject>(); private HashSet<EnemyPrefabStore> RegisteredStores = new HashSet<EnemyPrefabStore>(32); private RegistrationTracker RegistrationTracker = null; private int RegistrationIdx = -1; public EnemyComponents PrefabEadd { get; private set; } public bool IsFull => Instances.Count >= InstanceStoreCapacity; public void Initialize(GameObject prefab, GameObject prefabParent, EnemyComponents prefabEadd, string debugName) { Prefab = prefab; PrefabParent = prefabParent; PrefabEadd = prefabEadd; _debugName = debugName; Log.TraceExpectedInfo($"New instance store by the name of {debugName} being created with prefab {Prefab}"); if (Cheats.Enabled) { Assert.IsNotNull((Object)(object)Prefab); } RegistrationTracker = new RegistrationTracker(delegate { Log.TraceExpectedInfo(_debugName + ": Registering to prefab manager"); if (Cheats.Enabled) { Assert.IsNotNull((Object)(object)Prefab); } RegistrationIdx = EnemyPrefabManager.RegisterInstanceStore(this); return true; }, delegate { Log.TraceExpectedInfo(_debugName + ": Unregistering from prefab manager"); if (Cheats.Enabled) { Assert.IsNotNull((Object)(object)Prefab); } EnemyPrefabManager.UnregisterInstanceStore(RegistrationIdx); RegistrationIdx = -1; return true; }); } public void InstantiateAndStore() { if ((Object)(object)Prefab == (Object)null) { RegistrationTracker.Unregister(); Log.Error(_debugName + ": InstanceStore had instantiate and store called despite prefab being null, and thus destroyed."); } else if ((Object)(object)PrefabParent == (Object)null) { RegistrationTracker.Unregister(); Log.Error(_debugName + ": InstanceStore had instantiate and store called despite prefab parent being null, and thus destroyed."); } else if (!IsFull) { GameObject val = Object.Instantiate<GameObject>(Prefab); Log.TraceExpectedInfo($"{_debugName}: Instantiating and storing for prefab {Prefab}"); Instances.Push(val); val.SetActive(false); } } public void RegisterStore(EnemyPrefabStore store) { RegisteredStores.Add(store); if (RegisteredStores.Count == 1) { RegistrationTracker.Register(); } Assert.IsNotNull((Object)(object)Prefab); } public void UnregisterStore(EnemyPrefabStore store) { RegisteredStores.Remove(store); if (RegisteredStores.Count == 0) { RegistrationTracker.Unregister(); } Assert.IsNotNull((Object)(object)Prefab); } public GameObject GetNewInstance() { //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Invalid comparison between Unknown and I4 Assert.IsNotNull((Object)(object)Prefab); GameObject instGo = null; if (Instances.Count > 0) { instGo = Instances.Pop(); } if (instGo == null) { instGo = Object.Instantiate<GameObject>(Prefab); } Transform transform = instGo.transform; GameObject prefabParent = PrefabParent; transform.SetParent((prefabParent != null) ? prefabParent.transform : null); if ((int)PrefabEadd.Eid.enemyType == 12) { EnemyComponents component = instGo.GetComponent<EnemyComponents>(); component.PreDeath += delegate { instGo.GetComponent<Stalker>().SandExplode(1); }; component.PostDeath += delegate { instGo.GetComponent<EnemyComponents>().InstaDestroy(); }; } return instGo; } } private RegistrationTracker InstancesRegistrator = null; [SerializeField] private InstanceStore _instances = null; [SerializeField] private GameObject _prefabParent = null; [SerializeField] private GameObject _prefab = null; [SerializeField] private EnemyIdentifier _eid = null; [SerializeField] private EnemyComponents _enemy = null; private static bool IsStoringPrefab; public static int InstanceStoreCapacity => Mathf.Min(InstanceStoreCapacityModsAdditional, Options.EnemyPrefabInstanceStoreCapacityMax.Value); public static int InstanceStoreCapacityModsAdditional { get; private set; } public InstanceStore Instances => _instances; public GameObject PrefabDirectGameObject => _prefab; public GameObject PrefabParent => _prefabParent ?? null; private bool IsPrefab { get; set; } = false; public static void RequestInstanceStoreCapacity(int requestedCapacity) { InstanceStoreCapacityModsAdditional = Math.