From 1f97e396d0fe87f3f5dae51dffb95e133bc98b68 Mon Sep 17 00:00:00 2001 From: Daniel <77834935+Orvex07@users.noreply.github.com> Date: Thu, 15 Jan 2026 22:23:40 +0100 Subject: [PATCH] =?UTF-8?q?Fix:=20=D0=94=D0=B2=D0=BE=D0=B9=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5/=D0=A2=D1=80=D0=BE=D0=B9=D0=BD=D1=8B=D0=B5=20=D1=88?= =?UTF-8?q?=D0=BB=D1=8E=D0=B7=D1=8B=20(#3719)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SunriseMultiTileAirtightComponent.cs | 22 ++ .../Doors/SunriseMultiTileAirtightSystem.cs | 173 ++++++++++++++++ .../ui/spray-painter-multitile-airlocks.ftl | 33 +++ .../ui/spray-painter-multitile-airlocks.ftl | 33 +++ .../engineer-painter/engineer-painter.ftl | 12 -- .../_strings/ui/spray-painter-window.ftl | 13 ++ .../ru-RU/spray-painter/spray-painter.ftl | 194 ++++++++++++++++++ .../Prototypes/Paintables/categories.yml | 4 + .../Doors/Airlocks/Glass/airlocks.yml | 63 ++++++ .../Doors/Airlocks/airtight_blocker.yml | 8 + .../Paintables/airlock_multitile_groups.yml | 37 ++++ 11 files changed, 580 insertions(+), 12 deletions(-) create mode 100644 Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightComponent.cs create mode 100644 Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightSystem.cs create mode 100644 Resources/Locale/en-US/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl create mode 100644 Resources/Locale/ru-RU/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl delete mode 100644 Resources/Locale/ru-RU/_strings/engineer-painter/engineer-painter.ftl create mode 100644 Resources/Locale/ru-RU/spray-painter/spray-painter.ftl create mode 100644 Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/airtight_blocker.yml create mode 100644 Resources/Prototypes/_Sunrise/Paintables/airlock_multitile_groups.yml diff --git a/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightComponent.cs b/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightComponent.cs new file mode 100644 index 0000000000..c40eb29a77 --- /dev/null +++ b/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightComponent.cs @@ -0,0 +1,22 @@ +namespace Content.Server._Sunrise.Doors.Components; + +/// +/// Сейчас используется только под двойные, тройные шлюзы +/// Спавнит блокеры по боковым частям относительно главного тайла +/// +[RegisterComponent] +public sealed partial class SunriseMultiTileAirtightComponent : Component +{ + /// + /// Список оффсетов в локальных координатах двери, на каких тайлах должны появиться блокеры + /// Оффсет задает относительно главной точки двери + /// + [DataField(required: true)] + public List ExtraTiles = new(); + + /// + /// Cписок заспавненных блокеров, используется системой для обновления airtight + /// + public List Blockers = new(); +} + diff --git a/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightSystem.cs b/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightSystem.cs new file mode 100644 index 0000000000..319371206d --- /dev/null +++ b/Content.Server/_Sunrise/Doors/SunriseMultiTileAirtightSystem.cs @@ -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; + +/// +/// Нужна чтобы мультитайловые двойные или тройные шлюзы нормально не пропускали газы +/// Спавнит блокеры на соседних тайлах и регулирует когда блокеры не пропускают газ, когда пропускают. В зависимости от состояния шлюза +/// +public sealed class SunriseMultiTileAirtightSystem : EntitySystem +{ + private const string BlockerPrototype = "SunriseMultiTileAirtightBlocker"; + + [Dependency] private readonly AirtightSystem _airtight = default!; + [Dependency] private readonly TransformSystem _transform = default!; + + private EntityQuery _airtightQuery; + private EntityQuery _doorQuery; + private EntityQuery _gridQuery; + private EntityQuery _xformQuery; + + public override void Initialize() + { + base.Initialize(); + + _airtightQuery = GetEntityQuery(); + _doorQuery = GetEntityQuery(); + _gridQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnShutdown); + + SubscribeLocalEvent(OnAirtightChanged); + SubscribeLocalEvent(OnDoorStateChanged); + SubscribeLocalEvent(OnAnchorChanged); + SubscribeLocalEvent(OnReAnchor); + SubscribeLocalEvent(OnMoved); + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + RefreshGeometry(ent); + RefreshAirblock(ent); + } + + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + DeleteBlockers(ent); + } + + private void OnDoorStateChanged(Entity ent, ref DoorStateChangedEvent args) + { + RefreshAirblock(ent); + } + + private void OnAirtightChanged(Entity ent, ref AirtightChanged args) + { + if (!args.AirBlockedChanged) + return; + + RefreshAirblock(ent); + } + + private void OnAnchorChanged(Entity ent, ref AnchorStateChangedEvent args) + { + RefreshGeometry(ent); + RefreshAirblock(ent); + } + + private void OnReAnchor(Entity ent, ref ReAnchorEvent args) + { + RefreshGeometry(ent); + RefreshAirblock(ent); + } + + private void OnMoved(Entity ent, ref MoveEvent args) + { + RefreshGeometry(ent); + RefreshAirblock(ent); + } + + /// + /// Пересоздает блокеры на дополнительных тайлах + /// ExtraTiles задаются в локальных координатах двери, поэтому оффсет надо повернуть по направлению двери + /// После поворота округяем сразу до целых тайлов, потому что поворот идет через float + /// + private void RefreshGeometry(Entity 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); + } + } + + /// + /// Синхронизирует Airtight.AirBlocked у всех блокеров у двери + /// Если у двери есть AirtightComponent то берем его AirBlocked + /// + private void RefreshAirblock(Entity 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 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); + } +} diff --git a/Resources/Locale/en-US/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl b/Resources/Locale/en-US/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl new file mode 100644 index 0000000000..c94c849da5 --- /dev/null +++ b/Resources/Locale/en-US/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl @@ -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 diff --git a/Resources/Locale/ru-RU/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl b/Resources/Locale/ru-RU/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl new file mode 100644 index 0000000000..cdfc669200 --- /dev/null +++ b/Resources/Locale/ru-RU/_strings/_sunrise/ui/spray-painter-multitile-airlocks.ftl @@ -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 = Центральное командование diff --git a/Resources/Locale/ru-RU/_strings/engineer-painter/engineer-painter.ftl b/Resources/Locale/ru-RU/_strings/engineer-painter/engineer-painter.ftl deleted file mode 100644 index b9c98fb10b..0000000000 --- a/Resources/Locale/ru-RU/_strings/engineer-painter/engineer-painter.ftl +++ /dev/null @@ -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 = чёрный diff --git a/Resources/Locale/ru-RU/_strings/ui/spray-painter-window.ftl b/Resources/Locale/ru-RU/_strings/ui/spray-painter-window.ftl index efee9d1753..b3b5f00cac 100644 --- a/Resources/Locale/ru-RU/_strings/ui/spray-painter-window.ftl +++ b/Resources/Locale/ru-RU/_strings/ui/spray-painter-window.ftl @@ -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 = смесь diff --git a/Resources/Locale/ru-RU/spray-painter/spray-painter.ftl b/Resources/Locale/ru-RU/spray-painter/spray-painter.ftl new file mode 100644 index 0000000000..1417d9532c --- /dev/null +++ b/Resources/Locale/ru-RU/spray-painter/spray-painter.ftl @@ -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 = Водяной пар + diff --git a/Resources/Prototypes/Paintables/categories.yml b/Resources/Prototypes/Paintables/categories.yml index 75998c31ba..64a71b028d 100644 --- a/Resources/Prototypes/Paintables/categories.yml +++ b/Resources/Prototypes/Paintables/categories.yml @@ -3,6 +3,10 @@ groups: - AirlockStandard - AirlockGlass + # Sunrise - start + - AirlockDoubleGlass + - AirlockTripleGlass + # Sunrise - end - type: paintableGroupCategory id: Canisters diff --git a/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/Glass/airlocks.yml b/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/Glass/airlocks.yml index 8905325aae..9a8259f29d 100644 --- a/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/Glass/airlocks.yml +++ b/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/Glass/airlocks.yml @@ -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 diff --git a/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/airtight_blocker.yml b/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/airtight_blocker.yml new file mode 100644 index 0000000000..789acd2b5c --- /dev/null +++ b/Resources/Prototypes/_Sunrise/Entities/Structures/Doors/Airlocks/airtight_blocker.yml @@ -0,0 +1,8 @@ +- type: entity + id: SunriseMultiTileAirtightBlocker + name: airtight blocker + categories: [ HideSpawnMenu ] + components: + - type: Airtight + airBlocked: false + noAirWhenFullyAirBlocked: false diff --git a/Resources/Prototypes/_Sunrise/Paintables/airlock_multitile_groups.yml b/Resources/Prototypes/_Sunrise/Paintables/airlock_multitile_groups.yml new file mode 100644 index 0000000000..d39c37d329 --- /dev/null +++ b/Resources/Prototypes/_Sunrise/Paintables/airlock_multitile_groups.yml @@ -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