diff --git a/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs b/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs index 7f3c8c79a..9810da3d9 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Components/Door.cs @@ -93,7 +93,7 @@ namespace Barotrauma.Items.Components public void Draw(SpriteBatch spriteBatch, bool editing) { Color color = (item.IsSelected) ? Color.Green : Color.White; - color = color * (item.Condition / 100.0f); + color = color * (item.Condition / item.Prefab.Health); color.A = 255; //prefab.sprite.Draw(spriteBatch, new Vector2(rect.X, -rect.Y), new Vector2(rect.Width, rect.Height), color); diff --git a/Barotrauma/BarotraumaClient/Source/Items/FixRequirement.cs b/Barotrauma/BarotraumaClient/Source/Items/FixRequirement.cs index bd3a3b9c6..58dff356f 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/FixRequirement.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/FixRequirement.cs @@ -156,7 +156,7 @@ namespace Barotrauma } if (!unfixedFound) { - item.Condition = 100.0f; + item.Condition = item.Prefab.Health; frame = null; } } diff --git a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs index 58dc4034f..fb58735ff 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Inventory.cs @@ -167,21 +167,21 @@ namespace Barotrauma if (item != null && drawItem) { - if (item.Condition < 100.0f) + if (item.Condition < item.Prefab.Health) { GUI.DrawRectangle(spriteBatch, new Rectangle(rect.X, rect.Bottom - 8, rect.Width, 8), Color.Black * 0.8f, true); GUI.DrawRectangle(spriteBatch, - new Rectangle(rect.X, rect.Bottom - 8, (int)(rect.Width * item.Condition / 100.0f), 8), + new Rectangle(rect.X, rect.Bottom - 8, (int)(rect.Width * item.Condition / item.Prefab.Health), 8), Color.Lerp(Color.Red, Color.Green, item.Condition / 100.0f) * 0.8f, true); } var containedItems = item.ContainedItems; - if (containedItems != null && containedItems.Length == 1 && containedItems[0].Condition < 100.0f) + if (containedItems != null && containedItems.Length == 1 && containedItems[0].Condition < item.Prefab.Health) { GUI.DrawRectangle(spriteBatch, new Rectangle(rect.X, rect.Y, rect.Width, 8), Color.Black * 0.8f, true); GUI.DrawRectangle(spriteBatch, new Rectangle(rect.X, rect.Y, (int)(rect.Width * containedItems[0].Condition / 100.0f), 8), - Color.Lerp(Color.Red, Color.Green, containedItems[0].Condition / 100.0f) * 0.8f, true); + Color.Lerp(Color.Red, Color.Green, containedItems[0].Condition / item.Prefab.Health) * 0.8f, true); } } diff --git a/Barotrauma/BarotraumaClient/Source/Items/Item.cs b/Barotrauma/BarotraumaClient/Source/Items/Item.cs index aa385d788..1bf224bdb 100644 --- a/Barotrauma/BarotraumaClient/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaClient/Source/Items/Item.cs @@ -1,15 +1,12 @@ using Barotrauma.Items.Components; using Barotrauma.Networking; using FarseerPhysics; -using FarseerPhysics.Dynamics; -using FarseerPhysics.Dynamics.Contacts; using Lidgren.Network; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using System; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.ComponentModel; using System.Linq; using System.Xml.Linq; @@ -455,7 +452,7 @@ namespace Barotrauma ownInventory.ClientRead(type, msg, sendingTime); break; case NetEntityEvent.Type.Status: - condition = msg.ReadRangedSingle(0.0f, 100.0f, 8); + condition = msg.ReadRangedSingle(0.0f, prefab.Health, 8); if (FixRequirements.Count > 0) { diff --git a/Barotrauma/BarotraumaShared/Content/Items/Artifacts/artifact.png b/Barotrauma/BarotraumaShared/Content/Items/Artifacts/artifact.png index e53070be7..459cdfd54 100644 Binary files a/Barotrauma/BarotraumaShared/Content/Items/Artifacts/artifact.png and b/Barotrauma/BarotraumaShared/Content/Items/Artifacts/artifact.png differ diff --git a/Barotrauma/BarotraumaShared/Content/Items/Artifacts/artifacts.xml b/Barotrauma/BarotraumaShared/Content/Items/Artifacts/artifacts.xml index ba1631cc6..964ff7436 100644 --- a/Barotrauma/BarotraumaShared/Content/Items/Artifacts/artifacts.xml +++ b/Barotrauma/BarotraumaShared/Content/Items/Artifacts/artifacts.xml @@ -6,7 +6,7 @@ Tags="alien" pickdistance="150"> - + @@ -15,7 +15,7 @@ - + @@ -28,7 +28,7 @@ Tags="alien" pickdistance="150"> - + @@ -37,7 +37,7 @@ - + @@ -48,6 +48,7 @@ @@ -60,7 +61,30 @@ - + + + + + + + + + + + + + + + + + + + @@ -72,7 +96,7 @@ tags="alien,smallitem" impacttolerance="8"> - + @@ -100,7 +124,7 @@ - + diff --git a/Barotrauma/BarotraumaShared/Content/Missions.xml b/Barotrauma/BarotraumaShared/Content/Missions.xml index 26d82d1f0..8457a9c34 100644 --- a/Barotrauma/BarotraumaShared/Content/Missions.xml +++ b/Barotrauma/BarotraumaShared/Content/Missions.xml @@ -26,6 +26,19 @@ + + + + 50.0f) Finished(); + if (item.Condition > item.Prefab.Health * 0.5f) Finished(); } } } diff --git a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs index ee547ad24..6a9c1ff5b 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Components/Machines/Deconstructor.cs @@ -58,7 +58,7 @@ namespace Barotrauma.Items.Components foreach (DeconstructItem deconstructProduct in targetItem.Prefab.DeconstructItems) { - if (deconstructProduct.RequireFullCondition && targetItem.Condition < 100.0f) continue; + if (deconstructProduct.RequireFullCondition && targetItem.Condition < targetItem.Prefab.Health) continue; var itemPrefab = MapEntityPrefab.list.FirstOrDefault(ip => ip.Name.ToLowerInvariant() == deconstructProduct.ItemPrefabName.ToLowerInvariant()) as ItemPrefab; if (itemPrefab == null) diff --git a/Barotrauma/BarotraumaShared/Source/Items/Item.cs b/Barotrauma/BarotraumaShared/Source/Items/Item.cs index e1b0186b9..1ccc6d7df 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/Item.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/Item.cs @@ -178,10 +178,11 @@ namespace Barotrauma { if (GameMain.Client != null) return; if (!MathUtils.IsValid(value)) return; + if (prefab.Indestructible) return; float prev = condition; - condition = MathHelper.Clamp(value, 0.0f, 100.0f); - if (condition == 0.0f && prev>0.0f) + condition = MathHelper.Clamp(value, 0.0f, prefab.Health); + if (condition == 0.0f && prev > 0.0f) { ApplyStatusEffects(ActionType.OnBroken, 1.0f, null); foreach (FixRequirement req in FixRequirements) @@ -192,7 +193,7 @@ namespace Barotrauma if (GameMain.Server != null && lastSentCondition != condition) { - if (Math.Abs(lastSentCondition - condition) > 1.0f || condition == 0.0f || condition == 100.0f) + if (Math.Abs(lastSentCondition - condition) > 1.0f || condition == 0.0f || condition == prefab.Health) { GameMain.Server.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.Status }); lastSentCondition = condition; @@ -205,7 +206,7 @@ namespace Barotrauma { get { return condition; } } - + [Editable, HasDefaultValue("", true)] public string Tags { @@ -340,9 +341,9 @@ namespace Barotrauma rect = newRect; if (submarine==null || !submarine.Loading) FindHull(); - - condition = 100.0f; - lastSentCondition = 100.0f; + + condition = prefab.Health; + lastSentCondition = prefab.Health; XElement element = prefab.ConfigElement; if (element == null) return; @@ -740,6 +741,8 @@ namespace Barotrauma public AttackResult AddDamage(IDamageable attacker, Vector2 worldPosition, Attack attack, float deltaTime, bool playSound = true) { + if (prefab.Indestructible) return new AttackResult(); + float damageAmount = attack.GetStructureDamage(deltaTime); Condition -= damageAmount; @@ -1321,9 +1324,9 @@ namespace Barotrauma ownInventory.ServerWrite(msg, c, extraData); break; case NetEntityEvent.Type.Status: - //clamp above 0.5f if condition > 0.0f + //clamp to (MaxHealth / 255.0f) if condition > 0.0f //to prevent condition from being rounded down to 0.0 even if the item is not broken - msg.WriteRangedSingle(condition > 0.0f ? Math.Max(condition, 0.5f) : 0.0f, 0.0f, 100.0f, 8); + msg.WriteRangedSingle(condition > 0.0f ? Math.Max(condition, prefab.Health / 255.0f) : 0.0f, 0.0f, prefab.Health, 8); if (condition <= 0.0f && FixRequirements.Count > 0) { @@ -1370,7 +1373,7 @@ namespace Barotrauma FixRequirements[requirementIndex].Fixed = true; if (condition <= 0.0f && FixRequirements.All(f => f.Fixed)) { - Condition = 100.0f; + Condition = prefab.Health; } GameMain.Server.CreateEntityEvent(this, new object[] { NetEntityEvent.Type.Status }); diff --git a/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs b/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs index ef7e8d130..d7c76e4c0 100644 --- a/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs +++ b/Barotrauma/BarotraumaShared/Source/Items/ItemPrefab.cs @@ -104,6 +104,17 @@ namespace Barotrauma get { return offsetOnSelected; } } + public float Health + { + get; + private set; + } + + public bool Indestructible + { + get; + private set; + } public float ImpactTolerance { @@ -242,8 +253,10 @@ namespace Barotrauma CanUseOnSelf = ToolBox.GetAttributeBool(element, "canuseonself", false); - FireProof = ToolBox.GetAttributeBool(element, "fireproof", false); + Health = ToolBox.GetAttributeFloat(element, "health", 100.0f); + Indestructible = ToolBox.GetAttributeBool(element, "indestructible", false); + FireProof = ToolBox.GetAttributeBool(element, "fireproof", false); ImpactTolerance = ToolBox.GetAttributeFloat(element, "impacttolerance", 0.0f); string aliases = ToolBox.GetAttributeString(element, "aliases", ""); diff --git a/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs b/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs index 0e4e167ae..37ec34a9a 100644 --- a/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs +++ b/Barotrauma/BarotraumaShared/Source/Networking/RespawnManager.cs @@ -330,7 +330,7 @@ namespace Barotrauma.Networking continue; } - item.Condition = 100.0f; + item.Condition = item.Prefab.Health; var powerContainer = item.GetComponent(); if (powerContainer != null) diff --git a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs index 7535d41b5..8cc6a1395 100644 --- a/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs +++ b/Barotrauma/BarotraumaShared/Source/Physics/PhysicsBody.cs @@ -290,7 +290,7 @@ namespace Barotrauma body.CollidesWith = Physics.CollisionWall | Physics.CollisionLevel; body.Friction = ToolBox.GetAttributeFloat(element, "friction", 0.3f); - body.Restitution = 0.05f; + body.Restitution = ToolBox.GetAttributeFloat(element, "restitution", 0.05f); body.BodyType = BodyType.Dynamic;