[Feature] New aggression inhibitor collar - #146
Conversation
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: ⛔ Files ignored due to path filters (3)
📒 Files selected for processing (21)
Главное изменение
Prediction / networking
Resources / localization
Validation / risk
WalkthroughДобавлены механики ChangesМеханики Stabikor и CuttableItem
Estimated code review effort: 4 (Complex) | ~45 minutes Sequence Diagram(s)sequenceDiagram
participant Персонаж
participant SharedAggressionInhibitorSystem
participant AggressionInhibitorSystem
participant AggressionInhibitorComponent
Персонаж->>SharedAggressionInhibitorSystem: Выбирает действие ингибитора
SharedAggressionInhibitorSystem->>AggressionInhibitorSystem: Передаёт событие
AggressionInhibitorSystem->>AggressionInhibitorComponent: Проверяет доступ и состояние
AggressionInhibitorSystem->>AggressionInhibitorComponent: Обновляет таймер и активность
sequenceDiagram
participant Инструмент
participant SharedCuttableItemSystem
participant CuttableItemSystem
participant RadioSystem
Инструмент->>SharedCuttableItemSystem: Запускает do-after резки
SharedCuttableItemSystem->>CuttableItemSystem: Передаёт завершение
CuttableItemSystem->>RadioSystem: Отправляет локализованное сообщение
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 20
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@Content.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs`:
- Around line 213-256: Переименуйте метод IsLocked(EntityUid, StabikorComponent,
EntityUid) в ToggleLock, включая все места его вызова, поскольку метод выполняет
переключение состояния замка, а не проверку. Не изменяйте логику блокировки,
разблокировки или проверки доступа.
- Line 1: Update the server-side StabikorSystem.Update method to mark the
component dirty immediately after decrementing comp.Timer, using Dirty or
appropriately throttled DirtyField so timer changes replicate to clients. Remove
the unconditional Dirty call from SharedStabikorSystem.OnExamine, leaving the
existing examine behavior otherwise unchanged.
- Around line 175-181: Update OpenDialog to validate the held ID card’s access
against comp.LockAccess before allowing timer configuration. Reuse the same
access-checking logic or helper used by the IsLocked handling around the
corresponding LockAccess/UnlockAccess checks, while preserving the existing
item, ID-card, and AccessComponent validation.
- Around line 44-58: В методе Update, в цикле обработки StabikorComponent,
пометь изменённое сетевое поле Timer через DirtyField(uid, comp, ...) или
Dirty(uid, comp) после декремента; ограничь отправку обновлений разумным
троттлингом, например раз в секунду, сохранив корректный серверный отсчёт и
немедленную обработку истечения Timer.
- Around line 40-58: В методе Update замените return после неудачного
RemoveStabikor(uid, comp) на continue, чтобы ошибка обработки одного Stabikor не
прерывала перебор EntityQueryEnumerator и остальные сущности продолжали
обрабатываться в текущем тике.
- Around line 126-161: В обработчике взаимодействия Stabikor добавьте установку
args.Handled = true в обе ветки отказа доступа: else внутри проверки
comp.IsLocked и соответствующую else-ветку для режима блокировки. Сохраните
существующие PopupEntity и воспроизведение DenySound.
- Around line 285-310: Update RemoveStabikor so comp.Timer, comp.IsLocked,
comp.IsActive, and comp.WearingEntity remain unchanged until
TryGetContainingSlot and TryUnequip both succeed. Perform the unequip validation
first, then clear the component state and call Dirty only after successful
removal; preserve the existing false returns and success effects.
- Around line 164-222: Replace the EntityUid.Invalid fallback with nullable
EntityUid handling in both OpenDialog and IsLocked. Derive the containing parent
as EntityUid?, treat presence with a null check, and preserve the existing
targetEntity selection and range-check behavior.
- Around line 60-101: Update the ToggleCombatActionEvent subscription associated
with OnToggleCombatAction to use an explicit processing order, or validate the
current combat state through IsInCombatMode(user) before applying the Stabikor
shock. Ensure the shock logic does not depend on another subscriber having
already changed the combat mode via SetInCombatMode.
In `@Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs`:
- Around line 18-40: Update the CuttableItemComponent fields ToolQualities,
RadioChannel, and AlertMessage to use List<ProtoId<ToolQualityPrototype>>,
ProtoId<RadioChannelPrototype>, and LocId respectively, preserving their
existing defaults and data/network field behavior.
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 48-63: Update OnInteractUsing so the DoAfterArgs setup,
_doAfter.TryStartDoAfter call, and cuttable-item-attempt-broken-popup feedback
execute in the shared/predicted path before the client early return. Keep
args.Handled set for both sides, while retaining item removal and radio
notification exclusively in the server-confirmation path.
- Line 60: Вызовите Loc.GetString для cuttable-item-attempt-broken-popup в
SharedCuttableItemSystem без повторной локализации имени пользователя: передайте
результат Name(args.User) напрямую как значение параметра user, удалив вложенный
Loc.GetString.
In `@Content.Shared/_Arcane/Stabikor/Components/StabikorComponent.cs`:
- Around line 49-53: Rename the StabikorComponent field TimeStan to TimeStun and
update all references to use the corrected symbol consistently.
- Around line 102-111: Rename the Verp field and its constructor parameter in
OpenDialogEvent and ToggleLockEvent to the established target-entity convention,
such as Target or Entity, and update all references to these event fields
accordingly.
In `@Content.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs`:
- Around line 55-82: Remove the unconditional Dirty call from OnExamine, since
this handler only formats examination text and does not mutate
StabikorComponent. Preserve the existing status, duration, and remaining-timer
display logic; timer synchronization should be handled by the server update path
rather than examination.
- Around line 34-43: Replace the manual _netManager.IsClient gate in
OnBeingUnequippedAttempt with the appropriate predicted popup API, such as
PopupPredicted or PopupClient, while preserving the existing localization key,
target entities, popup type, and args.Cancel behavior.
- Around line 86-93: Исправьте логику в методе, содержащем
TryGetContainingContainer: не выходите немедленно при отсутствии контейнера, а
корректно вычисляйте isInContainer и применяйте проверку
args.CanAccess/args.CanInteract для сущностей, находящихся в контейнере.
Сохраните ранний выход только для случаев, когда доступ или взаимодействие
запрещены, чтобы верб-меню не обходило стандартные проверки.
- Around line 122-140: Replace RaiseNetworkEvent with RaiseLocalEvent in
FlipOpenDialog and FlipToggleLock when invoking ActivationVerb actions. Preserve
the existing cooldown updates and event payloads, ensuring OpenDialogEvent and
ToggleLockEvent reach the local StabikorSystem handlers on both client and
server without network re-dispatch.
In `@Resources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl`:
- Around line 46-53: Добавьте в локаль-ресурс ключ
stabikor-duration-set-cancel-fallback с русским сообщением для случая пустого
ввода, поддерживающим параметр {$time}; согласуйте формулировку с существующим
stabikor-duration-set-success и вызовом из StabikorSystem.cs.
In `@Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl`:
- Around line 1-5: Добавьте эквивалентные en-US FTL-ключи для
cuttable-item-broken-moment-popup, cuttable-item-attempt-broken-popup,
cuttable-item-examine-header и cuttable-item-alert-activated, сохранив те же
параметры $item и $user и переведя сообщения на английский. Разместите их в
соответствующем en-US файле локализации cuttableItem.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 150f2035-be1c-453d-ab4c-19d0683c516b
⛔ Files ignored due to path filters (3)
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-HAND.pngis excluded by!**/*.pngResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-NECK.pngis excluded by!**/*.pngResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/icon.pngis excluded by!**/*.png
📒 Files selected for processing (16)
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csResources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftlResources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftlResources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
- GitHub Check: YAML map schema validator
- GitHub Check: build (ubuntu-latest)
- GitHub Check: build (ubuntu-latest)
- GitHub Check: YAML Linter
- GitHub Check: Test Packaging
⚠️ CI failures not shown inline (2)
GitHub Actions: CRLF Check / 0_CRLF Check.txt: [Add] bracelet stabikor
Conclusion: failure
##[group]Run Tools/check_crlf.py
�[36;1mTools/check_crlf.py�[0m
shell: /usr/bin/bash -e {0}
##[endgroup]
Traceback (most recent call last):
File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 40, in <module>
exit(main())
^^^^^^
File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 13, in main
if is_file_crlf(file_name):
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 33, in is_file_crlf
with open(path, "rb") as f:
^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '"Resources/Locale/ru-RU/_Arcane/\\321\\201uttableItem/cuttable-Item-component.ftl"'
##[error]Process completed with exit code 1.
GitHub Actions: CRLF Check / CRLF Check: [Add] bracelet stabikor
Conclusion: failure
##[group]Run Tools/check_crlf.py
�[36;1mTools/check_crlf.py�[0m
shell: /usr/bin/bash -e {0}
##[endgroup]
Traceback (most recent call last):
File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 40, in <module>
exit(main())
^^^^^^
File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 13, in main
if is_file_crlf(file_name):
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/arcane/arcane/Tools/check_crlf.py", line 33, in is_file_crlf
with open(path, "rb") as f:
^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '"Resources/Locale/ru-RU/_Arcane/\\321\\201uttableItem/cuttable-Item-component.ftl"'
##[error]Process completed with exit code 1.
🧰 Additional context used
📓 Path-based instructions (18)
Resources/**/*.{yml,ftl,json}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.jsonResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
Resources/**/*.yml
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns
Resources/**/*.yml: Loadss14-naming-conventionsdocumentation for Resources work
Loadss14-ecs-prototypesdocumentation for Resources work
Loadss14-upstream-maintenancedocumentation for Resources work
Loadss14-prototypes-localedocumentation for Resources work
Loadss14-localization-stringsdocumentation for Resources work
Loadss14-sprite-overlays-shadersdocumentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after editsRun
dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOptto validate YAML and resource edits.
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.yml
Resources/**/*.{yml,ftl}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 prototype locale integration rules and practices
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
**/*.{cs,xaml,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
If the task adds tests or you need to choose the right test layer, load skill
ss14-tests-authoring.
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/Recipes/Lathes/security.ymlContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csResources/Prototypes/Catalog/Fills/Lockers/security.ymlContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
Resources/Prototypes/**/*.yml
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree inResources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes inbase.ymland variants in sibling files.
Keep entity prototype field order astype,abstract,parent,id,categories,name,suffix,description,components. Do not insert blank lines between- type:entries inside acomponents:list. Separate prototype blocks with one blank line.
Prefersuffixfor spawn-menu distinctions instead of changing prototypename.
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.yml
⚙️ CodeRabbit configuration file
Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:
- Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
- Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
- Prefer base.yml for parent trees and sibling files for variants.
- Do not add blank lines inside components lists.
- Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.yml
Resources/**/*.ftl
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 localization string standards and formatting rules
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftlResources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftlResources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftlResources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftlResources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
Resources/Locale/**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Locale/**/*.ftl: Add or update FTL entries underResources/Locale/, starting withen-US; add/update matchingru-RUentries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specifickebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftlResources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftlResources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
⚙️ CodeRabbit configuration file
Resources/Locale/**/*.ftl: Treat localization as mandatory:
- Every player-facing string should be localized.
- Prefer specific kebab-case keys.
- Flag raw strings in code or gameplay/resource changes that are missing locale updates.
- Check consistency when prototype names, descriptions, markings, or UI text changed.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftlResources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftlResources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
Resources/**/*.json
📄 CodeRabbit inference engine (AGENTS.md)
Keep RSI
meta.jsonordered asversion,license,copyright,size,stateswith 4-space indentation.
Files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
⚙️ CodeRabbit configuration file
Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.
Files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
**/*.cs
📄 CodeRabbit inference engine (GEMINI.md)
**/*.cs: Keep components data-only and behavior in systems
UseOn... -> Try... -> Can... -> Do...pattern for gameplay actions
PreferEntity<T?>,ProtoId<T>,EntProtoId, and localized strings for type usage
**/*.cs: When writing or editing C# gameplay code, load skills:ss14-ecs-components,ss14-ecs-entities,ss14-ecs-prototypes,ss14-ecs-systems,ss14-events, andss14-prediction.
If the C# change is large or the task needs reviewable notes, load skillss14-documentation-writing.
If the code touches hot paths,Update(), or frequently raised events, load skillss14-standard-optimizations.
If the task adds or changes player-facing text, load skillsss14-localization-stringsandss14-localization-codewhen the change also touchesLoc.GetString(...),LocId, popup text, or localized component fields.
If the task touches network events,NetEntity, replicated state routing, or shared/server/client message flow, load skillss14-netcode.
If the task touchesAppearance,GenericVisualizer, visual state enums, or sprite-layer toggles, load skillss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skillss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skillsss14-prototype-basics,ss14-ecs-basics, andss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skillsss14-debugging-workflowandss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skillsss14-common-api-patternsandss14-audiowhen the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
Put main server-only authority and non-predicted server simulation in
Content.Server/; useContent.Goobstation.Server/for features already rooted in that module.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
**/*System.cs
📄 CodeRabbit inference engine (AGENTS.md)
Public entity-system APIs that operate on entities should usually take
Entity<T?>orEntityUidfirst and callResolve(...)early.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
Content.Server/**/*.cs
⚙️ CodeRabbit configuration file
Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:
- Server owns authority, persistence, round logic, and non-predicted side effects.
- If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
- Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
- When player-visible behavior changes, check whether matching prototype and locale updates are missing.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
Content.Shared/**
📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)
Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic inContent.Shared/; useContent.Goobstation.Shared/only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong inContent.Shared/. Shared predicted components should useNetworkedComponent,AutoGenerateComponentState, andAutoNetworkedFieldwhere appropriate.
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
Content.Shared/**/*.cs
⚙️ CodeRabbit configuration file
Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:
- Shared owns replicated state, shared events, prediction, and data both client and server must understand.
- Flag client-only or server-only dependencies in Shared.
- For local-player actions, verify prediction support instead of accepting delayed server-only UX.
- When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
- Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
- Flag EntityUid.Invalid used as a "missing" sentinel.
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
🧠 Learnings (13)
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.yml
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....
Applied to files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.ymlResources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftlResources/Locale/ru-RU/_Arcane/stabikor/stabikor-component.ftl
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.
Applied to files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-26T02:48:44.443Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 136
File: Resources/Textures/Clothing/Back/Duffels/captain.rsi/meta.json:4-4
Timestamp: 2026-07-26T02:48:44.443Z
Learning: In `Resources/Textures/**/**/*.rsi/meta.json`, if the PR replaces sprite assets with sources that do not include the previous credit holders (e.g., the new sprites come from another upstream/source), do not keep attribution/author fields for contributors who made no contribution to the current assets. Update the attribution to reflect the actual authors/sources of the sprites currently referenced by the .rsi.
Applied to files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.csContent.Server/_Arcane/Stabikor/Systems/StabikorSystem.cs
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:
- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.
Applied to files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/Stabikor/Components/StabikorComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/Stabikor/Systems/SharedStabikorSystem.cs
🔇 Additional comments (8)
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs (1)
1-7: LGTM!Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (1)
9-32: LGTM!Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml (1)
1-28: 📐 Maintainability & Code QualityПодтвердите проверку YAML линтером.
Resources/Prototypes/_Arcane/Entities/Clothing/Other/stabikor.yml#L1-L28: проверьте новый прототип.Resources/Prototypes/_Orion/Research/Nodes/security.yml#L82-L82: проверьте изменённый research unlock.As per coding guidelines, run
dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOptafter YAML resource edits.Source: Coding guidelines
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json (1)
1-23: LGTM!Resources/Locale/ru-RU/_Arcane/entities/clothing/other/stabikor.ftl (1)
1-2: LGTM!Resources/Prototypes/Catalog/Fills/Lockers/security.yml (1)
46-49: LGTM!Resources/Prototypes/Recipes/Lathes/Packs/security.yml (1)
86-86: LGTM!Resources/Prototypes/Recipes/Lathes/security.yml (1)
65-77: LGTM!
| cuttable-item-broken-moment-popup = { $item } снялся! | ||
| cuttable-item-attempt-broken-popup = { $user } пытается снять { $item }! | ||
| cuttable-item-examine-header = Кажется, можно освободиться, используя инструмент с качеством: | ||
|
|
||
| cuttable-item-alert-activated = Зафиксировано несанкционированное снятие { $item }. Нарушитель: { $user } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Добавьте en-US варианты этих ключей.
Эти сообщения вызываются из shared/server кода, но определены только для ru-RU. Добавьте эквивалентный en-US FTL-файл, иначе на английской локали будут отсутствующие ключи вместо popup и радио-сообщений.
As per coding guidelines, every player-facing string must be localized.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@Resources/Locale/ru-RU/_Arcane/сuttableItem/cuttable-Item-component.ftl`
around lines 1 - 5, Добавьте эквивалентные en-US FTL-ключи для
cuttable-item-broken-moment-popup, cuttable-item-attempt-broken-popup,
cuttable-item-examine-header и cuttable-item-alert-activated, сохранив те же
параметры $item и $user и переведя сообщения на английский. Разместите их в
соответствующем en-US файле локализации cuttableItem.
Sources: Coding guidelines, Path instructions
3a6e18c to
e1dcad4
Compare
|
@coderabbitai Сделай повторное ревью |
|
✅ Action performedFull review finished. Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 24 minutes. |
There was a problem hiding this comment.
Actionable comments posted: 3
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)
53-64: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick winПроверяйте результат
TryStartDoAfter.
SharedDoAfterSystem.TryStartDoAfter(...)возвращаетfalseпри сбое запуска do-after. Сейчасargs.Handledи popup выставляются до возврата, поэтому отклонённая попытка всё равно выглядит как обработанная и выводит неверное сообщение. Устанавливайте обработанное взаимодействие и выводите UI только после успешной регистрации do-after.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs` around lines 53 - 64, Update the interaction flow around SharedDoAfterSystem.TryStartDoAfter so it checks the returned success value before marking args.Handled or invoking _popup.PopupEntity. Only set the interaction as handled and show the cuttable-item-attempt-broken-popup after the do-after starts successfully; leave failed attempts unhandled and without UI feedback.Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (2)
40-59: 🚀 Performance & Scalability | 🔵 Trivial | 🏗️ Heavy lift
Dirty(uid, comp)каждый тик вместоDirtyField.
Update()— хот-путь, тикающий по всем активным ингибиторам каждый кадр. Меняется толькоTimer, ноDirty(uid, comp)форсит пересылку всего состояния компонента всем наблюдателям в PVS на каждый тик каждого активного устройства. При нескольких активных Stabikor — накопительная сетевая нагрузка без пользы (клиент и так может досчитать таймер локально).Замените на
DirtyField(uid, comp, nameof(comp.Timer)), либо синхронизируйте черезEndTime(абсолютное время) и dirty только на активации/снятии.As per coding guidelines: "Dirty networked state every time authoritative data changes. Use
DirtyField(...)when field deltas make sense."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs` around lines 40 - 59, В методе Update замените вызов Dirty(uid, comp) после изменения Timer на DirtyField(uid, comp, nameof(comp.Timer)), сохранив текущую логику активации, истечения таймера и снятия ингибитора.Source: Coding guidelines
61-102: 🚀 Performance & Scalability | 🔵 Trivial | ⚡ Quick winГлобальный обход всех ингибиторов на каждый
ToggleCombatActionEvent.Хендлер вызывается для ЛЮБОГО игрока, переключающего боевой режим, а не только для носящих ингибитор. Внутри — полный
EntityQueryEnumerator<AggressionInhibitorComponent>()по всем существующим в мире устройствам с проверкой слота на каждой итерации. Масштабируется линейно от количества ингибиторов в раунде, при этом 99% вызовов этого события — от игроков без устройства вовсе.Проще и дешевле искать напрямую в инвентаре
user(например, через слоты_inventorySystem) либо фильтровать query по уже сохранённомуcomp.WearingEntity == user, вместо реверс-поиска владельца по всем ингибиторам.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs` around lines 61 - 102, Замените глобальный EntityQueryEnumerator<AggressionInhibitorComponent> в OnToggleCombatAction прямым поиском предметов в инвентарных слотах user либо используйте связь владельца AggressionInhibitorComponent.WearingEntity, чтобы сразу найти ингибитор пользователя. Сохраните последующие проверки активного состояния и обработки боевого режима, исключив полный обход всех ингибиторов мира на каждый вызов события.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Line 171: Update the public OpenDialog and ToggleLock methods to accept a
single Entity<AggressionInhibitorComponent> parameter instead of separate
EntityUid and AggressionInhibitorComponent parameters. Adjust
OnOpenDialogReceived and OnToggleLockReceived call sites and method internals to
access the entity and component through the new wrapper while preserving
existing behavior.
- Around line 252-254: Обновите ветку отказа после вызова RemoveInhibitor в
системе AggressionInhibitorSystem: при неудачном снятии воспроизводите DenySound
и показывайте пользователю попап, аналогично обработке отказа в OnInteractUsing.
Сохраните немедленный возврат после предоставления обратной связи.
- Around line 319-341: В методе RemoveInhibitor передавайте отображаемое имя
пользователя напрямую в параметр "user", не оборачивая результат Name(user) в
Loc.GetString. Сохраните существующий ключ stabikor-moment-shutdown и остальные
параметры PopupEntity без изменений.
---
Outside diff comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 40-59: В методе Update замените вызов Dirty(uid, comp) после
изменения Timer на DirtyField(uid, comp, nameof(comp.Timer)), сохранив текущую
логику активации, истечения таймера и снятия ингибитора.
- Around line 61-102: Замените глобальный
EntityQueryEnumerator<AggressionInhibitorComponent> в OnToggleCombatAction
прямым поиском предметов в инвентарных слотах user либо используйте связь
владельца AggressionInhibitorComponent.WearingEntity, чтобы сразу найти
ингибитор пользователя. Сохраните последующие проверки активного состояния и
обработки боевого режима, исключив полный обход всех ингибиторов мира на каждый
вызов события.
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 53-64: Update the interaction flow around
SharedDoAfterSystem.TryStartDoAfter so it checks the returned success value
before marking args.Handled or invoking _popup.PopupEntity. Only set the
interaction as handled and show the cuttable-item-attempt-broken-popup after the
do-after starts successfully; leave failed attempts unhandled and without UI
feedback.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: e5bd9206-a510-4f48-b5a9-6bed93823bbb
📒 Files selected for processing (12)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
- GitHub Check: YAML Linter
- GitHub Check: YAML map schema validator
- GitHub Check: build (ubuntu-latest)
- GitHub Check: build (ubuntu-latest)
- GitHub Check: Test Packaging
🧰 Additional context used
📓 Path-based instructions (18)
Resources/**/*.{yml,ftl,json}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.jsonResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.ftl
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 localization string standards and formatting rules
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.{yml,ftl}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 prototype locale integration rules and practices
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/Locale/**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Locale/**/*.ftl: Add or update FTL entries underResources/Locale/, starting withen-US; add/update matchingru-RUentries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specifickebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
⚙️ CodeRabbit configuration file
Resources/Locale/**/*.ftl: Treat localization as mandatory:
- Every player-facing string should be localized.
- Prefer specific kebab-case keys.
- Flag raw strings in code or gameplay/resource changes that are missing locale updates.
- Check consistency when prototype names, descriptions, markings, or UI text changed.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.yml
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns
Resources/**/*.yml: Loadss14-naming-conventionsdocumentation for Resources work
Loadss14-ecs-prototypesdocumentation for Resources work
Loadss14-upstream-maintenancedocumentation for Resources work
Loadss14-prototypes-localedocumentation for Resources work
Loadss14-localization-stringsdocumentation for Resources work
Loadss14-sprite-overlays-shadersdocumentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after editsRun
dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOptto validate YAML and resource edits.
Files:
Resources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.{cs,xaml,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
If the task adds tests or you need to choose the right test layer, load skill
ss14-tests-authoring.
Files:
Resources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Resources/Prototypes/**/*.yml
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree inResources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes inbase.ymland variants in sibling files.
Keep entity prototype field order astype,abstract,parent,id,categories,name,suffix,description,components. Do not insert blank lines between- type:entries inside acomponents:list. Separate prototype blocks with one blank line.
Prefersuffixfor spawn-menu distinctions instead of changing prototypename.
Files:
Resources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
⚙️ CodeRabbit configuration file
Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:
- Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
- Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
- Prefer base.yml for parent trees and sibling files for variants.
- Do not add blank lines inside components lists.
- Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.
Files:
Resources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.json
📄 CodeRabbit inference engine (AGENTS.md)
Keep RSI
meta.jsonordered asversion,license,copyright,size,stateswith 4-space indentation.
Files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
⚙️ CodeRabbit configuration file
Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.
Files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
**/*.cs
📄 CodeRabbit inference engine (GEMINI.md)
**/*.cs: Keep components data-only and behavior in systems
UseOn... -> Try... -> Can... -> Do...pattern for gameplay actions
PreferEntity<T?>,ProtoId<T>,EntProtoId, and localized strings for type usage
**/*.cs: When writing or editing C# gameplay code, load skills:ss14-ecs-components,ss14-ecs-entities,ss14-ecs-prototypes,ss14-ecs-systems,ss14-events, andss14-prediction.
If the C# change is large or the task needs reviewable notes, load skillss14-documentation-writing.
If the code touches hot paths,Update(), or frequently raised events, load skillss14-standard-optimizations.
If the task adds or changes player-facing text, load skillsss14-localization-stringsandss14-localization-codewhen the change also touchesLoc.GetString(...),LocId, popup text, or localized component fields.
If the task touches network events,NetEntity, replicated state routing, or shared/server/client message flow, load skillss14-netcode.
If the task touchesAppearance,GenericVisualizer, visual state enums, or sprite-layer toggles, load skillss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skillss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skillsss14-prototype-basics,ss14-ecs-basics, andss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skillsss14-debugging-workflowandss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skillsss14-common-api-patternsandss14-audiowhen the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**
📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)
Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic inContent.Shared/; useContent.Goobstation.Shared/only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong inContent.Shared/. Shared predicted components should useNetworkedComponent,AutoGenerateComponentState, andAutoNetworkedFieldwhere appropriate.
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
Content.Shared/**/*.cs
⚙️ CodeRabbit configuration file
Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:
- Shared owns replicated state, shared events, prediction, and data both client and server must understand.
- Flag client-only or server-only dependencies in Shared.
- For local-player actions, verify prediction support instead of accepting delayed server-only UX.
- When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
- Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
- Flag EntityUid.Invalid used as a "missing" sentinel.
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
**/*System.cs
📄 CodeRabbit inference engine (AGENTS.md)
Public entity-system APIs that operate on entities should usually take
Entity<T?>orEntityUidfirst and callResolve(...)early.
Files:
Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
Put main server-only authority and non-predicted server simulation in
Content.Server/; useContent.Goobstation.Server/for features already rooted in that module.
Files:
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs
⚙️ CodeRabbit configuration file
Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:
- Server owns authority, persistence, round logic, and non-predicted side effects.
- If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
- Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
- When player-visible behavior changes, check whether matching prototype and locale updates are missing.
Files:
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (15)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....
Applied to files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).
Applied to files:
Resources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.
Applied to files:
Resources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-28T15:44:38.498Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 152
File: Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml:69-72
Timestamp: 2026-07-28T15:44:38.498Z
Learning: В ArcaneSS14/arcane не выполняйте форматирующие перестановки полей (в т.ч. изменение порядка полей) в upstream-файлах: делайте это только если правка добавляет Arcane-специфичную сущность или напрямую требуется для функциональности. Иначе сохраняйте upstream-порядок полей, даже если он противоречит локальным рекомендациям, чтобы не создавать лишние diff и конфликты при upstream-синхронизации. Исключение: допустимо переупорядочивание/форматирование в `Resources/Prototypes/_Arcane` (и только там).
Applied to files:
Resources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.
Applied to files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-26T02:48:44.443Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 136
File: Resources/Textures/Clothing/Back/Duffels/captain.rsi/meta.json:4-4
Timestamp: 2026-07-26T02:48:44.443Z
Learning: In `Resources/Textures/**/**/*.rsi/meta.json`, if the PR replaces sprite assets with sources that do not include the previous credit holders (e.g., the new sprites come from another upstream/source), do not keep attribution/author fields for contributors who made no contribution to the current assets. Update the attribution to reflect the actual authors/sources of the sprites currently referenced by the .rsi.
Applied to files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:
- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.
Applied to files:
Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🔇 Additional comments (12)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)
37-38: Prediction для старта разрезания по-прежнему отсутствует.
_netManager.IsClientпроверяется доargs.Handled,TryStartDoAfterи стартового popup. Клиент не запускает и не показывает действие немедленно. Перенесите предсказуемые части в shared-путь, оставив снятие предмета и radio-уведомление серверу.Согласно инструкциям для
Content.Shared, локальные действия должны поддерживать prediction.Source: Path instructions
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs (1)
3-4: LGTM!Also applies to: 17-38
Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl (1)
1-5: LGTM!Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl (1)
1-5: LGTM!Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs (1)
1-108: LGTM!Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (1)
1-137: LGTM!Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)
104-169: LGTM!Also applies to: 278-315, 343-352
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml (1)
1-35: LGTM!Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json (1)
4-4: LGTM!Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl (1)
1-2: LGTM!Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl (1)
1-55: LGTM!Resources/Prototypes/Catalog/Cargo/cargo_vending.yml (1)
36-36: 🎯 Functional CorrectnessНе очевидна связь изменения cost с фичей Stabikor.
CrateVendingMachineRestockClothesцена поднята 5300→6000 с маркером# Arcane-Edit, но PR — про Security-браслет; ассортимент "Clothes"-вендинга к нему не относится (Warden locker описан в отдельном, не входящем в этот батч файле). Стоит подтвердить, что новая цена всё ещё превышает сумму стоимости содержимого (см. комментарий в шапке файла про тест NoCargoOrderArbitrage) и что изменение действительно относится к этому PR, а не случайно затянуто из другой ветки.
| } | ||
| } | ||
|
|
||
| public void OpenDialog(EntityUid uid, AggressionInhibitorComponent comp, EntityUid user) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
OpenDialog/ToggleLock: используйте Entity<AggressionInhibitorComponent> вместо раздельных uid+comp.
Оба публичных метода вызываются из OnOpenDialogReceived/OnToggleLockReceived, где пара uid+comp уже приходит вместе — по гайдлайну стоит свернуть в Entity<AggressionInhibitorComponent>.
As per coding guidelines: "Prefer Entity<T?> over parallel (EntityUid uid, T component) parameters when the call site already has the pair."
Also applies to: 231-231
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
at line 171, Update the public OpenDialog and ToggleLock methods to accept a
single Entity<AggressionInhibitorComponent> parameter instead of separate
EntityUid and AggressionInhibitorComponent parameters. Adjust
OnOpenDialogReceived and OnToggleLockReceived call sites and method internals to
access the entity and component through the new wrapper while preserving
existing behavior.
Source: Coding guidelines
| if (!RemoveInhibitor(uid, comp)) | ||
| return; | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Молчаливый отказ при неудачном RemoveInhibitor.
Если доступ есть, но сам RemoveInhibitor не сработал (например, TryUnequip не удался), пользователь не получает никакого фидбека — ни попапа, ни звука. Тот же паттерн в OnInteractUsing (line 135), где Handled всё равно ставится в true при провале снятия. Стоит проиграть DenySound/попап и в этой ветке отказа, а не только в ветке недостатка прав.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 252 - 254, Обновите ветку отказа после вызова RemoveInhibitor в
системе AggressionInhibitorSystem: при неудачном снятии воспроизводите DenySound
и показывайте пользователю попап, аналогично обработке отказа в OnInteractUsing.
Сохраните немедленный возврат после предоставления обратной связи.
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (2)
208-212: 🗄️ Data Integrity & Integration | 🟡 Minor | ⚡ Quick winСинхронизируйте сброс длительности.
Пустой ввод меняет
comp.Duration, но выходит безDirty(uid, comp). Клиенты сохранят прежнее сетевое значение до следующего unrelated обновления.Предлагаемое исправление
if (string.IsNullOrEmpty(input)) { comp.Duration = 60f; + Dirty(uid, comp); _popup.PopupEntity(Loc.GetString("stabikor-duration-set-cancel-fallback", ("time", 1)), uid, user); return; }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs` around lines 208 - 212, В ветке пустого ввода метода, обрабатывающего изменение длительности AggressionInhibitor, после присваивания значения comp.Duration вызовите Dirty(uid, comp) до PopupEntity и return, чтобы сброс длительности был синхронизирован с клиентами.Source: Coding guidelines
203-227: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winПовторно проверяйте доступ в callback диалога.
После открытия диалога игрок может уйти, передать ID-карту или потерять доступ, но callback проверяет только блокировку и существование сущности. Перед изменением
Durationзаново проверьте расстояние, активную карту иLockAccess.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs` around lines 203 - 227, В callback, перед изменением Duration в обработчике _quickDialog.OpenDialog, повторно проверьте доступ пользователя: допустимое расстояние до uid, наличие активной ID-карты и LockAccess. При потере любого условия немедленно завершайте callback, сохраняя текущие проверки comp.IsLocked и EntityManager.EntityExists.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 294-300: После успешной активации ингибитора в обработчике, где
обновляются comp.Timer, comp.IsLocked и comp.WearingEntity, принудительно
отключите уже активный combat mode у wearerUid. Выполните сброс сразу после
подтверждения предмета через TryGetSlotEntity и сохраните существующую логику
Dirty(uid, comp).
- Line 35: Перенесите предиктивную проверку активного ингибитора из серверного
обработчика в shared-систему, чтобы клиент блокировал включение combat mode до
отправки события. Сохраните серверный обработчик как авторитетную проверку с
электрошоком, а подписку и логику `OnToggleCombatAction` разделите так, чтобы
предиктивная блокировка работала на обеих сторонах.
- Around line 135-136: Remove the redundant UnlockSound playback from the
inhibitor activation flow: update the condition around RemoveInhibitor in
ActivateInhibitor, including the corresponding occurrence noted at the second
location, so it no longer calls _audio.PlayPvs after RemoveInhibitor. Preserve
RemoveInhibitor’s existing sound handling and the LockSound playback in
ActivateInhibitor.
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 37-38: Remove the _netManager.IsClient condition from the early
return in the relevant cuttable-item handler, leaving only args.Handled as the
guard. Keep do-after initiation and popup feedback on the shared predicted path
using the predicted feedback API, while restricting item removal and radio
notifications to the server-only branch.
In
`@Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl`:
- Line 2: Исправьте орфографическую ошибку в свойстве .desc: замените
«виднеится» на «виднеется», сохранив остальной текст описания без изменений.
---
Outside diff comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 208-212: В ветке пустого ввода метода, обрабатывающего изменение
длительности AggressionInhibitor, после присваивания значения comp.Duration
вызовите Dirty(uid, comp) до PopupEntity и return, чтобы сброс длительности был
синхронизирован с клиентами.
- Around line 203-227: В callback, перед изменением Duration в обработчике
_quickDialog.OpenDialog, повторно проверьте доступ пользователя: допустимое
расстояние до uid, наличие активной ID-карты и LockAccess. При потере любого
условия немедленно завершайте callback, сохраняя текущие проверки comp.IsLocked
и EntityManager.EntityExists.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: bf354a60-a4c4-4404-9028-10e5cda21759
📒 Files selected for processing (16)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
- GitHub Check: YAML Linter
- GitHub Check: YAML map schema validator
- GitHub Check: build (ubuntu-latest)
- GitHub Check: Test Packaging
- GitHub Check: build (ubuntu-latest)
🧰 Additional context used
📓 Path-based instructions (18)
Resources/**/*.{yml,ftl,json}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.jsonResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.ftl
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 localization string standards and formatting rules
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.{yml,ftl}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 prototype locale integration rules and practices
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/Locale/**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Locale/**/*.ftl: Add or update FTL entries underResources/Locale/, starting withen-US; add/update matchingru-RUentries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specifickebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
⚙️ CodeRabbit configuration file
Resources/Locale/**/*.ftl: Treat localization as mandatory:
- Every player-facing string should be localized.
- Prefer specific kebab-case keys.
- Flag raw strings in code or gameplay/resource changes that are missing locale updates.
- Check consistency when prototype names, descriptions, markings, or UI text changed.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.yml
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns
Resources/**/*.yml: Loadss14-naming-conventionsdocumentation for Resources work
Loadss14-ecs-prototypesdocumentation for Resources work
Loadss14-upstream-maintenancedocumentation for Resources work
Loadss14-prototypes-localedocumentation for Resources work
Loadss14-localization-stringsdocumentation for Resources work
Loadss14-sprite-overlays-shadersdocumentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after editsRun
dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOptto validate YAML and resource edits.
Files:
Resources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.{cs,xaml,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
If the task adds tests or you need to choose the right test layer, load skill
ss14-tests-authoring.
Files:
Resources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Resources/Prototypes/**/*.yml
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree inResources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes inbase.ymland variants in sibling files.
Keep entity prototype field order astype,abstract,parent,id,categories,name,suffix,description,components. Do not insert blank lines between- type:entries inside acomponents:list. Separate prototype blocks with one blank line.
Prefersuffixfor spawn-menu distinctions instead of changing prototypename.
Files:
Resources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
⚙️ CodeRabbit configuration file
Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:
- Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
- Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
- Prefer base.yml for parent trees and sibling files for variants.
- Do not add blank lines inside components lists.
- Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.
Files:
Resources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.json
📄 CodeRabbit inference engine (AGENTS.md)
Keep RSI
meta.jsonordered asversion,license,copyright,size,stateswith 4-space indentation.
Files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
⚙️ CodeRabbit configuration file
Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.
Files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
**/*.cs
📄 CodeRabbit inference engine (GEMINI.md)
**/*.cs: Keep components data-only and behavior in systems
UseOn... -> Try... -> Can... -> Do...pattern for gameplay actions
PreferEntity<T?>,ProtoId<T>,EntProtoId, and localized strings for type usage
**/*.cs: When writing or editing C# gameplay code, load skills:ss14-ecs-components,ss14-ecs-entities,ss14-ecs-prototypes,ss14-ecs-systems,ss14-events, andss14-prediction.
If the C# change is large or the task needs reviewable notes, load skillss14-documentation-writing.
If the code touches hot paths,Update(), or frequently raised events, load skillss14-standard-optimizations.
If the task adds or changes player-facing text, load skillsss14-localization-stringsandss14-localization-codewhen the change also touchesLoc.GetString(...),LocId, popup text, or localized component fields.
If the task touches network events,NetEntity, replicated state routing, or shared/server/client message flow, load skillss14-netcode.
If the task touchesAppearance,GenericVisualizer, visual state enums, or sprite-layer toggles, load skillss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skillss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skillsss14-prototype-basics,ss14-ecs-basics, andss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skillsss14-debugging-workflowandss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skillsss14-common-api-patternsandss14-audiowhen the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**
📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)
Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic inContent.Shared/; useContent.Goobstation.Shared/only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong inContent.Shared/. Shared predicted components should useNetworkedComponent,AutoGenerateComponentState, andAutoNetworkedFieldwhere appropriate.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*System.cs
📄 CodeRabbit inference engine (AGENTS.md)
Public entity-system APIs that operate on entities should usually take
Entity<T?>orEntityUidfirst and callResolve(...)early.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**/*.cs
⚙️ CodeRabbit configuration file
Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:
- Shared owns replicated state, shared events, prediction, and data both client and server must understand.
- Flag client-only or server-only dependencies in Shared.
- For local-player actions, verify prediction support instead of accepting delayed server-only UX.
- When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
- Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
- Flag EntityUid.Invalid used as a "missing" sentinel.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
Put main server-only authority and non-predicted server simulation in
Content.Server/; useContent.Goobstation.Server/for features already rooted in that module.
Files:
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs
⚙️ CodeRabbit configuration file
Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:
- Server owns authority, persistence, round logic, and non-predicted side effects.
- If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
- Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
- When player-visible behavior changes, check whether matching prototype and locale updates are missing.
Files:
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (16)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....
Applied to files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).
Applied to files:
Resources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-29T08:12:37.068Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 153
File: Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml:137-137
Timestamp: 2026-07-29T08:12:37.068Z
Learning: In ArcaneSS14 prototype YAMLs, the YAML field that disables synchronization for `Content.Shared.Power.Components.BatteryComponent` is spelled exactly `netsync` (all lowercase), not `netSync`. For prototypes derived from `PowerNetworkBattery` (including `BaseAPC`, `CoreSubstation`, `BaseSMES`, `TeslaCoil`), set `netsync: false`; otherwise `Content.Server.Power.EntitySystems.BatterySystem.OnStartup` can throw `DebugAssertException` for a predicted battery connected to a power net. For `Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml`, ensure `EnergyDomeWiredTest` uses `netsync: false`.
Applied to files:
Resources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.
Applied to files:
Resources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-28T15:44:38.498Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 152
File: Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml:69-72
Timestamp: 2026-07-28T15:44:38.498Z
Learning: В ArcaneSS14/arcane не выполняйте форматирующие перестановки полей (в т.ч. изменение порядка полей) в upstream-файлах: делайте это только если правка добавляет Arcane-специфичную сущность или напрямую требуется для функциональности. Иначе сохраняйте upstream-порядок полей, даже если он противоречит локальным рекомендациям, чтобы не создавать лишние diff и конфликты при upstream-синхронизации. Исключение: допустимо переупорядочивание/форматирование в `Resources/Prototypes/_Arcane` (и только там).
Applied to files:
Resources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.
Applied to files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-26T02:48:44.443Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 136
File: Resources/Textures/Clothing/Back/Duffels/captain.rsi/meta.json:4-4
Timestamp: 2026-07-26T02:48:44.443Z
Learning: In `Resources/Textures/**/**/*.rsi/meta.json`, if the PR replaces sprite assets with sources that do not include the previous credit holders (e.g., the new sprites come from another upstream/source), do not keep attribution/author fields for contributors who made no contribution to the current assets. Update the attribution to reflect the actual authors/sources of the sprites currently referenced by the .rsi.
Applied to files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:
- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
🔇 Additional comments (4)
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs (1)
3-38: LGTM!Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)
40-48: LGTM!Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl (1)
1-5: LGTM!Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl (1)
1-5: LGTM!
| { | ||
| base.Initialize(); | ||
|
|
||
| SubscribeLocalEvent<ToggleCombatActionEvent>(OnToggleCombatAction, before: [typeof(SharedCombatModeSystem)]); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift
Добавьте предиктивную блокировку combat mode.
Обработчик существует только в Content.Server, поэтому клиент успевает локально включить combat mode и получает откат лишь после ответа сервера. Перенесите предиктивную проверку активного ингибитора в shared-систему; серверу оставьте авторитетный электрошок.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
at line 35, Перенесите предиктивную проверку активного ингибитора из серверного
обработчика в shared-систему, чтобы клиент блокировал включение combat mode до
отправки события. Сохраните серверный обработчик как авторитетную проверку с
электрошоком, а подписку и логику `OnToggleCombatAction` разделите так, чтобы
предиктивная блокировка работала на обеих сторонах.
Sources: Coding guidelines, Path instructions
| if (_inventorySystem.TryGetSlotEntity(wearerUid, slotDef.Name, out var slotItem) && slotItem == uid) | ||
| { | ||
| comp.Timer = comp.Duration; | ||
| comp.IsLocked = true; | ||
| comp.IsActive = true; | ||
| comp.WearingEntity = wearerUid; | ||
| Dirty(uid, comp); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Сбрасывайте уже включенный combat mode при активации.
Ингибитор перехватывает только будущие попытки включения. Заключённый, у которого combat mode уже включён в момент блокировки, может продолжать атаковать. После успешной активации принудительно выключайте режим у wearerUid.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 294 - 300, После успешной активации ингибитора в обработчике, где
обновляются comp.Timer, comp.IsLocked и comp.WearingEntity, принудительно
отключите уже активный combat mode у wearerUid. Выполните сброс сразу после
подтверждения предмета через TryGetSlotEntity и сохраните существующую логику
Dirty(uid, comp).
There was a problem hiding this comment.
Actionable comments posted: 1
♻️ Duplicate comments (1)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)
299-305: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winСбрасывайте combat mode у носителя ингибитора.
В этом потоке
user— сотрудник с ID-картой, аwearerUid— владелец надетого устройства. Сейчас combat mode отключается у сотрудника, поэтому заключённый может остаться в боевом режиме.Предлагаемый фикс
- _combatMode.SetInCombatMode(user, false); + _combatMode.SetInCombatMode(wearerUid, false);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs` around lines 299 - 305, В обработчике успешной активации ингибитора замените аргумент user в вызове _combatMode.SetInCombatMode на wearerUid, чтобы combat mode отключался у владельца устройства, а не у сотрудника с ID-картой. Остальную последовательность обработки, включая Dirty, звук и уведомление, не изменяйте.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Line 227: В обработчике изменения длительности перенесите вызов Dirty(uid,
comp) из ветки корректного ввода в общий путь после присвоения fallback-значения
60f, чтобы он выполнялся и при пустом вводе. Проверьте связанное сетевое поле
Duration и сохраните синхронизацию компонента через существующий механизм Dirty.
---
Duplicate comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 299-305: В обработчике успешной активации ингибитора замените
аргумент user в вызове _combatMode.SetInCombatMode на wearerUid, чтобы combat
mode отключался у владельца устройства, а не у сотрудника с ID-картой. Остальную
последовательность обработки, включая Dirty, звук и уведомление, не изменяйте.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: f2c46284-465b-4eef-a430-6cb360cb6939
📒 Files selected for processing (7)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
💤 Files with no reviewable changes (1)
- Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
- GitHub Check: YAML Linter
- GitHub Check: Test Packaging
- GitHub Check: build (ubuntu-latest)
- GitHub Check: YAML map schema validator
- GitHub Check: build (ubuntu-latest)
🧰 Additional context used
📓 Path-based instructions (17)
Resources/**/*.{yml,ftl,json}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.ftl
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 localization string standards and formatting rules
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/**/*.{yml,ftl}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 prototype locale integration rules and practices
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/Locale/**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Locale/**/*.ftl: Add or update FTL entries underResources/Locale/, starting withen-US; add/update matchingru-RUentries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specifickebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
⚙️ CodeRabbit configuration file
Resources/Locale/**/*.ftl: Treat localization as mandatory:
- Every player-facing string should be localized.
- Prefer specific kebab-case keys.
- Flag raw strings in code or gameplay/resource changes that are missing locale updates.
- Check consistency when prototype names, descriptions, markings, or UI text changed.
Files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/**/*.yml
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns
Resources/**/*.yml: Loadss14-naming-conventionsdocumentation for Resources work
Loadss14-ecs-prototypesdocumentation for Resources work
Loadss14-upstream-maintenancedocumentation for Resources work
Loadss14-prototypes-localedocumentation for Resources work
Loadss14-localization-stringsdocumentation for Resources work
Loadss14-sprite-overlays-shadersdocumentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after editsRun
dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOptto validate YAML and resource edits.
Files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.{cs,xaml,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
If the task adds tests or you need to choose the right test layer, load skill
ss14-tests-authoring.
Files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Resources/Prototypes/**/*.yml
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree inResources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes inbase.ymland variants in sibling files.
Keep entity prototype field order astype,abstract,parent,id,categories,name,suffix,description,components. Do not insert blank lines between- type:entries inside acomponents:list. Separate prototype blocks with one blank line.
Prefersuffixfor spawn-menu distinctions instead of changing prototypename.
Files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
⚙️ CodeRabbit configuration file
Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:
- Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
- Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
- Prefer base.yml for parent trees and sibling files for variants.
- Do not add blank lines inside components lists.
- Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.
Files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
**/*.cs
📄 CodeRabbit inference engine (GEMINI.md)
**/*.cs: Keep components data-only and behavior in systems
UseOn... -> Try... -> Can... -> Do...pattern for gameplay actions
PreferEntity<T?>,ProtoId<T>,EntProtoId, and localized strings for type usage
**/*.cs: When writing or editing C# gameplay code, load skills:ss14-ecs-components,ss14-ecs-entities,ss14-ecs-prototypes,ss14-ecs-systems,ss14-events, andss14-prediction.
If the C# change is large or the task needs reviewable notes, load skillss14-documentation-writing.
If the code touches hot paths,Update(), or frequently raised events, load skillss14-standard-optimizations.
If the task adds or changes player-facing text, load skillsss14-localization-stringsandss14-localization-codewhen the change also touchesLoc.GetString(...),LocId, popup text, or localized component fields.
If the task touches network events,NetEntity, replicated state routing, or shared/server/client message flow, load skillss14-netcode.
If the task touchesAppearance,GenericVisualizer, visual state enums, or sprite-layer toggles, load skillss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skillss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skillsss14-prototype-basics,ss14-ecs-basics, andss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skillsss14-debugging-workflowandss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skillsss14-common-api-patternsandss14-audiowhen the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**
📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)
Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic inContent.Shared/; useContent.Goobstation.Shared/only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong inContent.Shared/. Shared predicted components should useNetworkedComponent,AutoGenerateComponentState, andAutoNetworkedFieldwhere appropriate.
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
Content.Shared/**/*.cs
⚙️ CodeRabbit configuration file
Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:
- Shared owns replicated state, shared events, prediction, and data both client and server must understand.
- Flag client-only or server-only dependencies in Shared.
- For local-player actions, verify prediction support instead of accepting delayed server-only UX.
- When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
- Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
- Flag EntityUid.Invalid used as a "missing" sentinel.
Files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
**/*System.cs
📄 CodeRabbit inference engine (AGENTS.md)
Public entity-system APIs that operate on entities should usually take
Entity<T?>orEntityUidfirst and callResolve(...)early.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
Put main server-only authority and non-predicted server simulation in
Content.Server/; useContent.Goobstation.Server/for features already rooted in that module.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs
⚙️ CodeRabbit configuration file
Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:
- Server owns authority, persistence, round logic, and non-predicted side effects.
- If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
- Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
- When player-visible behavior changes, check whether matching prototype and locale updates are missing.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (14)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....
Applied to files:
Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-29T08:12:37.068Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 153
File: Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml:137-137
Timestamp: 2026-07-29T08:12:37.068Z
Learning: In ArcaneSS14 prototype YAMLs, the YAML field that disables synchronization for `Content.Shared.Power.Components.BatteryComponent` is spelled exactly `netsync` (all lowercase), not `netSync`. For prototypes derived from `PowerNetworkBattery` (including `BaseAPC`, `CoreSubstation`, `BaseSMES`, `TeslaCoil`), set `netsync: false`; otherwise `Content.Server.Power.EntitySystems.BatterySystem.OnStartup` can throw `DebugAssertException` for a predicted battery connected to a power net. For `Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml`, ensure `EnergyDomeWiredTest` uses `netsync: false`.
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:
- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-28T15:44:38.498Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 152
File: Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml:69-72
Timestamp: 2026-07-28T15:44:38.498Z
Learning: В ArcaneSS14/arcane не выполняйте форматирующие перестановки полей (в т.ч. изменение порядка полей) в upstream-файлах: делайте это только если правка добавляет Arcane-специфичную сущность или напрямую требуется для функциональности. Иначе сохраняйте upstream-порядок полей, даже если он противоречит локальным рекомендациям, чтобы не создавать лишние diff и конфликты при upstream-синхронизации. Исключение: допустимо переупорядочивание/форматирование в `Resources/Prototypes/_Arcane` (и только там).
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🔇 Additional comments (5)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (3)
98-101: Предиктивная блокировка combat mode всё ещё отсутствует.Этот обработчик находится только в
Content.Server: клиент может локально включить combat mode и получить откат после ответа сервера.SetInCombatModeиargs.Handledнужно продублировать в shared-системе, оставив электрошок серверным.Это уже отмечалось в предыдущем ревью.
Source: Path instructions
139-139: LGTM!Also applies to: 157-157
323-331: LGTM!Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml (1)
12-12: LGTM!Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl (1)
2-2: LGTM!
| public sealed partial class AggressionInhibitorSystem : EntitySystem | ||
| { | ||
| [Dependency] private readonly InventorySystem _inventorySystem = default!; | ||
| [Dependency] private readonly SharedTransformSystem _transformSystem = default!; | ||
| [Dependency] private readonly SharedPopupSystem _popup = default!; | ||
| [Dependency] private readonly ElectrocutionSystem _electrocution = default!; | ||
| [Dependency] private readonly IdCardSystem _idCard = default!; | ||
| [Dependency] private readonly SharedAudioSystem _audio = default!; | ||
| [Dependency] private readonly SharedHandsSystem _handsSystem = default!; | ||
| [Dependency] private readonly QuickDialogSystem _quickDialog = default!; | ||
| [Dependency] private readonly SharedCombatModeSystem _combatMode = default!; | ||
| [Dependency] private SharedContainerSystem _containerSystem = default!; | ||
| [Dependency] private IPlayerManager _playerManager = default!; |
This comment was marked as resolved.
This comment was marked as resolved.
Sorry, something went wrong.
| public sealed class CuttableItemSystem : EntitySystem | ||
| { | ||
| [Dependency] private readonly RadioSystem _radio = default!; | ||
| [Dependency] private readonly IPrototypeManager _prototypeManager = default!; | ||
| [Dependency] private readonly SharedPopupSystem _popup = default!; | ||
| [Dependency] private readonly InventorySystem _inventorySystem = default!; | ||
| [Dependency] private readonly SharedTransformSystem _transformSystem = default!; |
There was a problem hiding this comment.
public sealed partial class
И ридонли вырезать. Ы
| public sealed class SharedAggressionInhibitorSystem : EntitySystem | ||
| { | ||
| [Dependency] private readonly SharedPopupSystem _popup = default!; | ||
| [Dependency] private readonly SharedIdCardSystem _idCard = default!; | ||
| [Dependency] private readonly SharedHandsSystem _handsSystem = default!; | ||
| [Dependency] private SharedContainerSystem _containerSystem = default!; | ||
| [Dependency] private IGameTiming _gameTiming = default!; | ||
| [Dependency] private readonly INetManager _netManager = default!; |
| public sealed class SharedCuttableItemSystem : EntitySystem | ||
| { | ||
| [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; | ||
| [Dependency] private readonly SharedToolSystem _toolSystem = default!; | ||
| [Dependency] private readonly SharedPopupSystem _popup = default!; | ||
| [Dependency] private readonly INetManager _netManager = default!; | ||
| [Dependency] private IPrototypeManager _prototypeManager = default!; |
There was a problem hiding this comment.
Также как и выше... ы...
There was a problem hiding this comment.
Это ничего не заденет?
There was a problem hiding this comment.
Заденет OnCutCompleted серверной CuttableItemSystem
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)
32-59: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winНе отключайте shared prediction для разрезания.
_netManager.IsClientзавершает обработчик доargs.Handled,TryStartDoAfterи feedback, поэтому локальный игрок видит начало действия только после ответа сервера. Уберите клиентский early return, запускайте do-after и predicted popup в shared-пути, а снятие предмета и радио-уведомление оставьте серверному подтверждению. ЗависимостьINetManagerпосле этого также не понадобится.Это уже отмечалось в предыдущем ревью; текущий код всё ещё содержит ту же проблему.
Исправление
-[Dependency] private INetManager _netManager = default!; - - if (args.Handled || _netManager.IsClient) + if (args.Handled) return; ... - _popup.PopupEntity(message, uid); + _popup.PopupPredicted(message, uid);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs` around lines 32 - 59, Remove the _netManager.IsClient early return from the cuttable interaction handler so args.Handled, TryStartDoAfter, and the attempt popup execute through the shared predicted path. Keep item removal and radio notification server-authoritative, and remove the now-unused INetManager dependency and related field or constructor wiring.Sources: Coding guidelines, Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 209-210: В обработчике изменения состояния сначала присвойте
`comp.Duration = 60f`, а затем вызовите `Dirty(uid, comp)`. Сохраните
существующее значение fallback и убедитесь, что `Dirty` синхронизирует компонент
уже с обновлённой длительностью.
In `@Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl`:
- Around line 14-22: Обновите локализованное форматирование в выражениях выбора
$hours и $minutes: добавьте ветку [0] для минут без вывода текста, а «и» и
пробел формируйте только когда присутствуют оба ненулевых компонента. Сохраните
корректные русские формы для ненулевых часов и минут, чтобы длительности вроде
60 и 5 минут не содержали «0 минут» или лишний пробел.
---
Duplicate comments:
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 32-59: Remove the _netManager.IsClient early return from the
cuttable interaction handler so args.Handled, TryStartDoAfter, and the attempt
popup execute through the shared predicted path. Keep item removal and radio
notification server-authoritative, and remove the now-unused INetManager
dependency and related field or constructor wiring.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 04060188-2a1a-4c5d-8e33-e330421bf085
📒 Files selected for processing (5)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
- GitHub Check: YAML Linter
- GitHub Check: build (ubuntu-latest)
- GitHub Check: Test Packaging
- GitHub Check: YAML map schema validator
- GitHub Check: build (ubuntu-latest)
🧰 Additional context used
📓 Path-based instructions (15)
**/*.cs
📄 CodeRabbit inference engine (GEMINI.md)
**/*.cs: Keep components data-only and behavior in systems
UseOn... -> Try... -> Can... -> Do...pattern for gameplay actions
PreferEntity<T?>,ProtoId<T>,EntProtoId, and localized strings for type usage
**/*.cs: When writing or editing C# gameplay code, load skills:ss14-ecs-components,ss14-ecs-entities,ss14-ecs-prototypes,ss14-ecs-systems,ss14-events, andss14-prediction.
If the C# change is large or the task needs reviewable notes, load skillss14-documentation-writing.
If the code touches hot paths,Update(), or frequently raised events, load skillss14-standard-optimizations.
If the task adds or changes player-facing text, load skillsss14-localization-stringsandss14-localization-codewhen the change also touchesLoc.GetString(...),LocId, popup text, or localized component fields.
If the task touches network events,NetEntity, replicated state routing, or shared/server/client message flow, load skillss14-netcode.
If the task touchesAppearance,GenericVisualizer, visual state enums, or sprite-layer toggles, load skillss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skillss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skillsss14-prototype-basics,ss14-ecs-basics, andss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skillsss14-debugging-workflowandss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skillsss14-common-api-patternsandss14-audiowhen the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**
📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)
Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*.{cs,xaml,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
If the task adds tests or you need to choose the right test layer, load skill
ss14-tests-authoring.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic inContent.Shared/; useContent.Goobstation.Shared/only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong inContent.Shared/. Shared predicted components should useNetworkedComponent,AutoGenerateComponentState, andAutoNetworkedFieldwhere appropriate.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*System.cs
📄 CodeRabbit inference engine (AGENTS.md)
Public entity-system APIs that operate on entities should usually take
Entity<T?>orEntityUidfirst and callResolve(...)early.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**/*.cs
⚙️ CodeRabbit configuration file
Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:
- Shared owns replicated state, shared events, prediction, and data both client and server must understand.
- Flag client-only or server-only dependencies in Shared.
- For local-player actions, verify prediction support instead of accepting delayed server-only UX.
- When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
- Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
- Flag EntityUid.Invalid used as a "missing" sentinel.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Resources/**/*.{yml,ftl,json}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files
Files:
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.ftl
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 localization string standards and formatting rules
Files:
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/**/*.{yml,ftl}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 prototype locale integration rules and practices
Files:
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
Resources/Locale/**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Locale/**/*.ftl: Add or update FTL entries underResources/Locale/, starting withen-US; add/update matchingru-RUentries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specifickebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
⚙️ CodeRabbit configuration file
Resources/Locale/**/*.ftl: Treat localization as mandatory:
- Every player-facing string should be localized.
- Prefer specific kebab-case keys.
- Flag raw strings in code or gameplay/resource changes that are missing locale updates.
- Check consistency when prototype names, descriptions, markings, or UI text changed.
Files:
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
{Content.Server,Content.Goobstation.Server}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
Put main server-only authority and non-predicted server simulation in
Content.Server/; useContent.Goobstation.Server/for features already rooted in that module.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs
⚙️ CodeRabbit configuration file
Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:
- Server owns authority, persistence, round logic, and non-predicted side effects.
- If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
- Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
- When player-visible behavior changes, check whether matching prototype and locale updates are missing.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (8)
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....
Applied to files:
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl
🔇 Additional comments (4)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)
62-79: LGTM!Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (1)
13-25: LGTM!Also applies to: 27-62, 64-75
Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (1)
18-23: LGTM!Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)
19-27: LGTM!
There was a problem hiding this comment.
Actionable comments posted: 6
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl (1)
1-89: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winОтсутствует en-US-версия локали для компонента ингибитора.
Ключи внутри файла (
stabikor-examine-*,stabikor-verb-*,stabikor-dialog-*и другие) используются корректно и совпадают с вызовамиLoc.GetStringвSharedAggressionInhibitorSystem.cs/AggressionInhibitorSystem.cs. Но парный en-US файл в PR отсутствует. Английские клиенты увидят сырые ключи локали вместо текста осмотра, верб и диалога.Как per coding guidelines: "Add or update FTL entries under
Resources/Locale/, starting withen-US."🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl` around lines 1 - 89, Add the missing en-US localization file for the aggression inhibitor component, mirroring every key defined in the Russian file, including stabikor-examine-*, stabikor-verb-*, stabikor-dialog-*, status, activation, permission, timer, and unequip messages. Provide English translations while preserving each key name and Fluent variable/select syntax so English clients receive resolved text instead of raw localization keys.Source: Coding guidelines
♻️ Duplicate comments (1)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)
278-315: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick win
SetInCombatModeсбрасывает боевой режим не у заключённого, а у держателя карты.В
ActivateInhibitorпараметрuser— это тот, кто прикладывает ID-карту (например, глава службы безопасности), аwearerUid— тот, кто носит устройство (заключённый). На линии 300 вызывается_combatMode.SetInCombatMode(user, false). Это отключает боевой режим у охранника, а не у заключённого.Если заключённый уже включил боевой режим до блокировки устройства, он продолжит атаковать после активации ингибитора. Основная функция устройства — предотвратить агрессию — не работает в этом сценарии.
Сравните с popup на строке 306, где корректно используется
Name(wearerUid), а неName(user)— это подтверждает, что параметрuserподставлен по ошибке.🐛 Предлагаемый фикс
comp.WearingEntity = wearerUid; - _combatMode.SetInCombatMode(user, false); + _combatMode.SetInCombatMode(wearerUid, false);🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs` around lines 278 - 315, В методе ActivateInhibitor замените передачу user в _combatMode.SetInCombatMode на wearerUid, чтобы при активации ингибитора боевой режим отключался у носителя устройства, а не у пользователя, приложившего карту.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 61-105: Замените полный EntityQueryEnumerator в
OnToggleCombatAction прямой проверкой слотов пользователя через
_inventorySystem.TryGetSlotEntity для слотов neck и gloves, затем получите
компонент через TryComp<AggressionInhibitorComponent>. Сохраните существующую
проверку активности и обработку ингибитора, исключив сканирование устройств у
других сущностей; перед изменением загрузите навык ss14-standard-optimizations.
- Around line 65-70: Добавьте using-директивы для
Content.Shared.Mobs.Components.MobStateComponent и Content.Shared.Mobs.MobState,
затем обновите проверку в системе AggressionInhibitorSystem, используя короткие
имена MobStateComponent и MobState; сохраните текущую проверку состояний
Critical и Dead без добавления отдельных проверок SoftCritical или HardCritical.
- Around line 132-168: В обработчике OnInteractUsing привяжите args.Handled к
результату успешной операции, а не к наличию звука: после RemoveInhibitor и
ActivateInhibitor устанавливайте его при успешном выполнении независимо от
UnlockSound или LockSound. Для неуспешной операции при валидном доступе добавьте
соответствующий пользовательский фидбек по существующему паттерну системы,
сохранив текущую обработку отказа в доступе.
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 50-55: Update the DoAfterArgs construction in the shared
cuttable-item system to convert CuttableItemComponent.Delay from float seconds
into a TimeSpan using TimeSpan.FromSeconds before passing it as the delay
argument; leave the remaining DoAfterArgs configuration unchanged.
In
`@Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl`:
- Around line 1-2: Добавьте en-US FTL-запись для ent-ClothingAggressionInhibitor
с именем и описанием сущности, сохранив ru-RU запись как парную локализацию.
Разместите английскую локаль в соответствующем слое Resources/Locale и
используйте существующий формат ключей ent-ClothingAggressionInhibitor и .desc.
In `@Resources/Prototypes/Catalog/Cargo/cargo_vending.yml`:
- Line 36: Верните значение cost для cargo-крейта одежды с 6000 на 5300,
сохранив остальное содержимое и настройки без изменений.
---
Outside diff comments:
In `@Resources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftl`:
- Around line 1-89: Add the missing en-US localization file for the aggression
inhibitor component, mirroring every key defined in the Russian file, including
stabikor-examine-*, stabikor-verb-*, stabikor-dialog-*, status, activation,
permission, timer, and unequip messages. Provide English translations while
preserving each key name and Fluent variable/select syntax so English clients
receive resolved text instead of raw localization keys.
---
Duplicate comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 278-315: В методе ActivateInhibitor замените передачу user в
_combatMode.SetInCombatMode на wearerUid, чтобы при активации ингибитора боевой
режим отключался у носителя устройства, а не у пользователя, приложившего карту.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 739c5399-d69e-49b1-8251-b29a2b3d9182
⛔ Files ignored due to path filters (3)
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-HAND.pngis excluded by!**/*.pngResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/equipped-NECK.pngis excluded by!**/*.pngResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/icon.pngis excluded by!**/*.png
📒 Files selected for processing (18)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
- GitHub Check: YAML map schema validator
- GitHub Check: build (ubuntu-latest)
- GitHub Check: Test Packaging
- GitHub Check: build (ubuntu-latest)
- GitHub Check: YAML Linter
🧰 Additional context used
📓 Path-based instructions (18)
Resources/**/*.{yml,ftl,json}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.jsonResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
Resources/**/*.yml
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.yml: Follow SS14 ECS prototype patterns and conventions
Follow SS14 graphics generic visualizer appearance conventions and patterns
Resources/**/*.yml: Loadss14-naming-conventionsdocumentation for Resources work
Loadss14-ecs-prototypesdocumentation for Resources work
Loadss14-upstream-maintenancedocumentation for Resources work
Loadss14-prototypes-localedocumentation for Resources work
Loadss14-localization-stringsdocumentation for Resources work
Loadss14-sprite-overlays-shadersdocumentation when working with RSI metadata, textures, sprite layers, overlays, or shader resources
Validate YAML after editsRun
dotnet run --project Content.YAMLLinter/Content.YAMLLinter.csproj -c DebugOptto validate YAML and resource edits.
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.{yml,ftl}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 prototype locale integration rules and practices
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
**/*.{cs,xaml,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
If the task adds tests or you need to choose the right test layer, load skill
ss14-tests-authoring.
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlContent.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Resources/Prototypes/**/*.yml
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Prototypes/**/*.yml: Put prototypes under the most specific existing subtree inResources/Prototypes/. If you introduce a new prototype parent tree, put parent prototypes inbase.ymland variants in sibling files.
Keep entity prototype field order astype,abstract,parent,id,categories,name,suffix,description,components. Do not insert blank lines between- type:entries inside acomponents:list. Separate prototype blocks with one blank line.
Prefersuffixfor spawn-menu distinctions instead of changing prototypename.
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
⚙️ CodeRabbit configuration file
Resources/Prototypes/**/*.yml: Review SS14 prototypes carefully:
- Use the narrowest existing subtree and avoid duplicating nearby prototype files or parent trees.
- Keep entity field order as: type, abstract, parent, id, categories, name, suffix, description, components.
- Prefer base.yml for parent trees and sibling files for variants.
- Do not add blank lines inside components lists.
- Call out broken inheritance, risky prototype ID changes, missing paired locale updates, and Appearance / GenericVisualizer mismatches.
Files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
Resources/**/*.json
📄 CodeRabbit inference engine (AGENTS.md)
Keep RSI
meta.jsonordered asversion,license,copyright,size,stateswith 4-space indentation.
Files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
⚙️ CodeRabbit configuration file
Resources/**/*.json: Review resource JSON files for path correctness and consistency.
For RSI meta.json files, check ordering, state/layout consistency, and whether referenced prototypes or visualizers still match the available states.
Files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
Resources/**/*.ftl
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 localization string standards and formatting rules
Files:
Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
Resources/Locale/**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Locale/**/*.ftl: Add or update FTL entries underResources/Locale/, starting withen-US; add/update matchingru-RUentries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specifickebab-caselocalization IDs.
Files:
Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
⚙️ CodeRabbit configuration file
Resources/Locale/**/*.ftl: Treat localization as mandatory:
- Every player-facing string should be localized.
- Prefer specific kebab-case keys.
- Flag raw strings in code or gameplay/resource changes that are missing locale updates.
- Check consistency when prototype names, descriptions, markings, or UI text changed.
Files:
Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
**/*.cs
📄 CodeRabbit inference engine (GEMINI.md)
**/*.cs: Keep components data-only and behavior in systems
UseOn... -> Try... -> Can... -> Do...pattern for gameplay actions
PreferEntity<T?>,ProtoId<T>,EntProtoId, and localized strings for type usage
**/*.cs: When writing or editing C# gameplay code, load skills:ss14-ecs-components,ss14-ecs-entities,ss14-ecs-prototypes,ss14-ecs-systems,ss14-events, andss14-prediction.
If the C# change is large or the task needs reviewable notes, load skillss14-documentation-writing.
If the code touches hot paths,Update(), or frequently raised events, load skillss14-standard-optimizations.
If the task adds or changes player-facing text, load skillsss14-localization-stringsandss14-localization-codewhen the change also touchesLoc.GetString(...),LocId, popup text, or localized component fields.
If the task touches network events,NetEntity, replicated state routing, or shared/server/client message flow, load skillss14-netcode.
If the task touchesAppearance,GenericVisualizer, visual state enums, or sprite-layer toggles, load skillss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skillss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skillsss14-prototype-basics,ss14-ecs-basics, andss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skillsss14-debugging-workflowandss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skillsss14-common-api-patternsandss14-audiowhen the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**
📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)
Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic inContent.Shared/; useContent.Goobstation.Shared/only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong inContent.Shared/. Shared predicted components should useNetworkedComponent,AutoGenerateComponentState, andAutoNetworkedFieldwhere appropriate.
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Shared/**/*.cs
⚙️ CodeRabbit configuration file
Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:
- Shared owns replicated state, shared events, prediction, and data both client and server must understand.
- Flag client-only or server-only dependencies in Shared.
- For local-player actions, verify prediction support instead of accepting delayed server-only UX.
- When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
- Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
- Flag EntityUid.Invalid used as a "missing" sentinel.
Files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
Put main server-only authority and non-predicted server simulation in
Content.Server/; useContent.Goobstation.Server/for features already rooted in that module.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
**/*System.cs
📄 CodeRabbit inference engine (AGENTS.md)
Public entity-system APIs that operate on entities should usually take
Entity<T?>orEntityUidfirst and callResolve(...)early.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs
⚙️ CodeRabbit configuration file
Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:
- Server owns authority, persistence, round logic, and non-predicted side effects.
- If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
- Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
- When player-visible behavior changes, check whether matching prototype and locale updates are missing.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (16)
📚 Learning: 2026-06-29T05:34:31.137Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-station PR: 99
File: Resources/Prototypes/Entities/Clothing/Belt/belts.yml:973-974
Timestamp: 2026-06-29T05:34:31.137Z
Learning: В SS14 YAML-прототипах для компонента `Storage` поле `grid` задаёт **включительные** координаты прямоугольника. При подсчёте вместимости учитывайте оффсет-инклюзивность: прямоугольник `x1,y1,x2,y2` означает размеры `width = (x2 - x1 + 1)` и `height = (y2 - y1 + 1)`, а число ячеек `width * height`. Например, `0,0,0,0` = 1 ячейка, а `0,0,6,2` = (6-0+1)*(2-0+1)=7*3=21. При ревью файлов наподобие `Resources/Prototypes/Entities/Clothing/Belt/belts.yml` не интерпретируйте `x2/y2` как эксклюзивные (чтобы не ошибиться на 1 в ширине/высоте).
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-29T08:12:37.068Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 153
File: Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml:137-137
Timestamp: 2026-07-29T08:12:37.068Z
Learning: In ArcaneSS14 prototype YAMLs, the YAML field that disables synchronization for `Content.Shared.Power.Components.BatteryComponent` is spelled exactly `netsync` (all lowercase), not `netSync`. For prototypes derived from `PowerNetworkBattery` (including `BaseAPC`, `CoreSubstation`, `BaseSMES`, `TeslaCoil`), set `netsync: false`; otherwise `Content.Server.Power.EntitySystems.BatterySystem.OnStartup` can throw `DebugAssertException` for a predicted battery connected to a power net. For `Resources/Prototypes/_Orion/Entities/Objects/Tools/energy_dome.yml`, ensure `EnergyDomeWiredTest` uses `netsync: false`.
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-05T18:40:45.199Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-05T18:40:45.199Z
Learning: For ArcaneSS14/arcane-station custom `_Arcane`/`_Orion` entity prototypes under `Resources/Prototypes/_Arcane/` or `Resources/Prototypes/_Orion/`, embed `name` and `description` directly in the prototype `.yml` as the `en-US` fallback text (do not add a separate `en-US` locale override). Then localize only `ru-RU` by adding `ent-<EntityId>` and `ent-<EntityId>.desc` keys in `Resources/Locale/ru-RU/ss14-ru/prototypes/_arcane/...` or `.../_orion/...`, mirroring the entity `.yml` path. By contrast, vanilla-derived entities (e.g., a base `Medkit`) should omit `name`/`description` from the `.yml` entirely and instead provide both `en-US` and `ru-RU` localized `prototypes/...` entries in `Resources/Locale/{en-US,ru-RU}/ss14-ru/prototypes/...`.
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-07T17:55:50.395Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Content.Client/Chemistry/UI/ChemMasterWindow.xaml.cs:192-194
Timestamp: 2026-07-07T17:55:50.395Z
Learning: When reviewing ArcaneSS14/arcane-old changes related to `MobState` thresholds/visuals/actions, treat the `Critical` enum value as requiring explicit mappings (it no longer implicitly behaves as an alias of `SoftCritical`). If any YAML prototype `thresholds:` (for `MobThresholdsComponent.Thresholds`) uses the bare `Critical` key (e.g., `MobThresholdsComponent.Thresholds: { Critical: ... }` for entities like `MobMouseCancer`), ensure the prototype (or referenced config) provides corresponding explicit `StateAlertDict` entries and any required `MobStateActions.actions` and `DamageStateVisuals.states` mappings for `Critical`. Otherwise, review should expect failures because the default `StateAlertDict` in `MobThresholdsComponent.cs` typically maps only `Alive`, `SoftCritical`, `HardCritical`, and `Dead`—not `Critical`.
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-07-28T15:44:38.498Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 152
File: Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml:69-72
Timestamp: 2026-07-28T15:44:38.498Z
Learning: В ArcaneSS14/arcane не выполняйте форматирующие перестановки полей (в т.ч. изменение порядка полей) в upstream-файлах: делайте это только если правка добавляет Arcane-специфичную сущность или напрямую требуется для функциональности. Иначе сохраняйте upstream-порядок полей, даже если он противоречит локальным рекомендациям, чтобы не создавать лишние diff и конфликты при upstream-синхронизации. Исключение: допустимо переупорядочивание/форматирование в `Resources/Prototypes/_Arcane` (и только там).
Applied to files:
Resources/Prototypes/_Orion/Research/Nodes/security.ymlResources/Prototypes/Catalog/Cargo/cargo_vending.ymlResources/Prototypes/Recipes/Lathes/security.ymlResources/Prototypes/Recipes/Lathes/Packs/security.ymlResources/Prototypes/Catalog/Fills/Lockers/security.ymlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
📚 Learning: 2026-06-19T22:21:36.179Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 69
File: Resources/Textures/_Arcane/Mobs/Silicon/Medical/k4tmed.rsi/meta.json:14-16
Timestamp: 2026-06-19T22:21:36.179Z
Learning: When reviewing RSI texture meta.json files under Resources/Textures/_Arcane (including borg chassis variants like k4t*.rsi), do not flag a difference in `directions` for rest-state entries. If the state name is a rest state (e.g., `*-rest`) for these borg chassis sprites, `directions: 1` is an intentional art choice and should not be treated as a mismatch against other variants that use `directions: 4`. Only raise an issue if the `directions` value is invalid for the file/spec (e.g., not the expected numeric options) or if it occurs on non-rest states.
Applied to files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-26T02:48:44.443Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 136
File: Resources/Textures/Clothing/Back/Duffels/captain.rsi/meta.json:4-4
Timestamp: 2026-07-26T02:48:44.443Z
Learning: In `Resources/Textures/**/**/*.rsi/meta.json`, if the PR replaces sprite assets with sources that do not include the previous credit holders (e.g., the new sprites come from another upstream/source), do not keep attribution/author fields for contributors who made no contribution to the current assets. Update the attribution to reflect the actual authors/sources of the sprites currently referenced by the .rsi.
Applied to files:
Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....
Applied to files:
Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftlResources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.ymlResources/Locale/ru-RU/_Arcane/stabikor/aggression_inhibitor_component.ftlResources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.
Applied to files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.
Applied to files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.
Applied to files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.
Applied to files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.
Applied to files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.
Applied to files:
Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.csContent.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
📚 Learning: 2026-07-05T23:32:09.578Z
Learnt from: Alazell
Repo: ArcaneSS14/arcane-old PR: 117
File: Resources/Prototypes/_Arcane/Entities/Objects/Devices/pinpointer.yml:23-28
Timestamp: 2026-07-05T23:32:09.578Z
Learning: When editing ArcaneSS14/arcane-old prototype YAML related to pinpointers and tags:
- Pinpointer auto-locate vs manual retarget: `PinpointerComponent.Whitelist` controls auto-locate. If `Whitelist` is `null`, the pinpointer `Update` auto-locate logic returns early and will not search for a target; leaving it unset is safe from unintended auto-targeting. Manual retargeting during `OnAfterInteract` is governed by `RetargetingWhitelist`/`RetargetingBlacklist` (not `Whitelist`).
- Emag behavior: in `SharedPinpointerSystem.OnEmagged`, if `canRetarget: true` then `RetargetingWhitelist` is set to `null` (removing retarget restrictions, effectively allowing any retarget target); set `canEmag: false` to prevent emagging if needed.
- Tag prototype registration: any new `Tag` prototype IDs referenced in YAML (e.g., entities with `type: Tag` or `EntityWhitelist.tags`) must have a corresponding prototype declared as `- type: Tag` (commonly in `Resources/Prototypes/_Arcane/tags.yml` or an equivalent...
Applied to files:
Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml
🔇 Additional comments (18)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (2)
32-59: Не отключайте prediction на клиенте.
_netManager.IsClientзавершает обработчик доTryStartDoAfterи popup. Локальный игрок видит начало действия только после ответа сервера. Перенесите запуск do-after и predicted feedback в shared/predicted путь. Оставьте снятие предмета и радио-уведомление на сервере.
62-79: LGTM!Content.Shared/_Arcane/CuttableItem/Components/CuttableItemComponent.cs (1)
11-43: LGTM!Content.Shared/_Arcane/CuttableItem/CuttableDoAfterEvent.cs (1)
6-7: LGTM!Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (1)
27-75: LGTM!Resources/Locale/en-US/_Arcane/cuttable/cuttable_Item_component.ftl (1)
1-5: LGTM!Resources/Locale/ru-RU/_Arcane/cuttableItem/cuttable_Item_component.ftl (1)
1-5: LGTM!Resources/Prototypes/_Arcane/Entities/Clothing/Other/inhibitor.yml (1)
1-34: LGTM!Resources/Prototypes/_Orion/Research/Nodes/security.yml (1)
82-82: LGTM!Resources/Textures/_Arcane/Clothing/Neck/Misc/petcollar.rsi/meta.json (1)
1-22: LGTM!Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (3)
35-35: Предиктивная блокировка боевого режима до сих пор не добавлена (дубль).Обработчик
OnToggleCombatActionесть только вContent.Server. Клиент включает боевой режим локально до ответа сервера и получает откат постфактум. Это уже отмечалось ранее без пометки "Addressed".
249-262: Тихий отказ при неудачномRemoveInhibitorвToggleLock(дубль, не устранён).При наличии доступа, но провале
RemoveInhibitor, метод молча возвращается без popup/sound. Это уже отмечалось ранее без пометки "Addressed".
170-170:OpenDialog/ToggleLock:Entity<AggressionInhibitorComponent>вместо раздельных параметров (дубль, не устранён).Оба метода вызываются из
OnOpenDialogReceived/OnToggleLockReceived, где параuid+compуже приходит вместе. Это уже отмечалось ранее без пометки "Addressed".Also applies to: 232-232
Content.Shared/_Arcane/AggressionInhibitor/Components/AggressionInhibitorComponent.cs (1)
1-109: LGTM!Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (1)
1-137: LGTM!Resources/Prototypes/Catalog/Fills/Lockers/security.yml (1)
46-49: LGTM!Resources/Prototypes/Recipes/Lathes/Packs/security.yml (1)
86-86: LGTM!Resources/Prototypes/Recipes/Lathes/security.yml (1)
65-77: LGTM!
| if (TryComp<Shared.Mobs.Components.MobStateComponent>(user, out var mobState)) | ||
| { | ||
| if (mobState.CurrentState == Shared.Mobs.MobState.Critical || | ||
| mobState.CurrentState == Shared.Mobs.MobState.Dead) | ||
| return; | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🔵 Trivial | 💤 Low value
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
fd -a 'MobState\.cs$'
rg -n "enum MobState" -A 15 Content.Shared/Mobs/MobState.cs 2>/dev/null || rg -n "enum MobState" -A 15 -g '*.cs'Repository: ArcaneSS14/arcane
Length of output: 915
Добавьте using-директивы для MobStateComponent и MobState.
MobState.Critical покрывает SoftCritical, поэтому отдельная проверка SoftCritical/HardCritical не нужна; главное в этом фрагменте — упростить обращения к Content.Shared.Mobs.Components.MobStateComponent и Content.Shared.Mobs.MobState через using.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
around lines 65 - 70, Добавьте using-директивы для
Content.Shared.Mobs.Components.MobStateComponent и Content.Shared.Mobs.MobState,
затем обновите проверку в системе AggressionInhibitorSystem, используя короткие
имена MobStateComponent и MobState; сохраните текущую проверку состояний
Critical и Dead без добавления отдельных проверок SoftCritical или HardCritical.
| ent-ClothingAggressionInhibitor = ингибитор агрессии | ||
| .desc = Стабилизирует поведение ассистентов с помощью силы тока! На корпусе виднеется считыватель ID-карт. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Отсутствует en-US-версия локали для ClothingAggressionInhibitor.
В этом слое PR присутствует только ru-RU файл для этой сущности. Гайдлайн требует, чтобы FTL-строки добавлялись «starting with en-US», а ru-RU — как парная запись. Английские клиенты увидят сырой ключ ent-ClothingAggressionInhibitor вместо текста.
Как per coding guidelines: "Add or update FTL entries under Resources/Locale/, starting with en-US; add/update matching ru-RU entries when the same feature already maintains Russian locale or the change is Orion-facing."
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Resources/Locale/ru-RU/_Arcane/entities/clothing/other/aggression_inhibitor.ftl`
around lines 1 - 2, Добавьте en-US FTL-запись для
ent-ClothingAggressionInhibitor с именем и описанием сущности, сохранив ru-RU
запись как парную локализацию. Разместите английскую локаль в соответствующем
слое Resources/Locale и используйте существующий формат ключей
ent-ClothingAggressionInhibitor и .desc.
Source: Coding guidelines
|
|
||
| namespace Content.Server._Arcane.CuttableItem.Systems; | ||
|
|
||
| public sealed class CuttableItemSystem : EntitySystem |
There was a problem hiding this comment.
public sealed partial class
|
|
||
| namespace Content.Shared._Arcane.AggressionInhibitor.Systems; | ||
|
|
||
| public sealed class SharedAggressionInhibitorSystem : EntitySystem |
There was a problem hiding this comment.
public sealed partial class
|
|
||
| namespace Content.Shared._Arcane.CuttableItem.Systems; | ||
|
|
||
| public sealed class SharedCuttableItemSystem : EntitySystem |
There was a problem hiding this comment.
public sealed partial class
There was a problem hiding this comment.
Тут кролик накидал очень много полезных комментариев.
Из важного:
Перенести проверку боевоего режима в shared, а тут оставить всё остальное.
При отказе в доступе нету попапа или какой либо причины в отказе.
Ну и ещё исправления.
There was a problem hiding this comment.
Actionable comments posted: 2
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)
134-160: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winПовторно проверьте состояние в callback диалога.
Проверки дистанции, ID-карты, доступа и
comp.IsLockedвыполняются до открытия асинхронного диалога. До отправки ответа другой сотрудник может активировать ингибитор. Callback затем изменитDurationу уже заблокированного устройства через сохранённыйcomp.В callback заново получите компонент и повторите проверки перед изменением
Duration. Лучше вынесите проверки в общий метод для открытия и подтверждения диалога.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs` around lines 134 - 160, Повторно проверьте состояние ингибитора в callback, получив актуальный компонент вместо использования сохранённого comp, и перед изменением Duration заново выполните проверки существования сущности, дистанции, ID-карты, доступа и IsLocked. Вынесите общие проверки из обработчика открытия диалога и callback в единый метод, сохранив текущие сообщения об отказе и изменяя Duration только при успешной проверке.
♻️ Duplicate comments (1)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)
30-59:⚠️ Potential issue | 🟠 MajorНе отключайте shared prediction на клиенте.
Условие
_netManager.IsClientзавершает обработчик доargs.Handled,TryStartDoAfterи popup. Клиент не запускает резку сразу. Действие начинается только после ответа сервера.Оставьте ранний выход только для
args.Handled. ЗапускайтеDoAfterв shared/predicted пути. Для popup используйте predicted API. Снятие предмета и radio-уведомление оставьте в server-only обработчике.As per path instructions,
Content.Sharedдолжен владеть prediction-aware логикой локальных действий. As per coding guidelines, используйте predicted APIs для player-facing feedback.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs` around lines 30 - 59, Remove the _netManager.IsClient early return from OnInteractUsing, leaving only the args.Handled guard so the shared handler starts the predicted DoAfter immediately. Use the predicted popup API for the player-facing cut attempt feedback, and keep item removal and radio notification in the server-only handler.Sources: Coding guidelines, Path instructions
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 65-70: В обработчике OnInteractUsing после воспроизведения
comp.DenySound для неэкипированного предмета немедленно завершите выполнение
через return; сохраните установку args.Handled = true перед выходом, чтобы
последующая проверка ID-карты и операция доступа не выполнялись.
- Line 88: Замените только воспроизведение DenySound в AggressionInhibitorSystem
на локализованный PopupEntity с причиной отказа в проверках доступа. Примените
это при разблокировке и активации по путям
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs:88-88
и 100-100, а также в соответствующих verb-путях на 188-188 и 197-197; сообщение
должно явно указывать, что ID-карта не имеет требуемого доступа.
---
Outside diff comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 134-160: Повторно проверьте состояние ингибитора в callback,
получив актуальный компонент вместо использования сохранённого comp, и перед
изменением Duration заново выполните проверки существования сущности, дистанции,
ID-карты, доступа и IsLocked. Вынесите общие проверки из обработчика открытия
диалога и callback в единый метод, сохранив текущие сообщения об отказе и
изменяя Duration только при успешной проверке.
---
Duplicate comments:
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 30-59: Remove the _netManager.IsClient early return from
OnInteractUsing, leaving only the args.Handled guard so the shared handler
starts the predicted DoAfter immediately. Use the predicted popup API for the
player-facing cut attempt feedback, and keep item removal and radio notification
in the server-only handler.
🪄 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: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 5f28b093-c89e-41ce-8b91-67708e656eda
📒 Files selected for processing (7)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
💤 Files with no reviewable changes (1)
- Resources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
📜 Review details
⏰ Context from checks skipped due to timeout. (5)
- GitHub Check: Test Packaging
- GitHub Check: YAML Linter
- GitHub Check: build (ubuntu-latest)
- GitHub Check: build (ubuntu-latest)
- GitHub Check: YAML map schema validator
🧰 Additional context used
📓 Path-based instructions (15)
Resources/**/*.{yml,ftl,json}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files
Files:
Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
Resources/**/*.ftl
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 localization string standards and formatting rules
Files:
Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
Resources/**/*.{yml,ftl}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 prototype locale integration rules and practices
Files:
Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
Resources/Locale/**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Locale/**/*.ftl: Add or update FTL entries underResources/Locale/, starting withen-US; add/update matchingru-RUentries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specifickebab-caselocalization IDs.
Files:
Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
⚙️ CodeRabbit configuration file
Resources/Locale/**/*.ftl: Treat localization as mandatory:
- Every player-facing string should be localized.
- Prefer specific kebab-case keys.
- Flag raw strings in code or gameplay/resource changes that are missing locale updates.
- Check consistency when prototype names, descriptions, markings, or UI text changed.
Files:
Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
**/*.cs
📄 CodeRabbit inference engine (GEMINI.md)
**/*.cs: Keep components data-only and behavior in systems
UseOn... -> Try... -> Can... -> Do...pattern for gameplay actions
PreferEntity<T?>,ProtoId<T>,EntProtoId, and localized strings for type usage
**/*.cs: When writing or editing C# gameplay code, load skills:ss14-ecs-components,ss14-ecs-entities,ss14-ecs-prototypes,ss14-ecs-systems,ss14-events, andss14-prediction.
If the C# change is large or the task needs reviewable notes, load skillss14-documentation-writing.
If the code touches hot paths,Update(), or frequently raised events, load skillss14-standard-optimizations.
If the task adds or changes player-facing text, load skillsss14-localization-stringsandss14-localization-codewhen the change also touchesLoc.GetString(...),LocId, popup text, or localized component fields.
If the task touches network events,NetEntity, replicated state routing, or shared/server/client message flow, load skillss14-netcode.
If the task touchesAppearance,GenericVisualizer, visual state enums, or sprite-layer toggles, load skillss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skillss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skillsss14-prototype-basics,ss14-ecs-basics, andss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skillsss14-debugging-workflowandss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skillsss14-common-api-patternsandss14-audiowhen the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*.{cs,xaml,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
If the task adds tests or you need to choose the right test layer, load skill
ss14-tests-authoring.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
Put main server-only authority and non-predicted server simulation in
Content.Server/; useContent.Goobstation.Server/for features already rooted in that module.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
**/*System.cs
📄 CodeRabbit inference engine (AGENTS.md)
Public entity-system APIs that operate on entities should usually take
Entity<T?>orEntityUidfirst and callResolve(...)early.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Server/**/*.cs
⚙️ CodeRabbit configuration file
Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:
- Server owns authority, persistence, round logic, and non-predicted side effects.
- If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
- Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
- When player-visible behavior changes, check whether matching prototype and locale updates are missing.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Shared/**
📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)
Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic inContent.Shared/; useContent.Goobstation.Shared/only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong inContent.Shared/. Shared predicted components should useNetworkedComponent,AutoGenerateComponentState, andAutoNetworkedFieldwhere appropriate.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Shared/**/*.cs
⚙️ CodeRabbit configuration file
Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:
- Shared owns replicated state, shared events, prediction, and data both client and server must understand.
- Flag client-only or server-only dependencies in Shared.
- For local-player actions, verify prediction support instead of accepting delayed server-only UX.
- When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
- Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
- Flag EntityUid.Invalid used as a "missing" sentinel.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
🧠 Learnings (8)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....
Applied to files:
Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.
Applied to files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
🔇 Additional comments (5)
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)
62-80: LGTM!Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (1)
11-76: LGTM!Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (1)
42-45: Сохраните предиктивную блокировку combat mode.
_netManager.IsClientотключает обработчик на клиенте. Поэтому клиент локально включает combat mode до серверного отката. Оставьте поиск активного ингибитора иargs.Handledна обеих сторонах. Электрошок оставьте только на сервере.As per path instructions: “For local-player actions, verify prediction support instead of accepting delayed server-only UX.”
Sources: Coding guidelines, Path instructions
Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl (1)
1-80: LGTM!Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl (1)
1-2: LGTM!
| return; | ||
| args.Handled = true; | ||
| } | ||
| else _audio.PlayPvs(comp.DenySound, uid); |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Покажите причину отказа во всех ветках проверки доступа.
Один DenySound не сообщает пользователю, что ID-карта не имеет нужного доступа. Добавьте локализованный PopupEntity и используйте его во всех ветках.
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L88-L88: покажите причину отказа при попытке разблокировки.Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L100-L100: покажите причину отказа при попытке активации.Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L188-L188: покажите причину отказа для verb разблокировки.Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L197-L197: покажите причину отказа для verb активации.
📍 Affects 1 file
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L88-L88(this comment)Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L100-L100Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L188-L188Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs#L197-L197
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`
at line 88, Замените только воспроизведение DenySound в
AggressionInhibitorSystem на локализованный PopupEntity с причиной отказа в
проверках доступа. Примените это при разблокировке и активации по путям
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs:88-88
и 100-100, а также в соответствующих verb-путях на 188-188 и 197-197; сообщение
должно явно указывать, что ID-карта не имеет требуемого доступа.
|
Я не знаю почему тест падает. Говорит что Amber втыкает |
В целом везде тесты откисли, что у нас на аркейне, что на корваксгуб, что у самих губов, так что пока на них внимание не обращай. |
There was a problem hiding this comment.
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (1)
109-166: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick winПовторно проверяйте блокировку и доступ в callback диалога.
Проверки выполняются только до открытия диалога. В callback проверяется только
EntityExists. Если устройство заблокируют, пользователь уйдёт из радиуса или сменит ID-карту, callback всё равно изменитDuration. Перед изменением повторно проверьте блокировку, дистанцию и доступ карты.Минимальное исправление блокировки
- if (!EntityManager.EntityExists(uid)) + if (!EntityManager.EntityExists(uid) || comp.IsLocked) return;Контекст изменения подтверждает, что проверку unlocked удалили из callback.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs` around lines 109 - 166, В callback, перед изменением comp.Duration в OpenDialog, повторно проверьте существование устройства, что comp.IsLocked ложно, что пользователь остаётся в радиусе 2f от targetEntity, и что у него всё ещё есть активная ID-карта с требуемым доступом через _handsSystem, _idCard и AccessComponent. При провале любой проверки немедленно завершайте callback без изменения состояния.Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (1)
48-59: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick winПроверяйте результат
_doAfter.TryStartDoAfter.
TryStartDoAfter(DoAfterArgs args)возвращаетbool. Приfalseкод вCuttableItemUseвсё равно оставляетargs.Handled = trueи показывает popup, хотя действие не запустилось. Проверяйте результат до установкиargs.Handledи показа popup.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs` around lines 48 - 59, Update CuttableItemUse around _doAfter.TryStartDoAfter to check its boolean result before setting args.Handled and showing the cuttable-item-attempt-broken-popup notification. Only mark the use handled and display the popup when the do-after starts successfully; preserve the existing behavior when it fails by returning without those side effects.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Outside diff comments:
In
`@Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs`:
- Around line 109-166: В callback, перед изменением comp.Duration в OpenDialog,
повторно проверьте существование устройства, что comp.IsLocked ложно, что
пользователь остаётся в радиусе 2f от targetEntity, и что у него всё ещё есть
активная ID-карта с требуемым доступом через _handsSystem, _idCard и
AccessComponent. При провале любой проверки немедленно завершайте callback без
изменения состояния.
In `@Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs`:
- Around line 48-59: Update CuttableItemUse around _doAfter.TryStartDoAfter to
check its boolean result before setting args.Handled and showing the
cuttable-item-attempt-broken-popup notification. Only mark the use handled and
display the popup when the do-after starts successfully; preserve the existing
behavior when it fails by returning without those side effects.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: d4ceb01f-664d-4ab0-a48d-ed0e8fd64193
📒 Files selected for processing (7)
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.csContent.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csResources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftlResources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
💤 Files with no reviewable changes (1)
- Resources/Locale/ru-RU/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl
📜 Review details
⏰ Context from checks skipped due to timeout. (7)
- GitHub Check: YAML Linter
- GitHub Check: Validate RSIs
- GitHub Check: build (ubuntu-latest)
- GitHub Check: YAML map schema validator
- GitHub Check: Test Packaging
- GitHub Check: build (ubuntu-latest)
- GitHub Check: Diff
🧰 Additional context used
📓 Path-based instructions (15)
Resources/**/*.{yml,ftl,json}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Resources/**/*.{yml,ftl,json}: Follow SS14 naming conventions when editing prototype, localization, and resource files
Follow SS14 upstream maintenance practices when editing resource files
Files:
Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/**/*.ftl
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 localization string standards and formatting rules
Files:
Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/**/*.{yml,ftl}
📄 CodeRabbit inference engine (.cursor/rules/ss14-resources.mdc)
Follow SS14 prototype locale integration rules and practices
Files:
Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
Resources/Locale/**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Resources/Locale/**/*.ftl: Add or update FTL entries underResources/Locale/, starting withen-US; add/update matchingru-RUentries when the same feature already maintains Russian locale or the change is Orion-facing and you can do so without guessing translations.
Use specifickebab-caselocalization IDs.
Files:
Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
⚙️ CodeRabbit configuration file
Resources/Locale/**/*.ftl: Treat localization as mandatory:
- Every player-facing string should be localized.
- Prefer specific kebab-case keys.
- Flag raw strings in code or gameplay/resource changes that are missing locale updates.
- Check consistency when prototype names, descriptions, markings, or UI text changed.
Files:
Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
**/*.cs
📄 CodeRabbit inference engine (GEMINI.md)
**/*.cs: Keep components data-only and behavior in systems
UseOn... -> Try... -> Can... -> Do...pattern for gameplay actions
PreferEntity<T?>,ProtoId<T>,EntProtoId, and localized strings for type usage
**/*.cs: When writing or editing C# gameplay code, load skills:ss14-ecs-components,ss14-ecs-entities,ss14-ecs-prototypes,ss14-ecs-systems,ss14-events, andss14-prediction.
If the C# change is large or the task needs reviewable notes, load skillss14-documentation-writing.
If the code touches hot paths,Update(), or frequently raised events, load skillss14-standard-optimizations.
If the task adds or changes player-facing text, load skillsss14-localization-stringsandss14-localization-codewhen the change also touchesLoc.GetString(...),LocId, popup text, or localized component fields.
If the task touches network events,NetEntity, replicated state routing, or shared/server/client message flow, load skillss14-netcode.
If the task touchesAppearance,GenericVisualizer, visual state enums, or sprite-layer toggles, load skillss14-graphics-generic-visualizer-appearance.
If the task touches sprites, RSI metadata, overlays, shaders, or custom client visual effects, load skillss14-sprite-overlays-shaders.
If the task is about learning or explaining SS14 architecture, first features, or where code belongs, load skillsss14-prototype-basics,ss14-ecs-basics, andss14-client-server-shared.
If the task is about bug hunting, VV, logs, breakpoints, or runtime inspection, load skillsss14-debugging-workflowandss14-common-api-patterns.
If the task touches common gameplay helpers such as entity-system methods, spawning, prototypes, audio, popups, or random, load skillsss14-common-api-patternsandss14-audiowhen the work changes audio routing, sound assets, sound collections, or predicted sound feedback.
If the task ports code or assets from another repository, or needs license or attribution guidance,...
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Shared/**
📄 CodeRabbit inference engine (Content.Shared/AGENTS.md)
Content.Shared/**: Load ss14-naming-conventions agent notes for Content.Shared work
Load ss14-ecs-prototypes, ss14-ecs-components, ss14-ecs-entities, and ss14-ecs-systems agent notes for Content.Shared work
Load ss14-upstream-maintenance agent notes for Content.Shared work
Load ss14-events agent notes for Content.Shared work
Load ss14-prediction and ss14-netcode agent notes for Content.Shared work
Load ss14-localization-code agent notes when shared code emits player text or stores LocId
Load ss14-graphics-generic-visualizer-appearance agent notes when shared gameplay state drives Appearance or GenericVisualizer
Load ss14-audio agent notes when shared components or events carry sound specifiers or predicted audio intent
Load ss14-atmos agent notes when shared components, UI messages, or enums belong to atmos features
Load ss14-transform-physics agent notes for shared coordinates, movement, collision, anchoring, or physics contracts
Load ss14-pvs agent notes for PVS-sensitive shared/network contracts
Load ss14-npc-ai agent notes for shared NPC, HTN, steering, pathfinding, or debug contracts
Shared code must own replicated state, shared events, and prediction-aware logic without adding direct client-only or server-only dependencies
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-csharp.mdc)
+(Content.Shared|Content.Server|Content.Client|Content.Goobstation.Shared|Content.Goobstation.Server|Content.Goobstation.Client|Content.Goobstation.Common|Content.Goobstation.Maths|Content.Goobstation.UIKit|Content.Server.Database|Content.Shared.Database|Content.Tests|Content.IntegrationTests)/**/*.cs: Apply C# ECS style rules from ss14-interaction-flow.md
Apply ss14-csharp-style.md rules for C# code formatting and conventions
Follow ss14-naming-conventions for variable, method, and type naming in C# gameplay code
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-shared.mdc)
{Content.Shared,Content.Goobstation.Shared,Content.Goobstation.Common,Content.Goobstation.Maths,Content.Shared.Database}/**/*.cs: Apply SS14 C# style guidelines from @.agents/rules/ss14-csharp-style.md
Follow SS14 ECS component patterns as defined in @.agents/skills/ss14-ecs-components/SKILL.md
Follow SS14 ECS entity patterns as defined in @.agents/skills/ss14-ecs-entities/SKILL.md
Follow SS14 ECS system patterns as defined in @.agents/skills/ss14-ecs-systems/SKILL.md
Follow SS14 event patterns as defined in @.agents/skills/ss14-events/SKILL.md
Follow SS14 prediction-aware gameplay code patterns as defined in @.agents/skills/ss14-prediction/SKILL.md
Follow SS14 netcode patterns as defined in @.agents/skills/ss14-netcode/SKILL.md
Follow SS14 localization identifier patterns as defined in @.agents/skills/ss14-localization-code/SKILL.md
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*.{cs,xaml,yml,yaml}
📄 CodeRabbit inference engine (AGENTS.md)
If the task adds tests or you need to choose the right test layer, load skill
ss14-tests-authoring.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Shared,Content.Goobstation.Shared}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
{Content.Shared,Content.Goobstation.Shared}/**/*.cs: Put main shared data, shared events, networked state, and predicted logic inContent.Shared/; useContent.Goobstation.Shared/only for code that belongs to that existing module path.
Do not make shared projects depend on client-only or server-only projects.
Predicted systems and their relevant components belong inContent.Shared/. Shared predicted components should useNetworkedComponent,AutoGenerateComponentState, andAutoNetworkedFieldwhere appropriate.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
**/*System.cs
📄 CodeRabbit inference engine (AGENTS.md)
Public entity-system APIs that operate on entities should usually take
Entity<T?>orEntityUidfirst and callResolve(...)early.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
Content.Shared/**/*.cs
⚙️ CodeRabbit configuration file
Content.Shared/**/*.cs: Review Content.Shared as shared gameplay and prediction code:
- Shared owns replicated state, shared events, prediction, and data both client and server must understand.
- Flag client-only or server-only dependencies in Shared.
- For local-player actions, verify prediction support instead of accepting delayed server-only UX.
- When state is networked, check NetworkedComponent, AutoGenerateComponentState, AutoNetworkedField, and Dirty/DirtyField usage.
- Prefer entity-system APIs and Entity<T?> / Resolve patterns over ad-hoc tuples or old-style access.
- Flag EntityUid.Invalid used as a "missing" sentinel.
Files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
{Content.Server,Content.Goobstation.Server}/**/*.cs
📄 CodeRabbit inference engine (AGENTS.md)
Put main server-only authority and non-predicted server simulation in
Content.Server/; useContent.Goobstation.Server/for features already rooted in that module.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
Content.Server/**/*.cs
⚙️ CodeRabbit configuration file
Content.Server/**/*.cs: Review Content.Server for authority and fork-maintenance discipline:
- Server owns authority, persistence, round logic, and non-predicted side effects.
- If a player action should feel immediate, call out missing shared prediction rather than accepting a server-only path.
- Keep upstream diffs narrow and prefer fork-scoped extensions over broad edits to upstream behavior.
- When player-visible behavior changes, check whether matching prototype and locale updates are missing.
Files:
Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs
🧠 Learnings (8)
📚 Learning: 2026-07-06T05:08:05.731Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-old PR: 101
File: Resources/Prototypes/_Orion/Entities/Objects/Specific/Medical/medkits.yml:0-0
Timestamp: 2026-07-06T05:08:05.731Z
Learning: When reviewing ArcaneSS14 “_Arcane” prototype changes (especially entity id renames/swaps made via # Arcane-Edit in vanilla-mirrored YAML files), ensure locale/localization handling matches these rules:
1) If a renamed/swapped entity id occurs via a vanilla-mirrored YAML file but the entity is treated as “_Arcane”, add the new id’s localized strings under the corresponding “_Arcane” locale path (e.g., Resources/Locale/<lang>/ss14-ru/prototypes/_arcane/...). Treat this as an explicit exception to the YAML living outside the _Arcane folder.
2) If the old vanilla id is released and then reused by a new “_Arcane” entity, do not create duplicate locale entries for that id under _Arcane; the pre-existing vanilla-mirrored locale entries already apply.
3) For “_Arcane” entity .ftl files, do not reference a parent/base prototype’s locale key (e.g., a base description key) unless that base prototype is defined within the same mirrored YAML path. If the base is abstract or defined elsewhere (e.g....
Applied to files:
Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftlResources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl
📚 Learning: 2026-06-04T21:17:36.815Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 31
File: Content.Client/Fluids/PuddleSystem.cs:41-41
Timestamp: 2026-06-04T21:17:36.815Z
Learning: In this repo (ArcaneSS14/arcane-station), reviewers should use the Arcane inline fork-edit marker naming for single-line edits outside `_Arcane` paths: prefer `// Arcane` or `// Arcane-edit` and do not use `// Orion` for this purpose. Repo-specific AGENTS guidance that mentions `// Orion` does not apply to these single-line changes; only `_Arcane` paths follow the applicable different convention.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T19:37:26.732Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Client/IoC/ClientContentIoC.cs:151-151
Timestamp: 2026-06-28T19:37:26.732Z
Learning: For ArcaneSS14/arcane-station C# files whose path is outside any `_Arcane` directories, avoid adding an inline fork marker (e.g., `// Arcane` or `// Arcane-edit`) to `using` directives when the imported namespace already clearly indicates the `_Arcane` fork. For example, if the `using` namespace itself contains `_Arcane` (such as `using Content.Client._Arcane.ERP.Preferences;`), the `// Arcane`/`// Arcane-edit` marker is unnecessary.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-04T03:37:47.373Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Goobstation.Server/Chemistry/EntitySystems/EnergyReagentDispenserSystem.cs:59-59
Timestamp: 2026-07-04T03:37:47.373Z
Learning: In ArcaneSS14/arcane-station, C# source files must never have fork-edit markers (e.g., comments like `// Arcane`, `// Arcane-edit`, `// Orion`) on `using` directives. During code review, do not flag existing markers on any `using` line and do not suggest adding/removing them based on `_Arcane` folder placement or whether the imported namespace contains `_Arcane`—this rule applies universally to all `using` statements.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-28T16:30:37.419Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane PR: 133
File: Content.Server/Speech/EntitySystems/StutteringSystem.cs:28-29
Timestamp: 2026-07-28T16:30:37.419Z
Learning: При внесении одиночных fork-правок в репозитории ArcaneSS14/arcane вне путей `_Arcane` добавляйте в конец каждой изменённой строки комментарий-маркер `// Arcane-Edit`. Это нужно для упрощения последующего поиска/обновления подобных правок при код-ревью и синхронизациях.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-06-28T12:09:12.409Z
Learnt from: MataVsn
Repo: ArcaneSS14/arcane-station PR: 96
File: Content.Shared/Humanoid/HumanoidVisualLayers.cs:65-67
Timestamp: 2026-06-28T12:09:12.409Z
Learning: In ArcaneSS14/arcane-station, for any C# enum annotated with `[NetSerializable]` in shared code, treat the enum member order/implicit underlying numeric values as part of the network wire-protocol. During code review, disallow inserting new enum members in the middle (or otherwise changing existing members’ numeric values), since it breaks network compatibility. Instead, add new members only at the end or explicitly pin stable values by assigning numeric literals to members.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-01T17:19:52.100Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/Mobs/MobState.cs:0-0
Timestamp: 2026-07-01T17:19:52.100Z
Learning: When reviewing ArcaneSS14/arcane-station C# code, ensure all usages of the `MobState` enum (`MobState.Dead`, `MobState.SoftCritical`, `MobState.HardCritical`, `MobState.Critical`) reference the enum members symbolically rather than via hardcoded numeric literals or casts from numeric values (e.g., avoid patterns like `(MobState)4` or `MobState` comparisons to `byte`/`int` literals). Treat direct numeric usage as a code-level dependency that should be flagged. Also avoid persisting `MobState` numeric values in `Content.Server.Database` or `Content.Replay`; if persistence/replay of the raw byte value is introduced, renumbering the `[NetSerializable] MobState : byte` enum becomes a data-compatibility risk. Renumbering the enum is compile-safe as long as there are no numeric literal dependencies, but the remaining risk is network wire-protocol mismatch if mixed old/new client-server builds are running during a rolling update—coordinate deployment to maintain net compatibility.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
📚 Learning: 2026-07-03T18:41:44.286Z
Learnt from: UmbiMax
Repo: ArcaneSS14/arcane-station PR: 101
File: Content.Shared/_Orion/EntityEffects/Effects/Special/ChemConvermol.cs:0-0
Timestamp: 2026-07-03T18:41:44.286Z
Learning: In ArcaneSS14/arcane-station, the hardcoded 1.2f base used by RefreshPartsEvent.GetLinearMultiplier(tier, step, min, max) (Math.Clamp(1.2f - tier * step, min, max)) is an intentional repo-wide balance convention: callers typically pass max: 1.2f, so a tier-1 part yields a 10% penalty (e.g., GetLinearMultiplier(tier: 1, step: 0.1f, min: 0.5f, max: 1.2f) => 1.1), while tier-2 is the neutral baseline. Do not flag the hardcoded 1.2f as a bug when reviewing shared multiplier/linear scaling usage. If a specific system needs a tier-1 baseline that produces 0% penalty instead, implement a locally-scoped formula in that system (e.g., adjust the constant to match the desired neutral baseline) rather than changing the shared helper, since modifying it would affect all callers’ balance.
Applied to files:
Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.csContent.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.csContent.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.csContent.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs
🔇 Additional comments (13)
Content.Shared/_Arcane/AggressionInhibitor/Systems/SharedAggressionInhibitorSystem.cs (2)
42-95: Восстановите клиентскую предиктивную блокировку combat mode.
_netManager.IsClientзавершаетOnToggleCombatActionдо поиска активного ингибитора. Клиент локально включает combat mode, пока сервер не вернёт авторитетное состояние. На клиенте помечайте событие обработанным при активном ингибиторе. Электрошок и серверный popup оставьте в серверной ветви.Согласно coding guidelines и path instructions, локальное действие игрока должно иметь prediction.
Sources: Coding guidelines, Path instructions
13-40: LGTM!Also applies to: 145-199
Content.Server/_Arcane/AggressionInhibitor/Systems/AggressionInhibitorSystem.cs (3)
109-110: Передавайте пару entity/component однимEntity<T?>.
OpenDialogиToggleLockполучаютuidиcompотдельно. Их обработчики уже получают эту пару вместе. ИспользуйтеEntity<AggressionInhibitorComponent>и вызовитеResolve(...)в начале метода.Согласно coding guidelines: “Prefer
Entity<T?>over parallel(EntityUid uid, T component)parameters”.Also applies to: 169-170
Source: Coding guidelines
206-230: Отключайте combat mode у носителя устройства.
wearerUid— заключённый с ингибитором.user— сотрудник, который активирует устройство. Текущий вызов отключает combat mode у сотрудника и оставляет включённый combat mode у заключённого.- _combatMode.SetInCombatMode(user, false); + _combatMode.SetInCombatMode(wearerUid, false);
37-56: LGTM!Resources/Locale/en-US/_Arcane/aggression-Inhibitor/aggression_inhibitor_component.ftl (1)
1-79: LGTM!Resources/Locale/en-US/_Arcane/entities/clothing/other/aggression_inhibitor.ftl (1)
1-2: LGTM!Content.Shared/_Arcane/CuttableItem/Systems/SharedCuttableItemSystem.cs (3)
30-33: Не отключайте prediction вContent.Shared.Условие
_netManager.IsClientзавершает обработчик до запуска DoAfter и feedback. Локальный игрок видит действие только после server round-trip. Уберите клиентский ранний выход. Запускайте DoAfter и feedback через shared/predicted путь. Снятие предмета и radio-уведомление оставьте вContent.Server.Это повторяет ранее отмеченное замечание.
As per path instructions, в
Content.Sharedдолжна находиться prediction-aware логика локальных действий. As per coding guidelines, используйте predicted API для feedback.Also applies to: 57-59
Sources: Coding guidelines, Path instructions
14-28: LGTM!
62-79: LGTM!Content.Server/_Arcane/CuttableItem/Systems/CuttableItemSystem.cs (3)
11-25: LGTM!
27-62: LGTM!
64-76: LGTM!
|
Note GitHub couldn't provide a complete incremental comparison for this pull request, so CodeRabbit is performing a full review instead. This review may take a little longer. |


Описание PR
Добавлен браслет/ошейник СБ ингибитор агрессии, который при активации на заключённом не допускает того в состояние боевого режима (шокирует током, не позволяя ему ударить или застрелить вас).
Время работы устанавливается вручную, используя ID карту.
Активировать могут лишь сотрудники СБ используя ID карту, но открыть только Варден, ГСБ, Капитан и ЦК.
В шкаф Вардена добавлена пара "стаби-кор"
Открывается в "Оборудование для обеспечения безопасности"
Добавлена система, которая позволяет освободится с не снимаемой одежды при помощи инструментов, но оповещает об этом в определённый канал связи.
Медиа
Работа ингибитора:
https://github.com/user-attachments/assets/567bfa67-e2d2-4d8a-9726-d216ef2b8292
Система среза:
https://github.com/user-attachments/assets/fe101da9-0d75-4189-a1be-07bdb6ed4d29
Тип PR