Skip to content

Доработки лифтов#626

Draft
NeyranDis wants to merge 10 commits intospace-sunrise:masterfrom
NeyranDis:elevator
Draft

Доработки лифтов#626
NeyranDis wants to merge 10 commits intospace-sunrise:masterfrom
NeyranDis:elevator

Conversation

@NeyranDis
Copy link
Contributor

@NeyranDis NeyranDis commented Oct 12, 2025

Краткое описание

Доработки лифтов

Сссылка на багрепорт/ТЗ/Предложение

Медиа(Видео/Скриншоты)

Changelog

🆑 Neyran

  • add: Добавлены спрайты для кнопок лифта, а также теперь состояние лифта отображается цветом кнопки вызова лифта.
  • remove: Удалено свечение кнопки вызова лифта.
  • add: Маркер для блокировки строительства.
  • add: Звуковое оповещение лифта при перегрузке или заблокированных дверях лифта чем-либо.
  • tweak: Лифт теперь перевозит также и предметы.
  • tweak: Теперь кнопки лифта и двери лифта — не ломаемые.
  • add: У лифта появилось ограничение по количеству перевозимых сущностей — превышение этого лимита вызовет перегруз, и лифт не поедет.

Summary by CodeRabbit

  • Новые возможности
    • Кнопки лифта получили новые визуальные состояния: «здесь», «в пути», «на другом этаже» с обновлённой отрисовкой.
    • Сложный лифт: переработано управление перемещением (поэтапное перемещение, проверка блокировок), лимит переносимых сущностей, тревога при блокировке дверей и опции передачи/очистки газов.
    • Добавлен маркер блокировки строительства, предотвращающий возведение конструкций на помеченных тайлах.
  • Документация
    • Обновлены локализации (ru-RU, en-US) для сообщений о строительстве, RCD и кнопках лифта.

1. Кнопки и двери лифтов более не ломаемые.
2. Лифт может перевозить предметы и не только.
3. Ограничение на количество перевозимых лифтом сущностей
4. Звуковое оповещение если двери лифта заблокированы или перегруз.
5. Лифт удалят предметы на промежуточном этаже.
1. Спрайты для кнопок лифта
2. Визуализатор для состояний кнопки вызова лифта.
3. Лифт более не учитывает призраков при расчетах лимитов переноса
4. Убрано то что лифт удаляет что либо на промежуточном этаже (На доработку)
5. Исправлен спрайт у Elevator_catwalk_backup
1. Маркер блокировщика строительства что не позволяет строить там где он стоит.
1. Изменение базового спрайта кнопки вызова лифта.
2. Улучшение читаемости кода.
1. Перенос газов между этажами лифта.
2. Очистка промежуточного этажа от не нужных газов.
3. Поля для включения переноса газов а так же очистки промежуточного этажа от нежелательных газов.
4. метод SetTileMixtureв AtmosphereSystem.API.cs для установки газов на тайле.
5. Заменен звук звукового сигнала лифта при перегрузке или заблокированных дверях.
@NeyranDis NeyranDis requested a review from ThereDrD0 as a code owner October 12, 2025 07:00
@github-actions
Copy link
Contributor

github-actions bot commented Oct 12, 2025

RSI Diff Bot; head commit 0f87458 merging into 507f0bf
This PR makes changes to 1 or more RSIs. Here is a summary of all changes:

Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi

State Old New Status
base Added
elevator_elsewhere Added
elevator_here Added
elevator_moving Added
off Added

Edit: diff updated after 0f87458

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 12, 2025

📝 Walkthrough

Walkthrough

Добавлены клиентские визуалы кнопки лифта (Appearance/RSI и визуализатор), новые enum'ы для состояний кнопки; значительно расширена серверная логика ComplexElevator (движение, телепорт, обработка дверей, газов, аварий, звук); введён маркер ConstructionBlocker с проверками в системах строительства и RCD; добавлен AtmosphereSystem.SetTileMixture; обновлены прототипы и локализации.

Changes

