2024-10-30 13:15:49 +03:00
|
|
|
using Sandbox.Utils;
|
|
|
|
public sealed class RagdollController : Component
|
|
|
|
{
|
|
|
|
[Group("Setup"), Order(-100), Property] public ModelPhysics bodyPhysics { get; set; }
|
|
|
|
[Group("Setup"), Order(-100), Property] public SkinnedModelRenderer bodyRenderer { get; set; }
|
|
|
|
[Group("Config"), Order(0), Property] public bool isLocked { get; set; }
|
|
|
|
|
2024-10-30 13:33:29 +03:00
|
|
|
[Sync]
|
2024-10-30 19:01:58 +03:00
|
|
|
public new bool Enabled
|
2024-10-30 13:15:49 +03:00
|
|
|
{
|
2024-10-30 13:33:29 +03:00
|
|
|
get => bodyPhysics.Enabled;
|
2024-10-30 14:10:44 +03:00
|
|
|
private set
|
2024-10-30 13:33:29 +03:00
|
|
|
{
|
|
|
|
bodyPhysics.Enabled = value;
|
|
|
|
bodyPhysics.MotionEnabled = value;
|
|
|
|
bodyRenderer.UseAnimGraph = !value;
|
2024-10-30 14:10:44 +03:00
|
|
|
|
|
|
|
if ( !value )
|
|
|
|
{
|
|
|
|
GameObject.WorldPosition = bodyRenderer.WorldPosition;
|
|
|
|
bodyRenderer.GameObject.LocalPosition = Vector3.Zero;
|
|
|
|
}
|
2024-10-30 13:15:49 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override void OnUpdate()
|
|
|
|
{
|
|
|
|
if ( Network.IsOwner )
|
|
|
|
{
|
2024-10-30 13:33:29 +03:00
|
|
|
if (Input.Pressed( "Ragdoll" ))
|
2024-10-30 13:15:49 +03:00
|
|
|
{
|
2024-10-30 13:33:29 +03:00
|
|
|
Enabled = !Enabled;
|
2024-10-30 13:15:49 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-10-30 14:10:44 +03:00
|
|
|
var bodyLock = new PhysicsLock();
|
|
|
|
bodyLock.Pitch = isLocked;
|
|
|
|
bodyLock.Yaw = isLocked;
|
|
|
|
bodyLock.Roll = isLocked;
|
|
|
|
bodyLock.X = isLocked;
|
|
|
|
bodyLock.Y = isLocked;
|
|
|
|
bodyLock.Z = isLocked;
|
2024-10-30 13:15:49 +03:00
|
|
|
|
2024-10-30 14:10:44 +03:00
|
|
|
bodyPhysics.Locking = bodyLock;
|
|
|
|
bodyPhysics.MotionEnabled = !isLocked;
|
2024-10-30 13:15:49 +03:00
|
|
|
}
|
|
|
|
}
|