From 1eac63e5bb02bef64a9cf4b4dc487e7b39c1bec2 Mon Sep 17 00:00:00 2001 From: DrSmugleaf Date: Fri, 24 Jul 2020 14:26:39 +0200 Subject: [PATCH] Fix popupmessage appearing behind the player when moving (#1401) --- Content.Client/ClientNotifyManager.cs | 33 +++++++++--- Content.Server/ServerNotifyManager.cs | 26 +++++++-- Content.Shared/SharedNotifyManager.cs | 78 +++++++++++++++++++-------- 3 files changed, 106 insertions(+), 31 deletions(-) diff --git a/Content.Client/ClientNotifyManager.cs b/Content.Client/ClientNotifyManager.cs index 2d59f0e380..1a5e6d82a0 100644 --- a/Content.Client/ClientNotifyManager.cs +++ b/Content.Client/ClientNotifyManager.cs @@ -27,6 +27,7 @@ namespace Content.Client [Dependency] private IInputManager _inputManager; [Dependency] private IEyeManager _eyeManager; [Dependency] private IClientNetManager _netManager; + [Dependency] private IEntityManager _entityManager; #pragma warning restore 649 private readonly List _aliveLabels = new List(); @@ -36,21 +37,41 @@ namespace Content.Client { DebugTools.Assert(!_initialized); - _netManager.RegisterNetMessage(nameof(MsgDoNotify), DoNotifyMessage); + _netManager.RegisterNetMessage(nameof(MsgDoNotifyCursor), DoNotifyCursor); + _netManager.RegisterNetMessage(nameof(MsgDoNotifyCoordinates), DoNotifyCoordinates); + _netManager.RegisterNetMessage(nameof(MsgDoNotifyEntity), DoNotifyEntity); _initialized = true; } - private void DoNotifyMessage(MsgDoNotify message) + private void DoNotifyCursor(MsgDoNotifyCursor message) { - if (message.AtCursor) + PopupMessage(message.Message); + } + + private void DoNotifyCoordinates(MsgDoNotifyCoordinates message) + { + PopupMessage(_eyeManager.WorldToScreen(message.Coordinates), message.Message); + } + + private void DoNotifyEntity(MsgDoNotifyEntity message) + { + if (!_entityManager.TryGetEntity(message.Entity, out var entity)) { - PopupMessage(message.Message); + return; } - else + + PopupMessage(_eyeManager.WorldToScreen(entity.Transform.GridPosition), message.Message); + } + + public override void PopupMessage(IEntity source, IEntity viewer, string message) + { + if (viewer != _playerManager.LocalPlayer.ControlledEntity) { - PopupMessage(_eyeManager.WorldToScreen(message.Coordinates), message.Message); + return; } + + PopupMessage(_eyeManager.WorldToScreen(source.Transform.GridPosition), message); } public override void PopupMessage(GridCoordinates coordinates, IEntity viewer, string message) diff --git a/Content.Server/ServerNotifyManager.cs b/Content.Server/ServerNotifyManager.cs index 2e2e11f125..c4e8068106 100644 --- a/Content.Server/ServerNotifyManager.cs +++ b/Content.Server/ServerNotifyManager.cs @@ -25,10 +25,27 @@ namespace Content.Server { DebugTools.Assert(!_initialized); - _netManager.RegisterNetMessage(nameof(MsgDoNotify)); + _netManager.RegisterNetMessage(nameof(MsgDoNotifyCursor)); + _netManager.RegisterNetMessage(nameof(MsgDoNotifyCoordinates)); + _netManager.RegisterNetMessage(nameof(MsgDoNotifyEntity)); + _initialized = true; } + public override void PopupMessage(IEntity source, IEntity viewer, string message) + { + if (!viewer.TryGetComponent(out IActorComponent actor)) + { + return; + } + + var netMessage = _netManager.CreateNetMessage(); + netMessage.Entity = source.Uid; + netMessage.Message = message; + + _netManager.ServerSendMessage(netMessage, actor.playerSession.ConnectedClient); + } + public override void PopupMessage(GridCoordinates coordinates, IEntity viewer, string message) { if (!viewer.TryGetComponent(out IActorComponent actor)) @@ -36,9 +53,10 @@ namespace Content.Server return; } - var netMessage = _netManager.CreateNetMessage(); + var netMessage = _netManager.CreateNetMessage(); netMessage.Coordinates = coordinates; netMessage.Message = message; + _netManager.ServerSendMessage(netMessage, actor.playerSession.ConnectedClient); } @@ -49,9 +67,9 @@ namespace Content.Server return; } - var netMessage = _netManager.CreateNetMessage(); + var netMessage = _netManager.CreateNetMessage(); netMessage.Message = message; - netMessage.AtCursor = true; + _netManager.ServerSendMessage(netMessage, actor.playerSession.ConnectedClient); } diff --git a/Content.Shared/SharedNotifyManager.cs b/Content.Shared/SharedNotifyManager.cs index 3899a91170..844693e474 100644 --- a/Content.Shared/SharedNotifyManager.cs +++ b/Content.Shared/SharedNotifyManager.cs @@ -1,5 +1,6 @@ using Content.Shared.Interfaces; using Lidgren.Network; +using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Network; using Robust.Shared.Map; @@ -9,49 +10,84 @@ namespace Content.Shared { public abstract class SharedNotifyManager : ISharedNotifyManager { - public void PopupMessage(IEntity source, IEntity viewer, string message) - { - // TODO: we might eventually want for this to pass the actual entity, - // so the notify could track the entity movement visually. - PopupMessage(source.Transform.GridPosition, viewer, message); - } + public abstract void PopupMessage(IEntity source, IEntity viewer, string message); public abstract void PopupMessage(GridCoordinates coordinates, IEntity viewer, string message); + public abstract void PopupMessageCursor(IEntity viewer, string message); - protected class MsgDoNotify : NetMessage + protected class MsgDoNotifyCursor : NetMessage { #region REQUIRED public const MsgGroups GROUP = MsgGroups.Command; - public const string NAME = nameof(MsgDoNotify); - public MsgDoNotify(INetChannel channel) : base(NAME, GROUP) { } + public const string NAME = nameof(MsgDoNotifyCursor); + public MsgDoNotifyCursor(INetChannel channel) : base(NAME, GROUP) { } #endregion public string Message { get; set; } - public bool AtCursor { get; set; } - public GridCoordinates Coordinates { get; set; } public override void ReadFromBuffer(NetIncomingMessage buffer) { Message = buffer.ReadString(); - AtCursor = buffer.ReadBoolean(); - if (!AtCursor) - { - Coordinates = buffer.ReadGridLocalCoordinates(); - } } public override void WriteToBuffer(NetOutgoingMessage buffer) { buffer.Write(Message); - buffer.Write(AtCursor); + } + } - if (!AtCursor) - { - buffer.Write(Coordinates); - } + protected class MsgDoNotifyCoordinates : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(MsgDoNotifyCoordinates); + public MsgDoNotifyCoordinates(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + + public string Message { get; set; } + public GridCoordinates Coordinates; + + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + Message = buffer.ReadString(); + Coordinates = buffer.ReadGridLocalCoordinates(); + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + buffer.Write(Message); + buffer.Write(Coordinates); + } + } + + protected class MsgDoNotifyEntity : NetMessage + { + #region REQUIRED + + public const MsgGroups GROUP = MsgGroups.Command; + public const string NAME = nameof(MsgDoNotifyEntity); + public MsgDoNotifyEntity(INetChannel channel) : base(NAME, GROUP) { } + + #endregion + + public string Message { get; set; } + public EntityUid Entity; + + public override void ReadFromBuffer(NetIncomingMessage buffer) + { + Message = buffer.ReadString(); + Entity = buffer.ReadEntityUid(); + } + + public override void WriteToBuffer(NetOutgoingMessage buffer) + { + buffer.Write(Message); + buffer.Write(Entity); } } }