[Tweak] D.O.O.R 2.0 pt. 1#9
Conversation
* Update ``DoorComponent`` to use TimeSpans and fix comments (#40420) Cleanup * Fix emag sparking animation on doors (#40350) * Fix * Update * Comment * fix: allow opening doors with open wire panels (#38733) * fix: allow opening doors with open wire panels * fix: set wire panel sprite state on airlock close * fix: make airlock wire panels animate better * removed unused dependency --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> * Port door animation fix from ephemeral space (#43613) * port ES animation fix * close sound too :) * pump up the jam * worlds most minor sloptimization * silly --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> * time animations * sounds * another time for WINDOORs from TG13 * 1.1 * 1.2 BUGFIX fix door desynchronization * Minor door animation tweak (#43708) is this bad * Cherry-pick additions * 2 NEW sound for blastdoor * 3 Best firelock upgrade * 3.1 * 3.2 * 4. Sound for FORCE OPEN * 4,1 fix * 4,2 fix * 5. Sound for FIRELOCKs * 5.1 * BUNCH OF FIXES: START * FIX * Update SharedDoorSystem.cs * FIX * FIX DOUBLE DOORS * Fix * DOOR FIX * Final sprite UPGRADE * Final firelock sound UPGRADE * FIX JITTERING. Removed small part of wizden code for optimization * AA * Revert "AA" This reverts commit 25976e100e8b35393a0552e9eee37b679f3c54f8. * Reapply "AA" This reverts commit 7c24bfbddbeeba3052064eafd9191ebadd8b6c83. --------- Co-authored-by: Winkarst-cpu <74284083+Winkarst-cpu@users.noreply.github.com> Co-authored-by: Perry Fraser <perryprog@users.noreply.github.com> Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Co-authored-by: Jessica M <jessica@jessicamaybe.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughDoor and airlock systems now use separate animation keys, final-state synchronization, force-open/close audio overrides, alternative wires-panel verbs, updated prototypes, access-reader synchronization, and revised door animation metadata. ChangesDoor and airlock behavior
Estimated code review effort: 5 (Critical) | ~120 minutes Suggested labels: 🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 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 Это порт моих наработок со старого билда на .NET 9, а не 10. Из-за вмешательства разработчиков Старлайта в данные системы, появилась огромная кучка ошибок, некоторые из которых пофиксил, но остальная часть всё равно осталась. Отправлю сюда. И куда-то пропал доафтер. Кучка данных ошибок и в Door/Airlock/WiresSystem. |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -e
echo "=== Searching for DoorComponent definitions ==="
rg -n "class DoorComponent" --type=cs -C2
echo "=== Searching for [RegisterComponent] near DoorComponent ==="
rg -n "RegisterComponent" -B2 -A1 --type=cs | rg -n "Door" -B3
echo "=== Searching for DoAfter namespace/types ==="
fd -i "doafter" --type f
echo "=== Searching for ActiveDoAfterComponent / DoAfterComponent ==="
rg -n "class ActiveDoAfterComponent|class DoAfterComponent" --type=cs
echo "=== Searching for SharedAirlockSystem ==="
rg -n "class SharedAirlockSystem" --type=cs -C2
echo "=== AirlockSystem.cs location and usings ==="
fd -i "airlocksystem.cs"Length of output: 1000 🏁 Script executed: #!/bin/bash
echo "=== Repo root structure ==="
ls
echo "=== Find Content.Shared / Content.Server dirs ==="
fd -t d "Content" -d 2
echo "=== Search DoorComponent (any case) ==="
rg -n "DoorComponent" --type=cs | head -50
echo "=== Search RegisterComponentAttribute usage near Door ==="
rg -n "\[RegisterComponent\]" --type=cs -A2 | rg -n "Door" -B2
echo "=== DoAfter related files ==="
fd -i "doafter"
echo "=== SharedAirlockSystem ==="
rg -n "SharedAirlockSystem" --type=cs | head -30
echo "=== AirlockSystem.cs files ==="
fd -i "airlock" -e cs
echo "=== check git log / branch ==="
git log --oneline -5
git statusLength of output: 2152 🏁 Script executed: #!/bin/bash
echo "=== fd for Doors directories ==="
fd -t d -i "doors"
echo "=== fd for files named *Door*.cs ==="
fd -i "door" -e cs | head -80
echo "=== rg case-insensitive DoorComponent no type filter ==="
rg -ni "class DoorComponent" | head -50
echo "=== rg RegisterComponent with Door context (no type filter) ==="
rg -n "RegisterComponent" -A2 | grep -i "door" -B2 | head -80
echo "=== PR diff files touched ==="
git diff --name-only origin/main...HEAD 2>/dev/null | head -100 || git diff --name-only HEAD~20 2>/dev/null | head -100
echo "=== current branch ==="
git branch -a | head -20
git log --oneline -10Length of output: 3348 🏁 Script executed: #!/bin/bash
echo "=== DoorComponent.cs content ==="
cat -n Content.Shared/Doors/Components/DoorComponent.cs | head -60
echo "=== grep RegisterComponent Door Content.Shared ==="
grep -rn "RegisterComponent" Content.Shared/Doors/ 2>/dev/null
echo "=== Search for duplicate Door component registrations across repo (any file with class named ...DoorComponent registered as 'Door') ==="
grep -rn "\[RegisterComponent\]" -A3 Content.Shared Content.Server Content.Client 2>/dev/null | grep -B3 "class DoorComponent"
echo "=== Find any _Starlight Door component files ==="
fd -i "doorcomponent" -e cs
echo "=== DoAfter directories ==="
fd -t d -i "doafter"
fd -i "doafter" -e cs | head -50
echo "=== Airlock related files ==="
fd -i "airlock" -e cs
fd -i "airlockcomponent" -e csLength of output: 7844 🏁 Script executed: #!/bin/bash
echo "=== git info ==="
git log --oneline -5
git branch -a
git remote -v
echo "=== search RegisterClass / RegisterClassFunction for Door ==="
rg -n "RegisterClass" -A2 | rg -i "door" -B2
echo "=== check for duplicate csproj includes that might double-compile a file ==="
fd -e csproj | xargs grep -l "DoorComponent" 2>/dev/null
echo "=== search any [ComponentProtoName(\"Door\")] usage ==="
rg -n "ComponentProtoName"
echo "=== search for any other class with 'Door' component name explicitly set ==="
rg -n "\"Door\"" --type=cs | rg -i "component"Length of output: 1385 🏁 Script executed: #!/bin/bash
echo "=== Content.Server/Doors/Systems/AirlockSystem.cs ==="
cat -n Content.Server/Doors/Systems/AirlockSystem.cs | head -80
echo "=== Content.Shared/Doors/Systems/SharedAirlockSystem.cs head ==="
cat -n Content.Shared/Doors/Systems/SharedAirlockSystem.cs | head -60
echo "=== WiresSystem files related to Door ==="
fd -i "wiressystem" -e csLength of output: 6094 🏁 Script executed: #!/bin/bash
echo "=== global.json ==="
cat global.json
echo "=== RobustToolbox submodule info ==="
git submodule status 2>/dev/null
cat .gitmodules 2>/dev/null
echo "=== check for stray/backup duplicate files ==="
fd -i "door" | rg -iv "\.(cs|yml|png|ftl|rsi)$"
echo "=== .gitignore for obj/bin ==="
grep -n "obj/\|bin/" .gitignore 2>/dev/nullLength of output: 4372
1. В самом дереве исходников всё в порядке
2. Что нашёл подозрительное
Поскольку вы упомянули, что портировали наработки со старого билда на .NET 9, а не 10 — вероятная причина всех этих ошибок ( Дублирующаяся регистрация компонента
А "потерявшиеся" типы Что стоит проверить перед дальнейшим фиксом кода:
Если после синхронизации сабмодуля и чистой пересборки ошибки останутся именно в коде (а не в окружении) — присылайте конкретные файлы/строки, разберу подробнее. ✅ Action performedReview finished.
|
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml (1)
209-230: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick winMerge duplicate
Doorcomponent definitions.The
BananiumDoorprototype defines- type: Doortwice in the samecomponentssequence. RobustToolbox prohibits duplicate component types within the same entity definition, which will lead to a prototype load error. The new timing configurations should be merged into the existingDoordefinition.🐛 Proposed fix
- type: Door + # Orion-Start + closeTimeOne: 0.1 + closeTimeTwo: 0.2 + openTimeOne: 0.2 + openTimeTwo: 0.1 + openingAnimationTime: 0.6 + closingAnimationTime: 0.6 + # Orion-End openSound: &BikeHornSound collection: BikeHorn params: variation: 0.125 closeSound: *BikeHornSound - type: Construction graph: DoorGraph node: bananiumDoor - - type: Door - # Orion-Start - closeTimeOne: 0.1 - closeTimeTwo: 0.2 - openTimeOne: 0.2 - openTimeTwo: 0.1 - openingAnimationTime: 0.6 - closingAnimationTime: 0.6 - # Orion-End - openSound: - path: /Audio/Items/bikehorn.ogg - closeSound: - path: /Audio/Items/bikehorn.ogg🤖 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/Entities/Structures/Doors/MaterialDoors/material_doors.yml` around lines 209 - 230, Merge the duplicate Door component definitions in the BananiumDoor prototype into one component, preserving the existing BikeHorn sound settings and incorporating the Orion timing fields (closeTimeOne, closeTimeTwo, openTimeOne, openTimeTwo, openingAnimationTime, and closingAnimationTime). Remove the second Door declaration while keeping the Construction component unchanged.Resources/Textures/Structures/Doors/Airlocks/Glass/glass.rsi/meta.json (1)
58-99: 🎯 Functional Correctness | 🔴 Critical | ⚡ Quick winResolve Git merge conflict markers.
The file contains unresolved Git merge conflict markers, which invalidates the JSON structure and will cause the asset loader to fail.
🐛 Proposed fix to remove merge conflict markers
-<<<<<<< HEAD - -======= "name": "closing-fill",(and remove the trailing
>>>>>>> 08b658b6e49 ([Tweak] D.O.O.R (#427))marker at the end of the conflicted block)🤖 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/Textures/Structures/Doors/Airlocks/Glass/glass.rsi/meta.json` around lines 58 - 99, Remove the unresolved Git conflict markers surrounding the animation entries in the glass.rsi metadata, including the HEAD separator and trailing commit marker, while preserving the valid closing-fill, closing-glass, and panel_closing JSON entries and restoring valid JSON syntax.
🧹 Nitpick comments (1)
Content.Shared/Wires/SharedWiresSystem.cs (1)
104-118: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueAvoid capturing the
Entity<T>struct in the lambda.Capturing
ent(anEntity<WiresPanelComponent>) inside theActlambda captures the entire struct, which includes the component reference. While verbs are short-lived, it's a good practice to capture only theEntityUidto avoid unintentionally keeping component references alive in closures.♻️ Proposed refactor
private void OnGetVerbs(Entity<WiresPanelComponent> ent, ref GetVerbsEvent<AlternativeVerb> args) { if (!IsPanelOpen(ent.Owner)) return; + var uid = ent.Owner; var actor = args.User; var verb = new AlternativeVerb { Text = Loc.GetString("wires-panel-verb-view-panel"), Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/screwdriver.png")), - Act = () => OpenUserInterface(ent, actor), + Act = () => OpenUserInterface(uid, actor), }; args.Verbs.Add(verb); }🤖 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/Wires/SharedWiresSystem.cs` around lines 104 - 118, Update OnGetVerbs to capture only ent.Owner’s EntityUid before constructing the AlternativeVerb, and have the Act lambda use that UID when calling OpenUserInterface instead of capturing the entire Entity<WiresPanelComponent> ent struct.
🤖 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/Doors/AirlockSystem.cs`:
- Around line 33-40: Update the OpenSpriteStates and ClosedSpriteStates tuple
definitions in DoorComponent to carry an AutoAnimated flag, then update the
airlock registrations in AirlockSystem so the BaseUnlit opening and closing
end-states explicitly disable auto-animation. Ensure DoorSystem uses this flag
when calling LayerSetAutoAnimated, while preserving existing behavior for other
door states.
In `@Content.Client/Doors/DoorSystem.cs`:
- Around line 177-192: Update the DoorState.Opening and DoorState.Closing
branches in the door animation logic to stop the opposite animation key before
calling _animationSystem.Play: stop DoorComponent.CloseKey when opening and
DoorComponent.OpenKey when closing. Preserve the existing zero-duration and
same-key running-animation checks.
In
`@Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml`:
- Around line 96-99: Audio prototype paths use the incorrect _Orion directory;
replace it with _Arcane for both forceOpenSound and forceCloseSound in
Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml
lines 96-99, Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml
lines 84-87,
Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml lines
102-104, and
Resources/Prototypes/Entities/Structures/Doors/Shutter/blast_door.yml lines
28-30.
In
`@Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml`:
- Around line 106-119: Remove the duplicated Construction component and
paper-door-specific configuration from the MetalDoor prototype. In the MetalDoor
entity’s Door component, replace the paperdoor_openclose.ogg sound paths with
the appropriate metal-door sounds, while preserving the Orion timing overrides.
In `@Resources/Textures/Structures/Doors/Airlocks/Glass/glass.rsi/meta.json`:
- Around line 23-31: Remove the unresolved Git conflict markers in the glass.rsi
metadata and retain the valid closed-fill and closed-glass entries within the
JSON array. Ensure the resulting meta.json is valid JSON and preserves the
surrounding metadata structure.
---
Outside diff comments:
In
`@Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml`:
- Around line 209-230: Merge the duplicate Door component definitions in the
BananiumDoor prototype into one component, preserving the existing BikeHorn
sound settings and incorporating the Orion timing fields (closeTimeOne,
closeTimeTwo, openTimeOne, openTimeTwo, openingAnimationTime, and
closingAnimationTime). Remove the second Door declaration while keeping the
Construction component unchanged.
In `@Resources/Textures/Structures/Doors/Airlocks/Glass/glass.rsi/meta.json`:
- Around line 58-99: Remove the unresolved Git conflict markers surrounding the
animation entries in the glass.rsi metadata, including the HEAD separator and
trailing commit marker, while preserving the valid closing-fill, closing-glass,
and panel_closing JSON entries and restoring valid JSON syntax.
---
Nitpick comments:
In `@Content.Shared/Wires/SharedWiresSystem.cs`:
- Around line 104-118: Update OnGetVerbs to capture only ent.Owner’s EntityUid
before constructing the AlternativeVerb, and have the Act lambda use that UID
when calling OpenUserInterface instead of capturing the entire
Entity<WiresPanelComponent> ent struct.
🪄 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: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 855ab2e6-847a-44e1-84d0-d3c418f29257
⛔ Files ignored due to path filters (6)
Resources/Audio/Machines/boltsdown.oggis excluded by!**/*.oggResources/Audio/Machines/boltsup.oggis excluded by!**/*.oggResources/Audio/_Arcane/Machines/airlock_close_force.oggis excluded by!**/*.oggResources/Audio/_Arcane/Machines/airlock_open_force.oggis excluded by!**/*.oggResources/Audio/_Arcane/Machines/blastdoornew.oggis excluded by!**/*.oggResources/Audio/_Arcane/Machines/firedoor_openclose.oggis excluded by!**/*.ogg
📒 Files selected for processing (61)
Content.Client/Doors/AirlockSystem.csContent.Client/Doors/DoorSystem.csContent.Server/Doors/Systems/AirlockSystem.csContent.Server/Wires/WiresSystem.csContent.Shared/Access/Systems/AccessReaderSystem.csContent.Shared/Doors/Components/AirlockComponent.csContent.Shared/Doors/Components/DoorComponent.csContent.Shared/Doors/Systems/SharedDoorSystem.csContent.Shared/Wires/SharedWiresSystem.csResources/Audio/Machines/attributions.ymlResources/Audio/_Arcane/Machines/attributions.ymlResources/Locale/en-US/wires/components/wires-panel-component.ftlResources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.ymlResources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.ymlResources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.ymlResources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.ymlResources/Prototypes/Entities/Structures/Doors/Shutter/blast_door.ymlResources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.ymlResources/Textures/Structures/Doors/Airlocks/Glass/atmospherics.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/basic.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/cargo.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/centcomm.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/chemistry.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/clockwork_pinion.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/command.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/engineering.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/glass.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/hydroponics.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/maint.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/medical.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/salvage.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/science.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/security.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/syndicate.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Glass/virology.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/atmospherics.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/basic.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/cargo.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/centcomm.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/chemistry.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/clockwork_pinion.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/command.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/engineering.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/freezer.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/hatch.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/hatch_maint.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/hydroponics.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/maint.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/medical.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/salvage.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/science.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/security.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/syndicate.rsi/meta.jsonResources/Textures/Structures/Doors/Airlocks/Standard/virology.rsi/meta.jsonResources/Textures/Structures/Doors/MineralDoors/bananium_door.rsi/meta.jsonResources/Textures/Structures/Doors/MineralDoors/paper_door.rsi/meta.jsonResources/Textures/Structures/Doors/edge_door_hazard.rsi/meta.jsonResources/Textures/_Starlight/Structures/Doors/Airlocks/Glass/brigmedic.rsi/meta.jsonResources/Textures/_Starlight/Structures/Doors/Airlocks/Glass/eva.rsi/meta.jsonResources/Textures/_Starlight/Structures/Doors/Airlocks/Glass/mining_cargo.rsi/meta.jsonResources/Textures/_Starlight/Structures/Doors/Airlocks/Glass/paramedic.rsi/meta.json
💤 Files with no reviewable changes (1)
- Content.Server/Doors/Systems/AirlockSystem.cs
|
Тест |
|
@coderabbitai Можешь отправить список того, из-за чего провал нескольких тестов? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== PR checks status ==="
gh pr checks 9 --repo ArcaneSS14/arcane || true
echo "=== PR details ==="
gh pr view 9 --repo ArcaneSS14/arcane --json title,state,statusCheckRollup -q '.statusCheckRollup[] | {name: .name, status: .status, conclusion: .conclusion, detailsUrl: .detailsUrl}' || trueLength of output: 7808 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== Shard 4 failed logs ==="
gh run view --repo ArcaneSS14/arcane --job 87316855732 --log-failed 2>/dev/null | tail -200
echo "=== Shard 6 failed logs ==="
gh run view --repo ArcaneSS14/arcane --job 87316855718 --log-failed 2>/dev/null | tail -200Length of output: 62843 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== Shard 6 full log search for failed tests ==="
gh run view --repo ArcaneSS14/arcane --job 87316855718 --log 2>/dev/null | grep -iE "❌|Failed |FAIL|Error Message|Assert\." | head -100
echo "=== Shard 4 full log search for failures/hangs before crash ==="
gh run view --repo ArcaneSS14/arcane --job 87316855732 --log 2>/dev/null | grep -iE "❌|Failed |hangdump|Blame|inactivity|crashed" | head -100Length of output: 13575 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== Find test file ==="
fd -i "airlock" -e cs Content.IntegrationTests 2>/dev/null
echo "=== grep test names ==="
rg -n "PoweredOpenAirlock_Pry_DoesNotClose|UnpoweredOpenAirlock_Pry_Closes" --type=cs -C5Length of output: 704 🏁 Script executed: #!/bin/bash
set -euo pipefail
cat -n Content.IntegrationTests/Tests/Doors/AirlockPryingTest.csLength of output: 4253 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== OnAfterPry and StartOpening/StartClosing ==="
rg -n "OnAfterPry|StartOpening|StartClosing" -A30 Content.Shared/Doors/Systems/SharedDoorSystem.cs | head -250Length of output: 10417 🏁 Script executed: #!/bin/bash
set -euo pipefail
gh run view --repo ArcaneSS14/arcane --job 87316855718 --log 2>/dev/null | grep -n "Failed PoweredOpenAirlock_Pry_DoesNotClose\|Failed UnpoweredOpenAirlock_Pry_Closes"
echo "---"
gh run view --repo ArcaneSS14/arcane --job 87316855718 --log 2>/dev/null | sed -n '1,99999p' | awk '/Failed PoweredOpenAirlock_Pry_DoesNotClose|Failed UnpoweredOpenAirlock_Pry_Closes/{print NR": "$0; c=NR+40; next} c && NR<=c {print NR": "$0}'Length of output: 40070 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== DoorSystem.cs lines 100-170 ==="
sed -n '90,170p' Content.Client/Doors/DoorSystem.cs
echo "=== DoorComponent.cs OpenSpriteStates/ClosedSpriteStates ==="
rg -n "OpenSpriteStates|ClosedSpriteStates" -A3 -B3 Content.Shared/Doors/Components/DoorComponent.cs
echo "=== AirlockComponent.cs sprite states ==="
rg -n "SpriteState|OpenPanelSpriteState" Content.Shared/Doors/Components/AirlockComponent.cs
echo "=== basic.rsi states list ==="
python3 -c "
import json
d = json.load(open('Resources/Textures/Structures/Doors/Airlocks/Standard/basic.rsi/meta.json'))
for s in d['states']:
print(s['name'])
"Length of output: 5960 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== AirlockSystem.cs OnComponentStartup ==="
rg -n "OnComponentStartup" -A60 Content.Client/Doors/AirlockSystem.cs | head -100Length of output: 3531
Shard 6 — 2 упавших теста, причина найдена точно
Ошибка в обоих случаях одна и та же: Причина цепочки:
Это регрессия, введённая включением Shard 4 — не провал теста, а креш тестхостаЗдесь не было упавших ассертов — процесс Итог: для гарантированного фикса CI нужно решить проблему с ✏️ Learnings added
|
|
@coderabbitai Можешь написать способы решения и поиска проблем. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
python3 - <<'PY'
import json, glob, os, re
# Собираем все airlock-прототипы с openUnlitVisible: true и их sprite (RSI) путь
import subprocess
proto_files = glob.glob("Resources/Prototypes/Entities/Structures/Doors/Airlocks/**/*.yml", recursive=True)
for pf in proto_files:
text = open(pf, encoding="utf-8").read()
if "openUnlitVisible: true" not in text:
continue
print(f"--- {pf} has openUnlitVisible: true ---")
PY
# Для каждого airlock RSI проверяем наличие state "open_unlit" и "closed_unlit"
fd -e json -p "meta.json" Resources/Textures/Structures/Doors/Airlocks | while read -r f; do
python3 - "$f" <<'PY'
import json, sys
f = sys.argv[1]
d = json.load(open(f))
names = {s["name"] for s in d.get("states", [])}
missing = [s for s in ("open_unlit", "closed_unlit") if s not in names]
if missing:
print(f"{f}: missing {missing}")
PY
doneLength of output: 6469 🏁 Script executed: rg -n "does not exist in RSI"Length of output: 338
Ключевой вывод из скрипта
Что это значитЭто не "забыли добавить спрайт в один файл" — это говорит о том, что Отсюда следует, что правильный фикс — не Вариант A (добавлять Рекомендуемый фикс (обновлённый, с учётом новых данных)В
Практически: замените безусловное if (comp.OpenUnlitVisible)
{
door.OpenSpriteStates.Add((DoorVisualLayers.BaseUnlit, comp.OpenSpriteState));
door.ClosedSpriteStates.Add((DoorVisualLayers.BaseUnlit, comp.ClosedSpriteState));
}на добавление только Как перепроверить после фиксаТот же python-скрипт можно превратить в CI-проверку (например, юнит/интеграционный тест или pre-commit хук), который валит билд, если какой-либо Что касается (=`ω´=) похоже, нашлась настоящая корневая причина — дело не в одном файле, а в самой логике ✏️ Learnings added
|
|
@coderabbitai Напиши замену данного кода, пока не за ПК. |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
sed -n '1,80p' Content.Client/Doors/AirlockSystem.csLength of output: 3709
private void OnComponentStartup(EntityUid uid, AirlockComponent comp, ComponentStartup args)
{
// Has to be on component startup because we don't know what order components initialize in and running this before DoorComponent inits _will_ crash.
if (!TryComp<DoorComponent>(uid, out var door))
return;
if (comp.OpenUnlitVisible) // Otherwise there are flashes of the fallback sprite between clicking on the door and the door closing animation starting.
{
// Arcane-Fix: comp.OpenSpriteState (default "open_unlit") is not defined in most airlock RSIs.
// Registering a non-existent RSI state here causes a client-side sprite ERROR when the door opens
// (Content.Client.Doors.DoorSystem.UpdateAppearanceForDoorState), which fails integration tests
// like AirlockPryingTest via RobustToolbox's ReportErrorLogs() teardown check.
// Only add the open state if it actually exists in this entity's RSI; otherwise skip it so the
// BaseUnlit layer simply keeps its last valid state instead of crashing/erroring on transition.
if (TryComp<SpriteComponent>(uid, out var sprite)
&& sprite.LayerMapTryGet(DoorVisualLayers.BaseUnlit, out var baseUnlitLayer)
&& sprite[baseUnlitLayer].Rsi is { } rsi
&& rsi.TryGetState(comp.OpenSpriteState, out _))
{
door.OpenSpriteStates.Add((DoorVisualLayers.BaseUnlit, comp.OpenSpriteState));
}
door.ClosedSpriteStates.Add((DoorVisualLayers.BaseUnlit, comp.ClosedSpriteState));
}
// Arcane-Start
else
{
// Arcane: Register BaseUnlit end-states so DoorSystem.OnAnimationCompleted restores them. Allows removing LayerSetAnimationTime(0) in OnAppearanceChange that caused jitter.
door.OpenSpriteStates.Add((DoorVisualLayers.BaseUnlit, comp.ClosingSpriteState));
door.ClosedSpriteStates.Add((DoorVisualLayers.BaseUnlit, comp.OpeningSpriteState));
}
// Arcane-End
// ... остальной код метода без изменений (OpeningAnimation, ClosingAnimation, DenyingAnimation, panel logic)
}Пояснения:
Когда будете за ПК — дайте знать, помогу применить и, если нужно, пройтись по всем 49 RSI, чтобы решить, где стоит добавить арт, а где оставить как есть. (=`ω´=)゙ ✏️ Learnings added
|
|
@coderabbitai Но вот на && sprite.LayerMapTryGet(DoorVisualLayers.BaseUnlit, out var baseUnlitLayer) |
|
@coderabbitai Ранее вмешивались в |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== Latest commit ==="
git show -s --format='%H%n%s%n%b' HEAD
echo "=== Files changed by latest commit ==="
git show --name-status --format='' HEAD
echo "=== Relevant diff (doors, airlocks, sprites, RSI metadata) ==="
git show --format= HEAD -- \
Content.Client/Doors/AirlockSystem.cs \
Content.Client/Doors/DoorSystem.cs \
Content.Shared/Doors/Components/AirlockComponent.cs \
Content.Shared/Doors/Components/DoorComponent.cs \
Resources/Prototypes/Entities/Structures/Doors \
Resources/Textures/Structures/Doors \
Resources/Textures/_Starlight/Structures/Doors
echo "=== Locate occurrences of 'replace' in latest commit and current relevant code ==="
git show --format= HEAD | rg -n -i -C4 '\breplace\b' || true
rg -n -i -C4 '\breplace\b|OpenUnlitVisible|OpenSpriteState|BaseUnlit' \
Content.Client/Doors/AirlockSystem.cs \
Content.Client/Doors/DoorSystem.cs \
Content.Shared/Doors/Components/AirlockComponent.cs \
Content.Shared/Doors/Components/DoorComponent.cs || trueLength of output: 15526
Оно меняет только видимость слоя (state == DoorState.Closed && comp.OpenUnlitVisible)Но причина падения была в другом месте: (DoorVisualLayers.BaseUnlit, comp.OpenSpriteState)то будет попытка выставить отсутствующий Более того, в текущем блоке нужно обязательно добавить фигурные скобки: сейчас Оставьте if (comp.OpenUnlitVisible)
{
if (TryComp<SpriteComponent>(uid, out var sprite)
&& _sprite.LayerMapTryGet((uid, sprite), DoorVisualLayers.BaseUnlit, out var baseUnlitLayer, false)
&& sprite[baseUnlitLayer] is SpriteComponent.Layer layer
&& layer.ActualRsi is { } rsi
&& rsi.TryGetState(comp.OpenSpriteState, out _))
{
door.OpenSpriteStates.Add((DoorVisualLayers.BaseUnlit, comp.OpenSpriteState));
}
door.ClosedSpriteStates.Add((DoorVisualLayers.BaseUnlit, comp.ClosedSpriteState));
}То есть:
Есть важный визуальный нюанс: после |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 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/Doors/AirlockSystem.cs`:
- Around line 31-37: Add curly braces around the conditional body in the
OpenUnlitVisible handling so both door.OpenSpriteStates.Add and
door.ClosedSpriteStates.Add execute only when all TryComp and sprite-state
checks succeed.
🪄 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: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 0b97b60d-0cb4-4686-bcbb-38f8d42d9125
📒 Files selected for processing (3)
Content.Client/Doors/AirlockSystem.csContent.Shared/Remotes/EntitySystems/SharedDoorRemoteSystem.csResources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml
|
@coderabbitai Имеется лишний код/хардкод в PR? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== PR branch and latest commits ==="
git log --oneline -12
echo "=== Changed files (merge-base to HEAD) ==="
base="$(git merge-base HEAD origin/arcane-dev 2>/dev/null || git merge-base HEAD origin/main 2>/dev/null || true)"
if [ -n "$base" ]; then
git diff --name-status "$base"...HEAD
else
git diff --name-status HEAD~1..HEAD
fi
echo "=== Code diff: door, airlock, wires, remotes ==="
if [ -n "$base" ]; then
git diff --unified=40 "$base"...HEAD -- \
Content.Client/Doors/AirlockSystem.cs \
Content.Client/Doors/DoorSystem.cs \
Content.Server/Doors/Systems/AirlockSystem.cs \
Content.Server/Wires/WiresSystem.cs \
Content.Shared/Doors/Components/AirlockComponent.cs \
Content.Shared/Doors/Components/DoorComponent.cs \
Content.Shared/Doors/Systems/SharedDoorSystem.cs \
Content.Shared/Wires/SharedWiresSystem.cs \
Content.Shared/Remotes/EntitySystems/SharedDoorRemoteSystem.cs \
Resources/Prototypes/Entities/Structures/Doors
else
git show --unified=40 --format= HEAD -- \
Content.Client/Doors/AirlockSystem.cs \
Content.Client/Doors/DoorSystem.cs \
Content.Server/Doors/Systems/AirlockSystem.cs \
Content.Server/Wires/WiresSystem.cs \
Content.Shared/Doors/Components/AirlockComponent.cs \
Content.Shared/Doors/Components/DoorComponent.cs \
Content.Shared/Doors/Systems/SharedDoorSystem.cs \
Content.Shared/Wires/SharedWiresSystem.cs \
Content.Shared/Remotes/EntitySystems/SharedDoorRemoteSystem.cs \
Resources/Prototypes/Entities/Structures/Doors
fi
echo "=== Marker comments and literal resource paths in changed code/prototypes ==="
rg -n -C2 'Arcane-|Orion-|_Arcane|_Orion|openUnlitVisible|pryTime:|TimeSpan\.FromSeconds|AnimationKey|LayerSetAnimationTime|OpenPanelSpriteState' \
Content.Client/Doors \
Content.Server/Doors \
Content.Shared/Doors \
Resources/Prototypes/Entities/Structures/Doors 2>/dev/null || true
echo "=== Map public methods and class members in changed C# files ==="
ast-grep outline Content.Client/Doors/AirlockSystem.cs --items all
ast-grep outline Content.Client/Doors/DoorSystem.cs --items all
ast-grep outline Content.Shared/Doors/Systems/SharedDoorSystem.cs --items allLength of output: 144356 🏁 Script executed: #!/bin/bash
set -euo pipefail
echo "=== Changes introduced by replace commits ==="
for commit in 672edef980 2148e3e41c; do
echo "--- $commit ---"
git show --stat --oneline "$commit"
git show --unified=25 --format= "$commit" -- \
Content.Client/Doors/AirlockSystem.cs \
Content.Client/Doors/DoorSystem.cs \
Content.Shared/Doors/Components/AirlockComponent.cs \
Content.Shared/Doors/Components/DoorComponent.cs
done
echo "=== Final-state registration and all call sites ==="
rg -n -C4 'OpenSpriteStates\.Add|ClosedSpriteStates\.Add|OpenPanelSpriteState|OpeningSpriteState' \
Content.Client Content.Shared --type=cs
echo "=== Representative RSI states for base airlocks and windoors ==="
python3 - <<'PY'
import json
paths = [
"Resources/Textures/Structures/Doors/Airlocks/Standard/basic.rsi/meta.json",
"Resources/Textures/Structures/Doors/Windoors/plasma.rsi/meta.json",
"Resources/Textures/Structures/Doors/MineralDoors/bananium_door.rsi/meta.json",
]
for path in paths:
print(f"--- {path} ---")
with open(path, encoding="utf-8-sig") as f:
data = json.load(f)
for state in data.get("states", []):
if state.get("name") in {
"open_unlit", "closed_unlit", "opening_unlit", "closing_unlit",
"panel_open", "panel_opening", "panel_closing",
"open", "closed", "opening", "closing",
}:
print({k: state[k] for k in ("name", "directions", "delays") if k in state})
PY
echo "=== Check Airlock prototype inheritance / duplicated force-sound configuration ==="
rg -n -C3 'id: (Airlock|HighSecDoor)|parent: .*Airlock|forceOpenSound|forceCloseSound|openUnlitVisible' \
Resources/Prototypes/Entities/Structures/Doors/Airlocks --type=yaml
echo "=== All commented-out executable blocks in affected C# files ==="
rg -n -U -C2 '/\*.*\n(?:.|\n)*?\*/|// Arcane-(Start|End|Edit)' \
Content.Client/Doors/AirlockSystem.cs \
Content.Client/Doors/DoorSystem.cs \
Content.Shared/Doors/Components/AirlockComponent.cs \
Content.Shared/Doors/Components/DoorComponent.cs \
Content.Shared/Doors/Systems/SharedDoorSystem.csLength of output: 207616
Точно стоит убрать1. Закомментированный исполняемый код
/* Arcane-Edit-Start: LayerSetAnimationTime(0) here caused one-frame jitter when DoorState.Open arrived animation.
switch (state)
{
...
}
*/ // Arcane-Edit-EndЭто уже не выполняется и хранит старую реализацию прямо в рабочем файле. Если она не нужна для скорого сравнения — лучше удалить полностью: историю всегда можно посмотреть через Git. 2. Служебные маркеры
|
|
@coderabbitai сообщи все причины провалов тестов |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="ArcaneSS14/arcane"
pr="9"
echo "=== PR head and checks ==="
gh pr view "$pr" --repo "$repo" --json headRefOid,statusCheckRollup \
--jq '{head: .headRefOid, checks: [.statusCheckRollup[] | {name, status, conclusion, detailsUrl}]}'
echo
echo "=== Failed check job IDs ==="
gh pr checks "$pr" --repo "$repo" --json name,bucket,link,workflowName \
--jq '.[] | select(.bucket == "fail") | {name, workflowName, link}'
echo
echo "=== Recent failed workflow runs for this PR ==="
gh run list --repo "$repo" --branch "$(gh pr view "$pr" --repo "$repo" --json headRefName --jq .headRefName)" \
--limit 10 --json databaseId,name,status,conclusion,headSha \
--jq '.[] | select(.conclusion == "failure") | {databaseId, name, status, conclusion, headSha}'Length of output: 5795 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="ArcaneSS14/arcane"
job="88555872515"
echo "=== Failed-step log (tail) ==="
gh run view --repo "$repo" --job "$job" --log-failed 2>&1 | tail -n 500
echo
echo "=== Failure and diagnostic markers in full shard log ==="
gh run view --repo "$repo" --job "$job" --log 2>&1 |
rg -n -i -C4 \
'(^|\s)(failed|error|fatal|exception|assert|test host|crash|hang|hangdump|inactivity|timeout|timed out|exit code|blame)(\s|:|$)' \
| tail -n 400
echo
echo "=== Job metadata and failed steps ==="
gh api "repos/${repo}/actions/jobs/${job}" \
--jq '{name, conclusion, started_at, completed_at, steps: [.steps[] | select(.conclusion != "success") | {number, name, status, conclusion}]}'Length of output: 127939
1. Integration Tests (shard 4): зависание тестхоста → аварийное завершениеШаг После второго повтора CI завершает шаг с: То есть это не упавший assert и не ошибка компиляции, а повторяемый hang / crash test host. Тест, который выполнялся в момент остановкиВ первом запуске runner указывает: Но сам runner отдельно предупреждает: Поэтому Что происходило непосредственно раньшеПеред зависанием в логе были тесты xenoarchaeology и предупреждение из: о невозможности прикрепить Что нужно для точного диагнозаCI сохранил дамп зависшего процесса размером около 8 ГБ: В нём будут стеки всех потоков на момент зависания. Только анализ этого дампа позволит отличить:
2. Debug CI RequiredЭто не отдельная причина. Джоб падает, потому что требует успешного завершения всех обязательных проверок, а shard 4 завершился с ошибкой. Что больше не падает
Предупреждения, но не причины текущего провалаВ shard 4 также есть предупреждения о дублирующихся FTL-ключах, отсутствующих Итог: сейчас блокирует PR только повторяющийся hang/crash shard 4; точная первопричина пока не подтверждена без дампа. |
|
This pull request has conflicts, please resolve those before we can evaluate the pull request. |
|
@coderabbitai Пробегись по коду PR. Имеется что-то лишнее? |
|
Tip For best results, initiate chat on the files or code changes. 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="ArcaneSS14/arcane"
pr="9"
echo "=== PR head/base and failed checks ==="
gh pr view "$pr" --repo "$repo" --json headRefOid,baseRefName,statusCheckRollup \
--jq '{head: .headRefOid, base: .baseRefName, checks: [.statusCheckRollup[] | select(.conclusion != "SUCCESS" and .conclusion != null) | {name,status,conclusion,detailsUrl}]}'
echo
echo "=== Merge base and changed files ==="
base="$(git merge-base HEAD "origin/$(gh pr view "$pr" --repo "$repo" --json baseRefName --jq .baseRefName)")"
echo "BASE=$base"
git diff --stat "$base"...HEAD
git diff --name-status "$base"...HEAD
echo
echo "=== Current relevant code diff ==="
git diff --unified=18 "$base"...HEAD -- \
Content.Client/Doors/AirlockSystem.cs \
Content.Client/Doors/DoorSystem.cs \
Content.Server/Doors/Systems/AirlockSystem.cs \
Content.Server/Wires/WiresSystem.cs \
Content.Shared/Doors/Components/AirlockComponent.cs \
Content.Shared/Doors/Components/DoorComponent.cs \
Content.Shared/Doors/Systems/SharedDoorSystem.cs \
Content.Shared/Wires/SharedWiresSystem.cs \
Content.Shared/Remotes/EntitySystems/SharedDoorRemoteSystem.cs \
Resources/Prototypes/Entities/Structures/Doors
echo
echo "=== Structure of modified door/wires systems ==="
ast-grep outline Content.Client/Doors/AirlockSystem.cs --items all
ast-grep outline Content.Client/Doors/DoorSystem.cs --items all
ast-grep outline Content.Shared/Doors/Systems/SharedDoorSystem.cs --items all
ast-grep outline Content.Shared/Wires/SharedWiresSystem.cs --items all
ast-grep outline Content.Server/Wires/WiresSystem.cs --items all
echo
echo "=== Temporary markers / commented executable code ==="
rg -n -U -C2 '(Arcane|Orion)-(Start|End|Edit|Fix)|/\*[\s\S]*?\*/|^\s*//\s*(public|private|protected|if|else|return|_wiresSystem)' \
Content.Client/Doors \
Content.Server/Doors \
Content.Server/Wires \
Content.Shared/Doors \
Content.Shared/Wires || true
echo
echo "=== Latest failed run/job diagnostics ==="
head_ref="$(gh pr view "$pr" --repo "$repo" --json headRefName --jq .headRefName)"
gh run list --repo "$repo" --branch "$head_ref" --limit 12 \
--json databaseId,headSha,conclusion,name \
--jq '.[] | select(.conclusion == "failure") | {databaseId,headSha,name}' | head -5Length of output: 112269 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="ArcaneSS14/arcane"
echo "=== Current door/airlock implementation with line numbers ==="
cat -n Content.Client/Doors/AirlockSystem.cs
echo "--- DoorSystem relevant methods ---"
sed -n '1,255p' Content.Client/Doors/DoorSystem.cs
echo "--- SharedWiresSystem relevant methods ---"
sed -n '1,155p' Content.Shared/Wires/SharedWiresSystem.cs
echo "--- Server airlock activation ---"
sed -n '1,105p' Content.Server/Doors/Systems/AirlockSystem.cs
echo
echo "=== All UI-opening call sites and AlternativeVerb handlers ==="
rg -n -C4 '\bOpenUserInterface\s*\(|new AlternativeVerb|GetVerbsEvent<AlternativeVerb>|WiresUiKey\.Key' \
Content.Shared Content.Server Content.Client Content.IntegrationTests --type=cs
echo
echo "=== Door animation-completion subscriptions and animation keys ==="
rg -n -C4 'AnimationCompletedEvent|OpenKey|CloseKey|DenyKey|EmagKey|AnimationKey' \
Content.Client Content.Shared Content.Server --type=cs
echo
echo "=== Door-related integration tests and assertions ==="
fd -t f -e cs . Content.IntegrationTests | while read -r f; do
if rg -q 'Door|Airlock|Wires|Windoor|Pry' "$f"; then
echo "--- $f ---"
rg -n -C3 'Fact|Theory|Door|Airlock|Wires|Windoor|Pry|Assert\.' "$f"
fi
done
echo
echo "=== `openUnlitVisible` configurations and RSI sprite states ==="
rg -n -C3 'openUnlitVisible|sprite:.*[Dd]oor|sprite:.*[Aa]irlock' \
Resources/Prototypes/Entities/Structures/Doors --type=yaml
python3 - <<'PY'
import json
from pathlib import Path
for path in Path("Resources/Textures").rglob("*.rsi/meta.json"):
if "Doors" not in str(path):
continue
with path.open(encoding="utf-8-sig") as f:
states = {state["name"] for state in json.load(f).get("states", [])}
if "closed_unlit" in states or "opening_unlit" in states:
missing = [name for name in ("open_unlit", "closed_unlit", "opening_unlit", "closing_unlit", "panel_open") if name not in states]
print(f"{path}: missing={','.join(missing) or '-'}")
PY
echo
echo "=== Last completed failed integration job for PR `#9` ==="
gh pr view 9 --repo "$repo" --json commits \
--jq '.commits[].oid' | while read -r sha; do
gh run list --repo "$repo" --commit "$sha" --limit 10 \
--json databaseId,conclusion,name,headSha \
--jq '.[] | select(.conclusion == "failure" and (.name | test("Integration|CI"; "i"))) | {databaseId,name,headSha}'
done | head -10
echo
echo "=== Known previous shard-4 failure markers ==="
gh run view --repo "$repo" --job 88555872515 --log 2>&1 | \
rg -n -i -C5 'SpawnAndDirtyAllEntities|hangdump|inactivity|test host|crash|timeout|failed|exception|error' | tail -260 || trueLength of output: 203202 🏁 Script executed: #!/bin/bash
set -euo pipefail
repo="ArcaneSS14/arcane"
pr="9"
echo "=== Current CI status for HEAD ==="
gh pr view "$pr" --repo "$repo" --json headRefOid,statusCheckRollup \
--jq '{head: .headRefOid, checks: [.statusCheckRollup[] | {name,status,conclusion,detailsUrl}]}'
echo
echo "=== Every WiresAccessible guard and every wires UI opening path ==="
rg -n -C5 'WiresAccessible|OpenUi\(.*WiresUiKey|OpenUserInterface\s*\(' \
Content.Shared Content.Server Content.Client --type=cs
echo
echo "=== AlternativeVerb security and interaction conventions ==="
rg -n -U -C8 \
'GetVerbsEvent<AlternativeVerb>[\s\S]{0,1400}(CanInteract|CanAccess|WiresAccessible|InRange|IsPanelOpen|Act\s*=)' \
Content.Shared Content.Server Content.Client --type=cs
echo
echo "=== Shared UI APIs and UI-open authorization checks ==="
rg -n -C6 'class SharedUserInterfaceSystem|void OpenUi|OpenUi\(' \
RobustToolbox/Robust.Shared RobustToolbox/Robust.Client RobustToolbox/Robust.Server \
Content.Shared/UserInterface Content.Server/UserInterface Content.Client/UserInterface 2>/dev/null || true
echo
echo "=== Airlock components which explicitly disable OpenUnlitVisible ==="
rg -n -C4 'type:\s*Airlock|openUnlitVisible:\s*false|openingSpriteState:|closedSpriteState:' \
Resources/Prototypes/Entities --type=yaml | head -500
echo
echo "=== Relevant current line ranges ==="
nl -ba Content.Shared/Wires/SharedWiresSystem.cs | sed -n '96,132p'
nl -ba Content.Client/Doors/AirlockSystem.cs | sed -n '20,90p'
nl -ba Content.Server/Doors/Systems/AirlockSystem.cs | sed -n '52,82p'Length of output: 202259
1. Возможен обход защиты проводной панелиВ if (!IsPanelOpen(ent.Owner))
return;
// ...
Act = () => OpenUserInterface(ent, actor),Но он не проверяет:
Это важно, потому что отключённая логика в TryComp<WiresPanelSecurityComponent>(uid, out var wiresPanelSecurity) &&
!wiresPanelSecurity.WiresAccessibleА Что стоит добавить в начало if (!args.CanAccess || !args.CanInteract || !IsPanelOpen(ent.Owner))
return;
if (TryComp<WiresPanelSecurityComponent>(ent.Owner, out var security)
&& !security.WiresAccessible)
{
return;
}Это также соответствует конвенции остальных Рекомендую добавить отдельный integration-тест: открытая панель + 2. Лишний закомментированный исполняемый кодЕго лучше удалить, а не оставлять в исходниках:
История уже хранится в Git, поэтому эти блоки не помогают отладке, но осложняют дальнейший перенос и создают риск, что кто-то случайно вернёт старый путь вместе с новым. Также можно убрать все служебные маркеры 3. Сомнительное финальное состояние
|
Описание PR
Порт с визденов + кучка багфиксов да дополнений
Медиа
Тип PR
Лицензионное соглашение
Изменения
🆑
Summary by CodeRabbit
New Features
Bug Fixes
Style