using Content.Shared.Actions.ActionTypes; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Map; namespace Content.Shared.Weapons.Ranged.Components; [RegisterComponent, NetworkedComponent, Virtual] public class GunComponent : Component { #region Sound [ViewVariables(VVAccess.ReadWrite), DataField("soundGunshot")] public SoundSpecifier? SoundGunshot = new SoundPathSpecifier("/Audio/Weapons/Guns/Gunshots/smg.ogg"); [ViewVariables(VVAccess.ReadWrite), DataField("soundEmpty")] public SoundSpecifier? SoundEmpty = new SoundPathSpecifier("/Audio/Weapons/Guns/Empty/empty.ogg"); /// /// Sound played when toggling the for this gun. /// [ViewVariables(VVAccess.ReadWrite), DataField("soundMode")] public SoundSpecifier? SoundModeToggle = new SoundPathSpecifier("/Audio/Weapons/Guns/Misc/selector.ogg"); #endregion #region Recoil // These values are very small for now until we get a debug overlay and fine tune it /// /// Last time the gun fired. /// Used for recoil purposes. /// [ViewVariables, DataField("lastFire")] public TimeSpan LastFire = TimeSpan.Zero; /// /// What the current spread is for shooting. This gets changed every time the gun fires. /// [ViewVariables, DataField("currentAngle")] public Angle CurrentAngle; /// /// How much the spread increases every time the gun fires. /// [ViewVariables(VVAccess.ReadWrite), DataField("angleIncrease")] public Angle AngleIncrease = Angle.FromDegrees(0.5); /// /// How much the decreases per second. /// [ViewVariables, DataField("angleDecay")] public Angle AngleDecay = Angle.FromDegrees(4); /// /// The maximum angle allowed for /// [ViewVariables(VVAccess.ReadWrite), DataField("maxAngle")] public Angle MaxAngle = Angle.FromDegrees(2); /// /// The minimum angle allowed for /// [ViewVariables(VVAccess.ReadWrite), DataField("minAngle")] public Angle MinAngle = Angle.FromDegrees(1); #endregion /// /// Where the gun is being requested to shoot. /// [ViewVariables] public EntityCoordinates? ShootCoordinates = null; /// /// Used for tracking semi-auto / burst /// [ViewVariables] public int ShotCounter = 0; /// /// How many times it shoots per second. /// [ViewVariables(VVAccess.ReadWrite), DataField("fireRate")] public float FireRate = 8f; /// /// When the gun is next available to be shot. /// Can be set multiple times in a single tick due to guns firing faster than a single tick time. /// [ViewVariables, DataField("nextFire")] public TimeSpan NextFire = TimeSpan.Zero; /// /// What firemodes can be selected. /// [ViewVariables(VVAccess.ReadWrite), DataField("availableModes")] public SelectiveFire AvailableModes = SelectiveFire.SemiAuto; /// /// What firemode is currently selected. /// [ViewVariables(VVAccess.ReadWrite), DataField("selectedMode")] public SelectiveFire SelectedMode = SelectiveFire.SemiAuto; [DataField("selectModeAction")] public InstantAction? SelectModeAction; } [Flags] public enum SelectiveFire : byte { Invalid = 0, // Combat mode already functions as the equivalent of Safety SemiAuto = 1 << 0, Burst = 1 << 1, FullAuto = 1 << 2, // Not in the building! }