Skip to content

Comments

Hotfix 230126 2#1432

Merged
Rxup merged 3 commits intomasterfrom
hotfix-230126-2
Jan 26, 2026
Merged

Hotfix 230126 2#1432
Rxup merged 3 commits intomasterfrom
hotfix-230126-2

Conversation

@Rxup
Copy link
Owner

@Rxup Rxup commented Jan 26, 2026

Summary by CodeRabbit

Примечания к выпуску

  • Исправления ошибок

    • Исправлена укладка плит лавалэнда при процедурной генерации.
    • Упрощена и исправлена логика видимости псионических эффектов и тёмного обмена.
  • Изменения баланса

    • Снижена частота подстановок акцента в речи персонажа (30% → 10%).
    • Удалены электрошокеры из наборов экипировки охраны.
  • Новые функции

    • Добавлен вариант вооружённой псионической мины.
    • Введён новый статус видимости для метапсионики.

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 26, 2026

Walkthrough

PR переводит обработку видимости псионических эффектов на события GetVisMask, мигрирует использование статус-эффектов на новый API (TryAddStatusEffectDuration / TryUpdateStatusEffectDuration), уточняет проверки жизненного цикла компонентов, убирает Taser из нескольких локеров и добавляет прототипы пси-мины и нового статус-эффекта.

Changes

Когорта / Файл(ы) Резюме
Метапсионика — логика видимости и эффекты
Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs
Перенесена логика видимости на обработчик GetVisMask; добавлен статус MetapsionicVisibleStatus; ActionMetapsionicPulse стал static readonly; централизован запрос PsionicInsulationComponent через _insulationQuery; переход на TryAddStatusEffectDuration.
Система пси-невидимости
Content.Server/Backmen/Psionics/Invisbility/PsionicInvisibilitySystem.cs
Добавлен обработчик GetVisMask для PsionicallyInvisibleComponent; уточнён контроль PsionicInsulationComponent с учётом LifeStage.
Shadowkin — DarkSwap видимость
Content.Server/Backmen/Species/Shadowkin/Systems/ShadowkinPowerSystem.DarkSwap.cs
Ранний выход из OnGetVisMask при LifeStage > Running (не применять DarkSwapInvisibility для не-running этапов).
Применение статус-эффектов в способностях
Content.Server/Backmen/Abilities/Psionics/PsionicAbilitiesSystem.cs, Content.Shared/Backmen/Abilities/Psionics/Abilities/MassSleep/MassSleepPowerSystem.cs
Замена вызовов старого API статус-эффектов на новые TryAddStatusEffectDuration / TryUpdateStatusEffectDuration; замена SleepingSystem на StatusEffectsSystem в MassSleep.
Речь Shadowkin — баланс замены акцента
Content.Server/Backmen/Speech/EntitySystems/ShadowkinAccentSystem.cs
Снижены шансы подстановки (замен) для английской и русской регулярок с 30% до 10%.
Lavaland — позиционирование плитки при слиянии
Content.Server/_Lavaland/Procedural/Systems/LavalandPlanetSystem.Grid.cs
При наложении плиток на созданную сетку используется оригинальный GridIndices (tileRef.Value.GridIndices) вместо смещённого offsetTile.
Прототипы локеров — удалён Taser
Resources/Prototypes/Catalog/Fills/Lockers/heads.yml, Resources/Prototypes/Catalog/Fills/Lockers/security.yml
Удалён WeaponTaser из таблиц наполнения для главы безопасности и трёх секьюрити-локеров.
Новые прототипы — пси-мина и статус
Resources/Prototypes/_Backmen/Entities/Objects/Weapons/Grenades/smoke.yml, Resources/Prototypes/_Backmen/StatusEffects/psionics.yml
Добавлен LandMinePsiArmed (вооружённая пси-мина) и новый статус StatusEffectPsionicAllSee с компонентом MetapsionicVisible.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant MetapsionicPowerSystem
  participant StatusEffectsSystem
  participant VisibilitySystem
  participant PsionicInvisibilitySystem
  participant Observers

  User->>MetapsionicPowerSystem: Использует Metapsionic Pulse (OnPowerUsed)
  MetapsionicPowerSystem->>StatusEffectsSystem: TryAddStatusEffectDuration(StatusEffectPsionicAllSee, duration)
  StatusEffectsSystem-->>MetapsionicPowerSystem: Подтверждение/неудача
  Note over MetapsionicPowerSystem,VisibilitySystem: Добавление/обновление статуса инициирует перерасчёт видимости
  VisibilitySystem->>PsionicInvisibilitySystem: GetVisMaskEvent(ent)
  PsionicInvisibilitySystem-->>VisibilitySystem: Пометить PsionicInvisibility / DarkSwapInvisibility (с учётом LifeStage и изоляции)
  VisibilitySystem->>Observers: Обновлённая информация о видимости сущностей
