From 3b402cf335aad7b21b64c66c4ae6e2daf7116755 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Tue, 19 Mar 2019 13:23:11 +0200 Subject: [PATCH] d9e5368...df7366c commit df7366c3d0db4c5cee4d0db33a0eb2ab5c7e28e9 Author: Joonas Rikkonen Date: Tue Mar 19 13:22:17 2019 +0200 Save all of the inventory slot indices an item is in, instead of just the first one. Otherwise inventories can get messed up because of equipped items: for example, a revolver may be equipped in a hand slot and the 3rd Any-slot, but just putting it in the and slot during loading will cause it to be placed into the hand slot and the first free Any-slot, potentially preventing whatever was actually in the first Any-slot to be placed in the inventory. Closes #1301 commit 4eeeb3531fe88aeb0dddca2b407ec6f260ea1e8e Author: Joonas Rikkonen Date: Tue Mar 19 12:55:27 2019 +0200 Fixed sub/mode voting not being enabled when changing the setting after the server has been started. commit 7f2118b950748d30cc21869cfff9d69fd5c77b81 Author: itchyOwl Date: Tue Mar 19 12:41:09 2019 +0200 Doors and hatches can now be repaired also with wrenches. Changing the required equipment for anything but door components doesn't have any effect anymore. TODO: remove/disable editing the field when it cannot be edited. --- .../Source/Screens/NetLobbyScreen.cs | 2 +- .../Source/Characters/Character.cs | 9 ++- .../Source/Characters/CharacterInfo.cs | 27 ++++++++- .../Source/Items/Components/Door.cs | 36 ++++++++++++ .../Source/Items/Components/ItemComponent.cs | 56 ++++++++++--------- .../Source/Networking/ServerSettings.cs | 22 +++++++- 6 files changed, 118 insertions(+), 34 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs index c8882034b..8f04f4235 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs @@ -1191,7 +1191,7 @@ namespace Barotrauma if (sub.HasTag(SubmarineTag.Shuttle)) { - new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), frame.RectTransform, Anchor.CenterRight), + new GUITextBlock(new RectTransform(new Vector2(0.5f, 1.0f), frame.RectTransform, Anchor.CenterRight) { RelativeOffset = new Vector2(0.1f, 0.0f) }, TextManager.Get("Shuttle"), textAlignment: Alignment.CenterRight, font: GUI.SmallFont) { TextColor = subTextBlock.TextColor * 0.8f, diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs index 02752edfe..cb053d161 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Character.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Character.cs @@ -2530,7 +2530,14 @@ namespace Barotrauma { item.Submarine = inventory.Owner.Submarine; var itemElement = item.Save(parentElement); - itemElement.Add(new XAttribute("i", Array.IndexOf(inventory.Items, item))); + + List slotIndices = new List(); + for (int i = 0; i < inventory.Capacity; i++) + { + if (inventory.Items[i] == item) { slotIndices.Add(i); } + } + + itemElement.Add(new XAttribute("i", string.Join(",", slotIndices))); foreach (ItemContainer container in item.GetComponents()) { diff --git a/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs b/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs index 574e99435..f1910b6ab 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/CharacterInfo.cs @@ -802,12 +802,33 @@ namespace Barotrauma foreach (XElement itemElement in element.Elements()) { var newItem = Item.Load(itemElement, inventory.Owner.Submarine); - int slotIndex = itemElement.GetAttributeInt("i", 0); - if (newItem == null) continue; + if (newItem == null) { continue; } + + int[] slotIndices = itemElement.GetAttributeIntArray("i", new int[] { 0 }); + if (!slotIndices.Any()) + { + DebugConsole.ThrowError("Invalid inventory data in character \"" + Name + "\" - no slot indices found"); + continue; + } SpawnInventoryItemProjSpecific(newItem); - inventory.TryPutItem(newItem, slotIndex, false, false, null); + inventory.TryPutItem(newItem, slotIndices[0], false, false, null); + + //force the item to the correct slots + // e.g. putting the item in a hand slot will also put it in the first available Any-slot, + // which may not be where it actually was + for (int i = 0; i < inventory.Capacity; i++) + { + if (slotIndices.Contains(i)) + { + inventory.Items[i] = newItem; + } + else if (inventory.Items[i] == newItem) + { + inventory.Items[i] = null; + } + } int itemContainerIndex = 0; var itemContainers = newItem.GetComponents().ToList(); diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs index 91d669c94..a641f86d3 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Door.cs @@ -460,6 +460,42 @@ namespace Barotrauma.Items.Components } } + public override void Load(XElement componentElement) + { + if (componentElement == null) return; + base.Load(componentElement); + var prevRequiredItems = new Dictionary>(requiredItems); + bool overrideRequiredItems = false; + + foreach (XElement subElement in componentElement.Elements()) + { + switch (subElement.Name.ToString().ToLowerInvariant()) + { + case "requireditem": + if (!overrideRequiredItems) requiredItems.Clear(); + overrideRequiredItems = true; + + RelatedItem newRequiredItem = RelatedItem.Load(subElement, item.Name); + if (newRequiredItem == null) continue; + + var prevRequiredItem = prevRequiredItems.ContainsKey(newRequiredItem.Type) ? + prevRequiredItems[newRequiredItem.Type].Find(ri => ri.JoinedIdentifiers == newRequiredItem.JoinedIdentifiers) : null; + if (prevRequiredItem != null) + { + newRequiredItem.statusEffects = prevRequiredItem.statusEffects; + newRequiredItem.Msg = prevRequiredItem.Msg; + } + + if (!requiredItems.ContainsKey(newRequiredItem.Type)) + { + requiredItems[newRequiredItem.Type] = new List(); + } + requiredItems[newRequiredItem.Type].Add(newRequiredItem); + break; + } + } + } + public override void ReceiveSignal(int stepsTaken, string signal, Connection connection, Item source, Character sender, float power = 0.0f, float signalStrength = 1.0f) { if (isStuck) return; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs index cf13d1288..f3208b384 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/ItemComponent.cs @@ -629,7 +629,7 @@ namespace Barotrauma.Items.Components if (!properties.TryGetValue(attribute.Name.ToString().ToLowerInvariant(), out SerializableProperty property)) continue; property.TrySetValue(this, attribute.Value); } -#if CLIENT +#if CLIENT string msg = TextManager.Get(Msg, true); if (msg != null) { @@ -640,36 +640,38 @@ namespace Barotrauma.Items.Components Msg = msg; } #endif - var prevRequiredItems = new Dictionary>(requiredItems); - bool overrideRequiredItems = false; - foreach (XElement subElement in componentElement.Elements()) - { - switch (subElement.Name.ToString().ToLowerInvariant()) - { - case "requireditem": - if (!overrideRequiredItems) requiredItems.Clear(); - overrideRequiredItems = true; + // Only door override required items + //var prevRequiredItems = new Dictionary>(requiredItems); + //bool overrideRequiredItems = false; - RelatedItem newRequiredItem = RelatedItem.Load(subElement, item.Name); - if (newRequiredItem == null) continue; + //foreach (XElement subElement in componentElement.Elements()) + //{ + // switch (subElement.Name.ToString().ToLowerInvariant()) + // { + // case "requireditem": + // if (!overrideRequiredItems) requiredItems.Clear(); + // overrideRequiredItems = true; - var prevRequiredItem = prevRequiredItems.ContainsKey(newRequiredItem.Type) ? - prevRequiredItems[newRequiredItem.Type].Find(ri => ri.JoinedIdentifiers == newRequiredItem.JoinedIdentifiers) : null; - if (prevRequiredItem != null) - { - newRequiredItem.statusEffects = prevRequiredItem.statusEffects; - newRequiredItem.Msg = prevRequiredItem.Msg; - } + // RelatedItem newRequiredItem = RelatedItem.Load(subElement, item.Name); + // if (newRequiredItem == null) continue; - if (!requiredItems.ContainsKey(newRequiredItem.Type)) - { - requiredItems[newRequiredItem.Type] = new List(); - } - requiredItems[newRequiredItem.Type].Add(newRequiredItem); - break; - } - } + // var prevRequiredItem = prevRequiredItems.ContainsKey(newRequiredItem.Type) ? + // prevRequiredItems[newRequiredItem.Type].Find(ri => ri.JoinedIdentifiers == newRequiredItem.JoinedIdentifiers) : null; + // if (prevRequiredItem != null) + // { + // newRequiredItem.statusEffects = prevRequiredItem.statusEffects; + // newRequiredItem.Msg = prevRequiredItem.Msg; + // } + + // if (!requiredItems.ContainsKey(newRequiredItem.Type)) + // { + // requiredItems[newRequiredItem.Type] = new List(); + // } + // requiredItems[newRequiredItem.Type].Add(newRequiredItem); + // break; + // } + //} } /// diff --git a/Barotrauma/BarotraumaShared/Source/Networking/ServerSettings.cs b/Barotrauma/BarotraumaShared/Source/Networking/ServerSettings.cs index 5732a9955..3a4f36a23 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/ServerSettings.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/ServerSettings.cs @@ -513,11 +513,29 @@ namespace Barotrauma.Networking set; } + private SelectionMode subSelectionMode; [Serialize(SelectionMode.Manual, true)] - public SelectionMode SubSelectionMode { get; private set; } + public SelectionMode SubSelectionMode + { + get { return subSelectionMode; } + set + { + subSelectionMode = value; + Voting.AllowSubVoting = subSelectionMode == SelectionMode.Vote; + } + } + private SelectionMode modeSelectionMode; [Serialize(SelectionMode.Manual, true)] - public SelectionMode ModeSelectionMode { get; private set; } + public SelectionMode ModeSelectionMode + { + get { return modeSelectionMode; } + set + { + modeSelectionMode = value; + Voting.AllowModeVoting = modeSelectionMode == SelectionMode.Vote; + } + } public BanList BanList { get; private set; }