World/SpawnDoor.cs

Component that animates a skinned model renderer up and down to act as a spawn door. It lerps the renderer's world Z position between a closed offset (0) and an open offset (ZOffset) based on the Open property.

using Sandbox;

namespace KOTH;

public sealed class SpawnDoor : Component
{
	[Property] public SkinnedModelRenderer ModelRenderer { get; set; }
	[Property] public bool Open { get; set; } = true;
	[Property] public float ZOffset { get; set; } = 156f;

	bool IsOpen = false;
	float TargetZOffset = 0f;
	float CurrentZOffset = 0f;

	float StartZ = 0f;
	protected override void OnStart()
	{
		base.OnStart();

		StartZ = ModelRenderer.WorldPosition.z;
	}

	protected override void OnFixedUpdate()
	{
		base.OnFixedUpdate();

		IsOpen = Open;

		if (IsOpen)
		{
			TargetZOffset = ZOffset;
		}
		else
		{
			TargetZOffset = 0;
		}

		if (!CurrentZOffset.AlmostEqual(TargetZOffset))
		{
			CurrentZOffset = MathX.Lerp(CurrentZOffset, TargetZOffset, 0.077f);
			ModelRenderer.WorldPosition = ModelRenderer.WorldPosition.WithZ(StartZ + CurrentZOffset);
		}
	}
}