]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Humans can no longer honk on command (#28566)
authorVerm <32827189+Vermidia@users.noreply.github.com>
Mon, 3 Jun 2024 23:45:00 +0000 (18:45 -0500)
committerGitHub <noreply@github.com>
Mon, 3 Jun 2024 23:45:00 +0000 (01:45 +0200)
* Humans can no longer honk on command

* Undo change it emote file

* I hate tabs

* Some comments

Content.Server/Chat/Systems/ChatSystem.Emote.cs
Content.Server/Chemistry/ReagentEffects/Emote.cs
Resources/Prototypes/Reagents/fun.yml
Resources/Prototypes/Reagents/toxins.yml

index 20a4f18746500fae5975d5076155c0301d66d9ac..e4e5c39eeb671ceb142e9b6e1fb63e06e18ec2cc 100644 (file)
@@ -49,18 +49,20 @@ public partial class ChatSystem
     /// <param name="hideLog">Whether or not this message should appear in the adminlog window</param>
     /// <param name="range">Conceptual range of transmission, if it shows in the chat window, if it shows to far-away ghosts or ghosts at all...</param>
     /// <param name="nameOverride">The name to use for the speaking entity. Usually this should just be modified via <see cref="TransformSpeakerNameEvent"/>. If this is set, the event will not get raised.</param>
+    /// <param name="forceEmote">Bypasses whitelist/blacklist/availibility checks for if the entity can use this emote</param>
     public void TryEmoteWithChat(
         EntityUid source,
         string emoteId,
         ChatTransmitRange range = ChatTransmitRange.Normal,
         bool hideLog = false,
         string? nameOverride = null,
-        bool ignoreActionBlocker = false
+        bool ignoreActionBlocker = false,
+        bool forceEmote = false
         )
     {
         if (!_prototypeManager.TryIndex<EmotePrototype>(emoteId, out var proto))
             return;
-        TryEmoteWithChat(source, proto, range, hideLog: hideLog, nameOverride, ignoreActionBlocker: ignoreActionBlocker);
+        TryEmoteWithChat(source, proto, range, hideLog: hideLog, nameOverride, ignoreActionBlocker: ignoreActionBlocker, forceEmote: forceEmote);
     }
 
     /// <summary>
@@ -72,22 +74,18 @@ public partial class ChatSystem
     /// <param name="hideChat">Whether or not this message should appear in the chat window</param>
     /// <param name="range">Conceptual range of transmission, if it shows in the chat window, if it shows to far-away ghosts or ghosts at all...</param>
     /// <param name="nameOverride">The name to use for the speaking entity. Usually this should just be modified via <see cref="TransformSpeakerNameEvent"/>. If this is set, the event will not get raised.</param>
+    /// <param name="forceEmote">Bypasses whitelist/blacklist/availibility checks for if the entity can use this emote</param>
     public void TryEmoteWithChat(
         EntityUid source,
         EmotePrototype emote,
         ChatTransmitRange range = ChatTransmitRange.Normal,
         bool hideLog = false,
         string? nameOverride = null,
-        bool ignoreActionBlocker = false
+        bool ignoreActionBlocker = false,
+        bool forceEmote = false
         )
     {
-
-        if (_whitelistSystem.IsWhitelistFail(emote.Whitelist, source) || _whitelistSystem.IsBlacklistPass(emote.Blacklist, source))
-            return;
-
-        if (!emote.Available &&
-            TryComp<SpeechComponent>(source, out var speech) &&
-            !speech.AllowedEmotes.Contains(emote.ID))
+        if (!forceEmote && !AllowedToUseEmote(source, emote))
             return;
 
         // check if proto has valid message for chat
@@ -156,15 +154,40 @@ public partial class ChatSystem
         _audio.PlayPvs(sound, uid, param);
         return true;
     }
-
+    /// <summary>
+    /// Checks if a valid emote was typed, to play sounds and etc and invokes an event.
+    /// </summary>
+    /// <param name="uid"></param>
+    /// <param name="textInput"></param>
     private void TryEmoteChatInput(EntityUid uid, string textInput)
     {
         var actionLower = textInput.ToLower();
         if (!_wordEmoteDict.TryGetValue(actionLower, out var emote))
             return;
 
+        if (!AllowedToUseEmote(uid, emote))
+            return;
+
         InvokeEmoteEvent(uid, emote);
     }
+    /// <summary>
+    /// Checks if we can use this emote based on the emotes whitelist, blacklist, and availibility to the entity.
+    /// </summary>
+    /// <param name="source">The entity that is speaking</param>
+    /// <param name="emote">The emote being used</param>
+    /// <returns></returns>
+    private bool AllowedToUseEmote(EntityUid source, EmotePrototype emote)
+    {
+        if ((_whitelistSystem.IsWhitelistFail(emote.Whitelist, source) || _whitelistSystem.IsBlacklistPass(emote.Blacklist, source)))
+            return false;
+
+        if (!emote.Available &&
+            TryComp<SpeechComponent>(source, out var speech) &&
+            !speech.AllowedEmotes.Contains(emote.ID))
+            return false;
+
+        return true;
+    }
 
     private void InvokeEmoteEvent(EntityUid uid, EmotePrototype proto)
     {
index a4d49e4ad1cfe20530eed5a65354a1ceca1c154e..db6de6cc75be9246010f9d4dc0ea744a671a8fc1 100644 (file)
@@ -8,7 +8,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototy
 namespace Content.Server.Chemistry.ReagentEffects;
 
 /// <summary>
-///     Tries to force someone to emote (scream, laugh, etc).
+///     Tries to force someone to emote (scream, laugh, etc). Still respects whitelists/blacklists and other limits of the specified emote unless forced.
 /// </summary>
 [UsedImplicitly]
 public sealed partial class Emote : ReagentEffect
@@ -19,6 +19,9 @@ public sealed partial class Emote : ReagentEffect
     [DataField]
     public bool ShowInChat;
 
+    [DataField]
+    public bool Force = false;
+
     // JUSTIFICATION: Emoting is flavor, so same reason popup messages are not in here.
     protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
         => null;
@@ -30,7 +33,7 @@ public sealed partial class Emote : ReagentEffect
 
         var chatSys = args.EntityManager.System<ChatSystem>();
         if (ShowInChat)
-            chatSys.TryEmoteWithChat(args.SolutionEntity, EmoteId, ChatTransmitRange.GhostRangeLimit);
+            chatSys.TryEmoteWithChat(args.SolutionEntity, EmoteId, ChatTransmitRange.GhostRangeLimit, forceEmote: Force);
         else
             chatSys.TryEmoteWithoutChat(args.SolutionEntity, EmoteId);
 
index befa8d829688ed6612d83ec6cd6ddb627736628f..1df2636c8cebc9c4f7f72b94aefd79c508e73ce4 100644 (file)
       - !type:Emote
         emote: Weh
         showInChat: true
+        force: true
         probability: 0.5
       - !type:Polymorph
         prototype: ArtifactLizard # Does the same thing as the original YML I made for this reagent.
index f5b196acf6b604588cc039549027fdcdf8d36205..9665de7b099eca79d423cb709f386a51d3af7232 100644 (file)
       - !type:Emote
         emote: Honk
         showInChat: true
+        force: true
         probability: 0.2
       - !type:HealthChange
         conditions: