diff --git a/ml_prm/RagdollTrigger.cs b/ml_prm/RagdollTrigger.cs index d5996bd..45b9d84 100644 --- a/ml_prm/RagdollTrigger.cs +++ b/ml_prm/RagdollTrigger.cs @@ -1,49 +1,90 @@ using ABI.CCK.Components; using ABI_RC.Core.Player; +using ABI_RC.Core.Savior; using UnityEngine; namespace ml_prm { [DisallowMultipleComponent] - class RagdollTrigger : MonoBehaviour + public class RagdollTrigger : MonoBehaviour { + const string c_ragdollPointerType = "ragdoll"; + Collider m_collider = null; - Collider m_lastTrigger = null; + Collider m_lastColliderTrigger = null; + ParticleSystem m_lastParticleSystemTrigger = null; bool m_triggered = false; void Start() { m_collider = this.GetComponent(); + CVRParticlePointerManager.volumes.Add(new RagdollTriggerVolume() { + collider = m_collider, + trigger = this, + }); + CVRParticlePointerManager.UpdateParticleSystems(); + } + + void OnDestroy() { + CVRParticlePointerManager.RemoveTrigger(m_collider); } void Update() { - if(!ReferenceEquals(m_lastTrigger, null)) + if(!ReferenceEquals(m_lastColliderTrigger, null)) { - if(m_lastTrigger != null) + if(m_lastColliderTrigger != null) { - if(!m_collider.bounds.Intersects(m_lastTrigger.bounds)) - m_lastTrigger = null; + if(!m_collider.bounds.Intersects(m_lastColliderTrigger.bounds)) + m_lastColliderTrigger = null; } else - m_lastTrigger = null; + m_lastColliderTrigger = null; + } + if(!ReferenceEquals(m_lastParticleSystemTrigger, null)) + { + if(m_lastParticleSystemTrigger != null) + { + if (m_lastParticleSystemTrigger.particleCount == 0) + m_lastParticleSystemTrigger = null; + } + else + m_lastParticleSystemTrigger = null; } } void OnTriggerEnter(Collider p_other) { CVRPointer l_pointer = p_other.GetComponent(); - if((l_pointer != null) && (l_pointer.type == "ragdoll") && !IsIgnored(l_pointer.transform) && (m_lastTrigger != p_other)) + if((l_pointer != null) && (l_pointer.type == c_ragdollPointerType) && !IsIgnored(l_pointer.transform) && (m_lastColliderTrigger != p_other)) { - m_lastTrigger = p_other; + m_lastColliderTrigger = p_other; m_triggered = true; } } void OnTriggerExit(Collider p_other) { - if(m_lastTrigger == p_other) - m_lastTrigger = null; + if(m_lastColliderTrigger == p_other) + m_lastColliderTrigger = null; + } + + public void OnPointerParticleEnter(CVRPointer p_pointer) + { + if (!gameObject.activeInHierarchy) return; + if ((p_pointer.type == c_ragdollPointerType) && !IsIgnored(p_pointer.transform) && (m_lastParticleSystemTrigger != p_pointer.particleSystem)) + { + m_lastParticleSystemTrigger = p_pointer.particleSystem; + m_triggered = true; + } + } + + public void OnPointerParticleExit(CVRPointer p_pointer) + { + // This seems to be very unreliable, and it's causing weird behavior + // if (!gameObject.activeInHierarchy) return; + // if(m_lastParticleSystemTrigger == p_pointer.particleSystem) + // m_lastParticleSystemTrigger = null; } public bool GetStateWithReset() diff --git a/ml_prm/RagdollTriggerVolume.cs b/ml_prm/RagdollTriggerVolume.cs new file mode 100644 index 0000000..6980708 --- /dev/null +++ b/ml_prm/RagdollTriggerVolume.cs @@ -0,0 +1,14 @@ +using ABI_RC.Core.Savior; +using ABI.CCK.Components; +using UnityEngine; + +namespace ml_prm { + + public class RagdollTriggerVolume : CVRTriggerVolume + { + public Collider collider { get; set; } + public RagdollTrigger trigger { get; set; } + public void TriggerEnter(CVRPointer pointer) => trigger.OnPointerParticleEnter(pointer); + public void TriggerExit(CVRPointer pointer) => trigger.OnPointerParticleExit(pointer); + } +} diff --git a/ml_prm/ml_prm.csproj b/ml_prm/ml_prm.csproj index b89ac5c..01c5ff4 100644 --- a/ml_prm/ml_prm.csproj +++ b/ml_prm/ml_prm.csproj @@ -65,6 +65,10 @@ D:\games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.PhysicsModule.dll false + + D:\games\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.ParticleSystemModule.dll + false +