Cache chat conversations in the lobby and in-game
This preserves the chat content from the lobby and makes it available in-game, and also makes all chat content available to the end-game dialog.
This commit is contained in:
@@ -256,7 +256,6 @@ namespace OpenRA
|
|||||||
{
|
{
|
||||||
// Clear static state if we have switched mods
|
// Clear static state if we have switched mods
|
||||||
LobbyInfoChanged = () => { };
|
LobbyInfoChanged = () => { };
|
||||||
AddChatLine = (a, b, c) => { };
|
|
||||||
ConnectionStateChanged = om => { };
|
ConnectionStateChanged = om => { };
|
||||||
BeforeGameStart = () => { };
|
BeforeGameStart = () => { };
|
||||||
Ui.ResetAll();
|
Ui.ResetAll();
|
||||||
@@ -652,7 +651,10 @@ namespace OpenRA
|
|||||||
state = RunStatus.Restart;
|
state = RunStatus.Restart;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Action<Color, string, string> AddChatLine = (c, n, s) => { };
|
public static void AddChatLine(Color color, string name, string text)
|
||||||
|
{
|
||||||
|
orderManager.AddChatLine(color, name, text);
|
||||||
|
}
|
||||||
|
|
||||||
public static void Debug(string s, params object[] args)
|
public static void Debug(string s, params object[] args)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using OpenRA.Primitives;
|
using OpenRA.Primitives;
|
||||||
|
|
||||||
@@ -44,6 +45,9 @@ namespace OpenRA.Network
|
|||||||
|
|
||||||
List<Order> localOrders = new List<Order>();
|
List<Order> localOrders = new List<Order>();
|
||||||
|
|
||||||
|
List<ChatLine> chatCache = new List<ChatLine>();
|
||||||
|
public readonly ReadOnlyList<ChatLine> ChatCache;
|
||||||
|
|
||||||
public void StartGame()
|
public void StartGame()
|
||||||
{
|
{
|
||||||
if (GameStarted) return;
|
if (GameStarted) return;
|
||||||
@@ -60,6 +64,8 @@ namespace OpenRA.Network
|
|||||||
Password = password;
|
Password = password;
|
||||||
Connection = conn;
|
Connection = conn;
|
||||||
syncReport = new SyncReport(this);
|
syncReport = new SyncReport(this);
|
||||||
|
ChatCache = new ReadOnlyList<ChatLine>(chatCache);
|
||||||
|
AddChatLine += CacheChatLine;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void IssueOrders(Order[] orders)
|
public void IssueOrders(Order[] orders)
|
||||||
@@ -73,6 +79,12 @@ namespace OpenRA.Network
|
|||||||
localOrders.Add(order);
|
localOrders.Add(order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Action<Color, string, string> AddChatLine = (c, n, s) => { };
|
||||||
|
void CacheChatLine(Color color, string name, string text)
|
||||||
|
{
|
||||||
|
chatCache.Add(new ChatLine(color, name, text));
|
||||||
|
}
|
||||||
|
|
||||||
public void TickImmediate()
|
public void TickImmediate()
|
||||||
{
|
{
|
||||||
var immediateOrders = localOrders.Where( o => o.IsImmediate ).ToList();
|
var immediateOrders = localOrders.Where( o => o.IsImmediate ).ToList();
|
||||||
@@ -203,4 +215,18 @@ namespace OpenRA.Network
|
|||||||
Connection.Dispose();
|
Connection.Dispose();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class ChatLine
|
||||||
|
{
|
||||||
|
public readonly Color Color;
|
||||||
|
public readonly string Name;
|
||||||
|
public readonly string Text;
|
||||||
|
|
||||||
|
public ChatLine(Color c, string n, string t)
|
||||||
|
{
|
||||||
|
Color = c;
|
||||||
|
Name = n;
|
||||||
|
Text = t;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,9 @@
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.Linq;
|
||||||
|
using OpenRA.Network;
|
||||||
using OpenRA.Traits;
|
using OpenRA.Traits;
|
||||||
using OpenRA.Widgets;
|
using OpenRA.Widgets;
|
||||||
|
|
||||||
@@ -19,13 +20,16 @@ namespace OpenRA.Mods.RA.Widgets
|
|||||||
class LeaveMapLogic
|
class LeaveMapLogic
|
||||||
{
|
{
|
||||||
enum Tab { Objectives, Chat };
|
enum Tab { Objectives, Chat };
|
||||||
|
|
||||||
Tab currentTab;
|
Tab currentTab;
|
||||||
|
|
||||||
|
OrderManager orderManager;
|
||||||
bool newChatMessage;
|
bool newChatMessage;
|
||||||
|
|
||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public LeaveMapLogic(Widget widget, World world)
|
public LeaveMapLogic(Widget widget, World world, OrderManager orderManager)
|
||||||
{
|
{
|
||||||
|
this.orderManager = orderManager;
|
||||||
|
|
||||||
widget.Get<LabelWidget>("VERSION_LABEL").Text = Game.modData.Manifest.Mod.Version;
|
widget.Get<LabelWidget>("VERSION_LABEL").Text = Game.modData.Manifest.Mod.Version;
|
||||||
|
|
||||||
var showStats = false;
|
var showStats = false;
|
||||||
@@ -70,7 +74,7 @@ namespace OpenRA.Mods.RA.Widgets
|
|||||||
chatButton.IsHighlighted = () => currentTab == Tab.Chat || (newChatMessage && Game.LocalTick % 50 < 25);
|
chatButton.IsHighlighted = () => currentTab == Tab.Chat || (newChatMessage && Game.LocalTick % 50 < 25);
|
||||||
|
|
||||||
Game.BeforeGameStart += UnregisterChatNotification;
|
Game.BeforeGameStart += UnregisterChatNotification;
|
||||||
Game.AddChatLine += NotifyNewChatMessage;
|
orderManager.AddChatLine += NotifyNewChatMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
var statsButton = dialog.Get<ButtonWidget>("STATS_BUTTON");
|
var statsButton = dialog.Get<ButtonWidget>("STATS_BUTTON");
|
||||||
@@ -130,7 +134,7 @@ namespace OpenRA.Mods.RA.Widgets
|
|||||||
|
|
||||||
void UnregisterChatNotification()
|
void UnregisterChatNotification()
|
||||||
{
|
{
|
||||||
Game.AddChatLine -= NotifyNewChatMessage;
|
orderManager.AddChatLine -= NotifyNewChatMessage;
|
||||||
Game.BeforeGameStart -= UnregisterChatNotification;
|
Game.BeforeGameStart -= UnregisterChatNotification;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
{
|
{
|
||||||
public class IngameChatLogic
|
public class IngameChatLogic
|
||||||
{
|
{
|
||||||
|
readonly OrderManager orderManager;
|
||||||
readonly Ruleset modRules;
|
readonly Ruleset modRules;
|
||||||
|
|
||||||
readonly ContainerWidget chatOverlay;
|
readonly ContainerWidget chatOverlay;
|
||||||
@@ -38,6 +39,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
[ObjectCreator.UseCtor]
|
[ObjectCreator.UseCtor]
|
||||||
public IngameChatLogic(Widget widget, OrderManager orderManager, World world, Ruleset modRules)
|
public IngameChatLogic(Widget widget, OrderManager orderManager, World world, Ruleset modRules)
|
||||||
{
|
{
|
||||||
|
this.orderManager = orderManager;
|
||||||
this.modRules = modRules;
|
this.modRules = modRules;
|
||||||
|
|
||||||
chatTraits = world.WorldActor.TraitsImplementing<INotifyChat>().ToList();
|
chatTraits = world.WorldActor.TraitsImplementing<INotifyChat>().ToList();
|
||||||
@@ -125,7 +127,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
chatScrollPanel.RemoveChildren();
|
chatScrollPanel.RemoveChildren();
|
||||||
chatScrollPanel.ScrollToBottom();
|
chatScrollPanel.ScrollToBottom();
|
||||||
|
|
||||||
Game.AddChatLine += AddChatLine;
|
foreach (var chatLine in orderManager.ChatCache)
|
||||||
|
AddChatLine(chatLine.Color, chatLine.Name, chatLine.Text, true);
|
||||||
|
|
||||||
|
orderManager.AddChatLine += AddChatLineWrapper;
|
||||||
Game.BeforeGameStart += UnregisterEvents;
|
Game.BeforeGameStart += UnregisterEvents;
|
||||||
|
|
||||||
CloseChat();
|
CloseChat();
|
||||||
@@ -133,7 +138,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
|
|
||||||
void UnregisterEvents()
|
void UnregisterEvents()
|
||||||
{
|
{
|
||||||
Game.AddChatLine -= AddChatLine;
|
orderManager.AddChatLine -= AddChatLineWrapper;
|
||||||
Game.BeforeGameStart -= UnregisterEvents;
|
Game.BeforeGameStart -= UnregisterEvents;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -156,9 +161,14 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
chatOverlay.Visible = true;
|
chatOverlay.Visible = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddChatLine(Color c, string from, string text)
|
public void AddChatLineWrapper(Color c, string from, string text)
|
||||||
{
|
{
|
||||||
if (!inDialog)
|
AddChatLine(c, from, text, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddChatLine(Color c, string from, string text, bool replayCache)
|
||||||
|
{
|
||||||
|
if (!(inDialog || replayCache))
|
||||||
chatOverlayDisplay.AddLine(c, from, text);
|
chatOverlayDisplay.AddLine(c, from, text);
|
||||||
|
|
||||||
var template = chatTemplate.Clone();
|
var template = chatTemplate.Clone();
|
||||||
@@ -193,7 +203,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
if (scrolledToBottom)
|
if (scrolledToBottom)
|
||||||
chatScrollPanel.ScrollToBottom(smooth: true);
|
chatScrollPanel.ScrollToBottom(smooth: true);
|
||||||
|
|
||||||
Sound.PlayNotification(modRules, null, "Sounds", "ChatLine", null);
|
if (!replayCache)
|
||||||
|
Sound.PlayNotification(modRules, null, "Sounds", "ChatLine", null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -84,10 +84,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
|
|
||||||
void CloseWindow()
|
void CloseWindow()
|
||||||
{
|
{
|
||||||
|
orderManager.AddChatLine -= AddChatLine;
|
||||||
Game.LobbyInfoChanged -= UpdateCurrentMap;
|
Game.LobbyInfoChanged -= UpdateCurrentMap;
|
||||||
Game.LobbyInfoChanged -= UpdatePlayerList;
|
Game.LobbyInfoChanged -= UpdatePlayerList;
|
||||||
Game.BeforeGameStart -= OnGameStart;
|
Game.BeforeGameStart -= OnGameStart;
|
||||||
Game.AddChatLine -= AddChatLine;
|
|
||||||
Game.ConnectionStateChanged -= ConnectionStateChanged;
|
Game.ConnectionStateChanged -= ConnectionStateChanged;
|
||||||
|
|
||||||
Ui.CloseWindow();
|
Ui.CloseWindow();
|
||||||
@@ -104,10 +104,10 @@ namespace OpenRA.Mods.RA.Widgets.Logic
|
|||||||
this.skirmishMode = skirmishMode;
|
this.skirmishMode = skirmishMode;
|
||||||
this.modRules = modRules;
|
this.modRules = modRules;
|
||||||
|
|
||||||
|
orderManager.AddChatLine += AddChatLine;
|
||||||
Game.LobbyInfoChanged += UpdateCurrentMap;
|
Game.LobbyInfoChanged += UpdateCurrentMap;
|
||||||
Game.LobbyInfoChanged += UpdatePlayerList;
|
Game.LobbyInfoChanged += UpdatePlayerList;
|
||||||
Game.BeforeGameStart += OnGameStart;
|
Game.BeforeGameStart += OnGameStart;
|
||||||
Game.AddChatLine += AddChatLine;
|
|
||||||
Game.ConnectionStateChanged += ConnectionStateChanged;
|
Game.ConnectionStateChanged += ConnectionStateChanged;
|
||||||
|
|
||||||
var name = lobby.GetOrNull<LabelWidget>("SERVER_NAME");
|
var name = lobby.GetOrNull<LabelWidget>("SERVER_NAME");
|
||||||
|
|||||||
Reference in New Issue
Block a user