From 82103cf39449d6a5132fa37b98b9a9e0947cf22f Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 31 Jul 2018 15:03:20 +0300 Subject: [PATCH] Controllers don't have to be wired directly to an item for camera focus to work (= railguns and cameras can be used over wifi). Closes #535 --- .../Items/Components/Machines/Controller.cs | 4 +-- .../Items/Components/Machines/Controller.cs | 30 +++++++++---------- .../Items/Components/Signal/Connection.cs | 5 ++++ .../Items/Components/Signal/WifiComponent.cs | 10 +++++++ .../BarotraumaShared/Source/Items/Item.cs | 14 +++++++-- 5 files changed, 42 insertions(+), 21 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Controller.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Controller.cs index d9e7aa18a..d7847cd6d 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Controller.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Machines/Controller.cs @@ -6,9 +6,7 @@ namespace Barotrauma.Items.Components { public override void DrawHUD(SpriteBatch spriteBatch, Character character) { - var focusTarget = GetFocusTarget(); - if (focusTarget == null) return; - if (character.ViewTarget == focusTarget) + if (focusTarget != null && character.ViewTarget == focusTarget) { foreach (ItemComponent ic in focusTarget.components) { diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs index d7256eaa9..ede3f0aed 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Controller.cs @@ -33,6 +33,9 @@ namespace Barotrauma.Items.Components private Character character; + private Item focusTarget; + private float targetRotation; + public Vector2 UserPos { get { return userPos; } @@ -174,7 +177,7 @@ namespace Barotrauma.Items.Components return true; } - + public override bool SecondaryUse(float deltaTime, Character character = null) { if (this.character != character) @@ -190,7 +193,7 @@ namespace Barotrauma.Items.Components } if (character == null) return false; - Entity focusTarget = GetFocusTarget(); + focusTarget = GetFocusTarget(); if (focusTarget == null) { Vector2 centerPos = new Vector2(item.WorldRect.Center.X, item.WorldRect.Center.Y); @@ -198,9 +201,7 @@ namespace Barotrauma.Items.Components Vector2 offset = character.CursorWorldPosition - centerPos; offset.Y = -offset.Y; - float targetRotation = MathUtils.WrapAngleTwoPi(MathUtils.VectorToAngle(offset)); - - item.SendSignal(0, targetRotation.ToString(), "position_out", character); + targetRotation = MathUtils.WrapAngleTwoPi(MathUtils.VectorToAngle(offset)); return false; } @@ -211,7 +212,7 @@ namespace Barotrauma.Items.Components Lights.LightManager.ViewTarget = focusTarget; cam.TargetPos = focusTarget.WorldPosition; - cam.OffsetAmount = MathHelper.Lerp(cam.OffsetAmount, (focusTarget as Item).Prefab.OffsetOnSelected, deltaTime*10.0f); + cam.OffsetAmount = MathHelper.Lerp(cam.OffsetAmount, (focusTarget as Item).Prefab.OffsetOnSelected, deltaTime * 10.0f); } #endif @@ -232,9 +233,7 @@ namespace Barotrauma.Items.Components Vector2 offset = character.CursorWorldPosition - centerPos; offset.Y = -offset.Y; - float targetRotation = MathUtils.WrapAngleTwoPi(MathUtils.VectorToAngle(offset)); - - item.SendSignal(0, targetRotation.ToString(), "position_out", character); + targetRotation = MathUtils.WrapAngleTwoPi(MathUtils.VectorToAngle(offset)); } return true; @@ -242,17 +241,16 @@ namespace Barotrauma.Items.Components private Item GetFocusTarget() { - foreach (Connection c in item.Connections) - { - if (c.Name != "position_out") continue; + item.SendSignal(0, targetRotation.ToString(), "position_out", character); - foreach (Connection c2 in c.Recipients) + for (int i = item.LastSentSignalRecipients.Count - 1; i >= 0; i--) + { + if (item.LastSentSignalRecipients[i].Prefab.FocusOnSelected) { - if (c2 == null || c2.Item == null || !c2.Item.Prefab.FocusOnSelected) continue; - return c2.Item; + return item.LastSentSignalRecipients[i]; } } - + return null; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Connection.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Connection.cs index eea444c2b..5cd768fc9 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Connection.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/Connection.cs @@ -160,6 +160,11 @@ namespace Barotrauma.Items.Components if (recipient == null) continue; if (recipient.item == this.item || recipient.item == source) continue; + if (source != null && !source.LastSentSignalRecipients.Contains(recipient.item)) + { + source.LastSentSignalRecipients.Add(recipient.item); + } + foreach (ItemComponent ic in recipient.item.components) { ic.ReceiveSignal(stepsTaken, signal, recipient, item, sender, power); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/WifiComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/WifiComponent.cs index e3ee5ff30..92be4b891 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/WifiComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/WifiComponent.cs @@ -95,6 +95,16 @@ namespace Barotrauma.Items.Components foreach (WifiComponent wifiComp in receivers) { wifiComp.item.SendSignal(stepsTaken, signal, "signal_out", sender); + if (source != null) + { + foreach (Item receiverItem in wifiComp.item.LastSentSignalRecipients) + { + if (!source.LastSentSignalRecipients.Contains(receiverItem)) + { + source.LastSentSignalRecipients.Add(receiverItem); + } + } + } } break; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 9625a01f7..0d2fe6908 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -268,7 +268,16 @@ namespace Barotrauma return IsInWater(); } } - + + /// + /// A list of items the last signal sent by this item went through + /// + public List LastSentSignalRecipients + { + get; + private set; + } = new List(); + public ItemPrefab Prefab { get { return prefab; } @@ -1011,9 +1020,10 @@ namespace Barotrauma } } } - + public void SendSignal(int stepsTaken, string signal, string connectionName, Character sender, float power = 0.0f) { + LastSentSignalRecipients.Clear(); if (connections == null) return; stepsTaken++;