diff --git a/ml_prm/README.md b/ml_prm/README.md index e671301..369a331 100644 --- a/ml_prm/README.md +++ b/ml_prm/README.md @@ -15,7 +15,7 @@ Optional mod's settings with [BTKUILib](https://github.com/BTK-Development/BTKUI * **Restore position:** returns to position of ragdoll state activation upon ragdoll state exit; `false` by default. * **Use gravity:** enables/disables gravity for ragdoll; `true` by default. * Note: Forcibly enabled in worlds that don't allow flight. -* **Pointers reaction:** enables ragdoll state when player collides with CVRPointer colliders of `ragdoll` type (avatars, props and world included); `true` by default. +* **Pointers reaction:** enables ragdoll state when player collides with trigger colliders with CVRPointer component of `ragdoll` type (avatars, props and world included); `true` by default. * **Combat reaction:** enables ragdoll state upon death in worlds with combat system; `true` by default. * **Auto recover:** enables automatic recovering after specific time delay; `false` by default. * **Velocity multiplier:** velocity force multiplier based on player's movement direction; `2.0` by default. diff --git a/ml_prm/RagdollController.cs b/ml_prm/RagdollController.cs index 0160dbe..14251ed 100644 --- a/ml_prm/RagdollController.cs +++ b/ml_prm/RagdollController.cs @@ -35,9 +35,9 @@ namespace ml_prm RagdollToggle m_avatarRagdollToggle = null; RagdollTrigger m_customTrigger = null; AvatarBoolParameter m_ragdolledParameter = null; - Coroutine m_recoverTask = null; bool m_reachedGround = true; + float m_downTime = float.MinValue; internal RagdollController() { @@ -96,6 +96,16 @@ namespace ml_prm if(m_enabled && m_avatarReady && BodySystem.isCalibratedAsFullBody) BodySystem.TrackingPositionWeight = 0f; + if(m_avatarReady && m_enabled && Settings.AutoRecover) + { + m_downTime += Time.deltaTime; + if(m_downTime >= Settings.RecoverDelay) + { + SwitchRagdoll(); + m_downTime = float.MinValue; // One attepmt to recover + } + } + if(Settings.Hotkey && Input.GetKeyDown(KeyCode.R) && !ViewManager.Instance.isGameMenuOpen()) SwitchRagdoll(); @@ -121,12 +131,6 @@ namespace ml_prm // Game events internal void OnAvatarClear() { - if(m_recoverTask != null) - { - StopCoroutine(m_recoverTask); - m_recoverTask = null; - } - if(m_enabled) MovementSystem.Instance.SetImmobilized(false); @@ -144,6 +148,7 @@ namespace ml_prm m_puppetReferences = new BipedRagdollReferences(); m_boneLinks.Clear(); m_reachedGround = true; + m_downTime = float.MinValue; } internal void OnAvatarSetup() @@ -372,8 +377,7 @@ namespace ml_prm foreach(Collider l_collider in m_colliders) l_collider.enabled = true; - if(Settings.AutoRecover) - m_recoverTask = StartCoroutine(AutoRecover()); + m_downTime = 0f; m_enabled = true; } @@ -382,12 +386,6 @@ namespace ml_prm { if(IsSafeToUnragdoll()) { - if(m_recoverTask != null) - { - StopCoroutine(m_recoverTask); - m_recoverTask = null; - } - MovementSystem.Instance.SetImmobilized(false); m_ragdolledParameter.SetValue(false); if(BodySystem.isCalibratedAsFullBody) @@ -418,6 +416,7 @@ namespace ml_prm m_lastPosition = PlayerSetup.Instance.transform.position; m_velocity = Vector3.zero; + m_downTime = float.MinValue; m_enabled = false; } @@ -427,13 +426,6 @@ namespace ml_prm public bool IsRagdolled() => (m_enabled && m_avatarReady); - IEnumerator AutoRecover() - { - yield return new WaitForSeconds(Settings.RecoverDelay); - m_recoverTask = null; - SwitchRagdoll(); - } - static Transform CloneTransform(Transform p_source, Transform p_parent, string p_name) { Transform l_target = new GameObject(p_name).transform; diff --git a/ml_prm/RagdollTrigger.cs b/ml_prm/RagdollTrigger.cs index fb0ee93..451da15 100644 --- a/ml_prm/RagdollTrigger.cs +++ b/ml_prm/RagdollTrigger.cs @@ -6,23 +6,43 @@ namespace ml_prm [DisallowMultipleComponent] class RagdollTrigger : MonoBehaviour { - Collider m_lastCollider = null; + Collider m_collider = null; + Collider m_lastTrigger = null; bool m_triggered = false; + void Start() + { + m_collider = this.GetComponent(); + } + + void Update() + { + if(!ReferenceEquals(m_lastTrigger, null)) + { + if(m_lastTrigger != null) + { + if(!m_collider.bounds.Intersects(m_lastTrigger.bounds)) + m_lastTrigger = null; + } + else + m_lastTrigger = null; + } + } + void OnTriggerEnter(Collider p_other) { - CVRPointer l_pointer = p_other.gameObject.GetComponent(); - if((l_pointer != null) && (l_pointer.type == "ragdoll") && (m_lastCollider != p_other)) + CVRPointer l_pointer = p_other.GetComponent(); + if((l_pointer != null) && (l_pointer.type == "ragdoll") && (m_lastTrigger != p_other)) { - m_lastCollider = p_other; + m_lastTrigger = p_other; m_triggered = true; } } void OnTriggerExit(Collider p_other) { - if(m_lastCollider == p_other) - m_lastCollider = null; + if(m_lastTrigger == p_other) + m_lastTrigger = null; } public bool GetStateWithReset() diff --git a/ml_prm/Settings.cs b/ml_prm/Settings.cs index 13a92a8..58f5de0 100644 --- a/ml_prm/Settings.cs +++ b/ml_prm/Settings.cs @@ -133,7 +133,7 @@ namespace ml_prm GravityChange?.Invoke(state); }; - ms_uiElements.Add(l_categoryMod.AddToggle("Pointers reaction", "React to CVRPointer components with 'ragdoll' type", PointersReaction)); + ms_uiElements.Add(l_categoryMod.AddToggle("Pointers reaction", "React to trigger colliders with CVRPointer component of 'ragdoll' type", PointersReaction)); (ms_uiElements[(int)UiElementIndex.PointersReaction] as BTKUILib.UIObjects.Components.ToggleButton).OnValueUpdated += (state) => { PointersReaction = state;