using Content.Server.Labels.Components; using Content.Server.Paper; using Content.Shared.Containers.ItemSlots; using Content.Shared.Examine; using Content.Shared.Labels; using JetBrains.Annotations; using Robust.Shared.Containers; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Utility; namespace Content.Server.Labels { /// /// A system that lets players see the contents of a label on an object. /// [UsedImplicitly] public class LabelSystem : EntitySystem { [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(OnComponentInit); SubscribeLocalEvent(OnComponentRemove); SubscribeLocalEvent(OnContainerModified); SubscribeLocalEvent(OnContainerModified); SubscribeLocalEvent(OnExamined); } private void OnComponentInit(EntityUid uid, PaperLabelComponent component, ComponentInit args) { _itemSlotsSystem.AddItemSlot(uid, component.Name, component.LabelSlot); if (!EntityManager.TryGetComponent(uid, out AppearanceComponent appearance)) return; appearance.SetData(PaperLabelVisuals.HasLabel, false); } private void OnComponentRemove(EntityUid uid, PaperLabelComponent component, ComponentRemove args) { _itemSlotsSystem.RemoveItemSlot(uid, component.LabelSlot); } private void OnExamine(EntityUid uid, LabelComponent? label, ExaminedEvent args) { if (!Resolve(uid, ref label)) return; if (label.CurrentLabel == null) return; var message = new FormattedMessage(); message.AddText(Loc.GetString("hand-labeler-has-label", ("label", label.CurrentLabel))); args.PushMessage(message); } private void OnExamined(EntityUid uid, PaperLabelComponent comp, ExaminedEvent args) { if (comp.LabelSlot.Item is not {Valid: true} item) return; if (!args.IsInDetailsRange) { args.PushMarkup(Loc.GetString("comp-paper-label-has-label-cant-read")); return; } if (!EntityManager.TryGetComponent(item, out PaperComponent paper)) // Assuming yaml has the correct entity whitelist, this should not happen. return; if (string.IsNullOrWhiteSpace(paper.Content)) { args.PushMarkup(Loc.GetString("comp-paper-label-has-label-blank")); return; } args.PushMarkup(Loc.GetString("comp-paper-label-has-label")); var text = paper.Content; args.PushMarkup(text.TrimEnd()); } private void OnContainerModified(EntityUid uid, PaperLabelComponent label, ContainerModifiedMessage args) { if (!label.Initialized) return; if (args.Container.ID != label.LabelSlot.ID) return; if (!EntityManager.TryGetComponent(uid, out AppearanceComponent appearance)) return; appearance.SetData(PaperLabelVisuals.HasLabel, label.LabelSlot.HasItem); } } }