Skip to content

Some fixes, tweaks, adds and removes.#1122

Open
Lachklen wants to merge 15 commits intoWWhiteDreamProject:masterfrom
Lachklen:some-fixes
Open

Some fixes, tweaks, adds and removes.#1122
Lachklen wants to merge 15 commits intoWWhiteDreamProject:masterfrom
Lachklen:some-fixes

Conversation

@Lachklen
Copy link
Copy Markdown
Contributor

@Lachklen Lachklen commented Apr 22, 2026

Описание PR

Несколько нужных багфиксов:

  • Статичность тела от аномалии.
  • Стоимость кляуз в гайдбуке и их фактическая стоимость.
  • Открытие «поломанных» UI после повторного подключения в раунд.
  • Парадоксальная аномалия.
  • UI арахнидов.
  • Аккуратная клажа предмета на землю.
  • Дизарм мышей и улиток.
  • Неуязвимые для харма конструкции.
  • Проталкивание в стену дизармом.
  • Улетание сквозь стены, войдя в портал.
  • Неправильный пункт для FTL (БСС).
  • Магнит утилизаторов, функционал которого отключен в CVar'ах. Энтити удалён с карт.
  • Кнопка загрузки чертежа в панеле АдминАбуза.

Изменения

🆑 Myaflic

  • fix: Аномалии в теле космонавтика теперь не делают его статичным.
  • fix: Все кляузы теперь соответствуют по стоимости в гайдбуке.
  • tweak: Окна UI теперь закрываются при отключении пользователя во избежание их неправильного открытия.
  • fix: Парадоксальная аномалия теперь ну точно работает.
  • add: Попап, если парадоксальная аномалия не может быть создана.
  • fix: Исправлено отображение слота спины скафандра для арахнидов.
  • fix: Аккуратная складка предмета теперь показывает реальный размер предмета даже при увеличении обзора.
  • tweak: Дизарм для мышей и улиток теперь отключен.
  • fix: Исправлен случай, когда в одном тайле закреплено больше одной конструкции, от чего их невозможно было сломать ближнем боем.
  • fix: Толкание в стену исправлено настолько, насколько это возможно ||(наверно)||.
  • add: Теперь при телепортации через портал космонавтик не улетает сквозь стены вне зависимости от скоростей точек обеих гридов. Но от большой скорости он получает урок как при ударе об стену, сохраняя направление полёта.
  • fix: FTL (БСС) был починен. Теперь суда телепортируются в заданную точку координат.
  • remove: Со всех карт удалён магнит утилизаторов, его копия и плата.
  • fix: Кнопка «загрузить чертёж» (loadblueprint) в панеле АдминАрбуза теперь использует существующую команду.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 22, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: d505f966-bc08-4dc2-8bbf-673588d3b242

📥 Commits

Reviewing files that changed from the base of the PR and between 43cf563 and 00bdb5d.

📒 Files selected for processing (2)
  • Content.Shared/Teleportation/Systems/SharedPortalSystem.cs
  • Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs
🚧 Files skipped from review as they are similar to previous changes (1)
  • Content.Shared/Teleportation/Systems/SharedPortalSystem.cs

Walkthrough

Внесены изменения в физику столкновений и телепортации, добавлена система урона при ударных столкновениях, исправления рендеринга/масштабирования, правки взаимодействий/FTL-кликов, очистка UI при отключении, а также обновления прототипов, миграций и локализаций.

Changes

Cohort / File(s) Summary
Shove / Collision systems
Content.Server/Weapons/Melee/MeleeWeaponSystem.cs, Content.Server/_White/Shove/ShoveImpactSystem.cs, Content.Shared/_White/Shove/ShoveImpactComponent.cs
Добавлена raycast-проверка при толчке с ограничением дистанции/скорости броска; сохраняется исходная скорость в ShoveImpactComponent; новая система обрабатывает столкновения и наносит урон.
Teleport / Portal velocity effects
Content.Shared/Teleportation/Systems/SharedPortalSystem.cs, Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs
До и после телепортации снимается скорость сетки/объекта, рассчитывается относительная скорость; при превышении порога применяется урон и паралич, затем скорость ограничивается до безопасного максимума.
Session UI cleanup
Content.Server/GameTicking/GameTicker.cs, Content.Server/GameTicking/GameTicker.Player.cs
Добавлена зависимость UserInterfaceSystem; при отключении сессии закрываются все открытые интерфейсы игрока перед обнулением mind.Session.
FTL click coords & interaction raycast
Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs, Content.Shared/Interaction/SharedInteractionSystem.cs
В FTL-режиме используется RelativePixelPosition для координат клика; предикат raycast для нек-тов добавляет пересекающие физические сущности в набор игнорируемых.
Rendering & zoom / slippery cap
Content.Client/_White/Hands/DropOverlay.cs, Content.Shared/Slippery/SlipperySystem.cs
Backbuffer пересоздаётся с учётом зума; масштаб рендера привязан к текущему зуму; при скольжении скорость усекается до максимума 15f.
Anomaly / paradox updates
Content.Shared/Anomaly/SharedAnomalySystem.cs, Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs
OnLand пропускает внутренние аномалии (InnerBodyAnomalyComponent); добавлен SharedPopupSystem и исправлена логика чтения поля прототипа при подборе кандидатов.
Localization
Resources/Locale/en-US/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl, Resources/Locale/ru-RU/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl
Добавлен ключ локализации paradox-anomaly-create-false для англ. и рус. языков.
Prototypes / migration / templates
Resources/Prototypes/Entities/Mobs/NPCs/animals.yml, Resources/Prototypes/Entities/Mobs/NPCs/space.yml, Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml, Resources/Migrations/migration.yml, Resources/Prototypes/_Goobstation/Devil/clauses.yml
Отключены altDisarm/canHeavyAttack для отдельных мобов; suitstorage закомментирован в шаблоне; три prototype ID удаляются в миграции; обновлены веса devil-claуз.
Admin UI: load blueprint → load grid
Content.Client/Administration/UI/Tabs/AdminbusTab/AdminbusTab.xaml, Content.Client/Administration/UI/Tabs/AdminbusTab/LoadBlueprintsWindow.xaml.cs
Кнопка и обработчик изменяют исполняемую команду с loadbp на loadgrid; из XAML удалён BOM.
Paradox anomaly locale file (RU)
Resources/Locale/ru-RU/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl
Добавлена русская строка для ключа paradox-anomaly-create-false.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Suggested labels

