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