Park/Buildings/SlotMarker.cs
namespace HC3;

public class SlotMarker : Component, Component.ExecuteInEditor
{
	[Property, ReadOnly] public Guest Contents { get; private set; }

	private Vector3 ExitPosition;

	public bool IsFree() => !Contents.IsValid();

	public void LoadIn( Guest guest )
	{
		if ( Contents.IsValid() )
		{
			Contents.GameObject.SetParent( null, true );

			Contents.WorldPosition = ExitPosition;
			Contents.Transform.ClearInterpolation();
		}

		Contents = guest;

		if ( guest.IsValid() )
		{
			var scale = guest.WorldScale;

			ExitPosition = Contents.WorldPosition;
			Contents.GameObject.SetParent( GameObject, false );

			Contents.LocalTransform = global::Transform.Zero;
			Contents.Transform.ClearInterpolation();

			Contents.WorldScale = scale;
		}
	}

	private SkinnedModelRenderer _hintRenderer;

	private void CreateHint()
	{
		if ( Game.IsPlaying )
			return;

		if ( _hintRenderer.IsValid() )
			ClearHint();

		var go = new GameObject( GameObject );
		go.Flags |= GameObjectFlags.Hidden | GameObjectFlags.NotSaved | GameObjectFlags.Absolute;

		_hintRenderer = go.AddComponent<SkinnedModelRenderer>();
		_hintRenderer.Model = Model.Load( "models/characters/visitors/visitor.vmdl" );
		_hintRenderer.WorldScale = 0.15f;
		_hintRenderer.Tint = _hintRenderer.Tint.WithAlpha( 0.4f );

		_hintRenderer.UseAnimGraph = false;
		_hintRenderer.Sequence.Name = "SitPose_Default";

		UpdateHint();
	}

	void UpdateHint()
	{
		_hintRenderer.WorldPosition = WorldPosition;
		_hintRenderer.WorldRotation = WorldRotation;

	}

	private void ClearHint()
	{
		if ( _hintRenderer.IsValid() )
			_hintRenderer.DestroyGameObject();

		_hintRenderer = null;
	}

	protected override void OnEnabled()
	{
		CreateHint();
	}

	protected override void OnDisabled()
	{
		ClearHint();
	}

	protected override void OnUpdate()
	{
		if ( _hintRenderer.IsValid() )
		{
			UpdateHint();
		}
	}
}