using System; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Shared.Serialization; namespace Content.Shared.GameObjects.Components.Weapons.Ranged { public abstract class SharedRangedWeaponComponent : Component { // Each RangedWeapon should have a RangedWeapon component + // some kind of RangedBarrelComponent (this dictates what ammo is retrieved). public override string Name => "RangedWeapon"; public override uint? NetID => ContentNetIDs.RANGED_WEAPON; } [Serializable, NetSerializable] public sealed class RangedWeaponComponentState : ComponentState { public FireRateSelector FireRateSelector { get; } public RangedWeaponComponentState( FireRateSelector fireRateSelector ) : base(ContentNetIDs.RANGED_WEAPON) { FireRateSelector = fireRateSelector; } } /// /// A component message raised when the weapon is fired at a position on the map. /// [Serializable, NetSerializable] public sealed class FirePosComponentMessage : ComponentMessage { /// /// If this is not invalid, the target position is relative to the grid. /// Otherwise, it is a map position. /// public GridId TargetGrid { get; } /// /// If Target Grid is not invalid, this is relative to the grid, otherwise /// it is a map position. /// public Vector2 TargetPosition { get; } /// /// Constructs a new instance of . /// /// The grid that the target position is on, if any. /// Target position relative to the grid, or a map position if the grid is invalid. public FirePosComponentMessage(GridId targetGrid, Vector2 targetPosition) { TargetGrid = targetGrid; TargetPosition = targetPosition; } } }