Example/Complex/PlayerWalkControllerComplex.cs
using Sandbox;
namespace XMovement;

public partial class PlayerWalkControllerComplex : Component
{
	[RequireComponent] public PlayerMovement Controller { get; set; }

	[Button( "Setup Template/Apply Changes" )]
	public void SetupTemplate()
	{
		SetupBody();
		SetupHead();
		SetupCamera();
		SetupVR();
	}

	protected override void OnStart()
	{
		base.OnStart();
		if ( !IsProxy )
		{
			SetupBody();
			SetupHead();
			SetupCamera();
			SetupVR();
		}
	}

	protected override void OnUpdate()
	{
		base.OnUpdate();
		if ( !Game.IsPlaying ) return;

		if ( !UseSceneCamera )
			Camera.Enabled = !IsProxy;

		if ( !IsProxy )
			UpdateCamera();

		DoEyeLook();

		if ( !IsProxy )
		{
			BuildFrameInput();
			DoUsing();
			if ( Controller.MovementFrequency == PlayerMovement.MovementFrequencyMode.PerUpdate ) DoMovement();
		}
		Animate();
	}

	protected override void OnFixedUpdate()
	{
		base.OnFixedUpdate();
		if ( !Game.IsPlaying ) return;

		if ( !IsProxy )
		{
			UpdateCrouching();
			if ( Controller.MovementFrequency == PlayerMovement.MovementFrequencyMode.PerFixedUpdate ) DoMovement();
		}
		Animate();

		// HACK: For shitty networking purposes do this per FixedUpdate, we cant do this on start because new players wont ever fucking run that on join, nor any other function.
		UpdateBodyVisibility();
	}
}