Popup message notifications. (#125)
* Popup message system v1 * Networking for the popup notifications. Ship it.
This commit is contained in:
committed by
GitHub
parent
b0f212bad5
commit
f91488fa27
127
Content.Client/ClientNotifyManager.cs
Normal file
127
Content.Client/ClientNotifyManager.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace Content.Client.GameObjects.EntitySystems
|
||||
{
|
||||
public class ClientNotifySystem
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
14
Content.Client/Interfaces/IClientNotifyManager.cs
Normal file
14
Content.Client/Interfaces/IClientNotifyManager.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
@@ -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">
|
||||
|
||||
@@ -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 />
|
||||
|
||||
9
Content.Server/Interfaces/IServerNotifyManager.cs
Normal file
9
Content.Server/Interfaces/IServerNotifyManager.cs
Normal file
@@ -0,0 +1,9 @@
|
||||
using Content.Shared.Interfaces;
|
||||
|
||||
namespace Content.Server.Interfaces
|
||||
{
|
||||
public interface IServerNotifyManager : ISharedNotifyManager
|
||||
{
|
||||
void Initialize();
|
||||
}
|
||||
}
|
||||
63
Content.Server/ServerNotifyManager.cs
Normal file
63
Content.Server/ServerNotifyManager.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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" />
|
||||
|
||||
20
Content.Shared/Interfaces/ISharedNotifyManager.cs
Normal file
20
Content.Shared/Interfaces/ISharedNotifyManager.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
48
Content.Shared/SharedNotifyManager.cs
Normal file
48
Content.Shared/SharedNotifyManager.cs
Normal 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
2
engine
Submodule engine updated: 69c0d409c8...153b57ed56
Reference in New Issue
Block a user