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();