Changes: Map

Suggested reviewers

  • Remuchi
  • Spatison
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.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 The title is vague and generic, using non-descriptive terms like 'fixes, tweaks, adds and removes' that do not convey meaningful information about the specific changes. Replace with a more specific title that highlights the primary change, such as 'Fix anomaly physics, portal velocity, and admin panel issues' or similar.
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed The description is related to the changeset, providing a detailed list of fixes, tweaks, and removals that match the actual code changes in the pull request.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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
Copy Markdown
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: 10

🧹 Nitpick comments (6)
Content.Server/GameTicking/GameTicker.Player.cs (1)

128-134: Стиль: добавьте фигурные скобки и поправьте отступы во вложенных foreach.

Логика корректна (снимок через ToArray() защищает от модификации OpenInterfaces внутри CloseUi), но if без фигурных скобок с двумя вложенными foreach на одном уровне отступа с условием затрудняет чтение и повышает риск ошибок при будущих правках. Рекомендую обернуть в { ... } и нормализовать отступы.

♻️ Предлагаемая правка
                         // WWDP EDIT START
-                        if ((mind.CurrentEntity != null && !Deleted(mind.CurrentEntity))
-                        && (TryComp<UserInterfaceUserComponent>(mind.CurrentEntity, out var userUi)))
-                            foreach (var (targetEntity, keys) in userUi.OpenInterfaces.ToArray())
-                                foreach (var key in keys.ToArray())
-                                    _ui.CloseUi(targetEntity, key, mind.CurrentEntity.Value);
+                        if (mind.CurrentEntity != null
+                            && !Deleted(mind.CurrentEntity)
+                            && TryComp<UserInterfaceUserComponent>(mind.CurrentEntity, out var userUi))
+                        {
+                            foreach (var (targetEntity, keys) in userUi.OpenInterfaces.ToArray())
+                            {
+                                foreach (var key in keys.ToArray())
+                                    _ui.CloseUi(targetEntity, key, mind.CurrentEntity.Value);
+                            }
+                        }
                         // WWDP EDIT END
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Server/GameTicking/GameTicker.Player.cs` around lines 128 - 134, The
if block around the UI-close logic lacks braces and has misleading indentation
for the two nested foreach loops; update the block that checks
mind.CurrentEntity and TryComp<UserInterfaceUserComponent> to use explicit
braces { ... } and re-indent the inner foreach loops so they are clearly nested
inside the if, keeping the existing ToArray() calls on userUi.OpenInterfaces and
keys and still calling _ui.CloseUi(targetEntity, key, mind.CurrentEntity.Value);
reference the mind.CurrentEntity check, Deleted(mind.CurrentEntity),
TryComp<UserInterfaceUserComponent>(mind.CurrentEntity, out var userUi),
userUi.OpenInterfaces.ToArray(), keys.ToArray(), and _ui.CloseUi when making the
change.
Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml (1)

56-65: Необязательная чистка: удалить закомментированный блок.

Старое определение suitstorage оставлено как закомментированный блок в WWDP EDIT. Поскольку рабочее определение теперь находится ниже (строки 142–152) и отличается (slotGroup: MainHotbar, dependsOnComponents), закомментированный блок вводит читателя в заблуждение и со временем разойдётся с актуальной версией. Можно удалить его полностью, сохранив только маркеры # WWDP EDIT при необходимости для merge-трассировки апстрима.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml`
around lines 56 - 65, Удалите весь закомментированный блок между маркерами "#
WWDP EDIT START" и "# WWDP EDIT END", содержащий старое определение suitstorage
(поля: name/suitstorage, slotTexture, slotFlags, stripTime, uiWindowPos,
strippingWindowPos, dependsOn, displayName), чтобы не вводить в заблуждение;
оставьте при необходимости только сами маркеры WWDP для трассировки, поскольку
актуальная конфигурация suitstorage реализована ниже и использует другие поля
(например slotGroup: MainHotbar и dependsOnComponents).
Content.Server/Weapons/Melee/MeleeWeaponSystem.cs (1)

