Component that spawns a player ragdoll GameObject using the model from a SkinnedModelRenderer, sets up renderer and physics, applies an impulse, and destroys the ragdoll after a delay.
using Sandbox;
public sealed class PlayerRagdoll : Component
{
[Property] public SkinnedModelRenderer BodyRenderer { get; set; }
public void SpawnRagdoll( Vector3 impulse )
{
var model = BodyRenderer?.Model;
if ( model == null ) return;
var ragdoll = new GameObject( true, "player_ragdoll" );
ragdoll.Transform.World = Transform.World;
var mr = ragdoll.Components.Create<SkinnedModelRenderer>();
mr.Model = model;
var physics = ragdoll.Components.Create<ModelPhysics>();
physics.Model = model;
var physicsGroup = ragdoll.Components.Get<Rigidbody>();
if ( physicsGroup.IsValid() && impulse.Length > 0f )
{
physicsGroup.ApplyImpulse( impulse );
}
DestroyAfterDelay( ragdoll, 5f );
}
private async void DestroyAfterDelay( GameObject target, float seconds )
{
await Task.DelaySeconds( seconds );
if ( target.IsValid() ) target.Destroy();
}
}