From 5513637fe5b7cd76ae89312c06b518569d4e1c50 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 12 Jan 2016 01:02:05 +0200 Subject: [PATCH] Item.Container bugfix (affected at least railguns in MP), merged the "your crew has died" message box with shiftsummary, reliable reactor syncing, prevent artifacts dropping out of the level --- .../AI/Objectives/AIObjectiveContainItem.cs | 2 +- .../AI/Objectives/AIObjectiveGetItem.cs | 8 +-- Subsurface/Source/Characters/Character.cs | 4 +- .../Source/Events/Quests/MonsterQuest.cs | 13 ++++- .../Source/Events/Quests/SalvageQuest.cs | 7 ++- .../GameSession/GameModes/SinglePlayerMode.cs | 34 ++++++++++-- Subsurface/Source/GameSession/ShiftSummary.cs | 2 +- Subsurface/Source/Items/CharacterInventory.cs | 4 +- .../Source/Items/Components/ItemContainer.cs | 2 +- .../Items/Components/Machines/Reactor.cs | 36 +++++++----- .../Items/Components/Power/PowerContainer.cs | 2 +- .../Items/Components/Signal/LightComponent.cs | 2 +- .../Source/Items/Components/Signal/Wire.cs | 2 +- Subsurface/Source/Items/Components/Turret.cs | 2 +- Subsurface/Source/Items/Inventory.cs | 8 +-- Subsurface/Source/Items/Item.cs | 36 +++++++++--- Subsurface/Source/Items/ItemInventory.cs | 2 +- Subsurface/Source/Map/FireSource.cs | 2 +- Subsurface/Source/Networking/GameClient.cs | 52 ++++++------------ .../Source/Networking/GameServerSettings.cs | 1 + Subsurface_Solution.v12.suo | Bin 847360 -> 847360 bytes 21 files changed, 132 insertions(+), 89 deletions(-) diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs index ca552f102..83a4b573a 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs @@ -52,7 +52,7 @@ namespace Barotrauma return; } - if (container.Item.inventory == character.Inventory) + if (container.Item.Inventory == character.Inventory) { var containedItems = container.Inventory.Items; //if there's already something in the mask (empty oxygen tank?), drop it diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs index 994e82576..666c8c1a9 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs @@ -102,8 +102,8 @@ namespace Barotrauma currSearchIndex++; if (!Item.ItemList[currSearchIndex].HasTag(itemName) && Item.ItemList[currSearchIndex].Name != itemName) continue; - if (IgnoreContainedItems && Item.ItemList[currSearchIndex].container != null) continue; - if (Item.ItemList[currSearchIndex].inventory is CharacterInventory) continue; + if (IgnoreContainedItems && Item.ItemList[currSearchIndex].Container != null) continue; + if (Item.ItemList[currSearchIndex].Inventory is CharacterInventory) continue; targetItem = Item.ItemList[currSearchIndex]; @@ -119,9 +119,9 @@ namespace Barotrauma private void AddGoToObjective(Item item) { Item moveToTarget = item; - while (moveToTarget.container != null) + while (moveToTarget.Container != null) { - moveToTarget = moveToTarget.container; + moveToTarget = moveToTarget.Container; } AddSubObjective(new AIObjectiveGoTo(moveToTarget, character)); diff --git a/Subsurface/Source/Characters/Character.cs b/Subsurface/Source/Characters/Character.cs index 1889b59ef..aaa99fade 100644 --- a/Subsurface/Source/Characters/Character.cs +++ b/Subsurface/Source/Characters/Character.cs @@ -968,7 +968,7 @@ namespace Barotrauma { if (!Enabled) return; - Vector2 pos = AnimController.Limbs[0].WorldPosition; + Vector2 pos = DrawPosition; pos.Y = -pos.Y; if (this == controlled) return; @@ -992,7 +992,7 @@ namespace Barotrauma if (isDead) return; - Vector2 healthBarPos = new Vector2(DrawPosition.X - 50, -DrawPosition.Y - 100.0f); + Vector2 healthBarPos = new Vector2(pos.X - 50, pos.Y - 100.0f); GUI.DrawRectangle(spriteBatch, new Rectangle((int)healthBarPos.X - 2, (int)healthBarPos.Y - 2, 100 + 4, 15 + 4), Color.Black, false); GUI.DrawRectangle(spriteBatch, new Rectangle((int)healthBarPos.X, (int)healthBarPos.Y, (int)(100.0f * (health / maxHealth)), 15), Color.Red, true); } diff --git a/Subsurface/Source/Events/Quests/MonsterQuest.cs b/Subsurface/Source/Events/Quests/MonsterQuest.cs index c1c21c269..6b4616414 100644 --- a/Subsurface/Source/Events/Quests/MonsterQuest.cs +++ b/Subsurface/Source/Events/Quests/MonsterQuest.cs @@ -1,4 +1,5 @@ -using Microsoft.Xna.Framework; +using Barotrauma.Networking; +using Microsoft.Xna.Framework; using System.Xml.Linq; namespace Barotrauma @@ -29,6 +30,7 @@ namespace Barotrauma Vector2 position = level.PositionsOfInterest[Rand.Int(level.PositionsOfInterest.Count, false)]; monster = Character.Create(monsterFile, position); + monster.Enabled = false; radarPosition = monster.Position; } @@ -37,7 +39,14 @@ namespace Barotrauma switch (state) { case 0: - if (monster.Enabled) radarPosition = monster.Position; + if (monster.Enabled) + { + radarPosition = monster.Position; + } + else + { Vector2 diff = monster.WorldPosition-Submarine.Loaded.WorldPosition; + monster.Enabled = FarseerPhysics.ConvertUnits.ToSimUnits(diff.Length()) < NetConfig.CharacterIgnoreDistance; + } if (!monster.IsDead) return; ShowMessage(state); diff --git a/Subsurface/Source/Events/Quests/SalvageQuest.cs b/Subsurface/Source/Events/Quests/SalvageQuest.cs index f09c148ec..51d89cf42 100644 --- a/Subsurface/Source/Events/Quests/SalvageQuest.cs +++ b/Subsurface/Source/Events/Quests/SalvageQuest.cs @@ -51,7 +51,7 @@ namespace Barotrauma ConvertUnits.ToSimUnits(tryPos - Vector2.UnitY*level.Size.Y), null, Physics.CollisionLevel) != null) { - position = tryPos; + position = ConvertUnits.ToDisplayUnits(Submarine.LastPickedPosition); break; } @@ -67,7 +67,7 @@ namespace Barotrauma item = new Item(itemPrefab, position, null); item.MoveWithLevel = true; - item.body.FarseerBody.GravityScale = 0.5f; + item.body.FarseerBody.IsKinematic = true; //item.MoveWithLevel = true; } @@ -76,7 +76,10 @@ namespace Barotrauma switch (state) { case 0: + //item.body.LinearVelocity = Vector2.Zero; + if (item.Inventory!=null) item.body.FarseerBody.IsKinematic = false; if (item.CurrentHull == null) return; + ShowMessage(state); state = 1; break; diff --git a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs index c9a1cfd63..d97848e84 100644 --- a/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs +++ b/Subsurface/Source/GameSession/GameModes/SinglePlayerMode.cs @@ -204,15 +204,39 @@ namespace Barotrauma } else { - var msgBox = new GUIMessageBox("Game over", "Your entire crew has died!", new string[] { "Load game", "Quit" }); - msgBox.Buttons[0].OnClicked += GameMain.GameSession.LoadPrevious; - msgBox.Buttons[0].OnClicked += msgBox.Close; - msgBox.Buttons[1].OnClicked = GameMain.LobbyScreen.QuitToMainMenu; - msgBox.Buttons[1].OnClicked += msgBox.Close; + + + // var okButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Ok", Alignment.BottomRight, GUI.Style, summaryFrame.children[0]); + //okButton.OnClicked = (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Dequeue(); return true; }; + + // var msgBox = new GUIMessageBox("Game over", "Your entire crew has died!", new string[] { "Load game", "Quit" }); + // msgBox.Buttons[0].OnClicked += GameMain.GameSession.LoadPrevious; + // msgBox.Buttons[0].OnClicked += msgBox.Close; + // msgBox.Buttons[1].OnClicked = GameMain.LobbyScreen.QuitToMainMenu; + // msgBox.Buttons[1].OnClicked += msgBox.Close; } GameMain.GameSession.EndShift(""); + if (!success) + { + var summaryScreen = GUIMessageBox.MessageBoxes.Peek(); + + if (summaryScreen != null) + { + summaryScreen = summaryScreen.children[0]; + summaryScreen.RemoveChild(summaryScreen.children.Find(c => c is GUIButton)); + + var okButton = new GUIButton(new Rectangle(-120, 0, 100, 30), "Load game", Alignment.BottomRight, GUI.Style, summaryScreen); + okButton.OnClicked += GameMain.GameSession.LoadPrevious; + okButton.OnClicked += (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Dequeue(); return true; }; + + var quitButton = new GUIButton(new Rectangle(0, 0, 100, 30), "Quit", Alignment.BottomRight, GUI.Style, summaryScreen); + quitButton.OnClicked += GameMain.LobbyScreen.QuitToMainMenu; + quitButton.OnClicked += (GUIButton button, object obj) => { GUIMessageBox.MessageBoxes.Dequeue(); return true; }; + } + } + CrewManager.EndShift(); for (int i = Character.CharacterList.Count - 1; i >= 0; i--) { diff --git a/Subsurface/Source/GameSession/ShiftSummary.cs b/Subsurface/Source/GameSession/ShiftSummary.cs index 7921f9186..ede00077f 100644 --- a/Subsurface/Source/GameSession/ShiftSummary.cs +++ b/Subsurface/Source/GameSession/ShiftSummary.cs @@ -95,7 +95,7 @@ namespace Barotrauma int x = 0; foreach (Character character in gameSession.CrewManager.characters) { - var characterFrame = new GUIFrame(new Rectangle(x, y, 170, 70), character.IsDead ? Color.DarkRed * 0.7f : Color.Transparent, GUI.Style, listBox); + var characterFrame = new GUIFrame(new Rectangle(x, y, 170, 70), Color.Transparent, GUI.Style, listBox); characterFrame.OutlineColor = Color.Transparent; characterFrame.Padding = new Vector4(5.0f, 5.0f, 5.0f, 5.0f); characterFrame.CanBeFocused = false; diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index bc88a1240..54d743620 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -162,7 +162,7 @@ namespace Barotrauma System.Diagnostics.Debug.Assert(false); return false; } - Inventory otherInventory = Items[index].inventory; + Inventory otherInventory = Items[index].Inventory; if (otherInventory != null && createNetworkEvent) { new Networking.NetworkEvent(Networking.NetworkEventType.InventoryUpdate, otherInventory.Owner.ID, true, true); @@ -213,7 +213,7 @@ namespace Barotrauma string toolTip = ""; Rectangle highlightedSlot = Rectangle.Empty; - if (doubleClickedItem!=null && doubleClickedItem.inventory!=this) + if (doubleClickedItem!=null && doubleClickedItem.Inventory!=this) { TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots, true); } diff --git a/Subsurface/Source/Items/Components/ItemContainer.cs b/Subsurface/Source/Items/Components/ItemContainer.cs index 7f62dc2c9..e0d1b4d2a 100644 --- a/Subsurface/Source/Items/Components/ItemContainer.cs +++ b/Subsurface/Source/Items/Components/ItemContainer.cs @@ -222,7 +222,7 @@ namespace Barotrauma.Items.Components IsActive = true; if (hideItems || (item.body!=null && !item.body.Enabled)) item.body.Enabled = false; - item.container = this.item; + //item.Container = this.item; return true; } diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index d0f82be89..030f0579d 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -10,6 +10,8 @@ namespace Barotrauma.Items.Components { class Reactor : Powered { + const float NetworkUpdateInterval = 3.0f; + //the rate at which the reactor is being run un //higher rates generate more power (and heat) private float fissionRate; @@ -50,6 +52,9 @@ namespace Barotrauma.Items.Components private PropertyTask powerUpTask; + private bool unsentChanges; + private float sendUpdateTimer; + [Editable, HasDefaultValue(9500.0f, true)] public float MeltDownTemp { @@ -248,6 +253,15 @@ namespace Barotrauma.Items.Components AvailableFuel = 0.0f; item.SendSignal(((int)temperature).ToString(), "temperature_out"); + + sendUpdateTimer = Math.Max(sendUpdateTimer - deltaTime, 0.0f); + + if (unsentChanges && sendUpdateTimer<= 0.0f) + { + item.NewComponentEvent(this, true, true); + sendUpdateTimer = NetworkUpdateInterval; + unsentChanges = false; + } } public override void UpdateBroken(float deltaTime, Camera cam) @@ -353,9 +367,7 @@ namespace Barotrauma.Items.Components public override void DrawHUD(SpriteBatch spriteBatch, Character character) { IsActive = true; - - bool valueChanged = false; - + int width = GuiFrame.Rect.Width, height = GuiFrame.Rect.Height; int x = GuiFrame.Rect.X; int y = GuiFrame.Rect.Y; @@ -380,12 +392,12 @@ namespace Barotrauma.Items.Components spriteBatch.DrawString(GUI.Font, "Shutdown Temperature: " + shutDownTemp, new Vector2(x + 450, y + 80), Color.White); if (GUI.DrawButton(spriteBatch, new Rectangle(x + 450, y + 110, 40, 40), "+", true)) { - valueChanged = true; + unsentChanges = true; ShutDownTemp += 100.0f; } if (GUI.DrawButton(spriteBatch, new Rectangle(x + 500, y + 110, 40, 40), "-", true)) { - valueChanged = true; + unsentChanges = true; ShutDownTemp -= 100.0f; } @@ -393,7 +405,7 @@ namespace Barotrauma.Items.Components spriteBatch.DrawString(GUI.Font, "Automatic Temperature Control: " + ((autoTemp) ? "ON" : "OFF"), new Vector2(x + 450, y + 180), Color.White); if (GUI.DrawButton(spriteBatch, new Rectangle(x + 450, y + 210, 100, 40), ((autoTemp) ? "TURN OFF" : "TURN ON"))) { - valueChanged = true; + unsentChanges = true; autoTemp = !autoTemp; } @@ -407,12 +419,12 @@ namespace Barotrauma.Items.Components if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 30, 40, 40), "+", true)) { - valueChanged = true; + unsentChanges = true; FissionRate += 1.0f; } if (GUI.DrawButton(spriteBatch, new Rectangle(x + 250, y + 80, 40, 40), "-", true)) { - valueChanged = true; + unsentChanges = true; FissionRate -= 1.0f; } @@ -422,21 +434,17 @@ namespace Barotrauma.Items.Components if (GUI.DrawButton(spriteBatch, new Rectangle(x + 540, y + 30, 40, 40), "+", true)) { - valueChanged = true; + unsentChanges = true; CoolingRate += 1.0f; } if (GUI.DrawButton(spriteBatch, new Rectangle(x + 540, y + 80, 40, 40), "-", true)) { - valueChanged = true; + unsentChanges = true; CoolingRate -= 1.0f; } //y = y - 260; - if (valueChanged) - { - item.NewComponentEvent(this, true, false); - } } static void UpdateGraph(IList graph, T newValue) diff --git a/Subsurface/Source/Items/Components/Power/PowerContainer.cs b/Subsurface/Source/Items/Components/Power/PowerContainer.cs index cc41d1ad8..226760936 100644 --- a/Subsurface/Source/Items/Components/Power/PowerContainer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerContainer.cs @@ -122,7 +122,7 @@ namespace Barotrauma.Items.Components } currPowerConsumption = MathHelper.Lerp(currPowerConsumption, rechargeSpeed, 0.05f); - charge += currPowerConsumption*voltage / 3600.0f; + Charge += currPowerConsumption*voltage / 3600.0f; } //provide power to the grid else if (gridLoad > 0.0f) diff --git a/Subsurface/Source/Items/Components/Signal/LightComponent.cs b/Subsurface/Source/Items/Components/Signal/LightComponent.cs index 433096815..4075c8d8a 100644 --- a/Subsurface/Source/Items/Components/Signal/LightComponent.cs +++ b/Subsurface/Source/Items/Components/Signal/LightComponent.cs @@ -100,7 +100,7 @@ namespace Barotrauma.Items.Components light.Submarine = item.CurrentHull.Submarine; } - if (item.container != null) + if (item.Container != null) { light.Color = Color.Transparent; return; diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index 6fa379a41..776dee504 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -133,7 +133,7 @@ namespace Barotrauma.Items.Components if (ic == this) continue; ic.Drop(null); } - if (item.container != null) item.container.RemoveContained(this.item); + if (item.Container != null) item.Container.RemoveContained(this.item); item.body.Enabled = false; diff --git a/Subsurface/Source/Items/Components/Turret.cs b/Subsurface/Source/Items/Components/Turret.cs index c1e69f169..d0bd5514b 100644 --- a/Subsurface/Source/Items/Components/Turret.cs +++ b/Subsurface/Source/Items/Components/Turret.cs @@ -156,7 +156,7 @@ namespace Barotrauma.Items.Components projectile.SetTransform(ConvertUnits.ToSimUnits(new Vector2(item.WorldRect.X + barrelPos.X, item.WorldRect.Y - barrelPos.Y)), -rotation); projectiles[0].Use(deltaTime); - if (projectile.container != null) projectile.container.RemoveContained(projectile); + if (projectile.Container != null) projectile.Container.RemoveContained(projectile); return true; } diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index 4d88f80da..665123c27 100644 --- a/Subsurface/Source/Items/Inventory.cs +++ b/Subsurface/Source/Items/Inventory.cs @@ -125,11 +125,11 @@ namespace Barotrauma if (removeItem) { item.Drop(null, false); - if (item.inventory != null) item.inventory.RemoveItem(item); + if (item.Inventory != null) item.Inventory.RemoveItem(item); } Items[i] = item; - item.inventory = this; + item.Inventory = this; if (item.body != null) { item.body.Enabled = false; @@ -152,7 +152,7 @@ namespace Barotrauma { if (Items[n] != item) continue; Items[n] = null; - item.inventory = null; + item.Inventory = null; } } @@ -201,7 +201,7 @@ namespace Barotrauma } } - if (draggingItem != null && !draggingItemSlot.Contains(PlayerInput.MousePosition) && draggingItem.container == this.Owner) + if (draggingItem != null && !draggingItemSlot.Contains(PlayerInput.MousePosition) && draggingItem.Container == this.Owner) { if (PlayerInput.GetMouseState.LeftButton == ButtonState.Pressed) { diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index b40326d1c..1a8b034a8 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -61,11 +61,29 @@ namespace Barotrauma private bool inWater; - //the inventory in which the item is contained in - public Inventory inventory; + private Inventory inventory; + + //the inventory in which the item is contained in + public Inventory Inventory + { + get + { + return inventory; + } + set + { + inventory = value; + + if (inventory != null) Container = inventory.Owner as Item; + } + } + + public Item Container + { + get; + private set; + } - public Item container; - public List FixRequirements; public override string Name @@ -354,7 +372,7 @@ namespace Barotrauma if (c == null) return; c.RemoveContained(contained); - contained.container = null; + contained.Container = null; } @@ -517,7 +535,7 @@ namespace Barotrauma //effect.Apply(type, deltaTime, null, Character); //ApplyStatusEffect(effect, type, deltaTime, null, Character, limb); - if (container != null && effect.Targets.HasFlag(StatusEffect.TargetType.Parent)) targets.Add(container); + if (Container != null && effect.Targets.HasFlag(StatusEffect.TargetType.Parent)) targets.Add(Container); //{ // effect.Apply(type, deltaTime, container); // //container.ApplyStatusEffect(effect, type, deltaTime, container); @@ -558,7 +576,7 @@ namespace Barotrauma } ic.WasUsed = false; - if (container != null) ic.ApplyStatusEffects(ActionType.OnContained, deltaTime); + if (Container != null) ic.ApplyStatusEffects(ActionType.OnContained, deltaTime); if (!ic.IsActive) continue; @@ -1005,7 +1023,7 @@ namespace Barotrauma } } - if (container!=null) container.RemoveContained(this); + if (Container!=null) Container.RemoveContained(this); return true; } @@ -1079,7 +1097,7 @@ namespace Barotrauma foreach (ItemComponent ic in components) ic.Drop(dropper); - if (container != null) container.RemoveContained(this); + if (Container != null) Container.RemoveContained(this); } public void Equip(Character character) diff --git a/Subsurface/Source/Items/ItemInventory.cs b/Subsurface/Source/Items/ItemInventory.cs index 712f46c97..2588697b1 100644 --- a/Subsurface/Source/Items/ItemInventory.cs +++ b/Subsurface/Source/Items/ItemInventory.cs @@ -57,7 +57,7 @@ namespace Barotrauma item.Unequip(c); break; } - item.container = container.Item; + //item.Container = container.Item; container.IsActive = true; } return wasPut; diff --git a/Subsurface/Source/Map/FireSource.cs b/Subsurface/Source/Map/FireSource.cs index 1abffbc2b..536ce99bc 100644 --- a/Subsurface/Source/Map/FireSource.cs +++ b/Subsurface/Source/Map/FireSource.cs @@ -233,7 +233,7 @@ namespace Barotrauma foreach (Item item in Item.ItemList) { if (item.CurrentHull != hull || item.FireProof || item.Condition <= 0.0f) continue; - if (item.inventory != null) return; + if (item.Inventory != null) return; float range = (float)Math.Sqrt(size.X) * 10.0f; if (item.Position.X < position.X - range || item.Position.X > position.X + size.X + range) continue; diff --git a/Subsurface/Source/Networking/GameClient.cs b/Subsurface/Source/Networking/GameClient.cs index 4a69c7670..b26167c47 100644 --- a/Subsurface/Source/Networking/GameClient.cs +++ b/Subsurface/Source/Networking/GameClient.cs @@ -609,49 +609,29 @@ namespace Barotrauma.Networking float endPreviewLength = 10.0f; - var cinematic = new TransitionCinematic(Submarine.Loaded, GameMain.GameScreen.Cam, endPreviewLength); - - float secondsLeft = endPreviewLength; - - do + if (Screen.Selected == GameMain.GameScreen) { - secondsLeft -= CoroutineManager.DeltaTime; + var cinematic = new TransitionCinematic(Submarine.Loaded, GameMain.GameScreen.Cam, endPreviewLength); - //float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; - //Vector2 offset = (new Vector2( - // (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), - // (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); + float secondsLeft = endPreviewLength; - //GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.Position + offset * 0.8f; - //Game1.GameScreen.Cam.MoveCamera((float)deltaTime); + do + { + secondsLeft -= CoroutineManager.DeltaTime; - //messageBox.Text = endMessage + "\nReturning to lobby in " + (int)secondsLeft + " s"; + //float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; + //Vector2 offset = (new Vector2( + // (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), + // (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); - yield return CoroutineStatus.Running; - } while (secondsLeft > 0.0f); + //GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.Position + offset * 0.8f; + //Game1.GameScreen.Cam.MoveCamera((float)deltaTime); - //float endPreviewLength = 10.0f; + //messageBox.Text = endMessage + "\nReturning to lobby in " + (int)secondsLeft + " s"; - //DateTime endTime = DateTime.Now + new TimeSpan(0,0,0,0,(int)(1000.0f*endPreviewLength)); - //float secondsLeft = endPreviewLength; - - //do - //{ - // secondsLeft = (float)(endTime - DateTime.Now).TotalSeconds; - - // float camAngle = (float)((DateTime.Now - endTime).TotalSeconds / endPreviewLength) * MathHelper.TwoPi; - // Vector2 offset = (new Vector2( - // (float)Math.Cos(camAngle) * (Submarine.Borders.Width / 2.0f), - // (float)Math.Sin(camAngle) * (Submarine.Borders.Height / 2.0f))); - - // GameMain.GameScreen.Cam.TargetPos = Submarine.Loaded.DrawPosition + offset * 0.8f; - // //Game1.GameScreen.Cam.MoveCamera((float)deltaTime); - - // messageBox.Text = endMessage + "\nReturning to lobby in " + (int)secondsLeft + " s"; - // yield return CoroutineStatus.Running; - //} while (secondsLeft > 0.0f); - - //messageBox.Close(null,null); + yield return CoroutineStatus.Running; + } while (secondsLeft > 0.0f); + } Submarine.Unload(); diff --git a/Subsurface/Source/Networking/GameServerSettings.cs b/Subsurface/Source/Networking/GameServerSettings.cs index 01d334f85..5c5d76964 100644 --- a/Subsurface/Source/Networking/GameServerSettings.cs +++ b/Subsurface/Source/Networking/GameServerSettings.cs @@ -90,6 +90,7 @@ namespace Barotrauma.Networking GUIFrame innerFrame = new GUIFrame(new Rectangle(0,0,400,400), null, Alignment.Center, GUI.Style, settingsFrame); var randomizeLevelBox = new GUITickBox(new Rectangle(0, 0, 20, 20), "Randomize level seed", Alignment.Left, innerFrame); + randomizeLevelBox.Selected = randomizeSeed; randomizeLevelBox.OnSelected = ToggleRandomizeSeed; new GUITextBlock(new Rectangle(0, 35, 100, 20), "Submarine selection:", GUI.Style, innerFrame); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index 1618eb35415ab4fbb3768048e41bd2b559b2445a..0d40d160436439ac6b017afc328a9738a25afd86 100644 GIT binary patch delta 15038 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 Grv5k9b