using Barotrauma.Lights; using Barotrauma.Networking; using FarseerPhysics; using FarseerPhysics.Dynamics; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Graphics; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Xml.Linq; namespace Barotrauma.Items.Components { partial class Door : ItemComponent, IDrawableComponent, IServerSerializable { private ConvexHull convexHull; private ConvexHull convexHull2; private Vector2[] GetConvexHullCorners(Rectangle rect) { Vector2[] corners = new Vector2[4]; corners[0] = new Vector2(rect.X, rect.Y - rect.Height); corners[1] = new Vector2(rect.X, rect.Y); corners[2] = new Vector2(rect.Right, rect.Y); corners[3] = new Vector2(rect.Right, rect.Y - rect.Height); return corners; } private void UpdateConvexHulls() { doorRect = new Rectangle( item.Rect.Center.X - (int)(doorSprite.size.X / 2), item.Rect.Y - item.Rect.Height / 2 + (int)(doorSprite.size.Y / 2.0f), (int)doorSprite.size.X, (int)doorSprite.size.Y); Rectangle rect = doorRect; if (isHorizontal) { rect.Width = (int)(rect.Width * (1.0f - openState)); } else { rect.Height = (int)(rect.Height * (1.0f - openState)); } if (window.Height > 0 && window.Width > 0) { rect.Height = -window.Y; rect.Y += (int)(doorRect.Height * openState); rect.Height = Math.Max(rect.Height - (rect.Y - doorRect.Y), 0); rect.Y = Math.Min(doorRect.Y, rect.Y); if (convexHull2 != null) { Rectangle rect2 = doorRect; rect2.Y = rect2.Y + window.Y - window.Height; rect2.Y += (int)(doorRect.Height * openState); rect2.Y = Math.Min(doorRect.Y, rect2.Y); rect2.Height = rect2.Y - (doorRect.Y - (int)(doorRect.Height * (1.0f - openState))); //convexHull2.SetVertices(GetConvexHullCorners(rect2)); if (rect2.Height == 0) { convexHull2.Enabled = false; } else { convexHull2.Enabled = true; convexHull2.SetVertices(GetConvexHullCorners(rect2)); } } } if (convexHull == null) return; if (rect.Height == 0 || rect.Width == 0) { convexHull.Enabled = false; } else { convexHull.Enabled = true; convexHull.SetVertices(GetConvexHullCorners(rect)); } } public void Draw(SpriteBatch spriteBatch, bool editing) { Color color = (item.IsSelected) ? Color.Green : Color.White; color = color * (item.Condition / 100.0f); color.A = 255; //prefab.sprite.Draw(spriteBatch, new Vector2(rect.X, -rect.Y), new Vector2(rect.Width, rect.Height), color); if (stuck > 0.0f && weldedSprite != null) { Vector2 weldSpritePos = new Vector2(item.Rect.Center.X, item.Rect.Y - item.Rect.Height / 2.0f); if (item.Submarine != null) weldSpritePos += item.Submarine.Position; weldSpritePos.Y = -weldSpritePos.Y; weldedSprite.Draw(spriteBatch, weldSpritePos, Color.White * (stuck / 100.0f), 0.0f, 1.0f); } if (openState == 1.0f) { body.Enabled = false; return; } if (isHorizontal) { Vector2 pos = new Vector2(item.Rect.X, item.Rect.Y - item.Rect.Height / 2); if (item.Submarine != null) pos += item.Submarine.DrawPosition; pos.Y = -pos.Y; spriteBatch.Draw(doorSprite.Texture, pos, new Rectangle((int)(doorSprite.SourceRect.X + doorSprite.size.X * openState), (int)doorSprite.SourceRect.Y, (int)(doorSprite.size.X * (1.0f - openState)), (int)doorSprite.size.Y), color, 0.0f, doorSprite.Origin, 1.0f, SpriteEffects.None, doorSprite.Depth); } else { Vector2 pos = new Vector2(item.Rect.Center.X, item.Rect.Y); if (item.Submarine != null) pos += item.Submarine.DrawPosition; pos.Y = -pos.Y; spriteBatch.Draw(doorSprite.Texture, pos, new Rectangle(doorSprite.SourceRect.X, (int)(doorSprite.SourceRect.Y + doorSprite.size.Y * openState), (int)doorSprite.size.X, (int)(doorSprite.size.Y * (1.0f - openState))), color, 0.0f, doorSprite.Origin, 1.0f, SpriteEffects.None, doorSprite.Depth); } } } }