World/IdleAnimator.cs

Component that sets up an idle weapon and drives an animator parameter. On start it clones a weapon prefab into a specified hold object, obtains its Equipment component and calls UpdateRenderMode after a short delay. On physics ticks it sets the SkinnedModelRenderer parameter "idle_type" to the configured IdleType value.

namespace KOTH;

public enum IdleType
{
	Default,
	WithRifle,
	WithKnife,
	WithPistol,
	Sitting,
	Leaning
}

public sealed class IdleAnimator : Component
{
	[Property] public SkinnedModelRenderer Renderer { get; set; }
	[Property] public GameObject WeaponPrefab { get; set; }
	[Property] public GameObject HoldObject { get; set; }
	[Property] public IdleType IdleType { get; set; }

	async void AsyncOn(Equipment eq)
	{
		await GameTask.DelaySeconds(0.05f);
		eq.UpdateRenderMode(true);
	}

	protected override void OnStart()
	{
		var inst = WeaponPrefab?.Clone(new CloneConfig()
		{
			StartEnabled = true,
			Parent = HoldObject,
			Transform = new Transform(),
		});
		var eq = inst.Components.Get<Equipment>(FindMode.EverythingInSelfAndDescendants);
		AsyncOn(eq);
	}

	protected override void OnFixedUpdate()
	{
		if (Renderer.IsValid())
		{
			Renderer.Set("idle_type", (int)IdleType);
		}
	}
}