Unstable v0.15.17.0 (Hex is out of town edition)

This commit is contained in:
Juan Pablo Arce
2021-12-03 13:31:10 -03:00
parent cd5c8f3e13
commit 617d9ede88
245 changed files with 8088 additions and 5842 deletions
@@ -61,14 +61,14 @@ namespace Barotrauma.Items.Components
public IEnumerable<LimbPos> LimbPositions { get { return limbPositions; } }
[Editable, Serialize(false, false, description: "When enabled, the item will continuously send out a 0/1 signal and interacting with it will flip the signal (making the item behave like a switch). When disabled, the item will simply send out 1 when interacted with.")]
[Editable, Serialize(false, false, description: "When enabled, the item will continuously send out a 0/1 signal and interacting with it will flip the signal (making the item behave like a switch). When disabled, the item will simply send out 1 when interacted with.", alwaysUseInstanceValues: true)]
public bool IsToggle
{
get;
set;
}
[Editable, Serialize(false, false, description: "Whether the item is toggled on/off. Only valid if IsToggle is set to true.")]
[Editable, Serialize(false, false, description: "Whether the item is toggled on/off. Only valid if IsToggle is set to true.", alwaysUseInstanceValues: true)]
public bool State
{
get;
@@ -158,10 +158,21 @@ namespace Barotrauma.Items.Components
// In multiplayer, the server handles the deconstruction into new items
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient) { return; }
float amountMultiplier = 1f;
if (user != null && !user.Removed)
{
var abilityTargetItem = new AbilityItem(targetItem);
var abilityTargetItem = new AbilityDeconstructedItem(targetItem, user);
user.CheckTalents(AbilityEffectType.OnItemDeconstructed, abilityTargetItem);
foreach (Character character in Character.GetFriendlyCrew(user))
{
character.CheckTalents(AbilityEffectType.OnItemDeconstructedByAlly, abilityTargetItem);
}
var itemCreationMultiplier = new AbilityValueItem(amountMultiplier, targetItem.Prefab);
user.CheckTalents(AbilityEffectType.OnItemDeconstructedMaterial, itemCreationMultiplier);
amountMultiplier = (int)itemCreationMultiplier.Value;
}
if (targetItem.Prefab.RandomDeconstructionOutput)
@@ -187,18 +198,18 @@ namespace Barotrauma.Items.Components
foreach (DeconstructItem deconstructProduct in products)
{
CreateDeconstructProduct(deconstructProduct, inputItems);
CreateDeconstructProduct(deconstructProduct, inputItems, amountMultiplier);
}
}
else
{
foreach (DeconstructItem deconstructProduct in validDeconstructItems)
{
CreateDeconstructProduct(deconstructProduct, inputItems);
CreateDeconstructProduct(deconstructProduct, inputItems, amountMultiplier);
}
}
void CreateDeconstructProduct(DeconstructItem deconstructProduct, IEnumerable<Item> inputItems)
void CreateDeconstructProduct(DeconstructItem deconstructProduct, IEnumerable<Item> inputItems, float amountMultiplier)
{
float percentageHealth = targetItem.Condition / targetItem.MaxCondition;
@@ -247,19 +258,15 @@ namespace Barotrauma.Items.Components
}
}
int amount = 1;
if (user != null && !user.Removed)
{
var itemsCreated = new AbilityValueItem(amount, targetItem.Prefab);
user.CheckTalents(AbilityEffectType.OnItemDeconstructedMaterial, itemsCreated);
amount = (int)itemsCreated.Value;
// used to spawn items directly into the deconstructor
var itemContainer = new AbilityItemPrefabItem(item, targetItem.Prefab);
user.CheckTalents(AbilityEffectType.OnItemDeconstructedInventory, itemContainer);
}
int amount = (int)amountMultiplier;
for (int i = 0; i < amount; i++)
{
Entity.Spawner.AddToSpawnQueue(itemPrefab, outputContainer.Inventory, condition, onSpawned: (Item spawnedItem) =>
@@ -269,7 +276,17 @@ namespace Barotrauma.Items.Components
for (int i = 0; i < outputContainer.Capacity; i++)
{
var containedItem = outputContainer.Inventory.GetItemAt(i);
if (containedItem?.Combine(spawnedItem, null) ?? false)
if (containedItem?.OwnInventory != null)
{
foreach (Item subItem in containedItem.ContainedItems.ToList())
{
if (subItem.Combine(spawnedItem, null))
{
break;
}
}
}
else if (containedItem?.Combine(spawnedItem, null) ?? false)
{
break;
}
@@ -409,4 +426,15 @@ namespace Barotrauma.Items.Components
inputContainer.Inventory.Locked = IsActive;
}
}
class AbilityDeconstructedItem : AbilityObject, IAbilityItem, IAbilityCharacter
{
public AbilityDeconstructedItem(Item item, Character character)
{
Item = item;
Character = character;
}
public Item Item { get; set; }
public Character Character { get; set; }
}
}
@@ -376,7 +376,7 @@ namespace Barotrauma.Items.Components
int quality = 0;
if (user?.Info != null)
{
foreach (Character character in Character.CharacterList.Where(c => c.TeamID == user.TeamID))
foreach (Character character in Character.GetFriendlyCrew(user))
{
character.CheckTalents(AbilityEffectType.OnAllyItemFabricatedAmount, fabricationValueItem);
}
@@ -433,13 +433,12 @@ namespace Barotrauma.Items.Components
{
float userSkill = user.GetSkillLevel(skill.Identifier);
float addedSkill = skill.Level * SkillSettings.Current.SkillIncreasePerFabricatorRequiredSkill / Math.Max(userSkill, 1.0f);
var addedSkillValue = new AbilityValueString(0f, skill.Identifier);
var addedSkillValue = new AbilityValueString(addedSkill, skill.Identifier);
user.CheckTalents(AbilityEffectType.OnItemFabricationSkillGain, addedSkillValue);
addedSkill += addedSkillValue.Value;
user.Info.IncreaseSkillLevel(
skill.Identifier,
addedSkill);
addedSkillValue.Value);
}
}
@@ -147,16 +147,12 @@ namespace Barotrauma.Items.Components
{
case "water_data_in":
//cheating a bit because water detectors don't actually send the water level
float waterAmount;
if (source.GetComponent<WaterDetector>() == null)
bool fromWaterDetector = source.GetComponent<WaterDetector>() != null;
hullData.ReceivedWaterAmount = null;
if (fromWaterDetector)
{
waterAmount = Rand.Range(0.0f, 1.0f);
hullData.ReceivedWaterAmount = Math.Min(sourceHull.WaterVolume / sourceHull.Volume, 1.0f);
}
else
{
waterAmount = Math.Min(sourceHull.WaterVolume / sourceHull.Volume, 1.0f);
}
hullData.ReceivedWaterAmount = waterAmount;
foreach (var linked in sourceHull.linkedTo)
{
if (!(linked is Hull linkedHull)) { continue; }
@@ -165,7 +161,11 @@ namespace Barotrauma.Items.Components
linkedHullData = new HullData();
hullDatas.Add(linkedHull, linkedHullData);
}
linkedHullData.ReceivedWaterAmount = waterAmount;
linkedHullData.ReceivedWaterAmount = null;
if (fromWaterDetector)
{
linkedHullData.ReceivedWaterAmount = Math.Min(linkedHull.WaterVolume / linkedHull.Volume, 1.0f);
}
}
break;
case "oxygen_data_in":
@@ -186,6 +186,13 @@ namespace Barotrauma.Items.Components
[Serialize(0.0f, true)]
public float CorrectTurbineOutput { get; set; }
[Editable, Serialize(true, true)]
public bool ExplosionDamagesOtherSubs
{
get;
set;
}
public Reactor(Item item, XElement element)
: base(item, element)
{
@@ -544,6 +551,20 @@ namespace Barotrauma.Items.Components
if (item.Condition <= 0.0f) { return; }
if (GameMain.NetworkMember != null && GameMain.NetworkMember.IsClient) { return; }
if (!ExplosionDamagesOtherSubs && (statusEffectLists?.ContainsKey(ActionType.OnBroken) ?? false))
{
foreach (var statusEffect in statusEffectLists[ActionType.OnBroken])
{
foreach (Explosion explosion in statusEffect.Explosions)
{
foreach (Submarine sub in Submarine.Loaded)
{
if (sub != item.Submarine) { explosion.IgnoredSubmarines.Add(sub); }
}
}
}
}
item.Condition = 0.0f;
fireTimer = 0.0f;
meltDownTimer = 0.0f;
@@ -600,7 +621,7 @@ namespace Barotrauma.Items.Components
var container = item.GetComponent<ItemContainer>();
if (objective.SubObjectives.None())
{
var containObjective = AIContainItems<Reactor>(container, character, objective, itemCount: 1, equip: true, removeEmpty: true, spawnItemIfNotFound: character.TeamID == CharacterTeamType.FriendlyNPC, dropItemOnDeselected: true);
var containObjective = AIContainItems<Reactor>(container, character, objective, itemCount: 1, equip: true, removeEmpty: true, spawnItemIfNotFound: !character.IsOnPlayerTeam, dropItemOnDeselected: true);
containObjective.Completed += ReportFuelRodCount;
containObjective.Abandoned += ReportFuelRodCount;
character.Speak(TextManager.Get("DialogReactorFuel"), null, 0.0f, "reactorfuel", 30.0f);