using Content.Server.Popups; using Content.Server.UserInterface; using Content.Shared.Examine; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Paper; using Content.Shared.Tag; using Robust.Server.GameObjects; using Robust.Shared.Player; using static Content.Shared.Paper.SharedPaperComponent; namespace Content.Server.Paper { public sealed class PaperSystem : EntitySystem { [Dependency] private readonly TagSystem _tagSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(BeforeUIOpen); SubscribeLocalEvent(OnExamined); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnInputTextMessage); } private void OnInit(EntityUid uid, PaperComponent paperComp, ComponentInit args) { paperComp.Mode = PaperAction.Read; UpdateUserInterface(uid, paperComp); if (TryComp(uid, out var appearance)) { if (paperComp.Content != "") appearance.SetData(PaperVisuals.Status, PaperStatus.Written); if (paperComp.StampState != null) appearance.SetData(PaperVisuals.Stamp, paperComp.StampState); } } private void BeforeUIOpen(EntityUid uid, PaperComponent paperComp, BeforeActivatableUIOpenEvent args) { paperComp.Mode = PaperAction.Read; UpdateUserInterface(uid, paperComp); } private void OnExamined(EntityUid uid, PaperComponent paperComp, ExaminedEvent args) { if (!args.IsInDetailsRange) return; if (paperComp.Content != "") args.Message.AddMarkup( Loc.GetString( "paper-component-examine-detail-has-words", ("paper", uid) ) ); if (paperComp.StampedBy.Count > 0) { args.Message.PushNewline(); string commaSeparated = string.Join(", ", paperComp.StampedBy); args.Message.AddMarkup( Loc.GetString( "paper-component-examine-detail-stamped-by", ("paper", uid), ("stamps", commaSeparated)) ); } } private void OnInteractUsing(EntityUid uid, PaperComponent paperComp, InteractUsingEvent args) { if (_tagSystem.HasTag(args.Used, "Write")) { if (!TryComp(args.User, out var actor)) return; paperComp.Mode = PaperAction.Write; UpdateUserInterface(uid, paperComp); _uiSystem.GetUiOrNull(uid, PaperUiKey.Key)?.Open(actor.PlayerSession); return; } // If a stamp, attempt to stamp paper if (TryComp(args.Used, out var stampComp) && TryStamp(uid, stampComp.StampedName, stampComp.StampState, paperComp)) { // successfully stamped, play popup var stampPaperOtherMessage = Loc.GetString("paper-component-action-stamp-paper-other", ("user", Identity.Entity(args.User, EntityManager)),("target", Identity.Entity(args.Target, EntityManager)),("stamp", args.Used)); _popupSystem.PopupEntity(stampPaperOtherMessage, args.User, Filter.Pvs(args.User, entityManager: EntityManager).RemoveWhereAttachedEntity(puid => puid == args.User)); var stampPaperSelfMessage = Loc.GetString("paper-component-action-stamp-paper-self", ("target", Identity.Entity(args.Target, EntityManager)),("stamp", args.Used)); _popupSystem.PopupEntity(stampPaperSelfMessage, args.User, Filter.Entities(args.User)); } } private void OnInputTextMessage(EntityUid uid, PaperComponent paperComp, PaperInputTextMessage args) { if (string.IsNullOrEmpty(args.Text)) return; if (args.Text.Length + paperComp.Content.Length <= paperComp.ContentSize) paperComp.Content += args.Text + '\n'; if (TryComp(uid, out var appearance)) appearance.SetData(PaperVisuals.Status, PaperStatus.Written); if (TryComp(uid, out var meta)) meta.EntityDescription = ""; UpdateUserInterface(uid, paperComp); } /// /// Accepts the name and state to be stamped onto the paper, returns true if successful. /// public bool TryStamp(EntityUid uid, string stampName, string stampState, PaperComponent? paperComp = null) { if (!Resolve(uid, ref paperComp)) return false; if (!paperComp.StampedBy.Contains(Loc.GetString(stampName))) { paperComp.StampedBy.Add(Loc.GetString(stampName)); if (paperComp.StampState == null && TryComp(uid, out var appearance)) { paperComp.StampState = stampState; appearance.SetData(PaperVisuals.Stamp, paperComp.StampState); } } return true; } public void SetContent(EntityUid uid, string content, PaperComponent? paperComp = null) { if (!Resolve(uid, ref paperComp)) return; paperComp.Content = content + '\n'; UpdateUserInterface(uid, paperComp); if (!TryComp(uid, out var appearance)) return; var status = string.IsNullOrWhiteSpace(content) ? PaperStatus.Blank : PaperStatus.Written; appearance.SetData(PaperVisuals.Status, status); } public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null) { if (!Resolve(uid, ref paperComp)) return; _uiSystem.GetUiOrNull(uid, PaperUiKey.Key)?.SetState(new PaperBoundUserInterfaceState(paperComp.Content, paperComp.Mode)); } } }