diff --git a/Content.Client/Popups/PopupSystem.cs b/Content.Client/Popups/PopupSystem.cs index 2c923ae3a71cc0..cf96c41241a121 100644 --- a/Content.Client/Popups/PopupSystem.cs +++ b/Content.Client/Popups/PopupSystem.cs @@ -150,7 +150,7 @@ public override void PopupEntity(string? message, EntityUid uid, ICommonSession PopupEntity(message, uid, type); } - public override void PopupEntity(string? message, EntityUid uid, Filter filter, bool recordReplay, PopupType type=PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, Filter filter, bool recordReplay, PopupType type = PopupType.Small) { if (!filter.Recipients.Contains(_playerManager.LocalSession)) return; @@ -170,6 +170,12 @@ public override void PopupEntity(string? message, EntityUid uid, PopupType type PopupMessage(message, type, transform.Coordinates, uid, true); } + public override void PopupPredicted(string? message, EntityUid uid, EntityUid? recipient, PopupType type = PopupType.Small) + { + if (recipient != null && _timing.IsFirstTimePredicted) + PopupEntity(message, uid, recipient.Value, type); + } + #endregion #region Network Event Handlers diff --git a/Content.Server/Popups/PopupSystem.cs b/Content.Server/Popups/PopupSystem.cs index 4d9a9f3bf5b1fb..c5eb3819b54a0e 100644 --- a/Content.Server/Popups/PopupSystem.cs +++ b/Content.Server/Popups/PopupSystem.cs @@ -18,7 +18,7 @@ public override void PopupCursor(string? message, PopupType type = PopupType.Sma // No local user. } - public override void PopupCursor(string? message, ICommonSession recipient, PopupType type=PopupType.Small) + public override void PopupCursor(string? message, ICommonSession recipient, PopupType type = PopupType.Small) { if (message == null) return; @@ -75,11 +75,11 @@ public override void PopupEntity(string? message, EntityUid uid, PopupType type if (message == null) return; - var filter = Filter.Empty().AddPlayersByPvs(uid, entityManager:EntityManager, playerMan: _player, cfgMan: _cfg); + var filter = Filter.Empty().AddPlayersByPvs(uid, entityManager: EntityManager, playerMan: _player, cfgMan: _cfg); RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid)), filter); } - public override void PopupEntity(string? message, EntityUid uid, EntityUid recipient, PopupType type=PopupType.Small) + public override void PopupEntity(string? message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small) { if (message == null) return; @@ -108,5 +108,23 @@ public override void PopupEntity(string? message, EntityUid uid, Filter filter, RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid)), filter, recordReplay); } + + public override void PopupPredicted(string? message, EntityUid uid, EntityUid? recipient, PopupType type = PopupType.Small) + { + if (message == null) + return; + + if (recipient != null) + { + // Don't send to recipient, since they predicted it locally + var filter = Filter.PvsExcept(recipient.Value, entityManager: EntityManager); + RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid)), filter); + } + else + { + // With no recipient, send to everyone (in PVS range) + RaiseNetworkEvent(new PopupEntityEvent(message, type, GetNetEntity(uid))); + } + } } } diff --git a/Content.Shared/Popups/SharedPopupSystem.cs b/Content.Shared/Popups/SharedPopupSystem.cs index f8e07e5df5e147..aeb85de2f5971c 100644 --- a/Content.Shared/Popups/SharedPopupSystem.cs +++ b/Content.Shared/Popups/SharedPopupSystem.cs @@ -83,10 +83,17 @@ public abstract class SharedPopupSystem : EntitySystem public abstract void PopupEntity(string? message, EntityUid uid, Filter filter, bool recordReplay, PopupType type = PopupType.Small); /// - /// Variant of that only runs on the client, outside of prediction. + /// Variant of that only runs on the client, outside of prediction. /// Useful for shared code that is always ran by both sides to avoid duplicate popups. /// public abstract void PopupClient(string? message, EntityUid uid, EntityUid recipient, PopupType type = PopupType.Small); + + /// + /// Variant of for use with prediction. The local client will show + /// the popup to the recipient, and the server will show it to every other player in PVS range. If recipient is null, the local client + /// will do nothing and the server will show the message to every player in PVS range. + /// + public abstract void PopupPredicted(string? message, EntityUid uid, EntityUid? recipient, PopupType type = PopupType.Small); } ///