Fix of lagging player position when ragdolled

This commit is contained in:
SDraw 2024-10-30 18:42:47 +03:00
parent df46abbae4
commit b519a8ee5a
No known key found for this signature in database
GPG key ID: BB95B4DAB2BB8BB5
4 changed files with 31 additions and 29 deletions

View file

@ -10,6 +10,6 @@ Merged set of MelonLoader mods for ChilloutVR.
|[Leap Motion Extension](/ml_lme/README.md)| 1.6.0 [:arrow_down:](../../releases/latest/download/LeapMotionExtension.dll)| |[Leap Motion Extension](/ml_lme/README.md)| 1.6.0 [:arrow_down:](../../releases/latest/download/LeapMotionExtension.dll)|
|[Pickup Arm Movement](/ml_pam/README.md)|1.2.0 [:arrow_down:](../../releases/latest/download/PickupArmMovement.dll)| |[Pickup Arm Movement](/ml_pam/README.md)|1.2.0 [:arrow_down:](../../releases/latest/download/PickupArmMovement.dll)|
|[Player Movement Copycat](/ml_pmc/README.md)|1.1.0 [:arrow_down:](../../releases/latest/download/PlayerMovementCopycat.dll)| |[Player Movement Copycat](/ml_pmc/README.md)|1.1.0 [:arrow_down:](../../releases/latest/download/PlayerMovementCopycat.dll)|
|[Player Ragdoll Mod](/ml_prm/README.md)|1.2.0 [:arrow_down:](../../releases/latest/download/PlayerRagdollMod.dll)| |[Player Ragdoll Mod](/ml_prm/README.md)|1.2.1 [:arrow_down:](../../releases/latest/download/PlayerRagdollMod.dll)|
|[Players Instance Notifier](/ml_pin/README.md)|1.1.0 [:arrow_down:](../../releases/latest/download/PlayersInstanceNotifier.dll)| |[Players Instance Notifier](/ml_pin/README.md)|1.1.0 [:arrow_down:](../../releases/latest/download/PlayersInstanceNotifier.dll)|
|[Vive Extended Input](/ml_vei/README.md)|1.1.0 [:arrow_down:](../../releases/latest/download/ViveExtendedInput.dll)| |[Vive Extended Input](/ml_vei/README.md)|1.1.0 [:arrow_down:](../../releases/latest/download/ViveExtendedInput.dll)|

View file

@ -1,4 +1,4 @@
[assembly: MelonLoader.MelonInfo(typeof(ml_prm.PlayerRagdollMod), "PlayerRagdollMod", "1.2.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonInfo(typeof(ml_prm.PlayerRagdollMod), "PlayerRagdollMod", "1.2.1", "SDraw", "https://github.com/SDraw/ml_mods_cvr")]
[assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")]
[assembly: MelonLoader.MelonPriority(2)] [assembly: MelonLoader.MelonPriority(2)]
[assembly: MelonLoader.MelonAdditionalDependencies("BTKUILib")] [assembly: MelonLoader.MelonAdditionalDependencies("BTKUILib")]

View file

@ -225,30 +225,14 @@ namespace ml_prm
} }
} }
void FixedUpdate()
{
if(m_avatarReady && m_ragdolled)
{
Vector3 l_diff = m_puppetReferences.hips.position - m_lastRagdollPosition;
m_playerPlane.SetNormalAndPosition(PlayerSetup.Instance.transform.rotation * Vector3.up, PlayerSetup.Instance.transform.position);
PlayerSetup.Instance.transform.position += l_diff;
m_lastRagdollPosition = m_puppetReferences.hips.position;
// Project on plane and fix our position if we under previous plane
if(m_playerPlane.GetDistanceToPoint(m_lastRagdollPosition) < 0f)
m_playerPlane.Flip();
if(m_playerPlane.GetDistanceToPoint(PlayerSetup.Instance.transform.position) < 0f)
PlayerSetup.Instance.transform.position = m_playerPlane.ClosestPointOnPlane(PlayerSetup.Instance.transform.position);
}
}
void LateUpdate() void LateUpdate()
{ {
if(m_avatarReady) if(m_avatarReady)
{ {
if(m_ragdolled) if(m_ragdolled)
{ {
MovePlayer();
foreach(var l_link in m_boneLinks) foreach(var l_link in m_boneLinks)
l_link.Item1.CopyGlobal(l_link.Item2); l_link.Item1.CopyGlobal(l_link.Item2);
} }
@ -748,14 +732,6 @@ namespace ml_prm
} }
} }
static Transform CloneTransform(Transform p_source, Transform p_parent, string p_name)
{
Transform l_target = new GameObject(p_name).transform;
l_target.parent = p_parent;
p_source.CopyGlobal(l_target);
return l_target;
}
bool CanRagdoll() bool CanRagdoll()
{ {
if(WorldManager.IsRestrictedWorld()) if(WorldManager.IsRestrictedWorld())
@ -774,6 +750,23 @@ namespace ml_prm
return (l_result || m_forcedSwitch); return (l_result || m_forcedSwitch);
} }
void MovePlayer()
{
// Pain
Vector3 l_up = PlayerSetup.Instance.transform.rotation * Vector3.up;
Vector3 l_diff = m_puppetReferences.hips.position - m_lastRagdollPosition;
m_playerPlane.SetNormalAndPosition(l_up, PlayerSetup.Instance.transform.position);
PlayerSetup.Instance.transform.position += l_diff;
m_lastRagdollPosition = m_puppetReferences.hips.position;
// Try to tether player position closer to hips rigid body position
if(m_playerPlane.GetDistanceToPoint(m_lastRagdollPosition) < 0f)
m_playerPlane.SetNormalAndPosition(l_up, m_lastRagdollPosition);
if(m_playerPlane.GetDistanceToPoint(PlayerSetup.Instance.transform.position) < 0f)
PlayerSetup.Instance.transform.position = m_playerPlane.ClosestPointOnPlane(PlayerSetup.Instance.transform.position);
}
static void TryRestoreMovement() static void TryRestoreMovement()
{ {
bool l_state = true; bool l_state = true;
@ -783,5 +776,14 @@ namespace ml_prm
if(l_state) if(l_state)
BetterBetterCharacterController.Instance.SetImmobilized(false); BetterBetterCharacterController.Instance.SetImmobilized(false);
} }
static Transform CloneTransform(Transform p_source, Transform p_parent, string p_name)
{
Transform l_target = new GameObject(p_name).transform;
l_target.parent = p_parent;
p_source.CopyGlobal(l_target);
return l_target;
}
} }
} }

View file

@ -4,7 +4,7 @@
<TargetFramework>netstandard2.1</TargetFramework> <TargetFramework>netstandard2.1</TargetFramework>
<Platforms>x64</Platforms> <Platforms>x64</Platforms>
<PackageId>PlayerRagdollMod</PackageId> <PackageId>PlayerRagdollMod</PackageId>
<Version>1.2.0</Version> <Version>1.2.1</Version>
<Authors>SDraw</Authors> <Authors>SDraw</Authors>
<Company>SDraw</Company> <Company>SDraw</Company>
<Product>PlayerRagdollMod</Product> <Product>PlayerRagdollMod</Product>