using System.Numerics; using Content.Server.Shuttles.Systems; using Content.Shared.Construction.Prototypes; using Content.Shared.Damage; using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Shuttles.Components { [RegisterComponent, NetworkedComponent] [Access(typeof(ThrusterSystem))] public sealed partial class ThrusterComponent : Component { /// /// Whether the thruster has been force to be enabled / disabled (e.g. VV, interaction, etc.) /// [DataField] public bool Enabled { get; set; } = true; /// /// This determines whether the thruster is actually enabled for the purposes of thrust /// public bool IsOn; // Need to serialize this because RefreshParts isn't called on Init and this will break post-mapinit maps! [DataField] public float Thrust = 100f; [DataField] public float BaseThrust = 100f; [DataField("thrusterType")] public ThrusterType Type = ThrusterType.Linear; [DataField("burnShape")] public List BurnPoly = new() { new Vector2(-0.4f, 0.5f), new Vector2(-0.1f, 1.2f), new Vector2(0.1f, 1.2f), new Vector2(0.4f, 0.5f) }; /// /// How much damage is done per second to anything colliding with our thrust. /// [DataField] public DamageSpecifier? Damage = new(); [DataField] public bool RequireSpace = true; // Used for burns public List Colliding = new(); public bool Firing; /// /// Next time we tick damage for anyone colliding. /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] public TimeSpan NextFire; [DataField(customTypeSerializer: typeof(PrototypeIdSerializer))] public string MachinePartThrust = "Capacitor"; [DataField] public float PartRatingThrustMultiplier = 1.5f; } public enum ThrusterType { Linear, // Angular meaning rotational. Angular, } }