Weapons/Base/Effects/MeleeHitEffect.cs
using Sandbox.Utility;

namespace Opium;

public partial class MeleeHitEffect : WeaponEffect
{
	[Property] public float Speed = 1.0f;
	[Property] public float Size = 1.0f;

	bool HasPassedDelay = false;
	[Property] public float Delay { get; set; } = 0f;

	async void AsyncDelay()
	{
		await GameTask.DelaySeconds( Delay );
		HasPassedDelay = true;
		TimeUntilDestroy = DestroyTime;
	}

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

		if ( Delay > 0f )
		{
			AsyncDelay();
		}
	}

	public override bool TickEffect()
	{
		var delta = Delta;
		delta = Easing.EaseOut( delta );


		Vector3 rand = Vector3.Random;
		rand.z = 0;
		rand = rand.Normal;

		if ( Player is not null )
		{
			var rotation = Player.MainCamera.Transform.Rotation;
			Player.CameraPositionOffset += (rotation.Right * rand.x + rotation.Up * rand.y) * (1 - delta) * Size;
		}

		if ( Delay > 0f && !HasPassedDelay )
		{
			return false;
		}

		return base.TickEffect();
	}
}