From 898e8dfdb179ea05283971b17e8c3557f3fa6c56 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Mon, 20 Aug 2018 20:12:33 +0300 Subject: [PATCH] Added a property for locking connection panels (better than the old hacky way of changing the required item to something else). Locked panels can still be rewired in the sub editor. Closes #679 --- .../Items/Components/Signal/Connection.cs | 39 ++++++++++--------- .../Components/Signal/ConnectionPanel.cs | 12 +++++- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs index 30a27fc2d..4466a40a8 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Signal/Connection.cs @@ -34,16 +34,19 @@ namespace Barotrauma.Items.Components Wire equippedWire = null; - //if the Character using the panel has a wire item equipped - //and the wire hasn't been connected yet, draw it on the panel - for (int i = 0; i < character.SelectedItems.Length; i++) + if (!panel.Locked || Screen.Selected == GameMain.SubEditorScreen) { - Item selectedItem = character.SelectedItems[i]; + //if the Character using the panel has a wire item equipped + //and the wire hasn't been connected yet, draw it on the panel + for (int i = 0; i < character.SelectedItems.Length; i++) + { + Item selectedItem = character.SelectedItems[i]; - if (selectedItem == null) continue; + if (selectedItem == null) continue; - Wire wireComponent = selectedItem.GetComponent(); - if (wireComponent != null) equippedWire = wireComponent; + Wire wireComponent = selectedItem.GetComponent(); + if (wireComponent != null) equippedWire = wireComponent; + } } Vector2 rightPos = new Vector2(x + width - 130, y + 50); @@ -71,7 +74,7 @@ namespace Barotrauma.Items.Components //outputs are drawn at the right side of the panel, inputs at the left if (c.IsOutput) { - c.Draw(spriteBatch, panel.Item, rightPos, + c.Draw(spriteBatch, panel, rightPos, new Vector2(rightPos.X - GUI.SmallFont.MeasureString(c.Name).X - 20, rightPos.Y + 3), rightWirePos, mouseInRect, equippedWire, @@ -82,7 +85,7 @@ namespace Barotrauma.Items.Components } else { - c.Draw(spriteBatch, panel.Item, leftPos, + c.Draw(spriteBatch, panel, leftPos, new Vector2(leftPos.X + 20, leftPos.Y - 12), leftWirePos, mouseInRect, equippedWire, @@ -96,7 +99,7 @@ namespace Barotrauma.Items.Components if (draggingConnected != null) { - DrawWire(spriteBatch, draggingConnected, draggingConnected.Item, PlayerInput.MousePosition, new Vector2(x + width / 2, y + height), mouseInRect, null); + DrawWire(spriteBatch, draggingConnected, draggingConnected.Item, PlayerInput.MousePosition, new Vector2(x + width / 2, y + height), mouseInRect, null, panel); if (!PlayerInput.LeftButtonHeld()) { @@ -121,7 +124,7 @@ namespace Barotrauma.Items.Components { DrawWire(spriteBatch, equippedWire, equippedWire.Item, new Vector2(x + width / 2, y + height - 100), - new Vector2(x + width / 2, y + height), mouseInRect, null); + new Vector2(x + width / 2, y + height), mouseInRect, null, panel); if (draggingConnected == equippedWire) Inventory.draggingItem = equippedWire.Item; } @@ -135,7 +138,7 @@ namespace Barotrauma.Items.Components } - private void Draw(SpriteBatch spriteBatch, Item item, Vector2 position, Vector2 labelPos, Vector2 wirePosition, bool mouseIn, Wire equippedWire, float wireInterval) + private void Draw(SpriteBatch spriteBatch, ConnectionPanel panel, Vector2 position, Vector2 labelPos, Vector2 wirePosition, bool mouseIn, Wire equippedWire, float wireInterval) { //spriteBatch.DrawString(GUI.SmallFont, Name, new Vector2(labelPos.X, labelPos.Y-10), Color.White); GUI.DrawString(spriteBatch, labelPos, Name, IsPower ? Color.Red : Color.White, Color.Black, 0, GUI.SmallFont); @@ -149,7 +152,7 @@ namespace Barotrauma.Items.Components Connection recipient = Wires[i].OtherConnection(this); - DrawWire(spriteBatch, Wires[i], (recipient == null) ? Wires[i].Item : recipient.item, position, wirePosition, mouseIn, equippedWire); + DrawWire(spriteBatch, Wires[i], (recipient == null) ? Wires[i].Item : recipient.item, position, wirePosition, mouseIn, equippedWire, panel); wirePosition.Y += wireInterval; } @@ -165,9 +168,9 @@ namespace Barotrauma.Items.Components if (index > -1 && !Wires.Contains(draggingConnected)) { - bool alreadyConnected = draggingConnected.IsConnectedTo(item); + bool alreadyConnected = draggingConnected.IsConnectedTo(panel.Item); - draggingConnected.RemoveConnection(item); + draggingConnected.RemoveConnection(panel.Item); if (draggingConnected.Connect(this, !alreadyConnected, true)) { @@ -198,7 +201,7 @@ namespace Barotrauma.Items.Components } - private static void DrawWire(SpriteBatch spriteBatch, Wire wire, Item item, Vector2 end, Vector2 start, bool mouseIn, Wire equippedWire) + private static void DrawWire(SpriteBatch spriteBatch, Wire wire, Item item, Vector2 end, Vector2 start, bool mouseIn, Wire equippedWire, ConnectionPanel panel) { if (draggingConnected == wire) { @@ -225,7 +228,7 @@ namespace Barotrauma.Items.Components Vector2.Distance(end, PlayerInput.MousePosition) < 20.0f || new Rectangle((start.X < end.X) ? textX - 100 : textX, (int)start.Y - 5, 100, 14).Contains(PlayerInput.MousePosition)); - string label = wire.Locked ? item.Name + "\n" + TextManager.Get("ConnectionLocked") : item.Name; + string label = wire.Locked || panel.Locked ? item.Name + "\n" + TextManager.Get("ConnectionLocked") : item.Name; GUI.DrawString(spriteBatch, new Vector2(start.X < end.X ? textX - GUI.SmallFont.MeasureString(label).X : textX, start.Y - 5.0f), @@ -261,7 +264,7 @@ namespace Barotrauma.Items.Components { ConnectionPanel.HighlightedWire = wire; - if (!wire.Locked) + if (!wire.Locked && (!panel.Locked || Screen.Selected == GameMain.SubEditorScreen)) { //start dragging the wire if (PlayerInput.LeftButtonHeld()) draggingConnected = wire; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs index aec56368e..88a2471b8 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Signal/ConnectionPanel.cs @@ -14,7 +14,14 @@ namespace Barotrauma.Items.Components public List Connections; - Character user; + private Character user; + + [Serialize(false, true), Editable(ToolTip = "Locked connection panels cannot be rewired in-game.")] + public bool Locked + { + get; + set; + } public ConnectionPanel(Item item, XElement element) : base(item, element) @@ -180,6 +187,9 @@ namespace Barotrauma.Items.Components } } } + + //don't allow rewiring locked panels + if (Locked) return; item.CreateServerEvent(this);