swb_base/attachments/types/SightAttachment.cs
namespace SWB.Base.Attachments;

public abstract class SightAttachment : Attachment
{
	public override string Name => "Sight";
	public override AttachmentCategory Category => AttachmentCategory.Sight;
	public override string Description => "An optical sight that allows the user to look through a partially reflecting glass element and see an illuminated projection of an aiming point or some other image superimposed on the field of view.";
	public override string[] Positives => new string[]
	{
		"Precision sight picture",
		"Increases accuracy by 5%"
	};

	public override string[] Negatives => new string[]
	{
	};

	public override StatsModifier StatsModifier { get; set; } = new()
	{
		Spread = -0.05f,
	};


	/// <summary>The new aim position offset</summary>
	[Property, Group( "Sight" )] public AngPos AimAnimData { get; set; }
	AngPos oldAimAnimData;

	/// <summary>Weapon FOV while aiming (-1 to use default)</summary>
	[Property, Group( "Sight" )] public virtual float AimFOV { get; set; } = -1f;
	float oldAimFOV;

	/// <summary>Player FOV while aiming (-1 to use default)</summary>
	[Property, Group( "Sight" )] public virtual float AimPlayerFOV { get; set; } = -1f;
	float oldAimPlayerFOV;

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

	/// <summary>FOV aim out speed (-1 to use default)</summary>
	[Property, Group( "Sight" ), Title( "Aim out FOV speed" )] public virtual float AimOutFOVSpeed { get; set; } = -1f;
	private float oldAimOutFOVSpeed;

	/// <summary>Mouse sensitivity while aiming (-1 to use default)</summary>
	[Property, Group( "Sight" )] public virtual float AimSensitivity { get; set; } = -1;
	float oldAimSensitivity;

	public override void OnEquip()
	{
		oldAimAnimData = Weapon.AimAnimData;
		oldAimFOV = Weapon.AimFOV;
		oldAimPlayerFOV = Weapon.AimPlayerFOV;
		oldAimInFOVSpeed = Weapon.AimInFOVSpeed;
		oldAimOutFOVSpeed = Weapon.AimOutFOVSpeed;
		oldAimSensitivity = Weapon.AimSensitivity;

		Weapon.AimAnimData = AimAnimData;

		if ( AimFOV > -1 ) Weapon.AimFOV = AimFOV;
		if ( AimPlayerFOV > -1 ) Weapon.AimPlayerFOV = AimPlayerFOV;
		if ( AimInFOVSpeed > -1 ) Weapon.AimInFOVSpeed = AimInFOVSpeed;
		if ( AimOutFOVSpeed > -1 ) Weapon.AimOutFOVSpeed = AimOutFOVSpeed;
		if ( AimSensitivity > -1 ) Weapon.AimSensitivity = AimSensitivity;
	}

	public override void OnUnequip()
	{
		Weapon.AimAnimData = oldAimAnimData;
		Weapon.AimFOV = oldAimFOV;
		Weapon.AimPlayerFOV = oldAimPlayerFOV;
		Weapon.AimInFOVSpeed = oldAimInFOVSpeed;
		Weapon.AimOutFOVSpeed = oldAimOutFOVSpeed;
		Weapon.AimSensitivity = oldAimSensitivity;
	}
}