components/player_animator.cs

Component that updates a skinned model renderer's animation parameters based on the player's controller state. It reads ducking, aim and movement state each frame and broadcasts RPCs to set bool, float and Vector3 animator parameters on the renderer.

Networking
using Sandbox;

public class Player__Animator : Component
{
	[Property] public Player__Controller Player_Controller {get;set;}
	[Property] public SkinnedModelRenderer Model_Renderer {get;set;}
	
	string _ = "idle"; 
	
	protected override void OnUpdate()
	{ if (IsProxy) return;
		if (Player_Controller.IsDucking)
			Set_Float(Model_Renderer, "duck", 1);
		else Set_Float(Model_Renderer, "duck", 0);
		
		Set_Vector3(Model_Renderer, "aim_body", Player_Controller.Aim);
		Set_Vector3(Model_Renderer, "aim_head", Player_Controller.Aim);
		Set_Vector3(Model_Renderer, "aim_eyes", Player_Controller.Aim);
		
		if (_ == Player_Controller.State) return;
		_ = Player_Controller.State;
		
		if (_ == "jump" || _ == "fall")
		{Set_Bool(Model_Renderer, "b_grounded", false); return;}
		Set_Bool(Model_Renderer, "b_grounded", true);
		
		if (_ == "run")
		{Set_Float(Model_Renderer, "move_x", 200);
		Set_Float(Model_Renderer, "move_groundspeed", 200); return;}
		Set_Float(Model_Renderer, "move_x", 100); Set_Float(Model_Renderer, "move_groundspeed", 100);
		
		if (_ == "walk")
		{Set_Float(Model_Renderer, "move_x", 100);
		Set_Float(Model_Renderer, "move_groundspeed", 100); return;}
		Set_Float(Model_Renderer, "move_x", 0); Set_Float(Model_Renderer, "move_groundspeed", 0);
	}
	
	[Rpc.Broadcast]
	public void Set_Bool(SkinnedModelRenderer smr, string s, bool b)
	{smr.Set(s, b);}
	
	[Rpc.Broadcast]
	public void Set_Float(SkinnedModelRenderer smr, string s, float f)
	{smr.Set(s, f);}
	
	[Rpc.Broadcast]
	public void Set_Vector3(SkinnedModelRenderer smr, string s, Vector3 v)
	{smr.Set(s, v);}
}