diff --git a/Content.Server/_Sunrise/Paws/PawsComponent.cs b/Content.Server/_Sunrise/Paws/PawsComponent.cs new file mode 100644 index 00000000000..f96d3ce06af --- /dev/null +++ b/Content.Server/_Sunrise/Paws/PawsComponent.cs @@ -0,0 +1,33 @@ +using Content.Shared.FixedPoint; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Server.Sunrise.Paws +{ + [RegisterComponent] + public sealed partial class PawsComponent : Component + { + [ViewVariables(VVAccess.ReadWrite)] + [DataField("screamInterval")] + public float ScreamInterval = 3; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("coughInterval")] + public float CoughInterval = 5; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("thresholdDamage")] + public FixedPoint2 ThresholdDamage = 5; + + public List<string> EmotesTakeDamage = new() + { + "Scream", + "Crying" + }; + + [DataField("nextChargeTime", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] + public TimeSpan NextScreamTime = TimeSpan.FromSeconds(0); + + [DataField("nextCoughTime", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] + public TimeSpan NextCoughTime = TimeSpan.FromSeconds(0); + } +} diff --git a/Content.Server/_Sunrise/Paws/PawsSystem.cs b/Content.Server/_Sunrise/Paws/PawsSystem.cs new file mode 100644 index 00000000000..304d3e9608c --- /dev/null +++ b/Content.Server/_Sunrise/Paws/PawsSystem.cs @@ -0,0 +1,70 @@ +using Content.Server.Chat.Systems; +using Content.Shared.Damage; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Robust.Shared.Random; +using Robust.Shared.Timing; + +namespace Content.Server.Sunrise.Paws +{ + public sealed class PawsSystem : EntitySystem + { + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ChatSystem _chatSystem = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() + { + base.Initialize(); + // SubscribeLocalEvent<PawsComponent, MobStateChangedEvent>(OnMobStateChanged); + SubscribeLocalEvent<PawsComponent, DamageChangedEvent>(OnDamaged); + } + + // private void OnMobStateChanged(EntityUid uid, PawsComponent component, MobStateChangedEvent args) + // { + // if (args.NewMobState == MobState.Dead) + // _audioSystem.PlayPvs(component.DeadSound, uid, component.DeadSound.Params); + // } + + private void OnDamaged(EntityUid uid, PawsComponent component, DamageChangedEvent args) + { + if (!_mobStateSystem.IsAlive(uid)) + return; + + if (!args.DamageIncreased) + return; + + var curTime = _timing.CurTime; + + if (curTime < component.NextScreamTime) + return; + + if (args.DamageDelta!.GetTotal() < component.ThresholdDamage) + return; + + component.NextScreamTime = curTime + TimeSpan.FromSeconds(component.ScreamInterval); + _chatSystem.TryEmoteWithChat(uid, _random.Pick(component.EmotesTakeDamage)); + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + var curTime = _timing.CurTime; + + var query = EntityQueryEnumerator<PawsComponent, MobStateComponent>(); + while (query.MoveNext(out var uid, out var comp, out var state)) + { + if (state.CurrentState != MobState.Critical) + continue; + + if (curTime < comp.NextCoughTime) + return; + + comp.NextCoughTime = curTime + TimeSpan.FromSeconds(comp.CoughInterval); + _chatSystem.TryEmoteWithChat(uid, "Cough", ignoreActionBlocker: true); + } + } + } +} diff --git a/Resources/Changelog/ChangelogSunrise.yml b/Resources/Changelog/ChangelogSunrise.yml index c6582e8e59e..7b7597f6145 100644 --- a/Resources/Changelog/ChangelogSunrise.yml +++ b/Resources/Changelog/ChangelogSunrise.yml @@ -353,3 +353,17 @@ Entries: type: Tweak id: 31 time: '2024-06-09T00:03:07.870112+00:00' +- author: VigersRay + changes: + - message: "\u041F\u0440\u0438 \u043F\u043E\u043B\u0443\u0447\u0435\u043D\u0438\u0438\ + \ \u0443\u0440\u043E\u043D\u0430 \u0433\u0443\u043C\u0430\u043D\u043E\u0438\u0434\ + \u044B \u0442\u0435\u043F\u0435\u0440\u044C \u043A\u0440\u0438\u0447\u0430\u0442\ + \ \u0438 \u043F\u043B\u0430\u0447\u0443\u0442." + type: Tweak + - message: "\u0411\u0443\u0434\u0443\u0447\u0438 \u0432 \u043A\u0440\u0438\u0442\ + \u0438\u0447\u0435\u0441\u043A\u043E\u043C \u0441\u043E\u0441\u0442\u043E\u044F\ + \u043D\u0438\u0438 \u0433\u0443\u043C\u0430\u043D\u043E\u0438\u0434\u044B \u043A\ + \u0430\u0448\u043B\u044F\u044E\u0442." + type: Tweak + id: 32 + time: '2024-06-09T02:52:26.930025+00:00' diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 2739f1f98a2..05cbd0ee306 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -228,6 +228,10 @@ - CanPilot - FootstepSound - DoorBumpOpener + - type: Paws + screamInterval: 3 + thresholdDamage: 5 + coughInterval: 5 - type: entity save: false