d9e5368...df7366c
commit df7366c3d0db4c5cee4d0db33a0eb2ab5c7e28e9 Author: Joonas Rikkonen <poe.regalis@gmail.com> 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 <poe.regalis@gmail.com> 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 <lauri.harkanen@gmail.com> 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.
This commit is contained in:
@@ -1191,7 +1191,7 @@ namespace Barotrauma
|
|||||||
|
|
||||||
if (sub.HasTag(SubmarineTag.Shuttle))
|
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)
|
TextManager.Get("Shuttle"), textAlignment: Alignment.CenterRight, font: GUI.SmallFont)
|
||||||
{
|
{
|
||||||
TextColor = subTextBlock.TextColor * 0.8f,
|
TextColor = subTextBlock.TextColor * 0.8f,
|
||||||
|
|||||||
@@ -2530,7 +2530,14 @@ namespace Barotrauma
|
|||||||
{
|
{
|
||||||
item.Submarine = inventory.Owner.Submarine;
|
item.Submarine = inventory.Owner.Submarine;
|
||||||
var itemElement = item.Save(parentElement);
|
var itemElement = item.Save(parentElement);
|
||||||
itemElement.Add(new XAttribute("i", Array.IndexOf(inventory.Items, item)));
|
|
||||||
|
List<int> slotIndices = new List<int>();
|
||||||
|
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<ItemContainer>())
|
foreach (ItemContainer container in item.GetComponents<ItemContainer>())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -802,12 +802,33 @@ namespace Barotrauma
|
|||||||
foreach (XElement itemElement in element.Elements())
|
foreach (XElement itemElement in element.Elements())
|
||||||
{
|
{
|
||||||
var newItem = Item.Load(itemElement, inventory.Owner.Submarine);
|
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);
|
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;
|
int itemContainerIndex = 0;
|
||||||
var itemContainers = newItem.GetComponents<ItemContainer>().ToList();
|
var itemContainers = newItem.GetComponents<ItemContainer>().ToList();
|
||||||
|
|||||||
@@ -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<RelatedItem.RelationType, List<RelatedItem>>(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<RelatedItem>();
|
||||||
|
}
|
||||||
|
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)
|
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;
|
if (isStuck) return;
|
||||||
|
|||||||
@@ -629,7 +629,7 @@ namespace Barotrauma.Items.Components
|
|||||||
if (!properties.TryGetValue(attribute.Name.ToString().ToLowerInvariant(), out SerializableProperty property)) continue;
|
if (!properties.TryGetValue(attribute.Name.ToString().ToLowerInvariant(), out SerializableProperty property)) continue;
|
||||||
property.TrySetValue(this, attribute.Value);
|
property.TrySetValue(this, attribute.Value);
|
||||||
}
|
}
|
||||||
#if CLIENT
|
#if CLIENT
|
||||||
string msg = TextManager.Get(Msg, true);
|
string msg = TextManager.Get(Msg, true);
|
||||||
if (msg != null)
|
if (msg != null)
|
||||||
{
|
{
|
||||||
@@ -640,36 +640,38 @@ namespace Barotrauma.Items.Components
|
|||||||
Msg = msg;
|
Msg = msg;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
var prevRequiredItems = new Dictionary<RelatedItem.RelationType, List<RelatedItem>>(requiredItems);
|
|
||||||
bool overrideRequiredItems = false;
|
|
||||||
|
|
||||||
foreach (XElement subElement in componentElement.Elements())
|
// Only door override required items
|
||||||
{
|
//var prevRequiredItems = new Dictionary<RelatedItem.RelationType, List<RelatedItem>>(requiredItems);
|
||||||
switch (subElement.Name.ToString().ToLowerInvariant())
|
//bool overrideRequiredItems = false;
|
||||||
{
|
|
||||||
case "requireditem":
|
|
||||||
if (!overrideRequiredItems) requiredItems.Clear();
|
|
||||||
overrideRequiredItems = true;
|
|
||||||
|
|
||||||
RelatedItem newRequiredItem = RelatedItem.Load(subElement, item.Name);
|
//foreach (XElement subElement in componentElement.Elements())
|
||||||
if (newRequiredItem == null) continue;
|
//{
|
||||||
|
// switch (subElement.Name.ToString().ToLowerInvariant())
|
||||||
|
// {
|
||||||
|
// case "requireditem":
|
||||||
|
// if (!overrideRequiredItems) requiredItems.Clear();
|
||||||
|
// overrideRequiredItems = true;
|
||||||
|
|
||||||
var prevRequiredItem = prevRequiredItems.ContainsKey(newRequiredItem.Type) ?
|
// RelatedItem newRequiredItem = RelatedItem.Load(subElement, item.Name);
|
||||||
prevRequiredItems[newRequiredItem.Type].Find(ri => ri.JoinedIdentifiers == newRequiredItem.JoinedIdentifiers) : null;
|
// if (newRequiredItem == null) continue;
|
||||||
if (prevRequiredItem != null)
|
|
||||||
{
|
|
||||||
newRequiredItem.statusEffects = prevRequiredItem.statusEffects;
|
|
||||||
newRequiredItem.Msg = prevRequiredItem.Msg;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!requiredItems.ContainsKey(newRequiredItem.Type))
|
// var prevRequiredItem = prevRequiredItems.ContainsKey(newRequiredItem.Type) ?
|
||||||
{
|
// prevRequiredItems[newRequiredItem.Type].Find(ri => ri.JoinedIdentifiers == newRequiredItem.JoinedIdentifiers) : null;
|
||||||
requiredItems[newRequiredItem.Type] = new List<RelatedItem>();
|
// if (prevRequiredItem != null)
|
||||||
}
|
// {
|
||||||
requiredItems[newRequiredItem.Type].Add(newRequiredItem);
|
// newRequiredItem.statusEffects = prevRequiredItem.statusEffects;
|
||||||
break;
|
// newRequiredItem.Msg = prevRequiredItem.Msg;
|
||||||
}
|
// }
|
||||||
}
|
|
||||||
|
// if (!requiredItems.ContainsKey(newRequiredItem.Type))
|
||||||
|
// {
|
||||||
|
// requiredItems[newRequiredItem.Type] = new List<RelatedItem>();
|
||||||
|
// }
|
||||||
|
// requiredItems[newRequiredItem.Type].Add(newRequiredItem);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|||||||
@@ -513,11 +513,29 @@ namespace Barotrauma.Networking
|
|||||||
set;
|
set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private SelectionMode subSelectionMode;
|
||||||
[Serialize(SelectionMode.Manual, true)]
|
[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)]
|
[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; }
|
public BanList BanList { get; private set; }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user