Player.cs
using Sandbox;

public sealed class Player : Component
{
	public static Player CurrentPlayer { get; private set; }

	[Property] public SkinnedModelRenderer Avatar { get; private set; }

	[RequireComponent] public HealthComponent Health { get; private set; }

	[RequireComponent] public PlayerInventory Inventory { get; private set; }

	protected override void OnStart()
	{
		if ( IsProxy )
		{
			RevealBody();
		}
		else
		{
			CurrentPlayer = this;
			HideBody( showShadows: false );
		}
	}

	protected override void OnDestroy()
	{
		if ( CurrentPlayer == this )
			CurrentPlayer = null;
	}

	public void HideBody( bool showShadows )
	{
		// Find all renderers (body + clothes)
		var renderers = Avatar.Components.GetAll<ModelRenderer>( FindMode.EverythingInSelfAndDescendants );

		foreach ( var renderer in renderers )
		{
			renderer.RenderType = showShadows ? ModelRenderer.ShadowRenderType.ShadowsOnly : ModelRenderer.ShadowRenderType.Off;
			renderer.RenderOptions.Game = false;
		}
	}

	public void RevealBody()
	{
		var renderers = Avatar.Components.GetAll<SkinnedModelRenderer>( FindMode.EverythingInSelfAndDescendants );

		foreach ( var renderer in renderers )
		{
			renderer.RenderType = ModelRenderer.ShadowRenderType.On;
			renderer.RenderOptions.Game = true;
		}
	}

	/// <summary>
	/// Create a ragdoll gameobject version of our render body.
	/// </summary>
	public GameObject CreateRagdoll(string name = "Ragdoll")
	{
		GameObject gameObject = new GameObject(enabled: true, name);
		gameObject.Tags.Add("ragdoll");
		gameObject.WorldTransform = base.WorldTransform;

		SkinnedModelRenderer skinnedModelRenderer2 = gameObject.Components.Create<SkinnedModelRenderer>();
		skinnedModelRenderer2.CopyFrom(Avatar);
		skinnedModelRenderer2.UseAnimGraph = false;
		foreach (SkinnedModelRenderer item in Avatar.GameObject.Children.SelectMany((GameObject x) => x.Components.GetAll<SkinnedModelRenderer>()))
		{
			if (item.IsValid())
			{
				SkinnedModelRenderer skinnedModelRenderer3 = new GameObject(enabled: true, item.GameObject.Name)
				{
					Parent = gameObject
				}.Components.Create<SkinnedModelRenderer>();
				skinnedModelRenderer3.CopyFrom(item);
				skinnedModelRenderer3.BoneMergeTarget = skinnedModelRenderer2;
			}
		}

		ModelPhysics modelPhysics = gameObject.Components.Create<ModelPhysics>();
		modelPhysics.Model = skinnedModelRenderer2.Model;
		modelPhysics.Renderer = skinnedModelRenderer2;
		modelPhysics.CopyBonesFrom(Avatar, teleport: true);
		return gameObject;
	}

	[ConCmd( "kill" )]
	public static void KillCommand()
	{
		CurrentPlayer.Health.TakeDamage( CurrentPlayer.Health.MaxHealth, Vector3.Zero, false );
	}
}