From 00c1edad09915dd394320d14f88c97ac67958dd5 Mon Sep 17 00:00:00 2001 From: Regalis Date: Sun, 28 Feb 2016 14:33:03 +0200 Subject: [PATCH] - Changes in UpdateNetPlayerPosition - Holdable items don't try to change the pose if hand anim is disabled (e.g. when dragging someone or using a railgun controller) - Indicator which shows the position of the sub when spectating - Bugfix in controller selection logic - Saving attributes on separate lines in serversettings.xml - Safer validation of received sub files --- Subsurface/Barotrauma.csproj | 6 +- Subsurface/Barotrauma.csproj.user | 2 +- .../Content/Characters/Mantis/mantis.xml | 2 +- Subsurface/Content/Orders.xml | 12 +- Subsurface/Content/UI/orderSymbols.png | Bin 9077 -> 0 bytes Subsurface/Content/UI/uiIcons.png | Bin 0 -> 14222 bytes .../Animation/HumanoidAnimController.cs | 3 +- .../Source/Characters/Animation/Ragdoll.cs | 26 ++-- Subsurface/Source/Characters/Character.cs | 2 +- Subsurface/Source/GUI/GUI.cs | 18 +++ .../Items/Components/Holdable/Holdable.cs | 2 +- .../Items/Components/Machines/Controller.cs | 5 +- .../Source/Networking/FileStreamReceiver.cs | 18 ++- Subsurface/Source/Networking/GameServer.cs | 15 +- .../Source/Networking/GameServerSettings.cs | 136 +++++++++++------- Subsurface/Source/Screens/GameScreen.cs | 24 +++- Subsurface/Source/Screens/NetLobbyScreen.cs | 3 - Subsurface_Solution.v12.suo | Bin 879616 -> 875008 bytes 18 files changed, 181 insertions(+), 93 deletions(-) delete mode 100644 Subsurface/Content/UI/orderSymbols.png create mode 100644 Subsurface/Content/UI/uiIcons.png diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index f8a142aa3..5025b8910 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -692,9 +692,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -873,6 +870,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Subsurface/Barotrauma.csproj.user b/Subsurface/Barotrauma.csproj.user index df35fcf91..1782abafa 100644 --- a/Subsurface/Barotrauma.csproj.user +++ b/Subsurface/Barotrauma.csproj.user @@ -9,7 +9,7 @@ en-US false - ProjectFiles + ShowAllFiles diff --git a/Subsurface/Content/Characters/Mantis/mantis.xml b/Subsurface/Content/Characters/Mantis/mantis.xml index e8657ac5b..f7dbf3fb7 100644 --- a/Subsurface/Content/Characters/Mantis/mantis.xml +++ b/Subsurface/Content/Characters/Mantis/mantis.xml @@ -1,5 +1,5 @@  - + diff --git a/Subsurface/Content/Orders.xml b/Subsurface/Content/Orders.xml index 6f7450632..225e02a97 100644 --- a/Subsurface/Content/Orders.xml +++ b/Subsurface/Content/Orders.xml @@ -1,27 +1,27 @@  - + - + - + - + - + - + \ No newline at end of file diff --git a/Subsurface/Content/UI/orderSymbols.png b/Subsurface/Content/UI/orderSymbols.png deleted file mode 100644 index 60b8a7267778d1da87c9424f98301ab3af9ee4e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9077 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 I-|gvt0gc7Dj{pDw diff --git a/Subsurface/Content/UI/uiIcons.png b/Subsurface/Content/UI/uiIcons.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e87c5c7a4ea47bfb83b52d409749c84bff69c7 GIT binary patch literal 14222 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 0.01f) { correctionMovement = - Vector2.Lerp(targetMovement, Vector2.Normalize(diff) * MathHelper.Clamp(dist * 8.0f, 0.1f, 8.0f), 0.5f); + Vector2.Lerp(targetMovement, Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.1f, 5.0f), 0.2f); } else { - foreach (Limb limb in Limbs) - { - //if (limb.body.TargetPosition == Vector2.Zero) continue; + refLimb.body.LinearVelocity = Vector2.Lerp( + refLimb.LinearVelocity, + Vector2.Normalize(diff) * MathHelper.Clamp(dist, 0.0f, 5.0f), + 0.2f); - limb.body.SetTransform(limb.SimPosition + Vector2.Normalize(diff) * 0.1f, limb.Rotation); - } + //foreach (Limb limb in Limbs) + //{ + // //if (limb.body.TargetPosition == Vector2.Zero) continue; + // // Vector2.Lerp(limb.LinearVelocity, Vector2.Normalize(diff) * MathHelper.Clamp(dist, 0.0f, 1.0f)) + // limb.body.LinearVelocity = Vector2.Lerp( + // limb.LinearVelocity, + // Vector2.Normalize(diff) * MathHelper.Clamp(dist, 0.0f, 5.0f), + // 0.2f); + + // //limb.body.TargetVelocity .SetTransform(limb.SimPosition + Vector2.Normalize(diff) * 0.1f, limb.Rotation); + //} } } else { //clamp the magnitude of the correction movement between 0.5f - 5.0f - Vector2 newCorrectionMovement = Vector2.Normalize(diff) * MathHelper.Clamp(dist * 5.0f, 0.5f, 5.0f); + Vector2 newCorrectionMovement = Vector2.Normalize(diff) * MathHelper.Clamp(dist*2.0f, 0.5f, 5.0f); //heading in the right direction -> use the ''normal'' movement if it's faster than correctionMovement //i.e. the character is close to the targetposition but the character is still running diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 9db3d668a..d43e7c342 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -965,7 +965,7 @@ namespace Barotrauma key.DequeueHeld(); } - networkUpdateSent = true; + networkUpdateSent = false; } if (needsAir) diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index b5e750d23..63570b380 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -43,6 +43,18 @@ namespace Barotrauma public static Color ScreenOverlayColor; + private static Sprite submarineIcon, arrow; + + public static Sprite SubmarineIcon + { + get { return submarineIcon; } + } + + public static Sprite Arrow + { + get { return arrow; } + } + public static void Init(ContentManager content) { GUI.Font = ToolBox.TryLoadFont("SpriteFont1", content); @@ -72,6 +84,12 @@ namespace Barotrauma t = new Texture2D(graphicsDevice, 1, 1); t.SetData(new Color[] { Color.White });// fill the texture with white + submarineIcon = new Sprite("Content/UI/uiIcons.png", new Rectangle(0, 192, 64, 64), null); + submarineIcon.Origin = submarineIcon.size / 2; + + arrow = new Sprite("Content/UI/uiIcons.png", new Rectangle(80, 240, 16, 16), null); + arrow.Origin = arrow.size / 2; + Style = new GUIStyle("Content/UI/style.xml"); } diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index c640e3f69..cef636e57 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -252,7 +252,7 @@ namespace Barotrauma.Items.Components item.Submarine = picker.Submarine; - if (picker.SelectedConstruction != null && picker.SelectedConstruction.GetComponent() != null) return; + //if (picker.SelectedConstruction != null && picker.SelectedConstruction.GetComponent() != null) return; //item.sprite.Depth = picker.AnimController.GetLimb(LimbType.RightHand).sprite.Depth + 0.01f; diff --git a/Subsurface/Source/Items/Components/Machines/Controller.cs b/Subsurface/Source/Items/Components/Machines/Controller.cs index c9d9a6442..dc8f4afb9 100644 --- a/Subsurface/Source/Items/Components/Machines/Controller.cs +++ b/Subsurface/Source/Items/Components/Machines/Controller.cs @@ -210,6 +210,8 @@ namespace Barotrauma.Items.Components limb.pullJoint.Enabled = false; } + if (character.SelectedConstruction == this.item) character.SelectedConstruction = null; + character.AnimController.Anim = AnimController.Animation.None; } @@ -225,9 +227,6 @@ namespace Barotrauma.Items.Components IsActive = false; CancelUsing(character); character = null; - } - else - { return false; } } diff --git a/Subsurface/Source/Networking/FileStreamReceiver.cs b/Subsurface/Source/Networking/FileStreamReceiver.cs index 2fc14244b..52dedefc2 100644 --- a/Subsurface/Source/Networking/FileStreamReceiver.cs +++ b/Subsurface/Source/Networking/FileStreamReceiver.cs @@ -2,6 +2,7 @@ using System; using System.IO; using System.Text.RegularExpressions; +using System.Xml; using System.Xml.Linq; namespace Barotrauma.Networking @@ -259,15 +260,26 @@ namespace Barotrauma.Networking try { - stream.Position = 0; - var doc = XDocument.Load(stream); + stream.Position = 0; + + XmlReaderSettings settings = new XmlReaderSettings(); + settings.DtdProcessing = DtdProcessing.Prohibit; + settings.IgnoreProcessingInstructions = true; + + using (var reader = XmlReader.Create(stream, settings)) + { + while (reader.Read()) + { + + } + } } catch { stream.Close(); stream.Dispose(); - ErrorMessage = "Failed to parse submarine file ''"+file+"''!"; + ErrorMessage = "Parsing file ''"+file+"'' failed! The file may not be a valid submarine file."; return false; } diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index f6e6b2826..3b34a030f 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -846,6 +846,14 @@ namespace Barotrauma.Networking return false; } + + if (ConnectedClients.Any(c => c.FileStreamSender != null && c.FileStreamSender.FilePath == selectedSub.FilePath)) + { + new GUIMessageBox("Couldn't start a round", + "Can't start a round while sending the selected submarine to clients. Cancel the transfers or wait for them to finish before starting.", 400, 400); + return false; + } + GameMain.ShowLoading(StartGame(selectedSub, selectedMode), false); return true; @@ -855,13 +863,6 @@ namespace Barotrauma.Networking { GUIMessageBox.CloseAll(); - if (ConnectedClients.Any(c => c.FileStreamSender != null && c.FileStreamSender.FilePath == selectedSub.FilePath)) - { - new GUIMessageBox("Couldn't start a round", - "Can't start a round while sending the selected submarine to clients. Cancel the transfers or wait for them to finish before starting.", 400, 400); - yield return CoroutineStatus.Success; - } - AssignJobs(); roundStartSeed = DateTime.Now.Millisecond; diff --git a/Subsurface/Source/Networking/GameServerSettings.cs b/Subsurface/Source/Networking/GameServerSettings.cs index 778717b80..efa8d83c8 100644 --- a/Subsurface/Source/Networking/GameServerSettings.cs +++ b/Subsurface/Source/Networking/GameServerSettings.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Xml; using System.Xml.Linq; namespace Barotrauma.Networking @@ -96,29 +97,25 @@ namespace Barotrauma.Networking private void SaveSettings() { - XDocument doc = new XDocument(new XElement("serversettings")); - - doc.Root.Add - ( - new XAttribute("AllowSpectating", allowSpectating), - new XAttribute("RandomizeSeed", randomizeSeed), - new XAttribute("EndRoundAtLevelEnd", endRoundAtLevelEnd), - new XAttribute("AllowFileTransfers", allowFileTransfers), + XmlWriterSettings settings = new XmlWriterSettings(); + settings.Indent = true; + settings.NewLineOnAttributes = true; - new XAttribute("SaveServerLogs", saveServerLogs), - new XAttribute("LinesPerLogFile", log.LinesPerFile), - - new XAttribute("SubSelection", subSelectionMode), - new XAttribute("ModeSelection", modeSelectionMode) - ); - - try + using (var writer = XmlWriter.Create(SettingsFile, settings)) { - doc.Save(SettingsFile); - } - catch (Exception e) - { - DebugConsole.ThrowError("Saving server settings failed", e); + writer.WriteStartElement("serversettings"); + writer.WriteAttributeString("AllowSpectating", allowSpectating.ToString()); + writer.WriteAttributeString("RandomizeSeed", randomizeSeed.ToString()); + + writer.WriteAttributeString("EndRoundAtLevelEnd", endRoundAtLevelEnd.ToString()); + writer.WriteAttributeString("AllowFileTransfers", allowFileTransfers.ToString()); + writer.WriteAttributeString("MaxFileTransferDuration", ((int)FileStreamSender.MaxTransferDuration.TotalSeconds).ToString()); + writer.WriteAttributeString("SaveServerLogs", saveServerLogs.ToString()); + writer.WriteAttributeString("LinesPerLogFile", log.LinesPerFile.ToString()); + writer.WriteAttributeString("SubSelection", subSelectionMode.ToString()); + writer.WriteAttributeString("ModeSelection", modeSelectionMode.ToString()); + + writer.Flush(); } } @@ -152,17 +149,58 @@ namespace Barotrauma.Networking modeSelectionMode = SelectionMode.Manual; Enum.TryParse(ToolBox.GetAttributeString(doc.Root, "ModeSelection", "Manual"), out modeSelectionMode); + + FileStreamSender.MaxTransferDuration = new TimeSpan(0,0,ToolBox.GetAttributeInt(doc.Root, "MaxFileTransferDuration", 150)); } private void CreateSettingsFrame() { settingsFrame = new GUIFrame(new Rectangle(0, 0, GameMain.GraphicsWidth, GameMain.GraphicsHeight), Color.Black * 0.5f); + GUIFrame innerFrame = new GUIFrame(new Rectangle(0, 0, 400, 400), null, Alignment.Center, GUI.Style, settingsFrame); + innerFrame.Padding = new Vector4(20.0f, 20.0f, 20.0f, 20.0f); - new GUITextBlock(new Rectangle(0, -15, 0, 20), "Server settings", GUI.Style, innerFrame, GUI.LargeFont); + new GUITextBlock(new Rectangle(0, -5, 0, 20), "Server settings", GUI.Style, innerFrame, GUI.LargeFont); - var randomizeLevelBox = new GUITickBox(new Rectangle(0, 30, 20, 20), "Randomize level seed between rounds", Alignment.Left, innerFrame); + int y = 40; + + var endBox = new GUITickBox(new Rectangle(0, y, 20, 20), "End round when destination reached", Alignment.Left, innerFrame); + endBox.Selected = endRoundAtLevelEnd; + endBox.OnSelected = (GUITickBox) => { endRoundAtLevelEnd = GUITickBox.Selected; return true; }; + + + y += 30; + var endVoteBox = new GUITickBox(new Rectangle(0, y, 20, 20), "End round by voting", Alignment.Left, innerFrame); + endVoteBox.Selected = Voting.AllowEndVoting; + endVoteBox.OnSelected = (GUITickBox) => + { + Voting.AllowEndVoting = !Voting.AllowEndVoting; + GameMain.Server.UpdateVoteStatus(); + return true; + }; + + var votesRequiredText = new GUITextBlock(new Rectangle(20, y+20, 20, 20), "Votes required: 50 %", GUI.Style, innerFrame, GUI.SmallFont); + + var votesRequiredSlider = new GUIScrollBar(new Rectangle(150, y+22, 100, 10), GUI.Style, 0.1f, innerFrame); + votesRequiredSlider.UserData = votesRequiredText; + votesRequiredSlider.BarScroll = (EndVoteRequiredRatio - 0.5f) * 2.0f; + votesRequiredSlider.OnMoved = (GUIScrollBar scrollBar, float barScroll) => + { + GUITextBlock voteText = scrollBar.UserData as GUITextBlock; + + scrollBar.BarScroll = MathUtils.Round(barScroll, 0.2f); + EndVoteRequiredRatio = barScroll / 2.0f + 0.5f; + voteText.Text = "Votes required: " + (int)MathUtils.Round(EndVoteRequiredRatio * 100.0f, 10.0f) + " %"; + return true; + }; + votesRequiredSlider.OnMoved(votesRequiredSlider, votesRequiredSlider.BarScroll); + + y += 40; + + + + var randomizeLevelBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Randomize level seed between rounds", Alignment.Left, innerFrame); randomizeLevelBox.Selected = randomizeSeed; randomizeLevelBox.OnSelected = (GUITickBox) => { @@ -170,37 +208,23 @@ namespace Barotrauma.Networking return true; }; - var endBox = new GUITickBox(new Rectangle(0, 60, 20, 20), "End round when destination reached", Alignment.Left, innerFrame); - endBox.Selected = endRoundAtLevelEnd; - endBox.OnSelected = (GUITickBox) => { endRoundAtLevelEnd = GUITickBox.Selected; return true; }; - var endVoteBox = new GUITickBox(new Rectangle(0, 90, 20, 20), "End round by voting", Alignment.Left, innerFrame); - endVoteBox.Selected = Voting.AllowEndVoting; - endVoteBox.OnSelected = (GUITickBox) => + y += 40; + + var shareSubsBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Share submarine files with players", Alignment.Left, innerFrame); + shareSubsBox.Selected = allowFileTransfers; + shareSubsBox.OnSelected = (GUITickBox) => { - Voting.AllowEndVoting = !Voting.AllowEndVoting; - GameMain.Server.UpdateVoteStatus(); - return true; - }; - - var votesRequiredText = new GUITextBlock(new Rectangle(20, 110, 20, 20), "Votes required: 50 %", GUI.Style, innerFrame, GUI.SmallFont); - - var votesRequiredSlider = new GUIScrollBar(new Rectangle(150,115, 100, 10), GUI.Style, 0.1f, innerFrame); - votesRequiredSlider.UserData = votesRequiredText; - votesRequiredSlider.BarScroll = (EndVoteRequiredRatio - 0.5f) * 2.0f; - votesRequiredSlider.OnMoved = (GUIScrollBar scrollBar, float barScroll) => - { - GUITextBlock voteText = scrollBar.UserData as GUITextBlock; - - scrollBar.BarScroll = MathUtils.Round(barScroll, 0.2f); - EndVoteRequiredRatio = barScroll/2.0f + 0.5f; - voteText.Text = "Votes required: " + (int)MathUtils.Round(EndVoteRequiredRatio * 100.0f, 10.0f) + " %"; + allowFileTransfers = GUITickBox.Selected; return true; }; - votesRequiredSlider.OnMoved(votesRequiredSlider, votesRequiredSlider.BarScroll); - new GUITextBlock(new Rectangle(0, 95+50, 100, 20), "Submarine selection:", GUI.Style, innerFrame); - var selectionFrame = new GUIFrame(new Rectangle(0, 120 + 50, 300, 20), null, innerFrame); + + y += 40; + + + new GUITextBlock(new Rectangle(0, y, 100, 20), "Submarine selection:", GUI.Style, innerFrame); + var selectionFrame = new GUIFrame(new Rectangle(0, y+20, 300, 20), null, innerFrame); for (int i = 0; i<3; i++) { var selectionTick = new GUITickBox(new Rectangle(i * 100, 0, 20, 20), ((SelectionMode)i).ToString(), Alignment.Left, selectionFrame); @@ -209,8 +233,10 @@ namespace Barotrauma.Networking selectionTick.UserData = (SelectionMode)i; } - new GUITextBlock(new Rectangle(0, 145 + 50, 100, 20), "Mode selection:", GUI.Style, innerFrame); - selectionFrame = new GUIFrame(new Rectangle(0, 170 + 50, 300, 20), null, innerFrame); + y += 45; + + new GUITextBlock(new Rectangle(0, y, 100, 20), "Mode selection:", GUI.Style, innerFrame); + selectionFrame = new GUIFrame(new Rectangle(0, y+20, 300, 20), null, innerFrame); for (int i = 0; i<3; i++) { var selectionTick = new GUITickBox(new Rectangle(i*100, 0, 20, 20), ((SelectionMode)i).ToString(), Alignment.Left, selectionFrame); @@ -219,7 +245,9 @@ namespace Barotrauma.Networking selectionTick.UserData = (SelectionMode)i; } - var allowSpecBox = new GUITickBox(new Rectangle(0, 210 + 50, 20, 20), "Allow spectating", Alignment.Left, innerFrame); + y += 60; + + var allowSpecBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Allow spectating", Alignment.Left, innerFrame); allowSpecBox.Selected = allowSpectating; allowSpecBox.OnSelected = (GUITickBox) => { @@ -227,7 +255,9 @@ namespace Barotrauma.Networking return true; }; - var saveLogsBox = new GUITickBox(new Rectangle(0, 240 + 50, 20, 20), "Save server logs", Alignment.Left, innerFrame); + y += 30; + + var saveLogsBox = new GUITickBox(new Rectangle(0, y, 20, 20), "Save server logs", Alignment.Left, innerFrame); saveLogsBox.Selected = saveServerLogs; saveLogsBox.OnSelected = (GUITickBox) => { diff --git a/Subsurface/Source/Screens/GameScreen.cs b/Subsurface/Source/Screens/GameScreen.cs index 1f3b4da72..478f2971f 100644 --- a/Subsurface/Source/Screens/GameScreen.cs +++ b/Subsurface/Source/Screens/GameScreen.cs @@ -177,7 +177,7 @@ namespace Barotrauma //{ // cam.TargetPos = Character.Controlled.WorldPosition; //} - + cam.UpdateTransform(); DrawMap(graphics, spriteBatch); @@ -200,6 +200,8 @@ namespace Barotrauma if (GameMain.GameSession != null) GameMain.GameSession.Draw(spriteBatch); + if (Character.Controlled == null && Submarine.Loaded != null) DrawSubmarineIndicator(spriteBatch, Submarine.Loaded); + GUI.Draw((float)deltaTime, spriteBatch, cam); if (!PlayerInput.LeftButtonHeld()) Inventory.draggingItem = null; @@ -348,5 +350,25 @@ namespace Barotrauma GameMain.LightManager.DrawLOS(graphics, spriteBatch, cam); } + + private void DrawSubmarineIndicator(SpriteBatch spriteBatch, Submarine submarine) + { + Vector2 subDiff = submarine.WorldPosition - cam.Position; + + if (Math.Abs(subDiff.X) > cam.WorldView.Width || Math.Abs(subDiff.Y) > cam.WorldView.Height) + { + Vector2 normalizedSubDiff = Vector2.Normalize(subDiff); + + Vector2 iconPos = + cam.WorldToScreen(cam.Position) + + new Vector2(normalizedSubDiff.X * GameMain.GraphicsWidth * 0.4f, -normalizedSubDiff.Y * GameMain.GraphicsHeight * 0.4f); + + GUI.SubmarineIcon.Draw(spriteBatch, iconPos, Color.LightBlue * 0.5f); + + Vector2 arrowOffset = normalizedSubDiff * GUI.SubmarineIcon.size.X * 0.7f; + arrowOffset.Y = -arrowOffset.Y; + GUI.Arrow.Draw(spriteBatch, iconPos + arrowOffset, Color.LightBlue * 0.5f, MathUtils.VectorToAngle(arrowOffset) + MathHelper.PiOver2); + } + } } } diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index bf26560a3..e5ba845ef 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -440,8 +440,6 @@ namespace Barotrauma UpdateJobPreferences(jobList); - //UpdatePreviewPlayer(Game1.Client.CharacterInfo); - UpdatePreviewPlayer(characterInfo); } } @@ -510,7 +508,6 @@ namespace Barotrauma { valueChanged = true; - var hash = (obj as Submarine).MD5Hash; //hash will be null if opening the sub file failed -> don't select the sub diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index a1f5ff7d2574466c7873de09de20fec9b4beca0e..9461ffab388f6ac3c0c30809b8a7ad858e0cbc2c 100644 GIT binary patch delta 8786 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 B0ssI2 delta 11064 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 X%`x