Cohort / File(s) Summary
Клиентские визуалы кнопки лифта
Content.Client/_Scp/ComplexElevator/Visualizers/ElevatorButtonVisualizerSystem.cs, Content.Client/_Scp/ComplexElevator/Visualizers/ElevatorButtonVisualsComponent.cs, Content.Shared/_Scp/ComplexElevator/SharedElevatorButtonVisuals.cs, Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/meta.json, Resources/Prototypes/_Scp/Entities/Structures/Machines/complex_elevator.yml, Resources/Locale/ru-RU/_prototypes/_scp/entities/structures/machines/elevator.ftl
Добавлены компонент и система визуализации кнопки лифта; введены enum'ы состояний/слоёв; маппинг состояний->RSI; добавлен meta.json и обновлены прототипы/RU‑строки для использования Appearance/ElevatorButtonVisuals.
ComplexElevator: логика и конфигурация
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs, Content.Server/_Scp/ComplexElevator/ComplexElevatorComponent.cs
Существенная переработка движения лифта: новые хелперы (таймеры, отмены, промежуточные проверки), фильтрация телепортируемых сущностей, обработка дверей через агрегаты, интеграция тревоги/звука, перенос/очистка газов; добавлены поля AlarmSound, MaxEntitiesToTeleport, TransferGases, ClearGases и небольшая константная правка DoorBlockCheckRange.
Атмосфера: API
Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs
Добавлен метод SetTileMixture для установки GasMixture конкретного тайла сетки с активацией тайла и инвалидацией визуалов.
Блокировка строительства и проверки
Content.Shared/_Scp/Construction/ConstructionBlockerComponent.cs, Content.Server/Construction/ConstructionSystem.Initial.cs, Content.Shared/Construction/SharedConstructionSystem.cs, Content.Shared/RCD/Systems/RCDSystem.cs, Resources/Prototypes/_Scp/Entities/Markers/construction_blockers.yml
Введён маркер‑компонент ConstructionBlocker и прототип BuildBlocker; добавлены ранние проверки наличия ConstructionBlocker при старте строительства и в RCD/SharedConstruction с показом сообщения и прерыванием операции.
Локализации и строки
Resources/Locale/en-US/_strings/construction/construction-system.ftl, Resources/Locale/ru-RU/_strings/construction/construction-system.ftl, Resources/Locale/en-US/_strings/rcd/components/rcd-component.ftl, Resources/Locale/ru-RU/_strings/rcd/components/rcd-component.ftl, Resources/Locale/ru-RU/_prototypes/_scp/entities/markers/buildblocker.ftl
Добавлены/обновлены строки локализации для сообщений о блокировке строительства и RCD; добавлены RU‑переводы и метки прототипа маркера.
Прототипы: маркеры/кнопки/структуры
Resources/Prototypes/_Scp/Entities/Markers/construction_blockers.yml, Resources/Prototypes/_Scp/Entities/Structures/Machines/complex_elevator.yml
Добавлен прототип BuildBlocker; обновлены прототипы лифта — заменён PointLight на Appearance/ElevatorButtonVisuals, изменены спрайты/слои, добавлены компоненты (Godmode и др.), скорректированы иерархии сущностей.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~70 minutes

Possibly related PRs

  • Обновление лифта & Фиксы #616 — затрагивает визуализацию кнопок лифта и замену PointLight на Appearance/RSI (сильное пересечение по файлам и поведению).
  • Лифты #595 — пересекается по изменениям ComplexElevator (движение, прототипы, поведение дверей).
  • Звуки для лифтов #600 — добавляет/меняет звуковые поля и логику перемещений в ComplexElevator (схоже по добавлению AlarmSound и аудиоповедению).

Suggested reviewers

  • ThereDrD0

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed Заголовок «Доработки лифтов» адекватно отражает основной фокус изменений — расширение и улучшение функциональности лифтов, включая визуальные, звуковые и логические правки.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7bcd3f7 and 0f87458.

