r2mods/ilspy_dump/ror2_csproj/RoR2/ParticleTriggerEvent.cs

85 lines
2.0 KiB
C#
Raw Normal View History

2024-10-04 07:26:37 +00:00
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<ParticleSystem.Particle> particleList;
private float lastTriggerTimestamp;
private void Awake()
{
if (particleSystemToTrack == null)
{
particleSystemToTrack = GetComponent<ParticleSystem>();
}
if (particleSystemToTrack != null)
{
particleList = new List<ParticleSystem.Particle>(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();
}
}
}