diff --git a/Subsurface/Source/Items/Components/Door.cs b/Subsurface/Source/Items/Components/Door.cs index 6f51ce370..f9c33c541 100644 --- a/Subsurface/Source/Items/Components/Door.cs +++ b/Subsurface/Source/Items/Components/Door.cs @@ -10,7 +10,7 @@ using Barotrauma.Lights; namespace Barotrauma.Items.Components { - class Door : ItemComponent + class Door : ItemComponent, IDrawableComponent { private Gap linkedGap; @@ -293,7 +293,7 @@ namespace Barotrauma.Items.Components linkedGap.Open = 1.0f; } - public override void Draw(SpriteBatch spriteBatch, bool editing) + public void Draw(SpriteBatch spriteBatch, bool editing) { Color color = (item.IsSelected) ? Color.Green : Color.White; color = color * (item.Condition / 100.0f); diff --git a/Subsurface/Source/Items/Components/Holdable/Pickable.cs b/Subsurface/Source/Items/Components/Holdable/Pickable.cs index f45ee1d9a..5db1f006c 100644 --- a/Subsurface/Source/Items/Components/Holdable/Pickable.cs +++ b/Subsurface/Source/Items/Components/Holdable/Pickable.cs @@ -7,7 +7,7 @@ using System.Xml.Linq; namespace Barotrauma.Items.Components { - class Pickable : ItemComponent + class Pickable : ItemComponent, IDrawableComponent { protected Character picker; @@ -112,6 +112,7 @@ namespace Barotrauma.Items.Components var leftHand = picker.AnimController.GetLimb(LimbType.LeftHand); var rightHand = picker.AnimController.GetLimb(LimbType.RightHand); + Drawable = true; pickTimer = 0.0f; while (pickTimer < requiredTime) @@ -150,8 +151,10 @@ namespace Barotrauma.Items.Components private void StopPicking(Character picker) { + Drawable = false; + picker.AnimController.Anim = AnimController.Animation.None; - pickTimer = 0.0f; + pickTimer = 0.0f; } protected void DropConnectedWires(Character character) @@ -174,9 +177,13 @@ namespace Barotrauma.Items.Components } - public override void Draw(SpriteBatch spriteBatch, bool editing = false) + public void Draw(SpriteBatch spriteBatch, bool editing = false) { - if (pickTimer <= 0.0f) return; + if (pickTimer <= 0.0f) + { + Drawable = false; + return; + } float progressBarWidth = 100.0f; diff --git a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs index 85b67fc43..20f91b576 100644 --- a/Subsurface/Source/Items/Components/Holdable/RepairTool.cs +++ b/Subsurface/Source/Items/Components/Holdable/RepairTool.cs @@ -105,8 +105,6 @@ namespace Barotrauma.Items.Components //if (DoesUseFail(Character)) return false; - IsActive = true; - //targetPosition = targetPosition.X, -targetPosition.Y); float degreeOfSuccess = DegreeOfSuccess(character)/100.0f; @@ -195,7 +193,6 @@ namespace Barotrauma.Items.Components if (character.IsKeyDown(InputType.Aim)) { targetLimb.character.AddDamage(CauseOfDeath.Damage, -LimbFixAmount * degreeOfSuccess, character); - //isActive = true; } } else if ((targetItem = (targetBody.UserData as Item)) != null) @@ -203,12 +200,12 @@ namespace Barotrauma.Items.Components targetItem.IsHighlighted = true; ApplyStatusEffects(ActionType.OnUse, targetItem.AllPropertyObjects, deltaTime); - } - + } } - - + GameMain.ParticleManager.CreateParticle(particles, item.WorldPosition + TransformedBarrelPos, + -item.body.Rotation + ((item.body.Dir > 0.0f) ? 0.0f : MathHelper.Pi), ParticleSpeed); + return true; } @@ -247,33 +244,6 @@ namespace Barotrauma.Items.Components Use(deltaTime, character); return leak.Open <= 0.0f; - } - - public override void Draw(SpriteBatch spriteBatch, bool editing) - { - if (!IsActive) return; - - //Vector2 particleSpeed = new Vector2( - // (float)Math.Cos(item.body.Rotation), - // (float)Math.Sin(item.body.Rotation)) *item.body.Dir * 0.1f; - - - if (!string.IsNullOrWhiteSpace(particles)) - { - GameMain.ParticleManager.CreateParticle(particles, item.WorldPosition+TransformedBarrelPos, - -item.body.Rotation + ((item.body.Dir>0.0f) ? 0.0f : MathHelper.Pi), ParticleSpeed); - } - - //Vector2 startPos = ConvertUnits.ToDisplayUnits(item.body.Position); - //Vector2 endPos = ConvertUnits.ToDisplayUnits(pickedPosition); - //endPos = new Vector2(endPos.X + Game1.localRandom.Next(-2, 2), endPos.Y + Game1.localRandom.Next(-2, 2)); - - //GUI.DrawLine(spriteBatch, startPos, endPos, Color.Orange, 0.0f); - - IsActive = false; - } - - } } diff --git a/Subsurface/Source/Items/Components/ItemComponent.cs b/Subsurface/Source/Items/Components/ItemComponent.cs index f9b3d110f..0cb055e7d 100644 --- a/Subsurface/Source/Items/Components/ItemComponent.cs +++ b/Subsurface/Source/Items/Components/ItemComponent.cs @@ -12,6 +12,11 @@ using System.Globalization; namespace Barotrauma.Items.Components { + interface IDrawableComponent + { + void Draw(SpriteBatch spriteBatch, bool editing); + } + class ItemSound { public readonly Sound Sound; @@ -104,6 +109,28 @@ namespace Barotrauma.Items.Components } } + private bool drawable = true; + + public bool Drawable + { + get { return drawable; } + set + { + if (value == drawable) return; + drawable = value; + if (drawable) + { + if (!item.drawableComponents.Contains(this as IDrawableComponent)) + item.drawableComponents.Add(this as IDrawableComponent); + } + else + { + item.drawableComponents.Remove(this as IDrawableComponent); + } + + } + } + [HasDefaultValue(false, false)] public bool CanBePicked { @@ -430,7 +457,10 @@ namespace Barotrauma.Items.Components /// a Character has dropped the item public virtual void Drop(Character dropper) { } - public virtual void Draw(SpriteBatch spriteBatch, bool editing = false) { } + //public virtual void Draw(SpriteBatch spriteBatch, bool editing = false) + //{ + // item.drawableComponents = Array.FindAll(item.drawableComponents, i => i != this); + //} public virtual void DrawHUD(SpriteBatch spriteBatch, Character character) { } diff --git a/Subsurface/Source/Items/Components/ItemContainer.cs b/Subsurface/Source/Items/Components/ItemContainer.cs index be6ef25ed..7829e3d5b 100644 --- a/Subsurface/Source/Items/Components/ItemContainer.cs +++ b/Subsurface/Source/Items/Components/ItemContainer.cs @@ -7,7 +7,7 @@ using Microsoft.Xna.Framework.Graphics; namespace Barotrauma.Items.Components { - class ItemContainer : ItemComponent + class ItemContainer : ItemComponent, IDrawableComponent { public const int MaxInventoryCount = 4; @@ -29,7 +29,11 @@ namespace Barotrauma.Items.Components public bool HideItems { get { return hideItems; } - set { hideItems = value; } + set + { + hideItems = value; + Drawable = !hideItems; + } } private bool hideItems; @@ -160,10 +164,8 @@ namespace Barotrauma.Items.Components } } - public override void Draw(SpriteBatch spriteBatch, bool editing = false) + public void Draw(SpriteBatch spriteBatch, bool editing = false) { - base.Draw(spriteBatch, editing); - if (hideItems || (item.body != null && !item.body.Enabled)) return; Vector2 transformedItemPos = itemPos; diff --git a/Subsurface/Source/Items/Components/ItemLabel.cs b/Subsurface/Source/Items/Components/ItemLabel.cs index a26acc44e..224c595bf 100644 --- a/Subsurface/Source/Items/Components/ItemLabel.cs +++ b/Subsurface/Source/Items/Components/ItemLabel.cs @@ -3,7 +3,7 @@ using Microsoft.Xna.Framework.Graphics; using System.Xml.Linq; namespace Barotrauma.Items.Components { - class ItemLabel : ItemComponent + class ItemLabel : ItemComponent, IDrawableComponent { private GUITextBlock textBlock; @@ -64,10 +64,8 @@ namespace Barotrauma.Items.Components { } - public override void Draw(SpriteBatch spriteBatch, bool editing = false) + public void Draw(SpriteBatch spriteBatch, bool editing = false) { - base.Draw(spriteBatch, editing); - var drawPos = new Vector2( item.DrawPosition.X - item.Rect.Width/2.0f, -(item.DrawPosition.Y + item.Rect.Height/2.0f)); diff --git a/Subsurface/Source/Items/Components/Machines/Reactor.cs b/Subsurface/Source/Items/Components/Machines/Reactor.cs index f809c0086..029727c75 100644 --- a/Subsurface/Source/Items/Components/Machines/Reactor.cs +++ b/Subsurface/Source/Items/Components/Machines/Reactor.cs @@ -8,7 +8,7 @@ using Barotrauma.Networking; namespace Barotrauma.Items.Components { - class Reactor : Powered + class Reactor : Powered, IDrawableComponent { const float NetworkUpdateInterval = 3.0f; @@ -385,10 +385,8 @@ namespace Barotrauma.Items.Components return picker != null; } - public override void Draw(SpriteBatch spriteBatch, bool editing = false) + public void Draw(SpriteBatch spriteBatch, bool editing = false) { - base.Draw(spriteBatch, editing); - GUI.DrawRectangle(spriteBatch, new Vector2(item.Rect.X + item.Rect.Width / 2 - 6, -item.Rect.Y + 29), new Vector2(12, 42), Color.Black); diff --git a/Subsurface/Source/Items/Components/Power/PowerContainer.cs b/Subsurface/Source/Items/Components/Power/PowerContainer.cs index 85ff2bd07..003381b5e 100644 --- a/Subsurface/Source/Items/Components/Power/PowerContainer.cs +++ b/Subsurface/Source/Items/Components/Power/PowerContainer.cs @@ -5,7 +5,7 @@ using Microsoft.Xna.Framework.Graphics; namespace Barotrauma.Items.Components { - class PowerContainer : Powered + class PowerContainer : Powered, IDrawableComponent { //[power/min] float capacity; @@ -224,10 +224,8 @@ namespace Barotrauma.Items.Components //if (connection.IsPower) voltage = power; } - public override void Draw(SpriteBatch spriteBatch, bool editing = false) + public void Draw(SpriteBatch spriteBatch, bool editing = false) { - base.Draw(spriteBatch, editing); - GUI.DrawRectangle(spriteBatch, new Vector2(item.DrawPosition.X- 4, -item.DrawPosition.Y), new Vector2(8, 22), Color.Black); diff --git a/Subsurface/Source/Items/Components/Rope.cs b/Subsurface/Source/Items/Components/Rope.cs index 846ed5eea..47ec48b48 100644 --- a/Subsurface/Source/Items/Components/Rope.cs +++ b/Subsurface/Source/Items/Components/Rope.cs @@ -13,7 +13,7 @@ using Microsoft.Xna.Framework.Graphics; namespace Barotrauma.Items.Components { - class Rope : ItemComponent + class Rope : ItemComponent, IDrawableComponent { PhysicsBody[] ropeBodies; RevoluteJoint[] ropeJoints; @@ -239,10 +239,8 @@ namespace Barotrauma.Items.Components } } - public override void Draw(SpriteBatch spriteBatch, bool editing = false) + public void Draw(SpriteBatch spriteBatch, bool editing = false) { - base.Draw(spriteBatch, editing); - if (!IsActive) return; RevoluteJoint firstJoint = null; diff --git a/Subsurface/Source/Items/Components/Signal/LightComponent.cs b/Subsurface/Source/Items/Components/Signal/LightComponent.cs index 987bc9172..f25a95a1b 100644 --- a/Subsurface/Source/Items/Components/Signal/LightComponent.cs +++ b/Subsurface/Source/Items/Components/Signal/LightComponent.cs @@ -5,7 +5,7 @@ using System.Xml.Linq; namespace Barotrauma.Items.Components { - class LightComponent : Powered + class LightComponent : Powered, IDrawableComponent { private Color lightColor; @@ -173,7 +173,7 @@ namespace Barotrauma.Items.Components return true; } - public override void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, bool editing = false) + public void Draw(Microsoft.Xna.Framework.Graphics.SpriteBatch spriteBatch, bool editing = false) { if (light.LightSprite != null && (item.body == null || item.body.Enabled)) { diff --git a/Subsurface/Source/Items/Components/Signal/Wire.cs b/Subsurface/Source/Items/Components/Signal/Wire.cs index ecb85bce6..9cb18be5f 100644 --- a/Subsurface/Source/Items/Components/Signal/Wire.cs +++ b/Subsurface/Source/Items/Components/Signal/Wire.cs @@ -8,7 +8,7 @@ using System.Xml.Linq; namespace Barotrauma.Items.Components { - class Wire : ItemComponent + class Wire : ItemComponent, IDrawableComponent { const float nodeDistance = 32.0f; const float heightFromFloor = 128.0f; @@ -129,6 +129,7 @@ namespace Barotrauma.Items.Components Nodes.Add(newConnection.Item.Position - Submarine.HiddenSubPosition); } + break; } @@ -150,6 +151,8 @@ namespace Barotrauma.Items.Components CleanNodes(); } + Drawable = Nodes.Any(); + if (!loading) Item.NewComponentEvent(this, true, true); return true; @@ -160,6 +163,7 @@ namespace Barotrauma.Items.Components ClearConnections(); IsActive = true; + //Drawable = true; } public override void Unequip(Character character) @@ -174,7 +178,6 @@ namespace Barotrauma.Items.Components ClearConnections(); IsActive = false; - } public override void Update(float deltaTime, Camera cam) @@ -221,6 +224,8 @@ namespace Barotrauma.Items.Components if (newNodePos!= Vector2.Zero && Nodes.Count>0 && Vector2.Distance(newNodePos, Nodes[Nodes.Count - 1]) > nodeDistance) { Nodes.Add(newNodePos); + Drawable = true; + newNodePos = Vector2.Zero; } return true; @@ -231,8 +236,11 @@ namespace Barotrauma.Items.Components if (Nodes.Count > 1) { Nodes.RemoveAt(Nodes.Count - 1); + item.NewComponentEvent(this, true, true); } + + Drawable = Nodes.Any(); } public override bool Pick(Character picker) @@ -256,6 +264,8 @@ namespace Barotrauma.Items.Components connections[i] = null; } + + Drawable = false; } private Vector2 RoundNode(Vector2 position, Hull hull) @@ -317,16 +327,19 @@ namespace Barotrauma.Items.Components } - - public override void Draw(SpriteBatch spriteBatch, bool editing) + public void Draw(SpriteBatch spriteBatch, bool editing) { - if (Nodes.Count == 0) return; - //for (int i = 0; i < nodes.Count; i++) //{ // GUI.DrawRectangle(spriteBatch, new Rectangle((int)nodes[i].X, (int)-nodes[i].Y, 5, 5), Color.DarkGray, true, wireSprite.Depth - 0.01f); //} + if (!Nodes.Any()) + { + Drawable = false; + return; + } + if (item.IsHighlighted) { for (int i = 1; i < Nodes.Count; i++) @@ -347,9 +360,9 @@ namespace Barotrauma.Items.Components //nodes.Add(newNodePos); } - if (!editing || !PlayerInput.MouseInsideWindow || !GameMain.EditMapScreen.WiringMode ) return; + if (!editing || !PlayerInput.MouseInsideWindow || !GameMain.EditMapScreen.WiringMode) return; if (Character.Controlled != null && Character.Controlled.SelectedConstruction != null) return; - + for (int i = 0; i < Nodes.Count; i++) { Vector2 worldPos = Nodes[i]; @@ -396,8 +409,8 @@ namespace Barotrauma.Items.Components Vector2 nodeWorldPos = GameMain.EditMapScreen.Cam.ScreenToWorld(PlayerInput.MousePosition) - Submarine.HiddenSubPosition - Submarine.Loaded.Position;// Nodes[(int)selectedNodeIndex]; - nodeWorldPos.X = MathUtils.Round(nodeWorldPos.X, Submarine.GridSize.X/2.0f); - nodeWorldPos.Y = MathUtils.Round(nodeWorldPos.Y, Submarine.GridSize.Y/2.0f); + nodeWorldPos.X = MathUtils.Round(nodeWorldPos.X, Submarine.GridSize.X / 2.0f); + nodeWorldPos.Y = MathUtils.Round(nodeWorldPos.Y, Submarine.GridSize.Y / 2.0f); //if (item.Submarine != null) nodeWorldPos += item.Submarine.Position; @@ -478,6 +491,8 @@ namespace Barotrauma.Items.Components Nodes.Add(new Vector2(x, y)); } + Drawable = Nodes.Any(); + } protected override void RemoveComponentSpecific() @@ -513,6 +528,8 @@ namespace Barotrauma.Items.Components } Nodes = newNodes; + + Drawable = Nodes.Any(); } } } diff --git a/Subsurface/Source/Items/Components/Turret.cs b/Subsurface/Source/Items/Components/Turret.cs index 5f91fae90..1b134937e 100644 --- a/Subsurface/Source/Items/Components/Turret.cs +++ b/Subsurface/Source/Items/Components/Turret.cs @@ -8,7 +8,7 @@ using FarseerPhysics; namespace Barotrauma.Items.Components { - class Turret : Powered + class Turret : Powered, IDrawableComponent { Sprite barrelSprite; @@ -90,7 +90,7 @@ namespace Barotrauma.Items.Components } } - public override void Draw(SpriteBatch spriteBatch, bool editing = false) + public void Draw(SpriteBatch spriteBatch, bool editing = false) { Vector2 drawPos = new Vector2(item.Rect.X, item.Rect.Y); if (item.Submarine != null) drawPos += item.Submarine.DrawPosition; diff --git a/Subsurface/Source/Items/Item.cs b/Subsurface/Source/Items/Item.cs index 169794a58..c070612e6 100644 --- a/Subsurface/Source/Items/Item.cs +++ b/Subsurface/Source/Items/Item.cs @@ -42,6 +42,7 @@ namespace Barotrauma //components that determine the functionality of the item public List components; + public List drawableComponents; public PhysicsBody body; @@ -98,7 +99,7 @@ namespace Barotrauma { get { - return ParentInventory == null && (body == null || body.Enabled); + return parentInventory == null && (body == null || body.Enabled); } } @@ -312,10 +313,11 @@ namespace Barotrauma spriteColor = prefab.SpriteColor; - linkedTo = new ObservableCollection(); - components = new List(); - FixRequirements = new List(); - tags = new List(); + linkedTo = new ObservableCollection(); + components = new List(); + drawableComponents = new List(); + FixRequirements = new List(); + tags = new List(); rect = newRect; @@ -339,8 +341,6 @@ namespace Barotrauma properties = ObjectProperty.InitProperties(this, element); - - foreach (XElement subElement in element.Elements()) { switch (subElement.Name.ToString().ToLowerInvariant()) @@ -366,6 +366,8 @@ namespace Barotrauma components.Add(ic); + if (ic is IDrawableComponent && ic.Drawable) drawableComponents.Add(ic as IDrawableComponent); + if (ic.statusEffectLists == null) continue; if (statusEffectLists == null) @@ -394,7 +396,7 @@ namespace Barotrauma break; } } - + //containers need to handle collision events to notify items inside them about the impact if (ImpactTolerance > 0.0f || GetComponent() != null) { @@ -846,8 +848,13 @@ namespace Barotrauma } } } - - foreach (ItemComponent component in components) component.Draw(spriteBatch, editing); + + for (int i = 0; i < drawableComponents.Count; i++ ) + { + drawableComponents[i].Draw(spriteBatch, editing); + } + + //foreach (ItemComponent component in components) component.Draw(spriteBatch, editing); if (GameMain.DebugDraw && aiTarget!=null) aiTarget.Draw(spriteBatch);