diff --git a/Content.Server/Access/Systems/IdCardSystem.cs b/Content.Server/Access/Systems/IdCardSystem.cs
index 2ee330f7f8..6bb86ee0fc 100644
--- a/Content.Server/Access/Systems/IdCardSystem.cs
+++ b/Content.Server/Access/Systems/IdCardSystem.cs
@@ -6,6 +6,7 @@ using Content.Server.Popups;
using Content.Shared.Access;
using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
+using Content.Shared.Chat;
using Content.Shared.Database;
using Content.Shared.Popups;
using Robust.Shared.Prototypes;
diff --git a/Content.Server/Body/Systems/RespiratorSystem.cs b/Content.Server/Body/Systems/RespiratorSystem.cs
index 4502c2966e..e7fd04af51 100644
--- a/Content.Server/Body/Systems/RespiratorSystem.cs
+++ b/Content.Server/Body/Systems/RespiratorSystem.cs
@@ -11,6 +11,7 @@ using Content.Shared.Atmos;
using Content.Shared.Body.Components;
using Content.Shared.Body.Events;
using Content.Shared.Body.Prototypes;
+using Content.Shared.Chat;
using Content.Shared.Chemistry.Components;
using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Chemistry.Reagent;
diff --git a/Content.Server/Chat/Commands/MeCommand.cs b/Content.Server/Chat/Commands/MeCommand.cs
index 36acfa7a69..f5b845a2d7 100644
--- a/Content.Server/Chat/Commands/MeCommand.cs
+++ b/Content.Server/Chat/Commands/MeCommand.cs
@@ -1,5 +1,6 @@
using Content.Server.Chat.Systems;
using Content.Shared.Administration;
+using Content.Shared.Chat;
using Robust.Shared.Console;
using Robust.Shared.Enums;
diff --git a/Content.Server/Chat/Commands/SayCommand.cs b/Content.Server/Chat/Commands/SayCommand.cs
index 99ca4660f0..199cd69098 100644
--- a/Content.Server/Chat/Commands/SayCommand.cs
+++ b/Content.Server/Chat/Commands/SayCommand.cs
@@ -1,5 +1,6 @@
using Content.Server.Chat.Systems;
using Content.Shared.Administration;
+using Content.Shared.Chat;
using Robust.Shared.Console;
using Robust.Shared.Enums;
diff --git a/Content.Server/Chat/Commands/WhisperCommand.cs b/Content.Server/Chat/Commands/WhisperCommand.cs
index 0556dd8036..d31b21abb1 100644
--- a/Content.Server/Chat/Commands/WhisperCommand.cs
+++ b/Content.Server/Chat/Commands/WhisperCommand.cs
@@ -1,5 +1,6 @@
using Content.Server.Chat.Systems;
using Content.Shared.Administration;
+using Content.Shared.Chat;
using Robust.Shared.Console;
using Robust.Shared.Enums;
diff --git a/Content.Server/Chat/Systems/AutoEmoteSystem.cs b/Content.Server/Chat/Systems/AutoEmoteSystem.cs
index 1e1b7b9034..ebb22f6314 100644
--- a/Content.Server/Chat/Systems/AutoEmoteSystem.cs
+++ b/Content.Server/Chat/Systems/AutoEmoteSystem.cs
@@ -1,4 +1,5 @@
using System.Linq;
+using Content.Shared.Chat;
using Content.Shared.Chat.Prototypes;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
diff --git a/Content.Server/Chat/Systems/ChatSystem.cs b/Content.Server/Chat/Systems/ChatSystem.cs
index 09b8aba14d..54a36fd4e5 100644
--- a/Content.Server/Chat/Systems/ChatSystem.cs
+++ b/Content.Server/Chat/Systems/ChatSystem.cs
@@ -1,7 +1,6 @@
using System.Globalization;
using System.Linq;
using System.Text;
-using Content.Server._RMC14.Emote; //RMC emote system
using Content.Server.Administration.Logs;
using Content.Server.Administration.Managers;
using Content.Server.Chat.Managers;
@@ -64,8 +63,7 @@ public sealed partial class ChatSystem : SharedChatSystem
[Dependency] private readonly ReplacementAccentSystem _wordreplacement = default!;
[Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!;
[Dependency] private readonly ExamineSystemShared _examineSystem = default!;
- [Dependency] private readonly RMCEmoteSystem _rmcEmote = default!; //RMC emote system
-
+
//Nyano - Summary: pulls in the nyano chat system for psionics.
[Dependency] private readonly NyanoChatSystem _nyanoChatSystem = default!;
@@ -77,7 +75,7 @@ public sealed partial class ChatSystem : SharedChatSystem
public override void Initialize()
{
base.Initialize();
- CacheEmotes();
+
Subs.CVar(_configurationManager, CCVars.LoocEnabled, OnLoocEnabledChanged, true);
Subs.CVar(_configurationManager, CCVars.DeadLoocEnabled, OnDeadLoocEnabledChanged, true);
Subs.CVar(_configurationManager, CCVars.CritLoocEnabled, OnCritLoocEnabledChanged, true);
@@ -662,7 +660,7 @@ public sealed partial class ChatSystem : SharedChatSystem
}
// End Mono Changes
- private void SendEntityEmote(
+ protected override void SendEntityEmote(
EntityUid source,
string action,
ChatTransmitRange range,
@@ -1082,18 +1080,3 @@ public enum InGameOOCChatType : byte
Looc,
Dead
}
-
-///
-/// Controls transmission of chat.
-///
-public enum ChatTransmitRange : byte
-{
- /// Acts normal, ghosts can hear across the map, etc.
- Normal,
- /// Normal but ghosts are still range-limited.
- GhostRangeLimit,
- /// Hidden from the chat window.
- HideChat,
- /// Ghosts can't hear or see it at all. Regular players can if in-range.
- NoGhosts
-}
diff --git a/Content.Server/Chat/Systems/EmoteOnDamageSystem.cs b/Content.Server/Chat/Systems/EmoteOnDamageSystem.cs
index 878c517d92..4afb885c4c 100644
--- a/Content.Server/Chat/Systems/EmoteOnDamageSystem.cs
+++ b/Content.Server/Chat/Systems/EmoteOnDamageSystem.cs
@@ -1,5 +1,6 @@
namespace Content.Server.Chat.Systems;
+using Content.Shared.Chat;
using Content.Shared.Chat.Prototypes;
using Content.Shared.Damage;
using Robust.Shared.Prototypes;
diff --git a/Content.Server/Cluwne/CluwneSystem.cs b/Content.Server/Cluwne/CluwneSystem.cs
index e51a01a1d4..ab13548e04 100644
--- a/Content.Server/Cluwne/CluwneSystem.cs
+++ b/Content.Server/Cluwne/CluwneSystem.cs
@@ -1,20 +1,21 @@
-using Content.Server.Popups;
-using Content.Shared.Popups;
-using Content.Shared.Mobs;
using Content.Server.Chat;
using Content.Server.Chat.Systems;
-using Content.Server.Clothing.Systems;
-using Content.Shared.Chat.Prototypes;
-using Robust.Shared.Random;
-using Content.Shared.Stunnable;
-using Content.Shared.Damage;
-using Robust.Shared.Prototypes;
using Content.Server.Emoting.Systems;
+using Content.Server.Clothing.Systems;
+using Content.Server.Popups;
using Content.Server.Speech.EntitySystems;
-using Content.Shared.Cluwne;
-using Robust.Shared.Audio.Systems;
-using Content.Shared.NameModifier.EntitySystems;
+using Content.Shared.Chat;
+using Content.Shared.Chat.Prototypes;
using Content.Shared.Clumsy;
+using Content.Shared.Cluwne;
+using Content.Shared.Damage;
+using Content.Shared.Mobs;
+using Content.Shared.NameModifier.EntitySystems;
+using Content.Shared.Popups;
+using Content.Shared.Stunnable;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Random;
+using Robust.Shared.Prototypes;
namespace Content.Server.Cluwne;
@@ -75,7 +76,7 @@ public sealed class CluwneSystem : EntitySystem
EnsureComp(ent.Owner);
_autoEmote.AddEmote(ent.Owner, ent.Comp.AutoEmoteId);
}
-
+
EnsureComp(ent.Owner);
var transformMessage = Loc.GetString(ent.Comp.TransformMessage, ("target", ent.Owner));
diff --git a/Content.Server/Emoting/Systems/BodyEmotesSystem.cs b/Content.Server/Emoting/Systems/BodyEmotesSystem.cs
index aef79f1419..39217a8196 100644
--- a/Content.Server/Emoting/Systems/BodyEmotesSystem.cs
+++ b/Content.Server/Emoting/Systems/BodyEmotesSystem.cs
@@ -1,5 +1,6 @@
using Content.Server.Chat.Systems;
using Content.Server.Emoting.Components;
+using Content.Shared.Chat;
using Content.Shared.Chat.Prototypes;
using Content.Shared.Hands.Components;
using Robust.Shared.Prototypes;
diff --git a/Content.Server/EntityEffects/Effects/EmoteEntityEffectSystem.cs b/Content.Server/EntityEffects/Effects/EmoteEntityEffectSystem.cs
deleted file mode 100644
index 05ab857267..0000000000
--- a/Content.Server/EntityEffects/Effects/EmoteEntityEffectSystem.cs
+++ /dev/null
@@ -1,22 +0,0 @@
-using Content.Server.Chat.Systems;
-using Content.Shared.EntityEffects;
-using Content.Shared.EntityEffects.Effects;
-
-namespace Content.Server.EntityEffects.Effects;
-
-///
-/// Makes this entity emote.
-///
-///
-public sealed partial class EmoteEntityEffectSystem : EntityEffectSystem
-{
- [Dependency] private readonly ChatSystem _chat = default!;
-
- protected override void Effect(Entity entity, ref EntityEffectEvent args)
- {
- if (args.Effect.ShowInChat)
- _chat.TryEmoteWithChat(entity, args.Effect.EmoteId, ChatTransmitRange.GhostRangeLimit, forceEmote: args.Effect.Force);
- else
- _chat.TryEmoteWithoutChat(entity, args.Effect.EmoteId);
- }
-}
diff --git a/Content.Server/Holopad/HolopadSystem.cs b/Content.Server/Holopad/HolopadSystem.cs
index 630141d003..c634d14f2f 100644
--- a/Content.Server/Holopad/HolopadSystem.cs
+++ b/Content.Server/Holopad/HolopadSystem.cs
@@ -4,6 +4,7 @@ using Content.Server.Power.EntitySystems;
using Content.Server.Telephone;
using Content.Shared.Access.Systems;
using Content.Shared.Audio;
+using Content.Shared.Chat;
using Content.Shared.Chat.TypingIndicator;
using Content.Shared.Holopad;
using Content.Shared.IdentityManagement;
diff --git a/Content.Server/Mobs/CritMobActionsSystem.cs b/Content.Server/Mobs/CritMobActionsSystem.cs
index c897102dca..29bc2ffbef 100644
--- a/Content.Server/Mobs/CritMobActionsSystem.cs
+++ b/Content.Server/Mobs/CritMobActionsSystem.cs
@@ -1,7 +1,7 @@
using Content.Server.Administration;
using Content.Server.Chat.Systems;
using Content.Server.Popups;
-using Content.Server.Speech.Muting;
+using Content.Shared.Chat;
using Content.Shared.Mobs;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs.Systems;
diff --git a/Content.Server/Nyanotrasen/Chat/TSayCommand.cs b/Content.Server/Nyanotrasen/Chat/TSayCommand.cs
index 9ba27b65d7..750fd473ad 100644
--- a/Content.Server/Nyanotrasen/Chat/TSayCommand.cs
+++ b/Content.Server/Nyanotrasen/Chat/TSayCommand.cs
@@ -1,4 +1,5 @@
using Content.Server.Chat.Systems;
+using Content.Shared.Chat;
using Content.Shared.Administration;
using Robust.Server.Player;
using Robust.Shared.Console;
diff --git a/Content.Server/Speech/EmotesMenuSystem.cs b/Content.Server/Speech/EmotesMenuSystem.cs
index a7132ab34d..6571587b91 100644
--- a/Content.Server/Speech/EmotesMenuSystem.cs
+++ b/Content.Server/Speech/EmotesMenuSystem.cs
@@ -1,6 +1,5 @@
-using Content.Server._RMC14.Emote; //RMC emote system
+using Content.Shared.Chat;
using Content.Server.Chat.Systems;
-using Content.Shared.Chat;
using Robust.Shared.Prototypes;
namespace Content.Server.Speech;
@@ -9,7 +8,6 @@ public sealed partial class EmotesMenuSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly ChatSystem _chat = default!;
- [Dependency] private readonly RMCEmoteSystem _rmcEmote = default!; //RMC emote system
public override void Initialize()
{
@@ -27,10 +25,6 @@ public sealed partial class EmotesMenuSystem : EntitySystem
if (!_prototypeManager.Resolve(msg.ProtoId, out var proto) || proto.ChatTriggers.Count == 0)
return;
- //RMC emote system
- if (!_rmcEmote.TryEmote(player.Value))
- return;
-
_chat.TryEmoteWithChat(player.Value, msg.ProtoId);
}
}
diff --git a/Content.Server/Speech/EntitySystems/MumbleAccentSystem.cs b/Content.Server/Speech/EntitySystems/MumbleAccentSystem.cs
index 27679c9134..868e5b73c1 100644
--- a/Content.Server/Speech/EntitySystems/MumbleAccentSystem.cs
+++ b/Content.Server/Speech/EntitySystems/MumbleAccentSystem.cs
@@ -1,5 +1,6 @@
using Content.Server.Chat.Systems;
using Content.Server.Speech.Components;
+using Content.Shared.Chat;
using Content.Shared.Chat.Prototypes;
using Content.Shared.Speech;
using Content.Shared.Speech.Components;
diff --git a/Content.Server/Speech/EntitySystems/VocalSystem.cs b/Content.Server/Speech/EntitySystems/VocalSystem.cs
index e305c0eb28..a7a84385f9 100644
--- a/Content.Server/Speech/EntitySystems/VocalSystem.cs
+++ b/Content.Server/Speech/EntitySystems/VocalSystem.cs
@@ -1,13 +1,10 @@
-using Content.Server._RMC14.Emote; //RMC emote system
using Content.Server.Actions;
using Content.Server.Chat.Systems;
-using Content.Server.Speech.Components;
+using Content.Shared.Chat;
using Content.Shared.Chat.Prototypes;
-using Content.Shared.Cloning.Events;
using Content.Shared.Humanoid;
using Content.Shared.Speech;
using Content.Shared.Speech.Components;
-using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
@@ -21,7 +18,6 @@ public sealed class VocalSystem : EntitySystem
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly ChatSystem _chat = default!;
[Dependency] private readonly ActionsSystem _actions = default!;
- [Dependency] private readonly RMCEmoteSystem _rmcEmote = default!; //RMC emote system
public override void Initialize()
{
diff --git a/Content.Server/Speech/Muting/MutingSystem.cs b/Content.Server/Speech/Muting/MutingSystem.cs
index f588e2238d..9e2a0602a4 100644
--- a/Content.Server/Speech/Muting/MutingSystem.cs
+++ b/Content.Server/Speech/Muting/MutingSystem.cs
@@ -1,8 +1,7 @@
-using Content.Shared.Abilities.Mime;
-using Content.Server.Chat.Systems;
using Content.Server.Popups;
-using Content.Server.Speech.Components;
using Content.Server.Speech.EntitySystems;
+using Content.Shared.Abilities.Mime;
+using Content.Shared.Chat;
using Content.Shared.Chat.Prototypes;
using Content.Shared.Puppet;
using Content.Shared.Speech;
diff --git a/Content.Server/Teleportation/TeleportLocationsSystem.cs b/Content.Server/Teleportation/TeleportLocationsSystem.cs
index 14211d9672..edda0859ee 100644
--- a/Content.Server/Teleportation/TeleportLocationsSystem.cs
+++ b/Content.Server/Teleportation/TeleportLocationsSystem.cs
@@ -1,4 +1,5 @@
using Content.Server.Chat.Systems;
+using Content.Shared.Chat;
using Content.Shared.Teleportation;
using Content.Shared.Teleportation.Components;
using Content.Shared.Teleportation.Systems;
diff --git a/Content.Server/Vocalization/Systems/VocalizationSystem.cs b/Content.Server/Vocalization/Systems/VocalizationSystem.cs
index 49dfaf4281..8801e057b7 100644
--- a/Content.Server/Vocalization/Systems/VocalizationSystem.cs
+++ b/Content.Server/Vocalization/Systems/VocalizationSystem.cs
@@ -2,6 +2,7 @@ using Content.Server.Chat.Systems;
using Content.Server.Power.Components;
using Content.Server.Vocalization.Components;
using Content.Shared.ActionBlocker;
+using Content.Shared.Chat;
using Robust.Shared.Random;
using Robust.Shared.Timing;
diff --git a/Content.Server/Zombies/ZombieSystem.cs b/Content.Server/Zombies/ZombieSystem.cs
index c182d53f44..b8f2bd56ed 100644
--- a/Content.Server/Zombies/ZombieSystem.cs
+++ b/Content.Server/Zombies/ZombieSystem.cs
@@ -10,6 +10,7 @@ using Content.Shared.Anomaly.Components;
using Content.Shared.Armor;
using Content.Shared.Bed.Sleep;
using Content.Shared.Cloning.Events;
+using Content.Shared.Chat;
using Content.Shared.Damage;
using Content.Shared.Humanoid;
using Content.Shared.Inventory;
diff --git a/Content.Server/_DV/Abilities/Psionics/FracturedFormPowerSystem.cs b/Content.Server/_DV/Abilities/Psionics/FracturedFormPowerSystem.cs
index d1f5c922b6..fd97d44b3a 100644
--- a/Content.Server/_DV/Abilities/Psionics/FracturedFormPowerSystem.cs
+++ b/Content.Server/_DV/Abilities/Psionics/FracturedFormPowerSystem.cs
@@ -10,6 +10,7 @@ using Content.Shared.Abilities.Psionics;
using Content.Shared.Actions;
using Content.Shared.Actions.Events;
using Content.Shared.Bed.Sleep;
+using Content.Shared.Chat;
using Content.Shared.DoAfter;
using Content.Shared.Examine;
using Content.Shared.Humanoid.Prototypes;
diff --git a/Content.Server/_Goobstation/Emoting/AnimatedEmotesSystem.cs b/Content.Server/_Goobstation/Emoting/AnimatedEmotesSystem.cs
index cc4863d31f..ec087bdcb2 100644
--- a/Content.Server/_Goobstation/Emoting/AnimatedEmotesSystem.cs
+++ b/Content.Server/_Goobstation/Emoting/AnimatedEmotesSystem.cs
@@ -1,5 +1,5 @@
using Robust.Shared.GameStates;
-using Content.Server.Chat.Systems;
+using Content.Shared.Chat;
using Content.Shared.Chat.Prototypes;
using Content.Shared.Emoting;
using Robust.Shared.Prototypes;
diff --git a/Content.Server/_RMC14/Emote/RMCEmoteSystem.cs b/Content.Server/_RMC14/Emote/RMCEmoteSystem.cs
deleted file mode 100644
index 67b20d8346..0000000000
--- a/Content.Server/_RMC14/Emote/RMCEmoteSystem.cs
+++ /dev/null
@@ -1,42 +0,0 @@
-using Content.Server.Chat.Systems;
-using Content.Shared._RMC14.Emote;
-using Content.Shared.Chat.Prototypes;
-using Robust.Shared.Prototypes;
-using Robust.Shared.Timing;
-
-namespace Content.Server._RMC14.Emote;
-
-public sealed class RMCEmoteSystem : SharedRMCEmoteSystem
-{
- [Dependency] private readonly ChatSystem _chat = default!;
- [Dependency] private readonly IGameTiming _timing = default!;
-
- public override void TryEmoteWithChat(
- EntityUid source,
- ProtoId emote,
- bool hideLog = false,
- string? nameOverride = null,
- bool ignoreActionBlocker = false,
- bool forceEmote = false,
- TimeSpan? cooldown = null)
- {
- var recently = EnsureComp(source);
- var time = _timing.CurTime;
- if (recently.Emotes.TryGetValue(emote, out var next) &&
- time < next)
- {
- return;
- }
-
- recently.Emotes[emote] = time + cooldown ?? recently.Cooldown;
- _chat.TryEmoteWithChat(
- source,
- emote,
- ChatTransmitRange.Normal,
- hideLog,
- nameOverride,
- ignoreActionBlocker,
- forceEmote
- );
- }
-}
\ No newline at end of file
diff --git a/Content.Server/_RMC14/Emote/RecentlyEmotedComponent.cs b/Content.Server/_RMC14/Emote/RecentlyEmotedComponent.cs
deleted file mode 100644
index 9097fa9fa0..0000000000
--- a/Content.Server/_RMC14/Emote/RecentlyEmotedComponent.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-using Content.Shared.Chat.Prototypes;
-using Robust.Shared.Prototypes;
-
-namespace Content.Server._RMC14.Emote;
-
-[RegisterComponent]
-[Access(typeof(RMCEmoteSystem))]
-public sealed partial class RecentlyEmotedComponent : Component
-{
- [DataField]
- public TimeSpan Cooldown = TimeSpan.FromSeconds(0.8);
-
- [DataField]
- public Dictionary, TimeSpan> Emotes = new();
-}
diff --git a/Content.Shared/Chat/EmotesEvents.cs b/Content.Shared/Chat/EmotesEvents.cs
index 4479f8b2ab..196bbb43bd 100644
--- a/Content.Shared/Chat/EmotesEvents.cs
+++ b/Content.Shared/Chat/EmotesEvents.cs
@@ -1,9 +1,49 @@
-using Content.Shared.Chat.Prototypes;
+using Content.Shared.Chat.Prototypes;
+using Content.Shared.Inventory;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
namespace Content.Shared.Chat;
+///
+/// An event raised just before an emote is performed, providing systems with an opportunity to cancel the emote's performance.
+///
+[ByRefEvent]
+public sealed class BeforeEmoteEvent(EntityUid source, EmotePrototype emote)
+ : CancellableEntityEventArgs, IInventoryRelayEvent
+{
+ public readonly EntityUid Source = source;
+ public readonly EmotePrototype Emote = emote;
+
+ ///
+ /// The equipment that is blocking emoting. Should only be non-null if the event was canceled.
+ ///
+ public EntityUid? Blocker = null;
+
+ public SlotFlags TargetSlots => SlotFlags.WITHOUT_POCKET;
+}
+
+///
+/// Raised by the chat system when an entity made some emote.
+/// Use it to play sound, change sprite or something else.
+///
+[ByRefEvent]
+public record struct EmoteEvent(EmotePrototype Emote)
+{
+ ///
+ /// The used emote.
+ ///
+ public EmotePrototype Emote = Emote;
+
+ ///
+ /// If this message has already been "handled" by a previous system.
+ ///
+ public bool Handled;
+}
+
+///
+/// Sent by the client when requesting the server to play a specific emote selected from the emote radial menu.
+///
[Serializable, NetSerializable]
public sealed class PlayEmoteMessage(ProtoId protoId) : EntityEventArgs
{
diff --git a/Content.Server/Chat/Systems/ChatSystem.Emote.cs b/Content.Shared/Chat/SharedChatSystem.Emote.cs
similarity index 60%
rename from Content.Server/Chat/Systems/ChatSystem.Emote.cs
rename to Content.Shared/Chat/SharedChatSystem.Emote.cs
index 684ea7ee67..322bb7afb3 100644
--- a/Content.Server/Chat/Systems/ChatSystem.Emote.cs
+++ b/Content.Shared/Chat/SharedChatSystem.Emote.cs
@@ -1,32 +1,19 @@
-using Content.Server._RMC14.Emote; //RMC emote system
using System.Collections.Frozen;
using System.Collections.Immutable;
-using Content.Server.Popups;
using Content.Shared.Chat.Prototypes;
-using Content.Shared.Emoting;
using Content.Shared.Speech;
using Robust.Shared.Audio;
-using Robust.Shared.Prototypes;
using Robust.Shared.Random;
-namespace Content.Server.Chat.Systems;
+namespace Content.Shared.Chat;
-// emotes using emote prototype
-public partial class ChatSystem
+public abstract partial class SharedChatSystem
{
- [Dependency] private readonly PopupSystem _popupSystem = default!;
- private FrozenDictionary> _wordEmoteDict = FrozenDictionary>.Empty; // DeltaV - Multiple emotes
-
- protected override void OnPrototypeReload(PrototypesReloadedEventArgs obj)
- {
- base.OnPrototypeReload(obj);
- if (obj.WasModified())
- CacheEmotes();
- }
+ private FrozenDictionary _wordEmoteDict = FrozenDictionary.Empty;
private void CacheEmotes()
{
- var dict = new Dictionary>(); // DeltaV - Multiple triggers for the same emote
+ var dict = new Dictionary();
var emotes = _prototypeManager.EnumeratePrototypes();
foreach (var emote in emotes)
{
@@ -35,16 +22,12 @@ public partial class ChatSystem
var lowerWord = word.ToLower();
if (dict.TryGetValue(lowerWord, out var value))
{
- // Begin DeltaV modification - Multiple emotes for the same words
- dict[lowerWord] = value.Add(emote);
-
- var errMsg = $"Duplicate of emote word {lowerWord}";
- Log.Warning(errMsg);
-
+ var errMsg = $"Duplicate of emote word {lowerWord} in emotes {emote.ID} and {value.ID}";
+ Log.Error(errMsg);
continue;
}
- dict.Add(lowerWord, ImmutableList.Create(emote)); // End DeltaV modification
+ dict.Add(lowerWord, emote);
}
}
@@ -52,15 +35,19 @@ public partial class ChatSystem
}
///
- /// Makes selected entity to emote using and sends message to chat.
+ /// Makes the selected entity emote using the given and sends a message to chat.
///
/// The entity that is speaking
- /// The id of emote prototype. Should has valid
- /// Whether or not this message should appear in the adminlog window
+ /// The id of emote prototype. Should have valid
+ /// Whether this message should appear in the adminlog window, or not.
/// Conceptual range of transmission, if it shows in the chat window, if it shows to far-away ghosts or ghosts at all...
- /// The name to use for the speaking entity. Usually this should just be modified via . If this is set, the event will not get raised.
+ /// Whether emote action blocking should be ignored or not.
+ ///
+ /// The name to use for the speaking entity. Usually this should just be modified via .
+ /// If this is set, the event will not get raised.
+ ///
/// Bypasses whitelist/blacklist/availibility checks for if the entity can use this emote
- /// True if an emote was performed. False if the emote is unvailable, cancelled, etc.
+ /// True if an emote was performed. False if the emote is unavailable, cancelled, etc.
public bool TryEmoteWithChat(
EntityUid source,
string emoteId,
@@ -69,24 +56,28 @@ public partial class ChatSystem
string? nameOverride = null,
bool ignoreActionBlocker = false,
bool forceEmote = false
- )
+ )
{
- if (!_prototypeManager.TryIndex(emoteId, out var proto))
+ if (!_prototypeManager.Resolve(emoteId, out var proto))
return false;
+
return TryEmoteWithChat(source, proto, range, hideLog: hideLog, nameOverride, ignoreActionBlocker: ignoreActionBlocker, forceEmote: forceEmote);
}
///
- /// Makes selected entity to emote using and sends message to chat.
+ /// Makes the selected entity emote using the given and sends a message to chat.
///
- /// The entity that is speaking
- /// The emote prototype. Should has valid
- /// Whether or not this message should appear in the adminlog window
- /// Whether or not this message should appear in the chat window
+ /// The entity that is speaking.
+ /// The emote prototype. Should have valid .
+ /// Whether this message should appear in the adminlog window or not.
+ /// Whether emote action blocking should be ignored or not.
/// Conceptual range of transmission, if it shows in the chat window, if it shows to far-away ghosts or ghosts at all...
- /// The name to use for the speaking entity. Usually this should just be modified via . If this is set, the event will not get raised.
+ ///
+ /// The name to use for the speaking entity. Usually this should just be modified via .
+ /// If this is set, the event will not get raised.
+ ///
/// Bypasses whitelist/blacklist/availibility checks for if the entity can use this emote
- /// True if an emote was performed. False if the emote is unvailable, cancelled, etc.
+ /// True if an emote was performed. False if the emote is unavailable, cancelled, etc.
public bool TryEmoteWithChat(
EntityUid source,
EmotePrototype emote,
@@ -114,21 +105,21 @@ public partial class ChatSystem
}
///
- /// Makes selected entity to emote using without sending any messages to chat.
+ /// Makes the selected entity emote using the given without sending any messages to chat.
///
- /// True if an emote was performed. False if the emote is unvailable, cancelled, etc.
+ /// True if an emote was performed. False if the emote is unavailable, cancelled, etc.
public bool TryEmoteWithoutChat(EntityUid uid, string emoteId, bool ignoreActionBlocker = false)
{
- if (!_prototypeManager.TryIndex(emoteId, out var proto))
+ if (!_prototypeManager.Resolve(emoteId, out var proto))
return false;
return TryEmoteWithoutChat(uid, proto, ignoreActionBlocker);
}
///
- /// Makes selected entity to emote using without sending any messages to chat.
+ /// Makes the selected entity emote using the given without sending any messages to chat.
///
- /// True if an emote was performed. False if the emote is unvailable, cancelled, etc.
+ /// True if an emote was performed. False if the emote is unavailable, cancelled, etc.
public bool TryEmoteWithoutChat(EntityUid uid, EmotePrototype proto, bool ignoreActionBlocker = false)
{
if (!_actionBlocker.CanEmote(uid) && !ignoreActionBlocker)
@@ -138,7 +129,7 @@ public partial class ChatSystem
}
///
- /// Tries to find and play relevant emote sound in emote sounds collection.
+ /// Tries to find and play the relevant emote sound in an emote sounds collection.
///
/// True if emote sound was played.
public bool TryPlayEmoteSound(EntityUid uid, EmoteSoundsPrototype? proto, EmotePrototype emote, AudioParams? audioParams = null)
@@ -147,7 +138,7 @@ public partial class ChatSystem
}
///
- /// Tries to find and play relevant emote sound in emote sounds collection.
+ /// Tries to find and play the relevant emote sound in an emote sounds collection.
///
/// True if emote sound was played.
public bool TryPlayEmoteSound(EntityUid uid, EmoteSoundsPrototype? proto, string emoteId, AudioParams? audioParams = null)
@@ -172,62 +163,27 @@ public partial class ChatSystem
///
/// Checks if a valid emote was typed, to play sounds and etc and invokes an event.
///
- ///
- ///
+ /// The entity that is speaking
+ /// Formatted emote message.
/// True if the chat message should be displayed (because the emote was explicitly cancelled), false if it should not be.
- private bool TryEmoteChatInput(EntityUid uid, string textInput)
+ protected bool TryEmoteChatInput(EntityUid source, string textInput)
{
var actionTrimmedLower = TrimPunctuation(textInput.ToLower());
- if (!_wordEmoteDict.TryGetValue(actionTrimmedLower, out var emotes)) // DeltaV, renames to emotes
- return true; // DeltaV - If its not an emote that has a prototype, allow it. Its probably RP.
+ if (!_wordEmoteDict.TryGetValue(actionTrimmedLower, out var emote))
+ return true;
- //RMC emote system
- if (!_rmcEmote.TryEmote(uid))
- return false;
+ if (!AllowedToUseEmote(source, emote))
+ return true;
- // DeltaV - Multiple emotes for the same trigger
- bool validEmote = false;
- foreach (var emote in emotes)
- {
- // If its a valid emote, just break the loop and return.
- if (validEmote)
- break;
+ return TryInvokeEmoteEvent(source, emote);
- // Delta V - For allowing Silicons etc. to use all emotes without changing an entire Yaml file.
- //if (!AllowedToUseEmote(uid, emote))
- // continue;
-
- // This will check if you're blocked from vocal emotes, even if its an allowed emote for your species.
- validEmote = TryInvokeEmoteEvent(uid, emote);
- }
-
- return validEmote;
- // END DeltaV
-
- static string TrimPunctuation(string textInput)
- {
- var trimEnd = textInput.Length;
- while (trimEnd > 0 && char.IsPunctuation(textInput[trimEnd - 1]))
- {
- trimEnd--;
- }
-
- var trimStart = 0;
- while (trimStart < trimEnd && char.IsPunctuation(textInput[trimStart]))
- {
- trimStart++;
- }
-
- return textInput[trimStart..trimEnd];
- }
}
///
- /// Checks if we can use this emote based on the emotes whitelist, blacklist, and availibility to the entity.
+ /// Checks if we can use this emote based on the emotes whitelist, blacklist, and availability to the entity.
///
/// The entity that is speaking
/// The emote being used
- ///
- private bool AllowedToUseEmote(EntityUid source, EmotePrototype emote)
+ public bool AllowedToUseEmote(EntityUid source, EmotePrototype emote)
{
// If emote is in AllowedEmotes, it will bypass whitelist and blacklist
if (TryComp(source, out var speech) &&
@@ -237,8 +193,8 @@ public partial class ChatSystem
}
// Check the whitelist and blacklist
- if (_whitelistSystem.IsWhitelistFail(emote.Whitelist, source) ||
- _whitelistSystem.IsBlacklistPass(emote.Blacklist, source))
+ if (_whitelist.IsWhitelistFail(emote.Whitelist, source) ||
+ _whitelist.IsBlacklistPass(emote.Blacklist, source))
{
return false;
}
@@ -267,9 +223,13 @@ public partial class ChatSystem
if (beforeEv.Cancelled)
{
+ // Chat is not predicted anyways, so no need to predict this popup either.
+ if (_net.IsClient)
+ return false;
+
if (beforeEv.Blocker != null)
{
- _popupSystem.PopupEntity(
+ _popup.PopupEntity(
Loc.GetString(
"chat-system-emote-cancelled-blocked",
("emote", Loc.GetString(proto.Name).ToLower()),
@@ -281,7 +241,7 @@ public partial class ChatSystem
}
else
{
- _popupSystem.PopupEntity(
+ _popup.PopupEntity(
Loc.GetString("chat-system-emote-cancelled-generic",
("emote", Loc.GetString(proto.Name).ToLower())),
uid,
@@ -303,20 +263,21 @@ public partial class ChatSystem
return false;
// END DeltaV
}
-}
-///
-/// Raised by chat system when entity made some emote.
-/// Use it to play sound, change sprite or something else.
-///
-[ByRefEvent]
-public sealed class EmoteEvent : HandledEntityEventArgs
-{
- public readonly EmotePrototype Emote;
-
- public EmoteEvent(EmotePrototype emote)
+ private string TrimPunctuation(string textInput)
{
- Emote = emote;
- Handled = false;
+ var trimEnd = textInput.Length;
+ while (trimEnd > 0 && char.IsPunctuation(textInput[trimEnd - 1]))
+ {
+ trimEnd--;
+ }
+
+ var trimStart = 0;
+ while (trimStart < trimEnd && char.IsPunctuation(textInput[trimStart]))
+ {
+ trimStart++;
+ }
+
+ return textInput[trimStart..trimEnd];
}
}
diff --git a/Content.Shared/Chat/SharedChatSystem.cs b/Content.Shared/Chat/SharedChatSystem.cs
index 6309f6e492..54de9d186e 100644
--- a/Content.Shared/Chat/SharedChatSystem.cs
+++ b/Content.Shared/Chat/SharedChatSystem.cs
@@ -1,15 +1,21 @@
using System.Collections.Frozen;
using System.Text.RegularExpressions;
+using Content.Shared.ActionBlocker;
+using Content.Shared.Chat.Prototypes;
using Content.Shared.Popups;
using Content.Shared.Radio;
using Content.Shared.Speech;
+using Content.Shared.Whitelist;
using Robust.Shared.Audio;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Network;
using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
using Robust.Shared.Utility;
namespace Content.Shared.Chat;
-public abstract class SharedChatSystem : EntitySystem
+public abstract partial class SharedChatSystem : EntitySystem
{
public const char RadioCommonPrefix = ';';
public const char RadioChannelPrefix = ':';
@@ -39,6 +45,11 @@ public abstract class SharedChatSystem : EntitySystem
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
+ [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly INetManager _net = default!;
///
/// Cache of the keycodes for faster lookup.
@@ -48,15 +59,21 @@ public abstract class SharedChatSystem : EntitySystem
public override void Initialize()
{
base.Initialize();
+
DebugTools.Assert(_prototypeManager.HasIndex(CommonChannel));
+
SubscribeLocalEvent(OnPrototypeReload);
CacheRadios();
+ CacheEmotes();
}
protected virtual void OnPrototypeReload(PrototypesReloadedEventArgs obj)
{
if (obj.WasModified())
CacheRadios();
+
+ if (obj.WasModified())
+ CacheEmotes();
}
private void CacheRadios()
@@ -294,4 +311,31 @@ public abstract class SharedChatSystem : EntitySystem
tagStart += tag.Length + 2;
return rawmsg.Substring(tagStart, tagEnd - tagStart);
}
+
+ protected virtual void SendEntityEmote(
+ EntityUid source,
+ string action,
+ ChatTransmitRange range,
+ string? nameOverride,
+ bool hideLog = false,
+ bool checkEmote = true,
+ bool ignoreActionBlocker = false,
+ NetUserId? author = null
+ )
+ { }
+}
+
+///
+/// Controls transmission of chat.
+///
+public enum ChatTransmitRange : byte
+{
+ /// Acts normal, ghosts can hear across the map, etc.
+ Normal,
+ /// Normal but ghosts are still range-limited.
+ GhostRangeLimit,
+ /// Hidden from the chat window.
+ HideChat,
+ /// Ghosts can't hear or see it at all. Regular players can if in-range.
+ NoGhosts
}
diff --git a/Content.Shared/Emoting/EmoteEvents.cs b/Content.Shared/Emoting/EmoteEvents.cs
index ea3073f336..931395ee7e 100644
--- a/Content.Shared/Emoting/EmoteEvents.cs
+++ b/Content.Shared/Emoting/EmoteEvents.cs
@@ -1,27 +1,6 @@
-using Content.Shared.Chat.Prototypes;
-using Content.Shared.Inventory;
-
-namespace Content.Shared.Emoting;
+namespace Content.Shared.Emoting;
public sealed class EmoteAttemptEvent(EntityUid uid) : CancellableEntityEventArgs
{
public EntityUid Uid { get; } = uid;
}
-
-///
-/// An event raised just before an emote is performed, providing systems with an opportunity to cancel the emote's performance.
-///
-[ByRefEvent]
-public sealed class BeforeEmoteEvent(EntityUid source, EmotePrototype emote)
- : CancellableEntityEventArgs, IInventoryRelayEvent
-{
- public readonly EntityUid Source = source;
- public readonly EmotePrototype Emote = emote;
-
- ///
- /// The equipment that is blocking emoting. Should only be non-null if the event was canceled.
- ///
- public EntityUid? Blocker = null;
-
- public SlotFlags TargetSlots => SlotFlags.WITHOUT_POCKET;
-}
diff --git a/Content.Shared/EntityEffects/Effects/EmoteEntityEffect.cs b/Content.Shared/EntityEffects/Effects/EmoteEntityEffectSystem.cs
similarity index 63%
rename from Content.Shared/EntityEffects/Effects/EmoteEntityEffect.cs
rename to Content.Shared/EntityEffects/Effects/EmoteEntityEffectSystem.cs
index 1fcfc703ce..d8474e4163 100644
--- a/Content.Shared/EntityEffects/Effects/EmoteEntityEffect.cs
+++ b/Content.Shared/EntityEffects/Effects/EmoteEntityEffectSystem.cs
@@ -1,8 +1,26 @@
-using Content.Shared.Chat.Prototypes;
+using Content.Shared.Chat;
+using Content.Shared.Chat.Prototypes;
using Robust.Shared.Prototypes;
namespace Content.Shared.EntityEffects.Effects;
+///
+/// Makes this entity emote.
+///
+///
+public sealed partial class EmoteEntityEffectSystem : EntityEffectSystem
+{
+ [Dependency] private readonly SharedChatSystem _chat = default!;
+
+ protected override void Effect(Entity entity, ref EntityEffectEvent args)
+ {
+ if (args.Effect.ShowInChat)
+ _chat.TryEmoteWithChat(entity, args.Effect.EmoteId, ChatTransmitRange.GhostRangeLimit, forceEmote: args.Effect.Force);
+ else
+ _chat.TryEmoteWithoutChat(entity, args.Effect.EmoteId);
+ }
+}
+
///
public sealed partial class Emote : EntityEffectBase
{
diff --git a/Content.Shared/Inventory/InventorySystem.Relay.cs b/Content.Shared/Inventory/InventorySystem.Relay.cs
index 08dc524b0f..4dbb65931f 100644
--- a/Content.Shared/Inventory/InventorySystem.Relay.cs
+++ b/Content.Shared/Inventory/InventorySystem.Relay.cs
@@ -9,7 +9,6 @@ using Content.Shared.Contraband;
using Content.Shared.Damage;
using Content.Shared.Damage.Events;
using Content.Shared.Electrocution;
-using Content.Shared.Emoting;
using Content.Shared.Explosion;
using Content.Shared.Eye.Blinding.Systems;
using Content.Shared.Flash;
diff --git a/Content.Server/Speech/Components/EmoteBlockerComponent.cs b/Content.Shared/Speech/Components/EmoteBlockerComponent.cs
similarity index 74%
rename from Content.Server/Speech/Components/EmoteBlockerComponent.cs
rename to Content.Shared/Speech/Components/EmoteBlockerComponent.cs
index 603fd1b258..95263a2595 100644
--- a/Content.Server/Speech/Components/EmoteBlockerComponent.cs
+++ b/Content.Shared/Speech/Components/EmoteBlockerComponent.cs
@@ -1,24 +1,25 @@
using Content.Shared.Chat.Prototypes;
+using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
-namespace Content.Server.Speech.Components;
+namespace Content.Shared.Speech.Components;
///
/// Suppresses emotes with the given categories or ID.
/// Additionally, if the Scream Emote would be blocked, also blocks the Scream Action.
///
-[RegisterComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class EmoteBlockerComponent : Component
{
///
/// Which categories of emotes are blocked by this component.
///
- [DataField]
+ [DataField, AutoNetworkedField]
public HashSet BlocksCategories = [];
///
/// IDs of which specific emotes are blocked by this component.
///
- [DataField]
+ [DataField, AutoNetworkedField]
public HashSet> BlocksEmotes = [];
}
diff --git a/Content.Server/Speech/EntitySystems/EmoteBlockerSystem.cs b/Content.Shared/Speech/EntitySystems/EmoteBlockerSystem.cs
similarity index 90%
rename from Content.Server/Speech/EntitySystems/EmoteBlockerSystem.cs
rename to Content.Shared/Speech/EntitySystems/EmoteBlockerSystem.cs
index 3599268359..e2c9728fbc 100644
--- a/Content.Server/Speech/EntitySystems/EmoteBlockerSystem.cs
+++ b/Content.Shared/Speech/EntitySystems/EmoteBlockerSystem.cs
@@ -1,8 +1,8 @@
-using Content.Server.Speech.Components;
-using Content.Shared.Emoting;
+using Content.Shared.Chat;
using Content.Shared.Inventory;
+using Content.Shared.Speech.Components;
-namespace Content.Server.Speech.EntitySystems;
+namespace Content.Shared.Speech.EntitySystems;
public sealed class EmoteBlockerSystem : EntitySystem
{
diff --git a/Content.Shared/_RMC14/CCVar/RMCCVars.cs b/Content.Shared/_RMC14/CCVar/RMCCVars.cs
deleted file mode 100644
index 1c9ed1a25e..0000000000
--- a/Content.Shared/_RMC14/CCVar/RMCCVars.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using Robust.Shared;
-using Robust.Shared.Configuration;
-
-namespace Content.Shared._RMC14.CCVar;
-
-[CVarDefs]
-public sealed partial class RMCCVars : CVars
-{
- public static readonly CVarDef RMCEmoteCooldownSeconds =
- CVarDef.Create("rmc.emote_cooldown_seconds", 3f, CVar.SERVER | CVar.REPLICATED);
-}
diff --git a/Content.Shared/_RMC14/Emote/EmoteCooldownComponent.cs b/Content.Shared/_RMC14/Emote/EmoteCooldownComponent.cs
deleted file mode 100644
index 1926b30cea..0000000000
--- a/Content.Shared/_RMC14/Emote/EmoteCooldownComponent.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using Robust.Shared.GameStates;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
-
-namespace Content.Shared._RMC14.Emote;
-
-[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause]
-[Access(typeof(SharedRMCEmoteSystem))]
-public sealed partial class EmoteCooldownComponent : Component
-{
- [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField, AutoPausedField]
- public TimeSpan NextEmote;
-}
\ No newline at end of file
diff --git a/Content.Shared/_RMC14/Emote/SharedRMCEmoteSystem.cs b/Content.Shared/_RMC14/Emote/SharedRMCEmoteSystem.cs
deleted file mode 100644
index 622bb9617f..0000000000
--- a/Content.Shared/_RMC14/Emote/SharedRMCEmoteSystem.cs
+++ /dev/null
@@ -1,54 +0,0 @@
-using Content.Shared._RMC14.CCVar;
-using Content.Shared.Chat.Prototypes;
-using Robust.Shared.Configuration;
-using Robust.Shared.Prototypes;
-using Robust.Shared.Timing;
-
-namespace Content.Shared._RMC14.Emote;
-
-public abstract class SharedRMCEmoteSystem : EntitySystem
-{
- [Dependency] private readonly IConfigurationManager _config = default!;
- [Dependency] private readonly IGameTiming _timing = default!;
-
- private TimeSpan _emoteCooldown;
-
- public override void Initialize()
- {
- Subs.CVar(_config, RMCCVars.RMCEmoteCooldownSeconds, v => _emoteCooldown = TimeSpan.FromSeconds(v), true);
- }
-
- public virtual void TryEmoteWithChat(
- EntityUid source,
- ProtoId emote,
- bool hideLog = false,
- string? nameOverride = null,
- bool ignoreActionBlocker = false,
- bool forceEmote = false,
- TimeSpan? cooldown = null)
- {
- }
-
- public bool TryEmote(Entity cooldown)
- {
- if (!Resolve(cooldown, ref cooldown.Comp, false))
- return true;
-
- var time = _timing.CurTime;
- if (time < cooldown.Comp.NextEmote)
- return false;
-
- cooldown.Comp.NextEmote = time + _emoteCooldown;
- Dirty(cooldown);
- return true;
- }
-
- public void ResetCooldown(Entity cooldown)
- {
- if (!Resolve(cooldown, ref cooldown.Comp, false))
- return;
-
- cooldown.Comp.NextEmote = _timing.CurTime + _emoteCooldown;
- Dirty(cooldown);
- }
-}
\ No newline at end of file
diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml
index d11029bc9a..6dfb58b992 100644
--- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml
+++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml
@@ -272,7 +272,6 @@
- Normal
- type: JetpackUser # DeltaV: Lets cyborgs fly in space
- type: PreventDropOnDowned # Frontier: borgs don't drop items when falling (e.g. critical/dead)
- - type: EmoteCooldown # DeltaV - implement RMC emote cooldown
- type: PassiveDamage # DeltaV - electric damage disappears over time
allowedStates:
- Alive
diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml
index 3903c61240..23ccdc67ac 100644
--- a/Resources/Prototypes/Entities/Mobs/Species/base.yml
+++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml
@@ -229,7 +229,6 @@
- type: SurgeryTarget # Shitmed Change
- type: CosmicCenserTarget # DeltaV - Cosmic Cult
- type: Carriable # DeltaV
- - type: EmoteCooldown # DeltaV - implement RMC emote cooldown
- type: GrappleTarget # DeltaV - Allow targets to be grappled
- type: entity
diff --git a/Resources/Prototypes/_DV/Voice/speech_emote_sounds.yml b/Resources/Prototypes/_DV/Voice/speech_emote_sounds.yml
index b075c778fe..14f4021aca 100644
--- a/Resources/Prototypes/_DV/Voice/speech_emote_sounds.yml
+++ b/Resources/Prototypes/_DV/Voice/speech_emote_sounds.yml
@@ -32,13 +32,13 @@
collection: HarpyPurrs
HarpyRing:
collection: HarpyRings
- HarpyHonk:
+ Honk:
collection: HarpyHonks
HarpyPew:
collection: HarpyPews
HarpyBang:
collection: HarpyBangs
- HarpyBeep:
+ Beep:
collection: HarpyBeeps
HarpyRev:
collection: HarpyRevs
@@ -50,7 +50,7 @@
collection: HarpySqueak
HarpyCaw:
collection: HarpyCaws
- HarpySquish:
+ Squish:
collection: Squishes
Chirp:
collection: HarpyChirps
@@ -108,13 +108,13 @@
collection: HarpyPurrs
HarpyRing:
collection: HarpyRings
- HarpyHonk:
+ Honk:
collection: HarpyHonks
HarpyPew:
collection: HarpyPews
HarpyBang:
collection: HarpyBangs
- HarpyBeep:
+ Beep:
collection: HarpyBeeps
HarpyRev:
collection: HarpyRevs
@@ -126,7 +126,7 @@
collection: HarpySqueak
HarpyCaw:
collection: HarpyCaws
- HarpySquish:
+ Squish:
collection: Squishes
Chirp:
collection: HarpyChirps
@@ -192,13 +192,13 @@
collection: HarpyPurrs
HarpyRing:
collection: HarpyRings
- HarpyHonk:
+ Honk:
collection: HarpyHonks
HarpyPew:
collection: HarpyPews
HarpyBang:
collection: HarpyBangs
- HarpyBeep:
+ Beep:
collection: HarpyBeeps
HarpyRev:
collection: HarpyRevs
@@ -210,7 +210,7 @@
collection: HarpySqueak
HarpyCaw:
collection: HarpyCaws
- HarpySquish:
+ Squish:
collection: Squishes
Chirp:
collection: HarpyChirps
diff --git a/Resources/Prototypes/_DV/Voice/speech_emotes.yml b/Resources/Prototypes/_DV/Voice/speech_emotes.yml
index a4e4dc7f7c..b5e6e639d3 100644
--- a/Resources/Prototypes/_DV/Voice/speech_emotes.yml
+++ b/Resources/Prototypes/_DV/Voice/speech_emotes.yml
@@ -1,23 +1,4 @@
# Harpy
-- type: emote
- id: HarpyHonk
- name: delta-chat-emote-name-honk
- icon: Interface/Emotes/honk.png
- category: Vocal
- available: false
- whitelist:
- components:
- - Vocal
- blacklist:
- components:
- - BorgChassis
- chatMessages: [honks.]
- chatTriggers:
- - honk
- - honks
- - honking
- - honked
-
- type: emote
id: HarpyRing
name: delta-chat-emote-name-ring
@@ -77,25 +58,6 @@
- banging
- banged
-- type: emote
- id: HarpyBeep
- name: delta-chat-emote-name-beep
- icon: Interface/Emotes/beep.png
- category: Vocal
- available: false
- whitelist:
- components:
- - Vocal
- blacklist:
- components:
- - BorgChassis
- chatMessages: [beeps.]
- chatTriggers:
- - beep
- - beeps
- - beeping
- - beeped
-
- type: emote
id: HarpyRev
name: delta-chat-emote-name-rev