RPD Update 3: Third Times the Charm#216
Open
rebaserHEAD wants to merge 26 commits into
Open
Conversation
Subfloor pipes carry SubFloorHideComponent, so they render invisible and the click resolves no target. Scoped to the RPD in Deconstruct mode, resolve an RPD-deconstructable entity anchored on the clicked tile, chosen deterministically by lowest NetEntity id so server and client prediction agree. The RCD path is unaffected.
… entities The subfloor-deconstruct gate only fired when the click resolved no target. A visible anchored entity sharing the tile (a firelock, a window) becomes the click target and shadowed the hidden pipe beneath it, so the RPD could not reach it. Fire the fallback whenever the resolved target is not itself RPD-deconstructable, falling back to the original target so a non-pipe click still no-ops and a bare tile still deconstructs the floor.
The RPD deconstructs an existing pipe through AfterInteract, so the construct-style whole-tile ghost only painted a misleading tile highlight over an operation that places nothing. Suppress the placer for the RPD in Deconstruct mode. The RCD and RPD construct ghosts are unchanged.
When several atmos pipes shared a tile across layers, deconstructing a covered pipe (one hidden under a floor tile) picked an arbitrary one by lowest NetEntity, ignoring which layer the operator was aiming at. That was inconsistent with construct, which places on the cursor-quadrant layer. Resolve the covered-pipe target through a new RCDDeconstructTargetResolveEvent so RPDSystem (which owns the aimed layer and atmos access) picks the anchored pipe whose CurrentPipeLayer matches the aimed layer, falling back to lowest-NetEntity for single-layer or non-layered atmos devices. The aimed layer comes from eye rotation, now streamed in deconstruct mode too since the construct placement mode that normally streams it is suppressed there. A world overlay draws the same three layer-guide dots construct shows, so the operator aims the same way they place. Server-authoritative: CurrentLayer is server-only state and the deconstruct do-after only starts server-side, so the client's placeholder pick stays cosmetic and never desyncs the result.
…ntity guard for layered pipes
…p check sees the real facing
…prototypes + graph nodes)
…he cursor-aimed pipe layer Extends the alt-prototype + graph-node treatment from the Vents pass to the rest of the RPD catalog. Flipped filter/mixer variants carry their own alternativePrototypes maps (inheritance would merge the unflipped parent's in) and their alts re-point Flippable at the same layer's mirror so an in-world flip keeps the layer. Radiators are numberOfPipeLayers: 1 by design, so their recipes opt out via noLayers instead of growing alts.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
About the PR
The RPD now commits builds and deconstructs to the pipe layer you're aiming at, across the whole catalog. Pipes already worked this way; this extends the cursor-quadrant aim to vents, scrubbers, injectors, the dual-port vent, filters, mixers, the pneumatic valve, and the canister port, and makes deconstruct respect the same aim, including pipes buried under floor tiles or shadowed by firelocks.
Under the hood the client pushes the chosen layer to the server (replacing the old eye-rotation streaming), RCDSystem stops knowing what an RPD is (sibling admission via event seams instead), and recipe rotation is applied at spawn so the anchor-time overlap check sees the real facing.
For anyone cherry-picking, this sits on top of:
Resources/Prototypes/_Triad/RPD/rpd.ymlWhy / Balance
Quality of life for atmos work. No balance impact: same costs, same materials, same recipes. The only thing that changes is that the layer you aim at is the layer you get. Radiators are deliberately excluded since they're single-layer by design; their recipes now say so instead of showing layer dots that don't do anything.
Media
u when you use this. trust me. i'm too tired to add footage.
Requirements
How to test
dotnet test --filter FullyQualifiedName~RPDcovers the alt-prototype wiring, layer coexistence, overlap, and spawn rotation.Breaking changes
RPDEyeRotationEventandRPDComponent.LastKnownEyeRotationare removed; the client now sendsRPDLayerSelectEventand the server stores the pick viaRPDSystem.SetLayer.RCDDeconstructAttemptEventgains anAdmittedflag (sibling systems admit targets RCD would reject).RCDConstructionAttemptEventraised during construct validation so a sibling can veto placement.Changelog
🆑