DemoAttachments.cs
using SWB.Base;
using SWB.Base.Attachments;

namespace SWB.Demo;

/*
 * Almost all attachment properties can be edited from the scene inspector.
 * For ease of reusability I opted to initialize most properties by code but you don't have to
 */

[Title( "Reflex Sight" )]
public class ReflexSightBG : SightAttachment
{
	public override string Name => "Walther MRS Reflex";
	public override string IconPath => "attachments/swb/sight/reflex/ui/icon.png";
	public override string BodyGroup { get; set; } = "sight";
	public override int BodyGroupChoice { get; set; } = 1;
	public override int BodyGroupDefault { get; set; } = 0;

	[Property]
	public override AimInfo AimInfo { get; set; } = new AimInfo()
	{
		SpreadModifier = -1f,
		AimInFOVSpeed = -1f,
		AimOutFOVSpeed = -1f,
		Sensitivity = 0.5f,
		PlayerFOV = 50f,
	};
}

[Title( "Hunter Scope" )]
public class HunterScope2DBG : Scope2DAttachment
{
	public override string Name => "Hunter Scope x12";
	public override string IconPath => "attachments/swb/sight/scope_hunter/ui/icon.png";
	public override string BodyGroup { get; set; } = "sight";
	public override int BodyGroupChoice { get; set; } = 2;
	public override int BodyGroupDefault { get; set; } = 0;

	[Property]
	public override ScopeInfo ScopeInfo { get; set; } = new()
	{
		LensTexture = "materials/swb/scopes/swb_lens_hunter.png",
		ScopeTexture = "materials/swb/scopes/swb_scope_hunter.png",
		ScopeInDelay = 0.2f,
		ScopeInSound = ResourceLibrary.Get<SoundEvent>( "sounds/swb/scope/swb_sniper.zoom_in.sound" ),
		FOV = 8f,
		Sensitivity = 0.25f,
		Spread = 0f,
	};
}

[Title( "Silencer (sniper)" )]
public class SniperSilencerBG : SilencerAttachment
{
	public override string Name => "ATS5 Silencer";
	public override string IconPath => "attachments/swb/muzzle/silencer_sniper/ui/icon.png";
	public override string BodyGroup { get; set; } = "muzzle";
	public override int BodyGroupChoice { get; set; } = 1;
	public override int BodyGroupDefault { get; set; } = 0;

	// Silencer
	public override PrefabScene MuzzleFlashParticle { get; set; } = SceneUtility.GetPrefabScene( ResourceLibrary.Get<PrefabFile>( "prefabs/particles/muzzle/muzzleflash.prefab" ) );
	[Property, Group( "Silencer" )] public override SoundEvent ShootSound { get; set; } = ResourceLibrary.Get<SoundEvent>( "sounds/swb/attachments/silencer/swb_sniper.silenced.fire.sound" );
}

[Title( "Silencer (rifle)" )]
public class RifleSilencerBG : SniperSilencerBG
{
	public override string Name => "ATS4 Silencer";
	public override string IconPath => "attachments/swb/muzzle/silencer_rifle/ui/icon.png";
}

[Title( "Silencer (shotgun)" )]
public class ShotgunSilencerBG : SniperSilencerBG
{
	public override string Name => "Salvo 12G Silencer";
	public override string IconPath => "attachments/swb/muzzle/silencer_shotgun/ui/icon.png";
}

[Title( "Silencer (pistol)" )]
public class PistolSilencerBG : SniperSilencerBG
{
	public override string Name => "SR8 Silencer";
	public override string IconPath => "attachments/swb/muzzle/silencer_pistol/ui/icon.png";
}

[Title( "Medium Laser" )]
public class RifleLaserBG : LaserAttachment
{
	public override string Name => "PEQ-15 Laser";
	public override string IconPath => "attachments/swb/tactical/laser_rifle/ui/icon.png";
	public override string BodyGroup { get; set; } = "laser";
	public override int BodyGroupChoice { get; set; } = 1;
	public override int BodyGroupDefault { get; set; } = 0;
}

[Title( "Rail (sniper)" )]
public class SniperRailBG : RailAttachment
{
	public override string Name => "UTG Quad-Rail";
	public override string IconPath => "attachments/swb/rail/rail_quad/ui/icon.png";
	public override string BodyGroup { get; set; } = "rail";
	public override int BodyGroupChoice { get; set; } = 1;
	public override int BodyGroupDefault { get; set; } = 0;
}

[Title( "Rail (pistol)" )]
public class PistolRailBG : RailAttachment
{
	public override string Name => "UTG Single-Rail";
	public override string IconPath => "attachments/swb/rail/rail_single/ui/icon.png";
	public override string BodyGroup { get; set; } = "rail";
	public override int BodyGroupChoice { get; set; } = 1;
	public override int BodyGroupDefault { get; set; } = 0;
}