- Barotrauma's projects are in the Barotrauma directory - All libraries are in the Libraries directory - MonoGame is now managed by NuGet, rather than referenced from the installed files (TODO: consider using PCL for easier cross-platform development?) - NuGet libraries are not included in the repo, as getting the latest versions automatically should be preferred - Removed Content/effects.mgfx as it didn't seem to be used anywhere - Removed some references to Subsurface directory - Renamed Launcher2 to Launcher
143 lines
5.1 KiB
C#
143 lines
5.1 KiB
C#
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);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|