📒 Files selected for processing (1)
  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (12 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
Content.@(Shared|Server|Client)/**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Organize C# code by component within Content.Shared, Content.Server, and Content.Client

Files:

  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs
🔇 Additional comments (4)
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (4)

2-2: LGTM!

Все добавленные импорты используются в коде: LINQ для операций с коллекциями, компоненты для работы с призраками, физикой, картой, атмосферой и визуалами.

Also applies to: 9-9, 11-16, 22-25, 38-39


49-95: LGTM! Хорошее использование enum для газов.

Вспомогательные функции реализованы корректно:

  • SpawnCheckedTimer предотвращает выполнение действий на удаленных или остановленных лифтах
  • FailMovement/StopMovement корректно обрабатывают остановку и обновляют визуалы
  • CreateReplacementMixture теперь использует enum Gas вместо магических чисел, что решает проблему из предыдущего ревью

148-182: LGTM! Исправлены проблемы из предыдущих ревью.

Функции работы с сущностями реализованы корректно:

  • GetEntitiesInElevator эффективно получает сущности в области лифта
  • IsEntityValidForTeleport теперь принимает optional TransformComponent, что решает проблему с избыточными вызовами Transform() из предыдущего ревью
  • CanMoveWithEntities использует <= вместо <, разрешая точное попадание в лимит, как и указывалось в предыдущем ревью

470-479: LGTM! Исправлена проблема с уроном призракам.

Добавлена проверка !HasComp<GhostComponent>(entUid) на Line 474, что предотвращает нанесение урона призракам. Это исправляет проблему, поднятую в предыдущем ревью.

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 507f0bf and 8c2bb56.

⛔ Files ignored due to path filters (5)
  • Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/base.png is excluded by !**/*.png
  • Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/elevator_elsewhere.png is excluded by !**/*.png
  • Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/elevator_here.png is excluded by !**/*.png
  • Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/elevator_moving.png is excluded by !**/*.png
  • Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/off.png is excluded by !**/*.png
📒 Files selected for processing (19)
  • Content.Client/_Scp/ComplexElevator/Visualizers/ElevatorButtonVisualizerSystem.cs (1 hunks)
  • Content.Client/_Scp/ComplexElevator/Visualizers/ElevatorButtonVisualsComponent.cs (1 hunks)
  • Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs (1 hunks)
  • Content.Server/Construction/ConstructionSystem.Initial.cs (3 hunks)
  • Content.Server/_Scp/ComplexElevator/ComplexElevatorComponent.cs (1 hunks)
  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (12 hunks)
  • Content.Shared/Construction/SharedConstructionSystem.cs (3 hunks)
  • Content.Shared/RCD/Systems/RCDSystem.cs (2 hunks)
  • Content.Shared/_Scp/ComplexElevator/SharedElevatorButtonVisuals.cs (1 hunks)
  • Content.Shared/_Scp/Construction/ConstructionBlockerComponent.cs (1 hunks)
  • Resources/Locale/en-US/_strings/construction/construction-system.ftl (1 hunks)
  • Resources/Locale/en-US/_strings/rcd/components/rcd-component.ftl (1 hunks)
  • Resources/Locale/ru-RU/_prototypes/_scp/entities/markers/buildblocker.ftl (1 hunks)
  • Resources/Locale/ru-RU/_prototypes/_scp/entities/structures/machines/elevator.ftl (1 hunks)
  • Resources/Locale/ru-RU/_strings/construction/construction-system.ftl (1 hunks)
  • Resources/Locale/ru-RU/_strings/rcd/components/rcd-component.ftl (1 hunks)
  • Resources/Prototypes/_Scp/Entities/Markers/construction_blockers.yml (1 hunks)
  • Resources/Prototypes/_Scp/Entities/Structures/Machines/complex_elevator.yml (4 hunks)
  • Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/meta.json (1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
Resources/**

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Place game assets (textures, audio, etc.) under Resources

Files:

  • Resources/Locale/en-US/_strings/rcd/components/rcd-component.ftl
  • Resources/Locale/ru-RU/_strings/construction/construction-system.ftl
  • Resources/Locale/ru-RU/_strings/rcd/components/rcd-component.ftl
  • Resources/Locale/ru-RU/_prototypes/_scp/entities/markers/buildblocker.ftl
  • Resources/Prototypes/_Scp/Entities/Structures/Machines/complex_elevator.yml
  • Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/meta.json
  • Resources/Prototypes/_Scp/Entities/Markers/construction_blockers.yml
  • Resources/Locale/ru-RU/_prototypes/_scp/entities/structures/machines/elevator.ftl
  • Resources/Locale/en-US/_strings/construction/construction-system.ftl
Content.@(Shared|Server|Client)/**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Organize C# code by component within Content.Shared, Content.Server, and Content.Client

Files:

  • Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs
  • Content.Shared/_Scp/ComplexElevator/SharedElevatorButtonVisuals.cs
  • Content.Server/_Scp/ComplexElevator/ComplexElevatorComponent.cs
  • Content.Shared/_Scp/Construction/ConstructionBlockerComponent.cs
  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs
  • Content.Client/_Scp/ComplexElevator/Visualizers/ElevatorButtonVisualsComponent.cs
  • Content.Client/_Scp/ComplexElevator/Visualizers/ElevatorButtonVisualizerSystem.cs
  • Content.Server/Construction/ConstructionSystem.Initial.cs
  • Content.Shared/Construction/SharedConstructionSystem.cs
  • Content.Shared/RCD/Systems/RCDSystem.cs
Resources/Prototypes/**/*.{yml,yaml}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Store prototype YAML files under Resources/Prototypes

Files:

  • Resources/Prototypes/_Scp/Entities/Structures/Machines/complex_elevator.yml
  • Resources/Prototypes/_Scp/Entities/Markers/construction_blockers.yml
🔇 Additional comments (18)
Resources/Locale/ru-RU/_prototypes/_scp/entities/structures/machines/elevator.ftl (2)

19-19: Улучшение ясности названия кнопки.

Изменение с "кнопка лифта" на "кнопка вызова лифта" делает название более конкретным и понятным. Это хорошо согласуется с добавлением визуальных состояний кнопок, описанных в целях PR.


22-25: Явные строки для направленных кнопок оправданы.

Переход от использования наследования { ent-ElevatorButton } к явным строкам ("кнопка вызова лифта вверх" / "вниз") является правильным решением, поскольку:

  • Эти кнопки не просто повторяют базовый текст — они содержат направленные квалификаторы
  • Явные названия улучшают различимость в UI и логах
  • Текст корректен с точки зрения русского языка
Resources/Locale/en-US/_strings/construction/construction-system.ftl (1)

2-2: Изменения выглядят корректно.

Строка локализации соответствует функциональности блокировки строительства, добавленной в PR.

Resources/Locale/en-US/_strings/rcd/components/rcd-component.ftl (1)

31-31: LGTM!

Английская локализация корректна и согласуется с новой функцией блокировки строительства.

Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs (1)

229-241: LGTM!

Метод SetTileMixture корректно реализован. Логика валидации сетки, установки газовой смеси и обновления визуалов выглядит правильной.

Content.Server/_Scp/ComplexElevator/ComplexElevatorComponent.cs (1)

42-54: LGTM!

Добавленные поля конфигурации (AlarmSound, MaxEntitiesToTeleport, TransferGases, ClearGases) корректно реализуют новую функциональность лифта, описанную в PR. Незначительная корректировка DoorBlockCheckRange (0.6f → 0.59f) не вызывает опасений.

Resources/Textures/_Scp/Structures/Wallmounts/elevator_buttons.rsi/meta.json (1)

1-101: LGTM!

Метаданные RSI для спрайтов кнопок лифта корректно оформлены. Определены все необходимые состояния (base, off, elevator_elsewhere, elevator_moving, elevator_here) с 4 направлениями, что согласуется с новой системой визуализации кнопок.

Content.Shared/RCD/Systems/RCDSystem.cs (1)

16-16: LGTM!

Правильное добавление using-директивы для нового компонента ConstructionBlockerComponent.

Content.Shared/_Scp/Construction/ConstructionBlockerComponent.cs (1)

1-11: LGTM!

Правильная реализация компонента-маркера. Код следует стандартному паттерну для маркерных компонентов: атрибут [RegisterComponent], наследование от Component, понятная XML-документация и пустое тело класса.

Content.Server/Construction/ConstructionSystem.Initial.cs (2)

5-5: LGTM!

Правильное добавление необходимых using-директив для новых компонентов и систем.

Also applies to: 22-22


499-511: LGTM!

Проверка блокировщиков строительства реализована корректно:

  • Проверка выполняется рано в процессе валидации (до InRangeUnobstructed)
  • Правильно получает закреплённые сущности на гриде
  • Корректно вызывает Cleanup() перед ранним выходом
  • Использует подходящий ключ локализации для отображения сообщения пользователю

Логика предотвращает строительство на тайлах с маркерами блокировки, что соответствует задаче PR.

Content.Shared/Construction/SharedConstructionSystem.cs (3)

1-1: LGTM!

Правильное добавление using-директивы для поддержки новой функциональности блокировщиков строительства.


13-15: LGTM!

Изменение видимости поля _map с private на protected позволяет производным классам использовать систему карт, что необходимо для новой логики проверки блокировщиков.


28-31: LGTM!

Обновлённая логика GetPredicate корректно фильтрует закреплённые сущности:

  • Получает все закреплённые сущности на координатах
  • Исключает сущности с ConstructionBlockerComponent из набора игнорируемых
  • Это гарантирует, что блокировщики строительства будут учитываться при проверке препятствий

Изменение правильно интегрируется с новой системой блокировки строительства.

Resources/Prototypes/_Scp/Entities/Markers/construction_blockers.yml (1)

1-14: LGTM!

Прототип сущности BuildBlocker определён корректно:

  • Правильно наследуется от MarkerBase
  • Включает необходимый компонент ConstructionBlocker
  • Настройка спрайта с двумя слоями (база и стена) обеспечивает визуальную обратную связь
  • Использование шейдера unshaded подходит для маркерных объектов

Структура соответствует руководству по прототипам.

Content.Shared/_Scp/ComplexElevator/SharedElevatorButtonVisuals.cs (1)

1-22: LGTM!

Определения enum для визуализации кнопок лифта реализованы правильно:

  • ElevatorButtonVisuals и ElevatorButtonState помечены [NetSerializable] для сетевой синхронизации
  • ElevatorButtonLayers не имеет [NetSerializable], так как используется только на клиенте
  • Состояния кнопки (ElevatorHere, ElevatorMoving, ElevatorElsewhere) чётко описывают положение лифта
  • Использование byte в качестве базового типа оптимально для перечислений с небольшим количеством значений

Код следует стандартному паттерну для систем визуализации на основе внешнего вида.

Content.Client/_Scp/ComplexElevator/Visualizers/ElevatorButtonVisualsComponent.cs (1)

1-19: LGTM!

Компонент визуализации кнопки лифта реализован корректно:

  • Словарь SpriteStateMap правильно связывает состояния лифта со строками состояний спрайтов
  • Использование [DataField] позволяет переопределять маппинг через прототипы при необходимости
  • Атрибут [ViewVariables(VVAccess.ReadOnly)] обеспечивает доступ для отладки
  • Инициализация словаря с понятными значениями облегчает поддержку

Компонент следует стандартному паттерну для клиентских визуализаторов.

Content.Client/_Scp/ComplexElevator/Visualizers/ElevatorButtonVisualizerSystem.cs (1)

1-19: LGTM!

Система визуализации кнопки лифта реализована правильно:

  • Проверки на null предотвращают исключения при отсутствии спрайта
  • Использование TryGetData безопасно обрабатывает случаи, когда состояние не установлено
  • TryGetValue для поиска в словаре предотвращает исключения при неизвестных состояниях
  • Обновление слоя через SpriteSystem.LayerSetRsiState соответствует стандартному паттерну

Система корректно интегрируется с системой внешнего вида и компонентом визуализации.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (2)
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (2)

187-188: Разрешите ровно лимит пассажиров.

Проверка на < блокирует лифт даже при точном попадании в лимит и противоречит описанию (“перегруз только при превышении”). Это замечание уже поднималось, но правка отсутствует.

-        return GetEntitiesInElevator(ent.Owner).Count(e => !HasComp<GhostComponent>(e)) < ent.Comp.MaxEntitiesToTeleport;
+        return GetEntitiesInElevator(ent.Owner).Count(e => !HasComp<GhostComponent>(e)) <= ent.Comp.MaxEntitiesToTeleport;

499-511: Проверьте наличие AppearanceComponent перед SetData.

Мы всё ещё вызываем _appearance.SetData для каждой кнопки, включая те, у которых по прототипу нет AppearanceComponent, что спамит предупреждениями. Нужно добавить guard (как было предложено ранее) или расширить прототипы.

-            _appearance.SetData(buttonUid, ElevatorButtonVisuals.ButtonState, state);
+            if (TryComp<AppearanceComponent>(buttonUid, out _))
+                _appearance.SetData(buttonUid, ElevatorButtonVisuals.ButtonState, state);
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8c2bb56 and bdb1f40.

📒 Files selected for processing (1)
  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (12 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
Content.@(Shared|Server|Client)/**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Organize C# code by component within Content.Shared, Content.Server, and Content.Client

Files:

  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (2)
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (2)

139-143: 🔴 КРИТИЧЕСКАЯ ПРОБЛЕМА: Отсутствует параметр shouldKill — проект не скомпилируется.

Сигнатура метода принимает только два параметра, но в строке 109 (StartMovement) метод вызывается БЕЗ третьего параметра shouldKill = false. Однако безусловный вызов KillEntitiesInTargetArea на строке 141 всё равно убивает всех пассажиров при перемещении на промежуточный этаж, что противоречит логике системы.

Требуется:

  1. Добавить параметр shouldKill в сигнатуру
  2. Условно вызывать KillEntitiesInTargetArea только при shouldKill == true
-    private void MoveToFloorImmediate(Entity<ComplexElevatorComponent> ent, string floorId)
+    private void MoveToFloorImmediate(Entity<ComplexElevatorComponent> ent, string floorId, bool shouldKill = true)
     {
-        KillEntitiesInTargetArea(ent, floorId);
-        TeleportToFloor(ent, floorId);
+        if (shouldKill)
+            KillEntitiesInTargetArea(ent, floorId);
+
+        TeleportToFloor(ent, floorId);
     }

И обновите вызов в StartMovement (строка 109):

-        MoveToFloorImmediate(ent, ent.Comp.IntermediateFloorId);
+        MoveToFloorImmediate(ent, ent.Comp.IntermediateFloorId, shouldKill: false);

491-511: Отсутствует проверка AppearanceComponent перед SetData.

Метод UpdateButtonLights вызывает _appearance.SetData для всех кнопок лифта, включая ElevatorButtonUp/Down, у которых по прототипу может отсутствовать AppearanceComponent. Это приведёт к предупреждениям в логе или исключениям. Добавьте проверку наличия компонента перед вызовом.

             ElevatorButtonState state = ElevatorButtonState.ElevatorElsewhere;
             if (buttonComp.ButtonType == ElevatorButtonType.CallButton)
             {
                 if (elevator.Comp.IsMoving)
                     state = ElevatorButtonState.ElevatorMoving;
                 else if (buttonComp.Floor == elevator.Comp.CurrentFloor)
                     state = ElevatorButtonState.ElevatorHere;
                 else
                     state = ElevatorButtonState.ElevatorElsewhere;
             }

-            _appearance.SetData(buttonUid, ElevatorButtonVisuals.ButtonState, state);
+            if (TryComp<AppearanceComponent>(buttonUid, out _))
+                _appearance.SetData(buttonUid, ElevatorButtonVisuals.ButtonState, state);
         }
     }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b05f86d and 1b199cd.

📒 Files selected for processing (1)
  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (12 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
Content.@(Shared|Server|Client)/**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Organize C# code by component within Content.Shared, Content.Server, and Content.Client

Files:

  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs
🔇 Additional comments (4)
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (4)

49-57: LGTM: Безопасная обёртка для таймеров.

Метод SpawnCheckedTimer корректно проверяет существование сущности и флаг IsMoving перед выполнением действия, что предотвращает выполнение действий на удалённых или остановленных лифтах.


175-188: LGTM: Проверка лимита сущностей исправлена.

Строка 187 теперь использует <= вместо строгого <, что позволяет лифту двигаться при точном соответствии лимиту MaxEntitiesToTeleport. Это соответствует описанию функциональности в PR.


446-446: Изменение флагов LookupFlags может повлиять на блокировку дверей.

Добавление флага LookupFlags.Sensors в строке 446 изменяет поведение проверки блокировки дверей. Теперь сенсоры будут учитываться при определении, заблокирована ли дверь. Убедитесь, что это ожидаемое поведение и сенсоры не должны игнорироваться при проверке.


211-252: Потенциальная проблема со значением CurrentFloor при обработке газов.

Строка 240 использует elevatorComp.CurrentFloor для определения, находится ли лифт на промежуточном этаже. Однако на момент вызова TeleportToFloor значение CurrentFloor ещё может быть старым (до обновления в StartMovement или PerformIntermediateMovementCheck). Это может привести к некорректному выбору газовой смеси.

Рекомендация: передавайте флаг isFromIntermediate или sourceFloorId как параметр в TeleportToFloor, чтобы избежать зависимости от состояния CurrentFloor.

-private void TeleportToFloor(EntityUid uid, string floorId)
+private void TeleportToFloor(EntityUid uid, string floorId, string? sourceFloorId = null)

И в строке 240:

-var replacementMixture = CreateReplacementMixture(elevatorComp.CurrentFloor == elevatorComp.IntermediateFloorId);
+var replacementMixture = CreateReplacementMixture(sourceFloorId == elevatorComp.IntermediateFloorId);

Проверьте логику обновления CurrentFloor и порядок вызовов в StartMovement и PerformIntermediateMovementCheck.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

♻️ Duplicate comments (2)
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (2)

142-146: Критично: верните shouldKill и применяйте по назначению.

Безусловное убийство на промежуточной площадке ломает UX и повторяет ранее поднятую проблему. Метод должен учитывать флаг.

Примените правку:

-    private void MoveToFloorImmediate(Entity<ComplexElevatorComponent> ent, string floorId)
+    private void MoveToFloorImmediate(Entity<ComplexElevatorComponent> ent, string floorId, bool shouldKill = true)
     {
-        KillEntitiesInTargetArea(ent, floorId);
-        TeleportToFloor(ent, floorId);
+        if (shouldKill)
+            KillEntitiesInTargetArea(ent, floorId);
+
+        TeleportToFloor(ent, floorId);
     }

И обновите вызовы (в этом же файле):

  • В StartMovement: MoveToFloorImmediate(ent, ent.Comp.IntermediateFloorId, shouldKill: false);
  • В PerformIntermediateMovementCheck: MoveToFloorImmediate(ent, targetFloor, shouldKill: true);

495-516: Проверяйте наличие Appearance перед SetData.

Некоторые кнопки не имеют AppearanceComponent; вызов приведёт к ворнингам. Добавьте guard.

-            _appearance.SetData(buttonUid, ElevatorButtonVisuals.ButtonState, state);
+            if (TryComp<AppearanceComponent>(buttonUid, out _))
+                _appearance.SetData(buttonUid, ElevatorButtonVisuals.ButtonState, state);
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1b199cd and 7bcd3f7.

📒 Files selected for processing (1)
  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (12 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
Content.@(Shared|Server|Client)/**/*.cs

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

Organize C# code by component within Content.Shared, Content.Server, and Content.Client

Files:

  • Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs
🔇 Additional comments (3)
Content.Server/_Scp/ComplexElevator/ComplexElevatorSystem.cs (3)

179-192: Емкость лифта: фикс подтверждён.

Сравнение изменено на <=, теперь точное попадание в лимит разрешено. OK.


72-95: Замена magic numbers на Gas enum — хорошо.

Повышает устойчивость к изменениям enum и читабельность. Значения по умолчанию и температура заданы корректно.


215-256: Возможная ошибка системы координат при работе с тайлами атмосферы.

Индексы тайлов берутся из мировых X/Y (через AABB и каст к int). Для SetTileMixture требуются координаты тайлов в системе грида. На смещённых/повёрнутых гридах и при нецелых оффсетах это даст неправильные ячейки.

Предлагаю:

  • Конвертировать мировые координаты в координаты тайлов грида через Map/Transform API (получить локальные координаты на grid и затем Vector2i тайла).
  • Избегать (int)(x + offset.X); использовать корректное округление после проекции в grid‑space.

Проверьте корректность с тестом: переместить лифт между разными позициями грида (не (0,0)), сравнить набор затронутых тайлов до/после.

@ThereDrD0 ThereDrD0 marked this pull request as draft October 18, 2025 02:23
@github-actions
Copy link
Contributor

Этот PR содержит конфликты, пожалуйста, разрешите их, прежде чем мы сможем его оценить.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant