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 );
}
}