Move ChatSystem.Emotes to shared (#40866)
* move to shared * entity effect to shared * refactor: whitespaces+xml-doc typo fixups * refactor: a little bit more of xml-doc typos fixups Removed Incompatible RMC Emotes stuff. --------- Co-authored-by: pa.pecherskij <pa.pecherskij@interfax.ru>
This commit is contained in:
parent
d633b7321d
commit
8ac76060bb
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
using System.Linq;
|
||||
using Content.Shared.Chat;
|
||||
using Content.Shared.Chat.Prototypes;
|
||||
using Robust.Shared.Prototypes;
|
||||
using Robust.Shared.Random;
|
||||
|
|
|
|||
|
|
@ -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,7 +63,6 @@ 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
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls transmission of chat.
|
||||
/// </summary>
|
||||
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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -1,22 +0,0 @@
|
|||
using Content.Server.Chat.Systems;
|
||||
using Content.Shared.EntityEffects;
|
||||
using Content.Shared.EntityEffects.Effects;
|
||||
|
||||
namespace Content.Server.EntityEffects.Effects;
|
||||
|
||||
/// <summary>
|
||||
/// Makes this entity emote.
|
||||
/// </summary>
|
||||
/// <inheritdoc cref="EntityEffectSystem{T,TEffect}"/>
|
||||
public sealed partial class EmoteEntityEffectSystem : EntityEffectSystem<MetaDataComponent, Emote>
|
||||
{
|
||||
[Dependency] private readonly ChatSystem _chat = default!;
|
||||
|
||||
protected override void Effect(Entity<MetaDataComponent> entity, ref EntityEffectEvent<Emote> args)
|
||||
{
|
||||
if (args.Effect.ShowInChat)
|
||||
_chat.TryEmoteWithChat(entity, args.Effect.EmoteId, ChatTransmitRange.GhostRangeLimit, forceEmote: args.Effect.Force);
|
||||
else
|
||||
_chat.TryEmoteWithoutChat(entity, args.Effect.EmoteId);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<EmotePrototype> emote,
|
||||
bool hideLog = false,
|
||||
string? nameOverride = null,
|
||||
bool ignoreActionBlocker = false,
|
||||
bool forceEmote = false,
|
||||
TimeSpan? cooldown = null)
|
||||
{
|
||||
var recently = EnsureComp<RecentlyEmotedComponent>(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
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -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<ProtoId<EmotePrototype>, TimeSpan> Emotes = new();
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
||||
/// <summary>
|
||||
/// An event raised just before an emote is performed, providing systems with an opportunity to cancel the emote's performance.
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public sealed class BeforeEmoteEvent(EntityUid source, EmotePrototype emote)
|
||||
: CancellableEntityEventArgs, IInventoryRelayEvent
|
||||
{
|
||||
public readonly EntityUid Source = source;
|
||||
public readonly EmotePrototype Emote = emote;
|
||||
|
||||
/// <summary>
|
||||
/// The equipment that is blocking emoting. Should only be non-null if the event was canceled.
|
||||
/// </summary>
|
||||
public EntityUid? Blocker = null;
|
||||
|
||||
public SlotFlags TargetSlots => SlotFlags.WITHOUT_POCKET;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised by the chat system when an entity made some emote.
|
||||
/// Use it to play sound, change sprite or something else.
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public record struct EmoteEvent(EmotePrototype Emote)
|
||||
{
|
||||
/// <summary>
|
||||
/// The used emote.
|
||||
/// </summary>
|
||||
public EmotePrototype Emote = Emote;
|
||||
|
||||
/// <summary>
|
||||
/// If this message has already been "handled" by a previous system.
|
||||
/// </summary>
|
||||
public bool Handled;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sent by the client when requesting the server to play a specific emote selected from the emote radial menu.
|
||||
/// </summary>
|
||||
[Serializable, NetSerializable]
|
||||
public sealed class PlayEmoteMessage(ProtoId<EmotePrototype> protoId) : EntityEventArgs
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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<string, ImmutableList<EmotePrototype>> _wordEmoteDict = FrozenDictionary<string, ImmutableList<EmotePrototype>>.Empty; // DeltaV - Multiple emotes
|
||||
|
||||
protected override void OnPrototypeReload(PrototypesReloadedEventArgs obj)
|
||||
{
|
||||
base.OnPrototypeReload(obj);
|
||||
if (obj.WasModified<EmotePrototype>())
|
||||
CacheEmotes();
|
||||
}
|
||||
private FrozenDictionary<string, EmotePrototype> _wordEmoteDict = FrozenDictionary<string, EmotePrototype>.Empty;
|
||||
|
||||
private void CacheEmotes()
|
||||
{
|
||||
var dict = new Dictionary<string, ImmutableList<EmotePrototype>>(); // DeltaV - Multiple triggers for the same emote
|
||||
var dict = new Dictionary<string, EmotePrototype>();
|
||||
var emotes = _prototypeManager.EnumeratePrototypes<EmotePrototype>();
|
||||
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
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Makes selected entity to emote using <see cref="EmotePrototype"/> and sends message to chat.
|
||||
/// Makes the selected entity emote using the given <see cref="EmotePrototype"/> and sends a message to chat.
|
||||
/// </summary>
|
||||
/// <param name="source">The entity that is speaking</param>
|
||||
/// <param name="emoteId">The id of emote prototype. Should has valid <see cref="EmotePrototype.ChatMessages"/></param>
|
||||
/// <param name="hideLog">Whether or not this message should appear in the adminlog window</param>
|
||||
/// <param name="emoteId">The id of emote prototype. Should have valid <see cref="EmotePrototype.ChatMessages"/></param>
|
||||
/// <param name="hideLog">Whether this message should appear in the adminlog window, or not.</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="ignoreActionBlocker">Whether emote action blocking should be ignored or not.</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>
|
||||
/// <returns>True if an emote was performed. False if the emote is unvailable, cancelled, etc.</returns>
|
||||
/// <returns>True if an emote was performed. False if the emote is unavailable, cancelled, etc.</returns>
|
||||
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<EmotePrototype>(emoteId, out var proto))
|
||||
if (!_prototypeManager.Resolve<EmotePrototype>(emoteId, out var proto))
|
||||
return false;
|
||||
|
||||
return TryEmoteWithChat(source, proto, range, hideLog: hideLog, nameOverride, ignoreActionBlocker: ignoreActionBlocker, forceEmote: forceEmote);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Makes selected entity to emote using <see cref="EmotePrototype"/> and sends message to chat.
|
||||
/// Makes the selected entity emote using the given <see cref="EmotePrototype"/> and sends a message to chat.
|
||||
/// </summary>
|
||||
/// <param name="source">The entity that is speaking</param>
|
||||
/// <param name="emote">The emote prototype. Should has valid <see cref="EmotePrototype.ChatMessages"/></param>
|
||||
/// <param name="hideLog">Whether or not this message should appear in the adminlog window</param>
|
||||
/// <param name="hideChat">Whether or not this message should appear in the chat window</param>
|
||||
/// <param name="source">The entity that is speaking.</param>
|
||||
/// <param name="emote">The emote prototype. Should have valid <see cref="EmotePrototype.ChatMessages"/>.</param>
|
||||
/// <param name="hideLog">Whether this message should appear in the adminlog window or not.</param>
|
||||
/// <param name="ignoreActionBlocker">Whether emote action blocking should be ignored or not.</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>
|
||||
/// <returns>True if an emote was performed. False if the emote is unvailable, cancelled, etc.</returns>
|
||||
/// <returns>True if an emote was performed. False if the emote is unavailable, cancelled, etc.</returns>
|
||||
public bool TryEmoteWithChat(
|
||||
EntityUid source,
|
||||
EmotePrototype emote,
|
||||
|
|
@ -114,21 +105,21 @@ public partial class ChatSystem
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Makes selected entity to emote using <see cref="EmotePrototype"/> without sending any messages to chat.
|
||||
/// Makes the selected entity emote using the given <see cref="EmotePrototype"/> without sending any messages to chat.
|
||||
/// </summary>
|
||||
/// <returns>True if an emote was performed. False if the emote is unvailable, cancelled, etc.</returns>
|
||||
/// <returns>True if an emote was performed. False if the emote is unavailable, cancelled, etc.</returns>
|
||||
public bool TryEmoteWithoutChat(EntityUid uid, string emoteId, bool ignoreActionBlocker = false)
|
||||
{
|
||||
if (!_prototypeManager.TryIndex<EmotePrototype>(emoteId, out var proto))
|
||||
if (!_prototypeManager.Resolve<EmotePrototype>(emoteId, out var proto))
|
||||
return false;
|
||||
|
||||
return TryEmoteWithoutChat(uid, proto, ignoreActionBlocker);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Makes selected entity to emote using <see cref="EmotePrototype"/> without sending any messages to chat.
|
||||
/// Makes the selected entity emote using the given <see cref="EmotePrototype"/> without sending any messages to chat.
|
||||
/// </summary>
|
||||
/// <returns>True if an emote was performed. False if the emote is unvailable, cancelled, etc.</returns>
|
||||
/// <returns>True if an emote was performed. False if the emote is unavailable, cancelled, etc.</returns>
|
||||
public bool TryEmoteWithoutChat(EntityUid uid, EmotePrototype proto, bool ignoreActionBlocker = false)
|
||||
{
|
||||
if (!_actionBlocker.CanEmote(uid) && !ignoreActionBlocker)
|
||||
|
|
@ -138,7 +129,7 @@ public partial class ChatSystem
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
/// <returns>True if emote sound was played.</returns>
|
||||
public bool TryPlayEmoteSound(EntityUid uid, EmoteSoundsPrototype? proto, EmotePrototype emote, AudioParams? audioParams = null)
|
||||
|
|
@ -147,7 +138,7 @@ public partial class ChatSystem
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </summary>
|
||||
/// <returns>True if emote sound was played.</returns>
|
||||
public bool TryPlayEmoteSound(EntityUid uid, EmoteSoundsPrototype? proto, string emoteId, AudioParams? audioParams = null)
|
||||
|
|
@ -172,62 +163,27 @@ public partial class ChatSystem
|
|||
/// <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>
|
||||
/// <param name="source">The entity that is speaking</param>
|
||||
/// <param name="textInput">Formatted emote message.</param>
|
||||
/// <returns>True if the chat message should be displayed (because the emote was explicitly cancelled), false if it should not be.</returns>
|
||||
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];
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 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.
|
||||
/// </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)
|
||||
public bool AllowedToUseEmote(EntityUid source, EmotePrototype emote)
|
||||
{
|
||||
// If emote is in AllowedEmotes, it will bypass whitelist and blacklist
|
||||
if (TryComp<SpeechComponent>(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
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Raised by chat system when entity made some emote.
|
||||
/// Use it to play sound, change sprite or something else.
|
||||
/// </summary>
|
||||
[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];
|
||||
}
|
||||
}
|
||||
|
|
@ -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!;
|
||||
|
||||
/// <summary>
|
||||
/// 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<PrototypesReloadedEventArgs>(OnPrototypeReload);
|
||||
CacheRadios();
|
||||
CacheEmotes();
|
||||
}
|
||||
|
||||
protected virtual void OnPrototypeReload(PrototypesReloadedEventArgs obj)
|
||||
{
|
||||
if (obj.WasModified<RadioChannelPrototype>())
|
||||
CacheRadios();
|
||||
|
||||
if (obj.WasModified<EmotePrototype>())
|
||||
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
|
||||
)
|
||||
{ }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Controls transmission of chat.
|
||||
/// </summary>
|
||||
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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// An event raised just before an emote is performed, providing systems with an opportunity to cancel the emote's performance.
|
||||
/// </summary>
|
||||
[ByRefEvent]
|
||||
public sealed class BeforeEmoteEvent(EntityUid source, EmotePrototype emote)
|
||||
: CancellableEntityEventArgs, IInventoryRelayEvent
|
||||
{
|
||||
public readonly EntityUid Source = source;
|
||||
public readonly EmotePrototype Emote = emote;
|
||||
|
||||
/// <summary>
|
||||
/// The equipment that is blocking emoting. Should only be non-null if the event was canceled.
|
||||
/// </summary>
|
||||
public EntityUid? Blocker = null;
|
||||
|
||||
public SlotFlags TargetSlots => SlotFlags.WITHOUT_POCKET;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/// <summary>
|
||||
/// Makes this entity emote.
|
||||
/// </summary>
|
||||
/// <inheritdoc cref="EntityEffectSystem{T,TEffect}"/>
|
||||
public sealed partial class EmoteEntityEffectSystem : EntityEffectSystem<MetaDataComponent, Emote>
|
||||
{
|
||||
[Dependency] private readonly SharedChatSystem _chat = default!;
|
||||
|
||||
protected override void Effect(Entity<MetaDataComponent> entity, ref EntityEffectEvent<Emote> args)
|
||||
{
|
||||
if (args.Effect.ShowInChat)
|
||||
_chat.TryEmoteWithChat(entity, args.Effect.EmoteId, ChatTransmitRange.GhostRangeLimit, forceEmote: args.Effect.Force);
|
||||
else
|
||||
_chat.TryEmoteWithoutChat(entity, args.Effect.EmoteId);
|
||||
}
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="EntityEffect"/>
|
||||
public sealed partial class Emote : EntityEffectBase<Emote>
|
||||
{
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
/// <summary>
|
||||
/// Suppresses emotes with the given categories or ID.
|
||||
/// Additionally, if the Scream Emote would be blocked, also blocks the Scream Action.
|
||||
/// </summary>
|
||||
[RegisterComponent]
|
||||
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
|
||||
public sealed partial class EmoteBlockerComponent : Component
|
||||
{
|
||||
/// <summary>
|
||||
/// Which categories of emotes are blocked by this component.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
[DataField, AutoNetworkedField]
|
||||
public HashSet<EmoteCategory> BlocksCategories = [];
|
||||
|
||||
/// <summary>
|
||||
/// IDs of which specific emotes are blocked by this component.
|
||||
/// </summary>
|
||||
[DataField]
|
||||
[DataField, AutoNetworkedField]
|
||||
public HashSet<ProtoId<EmotePrototype>> BlocksEmotes = [];
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
|
|
@ -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<float> RMCEmoteCooldownSeconds =
|
||||
CVarDef.Create("rmc.emote_cooldown_seconds", 3f, CVar.SERVER | CVar.REPLICATED);
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -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<EmotePrototype> emote,
|
||||
bool hideLog = false,
|
||||
string? nameOverride = null,
|
||||
bool ignoreActionBlocker = false,
|
||||
bool forceEmote = false,
|
||||
TimeSpan? cooldown = null)
|
||||
{
|
||||
}
|
||||
|
||||
public bool TryEmote(Entity<EmoteCooldownComponent?> 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<EmoteCooldownComponent?> cooldown)
|
||||
{
|
||||
if (!Resolve(cooldown, ref cooldown.Comp, false))
|
||||
return;
|
||||
|
||||
cooldown.Comp.NextEmote = _timing.CurTime + _emoteCooldown;
|
||||
Dirty(cooldown);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue