Meleespeech Action, Holoparasite Meleespeech (#19504)

This commit is contained in:
HerCoyote23 2023-08-26 15:26:28 -06:00 committed by GitHub
parent b439aad3c7
commit 407d45cd11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 113 additions and 74 deletions

View File

@ -1,8 +1,8 @@
<DefaultWindow xmlns="https://spacestation14.io"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="{Loc north-star-menu-title}">
Title="{Loc melee-speech-menu-title}">
<BoxContainer Orientation="Vertical" SeparationOverride="4" MinWidth="150" >
<Label Name="CurrentBattlecry" Text="{Loc 'north-star-current-battlecry'}" />
<Label Name="CurrentBattlecry" Text="{Loc 'melee-speech-current-battlecry'}" />
<LineEdit Name="BattlecryLineEdit" />
</BoxContainer>
</DefaultWindow>

View File

@ -1,76 +1,83 @@
using Content.Server.Administration.Logs;
using Content.Shared.Actions;
using Content.Shared.Speech.Components;
using Content.Shared.Speech.EntitySystems;
using Content.Shared.Database;
using Robust.Server.GameObjects;
namespace Content.Server.Speech.EntitySystems;
public sealed class MeleeSpeechSystem : SharedMeleeSpeechSystem
{
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<MeleeSpeechComponent, MeleeSpeechBattlecryChangedMessage>(OnBattlecryChanged);
}
private void OnBattlecryChanged(EntityUid uid, MeleeSpeechComponent comp, MeleeSpeechBattlecryChangedMessage args)
{
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly SharedActionsSystem _actionSystem = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<MeleeSpeechComponent, MeleeSpeechBattlecryChangedMessage>(OnBattlecryChanged);
SubscribeLocalEvent<MeleeSpeechComponent, MeleeSpeechConfigureActionEvent>(OnConfigureAction);
SubscribeLocalEvent<MeleeSpeechComponent, GetItemActionsEvent>(OnGetActions);
SubscribeLocalEvent<MeleeSpeechComponent, ComponentInit>(OnComponentInit);
}
private void OnComponentInit(EntityUid uid, MeleeSpeechComponent component, ComponentInit args)
{
if (component.ConfigureAction != null)
_actionSystem.AddAction(uid, component.ConfigureAction, uid);
}
private void OnGetActions(EntityUid uid, MeleeSpeechComponent component, GetItemActionsEvent args)
{
if (component.ConfigureAction != null)
args.Actions.Add(component.ConfigureAction);
}
private void OnBattlecryChanged(EntityUid uid, MeleeSpeechComponent comp, MeleeSpeechBattlecryChangedMessage args)
{
if (!TryComp<MeleeSpeechComponent>(uid, out var meleeSpeechUser))
return;
string battlecry = args.Battlecry;
return;
var battlecry = args.Battlecry;
if (battlecry.Length > comp.MaxBattlecryLength)
battlecry = battlecry[..comp.MaxBattlecryLength];
TryChangeBattlecry(uid, battlecry, meleeSpeechUser);
}
/// <summary>
/// Attempts to change the battlecry of an entity.
/// Returns true/false.
/// </summary>
/// <remarks>
/// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs.
/// </remarks>
public bool TryChangeBattlecry(EntityUid uid, string? battlecry, MeleeSpeechComponent? meleeSpeechComp = null)
{
}
/// <summary>
/// Attempts to open the Battlecry UI.
/// </summary>
private void OnConfigureAction(EntityUid uid, MeleeSpeechComponent comp, MeleeSpeechConfigureActionEvent args)
{
TryOpenUi(args.Performer, uid, comp);
}
public void TryOpenUi(EntityUid user, EntityUid source, MeleeSpeechComponent? component = null)
{
if (!Resolve(source, ref component))
return;
if (!TryComp<ActorComponent>(user, out var actor))
return;
_uiSystem.TryToggleUi(source, MeleeSpeechUiKey.Key, actor.PlayerSession);
}
/// <summary>
/// Attempts to change the battlecry of an entity.
/// Returns true/false.
/// </summary>
/// <remarks>
/// Logs changes to an entity's battlecry
/// </remarks>
public bool TryChangeBattlecry(EntityUid uid, string? battlecry, MeleeSpeechComponent? meleeSpeechComp = null)
{
if (!Resolve(uid, ref meleeSpeechComp))
return false;
if (!string.IsNullOrWhiteSpace(battlecry))
{
battlecry = battlecry.Trim();
}
else
{
battlecry = null;
}
if (meleeSpeechComp.Battlecry == battlecry)
return true;
meleeSpeechComp.Battlecry = battlecry;
Dirty(meleeSpeechComp);
_adminLogger.Add(LogType.ItemConfigure, LogImpact.Medium, $" {ToPrettyString(uid):entity}'s battlecry has been changed to {battlecry}");
return true;
}
return false;
if (!string.IsNullOrWhiteSpace(battlecry))
{
battlecry = battlecry.Trim();
}
else
{
battlecry = null;
}
if (meleeSpeechComp.Battlecry == battlecry)
return true;
meleeSpeechComp.Battlecry = battlecry;
Dirty(uid, meleeSpeechComp);
_adminLogger.Add(LogType.ItemConfigure, LogImpact.Medium, $" {ToPrettyString(uid):entity}'s battlecry has been changed to {battlecry}");
return true;
}
}

