PlayerRagdoll.cs

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.

Native Interop
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();
	}
}