using Content.Shared.Humanoid.Markings;
using Content.Shared.Interaction;
using Content.Shared.MagicMirror;
-using Robust.Server.GameObjects;
using Robust.Shared.Audio.Systems;
-using Robust.Shared.Player;
namespace Content.Server.MagicMirror;
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
[Dependency] private readonly MarkingManager _markings = default!;
[Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!;
- [Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<MagicMirrorComponent, ActivatableUIOpenAttemptEvent>(OnOpenUIAttempt);
- Subs.BuiEvents<MagicMirrorComponent>(MagicMirrorUiKey.Key, subs =>
+ Subs.BuiEvents<MagicMirrorComponent>(MagicMirrorUiKey.Key,
+ subs =>
{
subs.Event<BoundUIClosedEvent>(OnUiClosed);
subs.Event<MagicMirrorSelectMessage>(OnMagicMirrorSelect);
}
- private void UpdateInterface(EntityUid mirrorUid, EntityUid targetUid, MagicMirrorComponent component)
- {
- if (!TryComp<HumanoidAppearanceComponent>(targetUid, out var humanoid))
- return;
-
- var hair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.Hair, out var hairMarkings)
- ? new List<Marking>(hairMarkings)
- : new();
-
- var facialHair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.FacialHair, out var facialHairMarkings)
- ? new List<Marking>(facialHairMarkings)
- : new();
-
- var state = new MagicMirrorUiState(
- humanoid.Species,
- hair,
- humanoid.MarkingSet.PointsLeft(MarkingCategories.Hair) + hair.Count,
- facialHair,
- humanoid.MarkingSet.PointsLeft(MarkingCategories.FacialHair) + facialHair.Count);
-
- // TODO: Component states
- component.Target = targetUid;
- _uiSystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state);
- Dirty(mirrorUid, component);
- }
-
private void OnUiClosed(Entity<MagicMirrorComponent> ent, ref BoundUIClosedEvent args)
{
ent.Comp.Target = null;
/// Sound emitted when slots are changed
/// </summary>
[DataField, ViewVariables(VVAccess.ReadWrite)]
- public SoundSpecifier ChangeHairSound = new SoundPathSpecifier("/Audio/Items/scissors.ogg");
+ public SoundSpecifier? ChangeHairSound = new SoundPathSpecifier("/Audio/Items/scissors.ogg");
}
using Content.Shared.DoAfter;
+using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Content.Shared.Interaction;
+using Content.Shared.UserInterface;
using Robust.Shared.Serialization;
namespace Content.Shared.MagicMirror;
public abstract class SharedMagicMirrorSystem : EntitySystem
{
[Dependency] private readonly SharedInteractionSystem _interaction = default!;
+ [Dependency] protected readonly SharedUserInterfaceSystem _uiSystem = default!;
public override void Initialize()
{
base.Initialize();
+ SubscribeLocalEvent<MagicMirrorComponent, BeforeActivatableUIOpenEvent>(OnBeforeUIOpen);
SubscribeLocalEvent<MagicMirrorComponent, BoundUserInterfaceCheckRangeEvent>(OnMirrorRangeCheck);
}
args.Result = BoundUserInterfaceRangeResult.Fail;
}
}
+
+ private void OnBeforeUIOpen(Entity<MagicMirrorComponent> ent, ref BeforeActivatableUIOpenEvent args)
+ {
+ ent.Comp.Target ??= args.User;
+ UpdateInterface(ent, args.User, ent);
+ }
+
+ protected void UpdateInterface(EntityUid mirrorUid, EntityUid targetUid, MagicMirrorComponent component)
+ {
+ if (!TryComp<HumanoidAppearanceComponent>(targetUid, out var humanoid))
+ return;
+
+ var hair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.Hair, out var hairMarkings)
+ ? new List<Marking>(hairMarkings)
+ : new();
+
+ var facialHair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.FacialHair, out var facialHairMarkings)
+ ? new List<Marking>(facialHairMarkings)
+ : new();
+
+ var state = new MagicMirrorUiState(
+ humanoid.Species,
+ hair,
+ humanoid.MarkingSet.PointsLeft(MarkingCategories.Hair) + hair.Count,
+ facialHair,
+ humanoid.MarkingSet.PointsLeft(MarkingCategories.FacialHair) + facialHair.Count);
+
+ // TODO: Component states
+ component.Target = targetUid;
+ _uiSystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state);
+ Dirty(mirrorUid, component);
+ }
}
[Serializable, NetSerializable]
- type: Clickable
- type: Transform
anchored: true
- - type: MagicMirror
+ - type: MagicMirror #instant and silent
+ changeHairSound: null
+ addSlotTime: 0
+ removeSlotTime: 0
+ selectSlotTime: 0
+ changeSlotTime: 0
- type: ActivatableUI
key: enum.MagicMirrorUiKey.Key
- type: UserInterface