Popup message notifications. (#125)

* Popup message system v1

* Networking for the popup notifications.

Ship it.
This commit is contained in:
Pieter-Jan Briers
2018-11-21 21:11:30 +01:00
committed by GitHub
parent b0f212bad5
commit f91488fa27
13 changed files with 324 additions and 1 deletions

View File

@@ -0,0 +1,127 @@
using System;
using System.Collections.Generic;
using Content.Client.Interfaces;
using Content.Shared;
using SS14.Client;
using SS14.Client.Interfaces.Console;
using SS14.Client.Interfaces.Graphics.ClientEye;
using SS14.Client.Interfaces.Input;
using SS14.Client.Interfaces.UserInterface;
using SS14.Client.Player;
using SS14.Client.UserInterface.Controls;
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.Interfaces.Network;
using SS14.Shared.IoC;
using SS14.Shared.Map;
using SS14.Shared.Maths;
using SS14.Shared.Utility;
namespace Content.Client
{
public class ClientNotifyManager : SharedNotifyManager, IClientNotifyManager
{
#pragma warning disable 649
[Dependency] private IPlayerManager _playerManager;
[Dependency] private IUserInterfaceManager _userInterfaceManager;
[Dependency] private IInputManager _inputManager;
[Dependency] private IEyeManager _eyeManager;
[Dependency] private IClientNetManager _netManager;
#pragma warning restore 649
private readonly List<PopupLabel> _aliveLabels = new List<PopupLabel>();
private bool _initialized;
public void Initialize()
{
DebugTools.Assert(!_initialized);
_netManager.RegisterNetMessage<MsgDoNotify>(nameof(MsgDoNotify), DoNotifyMessage);
_initialized = true;
}
private void DoNotifyMessage(MsgDoNotify message)
{
PopupMessage(_eyeManager.WorldToScreen(message.Coordinates), message.Message);
}
public override void PopupMessage(GridLocalCoordinates coordinates, IEntity viewer, string message)
{
if (viewer != _playerManager.LocalPlayer.ControlledEntity)
{
return;
}
PopupMessage(_eyeManager.WorldToScreen(coordinates), message);
}
public void PopupMessage(ScreenCoordinates coordinates, string message)
{
var label = new PopupLabel {Text = message};
var minimumSize = label.CombinedMinimumSize;
label.InitialPos = label.Position = coordinates.AsVector - minimumSize / 2;
_userInterfaceManager.StateRoot.AddChild(label);
_aliveLabels.Add(label);
}
public void PopupMessage(string message)
{
PopupMessage(new ScreenCoordinates(_inputManager.MouseScreenPosition), message);
}
public void FrameUpdate(RenderFrameEventArgs eventArgs)
{
foreach (var label in _aliveLabels)
{
label.Update(eventArgs);
}
_aliveLabels.RemoveAll(l => l.Disposed);
}
private class PopupLabel : Label
{
private float _timeLeft;
public Vector2 InitialPos { get; set; }
protected override void Initialize()
{
base.Initialize();
ShadowOffsetXOverride = 1;
ShadowOffsetYOverride = 1;
FontColorShadowOverride = Color.Black;
}
public void Update(RenderFrameEventArgs eventArgs)
{
_timeLeft += eventArgs.Elapsed;
Position = InitialPos - new Vector2(0, 20 * (_timeLeft * _timeLeft + _timeLeft));
if (_timeLeft > 0.5f)
{
Modulate = Color.White.WithAlpha(1f - 0.2f * (float)Math.Pow(_timeLeft - 0.5f, 3f));
if (_timeLeft > 3f)
{
Dispose();
}
}
}
}
}
public class PopupMessageCommand : IConsoleCommand
{
public string Command => "popupmsg";
public string Description => "";
public string Help => "";
public bool Execute(IDebugConsole console, params string[] args)
{
var arg = args[0];
var mgr = IoCManager.Resolve<IClientNotifyManager>();
mgr.PopupMessage(arg);
return false;
}
}
}

View File

@@ -74,8 +74,11 @@
<Compile Include="GameObjects\Components\Power\ApcBoundUserInterface.cs" />
<Compile Include="GameObjects\Components\Power\PowerCellVisualizer2D.cs" />
<Compile Include="GameObjects\Components\Storage\ClientStorageComponent.cs" />
<Compile Include="GameObjects\EntitySystems\ClientNotifySystem.cs" />
<Compile Include="GameObjects\EntitySystems\VerbSystem.cs" />
<Compile Include="Input\ContentContexts.cs" />
<Compile Include="Interfaces\IClientNotifyManager.cs" />
<Compile Include="ClientNotifyManager.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="GameObjects\Components\Items\ClientHandsComponent.cs" />
<Compile Include="Interfaces\GameObjects\Components\Items\IHandsComponent.cs" />

View File

@@ -5,7 +5,10 @@ using Content.Client.GameObjects.Components.Power;
using Content.Client.GameObjects.Components.SmoothWalling;
using Content.Client.GameObjects.Components.Storage;
using Content.Client.Input;
using Content.Client.Interfaces;
using Content.Client.Interfaces.GameObjects;
using Content.Shared.Interfaces;
using SS14.Client;
using SS14.Client.Interfaces.Input;
using SS14.Client.Utility;
using SS14.Shared.ContentPack;
@@ -72,6 +75,9 @@ namespace Content.Client
prototypes.RegisterIgnore("material");
IoCManager.Register<IClientNotifyManager, ClientNotifyManager>();
IoCManager.Register<ISharedNotifyManager, ClientNotifyManager>();
IoCManager.BuildGraph();
}
public override void PostInit()
@@ -81,6 +87,20 @@ namespace Content.Client
// Setup key contexts
var inputMan = IoCManager.Resolve<IInputManager>();
ContentContexts.SetupContexts(inputMan.Contexts);
IoCManager.Resolve<IClientNotifyManager>().Initialize();
}
public override void Update(AssemblyLoader.UpdateLevel level, float frameTime)
{
base.Update(level, frameTime);
switch (level)
{
case AssemblyLoader.UpdateLevel.FramePreEngine:
IoCManager.Resolve<IClientNotifyManager>().FrameUpdate(new RenderFrameEventArgs(frameTime));
break;
}
}
}
}

