using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; namespace RoR2; public class ParticleTriggerEvent : MonoBehaviour { public ParticleSystem particleSystemToTrack; public bool OnServerOnly; public bool killParticleOnEventTrigger; [Tooltip("Displays a message whenever a new particle is born")] public bool debugMessages; [Space(20f)] public ParticleSystemTriggerEventType triggerType; [Tooltip("The trigger will not fire if it's fired within this many seconds ago. Leave at -1 for 'fire every frame if need be.'")] [Space(20f)] public float triggerCooldown = -1f; [Space(20f)] public UnityEvent onParticleTrigger; private List particleList; private float lastTriggerTimestamp; private void Awake() { if (particleSystemToTrack == null) { particleSystemToTrack = GetComponent(); } if (particleSystemToTrack != null) { particleList = new List(particleSystemToTrack.main.maxParticles); } if (particleSystemToTrack == null || (OnServerOnly && !NetworkServer.active)) { base.enabled = false; } } private void OnParticleTrigger() { float time = Time.time; if (particleSystemToTrack.GetTriggerParticles(triggerType, particleList) > 0) { FireEvent(time); if (killParticleOnEventTrigger) { KillParticles(triggerType); } } } private void KillParticles(ParticleSystemTriggerEventType trigType) { int count = particleList.Count; for (int i = 0; i < count; i++) { ParticleSystem.Particle value = particleList[i]; value.remainingLifetime = -1f; particleList[i] = value; } _ = debugMessages; particleSystemToTrack.SetTriggerParticles(trigType, particleList); } private void FireEvent(float currentTime) { if (triggerCooldown == -1f || !(currentTime - lastTriggerTimestamp < triggerCooldown)) { _ = debugMessages; lastTriggerTimestamp = currentTime; onParticleTrigger?.Invoke(); } } }