Loading

Оценка сложности рецензирования

🎯 4 (Complex) | ⏱️ ~45 минут

Стихотворение

🐰 Всплеск пси — я прыгну в кусты,

Маски видимости сплету в узоры,
Статус всем дам — пусть светят глаза,
Минка готова, локер тишина,
Моргаю усами — код в порядке! 🥕✨

🚥 Pre-merge checks | ✅ 1 | ❌ 2
❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive Заголовок PR 'Hotfix 230126 2' слишком неопределённый и не описывает конкретные изменения; используется шаблонный формат без указания сути исправлений. Используйте более описательный заголовок, кратко указывающий основное изменение, например 'Fix visibility masks and status effects for psionics' или аналогичный вариант, отражающий суть исправлений.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch hotfix-230126-2

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: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs (1)

73-108: Логирование использования способности происходит только при неудаче.

LogPowerUsed вызывается только когда метапсионический импульс не обнаруживает сущностей (строка 105). При успешном обнаружении (строки 87-89, 99-101) способность фактически используется (статус-эффект применяется на строке 78), но логирование пропускается.

Это несоответствует паттернам в других системах:

  • MassSleepPowerSystem: логирует при успехе
  • NoosphericZapPowerSystem: логирует безусловно
  • PsionicInvisibilityPowerSystem: логирует после применения
🔧 Предлагаемое исправление
             if (entity.Owner != uid && !_insulationQuery.HasComp(entity)
                                     //&& !(HasComp<ClothingGrantPsionicPowerComponent>(entity) && Transform(entity).ParentUid == uid)
                                     )
             {
                 _popups.PopupEntity(Loc.GetString("metapsionic-pulse-success"), uid, uid, PopupType.LargeCaution);
+                _psionics.LogPowerUsed(uid, "metapsionic pulse", 2, 4);
                 args.Handled = true;
                 return;
             }
         }

         foreach (var entity in _lookup.GetEntitiesInRange<ShadowkinDarkSwappedComponent>(coord, component.Range))
         {
             if (entity.Owner != uid && !_insulationQuery.HasComp(entity)
                 //&& !(HasComp<ClothingGrantPsionicPowerComponent>(entity) && Transform(entity).ParentUid == uid)
                )
             {
                 _popups.PopupEntity(Loc.GetString("metapsionic-pulse-shadowkin-success"), uid, uid, PopupType.LargeCaution);
+                _psionics.LogPowerUsed(uid, "metapsionic pulse", 2, 4);
                 args.Handled = true;
                 return;
             }
         }
🧹 Nitpick comments (1)
Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs (1)

78-78: Рассмотрите проверку результата TryAddStatusEffectDuration.

Возвращаемое значение TryAddStatusEffectDuration игнорируется. Если применение статус-эффекта не удастся (например, сущность не поддерживает статус-эффекты), способность всё равно продолжит выполнение.

♻️ Опциональное улучшение
-        _statusEffects.TryAddStatusEffectDuration(uid, MetapsionicVisibleStatus, TimeSpan.FromSeconds(10));
+        if (!_statusEffects.TryAddStatusEffectDuration(uid, MetapsionicVisibleStatus, TimeSpan.FromSeconds(10)))
+            return;

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: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs (1)

81-107: Логирование использования способности вызывается только при неудаче, что противоречит паттерну других способностей.

В MetapsionicPowerSystem _psionics.LogPowerUsed() вызывается только при отсутствии целей (строка 105), тогда как во всех остальных псионических способностях (Telegnosis, Pyrokinesis, Psychokinesis, Psionic Regeneration, Psionic Invisibility, Noospheric Zap, Dispel, Mind Swap) логирование происходит при успешном использовании способности. Требуется переместить вызов LogPowerUsed() в блок успешного обнаружения целей (строки 88-89 и/или 100-101) или в начало метода, чтобы логировать все попытки использования способности.

🧹 Nitpick comments (1)
Content.Server/Backmen/Abilities/Psionics/Abilities/MetapsionicPowerSystem.cs (1)

71-78: Рассмотрите вынос длительности эффекта в компонент.

Длительность статус-эффекта (10 секунд) захардкожена. Для гибкости настройки рекомендуется перенести это значение в MetapsionicPowerComponent.

♻️ Предлагаемое изменение

В MetapsionicPowerComponent добавить:

[DataField]
public TimeSpan VisibleDuration = TimeSpan.FromSeconds(10);

В OnPowerUsed:

-_statusEffects.TryAddStatusEffectDuration(uid, MetapsionicVisibleStatus, TimeSpan.FromSeconds(10));
+_statusEffects.TryAddStatusEffectDuration(uid, MetapsionicVisibleStatus, component.VisibleDuration);

@Rxup Rxup merged commit 202bda2 into master Jan 26, 2026
13 checks passed
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