diff --git a/Content.Client/Ghost/GhostSystem.cs b/Content.Client/Ghost/GhostSystem.cs index 0d6b3934cd..2ff040ecae 100644 --- a/Content.Client/Ghost/GhostSystem.cs +++ b/Content.Client/Ghost/GhostSystem.cs @@ -19,7 +19,7 @@ namespace Content.Client.Ghost // No good way to get an event into the UI. public int AvailableGhostRoleCount { get; private set; } = 0; - private bool _ghostVisibility; + private bool _ghostVisibility = true; private bool GhostVisibility { @@ -33,12 +33,9 @@ namespace Content.Client.Ghost _ghostVisibility = value; - foreach (var ghost in EntityManager.GetAllComponents(typeof(GhostComponent), true)) + foreach (var ghost in EntityQuery(true)) { - if (EntityManager.TryGetComponent(ghost.Owner, out SpriteComponent? sprite)) - { - sprite.Visible = value; - } + ghost.Item2.Visible = true; } } } @@ -69,12 +66,6 @@ namespace Content.Client.Ghost { component.Gui?.Dispose(); component.Gui = null; - - // PlayerDetachedMsg might not fire due to deletion order so... - if (component.IsAttached) - { - GhostVisibility = false; - } } private void OnGhostPlayerAttach(EntityUid uid, GhostComponent component, PlayerAttachedEvent playerAttachedEvent) diff --git a/Content.Client/Revenant/RevenantComponent.cs b/Content.Client/Revenant/RevenantComponent.cs new file mode 100644 index 0000000000..a99b744554 --- /dev/null +++ b/Content.Client/Revenant/RevenantComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Revenant; + +namespace Content.Client.Revenant; + +[RegisterComponent] +public sealed class RevenantComponent : SharedRevenantComponent +{ + [DataField("state")] + public string State = "idle"; + [DataField("corporealState")] + public string CorporealState = "active"; + [DataField("stunnedState")] + public string StunnedState = "stunned"; + [DataField("harvestingState")] + public string HarvestingState = "harvesting"; +} diff --git a/Content.Client/Revenant/RevenantSystem.cs b/Content.Client/Revenant/RevenantSystem.cs new file mode 100644 index 0000000000..f942911ee9 --- /dev/null +++ b/Content.Client/Revenant/RevenantSystem.cs @@ -0,0 +1,36 @@ +using Content.Shared.Revenant; +using Robust.Client.GameObjects; + +namespace Content.Client.Revenant; + +public sealed class RevenantSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnAppearanceChange); + } + + private void OnAppearanceChange(EntityUid uid, RevenantComponent component, ref AppearanceChangeEvent args) + { + if (args.Sprite == null) + return; + + if (args.Component.TryGetData(RevenantVisuals.Harvesting, out bool harvesting) && harvesting) + { + args.Sprite.LayerSetState(0, component.HarvestingState); + } + else if (args.Component.TryGetData(RevenantVisuals.Stunned, out bool stunned) && stunned) + { + args.Sprite.LayerSetState(0, component.StunnedState); + } + else if (args.Component.TryGetData(RevenantVisuals.Corporeal, out bool corporeal)) + { + if (corporeal) + args.Sprite.LayerSetState(0, component.CorporealState); + else + args.Sprite.LayerSetState(0, component.State); + } + } +} diff --git a/Content.Client/Revenant/Ui/RevenantBoundUserInterface.cs b/Content.Client/Revenant/Ui/RevenantBoundUserInterface.cs new file mode 100644 index 0000000000..9fc45e3aff --- /dev/null +++ b/Content.Client/Revenant/Ui/RevenantBoundUserInterface.cs @@ -0,0 +1,56 @@ +using Content.Client.Traitor.Uplink; +using Content.Shared.Revenant; +using Content.Shared.Traitor.Uplink; +using JetBrains.Annotations; +using Robust.Client.GameObjects; + +namespace Content.Client.Revenant.Ui; + +[UsedImplicitly] +public sealed class RevenantBoundUserInterface : BoundUserInterface +{ + private RevenantMenu? _menu; + + public RevenantBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey) + { + + } + + protected override void Open() + { + _menu = new(); + _menu.OpenCentered(); + _menu.OnClose += Close; + + _menu.OnListingButtonPressed += (_, listing) => + { + SendMessage(new RevenantBuyListingMessage(listing)); + }; + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + + if (_menu == null) + return; + + switch (state) + { + case RevenantUpdateState msg: + _menu.UpdateEssence(msg.Essence); + _menu.UpdateListing(msg.Listings); + break; + } + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + _menu?.Close(); + _menu?.Dispose(); + } +} diff --git a/Content.Client/Revenant/Ui/RevenantListingControl.xaml b/Content.Client/Revenant/Ui/RevenantListingControl.xaml new file mode 100644 index 0000000000..6adcfdc896 --- /dev/null +++ b/Content.Client/Revenant/Ui/RevenantListingControl.xaml @@ -0,0 +1,21 @@ + + + +