From 9004205c8038a7624763213c9b884f158f911720 Mon Sep 17 00:00:00 2001 From: Regalis Date: Mon, 15 Feb 2016 22:09:33 +0200 Subject: [PATCH] 0.3.2.2: clearing server log after saving, keeping log scroll state when adding lines, fixed /charactername tag --- Subsurface/Properties/AssemblyInfo.cs | 4 +-- Subsurface/Source/Networking/GameServer.cs | 11 +++--- Subsurface/Source/Networking/ServerLog.cs | 37 +++++++++++++++------ Subsurface/changelog.txt | 27 ++++++++++++--- Subsurface_Solution.v12.suo | Bin 850432 -> 918016 bytes 5 files changed, 58 insertions(+), 21 deletions(-) diff --git a/Subsurface/Properties/AssemblyInfo.cs b/Subsurface/Properties/AssemblyInfo.cs index d100587cb..13cd8707e 100644 --- a/Subsurface/Properties/AssemblyInfo.cs +++ b/Subsurface/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.3.1.5")] -[assembly: AssemblyFileVersion("0.3.1.5")] +[assembly: AssemblyVersion("0.3.2.2")] +[assembly: AssemblyFileVersion("0.3.2.2")] diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index b3be35082..f9b67df76 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -937,6 +937,8 @@ namespace Barotrauma.Networking if (autoRestart) AutoRestartTimer = 20.0f; + if (saveServerLogs) log.Save(); + return true; } @@ -1275,7 +1277,7 @@ namespace Barotrauma.Networking List recipients = new List(); Client targetClient = null; - if (words.Length > 2) + if (words.Length > 2 && words[1].FirstOrDefault()=='/' && type==ChatMessageType.Server) { if (words[1] == "/dead" || words[1] == "/d") { @@ -1284,12 +1286,13 @@ namespace Barotrauma.Networking else { targetClient = ConnectedClients.Find(c => - words[0] == "/" + c.name.ToLower() || - c.Character != null && words[0] == "/" + c.Character.Name.ToLower()); + words[1] == "/" + c.name.ToLower() || + c.Character != null && words[1] == "/" + c.Character.Name.ToLower()); if (targetClient==null) { - AddChatMessage("Player ''"+words[0].Replace("/", "")+"'' not found!", ChatMessageType.Admin); + AddChatMessage("Player ''"+words[1].Replace("/", "")+"'' not found!", ChatMessageType.Admin); + return; } } diff --git a/Subsurface/Source/Networking/ServerLog.cs b/Subsurface/Source/Networking/ServerLog.cs index ca76a8441..1ca3782ed 100644 --- a/Subsurface/Source/Networking/ServerLog.cs +++ b/Subsurface/Source/Networking/ServerLog.cs @@ -17,6 +17,8 @@ namespace Barotrauma.Networking public GUIFrame LogFrame; + private GUIListBox listBox; + private Queue lines; public ServerLog(string serverName) @@ -30,13 +32,19 @@ namespace Barotrauma.Networking { string logLine = "[" + DateTime.Now.ToLongTimeString() + "] " + line; - lines.Enqueue(new ColoredText(logLine, color == null ? Color.White : (Color)color)); + var newText = new ColoredText(logLine, color == null ? Color.White : (Color)color); - if (LogFrame != null) CreateLogFrame(); + lines.Enqueue(newText); - if (lines.Count>=LinesPerFile) + if (LogFrame != null) + { + AddLine(newText); + } + + if (lines.Count >= LinesPerFile) { Save(); + lines.Clear(); } } @@ -47,20 +55,16 @@ namespace Barotrauma.Networking GUIFrame innerFrame = new GUIFrame(new Rectangle(0,0,400, 400), null, Alignment.Center, GUI.Style, LogFrame); innerFrame.Padding = new Vector4(10.0f, 10.0f, 10.0f, 10.0f); - GUIListBox listBox = new GUIListBox(new Rectangle(0,0,0,355), GUI.Style, innerFrame); + listBox = new GUIListBox(new Rectangle(0,0,0,355), GUI.Style, innerFrame); var currLines = lines.ToList(); foreach (ColoredText line in currLines) { - var textBlock = new GUITextBlock(new Rectangle(0, 0, 0, 0), line.Text, GUI.Style, Alignment.TopLeft, Alignment.TopLeft, listBox, true, GUI.SmallFont); - //textBlock.Rect = new Rectangle(textBlock.Rect.X, textBlock.Rect.Y, textBlock.Rect.Width, (line.Text.Count(c => c == '\n') + 1) * 15); - - textBlock.TextColor = line.Color; - textBlock.CanBeFocused = false; + AddLine(line); } - listBox.BarScroll = 1.0f; + if (listBox.BarScroll==0.0f || listBox.BarScroll==1.0f) listBox.BarScroll = 1.0f; GUIButton closeButton = new GUIButton(new Rectangle(0,0,100, 15), "Close", Alignment.BottomRight, GUI.Style, innerFrame); closeButton.OnClicked = (GUIButton button, object userData) => @@ -70,6 +74,15 @@ namespace Barotrauma.Networking }; } + private void AddLine(ColoredText line) + { + var textBlock = new GUITextBlock(new Rectangle(0, 0, 0, 0), line.Text, GUI.Style, Alignment.TopLeft, Alignment.TopLeft, listBox, true, GUI.SmallFont); + //textBlock.Rect = new Rectangle(textBlock.Rect.X, textBlock.Rect.Y, textBlock.Rect.Width, (line.Text.Count(c => c == '\n') + 1) * 15); + + textBlock.TextColor = line.Color; + textBlock.CanBeFocused = false; + } + public void Save() { if (!Directory.Exists(SavePath)) @@ -88,6 +101,8 @@ namespace Barotrauma.Networking string fileName = serverName+"_"+DateTime.Now.ToShortDateString()+"_"+DateTime.Now.ToShortTimeString()+".txt"; fileName = fileName.Replace(":", ""); + fileName = fileName.Replace("../", ""); + fileName = fileName.Replace("/", ""); string filePath = Path.Combine(SavePath, fileName); @@ -99,6 +114,8 @@ namespace Barotrauma.Networking { DebugConsole.ThrowError("Saving the server log to " + filePath + " failed", e); } + + lines.Clear(); } } } diff --git a/Subsurface/changelog.txt b/Subsurface/changelog.txt index a1e7d3625..8059ac5f8 100644 --- a/Subsurface/changelog.txt +++ b/Subsurface/changelog.txt @@ -1,15 +1,32 @@ +--------------------------------------------------------------------------------------------------------- +v0.3.2.2 +--------------------------------------------------------------------------------------------------------- + +- clearing the server log after saving! +- saving the log after every round (even if it isn't full) + +--------------------------------------------------------------------------------------------------------- +v0.3.2.1 +--------------------------------------------------------------------------------------------------------- + +- fixed words missing from chat messages +- the server log UI doesn't scroll to the bottom when new lines appear, making it easier to read it during +a round + --------------------------------------------------------------------------------------------------------- v0.3.2.0 --------------------------------------------------------------------------------------------------------- -- server log -- more reliable door syncing -- deattaching items takes some time -- welders and cutters do damage to players/enemies again -- molochs can do damage to players +- server logs - server admins have the option to send messages only to dead players and spectators (/d [message]) or to one specific player (/name [message]) +- more reliable door syncing +- railgun syncing bugfixes +- longer view distance when outside +- deattaching items takes some time +- welders and cutters do damage to players/enemies again - a new enemy +- molochs can do damage to players --------------------------------------------------------------------------------------------------------- v0.3.1.5 diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 3773365a12693485b43217ec9423f884af8b32ec..a02f5188f0fe44f614265908bff358aa8ee5eb4f 100644 GIT binary patch delta 12661 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 delta 11713 zcmd6N3s{uZ*8lAHGQ5}l;)nwxB90>>A>xRnWP~G-sVO2}vLZzgPZ}cOXr_dt`L{kZ zL&j#AnTI?ynO9O{n^}%z9#8ctddx0=kC7)ke%5EyQBQfnZ|xaGEbDmA*Ykh=@ALd- z?|0wU-fOMB*4q0W_u^Fdxqg*t!=4jNrcNf4srl;FtC*Mw;v<9^F%@6VAT}a=*zWg; zYQ)QkR}f1PMTj+sA@JQ`dC=?CX{1UhmYbmFA;t5k@Fa=feqPWCIp85uhu#_vdIbqh z#{n_9+8^H~L=0jqq7=apBN64E!P1@5C2Z+&OOa9t7J1f4mj$QbSuMwrFFbqY?!@Cc zB|jxQ&#b$FT9u;QaR57VQhZ%)A3lYDMz(u2?>P=zu0rt1zKSdCj``Nb)e6BPeTCJYP3^M+ zl*Zyq4;1U;o-5%)RMTy^f?f#Nn<<2Q8e=*L^HtBBh>;@cV}eorq#hoJpbGO;&xMGC zfjOnLZESu7M|vq5F8(O^eyg4J-Ba^o^!9XXJ%J?)1j~x*$oOZFLCX-&az^o$ z;#1isA1pxzw2X8V=fMX4$x^M5NHJt!R%7|Qp%6xsp&AE@^2DQVw`%oZs$67NM~+iuHf)WQ9b z5bKHiYZOb@$WkJ8ZYyN{N7ZCf0;8DV3thVdYWvWL?b$io{!sUWlt+Ss&;LP zEOrYyKCI3z+XZI7NKSOA+aMBwktpG6r<)HwL?|bo2L=uaQ0U%?Ye6oKeHO7FaS!4t z1X9js!7a9G)YzMlXU(?@qMZ@Dc$IK%VfF`v6J3211i@D>SbZN70hz(UlwW>uIO)&T| za}RG{vzhh!MEIy1xJ#s17CVJ>C7#UH$uPT!WQ%0D*lNbKnP~Q(#o^GsG+z>g#5zg- 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