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:
Oliver Brakmann
2014-09-25 21:28:16 +02:00
parent ef35ee2204
commit 36b5097fa0
5 changed files with 57 additions and 14 deletions

View File

@@ -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)
{ {

View File

@@ -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;
}
}
} }

View File

@@ -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;
} }
} }

View File

@@ -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);
} }
} }
} }

View File

@@ -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");