From addd9dea5ce746b8583f1dc7be42400af67f846e Mon Sep 17 00:00:00 2001 From: Regalis Date: Sat, 9 Jan 2016 17:02:51 +0200 Subject: [PATCH] Fixed PlayUISound crashing the launcher, generatic ladder waypoints, AICharacter sync bugfix, chatbox resizing according to resolution --- Subsurface/Source/GUI/GUI.cs | 7 ++- Subsurface/Source/GUI/GUITickBox.cs | 5 +- Subsurface/Source/Map/Submarine.cs | 2 +- Subsurface/Source/Map/SubmarineBody.cs | 45 ++++++++++++++++-- Subsurface/Source/Map/WayPoint.cs | 27 ++++++++++- Subsurface/Source/Networking/GameClient.cs | 5 +- Subsurface/Source/Networking/GameServer.cs | 2 +- Subsurface/Source/Networking/NetworkMember.cs | 5 +- Subsurface/Source/Screens/NetLobbyScreen.cs | 24 +++++----- Subsurface_Solution.v12.suo | Bin 846848 -> 839168 bytes 10 files changed, 92 insertions(+), 30 deletions(-) diff --git a/Subsurface/Source/GUI/GUI.cs b/Subsurface/Source/GUI/GUI.cs index 9d9b66a5b..15408c4cc 100644 --- a/Subsurface/Source/GUI/GUI.cs +++ b/Subsurface/Source/GUI/GUI.cs @@ -404,7 +404,12 @@ namespace Barotrauma public static void PlayUISound(GUISoundType soundType) { - sounds[(int)soundType].Play(); + if (sounds == null) return; + + int soundIndex = (int)soundType; + if (soundIndex < 0 || soundIndex >= sounds.Length) return; + + sounds[soundIndex].Play(); } private static void DrawMessages(SpriteBatch spriteBatch, float deltaTime) diff --git a/Subsurface/Source/GUI/GUITickBox.cs b/Subsurface/Source/GUI/GUITickBox.cs index c402d0852..3c4953291 100644 --- a/Subsurface/Source/GUI/GUITickBox.cs +++ b/Subsurface/Source/GUI/GUITickBox.cs @@ -40,9 +40,8 @@ namespace Barotrauma box = new GUIFrame(rect, Color.DarkGray, null, this); box.HoverColor = Color.Gray; box.SelectedColor = Color.DarkGray; - - - text = new GUITextBlock(new Rectangle(rect.X + 40, rect.Y, 200, rect.Height), label, Color.Transparent, Color.White, Alignment.TopLeft, null, this); + + text = new GUITextBlock(new Rectangle(rect.X + 30, rect.Y+2, 200, rect.Height), label, Color.Transparent, Color.White, Alignment.TopLeft, null, this); this.rect = new Rectangle(box.Rect.X, box.Rect.Y, 240, rect.Height); diff --git a/Subsurface/Source/Map/Submarine.cs b/Subsurface/Source/Map/Submarine.cs index 97c4bdddb..b131c78da 100644 --- a/Subsurface/Source/Map/Submarine.cs +++ b/Subsurface/Source/Map/Submarine.cs @@ -109,7 +109,7 @@ namespace Barotrauma { get { - return ConvertUnits.ToDisplayUnits(subBody.Position); + return subBody.Position; } } diff --git a/Subsurface/Source/Map/SubmarineBody.cs b/Subsurface/Source/Map/SubmarineBody.cs index a1d344acb..359f66a06 100644 --- a/Subsurface/Source/Map/SubmarineBody.cs +++ b/Subsurface/Source/Map/SubmarineBody.cs @@ -352,13 +352,48 @@ namespace Barotrauma FixedArray2 points; contact.GetWorldManifold(out normal2, out points); - var pickedBody = Submarine.PickBody( - points[0] - limb.LinearVelocity * ((float)Physics.step) - ConvertUnits.ToSimUnits(submarine.Position) - submarine.Velocity * ((float)Physics.step), - points[0] - ConvertUnits.ToSimUnits(submarine.Position), null, Physics.CollisionWall); + Vector2 targetPos = ConvertUnits.ToDisplayUnits(points[0] + limb.LinearVelocity * ((float)Physics.step)); - if (pickedBody != null) + Hull newHull = Hull.FindHull(targetPos, null); + + if (newHull == null) return true; + + var gaps = newHull.FindGaps(); + + bool gapFound = false; + foreach (Gap gap in gaps) { - + if (gap.isHorizontal) + { + if (targetPos.Y < gap.WorldRect.Y && targetPos.Y > gap.WorldRect.Y - gap.WorldRect.Height) + { + gapFound = true; + break; + } + } + else + { + if (targetPos.X > gap.WorldRect.X && targetPos.X < gap.WorldRect.Right) + { + gapFound = true; + break; + } + } + + //if (Submarine.RectContains(gap.WorldRect, targetPos)) + //{ + // gapFound = true; + // break; + //} + } + + //var pickedBody = Submarine.PickBody( + // points[0] - limb.LinearVelocity * ((float)Physics.step) - ConvertUnits.ToSimUnits(submarine.Position) - submarine.Velocity * ((float)Physics.step), + // points[0] - ConvertUnits.ToSimUnits(submarine.Position), null, Physics.CollisionWall); + + if (!gapFound) + { + return true; } diff --git a/Subsurface/Source/Map/WayPoint.cs b/Subsurface/Source/Map/WayPoint.cs index d7c74bf06..afeeff74e 100644 --- a/Subsurface/Source/Map/WayPoint.cs +++ b/Subsurface/Source/Map/WayPoint.cs @@ -297,6 +297,7 @@ namespace Barotrauma wayPoint = new WayPoint( new Vector2(borders.X + borders.Width * i, y) + Submarine.HiddenSubPosition, SpawnType.Path, Submarine.Loaded); + if (y == borders.Y - borders.Height) { wayPoint.ConnectTo(cornerWaypoint[1, i]); @@ -304,9 +305,7 @@ namespace Barotrauma else { wayPoint.ConnectTo(WayPoint.WayPointList[WayPointList.Count - 2]); - } - } wayPoint.ConnectTo(cornerWaypoint[0, i]); @@ -345,6 +344,30 @@ namespace Barotrauma stairPoints[0].ConnectTo(stairPoints[1]); } + + foreach (Item item in Item.ItemList) + { + var ladders = item.GetComponent(); + if (ladders == null) continue; + + WayPoint[] ladderPoints = new WayPoint[2]; + + ladderPoints[0] = new WayPoint(new Vector2(item.Rect.Center.X, item.Rect.Y - item.Rect.Height + heightFromFloor), SpawnType.Path, Submarine.Loaded); + + ladderPoints[1] = new WayPoint(new Vector2(item.Rect.Center.X, item.Rect.Y - heightFromFloor), SpawnType.Path, Submarine.Loaded); + + for (int i = 0; i < 2; i++) + { + for (int dir = -1; dir <= 1; dir += 2) + { + WayPoint closest = ladderPoints[i].FindClosest(dir, true, 30.0f); + if (closest == null) continue; + ladderPoints[i].ConnectTo(closest); + } + } + + ladderPoints[0].ConnectTo(ladderPoints[1]); + } foreach (Gap gap in Gap.GapList) { diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 0f9e97991..e87de22f6 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -555,11 +555,8 @@ namespace Barotrauma.Networking //int gameModeIndex = inc.ReadInt32(); GameMain.GameSession = new GameSession(GameMain.NetLobbyScreen.SelectedSub, "", gameMode); - - yield return CoroutineStatus.Running; - GameMain.GameSession.StartShift(levelSeed); - + yield return CoroutineStatus.Running; //myCharacter = ReadCharacterData(inc); diff --git a/Subsurface/Source/Networking/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index cf26ec95b..63d8a7cba 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -290,7 +290,7 @@ namespace Barotrauma.Networking { if (!(c is AICharacter) || c.IsDead) continue; - Vector2 diff = Submarine.Loaded.WorldPosition - c.WorldPosition; + Vector2 diff = c.WorldPosition-Submarine.Loaded.WorldPosition; if (FarseerPhysics.ConvertUnits.ToSimUnits(diff.Length()) > NetConfig.CharacterIgnoreDistance) continue; diff --git a/Subsurface/Source/Networking/NetworkMember.cs b/Subsurface/Source/Networking/NetworkMember.cs index df376175e..8fb7a6ad8 100644 --- a/Subsurface/Source/Networking/NetworkMember.cs +++ b/Subsurface/Source/Networking/NetworkMember.cs @@ -104,17 +104,20 @@ namespace Barotrauma.Networking inGameHUD = new GUIFrame(new Rectangle(0,0,0,0), null, null); inGameHUD.CanBeFocused = false; - int width = 350, height = 100; + int width = (int)MathHelper.Clamp(GameMain.GraphicsWidth * 0.35f, 350, 500); + int height = (int)MathHelper.Clamp(GameMain.GraphicsHeight * 0.15f, 100, 200); chatBox = new GUIListBox(new Rectangle( GameMain.GraphicsWidth - 20 - width, GameMain.GraphicsHeight - 40 - 25 - height, width, height), Color.White * 0.5f, GUI.Style, inGameHUD); + chatBox.Padding = Vector4.Zero; chatMsgBox = new GUITextBox( new Rectangle(chatBox.Rect.X, chatBox.Rect.Y + chatBox.Rect.Height + 20, chatBox.Rect.Width, 25), Color.White * 0.5f, Color.Black, Alignment.TopLeft, Alignment.Left, GUI.Style, inGameHUD); chatMsgBox.Font = GUI.SmallFont; + chatMsgBox.Padding = Vector4.Zero; chatMsgBox.OnEnterPressed = EnterChatMessage; diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index 81cda10d4..0dd49e7cc 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -253,28 +253,28 @@ namespace Barotrauma seedBox.OnTextChanged = SelectSeed; LevelSeed = ToolBox.RandomSeed(8); - //automatic restart ------------------------------------------------------------------ - - autoRestartBox = new GUITickBox(new Rectangle(columnX, 190, 20, 20), "Automatic restart", Alignment.TopLeft, infoFrame); - autoRestartBox.OnSelected = ToggleAutoRestart; - - var restartText = new GUITextBlock(new Rectangle(columnX, 210, 20, 20), "", GUI.Style, infoFrame); - restartText.TextGetter = AutoRestartText; - //traitor probability ------------------------------------------------------------------ - var traitorText = new GUITextBlock(new Rectangle(columnX, 230, 20, 20), "Traitors:", GUI.Style, infoFrame); + var traitorText = new GUITextBlock(new Rectangle(columnX, 180, 20, 20), "Traitors:", GUI.Style, infoFrame); traitorProbabilityButtons = new GUIButton[2]; - traitorProbabilityButtons[0] = new GUIButton(new Rectangle(columnX, 260, 20, 20), "<", GUI.Style, infoFrame); + traitorProbabilityButtons[0] = new GUIButton(new Rectangle(columnX, 205, 20, 20), "<", GUI.Style, infoFrame); traitorProbabilityButtons[0].UserData = -1; - traitorProbabilityText = new GUITextBlock(new Rectangle(columnX+20, 260, 150, 20), "No", null,null, Alignment.TopCenter, GUI.Style, infoFrame); + traitorProbabilityText = new GUITextBlock(new Rectangle(columnX, 205, 120, 20), "No", null,null, Alignment.TopCenter, GUI.Style, infoFrame); - traitorProbabilityButtons[1] = new GUIButton(new Rectangle(columnX + 150, 260, 20, 20), ">", GUI.Style, infoFrame); + traitorProbabilityButtons[1] = new GUIButton(new Rectangle(columnX + 100, 205, 20, 20), ">", GUI.Style, infoFrame); traitorProbabilityButtons[1].UserData = 1; + //automatic restart ------------------------------------------------------------------ + + autoRestartBox = new GUITickBox(new Rectangle(columnX, 240, 20, 20), "Automatic restart", Alignment.TopLeft, infoFrame); + autoRestartBox.OnSelected = ToggleAutoRestart; + + var restartText = new GUITextBlock(new Rectangle(columnX, 265, 20, 20), "", GUI.Style, infoFrame); + restartText.Font = GUI.SmallFont; + restartText.TextGetter = AutoRestartText; //server info ------------------------------------------------------------------ diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 1d908405fe4ad6d2f310b57db5ac1cf6882c15af..b1915b1754b0d7fe1dd7ef5dbd4ffb8371dc239a 100644 GIT binary patch delta 12828 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 delta 16602 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