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