v0.10.5.1

This commit is contained in:
Juan Pablo Arce
2020-09-22 11:31:56 -03:00
parent 44032d0ae0
commit 0002ad2c50
343 changed files with 12276 additions and 5023 deletions
@@ -151,6 +151,7 @@ namespace Barotrauma.Items.Components
if (user == null
|| user.Removed
|| user.SelectedConstruction != item
|| item.ParentInventory != null
|| !user.CanInteractWith(item)
|| (UsableIn == UseEnvironment.Water && !user.AnimController.InWater)
|| (UsableIn == UseEnvironment.Air && user.AnimController.InWater))
@@ -221,7 +222,7 @@ namespace Barotrauma.Items.Components
user.AnimController.ResetPullJoints();
if (dir != 0) user.AnimController.TargetDir = dir;
if (dir != 0) { user.AnimController.TargetDir = dir; }
foreach (LimbPos lb in limbPositions)
{
@@ -14,7 +14,7 @@ namespace Barotrauma.Items.Components
private float maxForce;
private Attack propellerDamage;
private readonly Attack propellerDamage;
private float damageTimer;
@@ -24,6 +24,8 @@ namespace Barotrauma.Items.Components
private float controlLockTimer;
public Character User;
[Editable(0.0f, 10000000.0f),
Serialize(2000.0f, true, description: "The amount of force exerted on the submarine when the engine is operating at full power.")]
public float MaxForce
@@ -106,6 +108,11 @@ namespace Barotrauma.Items.Components
{
//arbitrary multiplier that was added to changes in submarine mass without having to readjust all engines
float forceMultiplier = 0.1f;
if (User != null)
{
forceMultiplier *= MathHelper.Lerp(0.5f, 2.0f, (float)Math.Sqrt(User.GetSkillLevel("helm") / 100));
}
float voltageFactor = MinVoltage <= 0.0f ? 1.0f : Math.Min(Voltage / MinVoltage, 1.0f);
Vector2 currForce = new Vector2(force * maxForce * forceMultiplier * voltageFactor, 0.0f);
//less effective when in a bad condition
@@ -193,6 +200,7 @@ namespace Barotrauma.Items.Components
{
controlLockTimer = 0.1f;
targetForce = MathHelper.Clamp(tempForce, -100.0f, 100.0f);
User = sender;
}
}
}
@@ -2,6 +2,7 @@
using Microsoft.Xna.Framework;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Xml.Linq;
@@ -15,6 +16,9 @@ namespace Barotrauma.Items.Components
private float timeUntilReady;
private float requiredTime;
private string savedFabricatedItem;
private float savedTimeUntilReady, savedRequiredTime;
private bool hasPower;
private Character user;
@@ -46,6 +50,7 @@ namespace Barotrauma.Items.Components
if (state == value) { return; }
state = value;
#if SERVER
serverEventId++;
item.CreateServerEvent(this);
#endif
}
@@ -158,8 +163,8 @@ namespace Barotrauma.Items.Components
private void StartFabricating(FabricationRecipe selectedItem, Character user)
{
if (selectedItem == null) return;
if (!outputContainer.Inventory.IsEmpty()) return;
if (selectedItem == null) { return; }
if (!outputContainer.Inventory.IsEmpty()) { return; }
#if CLIENT
itemList.Enabled = false;
@@ -194,14 +199,23 @@ namespace Barotrauma.Items.Components
private void CancelFabricating(Character user = null)
{
if (fabricatedItem == null) { return; }
IsActive = false;
fabricatedItem = null;
this.user = null;
currPowerConsumption = 0.0f;
progressState = 0.0f;
timeUntilReady = 0.0f;
inputContainer.Inventory.Locked = false;
outputContainer.Inventory.Locked = false;
if (GameMain.NetworkMember?.IsServer ?? true)
{
State = FabricatorState.Stopped;
}
if (fabricatedItem == null) { return; }
fabricatedItem = null;
#if CLIENT
itemList.Enabled = true;
if (activateButton != null)
@@ -209,17 +223,6 @@ namespace Barotrauma.Items.Components
activateButton.Text = TextManager.Get("FabricatorCreate");
}
#endif
progressState = 0.0f;
timeUntilReady = 0.0f;
inputContainer.Inventory.Locked = false;
outputContainer.Inventory.Locked = false;
if (GameMain.NetworkMember?.IsServer ?? true)
{
State = FabricatorState.Stopped;
}
#if SERVER
if (user != null)
{
@@ -279,13 +282,13 @@ namespace Barotrauma.Items.Components
{
for (int i = 0; i < ingredient.Amount; i++)
{
var availableItem = availableIngredients.FirstOrDefault(it => it != null && it.Prefab == ingredient.ItemPrefab && it.Condition >= ingredient.ItemPrefab.Health * ingredient.MinCondition);
var availableItem = availableIngredients.FirstOrDefault(it => it != null && ingredient.ItemPrefabs.Contains(it.Prefab) && it.ConditionPercentage >= ingredient.MinCondition * 100.0f);
if (availableItem == null) { continue; }
//Item4 = use condition bool
if (ingredient.UseCondition && availableItem.Condition - ingredient.ItemPrefab.Health * ingredient.MinCondition > 0.0f) //Leave it behind with reduced condition if it has enough to stay above 0
if (ingredient.UseCondition && availableItem.ConditionPercentage - ingredient.MinCondition * 100 > 0.0f) //Leave it behind with reduced condition if it has enough to stay above 0
{
availableItem.Condition -= ingredient.ItemPrefab.Health * ingredient.MinCondition;
availableItem.Condition -= availableItem.Prefab.Health * ingredient.MinCondition;
continue;
}
availableIngredients.Remove(availableItem);
@@ -366,7 +369,8 @@ namespace Barotrauma.Items.Components
public float FabricationDegreeOfSuccess(Character character, List<Skill> skills)
{
if (skills.Count == 0) return 1.0f;
if (skills.Count == 0) { return 1.0f; }
if (character == null) { return 0.0f; }
float skillSum = (from t in skills let characterLevel = character.GetSkillLevel(t.Identifier) select (characterLevel - (t.Level * SkillRequirementMultiplier))).Sum();
float average = skillSum / skills.Count;
@@ -461,8 +465,53 @@ namespace Barotrauma.Items.Components
{
return
item != null &&
item.prefab == requiredItem.ItemPrefab &&
requiredItem.ItemPrefabs.Contains(item.prefab) &&
item.Condition / item.Prefab.Health >= requiredItem.MinCondition;
}
public override XElement Save(XElement parentElement)
{
var componentElement = base.Save(parentElement);
if (fabricatedItem != null)
{
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;
}
public override void Load(XElement componentElement, bool usePrefabValues)
{
base.Load(componentElement, usePrefabValues);
savedFabricatedItem = componentElement.GetAttributeString("fabricateditemidentifier", "");
savedTimeUntilReady = componentElement.GetAttributeFloat("savedtimeuntilready", 0.0f);
savedRequiredTime = componentElement.GetAttributeFloat("savedrequiredtime", 0.0f);
}
public override void OnMapLoaded()
{
if (string.IsNullOrEmpty(savedFabricatedItem)) { return; }
inputContainer?.OnMapLoaded();
outputContainer?.OnMapLoaded();
var recipe = fabricationRecipes.Find(r => r.TargetItem.Identifier == savedFabricatedItem);
if (recipe == null)
{
DebugConsole.ThrowError("Error while loading a fabricator. Can't continue fabricating \"" + savedFabricatedItem + "\" (matching recipe not found).");
}
else
{
#if CLIENT
SelectItem(null, recipe, savedRequiredTime);
#endif
StartFabricating(recipe, user: null);
timeUntilReady = savedTimeUntilReady;
requiredTime = savedRequiredTime;
}
savedFabricatedItem = null;
}
}
}
@@ -11,7 +11,8 @@ namespace Barotrauma.Items.Components
{
partial class Reactor : Powered, IServerSerializable, IClientSerializable
{
const float NetworkUpdateInterval = 0.5f;
const float NetworkUpdateIntervalHigh = 0.5f;
const float NetworkUpdateIntervalLow = 10.0f;
//the rate at which the reactor is being run on (higher rate -> higher temperature)
private float fissionRate;
@@ -64,17 +65,18 @@ namespace Barotrauma.Items.Components
}
}
private Character lastAIUser;
public Character LastAIUser { get; private set; }
private Character lastUser;
private Character LastUser
public Character LastUser
{
get { return lastUser; }
set
private set
{
if (lastUser == value) return;
if (lastUser == value) { return; }
lastUser = value;
degreeOfSuccess = lastUser == null ? 0.0f : DegreeOfSuccess(lastUser);
LastUserWasPlayer = lastUser.IsPlayer;
}
}
@@ -176,6 +178,8 @@ namespace Barotrauma.Items.Components
[Serialize(0.0f, true)]
public float AvailableFuel { get; set; }
public bool LastUserWasPlayer { get; private set; }
public Reactor(Item item, XElement element)
: base(item, element)
{
@@ -207,13 +211,13 @@ namespace Barotrauma.Items.Components
//if an AI character was using the item on the previous frame but not anymore, turn autotemp on
// (= bots turn autotemp back on when leaving the reactor)
if (lastAIUser != null)
if (LastAIUser != null)
{
if (lastAIUser.SelectedConstruction != item && lastAIUser.CanInteractWith(item))
if (LastAIUser.SelectedConstruction != item && LastAIUser.CanInteractWith(item))
{
AutoTemp = true;
unsentChanges = true;
lastAIUser = null;
LastAIUser = null;
}
}
@@ -309,10 +313,15 @@ namespace Barotrauma.Items.Components
if (fissionRate > 0.0f)
{
foreach (Item item in item.ContainedItems)
var containedItems = item.OwnInventory?.Items;
if (containedItems != null)
{
if (!item.HasTag("reactorfuel")) continue;
item.Condition -= fissionRate / 100.0f * fuelConsumptionRate * deltaTime;
foreach (Item item in containedItems)
{
if (item == null) { continue; }
if (!item.HasTag("reactorfuel")) { continue; }
item.Condition -= fissionRate / 100.0f * fuelConsumptionRate * deltaTime;
}
}
if (item.CurrentHull != null)
@@ -337,6 +346,7 @@ namespace Barotrauma.Items.Components
item.SendSignal(0, ((int)(temperature * 100.0f)).ToString(), "temperature_out", null);
item.SendSignal(0, ((int)-CurrPowerConsumption).ToString(), "power_value_out", null);
item.SendSignal(0, ((int)load).ToString(), "load_value_out", null);
item.SendSignal(0, ((int)AvailableFuel).ToString(), "fuel_out", null);
UpdateFailures(deltaTime);
#if CLIENT
@@ -344,9 +354,13 @@ namespace Barotrauma.Items.Components
#endif
AvailableFuel = 0.0f;
sendUpdateTimer = Math.Max(sendUpdateTimer - deltaTime, 0.0f);
sendUpdateTimer -= deltaTime;
#if CLIENT
if (unsentChanges && sendUpdateTimer <= 0.0f)
#else
if (sendUpdateTimer < -NetworkUpdateIntervalLow || (unsentChanges && sendUpdateTimer <= 0.0f))
#endif
{
#if SERVER
if (GameMain.Server != null)
@@ -360,7 +374,7 @@ namespace Barotrauma.Items.Components
item.CreateClientEvent(this);
}
#endif
sendUpdateTimer = NetworkUpdateInterval;
sendUpdateTimer = NetworkUpdateIntervalHigh;
unsentChanges = false;
}
}
@@ -398,8 +412,8 @@ namespace Barotrauma.Items.Components
private bool TooMuchFuel()
{
var containedItems = item.ContainedItems;
if (containedItems != null && containedItems.Count() <= 1) { return false; }
var containedItems = item.OwnInventory?.Items;
if (containedItems != null && containedItems.Count(i => i != null) <= 1) { return false; }
//get the amount of heat we'd generate if the fission rate was at the low end of the optimal range
float minimumHeat = GetGeneratedHeat(optimalFissionRate.X);
@@ -516,12 +530,12 @@ namespace Barotrauma.Items.Components
fireTimer = 0.0f;
meltDownTimer = 0.0f;
var containedItems = item.ContainedItems;
var containedItems = item.OwnInventory?.Items;
if (containedItems != null)
{
foreach (Item containedItem in containedItems)
{
if (containedItem == null) continue;
if (containedItem == null) { continue; }
containedItem.Condition = 0.0f;
}
}
@@ -583,15 +597,19 @@ namespace Barotrauma.Items.Components
else if (TooMuchFuel())
{
var container = item.GetComponent<ItemContainer>();
foreach (Item item in item.ContainedItems)
var containedItems = item.OwnInventory?.Items;
if (containedItems != null)
{
if (item != null && container.ContainableItems.Any(ri => ri.MatchesItem(item)))
foreach (Item item in containedItems)
{
if (!character.Inventory.TryPutItem(item, character, allowedSlots: item.AllowedSlots))
if (item != null && container.ContainableItems.Any(ri => ri.MatchesItem(item)))
{
item.Drop(character);
if (!character.Inventory.TryPutItem(item, character, allowedSlots: item.AllowedSlots))
{
item.Drop(character);
}
break;
}
break;
}
}
}
@@ -599,7 +617,7 @@ namespace Barotrauma.Items.Components
if (objective.Override)
{
if (lastUser != null && lastUser != character && lastUser != lastAIUser)
if (lastUser != null && lastUser != character && lastUser != LastAIUser)
{
if (lastUser.SelectedConstruction == item)
{
@@ -607,8 +625,12 @@ namespace Barotrauma.Items.Components
}
}
}
else if (LastUserWasPlayer)
{
return true;
}
LastUser = lastAIUser = character;
LastUser = LastAIUser = character;
bool prevAutoTemp = autoTemp;
bool prevPowerOn = _powerOn;
@@ -286,7 +286,8 @@ namespace Barotrauma.Items.Components
ApplyStatusEffects(ActionType.OnActive, deltaTime, null);
float userSkill = 0.0f;
if (user != null && (user.SelectedConstruction == item || item.linkedTo.Contains(user.SelectedConstruction)))
if (user != null && controlledSub != null &&
(user.SelectedConstruction == item || item.linkedTo.Contains(user.SelectedConstruction)))
{
userSkill = user.GetSkillLevel("helm") / 100.0f;
}
@@ -298,7 +299,9 @@ namespace Barotrauma.Items.Components
}
else
{
if (user != null && user.Info != null && user.SelectedConstruction == item)
if (user != null && user.Info != null &&
user.SelectedConstruction == item &&
controlledSub != null && controlledSub.Velocity.LengthSquared() > 0.01f)
{
IncreaseSkillLevel(user, deltaTime);
}
@@ -320,13 +323,13 @@ namespace Barotrauma.Items.Components
}
}
}
item.SendSignal(0, targetVelocity.X.ToString(CultureInfo.InvariantCulture), "velocity_x_out", null);
item.SendSignal(0, targetVelocity.X.ToString(CultureInfo.InvariantCulture), "velocity_x_out", user);
float targetLevel = -targetVelocity.Y;
targetLevel += (neutralBallastLevel - 0.5f) * 100.0f;
item.SendSignal(0, targetLevel.ToString(CultureInfo.InvariantCulture), "velocity_y_out", null);
item.SendSignal(0, targetLevel.ToString(CultureInfo.InvariantCulture), "velocity_y_out", user);
}
private void IncreaseSkillLevel(Character user, float deltaTime)
@@ -335,12 +338,11 @@ namespace Barotrauma.Items.Components
// Do not increase the helm skill when "steering" the sub in an outpost level
if (GameMain.GameSession?.Campaign != null && Level.IsLoadedOutpost) { return; }
float userSkill = user.GetSkillLevel("helm") / 100.0f;
float userSkill = Math.Max(user.GetSkillLevel("helm"), 1.0f) / 100.0f;
user.Info.IncreaseSkillLevel(
"helm",
SkillSettings.Current.SkillIncreasePerSecondWhenSteering / Math.Max(userSkill, 1.0f) * deltaTime,
SkillSettings.Current.SkillIncreasePerSecondWhenSteering / userSkill * deltaTime,
user.WorldPosition + Vector2.UnitY * 150.0f);
}
private void UpdateAutoPilot(float deltaTime)
@@ -599,6 +601,7 @@ namespace Barotrauma.Items.Components
}
break;
case "navigateback":
if (Level.IsLoadedOutpost) { break; }
if (DockingSources.Any(d => d.Docked))
{
item.SendSignal(0, "1", "toggle_docking", sender: null);
@@ -613,6 +616,7 @@ namespace Barotrauma.Items.Components
}
break;
case "navigatetodestination":
if (Level.IsLoadedOutpost) { break; }
if (DockingSources.Any(d => d.Docked))
{
item.SendSignal(0, "1", "toggle_docking", sender: null);