View File

@@ -0,0 +1,7 @@
namespace Content.Client.GameObjects.EntitySystems
{
public class ClientNotifySystem
{
}
}

View File

@@ -0,0 +1,14 @@
using Content.Shared.Interfaces;
using SS14.Client;
using SS14.Shared.Map;
namespace Content.Client.Interfaces
{
public interface IClientNotifyManager : ISharedNotifyManager
{
void Initialize();
void PopupMessage(ScreenCoordinates coordinates, string message);
void PopupMessage(string message);
void FrameUpdate(RenderFrameEventArgs eventArgs);
}
}

View File

@@ -116,6 +116,7 @@
<Compile Include="GameObjects\Components\Damage\ResistanceSet.cs" />
<Compile Include="GameObjects\Components\Temperature\TemperatureComponent.cs" />
<Compile Include="Interfaces\GameObjects\IOnDamageBehavior.cs" />
<Compile Include="Interfaces\IServerNotifyManager.cs" />
<Compile Include="Mobs\Commands.cs" />
<Compile Include="Mobs\Mind.cs" />
<Compile Include="Mobs\Role.cs" />
@@ -127,6 +128,7 @@
<Compile Include="Interfaces\GameObjects\Components\Damage\IDamageableComponent.cs" />
<Compile Include="GameObjects\Components\Power\PoweredLightComponent.cs" />
<Compile Include="GameObjects\Components\Power\PowerDebugTool.cs" />
<Compile Include="ServerNotifyManager.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Content.Shared\Content.Shared.csproj">

View File

@@ -34,7 +34,9 @@ using Content.Server.GameObjects.EntitySystems;
using Content.Server.Mobs;
using Content.Server.Players;
using Content.Server.GameObjects.Components.Interactable;
using Content.Server.Interfaces;
using Content.Shared.GameObjects.Components.Inventory;
using Content.Shared.Interfaces;
namespace Content.Server
{
@@ -125,6 +127,12 @@ namespace Content.Server
factory.RegisterIgnore("ConstructionGhost");
factory.Register<MindComponent>();
IoCManager.Register<ISharedNotifyManager, ServerNotifyManager>();
IoCManager.Register<IServerNotifyManager, ServerNotifyManager>();
IoCManager.BuildGraph();
IoCManager.Resolve<IServerNotifyManager>().Initialize();
}
/// <inheritdoc />

View File

