From 61b90464dda38278a50e5985cc1583c51914b3de Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Wed, 26 Jul 2017 21:03:21 +0300 Subject: [PATCH] Playing whack-a-mole with the interaction logic again: - Fixed server keeping clients focused on entities until they report focusing on something else. This allowed clients to interact with the entity they previously focused on, even if they weren't anywhere near anymore. - Checking if clients are allowed to focus on an entity before letting them do so (!!!). - Server doesn't highlight entities when a client focuses on them. - Characters can interact with a wire if they've selected either of the items it's connected to. --- .../Components/Signal/ConnectionPanel.cs | 6 +--- .../Source/Characters/Character.cs | 32 +++++++++++++++++-- .../Source/Characters/CharacterNetworking.cs | 25 +++++++++++---- 3 files changed, 49 insertions(+), 14 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs index 2e2602b02..c2e19882a 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/ConnectionPanel.cs @@ -9,11 +9,7 @@ namespace Barotrauma.Items.Components public override void UpdateHUD(Character character) { if (character != Character.Controlled || character != user) return; - - if (Screen.Selected != GameMain.EditMapScreen && - character.IsKeyHit(InputType.Select) && - character.SelectedConstruction == this.item) character.SelectedConstruction = null; - + if (HighlightedWire != null) { HighlightedWire.Item.IsHighlighted = true; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index fe33f552c..5e26c452e 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -978,6 +978,16 @@ namespace Barotrauma return true; } + public bool CanInteractWith(Character c, float maxDist = 200.0f) + { + if (c == this || !c.enabled || c.info == null || !c.IsHumanoid || !c.CanBeSelected) return false; + + maxDist = ConvertUnits.ToSimUnits(maxDist); + if (Vector2.DistanceSquared(SimPosition, c.SimPosition) > maxDist * maxDist) return false; + + return true; + } + public bool CanInteractWith(Item item) { float distanceToItem; @@ -995,6 +1005,14 @@ namespace Barotrauma return CanAccessInventory(item.ParentInventory); } + Wire wire = item.GetComponent(); + if (wire != null) + { + //wires are interactable if the character has selected either of the items the wire is connected to + if (wire.Connections[0]?.Item != null && selectedConstruction == wire.Connections[0].Item) return true; + if (wire.Connections[1]?.Item != null && selectedConstruction == wire.Connections[1].Item) return true; + } + if (item.InteractDistance == 0.0f && !item.Prefab.Triggers.Any()) return false; Pickable pickableComponent = item.GetComponent(); @@ -1126,7 +1144,7 @@ namespace Barotrauma foreach (Character c in CharacterList) { - if (c == this || !c.enabled || c.info == null || !c.IsHumanoid || !c.CanBeSelected) continue; + if (!CanInteractWith(c)) continue; float dist = Vector2.DistanceSquared(mouseSimPos, c.SimPosition); if (dist < maxDist*maxDist && (closestCharacter == null || dist < closestDist)) @@ -1212,7 +1230,8 @@ namespace Barotrauma focusedCharacter = null; return; } - if ((!isLocalPlayer && IsKeyHit(InputType.Select) && GameMain.Server == null) || (isLocalPlayer && (findFocusedTimer <= 0.0f || Screen.Selected == GameMain.EditMapScreen))) + if ((!isLocalPlayer && IsKeyHit(InputType.Select) && GameMain.Server == null) || + (isLocalPlayer && (findFocusedTimer <= 0.0f || Screen.Selected == GameMain.EditMapScreen))) { focusedCharacter = FindCharacterAtPosition(mouseSimPos); focusedItem = FindItemAtPosition(mouseSimPos, AnimController.InWater ? 0.5f : 0.25f); @@ -1223,6 +1242,10 @@ namespace Barotrauma { focusedCharacter = null; } + else + { + focusedItem = null; + } } findFocusedTimer = 0.05f; } @@ -1241,7 +1264,10 @@ namespace Barotrauma } else if (focusedItem != null) { - focusedItem.IsHighlighted = true; + if (Controlled == this) + { + focusedItem.IsHighlighted = true; + } focusedItem.TryInteract(this); } else if (IsKeyHit(InputType.Select) && selectedConstruction != null) diff --git a/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs b/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs index 8fff8ce69..dfef47bf7 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/CharacterNetworking.cs @@ -144,18 +144,31 @@ namespace Barotrauma cursorPosition = (ViewTarget == null ? AnimController.AimSourcePos : ViewTarget.Position) + new Vector2((float)Math.Cos(aimAngle), (float)Math.Sin(aimAngle)) * 60.0f; - var closestEntity = Entity.FindEntityByID(memInput[memInput.Count - 1].interact); + //reset focus when attempting to use/select something + if (memInput[memInput.Count - 1].states.HasFlag(InputNetFlags.Use) || + memInput[memInput.Count - 1].states.HasFlag(InputNetFlags.Select)) + { + focusedItem = null; + focusedCharacter = null; + } + var closestEntity = FindEntityByID(memInput[memInput.Count - 1].interact); if (closestEntity is Item) { - focusedItem = (Item)closestEntity; - focusedCharacter = null; + if (CanInteractWith((Item)closestEntity)) + { + focusedItem = (Item)closestEntity; + focusedCharacter = null; + } } else if (closestEntity is Character) { - focusedCharacter = (Character)closestEntity; - focusedItem = null; + if (CanInteractWith((Character)closestEntity)) + { + focusedCharacter = (Character)closestEntity; + focusedItem = null; + } } - + memInput.RemoveAt(memInput.Count - 1); TransformCursorPos();