using Robust.Shared.Audio; using Robust.Shared.GameStates; using Content.Shared.Inventory; namespace Content.Shared.Weapons.Reflect; /// /// Entities with this component have a chance to reflect projectiles and hitscan shots /// Uses ItemToggleComponent to control reflection. /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class ReflectComponent : Component { /// /// What we reflect. /// [ViewVariables(VVAccess.ReadWrite), DataField("reflects")] public ReflectType Reflects = ReflectType.Energy | ReflectType.NonEnergy; /// /// Select in which inventory slots it will reflect. /// By default, it will reflect in any inventory position, except pockets. /// [ViewVariables(VVAccess.ReadWrite), DataField] public SlotFlags SlotFlags = SlotFlags.WITHOUT_POCKET; /// /// Is it allowed to reflect while being in hands. /// [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public bool ReflectingInHands = true; /// /// Can only reflect when placed correctly. /// [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public bool InRightPlace = true; /// /// Probability for a projectile to be reflected. /// [DataField("reflectProb"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public float ReflectProb = 0.25f; [DataField("spread"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public Angle Spread = Angle.FromDegrees(45); [DataField("soundOnReflect")] public SoundSpecifier? SoundOnReflect = new SoundPathSpecifier("/Audio/Weapons/Guns/Hits/laser_sear_wall.ogg"); } [Flags] public enum ReflectType : byte { None = 0, NonEnergy = 1 << 0, Energy = 1 << 1, }