Fix: Двойные/Тройные шлюзы (#3719)

This commit is contained in:
Daniel 2026-01-15 22:23:40 +01:00 committed by GitHub
parent 0297f84311
commit 1f97e396d0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 580 additions and 12 deletions

View file

@ -0,0 +1,22 @@
namespace Content.Server._Sunrise.Doors.Components;
/// <summary>
/// Сейчас используется только под двойные, тройные шлюзы
/// Спавнит блокеры по боковым частям относительно главного тайла
/// </summary>
[RegisterComponent]
public sealed partial class SunriseMultiTileAirtightComponent : Component
{
/// <summary>
/// Список оффсетов в локальных координатах двери, на каких тайлах должны появиться блокеры
/// Оффсет задает относительно главной точки двери
/// </summary>
[DataField(required: true)]
public List<Vector2i> ExtraTiles = new();
/// <summary>
/// Cписок заспавненных блокеров, используется системой для обновления airtight
/// </summary>
public List<EntityUid> Blockers = new();
}

View file

@ -0,0 +1,173 @@
using System.Numerics;
using Content.Server._Sunrise.Doors.Components;
using Content.Server.Atmos.Components;
using Content.Server.Atmos.EntitySystems;
using Content.Shared.Doors;
using Content.Shared.Doors.Components;
using Robust.Shared.Map;
using Robust.Shared.Map.Components;
using Robust.Server.GameObjects;
namespace Content.Server._Sunrise.Doors.Systems;
/// <summary>
/// Нужна чтобы мультитайловые двойные или тройные шлюзы нормально не пропускали газы
/// Спавнит блокеры на соседних тайлах и регулирует когда блокеры не пропускают газ, когда пропускают. В зависимости от состояния шлюза
/// </summary>
public sealed class SunriseMultiTileAirtightSystem : EntitySystem
{
private const string BlockerPrototype = "SunriseMultiTileAirtightBlocker";
[Dependency] private readonly AirtightSystem _airtight = default!;
[Dependency] private readonly TransformSystem _transform = default!;
private EntityQuery<AirtightComponent> _airtightQuery;
private EntityQuery<DoorComponent> _doorQuery;
private EntityQuery<MapGridComponent> _gridQuery;
private EntityQuery<TransformComponent> _xformQuery;
public override void Initialize()
{
base.Initialize();
_airtightQuery = GetEntityQuery<AirtightComponent>();
_doorQuery = GetEntityQuery<DoorComponent>();
_gridQuery = GetEntityQuery<MapGridComponent>();
_xformQuery = GetEntityQuery<TransformComponent>();
SubscribeLocalEvent<SunriseMultiTileAirtightComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<SunriseMultiTileAirtightComponent, ComponentShutdown>(OnShutdown);
SubscribeLocalEvent<SunriseMultiTileAirtightComponent, AirtightChanged>(OnAirtightChanged);
SubscribeLocalEvent<SunriseMultiTileAirtightComponent, DoorStateChangedEvent>(OnDoorStateChanged);
SubscribeLocalEvent<SunriseMultiTileAirtightComponent, AnchorStateChangedEvent>(OnAnchorChanged);
SubscribeLocalEvent<SunriseMultiTileAirtightComponent, ReAnchorEvent>(OnReAnchor);
SubscribeLocalEvent<SunriseMultiTileAirtightComponent, MoveEvent>(OnMoved);
}
private void OnMapInit(Entity<SunriseMultiTileAirtightComponent> ent, ref MapInitEvent args)
{
RefreshGeometry(ent);
RefreshAirblock(ent);
}
private void OnShutdown(Entity<SunriseMultiTileAirtightComponent> ent, ref ComponentShutdown args)
{
DeleteBlockers(ent);
}
private void OnDoorStateChanged(Entity<SunriseMultiTileAirtightComponent> ent, ref DoorStateChangedEvent args)
{
RefreshAirblock(ent);
}
private void OnAirtightChanged(Entity<SunriseMultiTileAirtightComponent> ent, ref AirtightChanged args)
{
if (!args.AirBlockedChanged)
return;
RefreshAirblock(ent);
}
private void OnAnchorChanged(Entity<SunriseMultiTileAirtightComponent> ent, ref AnchorStateChangedEvent args)
{
RefreshGeometry(ent);
RefreshAirblock(ent);
}
private void OnReAnchor(Entity<SunriseMultiTileAirtightComponent> ent, ref ReAnchorEvent args)
{
RefreshGeometry(ent);
RefreshAirblock(ent);
}
private void OnMoved(Entity<SunriseMultiTileAirtightComponent> ent, ref MoveEvent args)
{
RefreshGeometry(ent);
RefreshAirblock(ent);
}
/// <summary>
/// Пересоздает блокеры на дополнительных тайлах
/// ExtraTiles задаются в локальных координатах двери, поэтому оффсет надо повернуть по направлению двери
/// После поворота округяем сразу до целых тайлов, потому что поворот идет через float
/// </summary>
private void RefreshGeometry(Entity<SunriseMultiTileAirtightComponent> ent)
{
DeleteBlockers(ent);
if (!_xformQuery.TryGetComponent(ent.Owner, out var xform))
return;
if (!xform.Anchored || xform.GridUid is not { } gridUid || !_gridQuery.TryGetComponent(gridUid, out var grid))
return;
var baseTile = _transform.GetGridTilePositionOrDefault((ent, xform), grid);
var rotation = xform.LocalRotation.RoundToCardinalAngle();
foreach (var local in ent.Comp.ExtraTiles)
{
var rotated = rotation.RotateVec(new Vector2(local.X, local.Y));
var offset = new Vector2i((int)MathF.Round(rotated.X), (int)MathF.Round(rotated.Y));
var tile = baseTile + offset;
var coords = GetTileCenter(gridUid, grid, tile);
var blocker = Spawn(BlockerPrototype, coords);
var blockerXform = _xformQuery.GetComponent(blocker);
// Обязательно анкорим на грид и конкретный тайл, ибо airtight будет не на том месте будет и будет адское шоу
if (!_transform.AnchorEntity((blocker, blockerXform), (gridUid, grid), tile))
{
Del(blocker);
continue;
}
ent.Comp.Blockers.Add(blocker);
}
}
/// <summary>
/// Синхронизирует Airtight.AirBlocked у всех блокеров у двери
/// Если у двери есть AirtightComponent то берем его AirBlocked
/// </summary>
private void RefreshAirblock(Entity<SunriseMultiTileAirtightComponent> ent)
{
bool blocked;
if (_airtightQuery.TryGetComponent(ent.Owner, out var doorAirtight))
blocked = doorAirtight.AirBlocked;
else
{
if (!_doorQuery.TryGetComponent(ent.Owner, out var door))
return;
blocked = door.State is DoorState.Closed or DoorState.Welded;
}
foreach (var blocker in ent.Comp.Blockers)
{
if (!_airtightQuery.TryGetComponent(blocker, out var airtight))
continue;
_airtight.SetAirblocked((blocker, airtight), blocked);
}
}
private void DeleteBlockers(Entity<SunriseMultiTileAirtightComponent> ent)
{
foreach (var blocker in ent.Comp.Blockers)
{
if (!Deleted(blocker))
Del(blocker);
}
ent.Comp.Blockers.Clear();
}
private static EntityCoordinates GetTileCenter(EntityUid gridUid, MapGridComponent grid, Vector2i tile)
{
// +0.5f чтобы получить центр тайла, а то берет то правый угол, то левый
var pos = new Vector2(tile.X + 0.5f, tile.Y + 0.5f) * grid.TileSize;
return new EntityCoordinates(gridUid, pos);
}
}

View file

@ -0,0 +1,33 @@
# Groups
spray-painter-tab-group-airlockdoubleglass = Double
spray-painter-tab-group-airlocktripleglass = Triple
# Double glass airlocks
spray-painter-style-airlockdoubleglass-atmospherics = Atmospherics
spray-painter-style-airlockdoubleglass-basic = Basic
spray-painter-style-airlockdoubleglass-cargo = Cargo
spray-painter-style-airlockdoubleglass-chemistry = Chemistry
spray-painter-style-airlockdoubleglass-command = Command
spray-painter-style-airlockdoubleglass-engineering = Engineering
spray-painter-style-airlockdoubleglass-maintenance = Maintenance
spray-painter-style-airlockdoubleglass-medical = Medical
spray-painter-style-airlockdoubleglass-salvage = Salvage
spray-painter-style-airlockdoubleglass-science = Science
spray-painter-style-airlockdoubleglass-security = Security
spray-painter-style-airlockdoubleglass-virology = Virology
spray-painter-style-airlockdoubleglass-centralcommand = Central Command
# Triple glass airlocks
spray-painter-style-airlocktripleglass-atmospherics = Atmospherics
spray-painter-style-airlocktripleglass-basic = Basic
spray-painter-style-airlocktripleglass-cargo = Cargo
spray-painter-style-airlocktripleglass-chemistry = Chemistry
spray-painter-style-airlocktripleglass-command = Command
spray-painter-style-airlocktripleglass-engineering = Engineering
spray-painter-style-airlocktripleglass-maintenance = Maintenance
spray-painter-style-airlocktripleglass-medical = Medical
spray-painter-style-airlocktripleglass-salvage = Salvage
spray-painter-style-airlocktripleglass-science = Science
spray-painter-style-airlocktripleglass-security = Security
spray-painter-style-airlocktripleglass-virology = Virology
spray-painter-style-airlocktripleglass-centralcommand = Central Command

View file

@ -0,0 +1,33 @@
# Группы
spray-painter-tab-group-airlockdoubleglass = Двойной
spray-painter-tab-group-airlocktripleglass = Тройной
# Двойные стеклянные шлюзы
spray-painter-style-airlockdoubleglass-atmospherics = Атмосферика
spray-painter-style-airlockdoubleglass-basic = Обычный
spray-painter-style-airlockdoubleglass-cargo = Снабжение
spray-painter-style-airlockdoubleglass-chemistry = Химия
spray-painter-style-airlockdoubleglass-command = Командный
spray-painter-style-airlockdoubleglass-engineering = Инженерный
spray-painter-style-airlockdoubleglass-maintenance = Технический
spray-painter-style-airlockdoubleglass-medical = Медицинский
spray-painter-style-airlockdoubleglass-salvage = Утилизация
spray-painter-style-airlockdoubleglass-science = Научный
spray-painter-style-airlockdoubleglass-security = Служба безопасности
spray-painter-style-airlockdoubleglass-virology = Вирусология
spray-painter-style-airlockdoubleglass-centralcommand = Центральное командование
# Тройные стеклянные шлюзы
spray-painter-style-airlocktripleglass-atmospherics = Атмосферика
spray-painter-style-airlocktripleglass-basic = Обычный
spray-painter-style-airlocktripleglass-cargo = Снабжение
spray-painter-style-airlocktripleglass-chemistry = Химия
spray-painter-style-airlocktripleglass-command = Командный
spray-painter-style-airlocktripleglass-engineering = Инженерный
spray-painter-style-airlocktripleglass-maintenance = Технический
spray-painter-style-airlocktripleglass-medical = Медицинский
spray-painter-style-airlocktripleglass-salvage = Утилизация
spray-painter-style-airlocktripleglass-science = Научный
spray-painter-style-airlocktripleglass-security = Служба безопасности
spray-painter-style-airlocktripleglass-virology = Вирусология
spray-painter-style-airlocktripleglass-centralcommand = Центральное командование

View file

@ -1,12 +0,0 @@
spray-painter-window-title = Краскопульт
spray-painter-style-not-available = Невозможно применить выбранный стиль к данному типу шлюза
spray-painter-selected-style = Выбранный стиль:
spray-painter-selected-color = Выбранный цвет:
spray-painter-color-red = красный
spray-painter-color-yellow = жёлтый
spray-painter-color-brown = коричневый
spray-painter-color-green = зелёный
spray-painter-color-cyan = голубой
spray-painter-color-blue = синий
spray-painter-color-white = белый
spray-painter-color-black = чёрный

View file

@ -1 +1,14 @@
pipe-painter-no-color-selected = (Цвет не выбран)
pipe-painter-color-red = красный
pipe-painter-color-yellow = жёлтый
pipe-painter-color-brown = коричневый
pipe-painter-color-green = зелёный
pipe-painter-color-cyan = голубой
pipe-painter-color-blue = синий
pipe-painter-color-white = белый
pipe-painter-color-black = чёрный
pipe-painter-color-waste = отходы
pipe-painter-color-distro = дистра
pipe-painter-color-air = воздух
pipe-painter-color-mix = смесь

View file

@ -0,0 +1,194 @@
# Components
spray-painter-ammo-on-examine = Вмещает {$charges} зарядов.
spray-painter-ammo-after-interact-full = Краскопульт полностью заправлен!
spray-painter-ammo-after-interact-refilled = Вы заправляете краскопульт.
spray-painter-interact-no-charges = Недостаточно краски.
spray-painter-interact-nothing-to-remove = Нечего удалять!
spray-painter-on-examined-painted-message = Похоже, объект был недавно окрашен.
spray-painter-style-not-available = Невозможно применить выбранный стиль к этому объекту.
spray-painter-verb-toggle-decals = Переключить рисование декалей
spray-painter-item-status-label = Декали: {$mode}
spray-painter-item-status-add = [color=green]Добавить[/color]
spray-painter-item-status-remove = [color=red]Удалить[/color]
spray-painter-item-status-off = [color=gray]Выкл.[/color]
# UI
spray-painter-window-title = Краскопульт
spray-painter-selected-style = Выбранный стиль:
spray-painter-selected-decals = Выбранная декаль:
spray-painter-use-custom-color = Использовать свой цвет
spray-painter-use-snap-to-tile = Привязать к тайлу
spray-painter-angle-rotation = Поворот:
spray-painter-angle-rotation-90-sub = -90°
spray-painter-angle-rotation-reset = 0°
spray-painter-angle-rotation-90-add = +90°
spray-painter-selected-color = Выбранный цвет:
spray-painter-color-red = красный
spray-painter-color-yellow = жёлтый
spray-painter-color-brown = коричневый
spray-painter-color-green = зелёный
spray-painter-color-cyan = голубой
spray-painter-color-blue = синий
spray-painter-color-white = белый
spray-painter-color-black = чёрный
# Categories (tabs)
spray-painter-tab-category-airlocks = Шлюзы
spray-painter-tab-category-canisters = Канистры
spray-painter-tab-category-crates = Ящики
spray-painter-tab-category-lockers = Шкафчики
spray-painter-tab-category-pipes = Трубы
spray-painter-tab-category-decals = Декали
spray-painter-tab-group-airlockstandard = Стандартный
spray-painter-tab-group-airlockglass = Стеклянный
spray-painter-tab-group-cratesteel = Сталь
spray-painter-tab-group-crateplastic = Пластик
spray-painter-tab-group-cratesecure = Защищённый
spray-painter-tab-group-closet = Незапертый
spray-painter-tab-group-locker = Запертый
spray-painter-tab-group-wallcloset = Незапертый (настенный)
spray-painter-tab-group-walllocker = Запертый (настенный)
# Airlocks
spray-painter-style-airlockstandard-atmospherics = Атмосферика
spray-painter-style-airlockstandard-basic = Обычный
spray-painter-style-airlockstandard-cargo = Снабжение
spray-painter-style-airlockstandard-chemistry = Химия
spray-painter-style-airlockstandard-command = Командный
spray-painter-style-airlockstandard-engineering = Инженерный
spray-painter-style-airlockstandard-freezer = Морозильник
spray-painter-style-airlockstandard-hydroponics = Гидропоника
spray-painter-style-airlockstandard-maintenance = Технический
spray-painter-style-airlockstandard-medical = Медицинский
spray-painter-style-airlockstandard-salvage = Утилизация
spray-painter-style-airlockstandard-science = Научный
spray-painter-style-airlockstandard-security = Служба безопасности
spray-painter-style-airlockstandard-virology = Вирусология
spray-painter-style-airlockglass-atmospherics = Атмосферика
spray-painter-style-airlockglass-basic = Обычный
spray-painter-style-airlockglass-cargo = Снабжение
spray-painter-style-airlockglass-chemistry = Химия
spray-painter-style-airlockglass-command = Командный
spray-painter-style-airlockglass-engineering = Инженерный
spray-painter-style-airlockglass-hydroponics = Гидропоника
spray-painter-style-airlockglass-maintenance = Технический
spray-painter-style-airlockglass-medical = Медицинский
spray-painter-style-airlockglass-salvage = Утилизация
spray-painter-style-airlockglass-science = Научный
spray-painter-style-airlockglass-security = Служба безопасности
spray-painter-style-airlockglass-virology = Вирусология
# Lockers
spray-painter-style-locker-atmospherics = Атмосферика
spray-painter-style-locker-basic = Обычный
spray-painter-style-locker-botanist = Ботаник
spray-painter-style-locker-brigmedic = Бригмедик
spray-painter-style-locker-captain = Капитана
spray-painter-style-locker-ce = Старшего Инженера
spray-painter-style-locker-chemical = Химия
spray-painter-style-locker-clown = Клоун
spray-painter-style-locker-cmo = Главный врач
spray-painter-style-locker-doctor = Врача
spray-painter-style-locker-electrical = Электрика
spray-painter-style-locker-engineer = Инженер
spray-painter-style-locker-evac = Ремонт эвакуации
spray-painter-style-locker-hop = Глава персонала
spray-painter-style-locker-hos = Глава службы безопасности
spray-painter-style-locker-medicine = Медицинский
spray-painter-style-locker-mime = Мим
spray-painter-style-locker-paramedic = Парамедик
spray-painter-style-locker-quartermaster = Квартирмейстер
spray-painter-style-locker-rd = Научный руководитель
spray-painter-style-locker-representative = Представитель
spray-painter-style-locker-salvage = Утилизация
spray-painter-style-locker-scientist = Учёный
spray-painter-style-locker-security = Служба безопасности
spray-painter-style-locker-welding = Инструменты
spray-painter-style-closet-basic = Обычный
spray-painter-style-closet-biohazard = Биологическая опасность
spray-painter-style-closet-biohazard-science = Биологическая опасность (наука)
spray-painter-style-closet-biohazard-virology = Биологическая опасность (вирусология)
spray-painter-style-closet-biohazard-security = Биологическая опасность (служба безопасности)
spray-painter-style-closet-biohazard-janitor = Биологическая опасность (уборщик)
spray-painter-style-closet-bomb = Сапёрный Набор
spray-painter-style-closet-bomb-janitor = Сапёрный Набор
spray-painter-style-closet-chef = Шеф-повар
spray-painter-style-closet-fire = Пожарная безопасность
spray-painter-style-closet-janitor = Уборщик
spray-painter-style-closet-legal = Юрист
spray-painter-style-closet-nitrogen = Интерналы (азот)
spray-painter-style-closet-oxygen = Интерналы (кислород)
spray-painter-style-closet-radiation = Радиационный костюм
spray-painter-style-closet-tool = Инструменты
spray-painter-style-wallcloset-atmospherics = Атмосферика
spray-painter-style-wallcloset-basic = Обычный
spray-painter-style-wallcloset-black = Чёрный
spray-painter-style-wallcloset-blue = Синий
spray-painter-style-wallcloset-fire = Пожарная безопасность
spray-painter-style-wallcloset-green = Зелёный
spray-painter-style-wallcloset-grey = Серый
spray-painter-style-wallcloset-mixed = Смешанный
spray-painter-style-wallcloset-nitrogen = Интерналы (азот)
spray-painter-style-wallcloset-orange = Оранжевый
spray-painter-style-wallcloset-oxygen = Интерналы (кислород)
spray-painter-style-wallcloset-pink = Розовый
spray-painter-style-wallcloset-white = Белый
spray-painter-style-wallcloset-yellow = Жёлтый
spray-painter-style-walllocker-evac = Ремонт эвакуации
spray-painter-style-walllocker-medical = Медицинский
# Crates
spray-painter-style-cratesteel-basic = Обычный
spray-painter-style-cratesteel-electrical = Электрика
spray-painter-style-cratesteel-engineering = Инженерный
spray-painter-style-cratesteel-radiation = Радиация
spray-painter-style-cratesteel-science = Научный
spray-painter-style-cratesteel-surgery = Хирургия
spray-painter-style-crateplastic-basic = Обычный
spray-painter-style-crateplastic-chemistry = Химия
spray-painter-style-crateplastic-command = Командный
spray-painter-style-crateplastic-hydroponics = Гидропоника
spray-painter-style-crateplastic-medical = Медицинский
spray-painter-style-crateplastic-oxygen = Кислород
spray-painter-style-cratesecure-basic = Обычный
spray-painter-style-cratesecure-chemistry = Химия
spray-painter-style-cratesecure-command = Командный
spray-painter-style-cratesecure-engineering = Инженерный
spray-painter-style-cratesecure-hydroponics = Гидропоника
spray-painter-style-cratesecure-medical = Медицинский
spray-painter-style-cratesecure-plasma = Плазма
spray-painter-style-cratesecure-private = Личный
spray-painter-style-cratesecure-science = Научный
spray-painter-style-cratesecure-secgear = Снаряжение СБ
spray-painter-style-cratesecure-weapon = Оружие
# Canisters
spray-painter-style-canisters-air = Воздух
spray-painter-style-canisters-ammonia = Аммиак
spray-painter-style-canisters-carbon-dioxide = Углекислый газ
spray-painter-style-canisters-frezon = Фрезон
spray-painter-style-canisters-nitrogen = Азот
spray-painter-style-canisters-nitrous-oxide = Закись азота
spray-painter-style-canisters-oxygen = Кислород
spray-painter-style-canisters-plasma = Плазма
spray-painter-style-canisters-storage = Хранилище
spray-painter-style-canisters-tritium = Тритий
spray-painter-style-canisters-water-vapor = Водяной пар

View file

@ -3,6 +3,10 @@
groups:
- AirlockStandard
- AirlockGlass
# Sunrise - start
- AirlockDoubleGlass
- AirlockTripleGlass
# Sunrise - end
- type: paintableGroupCategory
id: Canisters

View file

@ -21,6 +21,8 @@
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_glass_airlock.rsi
snapCardinals: false
offset: 0.5,0
- type: Paintable
group: AirlockDoubleGlass
- type: Fixtures
fixtures:
fix1:
@ -34,6 +36,9 @@
- GlassAirlockLayer
- type: Transform
noRot: false
- type: SunriseMultiTileAirtight
extraTiles:
- 1,0
- type: entity
id: TripleGlassAirlock
@ -50,6 +55,8 @@
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_glass.rsi
snapCardinals: false
offset: 0,0
- type: Paintable
group: AirlockTripleGlass
- type: Fixtures
fixtures:
fix1:
@ -63,6 +70,10 @@
- GlassAirlockLayer
- type: Transform
noRot: false
- type: SunriseMultiTileAirtight
extraTiles:
- -1,0
- 1,0
# == Double airlocks == #
@ -73,6 +84,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_basic.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockAtmospherics
@ -81,6 +94,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_atmospherics.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockCargo
@ -89,6 +104,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_cargo.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockChemistry
@ -97,6 +114,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_chemistry.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockCommand
@ -105,6 +124,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_command.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockCentralCommand
@ -113,6 +134,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_centcomm.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockEngineering
@ -121,6 +144,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_engineering.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockMaint
@ -129,6 +154,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_maint.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockMedical
@ -137,6 +164,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_medical.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockScience
@ -145,6 +174,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_science.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockSecurity
@ -153,6 +184,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_security.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockVirology
@ -161,6 +194,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_virology.rsi
- type: Paintable
group: AirlockDoubleGlass
- type: entity
id: DoubleGlassAirlockSalvage
@ -169,6 +204,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/double_salvage.rsi
- type: Paintable
group: AirlockDoubleGlass
# == Triple airlocks ==
@ -179,6 +216,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_basic.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockAtmospherics
@ -187,6 +226,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_atmospherics.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockCargo
@ -195,6 +236,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_cargo.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockCentralCommand
@ -203,6 +246,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_centcomm.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockChemistry
@ -211,6 +256,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_chemistry.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockCommand
@ -219,6 +266,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_command.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockEngineering
@ -227,6 +276,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_engineering.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockMaint
@ -235,6 +286,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_maint.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockMedical
@ -243,6 +296,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_medical.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockSalvage
@ -251,6 +306,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_salvage.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockScience
@ -259,6 +316,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_science.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockSecurity
@ -267,6 +326,8 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_security.rsi
- type: Paintable
group: AirlockTripleGlass
- type: entity
id: TripleGlassAirlockVirology
@ -275,3 +336,5 @@
components:
- type: Sprite
sprite: _Sunrise/Structures/Doors/Airlocks/Glass/triple_virology.rsi
- type: Paintable
group: AirlockTripleGlass

View file

@ -0,0 +1,8 @@
- type: entity
id: SunriseMultiTileAirtightBlocker
name: airtight blocker
categories: [ HideSpawnMenu ]
components:
- type: Airtight
airBlocked: false
noAirWhenFullyAirBlocked: false

View file

@ -0,0 +1,37 @@
- type: paintableGroup
id: AirlockDoubleGlass
time: 6
cost: 6
defaultStyle: basic
styles:
atmospherics: DoubleGlassAirlockAtmospherics
basic: DoubleGlassAirlockBasic
cargo: DoubleGlassAirlockCargo
chemistry: DoubleGlassAirlockChemistry
command: DoubleGlassAirlockCommand
engineering: DoubleGlassAirlockEngineering
maintenance: DoubleGlassAirlockMaint
medical: DoubleGlassAirlockMedical
salvage: DoubleGlassAirlockSalvage
science: DoubleGlassAirlockScience
security: DoubleGlassAirlockSecurity
virology: DoubleGlassAirlockVirology
- type: paintableGroup
id: AirlockTripleGlass
time: 9
cost: 9
defaultStyle: basic
styles:
atmospherics: TripleGlassAirlockAtmospherics
basic: TripleGlassAirlockBasic
cargo: TripleGlassAirlockCargo
chemistry: TripleGlassAirlockChemistry
command: TripleGlassAirlockCommand
engineering: TripleGlassAirlockEngineering
maintenance: TripleGlassAirlockMaint
medical: TripleGlassAirlockMedical
salvage: TripleGlassAirlockSalvage
science: TripleGlassAirlockScience
security: TripleGlassAirlockSecurity
virology: TripleGlassAirlockVirology