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:
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user