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

namespace Opium;

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

	[Property] public Angles WindupAngles { get; set; }
	[Property] public Curve WindupCurve { get; set; }
	[Property] public Curve FOVCurve { get; set; }
	[Property] public float FOVOffset { get; set; } = 10;

	[Property] public Vector3 PositionOffset { get; set; }
	[Property] public float PositionOffsetTime { get; set; }
	[Property] public Curve PositionOffsetCurve { get; set; }

	[Property] public float RandomTime { get; set; } = 0.5f;
	public TimeUntil TimeUntilRandomStopped { get; set; }
	
	TimeUntil TimeUntilPositionOffset { get; set; }

	public bool Ping { get; set; }

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

		TimeUntilPositionOffset = PositionOffsetTime;
		TimeUntilRandomStopped = RandomTime;
	}

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

		Log.Info( "disabled" );
	}

	public override bool TickEffect()
	{
		Player.ExtraCamOffset = PositionOffset * PositionOffsetCurve.Evaluate( TimeUntilPositionOffset.Fraction );

		var delta = TimeUntilRandomStopped.Fraction;
		delta = Easing.EaseOut( delta );

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

		var rotation = Player.MainCamera.Transform.Rotation;
		Player.CameraPositionOffset += (rotation.Right * rand.x + rotation.Up * rand.y) * (1 - delta) * Size;

		var windupDelta = WindupCurve.Evaluate( Delta );

		Player.CameraRotationOffset *= Rotation.From( WindupAngles.pitch * windupDelta, WindupAngles.yaw * windupDelta, WindupAngles.roll * windupDelta ); ;

		Player.FieldOfViewOffset += FOVCurve.Evaluate( Delta ) * FOVOffset;

		return base.TickEffect();
	}
}