#nullable enable using System.Threading.Tasks; using Content.Server.Utility; using Content.Shared.GameObjects.Components; using Content.Shared.GameObjects.Components.Tag; using Content.Shared.GameObjects.EntitySystems; using Content.Shared.Interfaces.GameObjects.Components; using Robust.Server.GameObjects; using Robust.Shared.GameObjects; using Robust.Shared.Utility; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Paper { [RegisterComponent] public class PaperComponent : SharedPaperComponent, IExamine, IInteractUsing, IUse { private PaperAction _mode; public string Content { get; private set; } = ""; [ViewVariables] private BoundUserInterface? UserInterface => Owner.GetUIOrNull(PaperUiKey.Key); public override void Initialize() { base.Initialize(); if (UserInterface != null) { UserInterface.OnReceiveMessage += OnUiReceiveMessage; } _mode = PaperAction.Read; UpdateUserInterface(); } private void UpdateUserInterface() { UserInterface?.SetState(new PaperBoundUserInterfaceState(Content, _mode)); } public void Examine(FormattedMessage message, bool inDetailsRange) { if (!inDetailsRange) return; message.AddMarkup(Content); } bool IUse.UseEntity(UseEntityEventArgs eventArgs) { if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) return false; _mode = PaperAction.Read; UpdateUserInterface(); UserInterface?.Toggle(actor.playerSession); return true; } private void OnUiReceiveMessage(ServerBoundUserInterfaceMessage obj) { var msg = (PaperInputText) obj.Message; if (string.IsNullOrEmpty(msg.Text)) return; Content += msg.Text + '\n'; if (Owner.TryGetComponent(out SpriteComponent? sprite)) { sprite.LayerSetState(1, "paper_words"); } Owner.Description = ""; UpdateUserInterface(); } async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (!eventArgs.Using.HasTag("Write")) return false; if (!eventArgs.User.TryGetComponent(out IActorComponent? actor)) return false; _mode = PaperAction.Write; UpdateUserInterface(); UserInterface?.Open(actor.playerSession); return true; } } }