Unstable 0.17.5.0

This commit is contained in:
Markus Isberg
2022-03-30 01:20:59 +09:00
parent c1b8e5a341
commit 44ded0225a
88 changed files with 2033 additions and 1430 deletions
@@ -5,7 +5,6 @@ using System;
using System.Collections.Generic;
using System.Globalization;
using System.Xml.Linq;
using Barotrauma.Extensions;
namespace Barotrauma.Items.Components
{
@@ -13,6 +12,7 @@ namespace Barotrauma.Items.Components
{
[Editable]
public LimbType LimbType { get; set; }
[Editable]
public Vector2 Position { get; set; }
@@ -33,7 +33,7 @@ namespace Barotrauma.Items.Components
partial class Controller : ItemComponent, IServerSerializable
{
//where the limbs of the user should be positioned when using the controller
private readonly List<LimbPos> limbPositions;
private readonly List<LimbPos> limbPositions = new List<LimbPos>();
private Direction dir;
@@ -117,38 +117,9 @@ namespace Barotrauma.Items.Components
public Controller(Item item, ContentXElement element)
: base(item, element)
{
limbPositions = new List<LimbPos>();
userPos = element.GetAttributeVector2("UserPos", Vector2.Zero);
Enum.TryParse(element.GetAttributeString("direction", "None"), out dir);
foreach (var subElement in element.Elements())
{
if (subElement.Name != "limbposition") { continue; }
string limbStr = subElement.GetAttributeString("limb", "");
if (!Enum.TryParse(subElement.GetAttribute("limb").Value, out LimbType limbType))
{
DebugConsole.ThrowError($"Error in item \"{item.Name}\" - {limbStr} is not a valid limb type.");
}
else
{
LimbPos limbPos = new LimbPos(limbType,
subElement.GetAttributeVector2("position", Vector2.Zero),
subElement.GetAttributeBool("allowusinglimb", false));
limbPositions.Add(limbPos);
if (!limbPos.AllowUsingLimb)
{
if (limbType == LimbType.RightHand || limbType == LimbType.RightForearm || limbType == LimbType.RightArm ||
limbType == LimbType.LeftHand || limbType == LimbType.LeftForearm || limbType == LimbType.LeftArm)
{
AllowAiming = false;
}
}
}
}
LoadLimbPositions(element);
IsActive = true;
}
@@ -529,5 +500,63 @@ namespace Barotrauma.Items.Components
}
partial void HideHUDs(bool value);
public override XElement Save(XElement parentElement)
{
return SaveLimbPositions(base.Save(parentElement));
}
public override void Load(ContentXElement componentElement, bool usePrefabValues, IdRemap idRemap)
{
base.Load(componentElement, usePrefabValues, idRemap);
if (GameMain.GameSession?.GameMode?.Preset == GameModePreset.TestMode)
{
LoadLimbPositions(componentElement);
}
}
private XElement SaveLimbPositions(XElement element)
{
if (Screen.Selected == GameMain.SubEditorScreen)
{
foreach (var limbPos in limbPositions)
{
element.Add(new XElement("limbposition",
new XAttribute("limb", limbPos.LimbType),
new XAttribute("position", XMLExtensions.Vector2ToString(limbPos.Position)),
new XAttribute("allowusinglimb", limbPos.AllowUsingLimb)));
}
}
return element;
}
private void LoadLimbPositions(XElement element)
{
limbPositions.Clear();
foreach (var subElement in element.Elements())
{
if (subElement.Name != "limbposition") { continue; }
string limbStr = subElement.GetAttributeString("limb", "");
if (!Enum.TryParse(subElement.GetAttribute("limb").Value, out LimbType limbType))
{
DebugConsole.ThrowError($"Error in item \"{item.Name}\" - {limbStr} is not a valid limb type.");
}
else
{
LimbPos limbPos = new LimbPos(limbType,
subElement.GetAttributeVector2("position", Vector2.Zero),
subElement.GetAttributeBool("allowusinglimb", false));
limbPositions.Add(limbPos);
if (!limbPos.AllowUsingLimb)
{
if (limbType == LimbType.RightHand || limbType == LimbType.RightForearm || limbType == LimbType.RightArm ||
limbType == LimbType.LeftHand || limbType == LimbType.LeftForearm || limbType == LimbType.LeftArm)
{
AllowAiming = false;
}
}
}
}
}
}
}
@@ -80,6 +80,8 @@ namespace Barotrauma.Items.Components
private float progressState;
private readonly Dictionary<uint, int> fabricationLimits = new Dictionary<uint, int>();
public Fabricator(Item item, ContentXElement element)
: base(item, element)
{
@@ -105,6 +107,10 @@ namespace Barotrauma.Items.Components
}
}
fabricationRecipes.Add(recipe.RecipeHash, recipe);
if (recipe.FabricationLimitMax >= 0)
{
fabricationLimits.Add(recipe.RecipeHash, Rand.Range(recipe.FabricationLimitMin, recipe.FabricationLimitMax + 1));
}
}
}
this.fabricationRecipes = fabricationRecipes.ToImmutableDictionary();
@@ -244,7 +250,7 @@ namespace Barotrauma.Items.Components
itemList.Enabled = true;
if (activateButton != null)
{
activateButton.Text = TextManager.Get("FabricatorCreate");
activateButton.Text = TextManager.Get(CreateButtonText);
}
#endif
fabricatedItem = null;
@@ -400,8 +406,22 @@ namespace Barotrauma.Items.Components
quality = GetFabricatedItemQuality(fabricatedItem, user);
}
int amount = (int)fabricationitemAmount.Value;
if (fabricationLimits.ContainsKey(fabricatedItem.RecipeHash))
{
if (amount > fabricationLimits[fabricatedItem.RecipeHash])
{
amount = fabricationLimits[fabricatedItem.RecipeHash];
fabricationLimits[fabricatedItem.RecipeHash] = 0;
}
else
{
fabricationLimits[fabricatedItem.RecipeHash] -= amount;
}
}
var tempUser = user;
for (int i = 0; i < (int)fabricationitemAmount.Value; i++)
for (int i = 0; i < amount; i++)
{
float outCondition = fabricatedItem.OutCondition;
GameAnalyticsManager.AddDesignEvent("ItemFabricated:" + (GameMain.GameSession?.GameMode?.Preset.Identifier.Value ?? "none") + ":" + fabricatedItem.TargetItem.Identifier);
@@ -535,6 +555,11 @@ namespace Barotrauma.Items.Components
}
}
if (fabricationLimits.TryGetValue(fabricableItem.RecipeHash, out int amount) && amount <= 0)
{
return false;
}
return fabricableItem.RequiredItems.All(requiredItem =>
{
int availablePrefabsAmount = 0;
@@ -698,7 +723,6 @@ namespace Barotrauma.Items.Components
componentElement.Add(new XAttribute("fabricateditemidentifier", fabricatedItem.TargetItem.Identifier));
componentElement.Add(new XAttribute("savedtimeuntilready", timeUntilReady.ToString("G", CultureInfo.InvariantCulture)));
componentElement.Add(new XAttribute("savedrequiredtime", requiredTime.ToString("G", CultureInfo.InvariantCulture)));
}
return componentElement;
}