using System; using System.Collections.Generic; using RoR2.Orbs; using UnityEngine; using UnityEngine.Serialization; namespace RoR2; public class EffectManagerHelper : MonoBehaviour { protected List _ParticleSystems; protected EffectComponent _effectComponent; protected VFXAttributes _vfxAttributes; protected HoverOverHead _hoverOverHead; protected List _tracers; protected EffectPool _OwningPool; protected bool _IsInitialized; protected DestroyOnTimer _destroyOnTimer; protected OrbEffect _orbEffect; protected Tracer _tracer; protected List _AnimateShaderAlphasDestroyOnEnd; protected List _ActiveAnimateShaderAlphasDestroyOnEnd; protected List _AnimateShaderAlphasDisableOnEnd; protected List _ActiveAnimateShaderAlphasDisableOnEnd; protected List _AnimateShaderAlphas; protected List _ActiveAnimateShaderAlphas; protected List _TrailRenderers; protected List _LineRenderers; protected LineRenderer _RootLineRenderer; protected List _AkEvents_Start; protected List _AkEvents_Destroy; protected List _DestroyOnParticleEnds; protected List _DetachParticlesOnDestroyAndEndEmissions; protected bool _TriggeredDisable; protected List _ActiveGameObjects; protected List _ShakeEmitters; protected List _OmniEffects; [Tooltip("Some projectile scripts will prematurely pool ghosts that don't appear to need to exist after the projectile is gone. If your ghost is being prematurely pooled by a projectile script, enable this.")] [FormerlySerializedAs("SimulateDestroyOnTimer")] [SerializeField] public bool DontAllowProjectilesToPrematurelyPool; public EffectComponent effectComponent => _effectComponent; public EffectPool OwningPool => _OwningPool; public bool HasDestroyOnTimer { get { if (!DontAllowProjectilesToPrematurelyPool) { return _destroyOnTimer != null; } return true; } } public bool HasAnimateShaderAlphas { get { if (_ActiveAnimateShaderAlphasDestroyOnEnd == null || _ActiveAnimateShaderAlphasDestroyOnEnd.Count <= 0) { if (_ActiveAnimateShaderAlphasDisableOnEnd != null) { return _ActiveAnimateShaderAlphasDisableOnEnd.Count > 0; } return false; } return true; } } public bool HasDetachParticlesOnDestroy { get { if (_DetachParticlesOnDestroyAndEndEmissions != null) { return _DetachParticlesOnDestroyAndEndEmissions.Count > 0; } return false; } } public bool HasDestroyOnParticleEnd { get { if (_DestroyOnParticleEnds != null) { return _DestroyOnParticleEnds.Count > 0; } return false; } } private void OnDestroy() { if (OwningPool != null) { OwningPool.RemoveObject(this); SetOwningPool(null); } } public void SetOwningPool(EffectPool inOwner) { _OwningPool = inOwner; } protected void FindAndCacheComponents(ref List refList) where T : Component { T[] componentsInChildren = base.gameObject.GetComponentsInChildren(includeInactive: true); if (componentsInChildren != null && componentsInChildren.Length != 0) { if (refList == null) { refList = new List(); } T[] array = componentsInChildren; foreach (T item in array) { refList.Add(item); } } } protected void RecursiveFindActiveObjects(Transform inTransform, Transform inRootTransform, List inWhitelistObjects) { if (inWhitelistObjects.Contains(inTransform.gameObject)) { return; } int childCount = inTransform.childCount; for (int i = 0; i < childCount; i++) { RecursiveFindActiveObjects(inTransform.GetChild(i), inRootTransform, inWhitelistObjects); } if (inTransform != inRootTransform && inTransform.gameObject.activeSelf) { if (_ActiveGameObjects == null) { _ActiveGameObjects = new List(); } _ActiveGameObjects.Add(inTransform.gameObject); } } public void Initialize() { if (_IsInitialized) { return; } _effectComponent = base.gameObject.GetComponent(); _vfxAttributes = base.gameObject.GetComponent(); _hoverOverHead = base.gameObject.GetComponent(); if ((bool)_vfxAttributes && _OwningPool != null) { _OwningPool.DoNotCull = _vfxAttributes.DoNotCullPool; } if (EffectManager.UsePools) { FindAndCacheComponents(ref _tracers); FindAndCacheComponents(ref _ParticleSystems); if (_ParticleSystems != null) { foreach (ParticleSystem particleSystem in _ParticleSystems) { if (particleSystem.main.stopAction == ParticleSystemStopAction.Destroy) { ParticleSystem.MainModule main = particleSystem.main; main.stopAction = ParticleSystemStopAction.None; } } } _orbEffect = GetComponent(); if (_orbEffect != null) { _orbEffect.PrepForPoolUsage(); } _tracer = GetComponent(); if (_tracer != null) { _tracer.PrepForPoolUsage(); } AnimateShaderAlpha[] componentsInChildren = base.gameObject.GetComponentsInChildren(includeInactive: true); if (componentsInChildren != null && componentsInChildren.Length != 0) { AnimateShaderAlpha[] array = componentsInChildren; foreach (AnimateShaderAlpha animateShaderAlpha in array) { animateShaderAlpha.initialyEnabled = animateShaderAlpha.enabled; if (!animateShaderAlpha.continueExistingAfterTimeMaxIsReached) { animateShaderAlpha.OnFinished.AddListener(OnAnimateShaderAlphaComplete); } if (animateShaderAlpha.destroyOnEnd) { if (_AnimateShaderAlphasDestroyOnEnd == null) { _AnimateShaderAlphasDestroyOnEnd = new List(); } _AnimateShaderAlphasDestroyOnEnd.Add(animateShaderAlpha); if (animateShaderAlpha.enabled) { if (_ActiveAnimateShaderAlphasDestroyOnEnd == null) { _ActiveAnimateShaderAlphasDestroyOnEnd = new List(); } _ActiveAnimateShaderAlphasDestroyOnEnd.Add(animateShaderAlpha); } continue; } if (animateShaderAlpha.disableOnEnd) { if (_AnimateShaderAlphasDisableOnEnd == null) { _AnimateShaderAlphasDisableOnEnd = new List(); } _AnimateShaderAlphasDisableOnEnd.Add(animateShaderAlpha); if (animateShaderAlpha.enabled) { if (_ActiveAnimateShaderAlphasDisableOnEnd == null) { _ActiveAnimateShaderAlphasDisableOnEnd = new List(); } _ActiveAnimateShaderAlphasDisableOnEnd.Add(animateShaderAlpha); } continue; } if (_AnimateShaderAlphas == null) { _AnimateShaderAlphas = new List(); } _AnimateShaderAlphas.Add(animateShaderAlpha); if (animateShaderAlpha.enabled) { if (_ActiveAnimateShaderAlphas == null) { _ActiveAnimateShaderAlphas = new List(); } _ActiveAnimateShaderAlphas.Add(animateShaderAlpha); } } } if (_ActiveAnimateShaderAlphasDestroyOnEnd != null && OwningPool != null) { foreach (AnimateShaderAlpha item in _ActiveAnimateShaderAlphasDestroyOnEnd) { item.destroyOnEnd = false; item.disableOnEnd = true; } } FindAndCacheComponents(ref _TrailRenderers); if (_TrailRenderers != null) { foreach (TrailRenderer trailRenderer in _TrailRenderers) { trailRenderer.autodestruct = false; } } FindAndCacheComponents(ref _LineRenderers); _RootLineRenderer = base.gameObject.GetComponent(); if (_RootLineRenderer != null && !_RootLineRenderer.enabled) { _RootLineRenderer = null; } AkEvent[] componentsInChildren2 = base.gameObject.GetComponentsInChildren(); if (componentsInChildren2 != null && componentsInChildren2.Length != 0) { AkEvent[] array2 = componentsInChildren2; foreach (AkEvent akEvent in array2) { if (akEvent.triggerList.Contains(1281810935)) { if (_AkEvents_Start == null) { _AkEvents_Start = new List(); } _AkEvents_Start.Add(akEvent); } if (akEvent.triggerList.Contains(-358577003)) { if (_AkEvents_Destroy == null) { _AkEvents_Destroy = new List(); } _AkEvents_Destroy.Add(akEvent); } } } FindAndCacheComponents(ref _DestroyOnParticleEnds); if (_DestroyOnParticleEnds != null && _DestroyOnParticleEnds.Count > 0) { for (int num = _DestroyOnParticleEnds.Count - 1; num >= 0; num--) { if (_DestroyOnParticleEnds[num] != null && !_DestroyOnParticleEnds[num].enabled) { _DestroyOnParticleEnds.RemoveAt(num); } } } if (base.gameObject.name.Contains("SlashMercEvis")) { _ = 0; } FindAndCacheComponents(ref _ShakeEmitters); FindAndCacheComponents(ref _OmniEffects); if (_OmniEffects != null && _ParticleSystems != null) { foreach (OmniEffect omniEffect in _OmniEffects) { OmniEffect.OmniEffectGroup[] omniEffectGroups = omniEffect.omniEffectGroups; for (int i = 0; i < omniEffectGroups.Length; i++) { OmniEffect.OmniEffectElement[] omniEffectElements = omniEffectGroups[i].omniEffectElements; foreach (OmniEffect.OmniEffectElement omniEffectElement in omniEffectElements) { if (omniEffectElement.particleSystem != null && _ParticleSystems.Contains(omniEffectElement.particleSystem)) { _ParticleSystems.Remove(omniEffectElement.particleSystem); } } } } } } _IsInitialized = true; } public void Reset(bool inActivate) { if (_effectComponent != null) { _effectComponent.Reset(); } if (_hoverOverHead != null) { _hoverOverHead.Reset(); } if (_ParticleSystems != null) { foreach (ParticleSystem particleSystem in _ParticleSystems) { try { particleSystem.Stop(); particleSystem.Clear(); if (inActivate) { particleSystem.Play(); } } catch (Exception ex) { Debug.LogFormat("ERROR: GameObject {0}\n{1}", base.gameObject.name, ex.Message); } } } if (_TrailRenderers != null) { foreach (TrailRenderer trailRenderer in _TrailRenderers) { trailRenderer.Clear(); } } if (_LineRenderers != null) { for (int i = 0; i < _LineRenderers.Count; i++) { if (!(_LineRenderers[i] != null)) { continue; } LineRenderer lineRenderer = _LineRenderers[i]; if (lineRenderer.positionCount > 1) { Vector3 position = lineRenderer.GetPosition(0); for (int j = 1; j < lineRenderer.positionCount; j++) { lineRenderer.SetPosition(j, position); } } } } if (_AnimateShaderAlphasDestroyOnEnd != null) { foreach (AnimateShaderAlpha item in _AnimateShaderAlphasDestroyOnEnd) { item.Reset(); } } if (_ActiveAnimateShaderAlphasDestroyOnEnd != null) { foreach (AnimateShaderAlpha item2 in _ActiveAnimateShaderAlphasDestroyOnEnd) { if (!item2.enabled) { item2.enabled = true; } } } if (_AnimateShaderAlphasDisableOnEnd != null) { foreach (AnimateShaderAlpha item3 in _AnimateShaderAlphasDisableOnEnd) { item3.Reset(); } } if (_ActiveAnimateShaderAlphasDisableOnEnd != null) { foreach (AnimateShaderAlpha item4 in _ActiveAnimateShaderAlphasDisableOnEnd) { if (!item4.enabled) { item4.enabled = true; } } } if (_AnimateShaderAlphas != null) { foreach (AnimateShaderAlpha animateShaderAlpha in _AnimateShaderAlphas) { animateShaderAlpha.Reset(); } } if (_orbEffect != null) { _orbEffect.Reset(); } if (_tracer != null) { _tracer.Reset(); } if (_AkEvents_Start != null) { foreach (AkEvent item5 in _AkEvents_Start) { item5.HandleEvent(item5.gameObject); } } if (HasDetachParticlesOnDestroy) { _TriggeredDisable = false; if (_RootLineRenderer != null) { _RootLineRenderer.enabled = true; } } } public void ResetPostActivate() { if (_ShakeEmitters == null) { return; } foreach (ShakeEmitter shakeEmitter in _ShakeEmitters) { shakeEmitter.StartShake(); } } public void StopAllParticleSystems() { if (_ParticleSystems == null) { return; } foreach (ParticleSystem particleSystem in _ParticleSystems) { try { particleSystem.Stop(); particleSystem.Clear(); } catch (Exception ex) { Debug.LogFormat("ERROR: GameObject {0}\n{1}", base.gameObject.name, ex.Message); } } } public void OnAnimateShaderAlphaComplete() { if (OwningPool != null) { OwningPool.ReturnObject(this); return; } Debug.LogErrorFormat("No Owning Pool on object {0} ({1})", base.gameObject.name, base.gameObject.GetInstanceID()); UnityEngine.Object.Destroy(base.gameObject); } public void OnReturnToPool() { if (_AkEvents_Destroy != null) { foreach (AkEvent item in _AkEvents_Destroy) { if (item.enabled) { item.HandleEvent(base.gameObject); } } } if (_ActiveGameObjects == null) { return; } foreach (GameObject activeGameObject in _ActiveGameObjects) { activeGameObject.SetActive(value: true); } } public void ReturnToPool() { EffectComplete(); OwningPool.ReturnObject(this); } public bool EffectComplete() { bool result = true; if (HasDetachParticlesOnDestroy && !_TriggeredDisable && _RootLineRenderer != null) { _RootLineRenderer.enabled = false; } if (!_TriggeredDisable) { if (_ActiveGameObjects != null) { foreach (GameObject activeGameObject in _ActiveGameObjects) { activeGameObject.SetActive(value: false); } } _TriggeredDisable = true; } return result; } }