246-264: Мелкие замечания по рейкасту.

  • returnOnFirstHit: true уже гарантирует максимум одно попадание — foreach ... break можно заменить на results.FirstOrDefault() или .Any()/.First() для наглядности.
  • Рейкаст стартует из targetPos, и ignoredEnt = target, что корректно. Но если target на границе стены (AABB слегка внутри неё), wallDist будет ~0, и хотя throwSpeed не используется, pushVector = pushDir * wallDist превратит толчок в no-op. Стоит как минимум гарантировать минимум (например, MathF.Max(wallDist - epsilon, 0f)), либо вообще не менять pushVector, если wallDist < epsilon.
  • CollisionGroup.Impassable не включает BulletImpassable и прочее — толкать «сквозь» стеклянные окна/заборы будет нельзя только если они в Impassable. Проверьте, что все нужные стены действительно имеют этот слой.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Server/Weapons/Melee/MeleeWeaponSystem.cs` around lines 246 - 264,
Replace the foreach+break over results from _physics.IntersectRay with a
single-result check (e.g. results.FirstOrDefault() or results.First()/Any()) to
make intent explicit; when handling the hit, guard against tiny wallDist by
using an epsilon (e.g. var effectiveDist = MathF.Max(wallDist - epsilon, 0f))
and only set pushVector = pushDir * effectiveDist (or skip updating pushVector
if effectiveDist <= epsilon) and clamp throwSpeed similarly; keep the existing
assignment to EnsureComp<ShoveImpactComponent>(target).OriginalSpeed when
originalSpeed > throwSpeed, and also review that the CollisionGroup passed to
IntersectRay (CollisionGroup.Impassable) actually includes all surfaces you
expect (or add/include BulletImpassable/other groups) so glass/fences are
detected.
Content.Shared/Interaction/SharedInteractionSystem.cs (1)

871-881: Избыточная проверка !_itemQuery.HasComp(target) и потенциальное расширение игнор-листа.

Поскольку это else if после ветки items (строка 848), проверка !_itemQuery.HasComp(target) здесь излишня — в эту ветку никогда не попадёт сущность с ItemComponent. Можно упростить условие.

Кроме того, GetEntitiesIntersectingBody(target, collisionMask, …) вернёт все пересекающиеся сущности, включая мобов/игроков, которые стоят вплотную к структуре, и все они попадут в игнор-сет. Это намеренный эффект для фикса (несколько FleshBlocker/RockBlocker на одном тайле), но стоит убедиться, что лучи к одной структуре не начнут «просвечивать» сквозь соседние мобы/предметы, стоящие на том же тайле и пересекающиеся с её AABB. Если это нежелательно — стоит фильтровать результат по _physicsQuery.HasComp + CanCollide + anchored либо ограничиться только закреплёнными структурами.

♻️ Небольшая чистка условия
-            else if (!_itemQuery.HasComp(target) && _physicsQuery.TryComp(target, out var physics2) && physics2.CanCollide)
+            else if (_physicsQuery.TryComp(target, out var physics2) && physics2.CanCollide)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Shared/Interaction/SharedInteractionSystem.cs` around lines 871 -
881, Условие содержит избыточную проверку !_itemQuery.HasComp(target) и может
добавлять в ignored все пересекающиеся сущности (включая мобы/игроков); уберите
проверку !_itemQuery.HasComp(target) в ветке с _physicsQuery.TryComp(target, out
var physics2) и вместо прямого
ignored.UnionWith(_broadphase.GetEntitiesIntersectingBody(...)) фильтруйте
результат вызова GetEntitiesIntersectingBody по желаемым компонентам/свойствам
(например, для каждого e проверять _physicsQuery.TryComp(e,out var p) &&
p.CanCollide && p.Anchored или иные критерии), затем добавляйте в ignored только
отфильтрованные сущности; обратитесь к символам _physicsQuery.TryComp,
_broadphase.GetEntitiesIntersectingBody и ignored.UnionWith при внесении правок.
Content.Shared/_White/Shove/ShoveImpactComponent.cs (1)

9-17: Поле OriginalSpeed не реплицируется, хотя компонент [NetworkedComponent].

У класса отсутствует [AutoGenerateComponentState], а у OriginalSpeed[AutoNetworkedField], поэтому значение не будет синхронизироваться с клиентом. Система ShoveImpactSystem живёт в Content.Server, так что функционально это сейчас не ломается, но наличие [NetworkedComponent] без синхронизированных полей вводит в заблуждение и приведёт к рассинхрону, если поле начнут читать на клиенте. Либо добавьте авто-сеть, либо уберите [NetworkedComponent].

