using Content.Shared.NPC.Prototypes; using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Dragon { [RegisterComponent] public sealed partial class DragonComponent : Component { /// /// If we have active rifts. /// [DataField("rifts")] public List Rifts = new(); public bool Weakened => WeakenedAccumulator > 0f; /// /// When any rift is destroyed how long is the dragon weakened for /// [ViewVariables(VVAccess.ReadWrite), DataField("weakenedDuration")] public float WeakenedDuration = 120f; /// /// Has a rift been destroyed and the dragon in a temporary weakened state? /// [ViewVariables(VVAccess.ReadWrite), DataField("weakenedAccumulator")] public float WeakenedAccumulator = 0f; [ViewVariables(VVAccess.ReadWrite), DataField("riftAccumulator")] public float RiftAccumulator = 0f; /// /// Maximum time the dragon can go without spawning a rift before they die. /// [ViewVariables(VVAccess.ReadWrite), DataField("maxAccumulator")] public float RiftMaxAccumulator = 300f; [DataField("spawnRiftAction", customTypeSerializer: typeof(PrototypeIdSerializer))] public string SpawnRiftAction = "ActionSpawnRift"; /// /// Spawns a rift which can summon more mobs. /// [DataField("spawnRiftActionEntity")] public EntityUid? SpawnRiftActionEntity; [ViewVariables(VVAccess.ReadWrite), DataField("riftPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string RiftPrototype = "CarpRift"; [ViewVariables(VVAccess.ReadWrite), DataField("soundDeath")] public SoundSpecifier? SoundDeath = new SoundPathSpecifier("/Audio/Animals/space_dragon_roar.ogg"); [ViewVariables(VVAccess.ReadWrite), DataField("soundRoar")] public SoundSpecifier? SoundRoar = new SoundPathSpecifier("/Audio/Animals/space_dragon_roar.ogg") { Params = AudioParams.Default.WithVolume(3f), }; /// /// NPC faction to re-add after being zombified. /// Prevents zombie dragon from being attacked by its own carp. /// [DataField] public ProtoId Faction = "Dragon"; } }