mirror of
https://github.com/hanetzer/sdraw_mods_cvr.git
synced 2025-09-03 10:29:22 +00:00
More effective recovery
Fix of trigger detection
This commit is contained in:
parent
8d337635b8
commit
fa5a0334b9
4 changed files with 42 additions and 30 deletions
|
@ -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.
|
* **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.
|
* **Use gravity:** enables/disables gravity for ragdoll; `true` by default.
|
||||||
* Note: Forcibly enabled in worlds that don't allow flight.
|
* 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.
|
* **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.
|
* **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.
|
* **Velocity multiplier:** velocity force multiplier based on player's movement direction; `2.0` by default.
|
||||||
|
|
|
@ -35,9 +35,9 @@ namespace ml_prm
|
||||||
RagdollToggle m_avatarRagdollToggle = null;
|
RagdollToggle m_avatarRagdollToggle = null;
|
||||||
RagdollTrigger m_customTrigger = null;
|
RagdollTrigger m_customTrigger = null;
|
||||||
AvatarBoolParameter m_ragdolledParameter = null;
|
AvatarBoolParameter m_ragdolledParameter = null;
|
||||||
Coroutine m_recoverTask = null;
|
|
||||||
|
|
||||||
bool m_reachedGround = true;
|
bool m_reachedGround = true;
|
||||||
|
float m_downTime = float.MinValue;
|
||||||
|
|
||||||
internal RagdollController()
|
internal RagdollController()
|
||||||
{
|
{
|
||||||
|
@ -96,6 +96,16 @@ namespace ml_prm
|
||||||
if(m_enabled && m_avatarReady && BodySystem.isCalibratedAsFullBody)
|
if(m_enabled && m_avatarReady && BodySystem.isCalibratedAsFullBody)
|
||||||
BodySystem.TrackingPositionWeight = 0f;
|
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())
|
if(Settings.Hotkey && Input.GetKeyDown(KeyCode.R) && !ViewManager.Instance.isGameMenuOpen())
|
||||||
SwitchRagdoll();
|
SwitchRagdoll();
|
||||||
|
|
||||||
|
@ -121,12 +131,6 @@ namespace ml_prm
|
||||||
// Game events
|
// Game events
|
||||||
internal void OnAvatarClear()
|
internal void OnAvatarClear()
|
||||||
{
|
{
|
||||||
if(m_recoverTask != null)
|
|
||||||
{
|
|
||||||
StopCoroutine(m_recoverTask);
|
|
||||||
m_recoverTask = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(m_enabled)
|
if(m_enabled)
|
||||||
MovementSystem.Instance.SetImmobilized(false);
|
MovementSystem.Instance.SetImmobilized(false);
|
||||||
|
|
||||||
|
@ -144,6 +148,7 @@ namespace ml_prm
|
||||||
m_puppetReferences = new BipedRagdollReferences();
|
m_puppetReferences = new BipedRagdollReferences();
|
||||||
m_boneLinks.Clear();
|
m_boneLinks.Clear();
|
||||||
m_reachedGround = true;
|
m_reachedGround = true;
|
||||||
|
m_downTime = float.MinValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void OnAvatarSetup()
|
internal void OnAvatarSetup()
|
||||||
|
@ -372,8 +377,7 @@ namespace ml_prm
|
||||||
foreach(Collider l_collider in m_colliders)
|
foreach(Collider l_collider in m_colliders)
|
||||||
l_collider.enabled = true;
|
l_collider.enabled = true;
|
||||||
|
|
||||||
if(Settings.AutoRecover)
|
m_downTime = 0f;
|
||||||
m_recoverTask = StartCoroutine(AutoRecover());
|
|
||||||
|
|
||||||
m_enabled = true;
|
m_enabled = true;
|
||||||
}
|
}
|
||||||
|
@ -382,12 +386,6 @@ namespace ml_prm
|
||||||
{
|
{
|
||||||
if(IsSafeToUnragdoll())
|
if(IsSafeToUnragdoll())
|
||||||
{
|
{
|
||||||
if(m_recoverTask != null)
|
|
||||||
{
|
|
||||||
StopCoroutine(m_recoverTask);
|
|
||||||
m_recoverTask = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
MovementSystem.Instance.SetImmobilized(false);
|
MovementSystem.Instance.SetImmobilized(false);
|
||||||
m_ragdolledParameter.SetValue(false);
|
m_ragdolledParameter.SetValue(false);
|
||||||
if(BodySystem.isCalibratedAsFullBody)
|
if(BodySystem.isCalibratedAsFullBody)
|
||||||
|
@ -418,6 +416,7 @@ namespace ml_prm
|
||||||
|
|
||||||
m_lastPosition = PlayerSetup.Instance.transform.position;
|
m_lastPosition = PlayerSetup.Instance.transform.position;
|
||||||
m_velocity = Vector3.zero;
|
m_velocity = Vector3.zero;
|
||||||
|
m_downTime = float.MinValue;
|
||||||
|
|
||||||
m_enabled = false;
|
m_enabled = false;
|
||||||
}
|
}
|
||||||
|
@ -427,13 +426,6 @@ namespace ml_prm
|
||||||
|
|
||||||
public bool IsRagdolled() => (m_enabled && m_avatarReady);
|
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)
|
static Transform CloneTransform(Transform p_source, Transform p_parent, string p_name)
|
||||||
{
|
{
|
||||||
Transform l_target = new GameObject(p_name).transform;
|
Transform l_target = new GameObject(p_name).transform;
|
||||||
|
|
|
@ -6,23 +6,43 @@ namespace ml_prm
|
||||||
[DisallowMultipleComponent]
|
[DisallowMultipleComponent]
|
||||||
class RagdollTrigger : MonoBehaviour
|
class RagdollTrigger : MonoBehaviour
|
||||||
{
|
{
|
||||||
Collider m_lastCollider = null;
|
Collider m_collider = null;
|
||||||
|
Collider m_lastTrigger = null;
|
||||||
bool m_triggered = false;
|
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)
|
void OnTriggerEnter(Collider p_other)
|
||||||
{
|
{
|
||||||
CVRPointer l_pointer = p_other.gameObject.GetComponent<CVRPointer>();
|
CVRPointer l_pointer = p_other.GetComponent<CVRPointer>();
|
||||||
if((l_pointer != null) && (l_pointer.type == "ragdoll") && (m_lastCollider != p_other))
|
if((l_pointer != null) && (l_pointer.type == "ragdoll") && (m_lastTrigger != p_other))
|
||||||
{
|
{
|
||||||
m_lastCollider = p_other;
|
m_lastTrigger = p_other;
|
||||||
m_triggered = true;
|
m_triggered = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnTriggerExit(Collider p_other)
|
void OnTriggerExit(Collider p_other)
|
||||||
{
|
{
|
||||||
if(m_lastCollider == p_other)
|
if(m_lastTrigger == p_other)
|
||||||
m_lastCollider = null;
|
m_lastTrigger = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool GetStateWithReset()
|
public bool GetStateWithReset()
|
||||||
|
|
|
@ -133,7 +133,7 @@ namespace ml_prm
|
||||||
GravityChange?.Invoke(state);
|
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) =>
|
(ms_uiElements[(int)UiElementIndex.PointersReaction] as BTKUILib.UIObjects.Components.ToggleButton).OnValueUpdated += (state) =>
|
||||||
{
|
{
|
||||||
PointersReaction = state;
|
PointersReaction = state;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue