diff --git a/Content.Client/Content.Client.csproj b/Content.Client/Content.Client.csproj
index 63590a2505..4a730db0b9 100644
--- a/Content.Client/Content.Client.csproj
+++ b/Content.Client/Content.Client.csproj
@@ -74,6 +74,7 @@
+
diff --git a/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs b/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs
new file mode 100644
index 0000000000..8496bdf640
--- /dev/null
+++ b/Content.Client/GameObjects/Components/Doors/AirlockVisualizer2D.cs
@@ -0,0 +1,40 @@
+using System;
+using Content.Shared.GameObjects.Components.Doors;
+using SS14.Client.GameObjects;
+using SS14.Client.Interfaces.GameObjects.Components;
+
+namespace Content.Client.GameObjects.Components.Doors
+{
+ public class AirlockVisualizer2D : AppearanceVisualizer
+ {
+ public override void OnChangeData(AppearanceComponent component)
+ {
+ base.OnChangeData(component);
+
+ var sprite = component.Owner.GetComponent();
+ if (!component.TryGetData(DoorVisuals.VisualState, out DoorVisualState state))
+ {
+ state = DoorVisualState.Closed;
+ }
+
+ switch (state)
+ {
+ case DoorVisualState.Closed:
+ case DoorVisualState.Closing:
+ sprite.LayerSetState(DoorVisualLayers.Base, "closed");
+ break;
+ case DoorVisualState.Opening:
+ case DoorVisualState.Open:
+ sprite.LayerSetState(DoorVisualLayers.Base, "open");
+ break;
+ default:
+ throw new ArgumentOutOfRangeException();
+ }
+ }
+ }
+
+ public enum DoorVisualLayers
+ {
+ Base
+ }
+}
diff --git a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs
index 851f67484e..3687dd8f30 100644
--- a/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs
+++ b/Content.Server/GameObjects/Components/Doors/ServerDoorComponent.cs
@@ -9,6 +9,7 @@ using SS14.Shared.Log;
using SS14.Shared.Maths;
using SS14.Shared.IoC;
using Content.Server.GameObjects.EntitySystems;
+using Content.Shared.GameObjects.Components.Doors;
using SS14.Shared.Serialization;
using SS14.Shared.Interfaces.Network;
using SS14.Shared.ViewVariables;
@@ -24,31 +25,20 @@ namespace Content.Server.GameObjects
private float OpenTimeCounter;
private CollidableComponent collidableComponent;
- private SpriteComponent spriteComponent;
-
- private string OpenSprite;
- private string CloseSprite;
-
- public override void ExposeData(ObjectSerializer serializer)
- {
- base.ExposeData(serializer);
-
- serializer.DataField(ref OpenSprite, "openstate", "Objects/door_ewo.png");
- serializer.DataField(ref CloseSprite, "closestate", "Objects/door_ew.png");
- }
+ private AppearanceComponent _appearance;
public override void Initialize()
{
base.Initialize();
collidableComponent = Owner.GetComponent();
- spriteComponent = Owner.GetComponent();
+ _appearance = Owner.GetComponent();
}
public override void OnRemove()
{
collidableComponent = null;
- spriteComponent = null;
+ _appearance = null;
base.OnRemove();
}
@@ -87,7 +77,7 @@ namespace Content.Server.GameObjects
{
Opened = true;
collidableComponent.IsHardCollidable = false;
- spriteComponent.LayerSetTexture(0, OpenSprite);
+ _appearance.SetData(DoorVisuals.VisualState, DoorVisualState.Open);
}
public bool Close()
@@ -100,7 +90,7 @@ namespace Content.Server.GameObjects
Opened = false;
OpenTimeCounter = 0;
collidableComponent.IsHardCollidable = true;
- spriteComponent.LayerSetTexture(0, CloseSprite);
+ _appearance.SetData(DoorVisuals.VisualState, DoorVisualState.Closed);
return true;
}
diff --git a/Content.Shared/Content.Shared.csproj b/Content.Shared/Content.Shared.csproj
index d2c544bb01..efa29c505e 100644
--- a/Content.Shared/Content.Shared.csproj
+++ b/Content.Shared/Content.Shared.csproj
@@ -64,6 +64,7 @@
+
diff --git a/Content.Shared/GameObjects/Components/Doors/SharedDoorComponent.cs b/Content.Shared/GameObjects/Components/Doors/SharedDoorComponent.cs
new file mode 100644
index 0000000000..8e19d0c58c
--- /dev/null
+++ b/Content.Shared/GameObjects/Components/Doors/SharedDoorComponent.cs
@@ -0,0 +1,22 @@
+using System;
+using SS14.Shared.Serialization;
+
+namespace Content.Shared.GameObjects.Components.Doors
+{
+ [NetSerializable]
+ [Serializable]
+ public enum DoorVisuals
+ {
+ VisualState,
+ }
+
+ [NetSerializable]
+ [Serializable]
+ public enum DoorVisualState
+ {
+ Closed,
+ Opening,
+ Open,
+ Closing,
+ }
+}
diff --git a/Resources/Maps/stationstation.yml b/Resources/Maps/stationstation.yml
index f6b73b2779..6bf8f52630 100644
--- a/Resources/Maps/stationstation.yml
+++ b/Resources/Maps/stationstation.yml
@@ -166,7 +166,7 @@ entities:
pos: 6,-4
rot: -1.570796 rad
type: Transform
-- type: DoorContent
+- type: airlock
components:
- grid: 0
pos: -5.5,-4.5
@@ -238,7 +238,7 @@ entities:
pos: -2.5,-4.5
rot: -1.570796 rad
type: Transform
-- type: DoorContent
+- type: airlock
components:
- grid: 0
pos: 4.5,-4.5
diff --git a/Resources/Prototypes/Entities/Door.yml b/Resources/Prototypes/Entities/Door.yml
index 3860d157f5..00b939b776 100644
--- a/Resources/Prototypes/Entities/Door.yml
+++ b/Resources/Prototypes/Entities/Door.yml
@@ -1,23 +1,24 @@
- type: entity
- id: DoorContent
- name: Actual door
- description: It opens, it closes!
+ id: airlock
+ name: Airlock
+ description: It opens, it closes, and maybe crushes you.
components:
- type: Clickable
- type: Sprite
+
drawdepth: Mobs # They're on the same layer as mobs, perspective.
- texture: Objects/door_ew.png
+ sprite: Buildings/airlock_basic.rsi
+ layers:
+ - state: closed
+ map: ["enum.DoorVisualLayers.Base"]
- type: Icon
- texture: Objects/door_ew.png
+ sprite: Buildings/airlock_basic.rsi
+ state: closed
- type: BoundingBox
- aabb: "-2,-0.75,-1,0.75"
- sizeX: 1.9
- offsetY: 1.5
- type: Collidable
- type: Door
-
- placement:
- snap:
- - Wall
+ - type: Appearance
+ visuals:
+ - type: AirlockVisualizer2D
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/closed.png b/Resources/Textures/Buildings/airlock_basic.rsi/closed.png
new file mode 100644
index 0000000000..61e7b2d568
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/closed.png differ
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/closing.png b/Resources/Textures/Buildings/airlock_basic.rsi/closing.png
new file mode 100644
index 0000000000..385ce627f7
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/closing.png differ
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/deny.png b/Resources/Textures/Buildings/airlock_basic.rsi/deny.png
new file mode 100644
index 0000000000..f2a4cecf9e
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/deny.png differ
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/locked.png b/Resources/Textures/Buildings/airlock_basic.rsi/locked.png
new file mode 100644
index 0000000000..fb22d2c3f5
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/locked.png differ
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/meta.json b/Resources/Textures/Buildings/airlock_basic.rsi/meta.json
new file mode 100644
index 0000000000..b4c323b79e
--- /dev/null
+++ b/Resources/Textures/Buildings/airlock_basic.rsi/meta.json
@@ -0,0 +1 @@
+{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/discordia-space/CEV-Eris/blob/2b969adc2dfd3e9621bf3597c5cbffeb3ac8c9f0/icons/obj/doors/doorint.dmi", "states": [{"name": "closed", "directions": 1, "delays": [[1.0]]}, {"name": "closing", "directions": 1, "delays": [[0.2, 0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.3]]}, {"name": "deny", "directions": 1, "delays": [[0.1, 0.1, 0.1]]}, {"name": "locked", "directions": 1, "delays": [[1.0]]}, {"name": "o_closing", "directions": 1, "delays": [[0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.4]]}, {"name": "o_opening", "directions": 1, "delays": [[0.2, 0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.3]]}, {"name": "open", "directions": 1, "delays": [[1.0]]}, {"name": "opening", "directions": 1, "delays": [[0.2, 0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.3]]}, {"name": "spark", "directions": 1, "delays": [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1]]}]}
\ No newline at end of file
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/o_closing.png b/Resources/Textures/Buildings/airlock_basic.rsi/o_closing.png
new file mode 100644
index 0000000000..56ba00b3e0
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/o_closing.png differ
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/o_opening.png b/Resources/Textures/Buildings/airlock_basic.rsi/o_opening.png
new file mode 100644
index 0000000000..8bdc9f6b5c
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/o_opening.png differ
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/open.png b/Resources/Textures/Buildings/airlock_basic.rsi/open.png
new file mode 100644
index 0000000000..ac56b5978f
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/open.png differ
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/opening.png b/Resources/Textures/Buildings/airlock_basic.rsi/opening.png
new file mode 100644
index 0000000000..aad71edf91
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/opening.png differ
diff --git a/Resources/Textures/Buildings/airlock_basic.rsi/spark.png b/Resources/Textures/Buildings/airlock_basic.rsi/spark.png
new file mode 100644
index 0000000000..b52aff0a92
Binary files /dev/null and b/Resources/Textures/Buildings/airlock_basic.rsi/spark.png differ