using System.Numerics; using Content.Server.Shuttles.Systems; using Content.Shared.Damage; using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Server.Shuttles.Components { [RegisterComponent, NetworkedComponent, AutoGenerateComponentPause] [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, ViewVariables(VVAccess.ReadWrite)] 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! [ViewVariables(VVAccess.ReadWrite), DataField("thrust")] public float Thrust = 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("damage")] public DamageSpecifier? Damage = new(); [DataField("requireSpace")] public bool RequireSpace = true; // Used for burns public List Colliding = new(); public bool Firing = false; /// /// How often thruster deals damage. /// [DataField] public TimeSpan FireCooldown = TimeSpan.FromSeconds(2); /// /// Next time we tick damage for anyone colliding. /// [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField] public TimeSpan NextFire = TimeSpan.Zero; } public enum ThrusterType { Linear, // Angular meaning rotational. Angular, } }