From f3112e29b463b77a4c07b9ed18216134516dea21 Mon Sep 17 00:00:00 2001 From: Regalis Date: Tue, 16 Feb 2016 20:52:39 +0200 Subject: [PATCH] Fixed spectators joining messing up the game, textboxes are deselected when switching the screen, nerfed engineer construction level, tickboxes or textboxes cannot be selected through other ui elements --- Subsurface/Content/Jobs.xml | 4 ++-- .../Source/Characters/AI/EnemyAIController.cs | 4 ++-- .../AI/Objectives/AIObjectiveContainItem.cs | 2 +- .../AI/Objectives/AIObjectiveGetItem.cs | 2 +- Subsurface/Source/Events/ArtifactEvent.cs | 2 +- .../Source/Events/Quests/SalvageQuest.cs | 2 +- Subsurface/Source/GUI/GUITextBox.cs | 7 +++++-- Subsurface/Source/GUI/GUITickBox.cs | 2 ++ Subsurface/Source/Items/CharacterInventory.cs | 6 +++--- .../Items/Components/Holdable/Holdable.cs | 4 ++-- Subsurface/Source/Items/Inventory.cs | 6 +++--- Subsurface/Source/Items/Item.cs | 10 +++++----- Subsurface/Source/Map/FireSource.cs | 2 +- Subsurface/Source/Networking/GameServer.cs | 8 ++++---- Subsurface/Source/Screens/MainMenuScreen.cs | 6 +++--- Subsurface/Source/Screens/NetLobbyScreen.cs | 15 ++++++++++++--- Subsurface/Source/Screens/Screen.cs | 6 +++++- Subsurface/Source/Sprite.cs | 4 ++-- Subsurface_Solution.v12.suo | Bin 918016 -> 919552 bytes 19 files changed, 55 insertions(+), 37 deletions(-) diff --git a/Subsurface/Content/Jobs.xml b/Subsurface/Content/Jobs.xml index 4a9ab622f..35fbd9766 100644 --- a/Subsurface/Content/Jobs.xml +++ b/Subsurface/Content/Jobs.xml @@ -16,7 +16,7 @@ - + @@ -29,7 +29,7 @@ - + diff --git a/Subsurface/Source/Characters/AI/EnemyAIController.cs b/Subsurface/Source/Characters/AI/EnemyAIController.cs index 5eddfdb03..c6fbb5dd9 100644 --- a/Subsurface/Source/Characters/AI/EnemyAIController.cs +++ b/Subsurface/Source/Characters/AI/EnemyAIController.cs @@ -109,9 +109,9 @@ namespace Barotrauma if (Character.AnimController is HumanoidAnimController) { - if (Math.Abs(Character.AnimController.TargetMovement.X) > 0.1f && !Character.AnimController.InWater) + if (Math.Abs(Character.AnimController.movement.X) > 0.1f && !Character.AnimController.InWater) { - Character.AnimController.TargetDir = Character.AnimController.TargetMovement.X > 0.0f ? Direction.Right : Direction.Left; + Character.AnimController.TargetDir = Character.AnimController.movement.X > 0.0f ? Direction.Right : Direction.Left; } } diff --git a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveContainItem.cs index ff548770d..b71c34a33 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.ParentInventory == 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 e841ebea6..c7db395eb 100644 --- a/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs +++ b/Subsurface/Source/Characters/AI/Objectives/AIObjectiveGetItem.cs @@ -106,7 +106,7 @@ namespace Barotrauma 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 (Item.ItemList[currSearchIndex].ParentInventory is CharacterInventory) continue; targetItem = Item.ItemList[currSearchIndex]; diff --git a/Subsurface/Source/Events/ArtifactEvent.cs b/Subsurface/Source/Events/ArtifactEvent.cs index b441c6ea6..1f0521abf 100644 --- a/Subsurface/Source/Events/ArtifactEvent.cs +++ b/Subsurface/Source/Events/ArtifactEvent.cs @@ -49,7 +49,7 @@ namespace Barotrauma case 1: //item.body.LinearVelocity = Vector2.Zero; - if (item.Inventory!=null) item.body.FarseerBody.IsKinematic = false; + if (item.ParentInventory!=null) item.body.FarseerBody.IsKinematic = false; if (item.CurrentHull == null) return; state = 2; diff --git a/Subsurface/Source/Events/Quests/SalvageQuest.cs b/Subsurface/Source/Events/Quests/SalvageQuest.cs index c96ba3185..2a590af5f 100644 --- a/Subsurface/Source/Events/Quests/SalvageQuest.cs +++ b/Subsurface/Source/Events/Quests/SalvageQuest.cs @@ -52,7 +52,7 @@ namespace Barotrauma { case 0: //item.body.LinearVelocity = Vector2.Zero; - if (item.Inventory!=null) item.body.FarseerBody.IsKinematic = false; + if (item.ParentInventory!=null) item.body.FarseerBody.IsKinematic = false; if (item.CurrentHull == null) return; ShowMessage(state); diff --git a/Subsurface/Source/GUI/GUITextBox.cs b/Subsurface/Source/GUI/GUITextBox.cs index 47d29dc84..e957ce5c9 100644 --- a/Subsurface/Source/GUI/GUITextBox.cs +++ b/Subsurface/Source/GUI/GUITextBox.cs @@ -183,18 +183,21 @@ namespace Barotrauma if (flashTimer > 0.0f) flashTimer -= deltaTime; if (!Enabled) return; - + if (CaretEnabled) { caretTimer += deltaTime; - caretVisible = ((caretTimer*1000.0f) % 1000) < 500; + caretVisible = ((caretTimer * 1000.0f) % 1000) < 500; } if (rect.Contains(PlayerInput.MousePosition)) { + state = ComponentState.Hover; if (PlayerInput.LeftButtonClicked()) { + if (MouseOn != null && MouseOn != this && MouseOn!=textBlock && !MouseOn.IsParentOf(this)) return; + Select(); if (OnSelected != null) OnSelected(this, Keys.None); } diff --git a/Subsurface/Source/GUI/GUITickBox.cs b/Subsurface/Source/GUI/GUITickBox.cs index 65117c9a6..207b29999 100644 --- a/Subsurface/Source/GUI/GUITickBox.cs +++ b/Subsurface/Source/GUI/GUITickBox.cs @@ -61,6 +61,8 @@ namespace Barotrauma { if (!Visible || !Enabled) return; + if (MouseOn != null && MouseOn != this && !MouseOn.IsParentOf(this)) return; + if (text.Rect.Contains(PlayerInput.MousePosition)) MouseOn = this; if (box.Rect.Contains(PlayerInput.MousePosition)) diff --git a/Subsurface/Source/Items/CharacterInventory.cs b/Subsurface/Source/Items/CharacterInventory.cs index 18511e97a..e5e20815c 100644 --- a/Subsurface/Source/Items/CharacterInventory.cs +++ b/Subsurface/Source/Items/CharacterInventory.cs @@ -168,8 +168,8 @@ namespace Barotrauma System.Diagnostics.Debug.Assert(false); return false; } - Inventory otherInventory = Items[index].Inventory; - if (otherInventory != null && createNetworkEvent) + Inventory otherInventory = Items[index].ParentInventory; + if (otherInventory != null && otherInventory.Owner!=null && createNetworkEvent) { new Networking.NetworkEvent(Networking.NetworkEventType.InventoryUpdate, otherInventory.Owner.ID, true, true); } @@ -219,7 +219,7 @@ namespace Barotrauma string toolTip = ""; Rectangle highlightedSlot = Rectangle.Empty; - if (doubleClickedItem!=null && doubleClickedItem.Inventory!=this) + if (doubleClickedItem!=null && doubleClickedItem.ParentInventory!=this) { TryPutItem(doubleClickedItem, doubleClickedItem.AllowedSlots, true); } diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs index 966b6fc5b..d76b560b5 100644 --- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs @@ -30,7 +30,7 @@ namespace Barotrauma.Items.Components [HasDefaultValue(false, true)] public bool Attached { - get { return attached && item.Inventory == null; } + get { return attached && item.ParentInventory == null; } set { attached = value; } } @@ -278,7 +278,7 @@ namespace Barotrauma.Items.Components } else { - if (item.Inventory != null) + if (item.ParentInventory != null) { if (body != null) { diff --git a/Subsurface/Source/Items/Inventory.cs b/Subsurface/Source/Items/Inventory.cs index e5f74a5d3..e3dd3010a 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.ParentInventory != null) item.ParentInventory.RemoveItem(item); } Items[i] = item; - item.Inventory = this; + item.ParentInventory = this; if (item.body != null) { item.body.Enabled = false; @@ -154,7 +154,7 @@ namespace Barotrauma { if (Items[n] != item) continue; Items[n] = null; - item.Inventory = null; + item.ParentInventory = null; } } diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 84bc1d6c6..e945e4a25 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -63,20 +63,20 @@ namespace Barotrauma private bool inWater; - private Inventory inventory; + private Inventory parentInventory; //the inventory in which the item is contained in - public Inventory Inventory + public Inventory ParentInventory { get { - return inventory; + return parentInventory; } set { - inventory = value; + parentInventory = value; - if (inventory != null) Container = inventory.Owner as Item; + if (parentInventory != null) Container = parentInventory.Owner as Item; } } diff --git a/Subsurface/Source/Map/FireSource.cs b/Subsurface/Source/Map/FireSource.cs index 2eeda1e94..0e66c5f2f 100644 --- a/Subsurface/Source/Map/FireSource.cs +++ b/Subsurface/Source/Map/FireSource.cs @@ -250,7 +250,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.ParentInventory != 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/GameServer.cs b/Subsurface/Source/Networking/GameServer.cs index f9b67df76..36dba58e9 100644 --- a/Subsurface/Source/Networking/GameServer.cs +++ b/Subsurface/Source/Networking/GameServer.cs @@ -262,7 +262,7 @@ namespace Barotrauma.Networking (myCharacter == null || myCharacter.IsDead); //restart if all characters are dead or submarine is at the end of the level - if ((AutoRestart && isCrewDead) + if ((autoRestart && isCrewDead) || (endRoundAtLevelEnd && Submarine.Loaded!=null && Submarine.Loaded.AtEndPosition)) { @@ -716,7 +716,7 @@ namespace Barotrauma.Networking yield return new WaitForSeconds(3.0f); //save all the current events to a list and clear them - var existingEvents = NetworkEvent.Events; + var existingEvents = new List(NetworkEvent.Events); NetworkEvent.Events.Clear(); foreach (Hull hull in Hull.hullList) @@ -740,7 +740,7 @@ namespace Barotrauma.Networking item.NewComponentEvent(item.components[i], false, true); } - if (item.body == null || item.body.Enabled == false) continue; + if (item.body == null || !item.body.Enabled || item.ParentInventory!=null) continue; new NetworkEvent(NetworkEventType.DropItem, item.ID, false); } @@ -758,7 +758,7 @@ namespace Barotrauma.Networking yield return new WaitForSeconds(0.1f); //save "normal" events again - existingEvents = NetworkEvent.Events; + existingEvents = new List(NetworkEvent.Events); } yield return CoroutineStatus.Success; diff --git a/Subsurface/Source/Screens/MainMenuScreen.cs b/Subsurface/Source/Screens/MainMenuScreen.cs index a760808d4..c0beadcad 100644 --- a/Subsurface/Source/Screens/MainMenuScreen.cs +++ b/Subsurface/Source/Screens/MainMenuScreen.cs @@ -134,10 +134,10 @@ namespace Barotrauma //new GUITextBlock(new Rectangle(0, -25, 0, 30), "Host Server", GUI.style, Alignment.CenterX, Alignment.CenterX, menuTabs[(int)Tabs.HostServer], false, GUI.LargeFont); - new GUITextBlock(new Rectangle(0, 0, 0, 30), "Server Name:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); + new GUITextBlock(new Rectangle(0, 0, 100, 30), "Server Name:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); serverNameBox = new GUITextBox(new Rectangle(160, 0, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tab.HostServer]); - new GUITextBlock(new Rectangle(0, 50, 0, 30), "Server port:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); + new GUITextBlock(new Rectangle(0, 50, 100, 30), "Server port:", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); portBox = new GUITextBox(new Rectangle(160, 50, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tab.HostServer]); portBox.Text = NetConfig.DefaultPort.ToString(); portBox.ToolTip = "Server port"; @@ -155,7 +155,7 @@ namespace Barotrauma plusPlayersBox.UserData = 1; plusPlayersBox.OnClicked = ChangeMaxPlayers; - new GUITextBlock(new Rectangle(0, 150, 0, 30), "Password (optional):", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); + new GUITextBlock(new Rectangle(0, 150, 100, 30), "Password (optional):", GUI.Style, Alignment.TopLeft, Alignment.Left, menuTabs[(int)Tab.HostServer]); passwordBox = new GUITextBox(new Rectangle(160, 150, 200, 30), null, null, Alignment.TopLeft, Alignment.Left, GUI.Style, menuTabs[(int)Tab.HostServer]); isPublicBox = new GUITickBox(new Rectangle(10, 200, 20, 20), "Public server", Alignment.TopLeft, menuTabs[(int)Tab.HostServer]); diff --git a/Subsurface/Source/Screens/NetLobbyScreen.cs b/Subsurface/Source/Screens/NetLobbyScreen.cs index 347631c86..c88ea34af 100644 --- a/Subsurface/Source/Screens/NetLobbyScreen.cs +++ b/Subsurface/Source/Screens/NetLobbyScreen.cs @@ -668,11 +668,20 @@ namespace Barotrauma //GameMain.GameScreen.Cam.TargetPos = pos; //GameMain.GameScreen.Cam.MoveCamera((float)deltaTime); + if (jobInfoFrame != null) + { + jobInfoFrame.Update((float)deltaTime); + } + else if (playerFrame != null) + { + playerFrame.Update((float)deltaTime); + } + else + { + menu.Update((float)deltaTime); - if (jobInfoFrame != null) jobInfoFrame.Update((float)deltaTime); - - if (playerFrame != null) playerFrame.Update((float)deltaTime); + } if (autoRestartTimer != 0.0f && autoRestartBox.Selected) { diff --git a/Subsurface/Source/Screens/Screen.cs b/Subsurface/Source/Screens/Screen.cs index b45e81416..efe49daef 100644 --- a/Subsurface/Source/Screens/Screen.cs +++ b/Subsurface/Source/Screens/Screen.cs @@ -20,7 +20,11 @@ namespace Barotrauma public virtual void Select() { - if (selected != null && selected!=this) selected.Deselect(); + if (selected != null && selected != this) + { + selected.Deselect(); + GUIComponent.KeyboardDispatcher.Subscriber = null; + } selected = this; } diff --git a/Subsurface/Source/Sprite.cs b/Subsurface/Source/Sprite.cs index 99038a9c9..da6222bf9 100644 --- a/Subsurface/Source/Sprite.cs +++ b/Subsurface/Source/Sprite.cs @@ -197,9 +197,9 @@ namespace Barotrauma public void Draw(SpriteBatch spriteBatch, Vector2 pos, Color color, Vector2 origin, float rotate, Vector2 scale, SpriteEffects spriteEffect = SpriteEffects.None, float? depth = null) { - //for (int x = -1; x < 3; x += 2) + //for (int x = -1; x <= 1; x += 2) //{ - // for (int y = -1; y < 3; y += 2) + // for (int y = -1; y <= 1; y += 2) // { // spriteBatch.Draw(texture, pos + offset + new Vector2(x, y) * 1.0f, sourceRect, Color.Black, rotation + rotate, origin, scale, spriteEffect, (depth == null ? this.depth : (float)depth) + 0.0001f); diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo index a02f5188f0fe44f614265908bff358aa8ee5eb4f..c8567072512f8b9c83527e567fb354fb81b325f6 100644 GIT binary patch delta 9532 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 WIg`?#afVXnGtS_j^$-3#ivHg^5LmGQ delta 8333 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