Emotes Menu (#26702)
* Basic emote radial menu * Move out from corvax * Move to UI controller & add to top menu bar and key bind * Make emote play * Add name localization for emotes * Localize chat messages * Fix emote menu * Add categories localization * Fixes * Fix * Add emotes entity blacklist * Fix entity whitelist required all logic * Remove unused wagging emote * Revert sprite * Set default texture for emote icon * Update Resources/keybinds.yml --------- Co-authored-by: Kara <lunarautomaton6@gmail.com>
This commit is contained in:
31
Content.Client/Chat/UI/EmotesMenu.xaml
Normal file
31
Content.Client/Chat/UI/EmotesMenu.xaml
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<ui:RadialMenu xmlns="https://spacestation14.io"
|
||||||
|
xmlns:ui="clr-namespace:Content.Client.UserInterface.Controls"
|
||||||
|
BackButtonStyleClass="RadialMenuBackButton"
|
||||||
|
CloseButtonStyleClass="RadialMenuCloseButton"
|
||||||
|
VerticalExpand="True"
|
||||||
|
HorizontalExpand="True"
|
||||||
|
MinSize="450 450">
|
||||||
|
|
||||||
|
<!-- Main -->
|
||||||
|
<ui:RadialContainer Name="Main" VerticalExpand="True" HorizontalExpand="True" Radius="64" ReserveSpaceForHiddenChildren="False">
|
||||||
|
<ui:RadialMenuTextureButton StyleClasses="RadialMenuButton" SetSize="64 64" ToolTip="{Loc 'emote-menu-category-general'}" TargetLayer="General" Visible="False">
|
||||||
|
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2 2" TexturePath="/Textures/Clothing/Head/Soft/mimesoft.rsi/icon.png"/>
|
||||||
|
</ui:RadialMenuTextureButton>
|
||||||
|
<ui:RadialMenuTextureButton StyleClasses="RadialMenuButton" SetSize="64 64" ToolTip="{Loc 'emote-menu-category-vocal'}" TargetLayer="Vocal" Visible="False">
|
||||||
|
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2 2" TexturePath="/Textures/Interface/Actions/scream.png"/>
|
||||||
|
</ui:RadialMenuTextureButton>
|
||||||
|
<ui:RadialMenuTextureButton StyleClasses="RadialMenuButton" SetSize="64 64" ToolTip="{Loc 'emote-menu-category-hands'}" TargetLayer="Hands" Visible="False">
|
||||||
|
<TextureRect VerticalAlignment="Center" HorizontalAlignment="Center" TextureScale="2 2" TexturePath="/Textures/Clothing/Hands/Gloves/latex.rsi/icon.png"/>
|
||||||
|
</ui:RadialMenuTextureButton>
|
||||||
|
</ui:RadialContainer>
|
||||||
|
|
||||||
|
<!-- General -->
|
||||||
|
<ui:RadialContainer Name="General" VerticalExpand="True" HorizontalExpand="True" Radius="64"/>
|
||||||
|
|
||||||
|
<!-- Vocal -->
|
||||||
|
<ui:RadialContainer Name="Vocal" VerticalExpand="True" HorizontalExpand="True" Radius="64"/>
|
||||||
|
|
||||||
|
<!-- Hands -->
|
||||||
|
<ui:RadialContainer Name="Hands" VerticalExpand="True" HorizontalExpand="True" Radius="64"/>
|
||||||
|
|
||||||
|
</ui:RadialMenu>
|
||||||
112
Content.Client/Chat/UI/EmotesMenu.xaml.cs
Normal file
112
Content.Client/Chat/UI/EmotesMenu.xaml.cs
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
using System.Numerics;
|
||||||
|
using Content.Client.UserInterface.Controls;
|
||||||
|
using Content.Shared.Chat.Prototypes;
|
||||||
|
using Content.Shared.Speech;
|
||||||
|
using Robust.Client.AutoGenerated;
|
||||||
|
using Robust.Client.GameObjects;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Client.UserInterface.XAML;
|
||||||
|
using Robust.Shared.Player;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Client.Chat.UI;
|
||||||
|
|
||||||
|
[GenerateTypedNameReferences]
|
||||||
|
public sealed partial class EmotesMenu : RadialMenu
|
||||||
|
{
|
||||||
|
[Dependency] private readonly EntityManager _entManager = default!;
|
||||||
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
|
[Dependency] private readonly ISharedPlayerManager _playerManager = default!;
|
||||||
|
|
||||||
|
private readonly SpriteSystem _spriteSystem;
|
||||||
|
|
||||||
|
public event Action<ProtoId<EmotePrototype>>? OnPlayEmote;
|
||||||
|
|
||||||
|
public EmotesMenu()
|
||||||
|
{
|
||||||
|
IoCManager.InjectDependencies(this);
|
||||||
|
RobustXamlLoader.Load(this);
|
||||||
|
|
||||||
|
_spriteSystem = _entManager.System<SpriteSystem>();
|
||||||
|
|
||||||
|
var main = FindControl<RadialContainer>("Main");
|
||||||
|
|
||||||
|
var emotes = _prototypeManager.EnumeratePrototypes<EmotePrototype>();
|
||||||
|
foreach (var emote in emotes)
|
||||||
|
{
|
||||||
|
var player = _playerManager.LocalSession?.AttachedEntity;
|
||||||
|
if (emote.Category == EmoteCategory.Invalid ||
|
||||||
|
emote.ChatTriggers.Count == 0 ||
|
||||||
|
!(player.HasValue && (emote.Whitelist?.IsValid(player.Value, _entManager) ?? true)) ||
|
||||||
|
(emote.Blacklist?.IsValid(player.Value, _entManager) ?? false))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!emote.Available &&
|
||||||
|
_entManager.TryGetComponent<SpeechComponent>(player.Value, out var speech) &&
|
||||||
|
!speech.AllowedEmotes.Contains(emote.ID))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
var parent = FindControl<RadialContainer>(emote.Category.ToString());
|
||||||
|
|
||||||
|
var button = new EmoteMenuButton
|
||||||
|
{
|
||||||
|
StyleClasses = { "RadialMenuButton" },
|
||||||
|
SetSize = new Vector2(64f, 64f),
|
||||||
|
ToolTip = Loc.GetString(emote.Name),
|
||||||
|
ProtoId = emote.ID,
|
||||||
|
};
|
||||||
|
|
||||||
|
var tex = new TextureRect
|
||||||
|
{
|
||||||
|
VerticalAlignment = VAlignment.Center,
|
||||||
|
HorizontalAlignment = HAlignment.Center,
|
||||||
|
Texture = _spriteSystem.Frame0(emote.Icon),
|
||||||
|
TextureScale = new Vector2(2f, 2f),
|
||||||
|
};
|
||||||
|
|
||||||
|
button.AddChild(tex);
|
||||||
|
parent.AddChild(button);
|
||||||
|
foreach (var child in main.Children)
|
||||||
|
{
|
||||||
|
if (child is not RadialMenuTextureButton castChild)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (castChild.TargetLayer == emote.Category.ToString())
|
||||||
|
{
|
||||||
|
castChild.Visible = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Set up menu actions
|
||||||
|
foreach (var child in Children)
|
||||||
|
{
|
||||||
|
if (child is not RadialContainer container)
|
||||||
|
continue;
|
||||||
|
AddEmoteClickAction(container);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddEmoteClickAction(RadialContainer container)
|
||||||
|
{
|
||||||
|
foreach (var child in container.Children)
|
||||||
|
{
|
||||||
|
if (child is not EmoteMenuButton castChild)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
castChild.OnButtonUp += _ =>
|
||||||
|
{
|
||||||
|
OnPlayEmote?.Invoke(castChild.ProtoId);
|
||||||
|
Close();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public sealed class EmoteMenuButton : RadialMenuTextureButton
|
||||||
|
{
|
||||||
|
public ProtoId<EmotePrototype> ProtoId { get; set; }
|
||||||
|
}
|
||||||
@@ -60,6 +60,7 @@ namespace Content.Client.Input
|
|||||||
human.AddFunction(ContentKeyFunctions.UseItemInHand);
|
human.AddFunction(ContentKeyFunctions.UseItemInHand);
|
||||||
human.AddFunction(ContentKeyFunctions.AltUseItemInHand);
|
human.AddFunction(ContentKeyFunctions.AltUseItemInHand);
|
||||||
human.AddFunction(ContentKeyFunctions.OpenCharacterMenu);
|
human.AddFunction(ContentKeyFunctions.OpenCharacterMenu);
|
||||||
|
human.AddFunction(ContentKeyFunctions.OpenEmotesMenu);
|
||||||
human.AddFunction(ContentKeyFunctions.ActivateItemInWorld);
|
human.AddFunction(ContentKeyFunctions.ActivateItemInWorld);
|
||||||
human.AddFunction(ContentKeyFunctions.ThrowItemInHand);
|
human.AddFunction(ContentKeyFunctions.ThrowItemInHand);
|
||||||
human.AddFunction(ContentKeyFunctions.AltActivateItemInWorld);
|
human.AddFunction(ContentKeyFunctions.AltActivateItemInWorld);
|
||||||
|
|||||||
@@ -0,0 +1,125 @@
|
|||||||
|
using Content.Client.Chat.UI;
|
||||||
|
using Content.Client.Gameplay;
|
||||||
|
using Content.Client.UserInterface.Controls;
|
||||||
|
using Content.Shared.Chat;
|
||||||
|
using Content.Shared.Chat.Prototypes;
|
||||||
|
using Content.Shared.Input;
|
||||||
|
using JetBrains.Annotations;
|
||||||
|
using Robust.Client.Graphics;
|
||||||
|
using Robust.Client.Input;
|
||||||
|
using Robust.Client.UserInterface.Controllers;
|
||||||
|
using Robust.Client.UserInterface.Controls;
|
||||||
|
using Robust.Shared.Input.Binding;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Client.UserInterface.Systems.Emotes;
|
||||||
|
|
||||||
|
[UsedImplicitly]
|
||||||
|
public sealed class EmotesUIController : UIController, IOnStateChanged<GameplayState>
|
||||||
|
{
|
||||||
|
[Dependency] private readonly IEntityManager _entityManager = default!;
|
||||||
|
[Dependency] private readonly IClyde _displayManager = default!;
|
||||||
|
[Dependency] private readonly IInputManager _inputManager = default!;
|
||||||
|
|
||||||
|
private MenuButton? EmotesButton => UIManager.GetActiveUIWidgetOrNull<MenuBar.Widgets.GameTopMenuBar>()?.EmotesButton;
|
||||||
|
private EmotesMenu? _menu;
|
||||||
|
|
||||||
|
public void OnStateEntered(GameplayState state)
|
||||||
|
{
|
||||||
|
CommandBinds.Builder
|
||||||
|
.Bind(ContentKeyFunctions.OpenEmotesMenu,
|
||||||
|
InputCmdHandler.FromDelegate(_ => ToggleEmotesMenu(false)))
|
||||||
|
.Register<EmotesUIController>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnStateExited(GameplayState state)
|
||||||
|
{
|
||||||
|
CommandBinds.Unregister<EmotesUIController>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleEmotesMenu(bool centered)
|
||||||
|
{
|
||||||
|
if (_menu == null)
|
||||||
|
{
|
||||||
|
// setup window
|
||||||
|
_menu = UIManager.CreateWindow<EmotesMenu>();
|
||||||
|
_menu.OnClose += OnWindowClosed;
|
||||||
|
_menu.OnOpen += OnWindowOpen;
|
||||||
|
_menu.OnPlayEmote += OnPlayEmote;
|
||||||
|
|
||||||
|
if (EmotesButton != null)
|
||||||
|
EmotesButton.SetClickPressed(true);
|
||||||
|
|
||||||
|
if (centered)
|
||||||
|
{
|
||||||
|
_menu.OpenCentered();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Open the menu, centered on the mouse
|
||||||
|
var vpSize = _displayManager.ScreenSize;
|
||||||
|
_menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_menu.OnClose -= OnWindowClosed;
|
||||||
|
_menu.OnOpen -= OnWindowOpen;
|
||||||
|
_menu.OnPlayEmote -= OnPlayEmote;
|
||||||
|
|
||||||
|
if (EmotesButton != null)
|
||||||
|
EmotesButton.SetClickPressed(false);
|
||||||
|
|
||||||
|
CloseMenu();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void UnloadButton()
|
||||||
|
{
|
||||||
|
if (EmotesButton == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
EmotesButton.OnPressed -= ActionButtonPressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LoadButton()
|
||||||
|
{
|
||||||
|
if (EmotesButton == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
EmotesButton.OnPressed += ActionButtonPressed;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ActionButtonPressed(BaseButton.ButtonEventArgs args)
|
||||||
|
{
|
||||||
|
ToggleEmotesMenu(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnWindowClosed()
|
||||||
|
{
|
||||||
|
if (EmotesButton != null)
|
||||||
|
EmotesButton.Pressed = false;
|
||||||
|
|
||||||
|
CloseMenu();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnWindowOpen()
|
||||||
|
{
|
||||||
|
if (EmotesButton != null)
|
||||||
|
EmotesButton.Pressed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CloseMenu()
|
||||||
|
{
|
||||||
|
if (_menu == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_menu.Dispose();
|
||||||
|
_menu = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPlayEmote(ProtoId<EmotePrototype> protoId)
|
||||||
|
{
|
||||||
|
_entityManager.RaisePredictiveEvent(new PlayEmoteMessage(protoId));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,6 +3,7 @@ using Content.Client.UserInterface.Systems.Admin;
|
|||||||
using Content.Client.UserInterface.Systems.Bwoink;
|
using Content.Client.UserInterface.Systems.Bwoink;
|
||||||
using Content.Client.UserInterface.Systems.Character;
|
using Content.Client.UserInterface.Systems.Character;
|
||||||
using Content.Client.UserInterface.Systems.Crafting;
|
using Content.Client.UserInterface.Systems.Crafting;
|
||||||
|
using Content.Client.UserInterface.Systems.Emotes;
|
||||||
using Content.Client.UserInterface.Systems.EscapeMenu;
|
using Content.Client.UserInterface.Systems.EscapeMenu;
|
||||||
using Content.Client.UserInterface.Systems.Gameplay;
|
using Content.Client.UserInterface.Systems.Gameplay;
|
||||||
using Content.Client.UserInterface.Systems.Guidebook;
|
using Content.Client.UserInterface.Systems.Guidebook;
|
||||||
@@ -22,6 +23,7 @@ public sealed class GameTopMenuBarUIController : UIController
|
|||||||
[Dependency] private readonly ActionUIController _action = default!;
|
[Dependency] private readonly ActionUIController _action = default!;
|
||||||
[Dependency] private readonly SandboxUIController _sandbox = default!;
|
[Dependency] private readonly SandboxUIController _sandbox = default!;
|
||||||
[Dependency] private readonly GuidebookUIController _guidebook = default!;
|
[Dependency] private readonly GuidebookUIController _guidebook = default!;
|
||||||
|
[Dependency] private readonly EmotesUIController _emotes = default!;
|
||||||
|
|
||||||
private GameTopMenuBar? GameTopMenuBar => UIManager.GetActiveUIWidgetOrNull<GameTopMenuBar>();
|
private GameTopMenuBar? GameTopMenuBar => UIManager.GetActiveUIWidgetOrNull<GameTopMenuBar>();
|
||||||
|
|
||||||
@@ -44,6 +46,7 @@ public sealed class GameTopMenuBarUIController : UIController
|
|||||||
_ahelp.UnloadButton();
|
_ahelp.UnloadButton();
|
||||||
_action.UnloadButton();
|
_action.UnloadButton();
|
||||||
_sandbox.UnloadButton();
|
_sandbox.UnloadButton();
|
||||||
|
_emotes.UnloadButton();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadButtons()
|
public void LoadButtons()
|
||||||
@@ -56,5 +59,6 @@ public sealed class GameTopMenuBarUIController : UIController
|
|||||||
_ahelp.LoadButton();
|
_ahelp.LoadButton();
|
||||||
_action.LoadButton();
|
_action.LoadButton();
|
||||||
_sandbox.LoadButton();
|
_sandbox.LoadButton();
|
||||||
|
_emotes.LoadButton();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,6 +43,16 @@
|
|||||||
HorizontalExpand="True"
|
HorizontalExpand="True"
|
||||||
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||||
/>
|
/>
|
||||||
|
<ui:MenuButton
|
||||||
|
Name="EmotesButton"
|
||||||
|
Access="Internal"
|
||||||
|
Icon="{xe:Tex '/Textures/Interface/emotes.svg.192dpi.png'}"
|
||||||
|
ToolTip="{Loc 'game-hud-open-emotes-menu-button-tooltip'}"
|
||||||
|
BoundKey = "{x:Static is:ContentKeyFunctions.OpenEmotesMenu}"
|
||||||
|
MinSize="42 64"
|
||||||
|
HorizontalExpand="True"
|
||||||
|
AppendStyleClass="{x:Static style:StyleBase.ButtonSquare}"
|
||||||
|
/>
|
||||||
<ui:MenuButton
|
<ui:MenuButton
|
||||||
Name="CraftingButton"
|
Name="CraftingButton"
|
||||||
Access="Internal"
|
Access="Internal"
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System.Collections.Frozen;
|
using System.Collections.Frozen;
|
||||||
using Content.Shared.Chat.Prototypes;
|
using Content.Shared.Chat.Prototypes;
|
||||||
|
using Content.Shared.Speech;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Random;
|
using Robust.Shared.Random;
|
||||||
|
|
||||||
@@ -80,6 +81,16 @@ public partial class ChatSystem
|
|||||||
bool ignoreActionBlocker = false
|
bool ignoreActionBlocker = false
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
if (!(emote.Whitelist?.IsValid(source, EntityManager) ?? true))
|
||||||
|
return;
|
||||||
|
if (emote.Blacklist?.IsValid(source, EntityManager) ?? false)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!emote.Available &&
|
||||||
|
TryComp<SpeechComponent>(source, out var speech) &&
|
||||||
|
!speech.AllowedEmotes.Contains(emote.ID))
|
||||||
|
return;
|
||||||
|
|
||||||
// check if proto has valid message for chat
|
// check if proto has valid message for chat
|
||||||
if (emote.ChatMessages.Count != 0)
|
if (emote.ChatMessages.Count != 0)
|
||||||
{
|
{
|
||||||
|
|||||||
30
Content.Server/Speech/EmotesMenuSystem.cs
Normal file
30
Content.Server/Speech/EmotesMenuSystem.cs
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
using Content.Server.Chat.Systems;
|
||||||
|
using Content.Shared.Chat;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
|
||||||
|
namespace Content.Server.Speech;
|
||||||
|
|
||||||
|
public sealed partial class EmotesMenuSystem : EntitySystem
|
||||||
|
{
|
||||||
|
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||||
|
[Dependency] private readonly ChatSystem _chat = default!;
|
||||||
|
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
base.Initialize();
|
||||||
|
|
||||||
|
SubscribeAllEvent<PlayEmoteMessage>(OnPlayEmote);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OnPlayEmote(PlayEmoteMessage msg, EntitySessionEventArgs args)
|
||||||
|
{
|
||||||
|
var player = args.SenderSession.AttachedEntity;
|
||||||
|
if (!player.HasValue)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (!_prototypeManager.TryIndex(msg.ProtoId, out var proto) || proto.ChatTriggers.Count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_chat.TryEmoteWithChat(player.Value, msg.ProtoId);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ using Content.Server.Speech.Components;
|
|||||||
using Content.Shared.Chat.Prototypes;
|
using Content.Shared.Chat.Prototypes;
|
||||||
using Content.Shared.Humanoid;
|
using Content.Shared.Humanoid;
|
||||||
using Content.Shared.Speech;
|
using Content.Shared.Speech;
|
||||||
|
using Content.Shared.Speech.Components;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
using Robust.Shared.Audio.Systems;
|
using Robust.Shared.Audio.Systems;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
|||||||
11
Content.Shared/Chat/EmotesEvents.cs
Normal file
11
Content.Shared/Chat/EmotesEvents.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using Content.Shared.Chat.Prototypes;
|
||||||
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Serialization;
|
||||||
|
|
||||||
|
namespace Content.Shared.Chat;
|
||||||
|
|
||||||
|
[Serializable, NetSerializable]
|
||||||
|
public sealed class PlayEmoteMessage(ProtoId<EmotePrototype> protoId) : EntityEventArgs
|
||||||
|
{
|
||||||
|
public readonly ProtoId<EmotePrototype> ProtoId = protoId;
|
||||||
|
}
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
|
using Content.Shared.Whitelist;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization;
|
using Robust.Shared.Serialization;
|
||||||
|
using Robust.Shared.Utility;
|
||||||
|
|
||||||
namespace Content.Shared.Chat.Prototypes;
|
namespace Content.Shared.Chat.Prototypes;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// IC emotes (scream, smile, clapping, etc).
|
/// IC emotes (scream, smile, clapping, etc).
|
||||||
/// Entities can activate emotes by chat input or code.
|
/// Entities can activate emotes by chat input, radial or code.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Prototype("emote")]
|
[Prototype("emote")]
|
||||||
public sealed partial class EmotePrototype : IPrototype
|
public sealed partial class EmotePrototype : IPrototype
|
||||||
@@ -13,18 +15,50 @@ public sealed partial class EmotePrototype : IPrototype
|
|||||||
[IdDataField]
|
[IdDataField]
|
||||||
public string ID { get; private set; } = default!;
|
public string ID { get; private set; } = default!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Localization string for the emote name. Displayed in the radial UI.
|
||||||
|
/// </summary>
|
||||||
|
[DataField(required: true)]
|
||||||
|
public string Name = default!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines if emote available to all by default
|
||||||
|
/// <see cref="Whitelist"/> check comes after this setting
|
||||||
|
/// <see cref="Content.Shared.Speech.SpeechComponent.AllowedEmotes"/> can ignore this setting
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public bool Available = true;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Different emote categories may be handled by different systems.
|
/// Different emote categories may be handled by different systems.
|
||||||
/// Also may be used for filtering.
|
/// Also may be used for filtering.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("category")]
|
[DataField]
|
||||||
public EmoteCategory Category = EmoteCategory.General;
|
public EmoteCategory Category = EmoteCategory.General;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// An icon used to visually represent the emote in radial UI.
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public SpriteSpecifier Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/Actions/scream.png"));
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines conditions to this emote be available to use
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public EntityWhitelist? Whitelist;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Determines conditions to this emote be unavailable to use
|
||||||
|
/// </summary>
|
||||||
|
[DataField]
|
||||||
|
public EntityWhitelist? Blacklist;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Collection of words that will be sent to chat if emote activates.
|
/// Collection of words that will be sent to chat if emote activates.
|
||||||
/// Will be picked randomly from list.
|
/// Will be picked randomly from list.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("chatMessages")]
|
[DataField]
|
||||||
public List<string> ChatMessages = new();
|
public List<string> ChatMessages = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -32,7 +66,7 @@ public sealed partial class EmotePrototype : IPrototype
|
|||||||
/// When typed into players chat they will activate emote event.
|
/// When typed into players chat they will activate emote event.
|
||||||
/// All words should be unique across all emote prototypes.
|
/// All words should be unique across all emote prototypes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("chatTriggers")]
|
[DataField]
|
||||||
public HashSet<string> ChatTriggers = new();
|
public HashSet<string> ChatTriggers = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
|
using Robust.Shared.Serialization;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
|
||||||
|
|
||||||
namespace Content.Shared.Chat.Prototypes;
|
namespace Content.Shared.Chat.Prototypes;
|
||||||
@@ -8,8 +9,8 @@ namespace Content.Shared.Chat.Prototypes;
|
|||||||
/// Sounds collection for each <see cref="EmotePrototype"/>.
|
/// Sounds collection for each <see cref="EmotePrototype"/>.
|
||||||
/// Different entities may use different sounds collections.
|
/// Different entities may use different sounds collections.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Prototype("emoteSounds")]
|
[Prototype("emoteSounds"), Serializable, NetSerializable]
|
||||||
public sealed partial class EmoteSoundsPrototype : IPrototype
|
public sealed class EmoteSoundsPrototype : IPrototype
|
||||||
{
|
{
|
||||||
[IdDataField]
|
[IdDataField]
|
||||||
public string ID { get; private set; } = default!;
|
public string ID { get; private set; } = default!;
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ namespace Content.Shared.Input
|
|||||||
public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward";
|
public static readonly BoundKeyFunction CycleChatChannelBackward = "CycleChatChannelBackward";
|
||||||
public static readonly BoundKeyFunction EscapeContext = "EscapeContext";
|
public static readonly BoundKeyFunction EscapeContext = "EscapeContext";
|
||||||
public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu";
|
public static readonly BoundKeyFunction OpenCharacterMenu = "OpenCharacterMenu";
|
||||||
|
public static readonly BoundKeyFunction OpenEmotesMenu = "OpenEmotesMenu";
|
||||||
public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu";
|
public static readonly BoundKeyFunction OpenCraftingMenu = "OpenCraftingMenu";
|
||||||
public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook";
|
public static readonly BoundKeyFunction OpenGuidebook = "OpenGuidebook";
|
||||||
public static readonly BoundKeyFunction OpenInventoryMenu = "OpenInventoryMenu";
|
public static readonly BoundKeyFunction OpenInventoryMenu = "OpenInventoryMenu";
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
using Content.Server.Speech.EntitySystems;
|
|
||||||
using Content.Shared.Chat.Prototypes;
|
using Content.Shared.Chat.Prototypes;
|
||||||
using Content.Shared.Humanoid;
|
using Content.Shared.Humanoid;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
|
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary;
|
||||||
|
|
||||||
namespace Content.Server.Speech.Components;
|
namespace Content.Shared.Speech.Components;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Component required for entities to be able to do vocal emotions.
|
/// Component required for entities to be able to do vocal emotions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[RegisterComponent]
|
[RegisterComponent, NetworkedComponent]
|
||||||
[Access(typeof(VocalSystem))]
|
[AutoGenerateComponentState]
|
||||||
public sealed partial class VocalComponent : Component
|
public sealed partial class VocalComponent : Component
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -20,21 +20,27 @@ public sealed partial class VocalComponent : Component
|
|||||||
/// Entities without <see cref="HumanoidComponent"/> considered to be <see cref="Sex.Unsexed"/>.
|
/// Entities without <see cref="HumanoidComponent"/> considered to be <see cref="Sex.Unsexed"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[DataField("sounds", customTypeSerializer: typeof(PrototypeIdValueDictionarySerializer<Sex, EmoteSoundsPrototype>))]
|
[DataField("sounds", customTypeSerializer: typeof(PrototypeIdValueDictionarySerializer<Sex, EmoteSoundsPrototype>))]
|
||||||
|
[AutoNetworkedField]
|
||||||
public Dictionary<Sex, string>? Sounds;
|
public Dictionary<Sex, string>? Sounds;
|
||||||
|
|
||||||
[DataField("screamId", customTypeSerializer: typeof(PrototypeIdSerializer<EmotePrototype>))]
|
[DataField("screamId", customTypeSerializer: typeof(PrototypeIdSerializer<EmotePrototype>))]
|
||||||
|
[AutoNetworkedField]
|
||||||
public string ScreamId = "Scream";
|
public string ScreamId = "Scream";
|
||||||
|
|
||||||
[DataField("wilhelm")]
|
[DataField("wilhelm")]
|
||||||
|
[AutoNetworkedField]
|
||||||
public SoundSpecifier Wilhelm = new SoundPathSpecifier("/Audio/Voice/Human/wilhelm_scream.ogg");
|
public SoundSpecifier Wilhelm = new SoundPathSpecifier("/Audio/Voice/Human/wilhelm_scream.ogg");
|
||||||
|
|
||||||
[DataField("wilhelmProbability")]
|
[DataField("wilhelmProbability")]
|
||||||
|
[AutoNetworkedField]
|
||||||
public float WilhelmProbability = 0.0002f;
|
public float WilhelmProbability = 0.0002f;
|
||||||
|
|
||||||
[DataField("screamAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
|
[DataField("screamAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
|
||||||
|
[AutoNetworkedField]
|
||||||
public string ScreamAction = "ActionScream";
|
public string ScreamAction = "ActionScream";
|
||||||
|
|
||||||
[DataField("screamActionEntity")]
|
[DataField("screamActionEntity")]
|
||||||
|
[AutoNetworkedField]
|
||||||
public EntityUid? ScreamActionEntity;
|
public EntityUid? ScreamActionEntity;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -42,5 +48,6 @@ public sealed partial class VocalComponent : Component
|
|||||||
/// Null if no valid prototype for entity sex was found.
|
/// Null if no valid prototype for entity sex was found.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[ViewVariables]
|
[ViewVariables]
|
||||||
|
[AutoNetworkedField]
|
||||||
public EmoteSoundsPrototype? EmoteSounds = null;
|
public EmoteSoundsPrototype? EmoteSounds = null;
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
using Content.Shared.Chat.Prototypes;
|
||||||
using Robust.Shared.Audio;
|
using Robust.Shared.Audio;
|
||||||
using Robust.Shared.GameStates;
|
using Robust.Shared.GameStates;
|
||||||
using Robust.Shared.Prototypes;
|
using Robust.Shared.Prototypes;
|
||||||
@@ -26,6 +27,13 @@ namespace Content.Shared.Speech
|
|||||||
[DataField]
|
[DataField]
|
||||||
public ProtoId<SpeechVerbPrototype> SpeechVerb = "Default";
|
public ProtoId<SpeechVerbPrototype> SpeechVerb = "Default";
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// What emotes allowed to use event if emote <see cref="EmotePrototype.Available"/> is false
|
||||||
|
/// </summary>
|
||||||
|
[ViewVariables(VVAccess.ReadWrite)]
|
||||||
|
[DataField]
|
||||||
|
public List<ProtoId<EmotePrototype>> AllowedEmotes = new();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A mapping from chat suffixes loc strings to speech verb prototypes that should be conditionally used.
|
/// A mapping from chat suffixes loc strings to speech verb prototypes that should be conditionally used.
|
||||||
/// For things like '?' changing to 'asks' or '!!' making text bold and changing to 'yells'. Can be overridden if necessary.
|
/// For things like '?' changing to 'asks' or '!!' making text bold and changing to 'yells'. Can be overridden if necessary.
|
||||||
|
|||||||
@@ -17,9 +17,6 @@ public sealed partial class WaggingComponent : Component
|
|||||||
[DataField]
|
[DataField]
|
||||||
public EntityUid? ActionEntity;
|
public EntityUid? ActionEntity;
|
||||||
|
|
||||||
[DataField]
|
|
||||||
public ProtoId<EmotePrototype> EmoteId = "WagTail";
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Suffix to add to get the animated marking.
|
/// Suffix to add to get the animated marking.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -94,6 +94,9 @@ namespace Content.Shared.Whitelist
|
|||||||
return RequireAll ? tagSystem.HasAllTags(tags, Tags) : tagSystem.HasAnyTag(tags, Tags);
|
return RequireAll ? tagSystem.HasAllTags(tags, Tags) : tagSystem.HasAnyTag(tags, Tags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (RequireAll)
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
game-hud-open-escape-menu-button-tooltip = Open escape menu.
|
game-hud-open-escape-menu-button-tooltip = Open escape menu.
|
||||||
game-hud-open-guide-menu-button-tooltip = Open guidebook menu.
|
game-hud-open-guide-menu-button-tooltip = Open guidebook menu.
|
||||||
game-hud-open-character-menu-button-tooltip = Open character menu.
|
game-hud-open-character-menu-button-tooltip = Open character menu.
|
||||||
|
game-hud-open-emotes-menu-button-tooltip= Open emotes menu.
|
||||||
game-hud-open-inventory-menu-button-tooltip = Open inventory menu.
|
game-hud-open-inventory-menu-button-tooltip = Open inventory menu.
|
||||||
game-hud-open-crafting-menu-button-tooltip = Open crafting menu.
|
game-hud-open-crafting-menu-button-tooltip = Open crafting menu.
|
||||||
game-hud-open-actions-menu-button-tooltip = Open actions menu.
|
game-hud-open-actions-menu-button-tooltip = Open actions menu.
|
||||||
|
|||||||
60
Resources/Locale/en-US/chat/emotes.ftl
Normal file
60
Resources/Locale/en-US/chat/emotes.ftl
Normal file
@@ -0,0 +1,60 @@
|
|||||||
|
# Names
|
||||||
|
chat-emote-name-scream = Scream
|
||||||
|
chat-emote-name-laugh = Laugh
|
||||||
|
chat-emote-name-honk = Honk
|
||||||
|
chat-emote-name-sigh = Sigh
|
||||||
|
chat-emote-name-whistle = Whistle
|
||||||
|
chat-emote-name-crying = Crying
|
||||||
|
chat-emote-name-squish = Squish
|
||||||
|
chat-emote-name-chitter = Chitter
|
||||||
|
chat-emote-name-squeak = Squeak
|
||||||
|
chat-emote-name-click = Click
|
||||||
|
chat-emote-name-clap = Clap
|
||||||
|
chat-emote-name-snap = Snap
|
||||||
|
chat-emote-name-salute = Salute
|
||||||
|
chat-emote-name-deathgasp = Deathgasp
|
||||||
|
chat-emote-name-buzz = Buzz
|
||||||
|
chat-emote-name-weh = Weh
|
||||||
|
chat-emote-name-chirp = Chirp
|
||||||
|
chat-emote-name-beep = Beep
|
||||||
|
chat-emote-name-chime = Chime
|
||||||
|
chat-emote-name-buzztwo = Buzz Two
|
||||||
|
chat-emote-name-ping = Ping
|
||||||
|
chat-emote-name-sneeze = Sneeze
|
||||||
|
chat-emote-name-cough = Cough
|
||||||
|
chat-emote-name-catmeow = Cat Meow
|
||||||
|
chat-emote-name-cathisses = Cat Hisses
|
||||||
|
chat-emote-name-monkeyscreeches = Monkey Screeches
|
||||||
|
chat-emote-name-robotbeep = Robot
|
||||||
|
chat-emote-name-yawn = Yawn
|
||||||
|
chat-emote-name-snore = Snore
|
||||||
|
|
||||||
|
# Message
|
||||||
|
chat-emote-msg-scream = screams!
|
||||||
|
chat-emote-msg-laugh = laughs
|
||||||
|
chat-emote-msg-honk = honks
|
||||||
|
chat-emote-msg-sigh = sighs
|
||||||
|
chat-emote-msg-whistle = whistle
|
||||||
|
chat-emote-msg-crying = crying
|
||||||
|
chat-emote-msg-squish = squishing
|
||||||
|
chat-emote-msg-chitter = chitters.
|
||||||
|
chat-emote-msg-squeak = squeaks.
|
||||||
|
chat-emote-msg-click = click.
|
||||||
|
chat-emote-msg-clap = claps!
|
||||||
|
chat-emote-msg-snap = snaps fingers
|
||||||
|
chat-emote-msg-salute = salute
|
||||||
|
chat-emote-msg-deathgasp = seizes up and falls limp, {POSS-ADJ($entity)} eyes dead and lifeless...
|
||||||
|
chat-emote-msg-buzz = buzz!
|
||||||
|
chat-emote-msg-chirp = chirps!
|
||||||
|
chat-emote-msg-beep = beeps.
|
||||||
|
chat-emote-msg-chime = chimes.
|
||||||
|
chat-emote-msg-buzzestwo = buzzes twice.
|
||||||
|
chat-emote-msg-ping = pings.
|
||||||
|
chat-emote-msg-sneeze = sneezes
|
||||||
|
chat-emote-msg-cough = coughs
|
||||||
|
chat-emote-msg-catmeow = meows
|
||||||
|
chat-emote-msg-cathisses = hisses
|
||||||
|
chat-emote-msg-monkeyscreeches = screeches
|
||||||
|
chat-emote-msg-robotbeep = beeps
|
||||||
|
chat-emote-msg-yawn = yawns
|
||||||
|
chat-emote-msg-snore = snores
|
||||||
3
Resources/Locale/en-US/chat/ui/emote-menu.ftl
Normal file
3
Resources/Locale/en-US/chat/ui/emote-menu.ftl
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
emote-menu-category-general = General
|
||||||
|
emote-menu-category-vocal = Vocal
|
||||||
|
emote-menu-category-hands = Hands
|
||||||
@@ -1 +0,0 @@
|
|||||||
emote-deathgasp = seizes up and falls limp, {POSS-ADJ($entity)} eyes dead and lifeless...
|
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechSounds: Squeak
|
speechSounds: Squeak
|
||||||
speechVerb: SmallMob
|
speechVerb: SmallMob
|
||||||
|
allowedEmotes: ['Squeak']
|
||||||
- type: Fixtures
|
- type: Fixtures
|
||||||
fixtures:
|
fixtures:
|
||||||
fix1:
|
fix1:
|
||||||
@@ -432,6 +433,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Moth
|
speechVerb: Moth
|
||||||
speechSounds: Squeak
|
speechSounds: Squeak
|
||||||
|
allowedEmotes: ['Chitter']
|
||||||
- type: FaxableObject
|
- type: FaxableObject
|
||||||
insertingState: inserting_mothroach
|
insertingState: inserting_mothroach
|
||||||
- type: MothAccent
|
- type: MothAccent
|
||||||
@@ -817,6 +819,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Arachnid
|
speechVerb: Arachnid
|
||||||
speechSounds: Arachnid
|
speechSounds: Arachnid
|
||||||
|
allowedEmotes: ['Click']
|
||||||
- type: DamageStateVisuals
|
- type: DamageStateVisuals
|
||||||
states:
|
states:
|
||||||
Alive:
|
Alive:
|
||||||
@@ -1509,6 +1512,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechSounds: Squeak
|
speechSounds: Squeak
|
||||||
speechVerb: SmallMob
|
speechVerb: SmallMob
|
||||||
|
allowedEmotes: ['Squeak']
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
drawdepth: SmallMobs
|
drawdepth: SmallMobs
|
||||||
sprite: Mobs/Animals/mouse.rsi
|
sprite: Mobs/Animals/mouse.rsi
|
||||||
@@ -2232,6 +2236,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Arachnid
|
speechVerb: Arachnid
|
||||||
speechSounds: Arachnid
|
speechSounds: Arachnid
|
||||||
|
allowedEmotes: ['Click']
|
||||||
- type: Vocal
|
- type: Vocal
|
||||||
sounds:
|
sounds:
|
||||||
Male: UnisexArachnid
|
Male: UnisexArachnid
|
||||||
@@ -3037,6 +3042,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: SmallMob
|
speechVerb: SmallMob
|
||||||
speechSounds: Squeak
|
speechSounds: Squeak
|
||||||
|
allowedEmotes: ['Squeak']
|
||||||
- type: Sprite
|
- type: Sprite
|
||||||
drawdepth: SmallMobs
|
drawdepth: SmallMobs
|
||||||
sprite: Mobs/Animals/hamster.rsi
|
sprite: Mobs/Animals/hamster.rsi
|
||||||
|
|||||||
@@ -125,6 +125,12 @@
|
|||||||
makeSentient: true
|
makeSentient: true
|
||||||
name: ghost-role-information-slimes-name
|
name: ghost-role-information-slimes-name
|
||||||
description: ghost-role-information-slimes-description
|
description: ghost-role-information-slimes-description
|
||||||
|
- type: Speech
|
||||||
|
speechVerb: Slime
|
||||||
|
speechSounds: Slime
|
||||||
|
allowedEmotes: ['Squish']
|
||||||
|
- type: TypingIndicator
|
||||||
|
proto: slime
|
||||||
- type: NpcFactionMember
|
- type: NpcFactionMember
|
||||||
factions:
|
factions:
|
||||||
- SimpleNeutral
|
- SimpleNeutral
|
||||||
|
|||||||
@@ -263,6 +263,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Arachnid
|
speechVerb: Arachnid
|
||||||
speechSounds: Arachnid
|
speechSounds: Arachnid
|
||||||
|
allowedEmotes: ['Click']
|
||||||
- type: Vocal
|
- type: Vocal
|
||||||
sounds:
|
sounds:
|
||||||
Male: UnisexArachnid
|
Male: UnisexArachnid
|
||||||
|
|||||||
@@ -62,6 +62,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Arachnid
|
speechVerb: Arachnid
|
||||||
speechSounds: Arachnid
|
speechSounds: Arachnid
|
||||||
|
allowedEmotes: ['Click']
|
||||||
- type: Vocal
|
- type: Vocal
|
||||||
sounds:
|
sounds:
|
||||||
Male: UnisexArachnid
|
Male: UnisexArachnid
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
accent: zombieMoth
|
accent: zombieMoth
|
||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Moth
|
speechVerb: Moth
|
||||||
|
allowedEmotes: ['Chitter']
|
||||||
- type: TypingIndicator
|
- type: TypingIndicator
|
||||||
proto: moth
|
proto: moth
|
||||||
- type: Butcherable
|
- type: Butcherable
|
||||||
|
|||||||
@@ -42,6 +42,7 @@
|
|||||||
- type: Speech
|
- type: Speech
|
||||||
speechVerb: Slime
|
speechVerb: Slime
|
||||||
speechSounds: Slime
|
speechSounds: Slime
|
||||||
|
allowedEmotes: ['Squish']
|
||||||
- type: TypingIndicator
|
- type: TypingIndicator
|
||||||
proto: slime
|
proto: slime
|
||||||
- type: Vocal
|
- type: Vocal
|
||||||
|
|||||||
@@ -1,45 +1,65 @@
|
|||||||
- type: emote
|
- type: emote
|
||||||
id: Sneeze
|
id: Sneeze
|
||||||
|
name: chat-emote-name-sneeze
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [sneezes]
|
chatMessages: ["chat-emote-msg-sneeze"]
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Cough
|
id: Cough
|
||||||
|
name: chat-emote-name-cough
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [coughs]
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-cough"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- cough
|
- cough
|
||||||
- coughs
|
- coughs
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: CatMeow
|
id: CatMeow
|
||||||
|
name: chat-emote-name-catmeow
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [meows]
|
chatMessages: ["chat-emote-msg-catmeow"]
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: CatHisses
|
id: CatHisses
|
||||||
|
name: chat-emote-name-cathisses
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [hisses]
|
chatMessages: ["chat-emote-msg-cathisses"]
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: MonkeyScreeches
|
id: MonkeyScreeches
|
||||||
|
name: chat-emote-name-monkeyscreeches
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [screeches]
|
chatMessages: ["chat-emote-msg-monkeyscreeches"]
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: RobotBeep
|
id: RobotBeep
|
||||||
|
name: chat-emote-name-robotbeep
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [beeps]
|
chatMessages: ["chat-emote-msg-robotbeep"]
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Yawn
|
id: Yawn
|
||||||
|
name: chat-emote-name-yawn
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [yawns]
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-yawn"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- yawn
|
- yawn
|
||||||
- yawns
|
- yawns
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Snore
|
id: Snore
|
||||||
|
name: chat-emote-name-snore
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [snores]
|
chatMessages: ["chat-emote-msg-snore"]
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
# vocal emotes
|
# vocal emotes
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Scream
|
id: Scream
|
||||||
|
name: chat-emote-name-scream
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [screams!]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-scream"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- scream
|
- scream
|
||||||
- screams
|
- screams
|
||||||
@@ -31,8 +39,16 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Laugh
|
id: Laugh
|
||||||
|
name: chat-emote-name-laugh
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [laughs]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-laugh"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- laugh
|
- laugh
|
||||||
- laughs
|
- laughs
|
||||||
@@ -64,8 +80,15 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Honk
|
id: Honk
|
||||||
|
name: chat-emote-name-honk
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [honks]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
requireAll: true
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-honk"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- honk
|
- honk
|
||||||
- honk.
|
- honk.
|
||||||
@@ -82,8 +105,16 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Sigh
|
id: Sigh
|
||||||
|
name: chat-emote-name-sigh
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [sighs]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-sigh"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- sigh
|
- sigh
|
||||||
- sighs
|
- sighs
|
||||||
@@ -94,8 +125,16 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Whistle
|
id: Whistle
|
||||||
|
name: chat-emote-name-whistle
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [whistle]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-whistle"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- whistle
|
- whistle
|
||||||
- whistle.
|
- whistle.
|
||||||
@@ -109,8 +148,16 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Crying
|
id: Crying
|
||||||
|
name: chat-emote-name-crying
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [crying]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-crying"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- cry
|
- cry
|
||||||
- cry.
|
- cry.
|
||||||
@@ -132,8 +179,17 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Squish
|
id: Squish
|
||||||
|
name: chat-emote-name-squish
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [squishing]
|
available: false
|
||||||
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-squish"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- squish
|
- squish
|
||||||
- squish.
|
- squish.
|
||||||
@@ -147,8 +203,17 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Chitter
|
id: Chitter
|
||||||
|
name: chat-emote-name-chitter
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [chitters.]
|
available: false
|
||||||
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-chitter"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- chitter
|
- chitter
|
||||||
- chitter.
|
- chitter.
|
||||||
@@ -162,8 +227,16 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Squeak
|
id: Squeak
|
||||||
|
name: chat-emote-name-squeak
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [squeaks.]
|
available: false
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-squeak"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- squeak
|
- squeak
|
||||||
- squeak.
|
- squeak.
|
||||||
@@ -177,8 +250,17 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Click
|
id: Click
|
||||||
|
name: chat-emote-name-click
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [click.]
|
available: false
|
||||||
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Vocal
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-click"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- click
|
- click
|
||||||
- click.
|
- click.
|
||||||
@@ -190,8 +272,16 @@
|
|||||||
# hand emotes
|
# hand emotes
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Clap
|
id: Clap
|
||||||
|
name: chat-emote-name-clap
|
||||||
category: Hands
|
category: Hands
|
||||||
chatMessages: [claps!]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Hands
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-clap"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- clap
|
- clap
|
||||||
- claps
|
- claps
|
||||||
@@ -202,8 +292,16 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Snap
|
id: Snap
|
||||||
|
name: chat-emote-name-snap
|
||||||
category: Hands
|
category: Hands
|
||||||
chatMessages: [snaps fingers] # snaps <{THEIR($ent)}> fingers?
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Hands
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-snap"] # snaps <{THEIR($ent)}> fingers?
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- snap
|
- snap
|
||||||
- snaps
|
- snaps
|
||||||
@@ -221,8 +319,16 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Salute
|
id: Salute
|
||||||
|
name: chat-emote-name-salute
|
||||||
category: Hands
|
category: Hands
|
||||||
chatMessages: [Salute]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- Hands
|
||||||
|
blacklist:
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
chatMessages: ["chat-emote-msg-salute"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- salute
|
- salute
|
||||||
- salute.
|
- salute.
|
||||||
@@ -233,14 +339,26 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: DefaultDeathgasp
|
id: DefaultDeathgasp
|
||||||
chatMessages: ["emote-deathgasp"]
|
name: chat-emote-name-deathgasp
|
||||||
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
components:
|
||||||
|
- MobState
|
||||||
|
chatMessages: ["chat-emote-msg-deathgasp"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- deathgasp
|
- deathgasp
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Buzz
|
id: Buzz
|
||||||
|
name: chat-emote-name-buzz
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [buzz!]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
requireAll: true
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
- Vocal
|
||||||
|
chatMessages: ["chat-emote-msg-buzz"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- buzzing
|
- buzzing
|
||||||
- buzzing!
|
- buzzing!
|
||||||
@@ -257,13 +375,20 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Weh
|
id: Weh
|
||||||
|
name: chat-emote-name-weh
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [Wehs!]
|
chatMessages: [Wehs!]
|
||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Chirp
|
id: Chirp
|
||||||
|
name: chat-emote-name-chirp
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [chirps!]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
requireAll: true
|
||||||
|
components:
|
||||||
|
- Nymph
|
||||||
|
chatMessages: ["chat-emote-msg-chirp"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- chirp
|
- chirp
|
||||||
- chirp!
|
- chirp!
|
||||||
@@ -281,8 +406,15 @@
|
|||||||
# Machine Emotes
|
# Machine Emotes
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Beep
|
id: Beep
|
||||||
|
name: chat-emote-name-beep
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [beeps.]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
requireAll: true
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
- Vocal
|
||||||
|
chatMessages: ["chat-emote-msg-beep"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- beep
|
- beep
|
||||||
- beep!
|
- beep!
|
||||||
@@ -299,8 +431,15 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Chime
|
id: Chime
|
||||||
|
name: chat-emote-name-chime
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [chimes.]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
requireAll: true
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
- Vocal
|
||||||
|
chatMessages: ["chat-emote-msg-chime"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- chime
|
- chime
|
||||||
- chime.
|
- chime.
|
||||||
@@ -317,8 +456,15 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Buzz-Two
|
id: Buzz-Two
|
||||||
|
name: chat-emote-name-buzztwo
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [buzzesTwice.]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
requireAll: true
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
- Vocal
|
||||||
|
chatMessages: ["chat-emote-msg-buzzestwo"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- buzztwice
|
- buzztwice
|
||||||
- buzztwice.
|
- buzztwice.
|
||||||
@@ -353,8 +499,15 @@
|
|||||||
|
|
||||||
- type: emote
|
- type: emote
|
||||||
id: Ping
|
id: Ping
|
||||||
|
name: chat-emote-name-ping
|
||||||
category: Vocal
|
category: Vocal
|
||||||
chatMessages: [pings.]
|
icon: Interface/Actions/scream.png
|
||||||
|
whitelist:
|
||||||
|
requireAll: true
|
||||||
|
components:
|
||||||
|
- BorgChassis
|
||||||
|
- Vocal
|
||||||
|
chatMessages: ["chat-emote-msg-ping"]
|
||||||
chatTriggers:
|
chatTriggers:
|
||||||
- ping
|
- ping
|
||||||
- ping.
|
- ping.
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
- type: emote
|
|
||||||
id: WagTail
|
|
||||||
chatMessages: [wags tail]
|
|
||||||
chatTriggers:
|
|
||||||
- wag
|
|
||||||
- wag.
|
|
||||||
- wags
|
|
||||||
- wags.
|
|
||||||
- wagging
|
|
||||||
- wagging.
|
|
||||||
- wag tail
|
|
||||||
- wag tail.
|
|
||||||
- wags tail
|
|
||||||
- wags tail.
|
|
||||||
1
Resources/Textures/Interface/emotes.svg
Normal file
1
Resources/Textures/Interface/emotes.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" style="height: 512px; width: 512px;"><g class="" transform="translate(0,0)" style=""><path d="M65.44 18.39l-2.327 9.717C53.95 66.384 49.07 107.884 49.07 151.293c0 93.415 23.097 178.085 61.047 240.014 17.218 28.096 37.652 51.6 60.447 68.92 26.69 21.257 56.353 32.962 87.377 32.962.364 0 1.147-.12 1.927-.25.623.008 1.247.02 1.87.02 60.13 0 113.67-39.724 151.62-101.653 37.95-61.93 61.047-146.598 61.047-240.014 0-41.557-4.858-81.203-13.256-118.012l-2.324-10.19-9.582 4.176c-50.92 22.196-113.98 35.705-182.086 35.713-2.014-.022-4.01-.06-6.002-.103V62.8c-1.296 0-2.586-.017-3.88-.03-69.783-2.053-125.493-18.078-182.545-40.698l-9.29-3.683zm380.816 28.747c6.792 32.774 10.824 67.647 10.824 104.156 0 90.547-22.596 172.38-58.494 230.963-35.9 58.582-84.36 93.38-136.848 93.38-.195 0-.39-.006-.584-.007v-63.987c-2.64.023-5.28-.03-7.914-.163-55.358-2.77-109.316-38.91-122.03-99.742l-2.355-11.256h94.895l37.404 14.207V80.206c1.946.042 3.896.078 5.862.098h.087c66.168 0 127.672-12.383 179.152-33.168zm-279.53 98.12c35.365 0 64.036 13.248 64.036 29.59 0 16.34-28.668 29.585-64.035 29.585-35.365 0-64.036-13.246-64.036-29.586 0-16.34 28.67-29.588 64.037-29.588zm186.282 0c-35.367 0-64.035 13.248-64.035 29.59 0 16.34 28.67 29.585 64.035 29.585 35.367 0 64.035-13.246 64.035-29.586 0-16.34-28.67-29.588-64.035-29.588zM152.572 319.17c14.72 45.053 57.247 71.428 101.602 73.646 44.8 2.24 90.238-19.45 110.416-73.646h-57.447l-44.204 16.187-42.62-16.187h-67.748z" fill="#fff" fill-opacity="1" data-darkreader-inline-fill="" style="--darkreader-inline-fill: #181a1b;"></path></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
BIN
Resources/Textures/Interface/emotes.svg.192dpi.png
Normal file
BIN
Resources/Textures/Interface/emotes.svg.192dpi.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
2
Resources/Textures/Interface/emotes.svg.192dpi.png.yml
Normal file
2
Resources/Textures/Interface/emotes.svg.192dpi.png.yml
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
sample:
|
||||||
|
filter: true
|
||||||
@@ -187,6 +187,9 @@ binds:
|
|||||||
- function: OpenCharacterMenu
|
- function: OpenCharacterMenu
|
||||||
type: State
|
type: State
|
||||||
key: C
|
key: C
|
||||||
|
- function: OpenEmotesMenu
|
||||||
|
type: State
|
||||||
|
key: Y
|
||||||
- function: TextCursorSelect
|
- function: TextCursorSelect
|
||||||
# TextCursorSelect HAS to be above ExamineEntity
|
# TextCursorSelect HAS to be above ExamineEntity
|
||||||
# So that LineEdit receives it correctly.
|
# So that LineEdit receives it correctly.
|
||||||
|
|||||||
Reference in New Issue
Block a user