From 78e97097cdf8215196c3284d9febc029d441d948 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 15:28:29 +0200 Subject: [PATCH 01/12] Fixed autorestart counter overlapping with the campaign map in the server lobby screen Closes #57 --- Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs index 4cc72362a..8b1e9e6b4 100644 --- a/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs +++ b/Barotrauma/BarotraumaClient/Source/Screens/NetLobbyScreen.cs @@ -1211,7 +1211,7 @@ namespace Barotrauma var moneyText = new GUITextBlock(new Rectangle(120,0,200,20), "Money", "", Alignment.BottomLeft, Alignment.TopLeft, campaignContainer); moneyText.TextGetter = campaignUI.GetMoney; - var restartText = new GUITextBlock(new Rectangle(-250, -20, 100, 30), "", "", Alignment.BottomRight, Alignment.BottomLeft, campaignContainer); + var restartText = new GUITextBlock(new Rectangle(-backButton.Rect.Width - 30, -10, 130, 30), "", "", Alignment.BottomRight, Alignment.BottomRight, campaignContainer); restartText.Font = GUI.SmallFont; restartText.TextGetter = AutoRestartText; } From 1d4327b69046c1ca9de29e75a78b1ccb0d1f9576 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 15:35:06 +0200 Subject: [PATCH 02/12] Diving suits cover feet (fixes characters receiving damage almost exclusively to their feet when wearing a diving suit) --- .../BarotraumaShared.projitems | 3 +++ .../Content/Items/Diving/DivingSuit.png | Bin 22145 -> 19692 bytes .../Content/Items/Diving/Scooter.png | Bin 0 -> 3389 bytes .../Content/Items/Diving/divinggear.xml | 21 ++++++++++-------- 4 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 Barotrauma/BarotraumaShared/Content/Items/Diving/Scooter.png diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems index 5a8620689..d7f24d232 100644 --- a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems +++ b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems @@ -277,6 +277,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/Barotrauma/BarotraumaShared/Content/Items/Diving/DivingSuit.png b/Barotrauma/BarotraumaShared/Content/Items/Diving/DivingSuit.png index 25eff35ea55c5191cca04cb5a27130ccf8bdf692..dd546dde8b353e75386bb3e01e1a6fe9084ee9be 100644 GIT binary patch literal 19692 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 Ef_hoC-T(jq diff --git a/Barotrauma/BarotraumaShared/Content/Items/Diving/Scooter.png b/Barotrauma/BarotraumaShared/Content/Items/Diving/Scooter.png new file mode 100644 index 0000000000000000000000000000000000000000..c8efbd406d07bd0479ab5455fd8441c2153a2da0 GIT binary patch literal 3389 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 - - + + - - + + + + + + + + - - - @@ -124,11 +127,11 @@ - + - + From 04bcc6b9b1607470c0b4307856d3e44c229aa551 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 15:42:13 +0200 Subject: [PATCH 03/12] Modifications to the damage/armor system: - Armor values aren't reduced from the damage taken, but instead multiply the damage (e.g. an item reduces damage by 10% instead of 10 hp). Now armor doesn't make characters invulnerable to small amounts of damage. - Armoring isn't defined as a single "armor value", but instead there are "damage modifiers" which can be added to items and limbs. The modifiers can only affect specific types of damage and have separate multipliers for the damage amount and bleeding amount. - Having a fire proof item on a limb doesn't make that limb invulnerable to burn damage. Item's that protect against fire now have a damage modifier for the Burn damage type. --- .../BarotraumaShared.projitems | 1 + .../Content/Characters/Carrier/carrier.xml | 5 +- .../Content/Characters/Crawler/crawler.xml | 9 +- .../Content/Characters/Mantis/mantis.xml | 15 ++- .../Content/Characters/Moloch/moloch.xml | 3 +- .../Content/Characters/Watcher/watcher.xml | 3 +- .../Content/Items/Diving/divinggear.xml | 6 +- .../Content/Items/Jobgear/engigear.xml | 11 +- .../Content/Items/Jobgear/securitygear.xml | 11 +- .../Content/Items/Weapons/railgun.xml | 6 +- .../Source/Characters/Attack.cs | 20 ++- .../Source/Characters/DamageModifier.cs | 66 ++++++++++ .../Source/Characters/Limb.cs | 78 ++++++------ .../Source/Items/Components/Projectile.cs | 4 +- .../Source/Items/Components/Wearable.cs | 115 ++++++------------ .../BarotraumaShared/Source/Items/Item.cs | 2 +- .../BarotraumaShared/Source/Map/FireSource.cs | 2 - 17 files changed, 209 insertions(+), 148 deletions(-) create mode 100644 Barotrauma/BarotraumaShared/Source/Characters/DamageModifier.cs diff --git a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems index d7f24d232..b2beaca84 100644 --- a/Barotrauma/BarotraumaShared/BarotraumaShared.projitems +++ b/Barotrauma/BarotraumaShared/BarotraumaShared.projitems @@ -1356,6 +1356,7 @@ + diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml b/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml index 99d366bd0..ec69f90e3 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml @@ -24,12 +24,15 @@ - + + + + diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Crawler/crawler.xml b/Barotrauma/BarotraumaShared/Content/Characters/Crawler/crawler.xml index 7972a2cc5..631ee917a 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Crawler/crawler.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Crawler/crawler.xml @@ -30,17 +30,20 @@ - + + - 0 + + - + + diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Mantis/mantis.xml b/Barotrauma/BarotraumaShared/Content/Characters/Mantis/mantis.xml index d3038cf53..b6f0d3057 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Mantis/mantis.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Mantis/mantis.xml @@ -33,25 +33,28 @@ - + + - + + - + + - + - - + + diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Moloch/moloch.xml b/Barotrauma/BarotraumaShared/Content/Characters/Moloch/moloch.xml index 6fe19a384..aa8e40274 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Moloch/moloch.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Moloch/moloch.xml @@ -19,9 +19,10 @@ - + + diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Watcher/watcher.xml b/Barotrauma/BarotraumaShared/Content/Characters/Watcher/watcher.xml index 7ba3c6a56..d89840630 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Watcher/watcher.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Watcher/watcher.xml @@ -25,9 +25,10 @@ - + + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml b/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml index a35919b7e..cbd95c95d 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml @@ -63,8 +63,7 @@ @@ -73,7 +72,7 @@ - + @@ -142,7 +141,6 @@ - diff --git a/Barotrauma/BarotraumaShared/Content/Items/Jobgear/engigear.xml b/Barotrauma/BarotraumaShared/Content/Items/Jobgear/engigear.xml index a4281f7e1..6856a3bdf 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Jobgear/engigear.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Jobgear/engigear.xml @@ -1,8 +1,7 @@  @@ -19,7 +18,10 @@ - + + + + @@ -48,6 +50,9 @@ + + + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Jobgear/securitygear.xml b/Barotrauma/BarotraumaShared/Content/Items/Jobgear/securitygear.xml index 804017f10..438f7cc0c 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Jobgear/securitygear.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Jobgear/securitygear.xml @@ -10,17 +10,18 @@ - + + + + - @@ -34,6 +35,8 @@ + + diff --git a/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml b/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml index 4480fe655..969b6213c 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Weapons/railgun.xml @@ -72,8 +72,7 @@ @@ -103,8 +102,7 @@ diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Attack.cs b/Barotrauma/BarotraumaShared/Source/Characters/Attack.cs index 64081f55e..3ea9aa97e 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Attack.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Attack.cs @@ -11,24 +11,32 @@ namespace Barotrauma Damage, Bloodloss, Pressure, Suffocation, Drowning, Burn, Husk, Disconnected } - public enum DamageType { None, Blunt, Slash, Burn } + [Flags] + public enum DamageType + { + None = 0, + Blunt = 1, + Slash = 2, + Burn = 4, + Any = Blunt | Slash | Burn + } struct AttackResult { public readonly float Damage; public readonly float Bleeding; - - public readonly bool HitArmor; - public AttackResult(float damage, float bleeding, bool hitArmor=false) + public readonly List AppliedDamageModifiers; + + public AttackResult(float damage, float bleeding, List appliedDamageModifiers = null) { this.Damage = damage; this.Bleeding = bleeding; - this.HitArmor = hitArmor; + this.AppliedDamageModifiers = appliedDamageModifiers; } } - + partial class Attack { public readonly float Range; diff --git a/Barotrauma/BarotraumaShared/Source/Characters/DamageModifier.cs b/Barotrauma/BarotraumaShared/Source/Characters/DamageModifier.cs new file mode 100644 index 000000000..e97d57971 --- /dev/null +++ b/Barotrauma/BarotraumaShared/Source/Characters/DamageModifier.cs @@ -0,0 +1,66 @@ +using Microsoft.Xna.Framework; +using System.Xml.Linq; + +namespace Barotrauma +{ + class DamageModifier + { + [Serialize(DamageType.None, false)] + public DamageType DamageType + { + get; + private set; + } + + [Serialize(1.0f, false)] + public float DamageMultiplier + { + get; + private set; + } + + [Serialize(1.0f, false)] + public float BleedingMultiplier + { + get; + private set; + } + + [Serialize("0.0,360", false)] + public Vector2 ArmorSector + { + get; + private set; + } + + [Serialize(true, false)] + public bool IsArmor + { + get; + private set; + } + + [Serialize(true, false)] + public bool DeflectProjectiles + { + get; + private set; + } + + +#if CLIENT + [Serialize(DamageSoundType.None, false)] + public DamageSoundType DamageSoundType + { + get; + private set; + } +#endif + + public DamageModifier(XElement element) + { + SerializableProperty.DeserializeProperties(this, element); + ArmorSector = new Vector2(MathHelper.ToRadians(ArmorSector.X), MathHelper.ToRadians(ArmorSector.Y)); + } + } +} diff --git a/Barotrauma/BarotraumaShared/Source/Characters/Limb.cs b/Barotrauma/BarotraumaShared/Source/Characters/Limb.cs index 48c33837d..cc3ce8e8d 100644 --- a/Barotrauma/BarotraumaShared/Source/Characters/Limb.cs +++ b/Barotrauma/BarotraumaShared/Source/Characters/Limb.cs @@ -72,10 +72,7 @@ namespace Barotrauma private bool isSevered; private float severedFadeOutTimer; - - private readonly Vector2 armorSector; - private readonly float armorValue; - + public Vector2? MouthPos; //a timer for delaying when a hitsound/attacksound can be played again @@ -91,6 +88,8 @@ namespace Barotrauma private Vector2 animTargetPos; private float scale; + + private List damageModifiers; public float AttackTimer; @@ -179,7 +178,7 @@ namespace Barotrauma public float Burnt { get { return burnt; } - set { burnt = MathHelper.Clamp(value,0.0f,100.0f); } + protected set { burnt = MathHelper.Clamp(value, 0.0f, 100.0f); } } public List WearingItems @@ -255,15 +254,7 @@ namespace Barotrauma GameMain.World.AddJoint(pullJoint); steerForce = element.GetAttributeFloat("steerforce", 0.0f); - - //maxHealth = Math.Max(ToolBox.GetAttributeFloat(element, "health", 100.0f),1.0f); - - armorSector = element.GetAttributeVector2("armorsector", Vector2.Zero); - armorSector.X = MathHelper.ToRadians(armorSector.X); - armorSector.Y = MathHelper.ToRadians(armorSector.Y); - - armorValue = Math.Max(element.GetAttributeFloat("armor", 0.0f), 0.0f); - + if (element.Attribute("mouthpos") != null) { MouthPos = ConvertUnits.ToSimUnits(element.GetAttributeVector2("mouthpos", Vector2.Zero)); @@ -272,6 +263,8 @@ namespace Barotrauma body.BodyType = BodyType.Dynamic; body.FarseerBody.AngularDamping = LimbAngularDamping; + damageModifiers = new List(); + foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) @@ -322,6 +315,9 @@ namespace Barotrauma case "attack": attack = new Attack(subElement); break; + case "damagemodifier": + damageModifiers.Add(new DamageModifier(subElement)); + break; } } @@ -344,46 +340,51 @@ namespace Barotrauma public AttackResult AddDamage(Vector2 position, DamageType damageType, float amount, float bleedingAmount, bool playSound) { - bool hitArmor = false; - float totalArmorValue = 0.0f; + List appliedDamageModifiers = new List(); - if (armorValue > 0.0f && SectorHit(armorSector, position)) + foreach (DamageModifier damageModifier in damageModifiers) { - hitArmor = true; - totalArmorValue += armorValue; + if (damageModifier.DamageType.HasFlag(damageType) && SectorHit(damageModifier.ArmorSector, position)) + { + appliedDamageModifiers.Add(damageModifier); + } } - + foreach (WearableSprite wearable in wearingItems) { - if (wearable.WearableComponent.ArmorValue > 0.0f && - SectorHit(wearable.WearableComponent.ArmorSectorLimits, position)) + foreach (DamageModifier damageModifier in wearable.WearableComponent.DamageModifiers) { - hitArmor = true; - totalArmorValue += wearable.WearableComponent.ArmorValue; + if (damageModifier.DamageType.HasFlag(damageType) && SectorHit(damageModifier.ArmorSector, position)) + { + appliedDamageModifiers.Add(damageModifier); + } } - } + } - if (hitArmor) + foreach (DamageModifier damageModifier in appliedDamageModifiers) { - totalArmorValue = Math.Max(totalArmorValue, 0.0f); - - amount = Math.Max(0.0f, amount - totalArmorValue); - bleedingAmount = Math.Max(0.0f, bleedingAmount - totalArmorValue); + amount *= damageModifier.DamageMultiplier; + bleedingAmount *= damageModifier.BleedingMultiplier; } #if CLIENT if (playSound) { DamageSoundType damageSoundType = (damageType == DamageType.Blunt) ? DamageSoundType.LimbBlunt : DamageSoundType.LimbSlash; - if (hitArmor) - { - damageSoundType = DamageSoundType.LimbArmor; - } + foreach (DamageModifier damageModifier in appliedDamageModifiers) + { + if (damageModifier.DamageSoundType != DamageSoundType.None) + { + damageSoundType = damageModifier.DamageSoundType; + break; + } + } + SoundPlayer.PlayDamageSound(damageSoundType, amount, position); } - float bloodParticleAmount = hitArmor || bleedingAmount <= 0.0f ? 0 : (int)Math.Min(amount / 5, 10); + float bloodParticleAmount = bleedingAmount <= 0.0f ? 0 : (int)Math.Min(amount / 5, 10); float bloodParticleSize = MathHelper.Clamp(amount / 50.0f, 0.1f, 1.0f); for (int i = 0; i < bloodParticleAmount; i++) @@ -402,9 +403,14 @@ namespace Barotrauma #endif + if (damageType == DamageType.Burn) + { + Burnt += amount * 10.0f; + } + damage += Math.Max(amount,bleedingAmount) / character.MaxHealth * 100.0f; - return new AttackResult(amount, bleedingAmount, hitArmor); + return new AttackResult(amount, bleedingAmount, appliedDamageModifiers); } public bool SectorHit(Vector2 armorSector, Vector2 simPosition) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs index 56373779e..569a34735 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Projectile.cs @@ -5,6 +5,7 @@ using FarseerPhysics.Dynamics.Joints; using Microsoft.Xna.Framework; using System; using System.Collections.Generic; +using System.Linq; using System.Xml.Linq; namespace Barotrauma.Items.Components @@ -255,7 +256,8 @@ namespace Barotrauma.Items.Components target.Body.ApplyLinearImpulse(item.body.LinearVelocity * item.body.Mass); - if (attackResult.HitArmor) + if (attackResult.AppliedDamageModifiers != null && + attackResult.AppliedDamageModifiers.Any(dm => dm.DeflectProjectiles)) { item.body.LinearVelocity *= 0.1f; } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs index 941753833..9bfd51af6 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Wearable.cs @@ -1,5 +1,6 @@ using Microsoft.Xna.Framework; using System; +using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Linq; @@ -27,79 +28,62 @@ namespace Barotrauma.Items.Components class Wearable : Pickable { - WearableSprite[] wearableSprites; - LimbType[] limbType; - Limb[] limb; + private WearableSprite[] wearableSprites; + private LimbType[] limbType; + private Limb[] limb; - private float armorValue; + private List damageModifiers; - private Vector2 armorSector; - - [Serialize(0.0f, false)] - public float ArmorValue + public List DamageModifiers { - get { return armorValue; } - set { armorValue = MathHelper.Clamp(value, 0.0f, 100.0f); } + get { return damageModifiers; } } - - [Serialize("0.0,360.0", false)] - public Vector2 ArmorSector - { - get { return armorSector; } - set - { - armorSector.X = MathHelper.ToRadians(value.X); - armorSector.Y = MathHelper.ToRadians(value.Y); - } - } - - public Vector2 ArmorSectorLimits - { - get { return armorSector; } - } - + public Wearable (Item item, XElement element) : base(item, element) { this.item = item; - var sprites = element.Elements().Where(x => x.Name.ToString() == "sprite").ToList(); - int spriteCount = sprites.Count; + damageModifiers = new List(); + + int spriteCount = element.Elements().Count(x => x.Name.ToString() == "sprite"); wearableSprites = new WearableSprite[spriteCount]; limbType = new LimbType[spriteCount]; limb = new Limb[spriteCount]; int i = 0; - foreach (XElement subElement in sprites) + foreach (XElement subElement in element.Elements()) { - //Rectangle sourceRect = new Rectangle( - // ToolBox.GetAttributeInt(subElement, "sourcex", 1), - // ToolBox.GetAttributeInt(subElement, "sourcey", 1), - // ToolBox.GetAttributeInt(subElement, "sourcewidth", 1), - // ToolBox.GetAttributeInt(subElement, "sourceheight", 1)); - - if (subElement.Attribute("texture") == null) + switch (subElement.Name.ToString().ToLower()) { - DebugConsole.ThrowError("Item \"" + item.Name + "\" doesn't have a texture specified!"); - return; + case "sprite": + if (subElement.Attribute("texture") == null) + { + DebugConsole.ThrowError("Item \"" + item.Name + "\" doesn't have a texture specified!"); + return; + } + + string spritePath = subElement.Attribute("texture").Value; + spritePath = Path.GetDirectoryName(item.Prefab.ConfigFile) + "/" + spritePath; + + var sprite = new Sprite(subElement, "", spritePath); + wearableSprites[i] = new WearableSprite(this, sprite, + subElement.GetAttributeBool("hidelimb", false), + subElement.GetAttributeBool("inheritlimbdepth", true), + (LimbType)Enum.Parse(typeof(LimbType), subElement.GetAttributeString("depthlimb", "None"), true)); + + limbType[i] = (LimbType)Enum.Parse(typeof(LimbType), + subElement.GetAttributeString("limb", "Head"), true); + + i++; + break; + case "damagemodifier": + damageModifiers.Add(new DamageModifier(subElement)); + break; } - - string spritePath = subElement.Attribute("texture").Value; - spritePath = Path.GetDirectoryName( item.Prefab.ConfigFile)+"/"+spritePath; - - var sprite = new Sprite(subElement, "", spritePath); - wearableSprites[i] = new WearableSprite(this, sprite, - subElement.GetAttributeBool("hidelimb", false), - subElement.GetAttributeBool("inheritlimbdepth", true), - (LimbType)Enum.Parse(typeof(LimbType), subElement.GetAttributeString("depthlimb", "None"), true)); - - limbType[i] = (LimbType)Enum.Parse(typeof(LimbType), - subElement.GetAttributeString("limb", "Head"), true); - - i++; } } - + public override void Equip(Character character) { picker = character; @@ -107,15 +91,7 @@ namespace Barotrauma.Items.Components { Limb equipLimb = character.AnimController.GetLimb(limbType[i]); if (equipLimb == null) continue; - - //something is already on the limb -> unequip it - //if (equipLimb.WearingItem != null && equipLimb.WearingItem != this) - //{ - // equipLimb.WearingItem.Unequip(character); - //} - - //sprite[i].Depth = equipLimb.sprite.Depth - 0.001f; - + item.body.Enabled = false; IsActive = true; @@ -143,20 +119,9 @@ namespace Barotrauma.Items.Components Limb equipLimb = character.AnimController.GetLimb(limbType[i]); if (equipLimb == null) continue; - //foreach (WearableSprite wearable in equipLimb.WearingItems) - //{ - // if (wearable != wearableSprites[i]) continue; + equipLimb.WearingItems.RemoveAll(w => w != null && w == wearableSprites[i]); - // equipLimb.WearingItems.Remove(wearableSprites[i]); - //} - - equipLimb.WearingItems.RemoveAll(w=> w!=null && w==wearableSprites[i]); - - //if (equipLimb.WearingItem != this) continue; - limb[i] = null; - //equipLimb.WearingItem = null; - //equipLimb.WearingItemSprite = null; } IsActive = false; diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index 92c3ddad5..e4282a895 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -761,7 +761,7 @@ namespace Barotrauma float damageAmount = attack.GetStructureDamage(deltaTime); Condition -= damageAmount; - return new AttackResult(damageAmount, 0.0f, false); + return new AttackResult(damageAmount, 0.0f, null); } private bool IsInWater() diff --git a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs index 8f44317e0..bfa7eb231 100644 --- a/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs +++ b/Barotrauma/BarotraumaShared/Source/Map/FireSource.cs @@ -205,8 +205,6 @@ namespace Barotrauma float dmg = (float)Math.Sqrt(size.X) * deltaTime / c.AnimController.Limbs.Length; foreach (Limb limb in c.AnimController.Limbs) { - if (limb.WearingItems.Find(w => w != null && w.WearableComponent.Item.FireProof) != null) continue; - limb.Burnt += dmg * 10.0f; c.AddDamage(limb.SimPosition, DamageType.Burn, dmg, 0, 0, false); } } From ccac8de7232d66a7bf06b62a55a383b196026652 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 15:42:52 +0200 Subject: [PATCH 04/12] Removed unused NetConfig constants and leftover debug code in GameServer --- .../Source/Networking/GameServer.cs | 5 ----- .../Source/Networking/NetConfig.cs | 15 ++------------- 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs index 12c5ea68e..e62b9a155 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/GameServer.cs @@ -1862,11 +1862,6 @@ namespace Barotrauma.Networking private void FileTransferChanged(FileSender.FileTransferOut transfer) { - if (connectedClients.Any(c=> c.Connection == null)) - { - int sdfgsdfg = 1; - } - Client recipient = connectedClients.Find(c => c.Connection == transfer.Connection); #if CLIENT UpdateFileTransferIndicator(recipient); diff --git a/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs b/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs index fe834b55e..97afc0136 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/NetConfig.cs @@ -3,10 +3,7 @@ static class NetConfig { public const int DefaultPort = 14242; - - //UpdateEntity networkevents aren't sent to clients if they're further than this from the entity - public const float UpdateEntityDistance = 2500.0f; - + public const int MaxPlayers = 16; public static string MasterServerUrl = GameMain.Config.MasterServerUrl; @@ -20,14 +17,6 @@ //send a position update to clients (in sim units) public const float ItemPosUpdateDistance = 2.0f; - public const float LargeCharacterUpdateInterval = 5.0f; - - public const float DeleteDisconnectedTime = 10.0f; - - public const float IdSendInterval = 0.2f; - public const float RerequestInterval = 0.2f; - - public const int ReliableMessageBufferSize = 500; - public const int ResendAttempts = 10; + public const float DeleteDisconnectedTime = 10.0f; } } From c66191ca94f28d43422be35d2f925677b56436e3 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 15:50:40 +0200 Subject: [PATCH 05/12] Added exception handling to SerializeProperty.TrySetValue methods --- .../Serialization/SerializableProperty.cs | 158 +++++++++++------- 1 file changed, 93 insertions(+), 65 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs b/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs index 2dd952ac4..ff63554e8 100644 --- a/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs +++ b/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs @@ -130,7 +130,15 @@ namespace Barotrauma DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj + "\" to " + value + " (not a valid " + propertyInfo.PropertyType + ")", e); return false; } - propertyInfo.SetValue(obj, enumVal); + try + { + propertyInfo.SetValue(obj, enumVal); + } + catch (Exception e) + { + DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj.ToString() + "\" to " + value.ToString(), e); + return false; + } } else { @@ -141,45 +149,55 @@ namespace Barotrauma } } - switch (typeName) + try { - case "bool": - propertyInfo.SetValue(obj, value.ToLowerInvariant() == "true", null); - break; - case "int": - int intVal; - if (int.TryParse(value, out intVal)) - { - propertyInfo.SetValue(obj, intVal, null); - } - break; - case "float": - float floatVal; - if (float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out floatVal)) - { - propertyInfo.SetValue(obj, floatVal, null); - } - break; - case "string": - propertyInfo.SetValue(obj, value, null); - break; - case "vector2": - propertyInfo.SetValue(obj, XMLExtensions.ParseVector2(value)); - break; - case "vector3": - propertyInfo.SetValue(obj, XMLExtensions.ParseVector3(value)); - break; - case "vector4": - propertyInfo.SetValue(obj, XMLExtensions.ParseVector4(value)); - break; - case "color": - propertyInfo.SetValue(obj, XMLExtensions.ParseColor(value)); - break; - case "rectangle": - propertyInfo.SetValue(obj, XMLExtensions.ParseRect(value, true)); - break; + switch (typeName) + { + case "bool": + propertyInfo.SetValue(obj, value.ToLowerInvariant() == "true", null); + break; + case "int": + int intVal; + if (int.TryParse(value, out intVal)) + { + propertyInfo.SetValue(obj, intVal, null); + } + break; + case "float": + float floatVal; + if (float.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out floatVal)) + { + propertyInfo.SetValue(obj, floatVal, null); + } + break; + case "string": + propertyInfo.SetValue(obj, value, null); + break; + case "vector2": + propertyInfo.SetValue(obj, XMLExtensions.ParseVector2(value)); + break; + case "vector3": + propertyInfo.SetValue(obj, XMLExtensions.ParseVector3(value)); + break; + case "vector4": + propertyInfo.SetValue(obj, XMLExtensions.ParseVector4(value)); + break; + case "color": + propertyInfo.SetValue(obj, XMLExtensions.ParseColor(value)); + break; + case "rectangle": + propertyInfo.SetValue(obj, XMLExtensions.ParseRect(value, true)); + break; + } } + catch (Exception e) + { + DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj.ToString() + "\" to " + value.ToString(), e); + return false; + } + + return true; } @@ -215,42 +233,52 @@ namespace Barotrauma } } - if (value.GetType() == typeof(string)) + try { - switch (typeName) + if (value.GetType() == typeof(string)) { - case "string": - propertyInfo.SetValue(obj, value, null); - return true; - case "vector2": - propertyInfo.SetValue(obj, XMLExtensions.ParseVector2((string)value)); - return true; - case "vector3": - propertyInfo.SetValue(obj, XMLExtensions.ParseVector3((string)value)); - return true; - case "vector4": - propertyInfo.SetValue(obj, XMLExtensions.ParseVector4((string)value)); - return true; - case "color": - propertyInfo.SetValue(obj, XMLExtensions.ParseColor((string)value)); - return true; - case "rectangle": - propertyInfo.SetValue(obj, XMLExtensions.ParseColor((string)value)); - return true; - default: - DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj.ToString() + "\" to " + value.ToString()); - DebugConsole.ThrowError("(Cannot convert a string to a " + propertyDescriptor.PropertyType.ToString() + ")"); - return false; + switch (typeName) + { + case "string": + propertyInfo.SetValue(obj, value, null); + return true; + case "vector2": + propertyInfo.SetValue(obj, XMLExtensions.ParseVector2((string)value)); + return true; + case "vector3": + propertyInfo.SetValue(obj, XMLExtensions.ParseVector3((string)value)); + return true; + case "vector4": + propertyInfo.SetValue(obj, XMLExtensions.ParseVector4((string)value)); + return true; + case "color": + propertyInfo.SetValue(obj, XMLExtensions.ParseColor((string)value)); + return true; + case "rectangle": + propertyInfo.SetValue(obj, XMLExtensions.ParseColor((string)value)); + return true; + default: + DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj.ToString() + "\" to " + value.ToString()); + DebugConsole.ThrowError("(Cannot convert a string to a " + propertyDescriptor.PropertyType.ToString() + ")"); + return false; + } } + else if (propertyDescriptor.PropertyType != value.GetType()) + { + DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj.ToString() + "\" to " + value.ToString()); + DebugConsole.ThrowError("(Non-matching type, should be " + propertyDescriptor.PropertyType + " instead of " + value.GetType() + ")"); + return false; + } + + propertyInfo.SetValue(obj, value, null); } - else if (propertyDescriptor.PropertyType != value.GetType()) + + catch (Exception e) { - DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj.ToString() + "\" to " + value.ToString()); - DebugConsole.ThrowError("(Non-matching type, should be " + propertyDescriptor.PropertyType + " instead of " + value.GetType() + ")"); + DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj.ToString() + "\" to " + value.ToString(), e); return false; } - propertyInfo.SetValue(obj, value, null); return true; } catch From 063881701ce152f1f62bdee2ac8b04678edd9368 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 16:25:21 +0200 Subject: [PATCH 06/12] Fixed exceptions when attempting to set the value of a serializable rect property by parsing a string --- .../Source/Serialization/SerializableProperty.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs b/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs index ff63554e8..6ab463699 100644 --- a/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs +++ b/Barotrauma/BarotraumaShared/Source/Serialization/SerializableProperty.cs @@ -255,7 +255,7 @@ namespace Barotrauma propertyInfo.SetValue(obj, XMLExtensions.ParseColor((string)value)); return true; case "rectangle": - propertyInfo.SetValue(obj, XMLExtensions.ParseColor((string)value)); + propertyInfo.SetValue(obj, XMLExtensions.ParseRect((string)value, false)); return true; default: DebugConsole.ThrowError("Failed to set the value of the property \"" + Name + "\" of \"" + obj.ToString() + "\" to " + value.ToString()); From 1cc33d221dc73339e2dadfcb1bfdeafbd0c705f2 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 16:46:27 +0200 Subject: [PATCH 07/12] Moving the sub using IJKL in debug builds is disabled when writing into a textbox. --- Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs b/Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs index 82f8f582f..ea872dbf6 100644 --- a/Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs +++ b/Barotrauma/BarotraumaShared/Source/Screens/GameScreen.cs @@ -57,7 +57,7 @@ namespace Barotrauma #if DEBUG && CLIENT if (GameMain.GameSession != null && GameMain.GameSession.Level != null && GameMain.GameSession.Submarine != null && - !DebugConsole.IsOpen) + !DebugConsole.IsOpen && GUIComponent.KeyboardDispatcher.Subscriber == null) { var closestSub = Submarine.FindClosest(cam.WorldViewCenter); if (closestSub == null) closestSub = GameMain.GameSession.Submarine; From f55d028799695ded4f6dd2c92ff37b7d339f84af Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 17:47:05 +0200 Subject: [PATCH 08/12] Chatbox can be deselect by pressing enter while it's empty --- .../BarotraumaClient/Source/Networking/NetworkMember.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Barotrauma/BarotraumaClient/Source/Networking/NetworkMember.cs b/Barotrauma/BarotraumaClient/Source/Networking/NetworkMember.cs index 2f0786702..273ed89d2 100644 --- a/Barotrauma/BarotraumaClient/Source/Networking/NetworkMember.cs +++ b/Barotrauma/BarotraumaClient/Source/Networking/NetworkMember.cs @@ -80,7 +80,11 @@ namespace Barotrauma.Networking { textBox.TextColor = ChatMessage.MessageColor[(int)ChatMessageType.Default]; - if (string.IsNullOrWhiteSpace(message)) return false; + if (string.IsNullOrWhiteSpace(message)) + { + if (textBox == chatMsgBox) textBox.Deselect(); + return false; + } if (this == GameMain.Server) { From 3bcd128ac79db2ca79a8ca5df8bdd638aa562567 Mon Sep 17 00:00:00 2001 From: Juan Pablo Arce Date: Sat, 2 Dec 2017 13:19:44 -0300 Subject: [PATCH 09/12] Fixed extra quote in carrier.xml --- .../BarotraumaShared/Content/Characters/Carrier/carrier.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml b/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml index ec69f90e3..9377d3d06 100644 --- a/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml +++ b/Barotrauma/BarotraumaShared/Content/Characters/Carrier/carrier.xml @@ -24,7 +24,7 @@ - + @@ -65,4 +65,4 @@ - \ No newline at end of file + From 20664c08fdec7f56a0c9e26f17b23761a71bfdfb Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sat, 2 Dec 2017 19:14:49 +0200 Subject: [PATCH 10/12] Fixed limb lightsources not rotating with the limb --- Barotrauma/BarotraumaClient/Source/Characters/Limb.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs b/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs index 120c9354a..237dcfa98 100644 --- a/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs +++ b/Barotrauma/BarotraumaClient/Source/Characters/Limb.cs @@ -45,6 +45,7 @@ namespace Barotrauma if (LightSource != null) { LightSource.ParentSub = body.Submarine; + LightSource.Rotation = (dir == Direction.Right) ? body.Rotation : body.Rotation - MathHelper.Pi; } } From 9e5f503659b15aa1be412b4c0080e4130bd21165 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sun, 3 Dec 2017 01:07:04 +0200 Subject: [PATCH 11/12] Added minor damage protection to diving suit --- .../BarotraumaShared/Content/Items/Diving/divinggear.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml b/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml index cbd95c95d..238988d26 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Diving/divinggear.xml @@ -103,6 +103,10 @@ + + + + From ddf9ad26b8b3704e081db904a3946900b568ae80 Mon Sep 17 00:00:00 2001 From: Joonas Rikkonen Date: Sun, 3 Dec 2017 01:07:16 +0200 Subject: [PATCH 12/12] v0.7.0.1 --- .../Properties/AssemblyInfo.cs | 4 ++-- .../Properties/AssemblyInfo.cs | 4 ++-- Barotrauma/BarotraumaShared/changelog.txt | 23 +++++++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs index 00f2a2534..bcd84aadb 100644 --- a/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaClient/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.7.0.0")] -[assembly: AssemblyFileVersion("0.7.0.0")] +[assembly: AssemblyVersion("0.7.0.1")] +[assembly: AssemblyFileVersion("0.7.0.1")] diff --git a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs index a1a6cfa96..3e8f0f237 100644 --- a/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs +++ b/Barotrauma/BarotraumaServer/Properties/AssemblyInfo.cs @@ -31,5 +31,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.7.0.0")] -[assembly: AssemblyFileVersion("0.7.0.0")] +[assembly: AssemblyVersion("0.7.0.1")] +[assembly: AssemblyFileVersion("0.7.0.1")] diff --git a/Barotrauma/BarotraumaShared/changelog.txt b/Barotrauma/BarotraumaShared/changelog.txt index 0f3a6cd83..14bad46fe 100644 --- a/Barotrauma/BarotraumaShared/changelog.txt +++ b/Barotrauma/BarotraumaShared/changelog.txt @@ -1,3 +1,26 @@ +--------------------------------------------------------------------------------------------------------- +v0.7.0.1 +--------------------------------------------------------------------------------------------------------- + +- Added console commands for modifying client permissions. +- Fixed content package setting not being saved in the settings menu. +- Item pickup sounds are only played when the controlled character picks up an item. +- Removed serverconfig.xml (the dedicated server now uses the same config file as the normal game). +- Updated the vanilla content package to version 0.7. +- Fixed entity linking in the submarine editor. +- Fixed railgun HUD crashing the game if the railgun is linked to an item that does not have an +ItemContainer component (i.e. any item that can't contain other items). +- Fixed exceptions when the player dies in the tutorial. +- Fixed the start popup saying the host is the target if the host has been selected as the traitor. +- Fixed crashes when attempting to use a railgun controller that's not connected to anything. +- Fixed autorestart counter overlapping with the campaign map in the server lobby screen. +- Fixed characters receiving damage almost exclusively to their feet when wearing a diving suit. +- Armoring reduces damage by a certain percentage, not a fixed value. Now armor doesn't make characters +invulnerable to small amounts of damage. +- The effectiveness of different types of armor depends on the type of damage. For example, diving suits +provide fairly good protection against burn and slash damage, but aren't as affective against blunt damage. +- Fixed light sources attached to limbs not rotating with the limbs. + --------------------------------------------------------------------------------------------------------- v0.7.0.0 ---------------------------------------------------------------------------------------------------------