From 88310fef8d2e7082ca933838f448943d311621bc Mon Sep 17 00:00:00 2001 From: keekee38 Date: Sat, 4 Apr 2026 09:29:42 -0400 Subject: [PATCH] porting RMC pose stuff (#5558) * Add set pose (#4682) Co-authored-by: Whisper <121047731+QuietlyWhisper@users.noreply.github.com> # Conflicts: # Resources/Prototypes/_RMC14/Entities/Mobs/Species/base.yml * hi * comment * uncommenting Co-authored-by: DisposableCrewmember42 Signed-off-by: keekee38 * ok so riders still insistent about the adminlog thingy being weird but did it i think? i may be stupid * ty kotob <3 Co-authored-by: KOTOB <59124164+kotobdev@users.noreply.github.com> Signed-off-by: keekee38 * ok ipcs should be able to now! --------- Signed-off-by: keekee38 Co-authored-by: Mr. 27 <45323883+Dutch-VanDerLinde@users.noreply.github.com> Co-authored-by: Whisper <121047731+QuietlyWhisper@users.noreply.github.com> Co-authored-by: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Co-authored-by: DisposableCrewmember42 Co-authored-by: KOTOB <59124164+kotobdev@users.noreply.github.com> --- .../_RMC14/Examine/RMCSetPoseSystem.cs | 5 ++ .../_RMC14/Examine/RMCSetPoseSystem.cs | 35 ++++++++++ Content.Shared.Database/LogType.cs | 5 ++ .../Examine/Pose/RMCSetPoseComponent.cs | 15 +++++ .../Examine/Pose/SharedRMCSetPoseSystem.cs | 64 +++++++++++++++++++ .../Locale/en-US/_RMC14/pose/set-pose.ftl | 4 ++ .../Prototypes/Entities/Mobs/Species/base.yml | 1 + .../_EE/Entities/Mobs/Player/silicon_base.yml | 1 + 8 files changed, 130 insertions(+) create mode 100644 Content.Client/_RMC14/Examine/RMCSetPoseSystem.cs create mode 100644 Content.Server/_RMC14/Examine/RMCSetPoseSystem.cs create mode 100644 Content.Shared/_RMC14/Examine/Pose/RMCSetPoseComponent.cs create mode 100644 Content.Shared/_RMC14/Examine/Pose/SharedRMCSetPoseSystem.cs create mode 100644 Resources/Locale/en-US/_RMC14/pose/set-pose.ftl diff --git a/Content.Client/_RMC14/Examine/RMCSetPoseSystem.cs b/Content.Client/_RMC14/Examine/RMCSetPoseSystem.cs new file mode 100644 index 0000000000..f9ee5c06bf --- /dev/null +++ b/Content.Client/_RMC14/Examine/RMCSetPoseSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared._RMC14.Examine.Pose; + +namespace Content.Client._RMC14.Examine; + +public sealed class RMCSetPoseSystem : SharedRMCSetPoseSystem; diff --git a/Content.Server/_RMC14/Examine/RMCSetPoseSystem.cs b/Content.Server/_RMC14/Examine/RMCSetPoseSystem.cs new file mode 100644 index 0000000000..bb44885abb --- /dev/null +++ b/Content.Server/_RMC14/Examine/RMCSetPoseSystem.cs @@ -0,0 +1,35 @@ +using Content.Server.Administration; +using Content.Shared._RMC14.Examine.Pose; +using Content.Shared.Administration.Logs; +using Content.Shared.Database; +using Robust.Shared.Player; + +namespace Content.Server._RMC14.Examine; + +public sealed class RMCSetPoseSystem : SharedRMCSetPoseSystem +{ + [Dependency] private readonly ISharedAdminLogManager _adminLog = default!; + [Dependency] private readonly QuickDialogSystem _quickDialog = default!; + + protected override void SetPose(Entity ent) + { + base.SetPose(ent); + + if (!TryComp(ent, out var actor)) + return; + + var setPosePrompt = Loc.GetString("rmc-set-pose-dialog", ("ent", ent)); + _quickDialog.OpenDialog(actor.PlayerSession, + Loc.GetString("rmc-set-pose-title"), + setPosePrompt, + (string pose) => + { + if (pose.Length > 1000) + pose = pose[..999]; + _adminLog.Add(LogType.RMCSetPose, $"{ToPrettyString(ent)} set their pose to {pose}"); + ent.Comp.Pose = pose; + Dirty(ent); + } + ); + } +} diff --git a/Content.Shared.Database/LogType.cs b/Content.Shared.Database/LogType.cs index f159e501b8..cbf9a44dde 100644 --- a/Content.Shared.Database/LogType.cs +++ b/Content.Shared.Database/LogType.cs @@ -481,4 +481,9 @@ public enum LogType /// Events relating to midi playback. /// Instrument = 103, + + /// + /// Delta V - RMC Pose port + /// + RMCSetPose= 10000, } diff --git a/Content.Shared/_RMC14/Examine/Pose/RMCSetPoseComponent.cs b/Content.Shared/_RMC14/Examine/Pose/RMCSetPoseComponent.cs new file mode 100644 index 0000000000..ead31cb0de --- /dev/null +++ b/Content.Shared/_RMC14/Examine/Pose/RMCSetPoseComponent.cs @@ -0,0 +1,15 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared._RMC14.Examine.Pose; + +/// +/// Flavour text when this entity is examined. Can be set with an action. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedRMCSetPoseSystem))] +public sealed partial class RMCSetPoseComponent : Component +{ + [DataField, AutoNetworkedField] + public string Pose = string.Empty; +} diff --git a/Content.Shared/_RMC14/Examine/Pose/SharedRMCSetPoseSystem.cs b/Content.Shared/_RMC14/Examine/Pose/SharedRMCSetPoseSystem.cs new file mode 100644 index 0000000000..20c9f7fadd --- /dev/null +++ b/Content.Shared/_RMC14/Examine/Pose/SharedRMCSetPoseSystem.cs @@ -0,0 +1,64 @@ +using Content.Shared.Examine; +using Content.Shared.Mobs; +using Content.Shared.Verbs; +using Robust.Shared.Utility; + +namespace Content.Shared._RMC14.Examine.Pose; + +public abstract class SharedRMCSetPoseSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnSetPoseGetVerbs); + SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnMobStateChanged); + } + + private void OnSetPoseGetVerbs(Entity ent, ref GetVerbsEvent args) + { + if (!args.CanInteract) + return; + + if (args.User != args.Target) + return; + + Verb verb = new() + { + Text = Loc.GetString("rmc-set-pose-title"), + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/character.svg.192dpi.png")), + Priority = -5, + Act = () => SetPose(ent), + }; + + args.Verbs.Add(verb); + } + + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + var comp = ent.Comp; + + if (comp.Pose.Trim() == string.Empty) + return; + + using (args.PushGroup(nameof(RMCSetPoseComponent))) + { + var pose = Loc.GetString("rmc-set-pose-examined", ("ent", ent), ("pose", comp.Pose)); + args.PushMarkup(pose, -5); + } + } + + private void OnMobStateChanged(Entity ent, ref MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Alive) + return; + + ent.Comp.Pose = string.Empty; // reset the pose on death/crit + Dirty(ent); + } + + protected virtual void SetPose(Entity ent) + { + } +} diff --git a/Resources/Locale/en-US/_RMC14/pose/set-pose.ftl b/Resources/Locale/en-US/_RMC14/pose/set-pose.ftl new file mode 100644 index 0000000000..6988f2fdba --- /dev/null +++ b/Resources/Locale/en-US/_RMC14/pose/set-pose.ftl @@ -0,0 +1,4 @@ +rmc-set-pose-examined = [color=lightblue][bold]{ CAPITALIZE(SUBJECT($ent)) } {$pose}[/bold][/color] +rmc-set-pose-dialog = This is {$ent}. { CAPITALIZE(SUBJECT($ent)) }... +# Delta V - removed conjugation +rmc-set-pose-title = Set Pose diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index f481f0b13b..4a56e6da24 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -231,6 +231,7 @@ - type: CosmicCenserTarget # DeltaV - Cosmic Cult - type: Carriable # DeltaV - type: GrappleTarget # DeltaV - Allow targets to be grappled + - type: RMCSetPose # DeltaV - RMC pose port - type: entity save: false diff --git a/Resources/Prototypes/_EE/Entities/Mobs/Player/silicon_base.yml b/Resources/Prototypes/_EE/Entities/Mobs/Player/silicon_base.yml index 4bd35764e7..d3a19b7011 100644 --- a/Resources/Prototypes/_EE/Entities/Mobs/Player/silicon_base.yml +++ b/Resources/Prototypes/_EE/Entities/Mobs/Player/silicon_base.yml @@ -338,3 +338,4 @@ - type: CosmicCenserTarget # DeltaV - Cosmic Cult - type: GrappleTarget # DeltaV - Allow targets to be grappled - type: CanDoCPR # DeltaV - Addition of CPR + - type: RMCSetPose # DeltaV - RMC pose port