diff --git a/Subsurface/Content/Items/Door/door.png b/Subsurface/Content/Items/Door/door.png
index 8eda30353..435e2a5bf 100644
Binary files a/Subsurface/Content/Items/Door/door.png and b/Subsurface/Content/Items/Door/door.png differ
diff --git a/Subsurface/Content/Items/Door/doors.xml b/Subsurface/Content/Items/Door/doors.xml
index bf3a18d10..8a0a70afb 100644
--- a/Subsurface/Content/Items/Door/doors.xml
+++ b/Subsurface/Content/Items/Door/doors.xml
@@ -4,11 +4,11 @@
linkable="true"
pickdistance="150.0">
-
+
-
+
@@ -32,11 +32,39 @@
linkable="true"
pickdistance="150.0">
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
diff --git a/Subsurface/Source/Items/Components/Door.cs b/Subsurface/Source/Items/Components/Door.cs
index 6e5d41421..d26bbf258 100644
--- a/Subsurface/Source/Items/Components/Door.cs
+++ b/Subsurface/Source/Items/Components/Door.cs
@@ -108,7 +108,9 @@ namespace Barotrauma.Items.Components
: base(item, element)
{
//Vector2 position = new Vector2(newRect.X, newRect.Y);
-
+
+ isHorizontal = ToolBox.GetAttributeBool(element, "horizontal", false);
+
// isOpen = false;
foreach (XElement subElement in element.Elements())
{
@@ -245,36 +247,9 @@ namespace Barotrauma.Items.Components
LinkedGap.Open = openState;
}
- if (openState > 0.0f && openState < 1.0f)
+ if (openState > 0.0f && openState < 1.0f && !isOpen)
{
- //push characters out of the doorway when the door is closing/opening
- Vector2 simPos = ConvertUnits.ToSimUnits(new Vector2(item.Rect.X, item.Rect.Y));
- Vector2 simSize = ConvertUnits.ToSimUnits(new Vector2(doorSprite.size.X,
- item.Rect.Height * (1.0f - openState)));
-
- foreach (Character c in Character.CharacterList)
- {
- int dir = Math.Sign(c.SimPosition.X - item.SimPosition.X);
- foreach (Limb l in c.AnimController.Limbs)
- {
- if (l.SimPosition.Y > simPos.Y || l.SimPosition.Y < simPos.Y - simSize.Y) continue;
-
- if (Math.Sign(l.SimPosition.X - item.SimPosition.X) != dir)
- {
- l.body.SetTransform(new Vector2(item.SimPosition.X + dir * simSize.X*1.2f, item.SimPosition.Y), l.body.Rotation);
- SoundPlayer.PlayDamageSound(DamageSoundType.LimbBlunt, 1.0f, l.body);
- //c.AddDamage(item.SimPosition, DamageType.Blunt, 1.0f, 0.0f, 0.0f, true);
-
- l.body.ApplyLinearImpulse(new Vector2(dir * 0.5f, isOpen ? 0.0f : -1.0f));
- }
-
- if (Math.Abs(l.SimPosition.X - item.SimPosition.X) > simSize.X*0.5f) continue;
-
-
- l.body.ApplyLinearImpulse(new Vector2(dir * 0.5f, isOpen ? 0.0f : -0.5f));
- c.StartStun(0.2f);
- }
- }
+ PushCharactersAway();
}
else
{
@@ -303,7 +278,7 @@ namespace Barotrauma.Items.Components
if (stuck>0.0f && weldedSprite!=null)
{
- Vector2 weldSpritePos = new Vector2(item.Rect.X, item.Rect.Y);
+ 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;
@@ -317,14 +292,31 @@ namespace Barotrauma.Items.Components
return;
}
- 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.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);
+
+ 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.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);
+ }
+
}
public override void OnMapLoaded()
@@ -353,6 +345,72 @@ namespace Barotrauma.Items.Components
if (convexHull2 != null) convexHull2.Remove();
}
+ private void PushCharactersAway()
+ {
+ //push characters out of the doorway when the door is closing/opening
+ Vector2 simPos = ConvertUnits.ToSimUnits(new Vector2(item.Rect.X, item.Rect.Y));
+
+ Vector2 currSize = isHorizontal ?
+ new Vector2(item.Rect.Width * (1.0f - openState), doorSprite.size.Y) :
+ new Vector2(doorSprite.size.X, item.Rect.Height * (1.0f - openState));
+
+ Vector2 simSize = ConvertUnits.ToSimUnits(currSize);
+
+ foreach (Character c in Character.CharacterList)
+ {
+ int dir = isHorizontal ? Math.Sign(c.SimPosition.Y - item.SimPosition.Y) : Math.Sign(c.SimPosition.X - item.SimPosition.X);
+
+ foreach (Limb l in c.AnimController.Limbs)
+ {
+ float diff = 0.0f;
+
+ if (isHorizontal)
+ {
+ if (l.SimPosition.X < simPos.X || l.SimPosition.X > simPos.X + simSize.X) continue;
+
+ diff = l.SimPosition.Y - item.SimPosition.Y;
+ }
+ else
+ {
+ if (l.SimPosition.Y > simPos.Y || l.SimPosition.Y < simPos.Y - simSize.Y) continue;
+
+ diff = l.SimPosition.X - item.SimPosition.X;
+ }
+
+ if (Math.Sign(diff) != dir)
+ {
+ SoundPlayer.PlayDamageSound(DamageSoundType.LimbBlunt, 1.0f, l.body);
+
+ if (isHorizontal)
+ {
+ l.body.SetTransform(new Vector2(l.SimPosition.X, item.SimPosition.Y + dir * simSize.Y * 1.2f), l.body.Rotation);
+ l.body.ApplyLinearImpulse(new Vector2(isOpen ? 0.0f : 1.0f, dir * 0.5f));
+ }
+ else
+ {
+ l.body.SetTransform(new Vector2(item.SimPosition.X + dir * simSize.X * 1.2f, l.SimPosition.Y), l.body.Rotation);
+ l.body.ApplyLinearImpulse(new Vector2(dir * 0.5f, isOpen ? 0.0f : -1.0f));
+ }
+ }
+
+ if (isHorizontal)
+ {
+ if (Math.Abs(l.SimPosition.Y - item.SimPosition.Y) > simSize.Y * 0.5f) continue;
+
+ l.body.ApplyLinearImpulse(new Vector2(isOpen ? 0.0f : 1.0f, dir * 0.5f));
+ }
+ else
+ {
+ if (Math.Abs(l.SimPosition.X - item.SimPosition.X) > simSize.X * 0.5f) continue;
+
+ l.body.ApplyLinearImpulse(new Vector2(dir * 0.5f, isOpen ? 0.0f : -1.0f));
+ }
+
+ c.StartStun(0.2f);
+ }
+ }
+ }
+
public override void ReceiveSignal(string signal, Connection connection, Item sender, float power=0.0f)
{
if (isStuck) return;
diff --git a/Subsurface/Source/Items/Components/Holdable/Holdable.cs b/Subsurface/Source/Items/Components/Holdable/Holdable.cs
index dc06330cc..eb84b6a33 100644
--- a/Subsurface/Source/Items/Components/Holdable/Holdable.cs
+++ b/Subsurface/Source/Items/Components/Holdable/Holdable.cs
@@ -110,7 +110,7 @@ namespace Barotrauma.Items.Components
public override void Drop(Character dropper)
{
- item.body.Enabled = true;
+ if (item.body != null) item.body.Enabled = true;
IsActive = false;
if (picker == null)
diff --git a/Subsurface_Solution.v12.suo b/Subsurface_Solution.v12.suo
index 281c36942..cc99df16d 100644
Binary files a/Subsurface_Solution.v12.suo and b/Subsurface_Solution.v12.suo differ