Map/TriggerPush.cs
[Category( "Gameplay" ), Icon( "compare_arrows" ), EditorHandle( Icon = "🌠" )]
public sealed class TriggerPush : Component, Component.ITriggerListener
{
	[Property] Vector3 Direction { get; set; } = Vector3.Up;
	[Property] float Power { get; set; } = 20.0f;

	[Property]
	List<GameObject> Objects = new();

	protected override void DrawGizmos()
	{
		Gizmo.Draw.Arrow( 0, Direction * 50 );
	}

	protected override void OnFixedUpdate()
	{
		if ( Objects is null )
			return;

		foreach ( var obj in Objects )
		{
			var plycomp = obj.Components.Get<Player>();
			var cc = obj.Components.Get<Rigidbody>( FindMode.EverythingInSelfAndParent );

			if(plycomp.IsValid())
				plycomp.Controller.PreventGrounding( 0.1f );

			if ( !cc.IsValid() )
			{
				Objects.Remove( obj );
				return;
			}

			cc.Velocity += Direction * Power;
		}
	}

	void ITriggerListener.OnTriggerEnter( Collider other )
	{
		if ( other.GameObject.Components.Get<Rigidbody>(FindMode.EverythingInSelfAndParent).IsValid())
		{
			var obj = other.GameObject.Root;
			Objects.Add( obj );
		}
	}

	void ITriggerListener.OnTriggerExit( Collider other )
	{
		if ( other.GameObject.Components.Get<Rigidbody>( FindMode.EverythingInSelfAndParent ).IsValid() )
		{
			var obj = other.GameObject.Root;
			Objects.Remove( obj );
		}
	}
}