@@ -0,0 +1,9 @@
using Content.Shared.Interfaces;
namespace Content.Server.Interfaces
{
public interface IServerNotifyManager : ISharedNotifyManager
{
void Initialize();
}
}

View File

@@ -0,0 +1,63 @@
using Content.Server.Interfaces;
using Content.Shared;
using Content.Shared.Interfaces;
using SS14.Server.Interfaces.Console;
using SS14.Server.Interfaces.GameObjects;
using SS14.Server.Interfaces.Player;
using SS14.Shared.GameObjects;
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.Interfaces.Network;
using SS14.Shared.IoC;
using SS14.Shared.Map;
using SS14.Shared.Utility;
namespace Content.Server
{
public class ServerNotifyManager : SharedNotifyManager, IServerNotifyManager
{
#pragma warning disable 649
[Dependency] private IServerNetManager _netManager;
#pragma warning restore 649
private bool _initialized;
public void Initialize()
{
DebugTools.Assert(!_initialized);
_netManager.RegisterNetMessage<MsgDoNotify>(nameof(MsgDoNotify));
_initialized = true;
}
public override void PopupMessage(GridLocalCoordinates coordinates, IEntity viewer, string message)
{
if (!viewer.TryGetComponent(out IActorComponent actor))
{
return;
}
var netMessage = _netManager.CreateNetMessage<MsgDoNotify>();
netMessage.Coordinates = coordinates;
netMessage.Message = message;
_netManager.ServerSendMessage(netMessage, actor.playerSession.ConnectedClient);
}
public class PopupMsgCommand : IClientCommand
{
public string Command => "srvpopupmsg";
public string Description => "";
public string Help => "";
public void Execute(IConsoleShell shell, IPlayerSession player, string[] args)
{
var entityMgr = IoCManager.Resolve<IEntityManager>();
var source = EntityUid.Parse(args[0]);
var viewer = EntityUid.Parse(args[1]);
var msg = args[2];
entityMgr.GetEntity(source).PopupMessage(entityMgr.GetEntity(viewer), msg);
}
}
}
}

View File

@@ -72,6 +72,7 @@
<Compile Include="GameObjects\ContentNetIDs.cs" />
<Compile Include="GameObjects\EntitySystemMessages\VerbSystemMessages.cs" />
<Compile Include="GameObjects\PhysicalConstants.cs" />
<Compile Include="Interfaces\ISharedNotifyManager.cs" />
<Compile Include="GameObjects\Verb.cs" />
<Compile Include="Physics\CollisionGroup.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
@@ -107,6 +108,7 @@
<ItemGroup>
<None Include="app.config" />
<Compile Include="Input\ContentKeyFunctions.cs" />
<Compile Include="SharedNotifyManager.cs" />
<Compile Include="Utility\ContentHelpers.cs" />
<Compile Include="GameObjects\Components\Power\SharedSmesComponent.cs" />
<Compile Include="GameObjects\Components\Power\SharedApcComponent.cs" />

View File

@@ -0,0 +1,20 @@
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.IoC;
using SS14.Shared.Map;
namespace Content.Shared.Interfaces
{
public interface ISharedNotifyManager
{
void PopupMessage(IEntity source, IEntity viewer, string message);
void PopupMessage(GridLocalCoordinates coordinates, IEntity viewer, string message);
}
public static class NotifyManagerExt
{
public static void PopupMessage(this IEntity source, IEntity viewer, string message)
{
IoCManager.Resolve<ISharedNotifyManager>().PopupMessage(source, viewer, message);
}
}
}

View File

@@ -0,0 +1,48 @@
using Content.Shared.Interfaces;
using Lidgren.Network;
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.Interfaces.Network;
using SS14.Shared.Map;
using SS14.Shared.Network;
using SS14.Shared.Network.Messages;
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.LocalPosition, viewer, message);
}
public abstract void PopupMessage(GridLocalCoordinates coordinates, IEntity viewer, string message);
protected class MsgDoNotify : NetMessage
{
#region REQUIRED
public const MsgGroups GROUP = MsgGroups.Command;
public const string NAME = nameof(MsgDoNotify);
public MsgDoNotify(INetChannel channel) : base(NAME, GROUP) { }
#endregion
public string Message { get; set; }
public GridLocalCoordinates 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);
}
}
}
}

2
engine

Submodule engine updated: 69c0d409c8...153b57ed56