More effective recovery

Fix of trigger detection
This commit is contained in:
SDraw 2023-04-14 11:00:20 +03:00
parent 8d337635b8
commit fa5a0334b9
No known key found for this signature in database
GPG key ID: BB95B4DAB2BB8BB5
4 changed files with 42 additions and 30 deletions

View file

@ -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.

View file

@ -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;

View file

@ -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<Collider>();
}
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<CVRPointer>();
if((l_pointer != null) && (l_pointer.type == "ragdoll") && (m_lastCollider != p_other))
CVRPointer l_pointer = p_other.GetComponent<CVRPointer>();
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()

View file

@ -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;