swb_base/structures/AimInfo.cs
namespace SWB.Base;


/// <summary>
/// Describes effects of aiming with a weapon
/// Any value set to -1 implies "don't modify" or "use default"
/// </summary>
public class AimInfo
{
	/// <summary>
	/// Spread modifier to apply when Aiming Down Sights (ADS).
	/// </summary>
	[Property] public float SpreadModifier { get; set; } = 0.25f;

	/// <summary>
	/// Input sensitivity multiplier when aiming down sights (ADS). (lower is slower, 0 to disable)
	/// </summary>
	[Property] public float Sensitivity { get; set; } = 0.85f;

	/// <summary>
	/// FOV For the view model when aiming down sights.
	/// </summary>
	[Property, Group( "FOV" )] public float ViewModelFOV { get; set; } = -1f;

	/// <summary>
	/// FOV for the player camera when aiming down sights.
	/// </summary>
	[Property, Group( "FOV" )] public float PlayerFOV { get; set; } = -1f;

	/// <summary>
	/// FOV aim in speed
	/// </summary>
	[Property, Group( "FOV" ), Title( "Aim in FOV speed" )] public float AimInFOVSpeed { get; set; } = 1f;

	/// <summary>
	/// FOV aim out speed
	/// </summary>
	[Property, Group( "FOV" ), Title( "Aim out FOV speed" )] public float AimOutFOVSpeed { get; set; } = 1f;

	public AimInfo Clone()
	{
		// Can't use MemberwiseClone because of whitelist restrictions
		return new AimInfo()
		{
			SpreadModifier = SpreadModifier,
			Sensitivity = Sensitivity,
			ViewModelFOV = ViewModelFOV,
			PlayerFOV = PlayerFOV,
			AimInFOVSpeed = AimInFOVSpeed,
			AimOutFOVSpeed = AimOutFOVSpeed
		};
	}

	// Utility to fill unset values from a default AimInfo
	public void FillDefaults( AimInfo defaults )
	{
		if ( Sensitivity == -1 ) Sensitivity = defaults.Sensitivity;
		if ( ViewModelFOV == -1 ) ViewModelFOV = defaults.ViewModelFOV;
		if ( PlayerFOV == -1 ) PlayerFOV = defaults.PlayerFOV;
		if ( AimInFOVSpeed == -1 ) AimInFOVSpeed = defaults.AimInFOVSpeed;
		if ( AimOutFOVSpeed == -1 ) AimOutFOVSpeed = defaults.AimOutFOVSpeed;
		if ( SpreadModifier == -1 ) SpreadModifier = defaults.SpreadModifier;
	}
}