View File

@ -1,21 +1,43 @@
using Content.Shared.Speech.EntitySystems;
using Content.Shared.Actions;
using Content.Shared.Actions.ActionTypes;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Speech.Components;
[RegisterComponent]
[RegisterComponent, NetworkedComponent]
[AutoGenerateComponentState]
public sealed partial class MeleeSpeechComponent : Component
{
/// <summary>
/// The battlecry to be said when an entity attacks with this component
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("Battlecry")]
[AutoNetworkedField]
public string? Battlecry;
[ViewVariables(VVAccess.ReadWrite)]
[DataField("Battlecry")]
[AutoNetworkedField]
public string? Battlecry;
/// <summary>
/// The maximum amount of characters allowed in a battlecry
/// </summary>
[ViewVariables(VVAccess.ReadWrite)]
[DataField("MaxBattlecryLength")]
[AutoNetworkedField]
public int MaxBattlecryLength = 12;
/// <summary>
/// The action to open the battlecry UI
/// </summary>
[DataField("configureAction")]
public InstantAction ConfigureAction = new()
{
UseDelay = TimeSpan.FromSeconds(1),
ItemIconStyle = ItemActionIconStyle.BigItem,
DisplayName = "melee-speech-config",
Description = "melee-speech-config-desc",
Priority = -20,
Event = new MeleeSpeechConfigureActionEvent(),
};
}
/// <summary>
@ -35,7 +57,6 @@ public enum MeleeSpeechUiKey : byte
public sealed class MeleeSpeechBoundUserInterfaceState : BoundUserInterfaceState
{
public string CurrentBattlecry { get; }
public MeleeSpeechBoundUserInterfaceState(string currentBattlecry)
{
CurrentBattlecry = currentBattlecry;
@ -51,3 +72,5 @@ public sealed class MeleeSpeechBattlecryChangedMessage : BoundUserInterfaceMessa
Battlecry = battlecry;
}
}
public sealed partial class MeleeSpeechConfigureActionEvent : InstantActionEvent { }

View File

@ -1,2 +0,0 @@
north-star-current-battlecry = Battlecry:
north-star-menu-title = Set Battlecry

View File

@ -0,0 +1,4 @@
melee-speech-config = Set Battlecry
melee-speech-config-desc = Set a custom battlecry for when you attack!
melee-speech-current-battlecry = Battlecry:
melee-speech-menu-title = Set Battlecry

View File

@ -322,6 +322,7 @@
components:
- type: Unremoveable
- type: entity
parent: ClothingHandsBase
id: ClothingHandsGlovesNorthStar
@ -349,6 +350,7 @@
key: enum.MeleeSpeechUiKey.Key
closeOnHandDeselect: false
rightClickOnly: true
- type: Actions
- type: UserInterface
interfaces:
- key: enum.MeleeSpeechUiKey.Key

View File

@ -89,6 +89,11 @@
damage:
types:
Blunt: 20
- type: MeleeSpeech
- type: UserInterface
interfaces:
- key: enum.MeleeSpeechUiKey.Key
type: MeleeSpeechBoundUserInterface
- type: Actions
- type: Guardian
- type: InteractionPopup