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.
|
||||
* **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.
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue