Humans can no longer honk on command (#28566)

* Humans can no longer honk on command

* Undo change it emote file

* I hate tabs

* Some comments
This commit is contained in:
Verm
2024-06-03 18:45:00 -05:00
committed by GitHub
parent b51f04a765
commit 2ae5c953de
4 changed files with 41 additions and 13 deletions

View 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="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="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="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( public void TryEmoteWithChat(
EntityUid source, EntityUid source,
string emoteId, string emoteId,
ChatTransmitRange range = ChatTransmitRange.Normal, ChatTransmitRange range = ChatTransmitRange.Normal,
bool hideLog = false, bool hideLog = false,
string? nameOverride = null, string? nameOverride = null,
bool ignoreActionBlocker = false bool ignoreActionBlocker = false,
bool forceEmote = false
) )
{ {
if (!_prototypeManager.TryIndex<EmotePrototype>(emoteId, out var proto)) if (!_prototypeManager.TryIndex<EmotePrototype>(emoteId, out var proto))
return; return;
TryEmoteWithChat(source, proto, range, hideLog: hideLog, nameOverride, ignoreActionBlocker: ignoreActionBlocker); TryEmoteWithChat(source, proto, range, hideLog: hideLog, nameOverride, ignoreActionBlocker: ignoreActionBlocker, forceEmote: forceEmote);
} }
/// <summary> /// <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="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="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="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( public void TryEmoteWithChat(
EntityUid source, EntityUid source,
EmotePrototype emote, EmotePrototype emote,
ChatTransmitRange range = ChatTransmitRange.Normal, ChatTransmitRange range = ChatTransmitRange.Normal,
bool hideLog = false, bool hideLog = false,
string? nameOverride = null, string? nameOverride = null,
bool ignoreActionBlocker = false bool ignoreActionBlocker = false,
bool forceEmote = false
) )
{ {
if (!forceEmote && !AllowedToUseEmote(source, emote))
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))
return; return;
// check if proto has valid message for chat // check if proto has valid message for chat
@@ -156,15 +154,40 @@ public partial class ChatSystem
_audio.PlayPvs(sound, uid, param); _audio.PlayPvs(sound, uid, param);
return true; 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) private void TryEmoteChatInput(EntityUid uid, string textInput)
{ {
var actionLower = textInput.ToLower(); var actionLower = textInput.ToLower();
if (!_wordEmoteDict.TryGetValue(actionLower, out var emote)) if (!_wordEmoteDict.TryGetValue(actionLower, out var emote))
return; return;
if (!AllowedToUseEmote(uid, emote))
return;
InvokeEmoteEvent(uid, emote); 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) private void InvokeEmoteEvent(EntityUid uid, EmotePrototype proto)
{ {

View File

@@ -8,7 +8,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototy
namespace Content.Server.Chemistry.ReagentEffects; namespace Content.Server.Chemistry.ReagentEffects;
/// <summary> /// <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> /// </summary>
[UsedImplicitly] [UsedImplicitly]
public sealed partial class Emote : ReagentEffect public sealed partial class Emote : ReagentEffect
@@ -19,6 +19,9 @@ public sealed partial class Emote : ReagentEffect
[DataField] [DataField]
public bool ShowInChat; public bool ShowInChat;
[DataField]
public bool Force = false;
// JUSTIFICATION: Emoting is flavor, so same reason popup messages are not in here. // JUSTIFICATION: Emoting is flavor, so same reason popup messages are not in here.
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys) protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> null; => null;
@@ -30,7 +33,7 @@ public sealed partial class Emote : ReagentEffect
var chatSys = args.EntityManager.System<ChatSystem>(); var chatSys = args.EntityManager.System<ChatSystem>();
if (ShowInChat) if (ShowInChat)
chatSys.TryEmoteWithChat(args.SolutionEntity, EmoteId, ChatTransmitRange.GhostRangeLimit); chatSys.TryEmoteWithChat(args.SolutionEntity, EmoteId, ChatTransmitRange.GhostRangeLimit, forceEmote: Force);
else else
chatSys.TryEmoteWithoutChat(args.SolutionEntity, EmoteId); chatSys.TryEmoteWithoutChat(args.SolutionEntity, EmoteId);

View File

@@ -333,6 +333,7 @@
- !type:Emote - !type:Emote
emote: Weh emote: Weh
showInChat: true showInChat: true
force: true
probability: 0.5 probability: 0.5
- !type:Polymorph - !type:Polymorph
prototype: ArtifactLizard # Does the same thing as the original YML I made for this reagent. prototype: ArtifactLizard # Does the same thing as the original YML I made for this reagent.

View File

@@ -560,6 +560,7 @@
- !type:Emote - !type:Emote
emote: Honk emote: Honk
showInChat: true showInChat: true
force: true
probability: 0.2 probability: 0.2
- !type:HealthChange - !type:HealthChange
conditions: conditions: