using Content.Shared.Damage.Prototypes; using Content.Shared.Damage.Systems; using Content.Shared.DisplacementMap; using Content.Shared.FixedPoint; using Content.Shared.Mobs; using Content.Shared.StatusIcon; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Damage.Components; /// /// Component that allows entities to take damage. /// /// /// The supported damage types are specified using a s. DamageContainers /// may also have resistances to certain damage types, defined via a . /// [RegisterComponent] [NetworkedComponent] [Access(typeof(DamageableSystem), Other = AccessPermissions.ReadExecute)] public sealed partial class DamageableComponent : Component { /// /// This will be applied to any damage that is dealt to this container, /// unless the damage explicitly ignores resistances. /// /// /// Though DamageModifierSets can be deserialized directly, we only want to use the prototype version here /// to reduce duplication. /// [DataField("damageModifierSet")] public ProtoId? DamageModifierSetId; /// /// All the damage information is stored in this . /// /// /// If this data-field is specified, this allows damageable components to be initialized with non-zero damage. /// [DataField] [Access(typeof(DamageableSystem), Other = AccessPermissions.None)] public DamageSpecifier Damage = new(); /// /// Damage, indexed by ID keys. /// /// /// Groups which have no members that are supported by this component will not be present in this /// dictionary. /// [ViewVariables] [Access(typeof(DamageableSystem), Other = AccessPermissions.None)] public Dictionary, FixedPoint2> DamagePerGroup = new(); /// /// The sum of all damages in the DamageableComponent. /// [ViewVariables] [Access(typeof(DamageableSystem), Other = AccessPermissions.None)] public FixedPoint2 TotalDamage; [DataField("radiationDamageTypes")] // ReSharper disable once UseCollectionExpression - Cannot refactor this as it's a potential sandbox violation. public List> RadiationDamageTypeIDs = new() { "Radiation" }; /// /// Sets the displacement map used for any of the DamageVisuals sprites for this entity. /// TODO: The entirety of DamageVisualsSystem needs to be rewritten. /// [DataField] public ProtoId? Displacement; } [Serializable, NetSerializable] public sealed class DamageableComponentState( DamageSpecifier damage, ProtoId? modifierSetId, ProtoId? displacement) : ComponentState { public readonly DamageSpecifier Damage = damage; public readonly ProtoId? ModifierSetId = modifierSetId; public readonly ProtoId? Displacement = displacement; }