(9a14162c6) Disabled spontaneous deterioration on items that are not being used. TODO: adjust all deterioration rates and delays

This commit is contained in:
Joonas Rikkonen
2019-04-07 21:43:35 +03:00
parent 3d3975e07c
commit be76bd53e9
9 changed files with 82 additions and 20 deletions
@@ -17,8 +17,8 @@ namespace Barotrauma.Items.Components
{ {
get { return outputContainer; } get { return outputContainer; }
} }
public Deconstructor(Item item, XElement element) public Deconstructor(Item item, XElement element)
: base(item, element) : base(item, element)
{ {
InitProjSpecific(element); InitProjSpecific(element);
@@ -53,7 +53,13 @@ namespace Barotrauma.Items.Components
return; return;
} }
if (voltage < minVoltage) return; if (voltage < minVoltage) { return; }
var repairable = item.GetComponent<Repairable>();
if (repairable != null)
{
repairable.LastActiveTime = (float)Timing.TotalTime + 10.0f;
}
ApplyStatusEffects(ActionType.OnActive, deltaTime, null); ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
@@ -73,8 +79,7 @@ namespace Barotrauma.Items.Components
float percentageHealth = targetItem.Condition / targetItem.Prefab.Health; float percentageHealth = targetItem.Condition / targetItem.Prefab.Health;
if (percentageHealth <= deconstructProduct.MinCondition || percentageHealth > deconstructProduct.MaxCondition) continue; if (percentageHealth <= deconstructProduct.MinCondition || percentageHealth > deconstructProduct.MaxCondition) continue;
var itemPrefab = MapEntityPrefab.Find(null, deconstructProduct.ItemIdentifier) as ItemPrefab; if (!(MapEntityPrefab.Find(null, deconstructProduct.ItemIdentifier) is ItemPrefab itemPrefab))
if (itemPrefab == null)
{ {
DebugConsole.ThrowError("Tried to deconstruct item \"" + targetItem.Name + "\" but couldn't find item prefab \"" + deconstructProduct.ItemIdentifier + "\"!"); DebugConsole.ThrowError("Tried to deconstruct item \"" + targetItem.Name + "\" but couldn't find item prefab \"" + deconstructProduct.ItemIdentifier + "\"!");
continue; continue;
@@ -113,7 +113,7 @@ namespace Barotrauma.Items.Components
#endif #endif
} }
voltage = 0.0f; voltage -= deltaTime;
} }
private void UpdatePropellerDamage(float deltaTime) private void UpdatePropellerDamage(float deltaTime)
@@ -18,14 +18,14 @@ namespace Barotrauma.Items.Components
private FabricationRecipe fabricatedItem; private FabricationRecipe fabricatedItem;
private float timeUntilReady; private float timeUntilReady;
private float requiredTime; private float requiredTime;
private Character user; private Character user;
private ItemContainer inputContainer, outputContainer; private ItemContainer inputContainer, outputContainer;
private float progressState; private float progressState;
public Fabricator(Item item, XElement element) public Fabricator(Item item, XElement element)
: base(item, element) : base(item, element)
{ {
foreach (XElement subElement in element.Elements()) foreach (XElement subElement in element.Elements())
@@ -174,6 +174,12 @@ namespace Barotrauma.Items.Components
if (voltage < minVoltage) { return; } if (voltage < minVoltage) { return; }
var repairable = item.GetComponent<Repairable>();
if (repairable != null)
{
repairable.LastActiveTime = (float)Timing.TotalTime + 10.0f;
}
ApplyStatusEffects(ActionType.OnActive, deltaTime, null); ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
if (powerConsumption <= 0) { voltage = 1.0f; } if (powerConsumption <= 0) { voltage = 1.0f; }
@@ -81,7 +81,7 @@ namespace Barotrauma.Items.Components
ApplyStatusEffects(ActionType.OnActive, deltaTime, null); ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
} }
voltage = 0.0f; voltage -= deltaTime;
} }
public override bool Pick(Character picker) public override bool Pick(Character picker)
@@ -73,6 +73,7 @@ namespace Barotrauma.Items.Components
public override void UpdateBroken(float deltaTime, Camera cam) public override void UpdateBroken(float deltaTime, Camera cam)
{ {
powerDownTimer += deltaTime; powerDownTimer += deltaTime;
CurrFlow = 0.0f;
} }
private void GetVents() private void GetVents()
@@ -19,10 +19,10 @@ namespace Barotrauma.Items.Components
public float FlowPercentage public float FlowPercentage
{ {
get { return flowPercentage; } get { return flowPercentage; }
set set
{ {
if (!MathUtils.IsValid(flowPercentage)) return; if (!MathUtils.IsValid(flowPercentage)) return;
flowPercentage = MathHelper.Clamp(value,-100.0f,100.0f); flowPercentage = MathHelper.Clamp(value, -100.0f, 100.0f);
flowPercentage = MathUtils.Round(flowPercentage, 1.0f); flowPercentage = MathUtils.Round(flowPercentage, 1.0f);
} }
} }
@@ -86,8 +86,8 @@ namespace Barotrauma.Items.Components
item.CurrentHull.WaterVolume += currFlow; item.CurrentHull.WaterVolume += currFlow;
if (item.CurrentHull.WaterVolume > item.CurrentHull.Volume) { item.CurrentHull.Pressure += 0.5f; } if (item.CurrentHull.WaterVolume > item.CurrentHull.Volume) { item.CurrentHull.Pressure += 0.5f; }
voltage = 0.0f; voltage -= deltaTime;
} }
partial void UpdateProjSpecific(float deltaTime); partial void UpdateProjSpecific(float deltaTime);
@@ -15,6 +15,8 @@ namespace Barotrauma.Items.Components
private float deteriorationTimer; private float deteriorationTimer;
public float LastActiveTime;
[Serialize(0.0f, true), Editable(MinValueFloat = 0.0f, MaxValueFloat = 100.0f, DecimalCount = 2, ToolTip = "How fast the condition of the item deteriorates per second.")] [Serialize(0.0f, true), Editable(MinValueFloat = 0.0f, MaxValueFloat = 100.0f, DecimalCount = 2, ToolTip = "How fast the condition of the item deteriorates per second.")]
public float DeteriorationSpeed public float DeteriorationSpeed
{ {
@@ -113,6 +115,8 @@ namespace Barotrauma.Items.Components
{ {
UpdateProjSpecific(deltaTime); UpdateProjSpecific(deltaTime);
if (!ShouldDeteriorate()) { return; }
if (CurrentFixer == null) if (CurrentFixer == null)
{ {
if (item.Condition > 0.0f) if (item.Condition > 0.0f)
@@ -179,8 +183,48 @@ namespace Barotrauma.Items.Components
} }
} }
partial void UpdateProjSpecific(float deltaTime); partial void UpdateProjSpecific(float deltaTime);
private bool ShouldDeteriorate()
{
if (LastActiveTime > Timing.TotalTime) { return true; }
foreach (ItemComponent ic in item.Components)
{
if (ic is PowerTransfer pt)
{
//power transfer items (junction boxes, relays) don't deteriorate if they're no carrying any power
if (Math.Abs(pt.CurrPowerConsumption) < 0.1f) { return false; }
}
else if (ic is Engine engine)
{
//engines don't deteriorate if they're not running
if (Math.Abs(engine.Force) < 1.0f) { return false; }
}
else if (ic is Pump pump)
{
//pumps don't deteriorate if they're not running
if (Math.Abs(pump.FlowPercentage) < 1.0f) { return false; }
}
else if (ic is Reactor reactor)
{
//reactors don't deteriorate if they're not powered up
if (reactor.Temperature < 0.1f) { return false; }
}
else if (ic is OxygenGenerator oxyGenerator)
{
//oxygen generators don't deteriorate if they're not running
if (oxyGenerator.CurrFlow < 0.1f) { return false; }
}
else if (ic is Powered powered)
{
if (powered.Voltage < powered.MinVoltage) { return false; }
}
}
return true;
}
private void UpdateFixAnimation(Character character) private void UpdateFixAnimation(Character character)
{ {
character.AnimController.UpdateUseItem(false, item.WorldPosition + new Vector2(0.0f, 100.0f) * ((item.Condition / item.MaxCondition) % 0.1f)); character.AnimController.UpdateUseItem(false, item.WorldPosition + new Vector2(0.0f, 100.0f) * ((item.Condition / item.MaxCondition) % 0.1f));
@@ -254,7 +254,7 @@ namespace Barotrauma.Items.Components
UpdateAITarget(item.AiTarget); UpdateAITarget(item.AiTarget);
} }
voltage = 0.0f; voltage -= deltaTime;
} }
#if CLIENT #if CLIENT
@@ -282,10 +282,17 @@ namespace Barotrauma.Items.Components
{ {
//use linked projectile containers in case they have to react to the turret being launched somehow //use linked projectile containers in case they have to react to the turret being launched somehow
//(play a sound, spawn more projectiles) //(play a sound, spawn more projectiles)
Item linkedItem = e as Item; if (!(e is Item linkedItem)) continue;
if (linkedItem == null) continue;
ItemContainer projectileContainer = linkedItem.GetComponent<ItemContainer>(); ItemContainer projectileContainer = linkedItem.GetComponent<ItemContainer>();
if (projectileContainer != null) linkedItem.Use(deltaTime, null); if (projectileContainer != null)
{
linkedItem.Use(deltaTime, null);
var repairable = linkedItem.GetComponent<Repairable>();
if (repairable != null)
{
repairable.LastActiveTime = (float)Timing.TotalTime + 1.0f;
}
}
} }
var projectiles = GetLoadedProjectiles(true); var projectiles = GetLoadedProjectiles(true);
@@ -417,9 +424,8 @@ namespace Barotrauma.Items.Components
int maxProjectileCount = 0; int maxProjectileCount = 0;
foreach (MapEntity e in item.linkedTo) foreach (MapEntity e in item.linkedTo)
{ {
var projectileContainer = e as Item; if (!(e is Item projectileContainer)) continue;
if (projectileContainer == null) continue;
var containedItems = projectileContainer.ContainedItems; var containedItems = projectileContainer.ContainedItems;
if (containedItems != null) if (containedItems != null)
{ {