♻️ Предлагаемый фикс
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
 public sealed partial class ShoveImpactComponent : Component
 {
     /// <summary>
     /// The original throw speed before raycast capping.
     /// </summary>
-    [DataField]
+    [DataField, AutoNetworkedField]
     public float OriginalSpeed;
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Shared/_White/Shove/ShoveImpactComponent.cs` around lines 9 - 17,
Класс ShoveImpactComponent помечён [NetworkedComponent], но поле OriginalSpeed
не реплицируется — добавьте либо автогенерацию состояния и пометите поле для
сетки, либо уберите сетевой маркер: в ShoveImpactComponent либо добавить атрибут
[AutoGenerateComponentState] на класс и отметить поле OriginalSpeed атрибутом
[AutoNetworkedField], либо удалить [NetworkedComponent] с класса (учитывая, что
ShoveImpactSystem живёт в Content.Server) — выберите подходящий вариант и
приведи соответствующие атрибуты в一致ие.
Content.Shared/Teleportation/Systems/SharedPortalSystem.cs (1)

224-252: Дублирование логики импакта при телепорте с WhitePortalSystem.

Блоки 224–252 здесь и 61–86 в Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs — практически идентичная логика (захват скорости → расчёт relativeSpeed → урон/стан → зануление LinearVelocity), но с разными коэффициентами урона (5f * (2f * relativeSpeed / 20f) vs 5f * (relativeSpeed / 20f)). Это классический копипаст, который будет рассинхронизировываться при дальнейших правках. Разумно вынести в общий helper, например protected void ApplyTeleportImpact(EntityUid subject, Vector2 oldMapVelocity) в SharedPortalSystem и использовать его из обоих мест, либо просто сделать public static/extension.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Shared/Teleportation/Systems/SharedPortalSystem.cs` around lines 224
- 252, Extract the duplicate teleport-impact logic into a single helper on
SharedPortalSystem named ApplyTeleportImpact(EntityUid subject, Vector2
oldMapVelocity, float damageMultiplier = 1f) that encapsulates computing
newGridVelocity, relativeSpeed, applying DamageSpecifier and stun, and zeroing
LinearVelocity via _physics; keep the behavior configurable by damageMultiplier
so callers can preserve original formulas (pass 1f from SharedPortalSystem and
0.5f from WhitePortalSystem to reproduce the two existing coefficients), then
replace the duplicated blocks in SharedPortalSystem (the block using
oldMapVelocity, _damageable, _stun and _physics.SetLinearVelocity) and in
WhitePortalSystem with calls to ApplyTeleportImpact(subject, oldMapVelocity,
<appropriate multiplier>).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Content.Client/_White/Hands/DropOverlay.cs`:
- Around line 64-76: Calculate neededSize using both axes of
_eye.CurrentEye.Zoom (e.g., use Math.Min(1f, Math.Min(_eye.CurrentEye.Zoom.X,
_eye.CurrentEye.Zoom.Y))) instead of only Zoom.X, and clamp that result to a
sensible max to prevent unlimited growth; then only recreate/dispose
_renderBackbuffer via _renderBackbuffer.Dispose() +
_clyde.CreateRenderTarget(...) when the required size meaningfully differs
(larger or smaller) from _renderBackbuffer.Size to allow shrinking as well as
growth; update the condition around neededSize, the value passed to
CreateRenderTarget, and the logic that decides when to recreate before calling
handle.RenderInRenderTarget(...) / handle.DrawEntity(...).

In `@Content.Server/_White/Shove/ShoveImpactSystem.cs`:
- Around line 1-33: The ShoveImpactSystem class is declared in the global
namespace and an unused using (Content.Shared.Stunnable) remains; wrap the class
in the correct namespace Content.Server._White.Shove and remove the unused using
to follow project conventions and avoid type conflicts — locate the
ShoveImpactSystem declaration (and related ShoveImpactComponent usage) and add
the namespace declaration around the class, then delete the unused using
directive for Content.Shared.Stunnable.
- Around line 16-32: В методе OnCollide для ShoveImpactComponent замените
текущую общую проверки жесткости (args.OtherFixture.Hard) на проверку маски
столкновения аналогично PhysicalShove (проверять принадлежность к
CollisionGroup.Impassable, а не к MobMask), чтобы учитывать только
стены/непроходимые объекты; также исправьте вычисление effectiveSpeed: вместо
MathF.Max(originalSpeed, args.OurBody.LinearVelocity.Length()) используйте либо
MathF.Min(originalSpeed, args.OurBody.LinearVelocity.Length()) либо напрямую
args.OurBody.LinearVelocity.Length() (в зависимости от желаемой семантики),
чтобы учитывать снижение скорости после TryThrow и не всегда брать оригинальную
скорость.

In `@Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs`:
- Around line 56-59: The failure popup currently always shows the hardcoded
"paradox-anomaly-create-false" message in ParadoxAnomalySystem.PopupCursor even
though TrySpawnParadoxAnomaly can fail for multiple reasons (e.g. no candidates
vs no latejoin spawn points). Either make the popup neutral (e.g. a generic
"could not create anomaly" message) or change TrySpawnParadoxAnomaly to
return/emit a failure reason (e.g. return a (bool success, string reason) or an
out parameter) and use that reason when calling _popup.PopupCursor instead of
the fixed Loc.GetString("paradox-anomaly-create-false"); update the call site
where TrySpawnParadoxAnomaly is invoked and the PopupCursor invocation to
display the specific reason string or the neutral fallback.

In `@Content.Server/Weapons/Melee/MeleeWeaponSystem.cs`:
- Around line 237-267: The local throwSpeed is computed and clamped by raycast
results but never used when calling _throwing.TryThrow; either remove
throwSpeed/originalSpeed if you only want to limit distance via pushVector, or
actually pass the clamped throwSpeed into TryThrow instead of force *
shovespeed. To apply the speed cap: use the computed throwSpeed as the speed
argument to _throwing.TryThrow(target, pushVector, throwSpeed, user, animated:
animated, throwInAir: throwInAir) and keep the
EnsureComp<ShoveImpactComponent>(target).OriginalSpeed = originalSpeed
assignment so the original un-clamped speed is recorded; otherwise delete
throwSpeed and originalSpeed and the related math (including their use in
EnsureComp) to remove dead code.

In `@Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs`:
- Around line 61-86: The damage formula in WhitePortalSystem.cs currently uses
damage.DamageDict.Add("Blunt", 5f * (relativeSpeed / 20f)) which diverges from
SharedPortalSystem.cs where the calculation is 5f * (2f * relativeSpeed / 20f);
update WhitePortalSystem.cs to use the same expression (e.g.,
damage.DamageDict.Add("Blunt", 5f * (2f * relativeSpeed / 20f))) so the blunt
damage calculation matches SharedPortalSystem, or if the difference is
intentional, add a concise comment next to the DamageSpecifier creation
explaining why WhitePortalSystem uses a different coefficient; locate the change
around the relativeSpeed calculation and the block that constructs
DamageSpecifier / DamageDict and adjust accordingly.

In `@Content.Shared/Slippery/SlipperySystem.cs`:
- Around line 129-132: The current hard cap maxSlipSpeed (15f) clamps all
LaunchForwardsMultiplier effects; update the system to read a configurable cap
from SlipperyComponent (e.g., add a nullable float property like MaxLaunchSpeed)
and use that value instead of the local const in the calculation in
SlipperySystem (where newVelocity is computed using LaunchForwardsMultiplier),
falling back to the old default (15f) when null; ensure
SuperSlippery/admin-smite paths (e.g., AdminVerbSystem.Smites.cs usage of
LaunchForwardsMultiplier) can set a higher cap or null to disable the limit.

In `@Content.Shared/Teleportation/Systems/SharedPortalSystem.cs`:
- Line 250: The unconditional zeroing of velocity via
_physics.SetLinearVelocity(subject, Vector2.Zero, body: body) should be
restricted: only reset velocity when the computed relativeSpeed >= 20f or when
the entity is being transferred between maps; update the logic around where
relativeSpeed is calculated (reference relativeSpeed) and where
SetLinearVelocity is called (reference _physics.SetLinearVelocity(subject,
Vector2.Zero, body: body) and subject/body) so that for low-speed teleports you
preserve the existing velocity/impulse and only clear it for high-impact
teleports or cross-map transfers.

In
`@Resources/Locale/en-US/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl`:
- Line 2: Fix the typo in the message string for the key
paradox-anomaly-create-false: replace "No candidats to create the paradox
anomaly." with "No candidates to create the paradox anomaly." so the value uses
the correct English word "candidates" (update the entry for
paradox-anomaly-create-false in the FTL file).

In `@Resources/Migrations/migration.yml`:
- Around line 501-504: Миграция обнуляет прототипы SalvageMagnet, SalvageLocator
и SalvageMagnetMachineCircuitboard, но связанные
рецепты/спаунеры/локеры/определения всё ещё создают или дают эти предметы;
удалите или отключите все упоминания чтобы полностью убрать контент:
удалите/закомментируйте рецепт CargoBotLathePack и рецепт
SalvageMagnetMachineCircuitboard (cargo.yml и electronics.yml),
удалите/отключите спаунер в techboard.yml, запись локера в heads.yml и
определение/запись платы в production.yml; альтернативно, если нужен обратимый
выключатель через CVar, не делать миграцию в null—вместо этого оставить
прототипы и добавить проверку CVar в коде/спаунерах/рецептах (или добавить
миграцию, которая удаляет рецепты/спаунеры при выключении), чтобы поведение было
консистентным.

---

Nitpick comments:
In `@Content.Server/GameTicking/GameTicker.Player.cs`:
- Around line 128-134: The if block around the UI-close logic lacks braces and
has misleading indentation for the two nested foreach loops; update the block
that checks mind.CurrentEntity and TryComp<UserInterfaceUserComponent> to use
explicit braces { ... } and re-indent the inner foreach loops so they are
clearly nested inside the if, keeping the existing ToArray() calls on
userUi.OpenInterfaces and keys and still calling _ui.CloseUi(targetEntity, key,
mind.CurrentEntity.Value); reference the mind.CurrentEntity check,
Deleted(mind.CurrentEntity),
TryComp<UserInterfaceUserComponent>(mind.CurrentEntity, out var userUi),
userUi.OpenInterfaces.ToArray(), keys.ToArray(), and _ui.CloseUi when making the
change.

In `@Content.Server/Weapons/Melee/MeleeWeaponSystem.cs`:
- Around line 246-264: Replace the foreach+break over results from
_physics.IntersectRay with a single-result check (e.g. results.FirstOrDefault()
or results.First()/Any()) to make intent explicit; when handling the hit, guard
against tiny wallDist by using an epsilon (e.g. var effectiveDist =
MathF.Max(wallDist - epsilon, 0f)) and only set pushVector = pushDir *
effectiveDist (or skip updating pushVector if effectiveDist <= epsilon) and
clamp throwSpeed similarly; keep the existing assignment to
EnsureComp<ShoveImpactComponent>(target).OriginalSpeed when originalSpeed >
throwSpeed, and also review that the CollisionGroup passed to IntersectRay
(CollisionGroup.Impassable) actually includes all surfaces you expect (or
add/include BulletImpassable/other groups) so glass/fences are detected.

In `@Content.Shared/_White/Shove/ShoveImpactComponent.cs`:
- Around line 9-17: Класс ShoveImpactComponent помечён [NetworkedComponent], но
поле OriginalSpeed не реплицируется — добавьте либо автогенерацию состояния и
пометите поле для сетки, либо уберите сетевой маркер: в ShoveImpactComponent
либо добавить атрибут [AutoGenerateComponentState] на класс и отметить поле
OriginalSpeed атрибутом [AutoNetworkedField], либо удалить [NetworkedComponent]
с класса (учитывая, что ShoveImpactSystem живёт в Content.Server) — выберите
подходящий вариант и приведи соответствующие атрибуты в一致ие.

In `@Content.Shared/Interaction/SharedInteractionSystem.cs`:
- Around line 871-881: Условие содержит избыточную проверку
!_itemQuery.HasComp(target) и может добавлять в ignored все пересекающиеся
сущности (включая мобы/игроков); уберите проверку !_itemQuery.HasComp(target) в
ветке с _physicsQuery.TryComp(target, out var physics2) и вместо прямого
ignored.UnionWith(_broadphase.GetEntitiesIntersectingBody(...)) фильтруйте
результат вызова GetEntitiesIntersectingBody по желаемым компонентам/свойствам
(например, для каждого e проверять _physicsQuery.TryComp(e,out var p) &&
p.CanCollide && p.Anchored или иные критерии), затем добавляйте в ignored только
отфильтрованные сущности; обратитесь к символам _physicsQuery.TryComp,
_broadphase.GetEntitiesIntersectingBody и ignored.UnionWith при внесении правок.

In `@Content.Shared/Teleportation/Systems/SharedPortalSystem.cs`:
- Around line 224-252: Extract the duplicate teleport-impact logic into a single
helper on SharedPortalSystem named ApplyTeleportImpact(EntityUid subject,
Vector2 oldMapVelocity, float damageMultiplier = 1f) that encapsulates computing
newGridVelocity, relativeSpeed, applying DamageSpecifier and stun, and zeroing
LinearVelocity via _physics; keep the behavior configurable by damageMultiplier
so callers can preserve original formulas (pass 1f from SharedPortalSystem and
0.5f from WhitePortalSystem to reproduce the two existing coefficients), then
replace the duplicated blocks in SharedPortalSystem (the block using
oldMapVelocity, _damageable, _stun and _physics.SetLinearVelocity) and in
WhitePortalSystem with calls to ApplyTeleportImpact(subject, oldMapVelocity,
<appropriate multiplier>).

In `@Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml`:
- Around line 56-65: Удалите весь закомментированный блок между маркерами "#
WWDP EDIT START" и "# WWDP EDIT END", содержащий старое определение suitstorage
(поля: name/suitstorage, slotTexture, slotFlags, stripTime, uiWindowPos,
strippingWindowPos, dependsOn, displayName), чтобы не вводить в заблуждение;
оставьте при необходимости только сами маркеры WWDP для трассировки, поскольку
актуальная конфигурация suitstorage реализована ниже и использует другие поля
(например slotGroup: MainHotbar и dependsOnComponents).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 724ac76e-8286-4bfc-98bf-8e89b2864e8c

📥 Commits

Reviewing files that changed from the base of the PR and between 7077010 and b55b9c6.

📒 Files selected for processing (20)
  • Content.Client/Shuttles/UI/ShuttleMapControl.xaml.cs
  • Content.Client/_White/Hands/DropOverlay.cs
  • Content.Server/DeltaV/ParadoxAnomaly/Systems/ParadoxAnomalySystem.cs
  • Content.Server/GameTicking/GameTicker.Player.cs
  • Content.Server/GameTicking/GameTicker.cs
  • Content.Server/Weapons/Melee/MeleeWeaponSystem.cs
  • Content.Server/_White/Shove/ShoveImpactSystem.cs
  • Content.Shared/Anomaly/SharedAnomalySystem.cs
  • Content.Shared/Interaction/SharedInteractionSystem.cs
  • Content.Shared/Slippery/SlipperySystem.cs
  • Content.Shared/Teleportation/Systems/SharedPortalSystem.cs
  • Content.Shared/_White/Shove/ShoveImpactComponent.cs
  • Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs
  • Resources/Locale/en-US/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl
  • Resources/Locale/ru-RU/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl
  • Resources/Migrations/migration.yml
  • Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
  • Resources/Prototypes/Entities/Mobs/NPCs/space.yml
  • Resources/Prototypes/InventoryTemplates/arachnid_inventory_template.yml
  • Resources/Prototypes/_Goobstation/Devil/clauses.yml

Comment thread Content.Client/_White/Hands/DropOverlay.cs Outdated
Comment thread Content.Server/_White/Shove/ShoveImpactSystem.cs Outdated
Comment thread Content.Server/_White/Shove/ShoveImpactSystem.cs
Comment thread Content.Server/Weapons/Melee/MeleeWeaponSystem.cs
Comment thread Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs
Comment thread Content.Shared/Slippery/SlipperySystem.cs
Comment thread Content.Shared/Teleportation/Systems/SharedPortalSystem.cs Outdated
Comment thread Resources/Locale/en-US/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl Outdated
Comment thread Resources/Migrations/migration.yml
@Sevasstyan
Copy link
Copy Markdown
Contributor

Ебать, ярик, удивляешь
Ты что теперь полноценный кокер??

@Sevasstyan
Copy link
Copy Markdown
Contributor

Или это легкие фиксы?
Я хз просто

@Lachklen
Copy link
Copy Markdown
Contributor Author

ХЗ

@Lachklen
Copy link
Copy Markdown
Contributor Author

Всё относительно

@Sevasstyan
Copy link
Copy Markdown
Contributor

Ладно, все равно молодец

@Lachklen Lachklen changed the title Some fixes Some fixes, tweaks, adds and removes. Apr 22, 2026
@DDDecard
Copy link
Copy Markdown
Contributor

Чирикни ишуи, связанные с твоими фиксами, если такие есть

Copy link
Copy Markdown
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: 5

♻️ Duplicate comments (1)
Content.Client/_White/Hands/DropOverlay.cs (1)

64-79: ⚠️ Potential issue | 🟠 Major

Ограничьте render target практичным максимумом и используйте тот же безопасный zoom при отрисовке.

Line 64 при Zoom = 0.01 создаёт буфер 12800x12800, что может резко ударить по VRAM/лимитам текстур. При этом Line 79 делит scale на сырой _eye.CurrentEye.Zoom, поэтому при zoom ниже выбранного floor размер спрайта продолжит расти уже несинхронно с размером буфера.

Возможная правка
         var adjustedAngle = dropcomp.Angle;
-        var neededSize = (int)(128 / Math.Min(1f, Math.Max(0.01f, Math.Min(_eye.CurrentEye.Zoom.X, _eye.CurrentEye.Zoom.Y))));
+        const int baseRenderSize = 128;
+        const int maxRenderSize = 2048;
+        var minZoom = baseRenderSize / (float) maxRenderSize;
+        var zoom = _eye.CurrentEye.Zoom;
+        var safeZoom = new Vector2(
+            Math.Max(minZoom, zoom.X),
+            Math.Max(minZoom, zoom.Y));
+        var neededSize = (int) Math.Ceiling(baseRenderSize / Math.Min(1f, Math.Min(safeZoom.X, safeZoom.Y)));
         if (_renderBackbuffer.Size.X < neededSize ||
             _renderBackbuffer.Size.Y < neededSize ||
             _renderBackbuffer.Size.X > neededSize * 2 ||
             _renderBackbuffer.Size.Y > neededSize * 2)
         {
@@
         handle.RenderInRenderTarget(_renderBackbuffer, () =>
         {
-            handle.DrawEntity(held, _renderBackbuffer.Size / 2, new Vector2(2.1f) / _eye.CurrentEye.Zoom, adjustedAngle);
+            handle.DrawEntity(held, _renderBackbuffer.Size / 2, new Vector2(2.1f) / safeZoom, adjustedAngle);
         }, Color.Transparent);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Content.Client/_White/Hands/DropOverlay.cs` around lines 64 - 79, Compute a
safe zoom and a capped render-target size instead of using the raw
_eye.CurrentEye.Zoom to avoid huge textures: create a local safeZoom =
Math.Min(1f, Math.Max(0.01f, Math.Min(_eye.CurrentEye.Zoom.X,
_eye.CurrentEye.Zoom.Y))) (reuse the same clamped value for both axes) and
compute neededSize from safeZoom, then clamp neededSize to a pragmatic MAX (e.g.
4096) before creating/disposing _renderBackbuffer via _clyde.CreateRenderTarget;
finally, when calling handle.RenderInRenderTarget / handle.DrawEntity, use that
same safeZoom (not _eye.CurrentEye.Zoom) to compute the scale vector so the
sprite scale stays consistent with the buffer size.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs`:
- Around line 61-90: Сделайте общий helper (например ApplyPostTeleportProtection
or HandleTeleportPhysics) который берёт entity id, optional
PhysicsComponent/body и целевой transform/grid и выполняет: собрать
oldMapVelocity через _physics.GetMapLinearVelocity (используя
TryComp<PhysicsComponent> как сейчас), выполнить ту же post-teleport логику —
вычисление newGridVelocity (через Transform(...) и TryComp на gridBody),
вычисление relativeSpeed, нанесение урона через _damageable.TryChangeDamage и
парализа _stun.TryParalyze при HasComp<DamageableComponent>, и clamp скорости
через _physics.SetLinearVelocity; затем замените дублированный блок после
_transform.SetCoordinates и также вызовите этот helper после ветки случайной
телепортации, где сейчас вызывается SetMapCoordinates, чтобы обе ветки
использовали одинаковую защиту скорости.
- Around line 78-83: В блоке, где рассчитывается и применяется урон/паралич
(переменные relativeSpeed, args.OtherEntity) защитить вызовы
_damageable.TryChangeDamage и _stun.TryParalyze серверной проверкой сети: до
применения урона/стана проверить состояние сети (используя _net.IsClient или
противоположную серверную флаг-проверку) и выполнять изменение только на
сервере, чтобы предотвратить локальные клиентские вызовы; соответственно
переместить или обернуть вызовы TryChangeDamage и TryParalyze в условие, которое
пропускает выполнение на клиенте (например if (_net.IsClient) return; или if
(!_net.IsServer) return;).
- Around line 4-6: The file is missing the namespace import for
DamageableComponent: add "using Content.Shared.Damage.Components;" to the top of
WhitePortalSystem.cs alongside the other using statements so references to
DamageableComponent compile; ensure the new using is placed with the existing
imports (near the other Content.Shared.* usings) to resolve the symbol.

In `@Content.Shared/Teleportation/Systems/SharedPortalSystem.cs`:
- Around line 241-247: The damage and paralyze calls in TeleportEntity are being
run client-side; guard them so only the authoritative server mutates state: wrap
the _damageable.TryChangeDamage(subject, damage) and _stun.TryParalyze(subject,
...) calls in a server-only check (e.g. if (!IsServer) return; or the project’s
equivalent authority check) inside SharedPortalSystem.TeleportEntity so clients
only do prediction/visuals and the server applies DamageSpecifier and paralyze;
keep the relativeSpeed calculation client-side if needed but ensure
state-changing calls (_damageable.TryChangeDamage and _stun.TryParalyze) execute
only when the system has server authority.
- Line 10: Удалите дублирующий импорт: найдите повторяющуюся директиву using
Content.Shared.Projectiles (в файле с классом
SharedPortalSystem/SharedPortalSystem.cs) и удалите одну из них so чтобы каждая
using-директива присутствовала только один раз; проверьте, что больше нет
повторов и пересоберите чтобы убрать предупреждение CS0105.

---

Duplicate comments:
In `@Content.Client/_White/Hands/DropOverlay.cs`:
- Around line 64-79: Compute a safe zoom and a capped render-target size instead
of using the raw _eye.CurrentEye.Zoom to avoid huge textures: create a local
safeZoom = Math.Min(1f, Math.Max(0.01f, Math.Min(_eye.CurrentEye.Zoom.X,
_eye.CurrentEye.Zoom.Y))) (reuse the same clamped value for both axes) and
compute neededSize from safeZoom, then clamp neededSize to a pragmatic MAX (e.g.
4096) before creating/disposing _renderBackbuffer via _clyde.CreateRenderTarget;
finally, when calling handle.RenderInRenderTarget / handle.DrawEntity, use that
same safeZoom (not _eye.CurrentEye.Zoom) to compute the scale vector so the
sprite scale stays consistent with the buffer size.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: c8d0e6fb-95a8-4839-b8f4-2896d4020e3d

📥 Commits

Reviewing files that changed from the base of the PR and between b55b9c6 and 43cf563.

📒 Files selected for processing (8)
  • Content.Client/Administration/UI/Tabs/AdminbusTab/AdminbusTab.xaml
  • Content.Client/Administration/UI/Tabs/AdminbusTab/LoadBlueprintsWindow.xaml.cs
  • Content.Client/_White/Hands/DropOverlay.cs
  • Content.Server/_White/Shove/ShoveImpactSystem.cs
  • Content.Shared/Teleportation/Systems/SharedPortalSystem.cs
  • Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs
  • Resources/Locale/en-US/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl
  • Resources/Locale/ru-RU/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl
✅ Files skipped from review due to trivial changes (2)
  • Resources/Locale/ru-RU/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl
  • Resources/Locale/en-US/_white/paradoxanomaly/systems/paradoxanomalysystem.ftl
🚧 Files skipped from review as they are similar to previous changes (1)
  • Content.Server/_White/Shove/ShoveImpactSystem.cs

Comment thread Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs
Comment thread Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs
Comment thread Content.Shared/_White/Teleportation/Systems/WhitePortalSystem.cs Outdated
Comment thread Content.Shared/Teleportation/Systems/SharedPortalSystem.cs Outdated
Comment thread Content.Shared/Teleportation/Systems/SharedPortalSystem.cs
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.

3 participants