Кастомка для Бульбы#100
Conversation
|
Warning Review limit reached
Next review available in: 19 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (3)
WalkthroughДобавлена whitelist-проверка маркингов: данные подключены к ChangesWhitelist-механизм и его применение
Estimated code review effort: 3 (Moderate) | ~25 минут Sequence Diagram(s)sequenceDiagram
participant PlayerSession
participant MarkingPicker
participant MarkingWhitelistManager
participant HumanoidCharacterProfile
PlayerSession->>MarkingPicker: предоставить LocalSession
MarkingPicker->>MarkingWhitelistManager: проверить MarkingPrototype
MarkingWhitelistManager-->>MarkingPicker: разрешить или пропустить маркинг
HumanoidCharacterProfile->>MarkingWhitelistManager: проверить сохранённые маркировки
MarkingWhitelistManager-->>HumanoidCharacterProfile: удалить запрещённые маркировки
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 |
|
@coderabbitai в чём проблема? |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 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.Client/_Arcane/MarkingWhitelistManager.cs`:
- Around line 4-6: The namespace is misleading because MarkingWhitelistManager
lives in the client-only Content.Client tree but is declared under
Content.Shared.SpecialWhitelist. Update the type’s namespace to a
client-appropriate one, or move the class into the shared project if it is truly
meant to be shared, so the namespace matches its actual assembly and usage.
- Around line 8-27: The whitelist decision in
MarkingWhitelistManager.IsMarkingAllowed is currently client-authoritative in
Content.Client, so move this logic to a server/shared authority path and have
the client only consume the already-approved result. Refactor the check around
MarkingPrototype.Whitelist, ICommonSession, and session.Data.UserName so the
authoritative verdict is produced outside Content.Client, then update the
client-side caller to use that verdict only for display.
- Around line 6-8: `MarkingWhitelistManager` has no instance state or non-static
behavior, so convert the class to a static class and keep `IsMarkingAllowed` as
a static member. Update the `MarkingWhitelistManager` declaration accordingly so
the type clearly communicates utility-only usage and cannot be instantiated.
🪄 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: a0b920fe-5106-4d32-a7d6-1dd781cbd0d4
📒 Files selected for processing (1)
Content.Client/_Arcane/MarkingWhitelistManager.cs
📜 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: build (ubuntu-latest)
- GitHub Check: YAML map schema validator
🧰 Additional context used
📓 Path-based instructions (6)
**/*.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.Client/_Arcane/MarkingWhitelistManager.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.Client/_Arcane/MarkingWhitelistManager.cs
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.{cs,xaml}
📄 CodeRabbit inference engine (.cursor/rules/ss14-ui.mdc)
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.{cs,xaml}: Follow SS14 naming conventions when editing UI, XAML, and client-state files
Maintain upstream compatibility when editing SS14 client code
Follow SS14 UI and BUI conventions when implementing UI components and behavior-driven user interfaces
Files:
Content.Client/_Arcane/MarkingWhitelistManager.cs
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-ui.mdc)
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.cs: Apply SS14 prediction patterns when working with predicted client-state in SS14 client code
Follow SS14 localization code practices in UI and client-state implementationsPut main client-only visuals, overlays, XAML, and BUI front-ends in
Content.Client/; useContent.Goobstation.Client/orContent.Goobstation.UIKit/only when matching existing references and ownership.
Files:
Content.Client/_Arcane/MarkingWhitelistManager.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.Client/_Arcane/MarkingWhitelistManager.cs
Content.Client/**/*.cs
⚙️ CodeRabbit configuration file
Content.Client/**/*.cs: Review Content.Client for presentation-only behavior:
- Keep authority out of the client.
- Prefer reading already-networked component state instead of duplicating BUI state unless the pattern requires it.
- Flag missing localization for player-visible text.
- Prefer nearby established UI and visual patterns over custom one-off structures.
Files:
Content.Client/_Arcane/MarkingWhitelistManager.cs
🧠 Learnings (2)
📚 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.Client/_Arcane/MarkingWhitelistManager.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.Client/_Arcane/MarkingWhitelistManager.cs
| namespace Content.Shared.SpecialWhitelist; | ||
|
|
||
| public sealed class MarkingWhitelistManager |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟠 Major | ⚡ Quick win
Не маскируйте client-only код под Content.Shared.
Файл лежит в Content.Client/_Arcane, но namespace объявлен как Content.Shared.SpecialWhitelist. Это создаёт ложный shared-контракт: тип выглядит доступным для shared-слоя, хотя физически живёт в client-сборке. Либо переносите утилиту в shared-проект, либо дайте ей client-namespace. As per path instructions, Content.Client should be reviewed for presentation-only behavior.
🤖 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.Client/_Arcane/MarkingWhitelistManager.cs` around lines 4 - 6, The
namespace is misleading because MarkingWhitelistManager lives in the client-only
Content.Client tree but is declared under Content.Shared.SpecialWhitelist.
Update the type’s namespace to a client-appropriate one, or move the class into
the shared project if it is truly meant to be shared, so the namespace matches
its actual assembly and usage.
Source: Path instructions
| public sealed class MarkingWhitelistManager | ||
| { | ||
| public static bool IsMarkingAllowed(MarkingPrototype marking, ICommonSession? session) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
fd -e cs MarkingWhitelistManager . -x sed -n '1,80p' {}
echo '--- usages ---'
rg -nP --type=cs '\bnew\s+MarkingWhitelistManager\b|\bMarkingWhitelistManager\s*\.' Content.Client Content.Shared Content.Server Content.Tests Content.IntegrationTestsRepository: ArcaneSS14/arcane-station
Length of output: 1113
Сделать MarkingWhitelistManager static class
У класса нет состояния и нестатического API, поэтому static class точнее выражает намерение и исключает случайное создание экземпляра.
🤖 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.Client/_Arcane/MarkingWhitelistManager.cs` around lines 6 - 8,
`MarkingWhitelistManager` has no instance state or non-static behavior, so
convert the class to a static class and keep `IsMarkingAllowed` as a static
member. Update the `MarkingWhitelistManager` declaration accordingly so the type
clearly communicates utility-only usage and cannot be instantiated.
Source: Coding guidelines
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="ArcaneSS14/arcane-station"
pr="100"
echo "== PR reviews =="
gh pr view "$pr" --repo "$repo" --json reviews --jq '
.reviews[]
| select(.author.login=="coderabbitai")
| {
author: .author.login,
state: .state,
submittedAt: .submittedAt,
body: .body
}'
echo
echo "== PR review comments by coderabbitai =="
gh api "repos/$repo/pulls/$pr/comments?per_page=100" --paginate | jq -r '
.[]
| select(.user.login=="coderabbitai")
| "ID: \(.id)\nPath: \(.path)\nLine: \(.line // .original_line // "n/a")\nCreated: \(.created_at)\nBody:\n\(.body)\n---"'Length of output: 816
Если ты имел в виду конкретный тред/аннотацию — кинь ссылку на комментарий или цитату текста, и я разберу точечно, что именно там не так. (/_・)/ 🐇 |
|
@coderabbitai MarkingPrototype не содержит определения Whitelist и из-за этого файл некорректный. что делать? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== Candidate files =="
fd -i 'MarkingPrototype|MarkingWhitelistManager' .
echo
echo "== MarkingPrototype declarations/usages =="
rg -n -C3 --glob '!**/bin/**' --glob '!**/obj/**' '\bMarkingPrototype\b|\bWhitelist\b' .Length of output: 258378 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== Locate MarkingPrototype file =="
fd 'MarkingPrototype.cs' .
echo
echo "== Outline MarkingPrototype =="
ast-grep outline $(fd 'MarkingPrototype.cs' . | head -n1) --view expanded
echo
echo "== MarkingPrototype source =="
sed -n '1,220p' "$(fd 'MarkingPrototype.cs' . | head -n1)"
echo
echo "== New client file =="
sed -n '1,220p' Content.Client/_Arcane/MarkingWhitelistManager.cs
echo
echo "== Marking picker snippets =="
sed -n '200,320p' Content.Client/Humanoid/MarkingPicker.xaml.cs
sed -n '90,170p' Content.Client/Humanoid/SingleMarkingPicker.xaml.csLength of output: 10782
Что не так:
Что делать:
Итого: (╯°□°)╯︵ 🐇 ✏️ Learnings added
|
|
@coderabbitai почему пишет, что нейспейс MarkingWhitelistData не найден? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== Find MarkingWhitelistData =="
rg -n -C2 --glob '!**/bin/**' --glob '!**/obj/**' '\bMarkingWhitelistData\b' .
echo
echo "== Locate MarkingPrototype file =="
fd 'MarkingPrototype.cs' .
mp="$(fd 'MarkingPrototype.cs' . | head -n1)"
if [ -n "${mp:-}" ]; then
echo
echo "== Outline MarkingPrototype =="
ast-grep outline "$mp" --view expanded
echo
echo "== Top of MarkingPrototype =="
sed -n '1,120p' "$mp"
fi
if [ -f "Content.Client/_Arcane/MarkingWhitelistManager.cs" ]; then
echo
echo "== MarkingWhitelistManager =="
sed -n '1,160p' "Content.Client/_Arcane/MarkingWhitelistManager.cs"
fiLength of output: 5057
Что есть по факту:
Поэтому компилятор и пишет, что Что делать:
Дополнительно:
(•᷄ ﻌ •᷅) ✏️ Learnings added
|
|
@coderabbitai стоит ли переименовать файл в MarkingWhitelistData? в конечном итоге нужно сделать так, чтобы некоторые маркинги могли использовать только те, кто занесён в вайтлист этих самых маркингов. нужно ли создавать ещё один файл? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== Candidate files =="
fd -i 'MarkingWhitelistManager.cs|MarkingPrototype.cs|MarkingPicker.xaml.cs|SingleMarkingPicker.xaml.cs' .
echo
shared_file="$(fd '^MarkingWhitelistManager\.cs$' . | rg '^Content\.Shared/' | head -n1 || true)"
proto_file="$(fd '^MarkingPrototype\.cs$' . | head -n1 || true)"
if [ -n "${shared_file:-}" ]; then
echo "== Outline: $shared_file =="
ast-grep outline "$shared_file" --view expanded
echo
echo "== Source: $shared_file =="
sed -n '1,220p' "$shared_file"
fi
if [ -n "${proto_file:-}" ]; then
echo
echo "== Outline: $proto_file =="
ast-grep outline "$proto_file" --view expanded
echo
echo "== Relevant slice: $proto_file =="
sed -n '1,160p' "$proto_file"
fi
echo
echo "== Usages of MarkingWhitelistData / IsMarkingAllowed / Whitelist =="
rg -n -C2 --glob '!**/bin/**' --glob '!**/obj/**' '\bMarkingWhitelistData\b|\bIsMarkingAllowed\s*\(|\bWhitelist\b' Content.Shared Content.ClientLength of output: 189617
Рекомендация по структуре:
То есть: да, нужен ещё один файл.
Это и вызывает путаницу с namespace/import. Минимально нормально так: // Content.Shared/_Arcane/SpecialWhitelist/MarkingWhitelistData.cs
using Robust.Shared.Serialization;
namespace Content.Shared._Arcane.SpecialWhitelist;
[DataDefinition]
public sealed partial class MarkingWhitelistData
{
[DataField("allowed")]
public List<string> Allowed { get; private set; } = new();
}// Content.Shared/Humanoid/Markings/MarkingPrototype.cs
using Content.Shared._Arcane.SpecialWhitelist;А проверку доступа — отдельно. Важно по рискам:
Итог:
( •ᵕ• )૭ ✏️ Learnings added
|
|
@coderabbitai всё ли сейчас будет работать? как сделать так, чтобы определённые маркинги в кастомизации теперь привязывались к отдельным сикеям? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== Candidate files =="
fd -i 'MarkingPrototype.cs|MarkingWhitelist*.cs|MarkingPicker.xaml.cs|SingleMarkingPicker.xaml.cs|HumanoidProfile*.cs|Profile*.cs|Character*.cs' Content.Shared Content.Client Content.Server 2>/dev/null || true
echo
proto="$(fd '^MarkingPrototype\.cs$' Content.Shared | head -n1 || true)"
if [ -n "${proto:-}" ]; then
echo "== Outline: $proto =="
ast-grep outline "$proto" --view expanded
echo
echo "== Source slice: $proto =="
sed -n '1,180p' "$proto"
fi
echo
for f in $(fd -i 'MarkingWhitelist*.cs' Content.Shared Content.Client 2>/dev/null); do
echo "== Outline: $f =="
ast-grep outline "$f" --view expanded || true
echo
echo "== Source: $f =="
sed -n '1,220p' "$f"
echo
done
for f in Content.Client/Humanoid/MarkingPicker.xaml.cs Content.Client/Humanoid/SingleMarkingPicker.xaml.cs; do
if [ -f "$f" ]; then
echo "== Outline: $f =="
ast-grep outline "$f" --view expanded || true
echo
echo "== Relevant slice: $f =="
sed -n '1,260p' "$f"
echo
fi
done
echo "== Usages of MarkingWhitelistData / IsMarkingAllowed / '.Whitelist' =="
rg -n -C2 --glob '!**/bin/**' --glob '!**/obj/**' '\bMarkingWhitelistData\b|\bIsMarkingAllowed\s*\(|\.Whitelist\b' Content.Shared Content.Client Content.Server
echo
echo "== Potential profile/validation touchpoints for markings =="
rg -n -C3 --glob '!**/bin/**' --glob '!**/obj/**' '\bMarkings\b|\bmarkings\b|\bValidate.*Profile\b|\bGetValid.*Marking\b|\bEnsure.*Marking\b|\bHumanoidProfile\b' Content.Shared Content.Server Content.ClientLength of output: 212863
Что видно по ветке:
То есть:
Как привязать конкретные маркинги к конкретным ckey: 1) Хранить список ckey в YAML у самого маркингаПример: - type: marking
id: BulbaTail
bodyPart: Tail
markingCategory: Tail
sprites:
- sprite: _Arcane/Mobs/Customization/bulba_tail.rsi
state: tail
whitelist:
allowed:
- bulba
- another_ckeyЛучше хранить 2) На клиенте фильтровать список в пикереПодключить проверку в:
Логика:
MarkingWhitelistManager.IsMarkingAllowed(proto, session)Это даст правильное поведение в кастомизации: чужие маркинги просто не показываются. 3) На сервере валидировать профильЭто обязательный шаг, если нужен реальный запрет, а не только UI-фильтр. Сейчас стандартная валидация маркингов в shared-коде учитывает:
но не ckey/session. Нужно добавить отдельную серверную проверку в месте, где профиль:
Минимум:
4) Волосы/борода — отдельноЕсли хочешь привязывать hair / facial hair тоже к ckey, надо валидировать ещё:
Потому что они хранятся отдельно от Что рекомендую по итогу
Если коротко:
( •ᵕ• )/ |
|
RSI Diff Bot; head commit f5e7b3e merging into 2734662 Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi
Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi
Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi
|
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
Content.Shared/_Arcane/MarkingWhitelistManager.cs (1)
19-19: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick winЗамени
session.Data.UserNameнаsession.Name.
УICommonSessionнет публичногоData.UserName; здесь это выглядит как ошибка API и сломает сборку.🤖 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/MarkingWhitelistManager.cs` at line 19, Use the session’s public name property instead of the internal data user name in MarkingWhitelistManager, since ICommonSession does not expose Data.UserName. Update the ckey assignment in the code that handles session identity to read from session.Name so the API usage matches the interface and the build stays valid.
🤖 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.Shared/_Arcane/MarkingWhitelistData.cs`:
- Around line 8-9: The [DataField("allowed")] annotation on
MarkingWhitelistData.Allowed is redundant because it matches the default
camelCase name; simplify it to a bare [DataField] unless a non-default
serialized name is required. Update the Allowed property in MarkingWhitelistData
to use the convention preferred by the serializer guidelines and keep the
property name as the unique reference point.
In `@Content.Shared/_Arcane/MarkingWhitelistManager.cs`:
- Line 8: Rename the check method in MarkingWhitelistManager from
IsMarkingAllowed to a Can...-style name, such as CanApplyMarking, to match the
project’s convention for predicate/check methods. Update the method declaration
and every call site or reference that uses IsMarkingAllowed so the API name is
consistent and clearly communicates that it returns whether marking can be
applied.
In `@Content.Shared/Humanoid/Markings/MarkingPrototype.cs`:
- Around line 73-76: Remove the explicit DataField name from MarkingPrototype.
The Whitelist property already matches the default serialized name, so update
the MarkingPrototype.Whitelist declaration to use [DataField] without the
"whitelist" string, keeping the existing Arcane comment markers unchanged.
In
`@Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml`:
- Around line 120-133: The three Ren humanoid xeno markings are only gated by
the client-side whitelist, so add server-side validation in the character
profile apply/save path to reject unauthorized markings. Update the logic around
HumanoidXenoTailRen, HumanoidXenoHeadRen, and HumanoidXenoTracheasRen so the
server checks the allowed user before persisting or applying the profile, rather
than relying on MarkingWhitelistManager/UI filtering alone.
---
Outside diff comments:
In `@Content.Shared/_Arcane/MarkingWhitelistManager.cs`:
- Line 19: Use the session’s public name property instead of the internal data
user name in MarkingWhitelistManager, since ICommonSession does not expose
Data.UserName. Update the ckey assignment in the code that handles session
identity to read from session.Name so the API usage matches the interface and
the build stays valid.
🪄 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: a1362e26-ec6f-456e-a332-aa4f1cf80230
⛔ Files ignored due to path filters (4)
Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/ren_head.pngis excluded by!**/*.pngResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/ren_tail.pngis excluded by!**/*.pngResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/ren_tail_grad.pngis excluded by!**/*.pngResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/ren_tubes.pngis excluded by!**/*.png
📒 Files selected for processing (8)
Content.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistData.csContent.Shared/_Arcane/MarkingWhitelistManager.csResources/Locale/ru-RU/_Arcane/markings/humanoid_xeno.ftlResources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.ymlResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/meta.json
📜 Review details
🧰 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/ru-RU/_Arcane/markings/humanoid_xeno.ftlResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.jsonResources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.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/markings/humanoid_xeno.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/markings/humanoid_xeno.ftlResources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml
**/*.ftl
📄 CodeRabbit inference engine (AGENTS.md)
Use specific
kebab-caselocalization IDs.
Files:
Resources/Locale/ru-RU/_Arcane/markings/humanoid_xeno.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/markings/humanoid_xeno.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/markings/humanoid_xeno.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.csResources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml
{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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.cs
Resources/**/*.json
📄 CodeRabbit inference engine (AGENTS.md)
Keep RSI
meta.jsonordered asversion,license,copyright,size,stateswith 4-space indentation.
Files:
Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.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/Mobs/Customization/HumanoidXeno/tail.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json
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/Mobs/Customization/Markings/humanoid_xeno.yml
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/Mobs/Customization/Markings/humanoid_xeno.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/Mobs/Customization/Markings/humanoid_xeno.yml
🧠 Learnings (6)
📚 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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.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/MarkingWhitelistData.csContent.Shared/Humanoid/Markings/MarkingPrototype.csContent.Shared/_Arcane/MarkingWhitelistManager.cs
📚 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/Mobs/Customization/HumanoidXeno/tail.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/meta.jsonResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json
📚 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/Mobs/Customization/Markings/humanoid_xeno.yml
🔇 Additional comments (7)
Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/meta.json (1)
69-77: LGTM!Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/meta.json (1)
37-41: LGTM!Resources/Locale/ru-RU/_Arcane/markings/humanoid_xeno.ftl (1)
11-11: LGTM!Also applies to: 25-25, 40-40
Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json (1)
140-149: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick winДублирующийся state
worker_teethв meta.json.Строки 141-145 добавляют повторную запись
"worker_teeth"— она уже присутствует на строке 139-140. Это не намеренное добавление нового стейта (в diff-контексте видноren_head, а не второйworker_teeth). Дубликат имени state в RSI-манифесте — риск конфликта/непредсказуемого поведения при загрузке спрайта.🐛 Предлагаемое исправление
{ "name": "worker_teeth", "directions": 4 }, { - "name": "worker_teeth", - "directions": 4 - }, - { "name": "ren_head", "directions": 4 }> Likely an incorrect or invalid review comment.Content.Shared/_Arcane/MarkingWhitelistData.cs (1)
1-10: LGTM!Content.Shared/Humanoid/Markings/MarkingPrototype.cs (1)
20-20: LGTM!Content.Shared/_Arcane/MarkingWhitelistManager.cs (1)
8-28: 🎯 Functional CorrectnessОткрытый вопрос: где реально вызывается эта проверка?
Класс теперь в
Content.Shared— прошлое замечание про клиентскую авторитативность формально снято (сама возможность вызвать это с сервера появилась). Но в текущем кохорте не видно точки вызова: используется лиIsMarkingAllowedпри серверной валидации профиля/применения маркинга, или пока только в клиентском picker'е? Из объектов PR прямо следует требование серверной проверки при сохранении персонажа — без неё whitelist остаётся чисто косметическим ограничением UI, легко обходимым модифицированным клиентом.Прошу подтвердить в связанных файлах (не входящих в этот кохорт), что серверная валидация профиля действительно вызывает эту функцию.
| [DataField("allowed")] | ||
| public List<string> Allowed { get; private set; } = new(); |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Явное имя [DataField("allowed")] избыточно.
Строковое имя совпадает с дефолтным (camelCase от Allowed), так что атрибут можно упростить.
♻️ Предложение
- [DataField("allowed")]
+ [DataField]
public List<string> Allowed { get; private set; } = new();As per coding guidelines, "Prefer [DataField] without string field names on new code unless serializer compatibility or a non-default data name is required."
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| [DataField("allowed")] | |
| public List<string> Allowed { get; private set; } = new(); | |
| [DataField] | |
| public List<string> Allowed { get; private set; } = new(); |
🤖 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/MarkingWhitelistData.cs` around lines 8 - 9, The
[DataField("allowed")] annotation on MarkingWhitelistData.Allowed is redundant
because it matches the default camelCase name; simplify it to a bare [DataField]
unless a non-default serialized name is required. Update the Allowed property in
MarkingWhitelistData to use the convention preferred by the serializer
guidelines and keep the property name as the unique reference point.
Source: Coding guidelines
|
|
||
| public static class MarkingWhitelistManager | ||
| { | ||
| public static bool IsMarkingAllowed(MarkingPrototype marking, ICommonSession? session) |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Наименование check-метода не соответствует конвенции.
IsMarkingAllowed — это проверочный метод, по конвенции такие должны называться через Can... (например, CanApplyMarking).
As per coding guidelines, "Check methods should prefer Can...."
🤖 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/MarkingWhitelistManager.cs` at line 8, Rename the
check method in MarkingWhitelistManager from IsMarkingAllowed to a Can...-style
name, such as CanApplyMarking, to match the project’s convention for
predicate/check methods. Update the method declaration and every call site or
reference that uses IsMarkingAllowed so the API name is consistent and clearly
communicates that it returns whether marking can be applied.
Source: Coding guidelines
| // Arcane - Start | ||
| [DataField("whitelist")] | ||
| public MarkingWhitelistData? Whitelist { get; private set; } | ||
| // Arcane - End |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value
Явное имя [DataField("whitelist")] тоже избыточно.
Совпадает с дефолтным именем от Whitelist — то же замечание, что и для MarkingWhitelistData.
♻️ Предложение
- // Arcane - Start
- [DataField("whitelist")]
+ // Arcane - Start
+ [DataField]
public MarkingWhitelistData? Whitelist { get; private set; }
// Arcane - EndМаркировка // Arcane - Start/End для многострочной вставки в файле вне _Arcane-пути соответствует уже принятому в файле паттерну (см. /// Impstation start/end рядом) — нареканий нет.
As per coding guidelines, "Prefer [DataField] without string field names on new code unless serializer compatibility or a non-default data name is required."
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| // Arcane - Start | |
| [DataField("whitelist")] | |
| public MarkingWhitelistData? Whitelist { get; private set; } | |
| // Arcane - End | |
| // Arcane - Start | |
| [DataField] | |
| public MarkingWhitelistData? Whitelist { get; private set; } | |
| // Arcane - End |
🤖 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/Humanoid/Markings/MarkingPrototype.cs` around lines 73 - 76,
Remove the explicit DataField name from MarkingPrototype. The Whitelist property
already matches the default serialized name, so update the
MarkingPrototype.Whitelist declaration to use [DataField] without the
"whitelist" string, keeping the existing Arcane comment markers unchanged.
Source: Coding guidelines
| - type: marking | ||
| id: HumanoidXenoTailRen | ||
| bodyPart: Tail | ||
| markingCategory: Tail | ||
| speciesRestriction: [HumanoidXeno] | ||
| sprites: | ||
| - sprite: _Arcane/Mobs/Customization/HumanoidXeno/tail.rsi | ||
| state: ren_tail | ||
| - sprite: _Arcane/Mobs/Customization/HumanoidXeno/tail.rsi | ||
| state: ren_tail_grad | ||
| whitelist: | ||
| allowed: | ||
| - Bulbo44key | ||
|
|
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift
Whitelist только на клиенте — фильтр обходится напрямую.
Три новых маркинга (HumanoidXenoTailRen, HumanoidXenoHeadRen, HumanoidXenoTracheasRen) ограничены через whitelist.allowed: Bulbo44key. Судя по описанию PR, MarkingWhitelistManager — чисто клиентская/shared проверка без серверной валидации при сохранении/применении профиля. Игрок может обойти клиентский пикер и выставить этот маркинг напрямую (например, через редактирование профиля/сети), и сервер это не проверит.
Нужна серверная валидация профиля персонажа (при применении/сохранении), а не только фильтрация в UI-пикере.
Also applies to: 298-309, 440-451
🤖 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/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml`
around lines 120 - 133, The three Ren humanoid xeno markings are only gated by
the client-side whitelist, so add server-side validation in the character
profile apply/save path to reject unauthorized markings. Update the logic around
HumanoidXenoTailRen, HumanoidXenoHeadRen, and HumanoidXenoTracheasRen so the
server checks the allowed user before persisting or applying the profile, rather
than relying on MarkingWhitelistManager/UI filtering alone.
|
@coderabbitai проверь на ошибки. почему при заходе на сервер модельки ломаются и становятся прозначными? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== RSI meta.json files touched =="
fd -i 'meta.json' Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno
echo
echo "== Directory listing for tail.rsi =="
fd . Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi
echo
echo "== Directory listing for head.rsi =="
fd . Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi
echo
echo "== Directory listing for tracheas.rsi =="
fd . Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi
echo
echo "== meta.json contents =="
for f in $(fd -i 'meta.json' Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno); do
echo "--- $f ---"
cat "$f"
echo
done
echo
echo "== YAML marking definitions for Ren =="
rg -n -C5 'Ren' Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml
echo
echo "== Check for missing PNG state files vs meta.json states =="
python3 - <<'EOF'
import json, os, glob
rsi_dirs = glob.glob("Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/*.rsi")
for d in rsi_dirs:
meta_path = os.path.join(d, "meta.json")
if not os.path.exists(meta_path):
continue
with open(meta_path) as f:
meta = json.load(f)
states = meta.get("states", [])
for s in states:
name = s.get("name")
# check for png with that name
png = os.path.join(d, f"{name}.png")
if not os.path.exists(png):
print(f"MISSING PNG: {png}")
EOF
echo
echo "== Check markingCategory / bodyPart validity against enums =="
rg -n 'enum MarkingCategories' -A30 Content.Shared/Humanoid/Markings/MarkingCategories.cs 2>/dev/null || fd -i 'MarkingCategories' Content.Shared
echo
echo "== Check HumanoidVisualLayers for Tracheas / Tail / Head related to xeno =="
rg -n 'Tracheas|HumanoidXeno' Content.Shared/Humanoid -rLength of output: 19317
Найдена ошибка: дублирующийся state в
|
|
@coderabbitai энтити всё ещё прозрачные. почему? имеются ли ошибки в коде или дело не в этом? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== head.rsi meta.json current state (check if fix applied) =="
cat Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json
echo
echo "== tail.rsi meta.json =="
cat Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tail.rsi/meta.json
echo
echo "== tracheas.rsi meta.json =="
cat Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/tracheas.rsi/meta.json
echo
echo "== Check for duplicate names across all touched rsi meta.json =="
python3 - <<'EOF'
import json, glob, os
for d in glob.glob("Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/*.rsi"):
meta_path = os.path.join(d, "meta.json")
if not os.path.exists(meta_path):
continue
with open(meta_path) as f:
meta = json.load(f)
names = [s.get("name") for s in meta.get("states", [])]
dupes = set(n for n in names if names.count(n) > 1)
if dupes:
print(f"DUPLICATES in {meta_path}: {dupes}")
else:
print(f"OK: {meta_path} - {len(names)} states, no dupes")
EOF
echo
echo "== Check png files exist for all states =="
python3 - <<'EOF'
import json, os, glob
for d in glob.glob("Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/*.rsi"):
meta_path = os.path.join(d, "meta.json")
if not os.path.exists(meta_path):
continue
with open(meta_path) as f:
meta = json.load(f)
for s in meta.get("states", []):
name = s.get("name")
png = os.path.join(d, f"{name}.png")
if not os.path.exists(png):
print(f"MISSING PNG: {png}")
EOF
echo
echo "== Check meta.json validity (schema version, size, etc.) =="
for f in $(fd -i 'meta.json' Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno); do
echo "--- $f ---"
jq -r '.version, .size, (.states|length)' "$f" 2>&1 || echo "INVALID JSON"
done
echo
echo "== Check entity prototypes referencing HumanoidXeno for sprite layer setups =="
rg -n -C5 'HumanoidXeno' Resources/Prototypes/_Arcane/Entities/Mobs --glob '*.yml' | head -150
echo
echo "== Check YAML markings for consistent bodyPart/markingCategory/sprite paths =="
cat Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.ymlLength of output: 40783 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== List actual files in rsi dirs for ren_* states =="
fd -i 'ren_' Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno
echo
echo "== File sizes/types for ren_* pngs =="
for f in $(fd -i 'ren_.*\.png$' Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno); do
echo "--- $f ---"
file "$f"
ls -la "$f"
done
echo
echo "== Try to read actual pixel dimensions with python (Pillow) =="
pip install --quiet pillow 2>/dev/null || true
python3 - <<'EOF'
import glob
try:
from PIL import Image
except ImportError:
print("Pillow not available")
raise SystemExit(0)
for f in glob.glob("Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/*.rsi/ren_*.png"):
try:
im = Image.open(f)
print(f, im.size, im.mode)
except Exception as e:
print(f, "ERROR", e)
EOF
echo
echo "== Check git history / diff stats for these png files (are they actual new binary or empty stub) =="
git log --oneline -1 -- Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/ren_head.png || true
git show --stat HEAD -- Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno 2>/dev/null | head -50 || true
echo
echo "== Check size field in meta.json vs actual sprite bodyPart usage in entity/species prototype (layer keys) =="
rg -n -C5 'HumanoidXeno' Resources/Prototypes/_Arcane/Entities/Mobs/Player/humanoid_xeno.yml 2>/dev/null || fd -i 'humanoid_xeno' Resources/Prototypes/_Arcane/Entities/Mobs/Player 2>/dev/null
echo
echo "== Search species prototype for HumanoidXeno base layers referencing head/tail/tracheas rsi =="
rg -n -C3 'HumanoidXeno' Resources/Prototypes/_Arcane/Species 2>/dev/null || fd -i 'species' Resources/Prototypes/_Arcane
echo
echo "== Check for other markings possibly referencing non-existent states now (sanity re-check) =="
python3 - <<'EOF'
import re, json, os
yml_path = "Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.yml"
with open(yml_path) as f:
content = f.read()
# extract sprite/state pairs naively
entries = re.findall(r'sprite:\s*(\S+)\s*\n\s*state:\s*(\S+)', content)
rsi_cache = {}
for sprite, state in entries:
if not sprite.startswith("_Arcane"):
continue
rsi_dir = os.path.join("Resources/Textures", sprite)
if rsi_dir not in rsi_cache:
meta_path = os.path.join(rsi_dir, "meta.json")
if os.path.exists(meta_path):
with open(meta_path) as mf:
meta = json.load(mf)
rsi_cache[rsi_dir] = set(s.get("name") for s in meta.get("states", []))
else:
rsi_cache[rsi_dir] = None
states = rsi_cache[rsi_dir]
if states is None:
continue
if state not in states:
print(f"MISSING STATE: {sprite} -> {state}")
EOFLength of output: 3658 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== File sizes for ren_* pngs =="
for f in $(fd -i 'ren_.*\.png$' Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno); do
ls -la "$f"
head -c 16 "$f" | xxd | head -3
echo "---"
done
echo
echo "== Try to read actual pixel dimensions with python (Pillow) =="
pip install --quiet pillow 2>/dev/null || true
python3 - <<'EOF'
import glob
try:
from PIL import Image
except ImportError:
print("Pillow not available")
raise SystemExit(0)
for f in glob.glob("Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/*.rsi/ren_*.png"):
try:
im = Image.open(f)
im.verify()
print(f, im.size, im.mode)
except Exception as e:
print(f, "ERROR", e)
EOF
echo
echo "== Compare pixel size of ren_* png vs meta.json declared size (32x32) and vs other same-category pngs =="
python3 - <<'EOF'
import glob, os
from PIL import Image
groups = {
"head.rsi": ["ren_head.png", "worker_head.png"],
"tail.rsi": ["ren_tail.png", "neomorph_tail.png"],
"tracheas.rsi": ["ren_tubes.png", "neomorph_tubes.png"],
}
base = "Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno"
for rsi, files in groups.items():
for fn in files:
p = os.path.join(base, rsi, fn)
if os.path.exists(p):
im = Image.open(p)
print(p, im.size, im.mode, "frames" if hasattr(im,'n_frames') else "")
else:
print(p, "MISSING")
EOF
echo
echo "== Check species prototype dir for HumanoidXeno layers =="
fd -i 'humanoidxeno' Resources/Prototypes/_Arcane --type f | grep -iv Markings | grep -iv Customization
echo
echo "== Search for BaseSprite/layers config referencing head.rsi/tail.rsi directly (non-marking) =="
rg -n -C3 'Customization/HumanoidXeno/(head|tail|tracheas)\.rsi' Resources/Prototypes/_Arcane --glob '!*Markings*'Length of output: 2364 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== File sizes for ren_* pngs =="
for f in $(fd -i 'ren_.*\.png$' Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno); do
ls -la "$f"
od -An -tx1 -N16 "$f" || true
echo "---"
done
echo
echo "== Try to read actual pixel dimensions with python (Pillow) =="
pip install --quiet pillow 2>/dev/null || true
python3 - <<'EOF'
import glob
try:
from PIL import Image
except ImportError:
print("Pillow not available")
raise SystemExit(0)
for f in glob.glob("Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/*.rsi/ren_*.png"):
try:
im = Image.open(f)
im.verify()
print(f, im.size, im.mode)
except Exception as e:
print(f, "ERROR", e)
EOF
echo
echo "== Compare pixel size of ren_* png vs meta.json declared size (32x32) and vs other same-category pngs =="
python3 - <<'EOF'
import glob, os
try:
from PIL import Image
except ImportError:
raise SystemExit(0)
groups = {
"head.rsi": ["ren_head.png", "worker_head.png"],
"tail.rsi": ["ren_tail.png", "neomorph_tail.png"],
"tracheas.rsi": ["ren_tubes.png", "neomorph_tubes.png"],
}
base = "Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno"
for rsi, files in groups.items():
for fn in files:
p = os.path.join(base, rsi, fn)
if os.path.exists(p):
im = Image.open(p)
print(p, im.size, im.mode)
else:
print(p, "MISSING")
EOF
echo
echo "== Check species prototype dir for HumanoidXeno layers =="
fd -i 'humanoidxeno' Resources/Prototypes/_Arcane --type f | grep -iv Markings | grep -iv Customization || true
echo
echo "== Search for BaseSprite/layers config referencing head.rsi/tail.rsi directly (non-marking) =="
rg -n -C3 'Customization/HumanoidXeno/(head|tail|tracheas)\.rsi' Resources/Prototypes/_Arcane --glob '!*Markings*' || trueLength of output: 4046
Что проверил:
Вывод: на уровне того, что я могу проверить статически (YAML/RSI/PNG/C#), причины прозрачности сейчас не видно — ресурсы консистентны. Что стоит проверить дальше (у меня нет доступа к раннему серверу/клиенту, поэтому нужны логи):
Если можешь — пришли текст ошибки/exception из лога (клиент или сервер), это даст точную причину, а не догадки. (・_・?) |
|
@coderabbitai система вайтлиста для маркингов рабочая? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== IsMarkingAllowed usages =="
rg -n -C2 --glob '!**/bin/**' --glob '!**/obj/**' '\bIsMarkingAllowed\s*\(' Content.Shared Content.Client Content.Server || echo "NONE FOUND"
echo
echo "== Whitelist field usages outside definition =="
rg -n -C2 --glob '!**/bin/**' --glob '!**/obj/**' '\.Whitelist\b' Content.Shared Content.Client Content.Server || echo "NONE FOUND"
echo
echo "== Current MarkingWhitelistManager.cs content =="
fd -i 'MarkingWhitelistManager.cs' Content.Shared Content.Client 2>/dev/null | xargs -I{} sh -c 'echo "--- {} ---"; cat "{}"'
echo
echo "== Check MarkingPicker/SingleMarkingPicker for whitelist filtering calls =="
rg -n -C3 'Whitelist' Content.Client/Humanoid/MarkingPicker.xaml.cs Content.Client/Humanoid/SingleMarkingPicker.xaml.cs 2>/dev/null || echo "NO REFS IN PICKERS"
echo
echo "== Check server-side profile validation for markings =="
rg -n -C3 'MarkingWhitelist|IsMarkingAllowed' Content.Server 2>/dev/null || echo "NO SERVER USAGE"Length of output: 186526
Факт по коду:
Итог: любой маркинг с Что нужно сделать для рабочей системы:
Пока эти два пункта не сделаны, (・_・;) ✏️ Learnings added
|
|
@coderabbitai что нужно сделать, чтобы вайтлист работал? |
|
Tip For best results, initiate chat on the files or code changes.
1. Client — фильтрация в пикерах
if (!MarkingWhitelistManager.IsMarkingAllowed(marking, _playerManager.LocalSession))
continue;Это скроет маркинг из выбора для пользователей не из 2. Server — обязательная валидация профиляБез этого шага фильтр — чисто косметика, обходится модклиентом/прямой правкой запроса. Нужно найти точку приёма/сохранения foreach (var markingId in profile.Appearance.Markings.ToList())
{
if (!_prototypeManager.TryIndex<MarkingPrototype>(markingId.MarkingId, out var proto))
continue;
if (!MarkingWhitelistManager.IsMarkingAllowed(proto, session))
profile.Appearance.Markings.Remove(markingId); // либо reject профиль
}Без серверной проверки любой игрок может применить whitelisted-маркинг напрямую, минуя UI. 3. Волосы/борода — отдельно, если тоже нужно ограничить
Итог: пока не добавлены оба вызова Хочешь, заведу отдельный follow-up issue на подключение серверной валидации, чтобы не потерялось после мержа этого PR? ( •_•)>⌐■-■ |
|
@coderabbitai какие библиотеки требуется добавить в указанные файлы? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== MarkingWhitelistManager.cs usings =="
sed -n '1,15p' Content.Shared/_Arcane/MarkingWhitelistManager.cs
echo
echo "== MarkingPicker.xaml.cs usings =="
sed -n '1,25p' Content.Client/Humanoid/MarkingPicker.xaml.cs
echo
echo "== SingleMarkingPicker.xaml.cs usings =="
sed -n '1,25p' Content.Client/Humanoid/SingleMarkingPicker.xaml.cs
echo
echo "== Search for IPlayerManager / LocalSession usage patterns in client =="
rg -n 'IPlayerManager|LocalSession|LocalPlayer' Content.Client/Humanoid/MarkingPicker.xaml.cs Content.Client/Humanoid/SingleMarkingPicker.xaml.cs Content.Client/_Arcane 2>/dev/null || echo "NONE"
echo
echo "== Find ICommonSession namespace =="
rg -n 'using Robust.Shared.Player' Content.Shared Content.Client -g '*.cs' | head -5
echo
echo "== Search server-side profile validation entry points for using hints =="
rg -n 'class HumanoidCharacterProfile' -A5 Content.Shared 2>/dev/null | head -20
rg -n 'HumanoidCharacterProfile' Content.Server --glob '*.cs' -l | head -10Length of output: 6057
|
|
@coderabbitai файлы работают неправильно. почему и как это исправить? |
|
Tip For best results, initiate chat on the files or code changes.
Без текста ошибки или конкретного симптома гадать бессмысленно. По текущему состоянию PR
Если проблема именно в этом — смотри мой предыдущий ответ с конкретным планом подключения (client filter + server validation). Если проблема другая (например, конкретное исключение при заходе на сервер) — пришли текст ошибки или укажи файл, тогда разберу точечно. ( ・_・)? |
There was a problem hiding this comment.
Actionable comments posted: 4
🤖 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.Client/Humanoid/MarkingPicker.xaml.cs`:
- Around line 185-189: Keep the IsMarkingAllowed check in MarkingPicker as
presentation-only, and add authoritative server-side validation in the profile
save/apply path so disallowed markings cannot be persisted or applied through
alternate paths. Reuse the existing marking whitelist and player/session
validation symbols where available, while preserving the UI filter.
- Around line 185-189: Remove both Arcane whitelist blocks from
SetupCategoryButtons, including the invalid marking/session check and continue
outside the loop. Apply the marking whitelist filter in Populate inside the
foreach (var marking in sortedMarkings) loop, using the current marking before
adding it to the list.
In `@Content.Client/Humanoid/SingleMarkingPicker.xaml.cs`:
- Around line 315-320: Перенеси получение session и проверку
MarkingWhitelistManager.IsMarkingAllowed(marking, session) внутрь цикла foreach
метода PopulateList, чтобы marking и continue находились в корректной области
видимости. Добавь зависимость IPlayerManager в SingleMarkingPicker через
существующий механизм DI и используй её для получения LocalSession.
In `@Content.Shared/Preferences/HumanoidCharacterProfile.cs`:
- Around line 1300-1309: Перенеси блок фильтрации markings из тела класса в
метод EnsureValid(ICommonSession session, IDependencyCollection collection),
используя доступные там session и IPrototypeManager. Удали foreach после
закрывающей скобки Clone(), а в EnsureValid сохрани проверку MarkingPrototype и
удаление запрещённых элементов через MarkingWhitelistManager.IsMarkingAllowed.
🪄 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: cc449b1a-001f-47e8-9717-8df06ae832ab
📒 Files selected for processing (4)
Content.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.csContent.Shared/Preferences/HumanoidCharacterProfile.csResources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json
💤 Files with no reviewable changes (1)
- Resources/Textures/_Arcane/Mobs/Customization/HumanoidXeno/head.rsi/meta.json
📜 Review details
🧰 Additional context used
📓 Path-based instructions (12)
**/*.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/Preferences/HumanoidCharacterProfile.csContent.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.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/Preferences/HumanoidCharacterProfile.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/Preferences/HumanoidCharacterProfile.csContent.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.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/Preferences/HumanoidCharacterProfile.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/Preferences/HumanoidCharacterProfile.csContent.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.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/Preferences/HumanoidCharacterProfile.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/Preferences/HumanoidCharacterProfile.cs
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.{cs,xaml}
📄 CodeRabbit inference engine (.cursor/rules/ss14-ui.mdc)
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.{cs,xaml}: Follow SS14 naming conventions when editing UI, XAML, and client-state files
Maintain upstream compatibility when editing SS14 client code
Follow SS14 UI and BUI conventions when implementing UI components and behavior-driven user interfaces
Files:
Content.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.cs
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.cs
📄 CodeRabbit inference engine (.cursor/rules/ss14-ui.mdc)
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.cs: Apply SS14 prediction patterns when working with predicted client-state in SS14 client code
Follow SS14 localization code practices in UI and client-state implementationsPut main client-only visuals, overlays, XAML, and BUI front-ends in
Content.Client/; useContent.Goobstation.Client/orContent.Goobstation.UIKit/only when matching existing references and ownership.
Files:
Content.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.cs
{Content.Client,Content.Goobstation.Client,Content.Goobstation.UIKit}/**/*.{xaml,xaml.cs}
📄 CodeRabbit inference engine (.cursor/rules/ss14-ui.mdc)
Use proper localization strings in SS14 client XAML and UI code
Files:
Content.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.cs
**/*.xaml{,.cs}
📄 CodeRabbit inference engine (AGENTS.md)
**/*.xaml{,.cs}: If the task edits XAML windows, controls, code-behind, or client UI layout, load skillss14-ui-xaml.
Keep.xamlpaired with.xaml.csand the relevant BUI/client system.
Files:
Content.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.cs
Content.Client/**/*.cs
⚙️ CodeRabbit configuration file
Content.Client/**/*.cs: Review Content.Client for presentation-only behavior:
- Keep authority out of the client.
- Prefer reading already-networked component state instead of duplicating BUI state unless the pattern requires it.
- Flag missing localization for player-visible text.
- Prefer nearby established UI and visual patterns over custom one-off structures.
Files:
Content.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.cs
🧠 Learnings (5)
📚 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/Preferences/HumanoidCharacterProfile.csContent.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.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/Preferences/HumanoidCharacterProfile.csContent.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.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/Preferences/HumanoidCharacterProfile.csContent.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.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/Preferences/HumanoidCharacterProfile.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/Preferences/HumanoidCharacterProfile.csContent.Client/Humanoid/MarkingPicker.xaml.csContent.Client/Humanoid/SingleMarkingPicker.xaml.cs
|
@coderabbitai сделал, как ты сказал, но файлы в vscode всё равно горят красным. проверь на ошибки |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== MarkingPrototype.cs =="
fd 'MarkingPrototype.cs' Content.Shared | xargs -I{} sh -c 'echo "--- {} ---"; cat -n "{}"'
echo
echo "== MarkingWhitelistManager.cs / MarkingWhitelistData.cs =="
fd -i 'MarkingWhitelist' Content.Shared Content.Client 2>/dev/null | xargs -I{} sh -c 'echo "--- {} ---"; cat -n "{}"'
echo
echo "== MarkingPicker.xaml.cs (full) =="
cat -n Content.Client/Humanoid/MarkingPicker.xaml.cs
echo
echo "== SingleMarkingPicker.xaml.cs (full) =="
cat -n Content.Client/Humanoid/SingleMarkingPicker.xaml.cs
echo
echo "== HumanoidCharacterProfile.cs relevant section =="
rg -n -B5 -A20 'Whitelist|MarkingWhitelistManager' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo
echo "== Check for IPlayerManager dependency injection style across client codebase =="
rg -n 'IoCManager.Resolve<IPlayerManager>|\[Dependency\].*IPlayerManager' Content.Client -g '*.cs' | head -10
echo
echo "== Check LocalSession vs LocalPlayer usage across codebase (RT version hint) =="
rg -n '_playerManager\.LocalSession|_playerManager\.LocalPlayer' Content.Client -g '*.cs' | head -20
echo
echo "== Check ICommonSession namespace used in Shared HumanoidCharacterProfile.cs =="
sed -n '1,30p' Content.Shared/Preferences/HumanoidCharacterProfile.csLength of output: 52052 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== HumanoidCharacterProfile.cs context around lines 1060-1130 =="
sed -n '1060,1130p' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo
echo "== Check method signature enclosing this block (search backwards for method start) =="
awk 'NR>=1000 && NR<=1125' Content.Shared/Preferences/HumanoidCharacterProfile.cs | grep -n 'public\|private\|static\|void\|EnsureValid'
echo
echo "== Check brace balance in file =="
python3 - <<'EOF'
path = "Content.Shared/Preferences/HumanoidCharacterProfile.cs"
depth = 0
with open(path) as f:
for i, line in enumerate(f, 1):
for ch in line:
if ch == '{':
depth += 1
elif ch == '}':
depth -= 1
if 1100 <= i <= 1130:
print(i, depth, line.rstrip())
EOFLength of output: 5159
1.
|
|
@coderabbitai нужны ли ещё какие-то библиотеки? есть ли ошибки? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== MarkingPicker.xaml.cs full =="
cat -n Content.Client/Humanoid/MarkingPicker.xaml.cs
echo
echo "== SingleMarkingPicker.xaml.cs full =="
cat -n Content.Client/Humanoid/SingleMarkingPicker.xaml.cs
echo
echo "== HumanoidCharacterProfile.cs around whitelist block =="
rg -n -B10 -A15 'MarkingWhitelistManager|Arcane' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo
echo "== Check usings at top of files =="
sed -n '1,30p' Content.Client/Humanoid/MarkingPicker.xaml.cs
echo "---"
sed -n '1,30p' Content.Client/Humanoid/SingleMarkingPicker.xaml.cs
echo "---"
sed -n '1,30p' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo
echo "== Check IPlayerManager field declarations =="
rg -n 'IPlayerManager|_playerManager' Content.Client/Humanoid/MarkingPicker.xaml.cs Content.Client/Humanoid/SingleMarkingPicker.xaml.cs
echo
echo "== Check MarkingWhitelistManager.cs current namespace/content =="
fd -i 'MarkingWhitelist' Content.Shared Content.Client 2>/dev/null | xargs -I{} sh -c 'echo "--- {} ---"; cat -n "{}"'
echo
echo "== Check ICommonSession/session param in HumanoidCharacterProfile EnsureValid method signature =="
rg -n 'EnsureValid|ICommonSession' Content.Shared/Preferences/HumanoidCharacterProfile.cs | head -30Length of output: 57606
1. Ошибка:
|
|
@coderabbitai файлы в vscode всё ещё красные |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== MarkingPicker.xaml.cs full =="
cat -n Content.Client/Humanoid/MarkingPicker.xaml.cs
echo
echo "== SingleMarkingPicker.xaml.cs full =="
cat -n Content.Client/Humanoid/SingleMarkingPicker.xaml.cs
echo
echo "== HumanoidCharacterProfile.cs usings + whitelist block =="
sed -n '1,90p' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo "---"
rg -n -B10 -A15 'MarkingWhitelistManager|Arcane' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo
echo "== MarkingWhitelistManager.cs / MarkingWhitelistData.cs =="
fd -i 'MarkingWhitelist' Content.Shared Content.Client 2>/dev/null | xargs -I{} sh -c 'echo "--- {} ---"; cat -n "{}"'
echo
echo "== Brace balance checks =="
python3 - <<'EOF'
for path in [
"Content.Client/Humanoid/MarkingPicker.xaml.cs",
"Content.Client/Humanoid/SingleMarkingPicker.xaml.cs",
"Content.Shared/Preferences/HumanoidCharacterProfile.cs",
]:
depth = 0
with open(path) as f:
for i, line in enumerate(f, 1):
for ch in line:
if ch == '{':
depth += 1
elif ch == '}':
depth -= 1
print(path, "final depth:", depth)
EOFLength of output: 56380
Проблема 1 — мёртвый блок в
|
|
@coderabbitai MarkingPicker: The name 'marking' does not exist in the current context. что делать? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== MarkingPicker.xaml.cs full =="
cat -n Content.Client/Humanoid/MarkingPicker.xaml.csLength of output: 23931
|
|
@coderabbitai HumanoidCharacterProfile: The type or namespace name 'MarkingPrototype' could not be found (are you missing a using directive or an assembly reference?). Что делать? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== HumanoidCharacterProfile.cs top usings =="
sed -n '1,90p' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo
echo "== Check MarkingPrototype namespace =="
rg -n 'namespace' Content.Shared/Humanoid/Markings/MarkingPrototype.cs
echo
echo "== Check current whitelist block in HumanoidCharacterProfile.cs =="
rg -n -B5 -A15 'MarkingWhitelistManager|Arcane' Content.Shared/Preferences/HumanoidCharacterProfile.csLength of output: 16658
Тип Фикс — добавь в блок usings: using Content.Shared.Humanoid.Markings;Например, рядом с существующим Arcane-блоком (Line 72-74): using Content.Shared.Humanoid.Markings;
// Arcane - Start
using Content.Shared._Arcane.SpecialWhitelist;
// Arcane - EndПосле этого Кстати ( ̄ω ̄) |
|
@coderabbitai теперь система рабочая? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== MarkingPicker.xaml.cs =="
cat -n Content.Client/Humanoid/MarkingPicker.xaml.cs
echo
echo "== SingleMarkingPicker.xaml.cs =="
cat -n Content.Client/Humanoid/SingleMarkingPicker.xaml.cs
echo
echo "== HumanoidCharacterProfile.cs usings + whitelist block =="
sed -n '1,90p' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo "---"
rg -n -B10 -A15 'MarkingWhitelistManager|Arcane' Content.Shared/Preferences/HumanoidCharacterProfile.cs
echo
echo "== Brace balance checks =="
python3 - <<'EOF'
for path in [
"Content.Client/Humanoid/MarkingPicker.xaml.cs",
"Content.Client/Humanoid/SingleMarkingPicker.xaml.cs",
"Content.Shared/Preferences/HumanoidCharacterProfile.cs",
]:
depth = 0
with open(path) as f:
for i, line in enumerate(f, 1):
for ch in line:
if ch == '{':
depth += 1
elif ch == '}':
depth -= 1
print(path, "final depth:", depth)
EOF
echo
echo "== IsMarkingAllowed usages =="
rg -n -C2 'IsMarkingAllowed\(' Content.Shared Content.Client Content.Server || echo "NONE"Length of output: 56415 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== IPlayerManager LocalSession check =="
rg -n 'LocalSession' Content.Client -g '*.cs' | head -5
echo
echo "== Marking struct / MarkingId field check =="
rg -n 'MarkingId' Content.Shared/Humanoid/Markings/Marking.cs
echo
echo "== HairMarking / Appearance.Markings type =="
rg -n 'public.*Markings' Content.Shared/Humanoid/Markings/MarkingSet.cs Content.Shared/Humanoid/HumanoidCharacterAppearance.cs 2>/dev/null
echo
echo "== MarkingWhitelistManager.cs full =="
cat -n Content.Shared/_Arcane/MarkingWhitelistManager.cs
echo
echo "== MarkingPrototype.cs Whitelist field =="
rg -n -B3 -A3 'Whitelist' Content.Shared/Humanoid/Markings/MarkingPrototype.csLength of output: 2442 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== MarkingWhitelistManager.cs full =="
cat -n Content.Shared/_Arcane/MarkingWhitelistManager.cs || echo "FILE NOT FOUND"
echo
echo "== find whitelist files =="
fd -i whitelist Content.Shared
echo
echo "== MarkingPrototype.cs Whitelist field =="
grep -n -B3 -A3 'Whitelist' Content.Shared/Humanoid/Markings/MarkingPrototype.cs || echo "no match"Length of output: 3004
Проверил все три точки интеграции:
Дополнительно подтвердил:
Итог: компиляция должна проходить, и теперь Остаточные ограничения (не блокеры, но учти):
Рекомендую протестировать: зайти под ckey не из (^▽^) |
|
@coderabbitai и как тогда человек, который должен использовать эти маркинги, получит их, если по сикею не получится? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "== whitelist allowed values in humanoid_xeno.yml =="
rg -n -B3 -A3 'whitelist' Resources/Prototypes/_Arcane/Entities/Mobs/Customization/Markings/humanoid_xeno.ymlLength of output: 906
Сейчас в whitelist:
allowed:
- Bulbo44keyТ.е. человек, которому эти маркинги предназначены (Бульба), получит их только если его реальный ckey совпадает буквально с Что нужно сделать:
Важно: раз проверка теперь и серверная (в ヽ(・_・;)ノ |




Описание PR
Делаю личную кастомку на ксено для Бульбы. ПР ещё не доделан...буду дрочить кролика.
Медиа
Тип PR