using System; using Content.Server.Labels.Components; using Content.Server.UserInterface; using Content.Shared.ActionBlocker; using Content.Shared.Interaction; using Content.Shared.Labels; using Content.Shared.Popups; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Players; namespace Content.Server.Labels { /// /// A hand labeler system that lets an object apply labels to objects with the . /// [UsedImplicitly] public class HandLabelerSystem : EntitySystem { [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(AfterInteractOn); SubscribeLocalEvent(OnUseInHand); // Bound UI subscriptions SubscribeLocalEvent(OnHandLabelerLabelChanged); } private void AfterInteractOn(EntityUid uid, HandLabelerComponent handLabeler, AfterInteractEvent args) { if (args.Target is not {Valid: true} target || !handLabeler.Whitelist.IsValid(target)) return; AddLabelTo(uid, handLabeler, target, out string? result); if (result != null) handLabeler.Owner.PopupMessage(args.User, result); } private void AddLabelTo(EntityUid uid, HandLabelerComponent? handLabeler, EntityUid target, out string? result) { if (!Resolve(uid, ref handLabeler)) { result = null; return; } LabelComponent label = target.EnsureComponent(); if (label.OriginalName != null) IoCManager.Resolve().GetComponent(target).EntityName = label.OriginalName; label.OriginalName = null; if (handLabeler.AssignedLabel == string.Empty) { label.CurrentLabel = null; result = Loc.GetString("hand-labeler-successfully-removed"); return; } label.OriginalName = IoCManager.Resolve().GetComponent(target).EntityName; string val = IoCManager.Resolve().GetComponent(target).EntityName + $" ({handLabeler.AssignedLabel})"; IoCManager.Resolve().GetComponent(target).EntityName = val; label.CurrentLabel = handLabeler.AssignedLabel; result = Loc.GetString("hand-labeler-successfully-applied"); } private void OnUseInHand(EntityUid uid, HandLabelerComponent handLabeler, UseInHandEvent args) { if (!IoCManager.Resolve().TryGetComponent(args.User, out ActorComponent? actor)) return; handLabeler.Owner.GetUIOrNull(HandLabelerUiKey.Key)?.Open(actor.PlayerSession); args.Handled = true; } private bool CheckInteract(ICommonSession session) { if (session.AttachedEntity is not { } uid || !Get().CanInteract(uid) || !Get().CanUse(uid)) return false; return true; } private void OnHandLabelerLabelChanged(EntityUid uid, HandLabelerComponent handLabeler, HandLabelerLabelChangedMessage args) { if (!CheckInteract(args.Session)) return; handLabeler.AssignedLabel = args.Label.Trim().Substring(0, Math.Min(handLabeler.MaxLabelChars, args.Label.Length)); DirtyUI(uid, handLabeler); } private void DirtyUI(EntityUid uid, HandLabelerComponent? handLabeler = null) { if (!Resolve(uid, ref handLabeler)) return; _userInterfaceSystem.TrySetUiState(uid, HandLabelerUiKey.Key, new HandLabelerBoundUserInterfaceState(handLabeler.AssignedLabel)); } } }