| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- using Content.Shared.Alert;
- using Robust.Shared.GameStates;
- using Robust.Shared.Prototypes;
- using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
- namespace Content.Shared.Damage.Components;
- /// <summary>
- /// Add to an entity to paralyze it whenever it reaches critical amounts of Stamina DamageType.
- /// </summary>
- [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), AutoGenerateComponentPause]
- public sealed partial class StaminaComponent : Component
- {
- /// <summary>
- /// Have we reached peak stamina damage and been paralyzed?
- /// </summary>
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
- public bool Critical;
- /// <summary>
- /// How much stamina reduces per second.
- /// </summary>
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
- public float Decay = 3f;
- [DataField, AutoNetworkedField]
- public float DecayModifier = 1f; // stalker-changes
- /// <summary>
- /// How much time after receiving damage until stamina starts decreasing.
- /// </summary>
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
- public float Cooldown = 3f;
- /// <summary>
- /// How much stamina damage this entity has taken.
- /// </summary>
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
- public float StaminaDamage;
- /// <summary>
- /// How much stamina damage is required to entire stam crit.
- /// </summary>
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
- public float CritThreshold = 100f;
- [DataField, AutoNetworkedField]
- public float CritThresholdModifier = 1f; // stalker-changes
- /// <summary>
- /// A dictionary of active stamina drains, with the key being the source of the drain,
- /// DrainRate how much it changes per tick, and ModifiesSpeed if it should slow down the user.
- /// </summary>
- [DataField, AutoNetworkedField]
- public Dictionary<EntityUid, (float DrainRate, bool ModifiesSpeed)> ActiveDrains = new();
- /// <summary>
- /// How long will this mob be stunned for?
- /// </summary>
- [ViewVariables(VVAccess.ReadWrite), DataField]
- public TimeSpan StunTime = TimeSpan.FromSeconds(6);
- /// <summary>
- /// To avoid continuously updating our data we track the last time we updated so we can extrapolate our current stamina.
- /// </summary>
- [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField]
- [AutoPausedField]
- public TimeSpan NextUpdate = TimeSpan.Zero;
- [DataField]
- public ProtoId<AlertPrototype> StaminaAlert = "Stamina";
- // stalker-changes-start
- /// <summary>
- /// How much stamina damage is required to entire stam crit.
- /// </summary>
- [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField]
- public float SlowdownThreshold = 50f; // CritThreshold / 2
- // stalker-changes-end
- /// <summary>
- /// When the last "gasp" message was sent
- /// </summary>
- [DataField("lastMessageTime"), AutoNetworkedField, ViewVariables(VVAccess.ReadWrite)]
- public TimeSpan LastMessageTime { get; set; } = TimeSpan.Zero;
- }
|