mirror of
https://github.com/DorkSquadRR/DorkNet.git
synced 2026-10-25 23:18:44 -07:00
fix(cdn): serve baked RRO rooms a loadable stub blob (version 16, save skeleton)
An enabled baked room still had no Maker Pen: the client fetched the CDN's
synthetic stub for room_{id}_dorknet_v8.dat and silently loaded the room
with no room roles. Measured against Rec Center's working room_100_v1.dat
(10,930 bytes, the same client loads it with Maker Pen), the old 1,872-byte
roles-only stub was stamped PersistedRoomVersion 19 — past the March-2023
client's ceiling of 16, which only the S3-hit path clamped — and lacked the
skeleton every real save carries (last_save_time, activity_id = the room's
LocationReplicationId, connectable graph, scene settings, object model,
room_mood_* blocks).
RoomDataBlobService.BuildRroEditableBlob now emits that skeleton per room
at version 16 (untyped fields appended on the wire; payloads are Rec
Center's defaults verbatim). CdnController resolves the RRO room for the
miss path, passes its location id, and clamps synthesised blobs the same
way it clamps S3 hits. Tests pin version 16, the activity id and
CanUseMakerPen on every role.
This commit is contained in:
@@ -213,6 +213,16 @@ actions:
|
||||
"Home" entry (`isVirtual: true`, max players = room capacity) and enable
|
||||
creates the real row with the game-side defaults
|
||||
(`RoomsController.GetOrCreateSceneForMutationAsync`).
|
||||
What the CDN hands back for that name while nothing is saved is a
|
||||
**per-room stub** built by `RoomDataBlobService.BuildRroEditableBlob`:
|
||||
the skeleton of a real save (Rec Center's `room_100_v1.dat` was the
|
||||
reference) — `version` 16 (the client's ceiling; the old roles-only stub
|
||||
was stamped 19 and the client fetched it and silently loaded the room
|
||||
with no roles, i.e. no Maker Pen), `activity_id` = the room's
|
||||
`LocationReplicationId`, `last_save_time`, empty connectable graph /
|
||||
object model, scene settings and the four `room_mood_*` blocks, plus the
|
||||
permissive role collection. The miss path now runs the same 2023
|
||||
version clamp as the S3-hit path.
|
||||
- **Reset to baked scene** — `POST api/admin/v1/rooms/{id}/subrooms/{subRoomId}/blob/reset`.
|
||||
Clears both pointers. This is the escape hatch if a save left the room
|
||||
unplayable. Saved blobs stay in `RoomDataBlobs`, so the in-game restore
|
||||
|
||||
@@ -152,6 +152,17 @@ baked into the paintball scene). Its rule is the Maker Pen chip
|
||||
Rec Room delivered inside the room blob. Without it there is no
|
||||
`BattleRoyaleManager` in the scene.
|
||||
|
||||
Stub shape matters. Until something is saved the CDN synthesises the blob,
|
||||
and the client fetches it through `RecNet.Rooms.GetRoomData` and rejects
|
||||
one it deems unusable — a clone surfaces that as the bare "Failed to copy
|
||||
room", a baked room as a silent load with no room roles (no Maker Pen).
|
||||
Compared against Rec Center's working `room_100_v1.dat`, the old stub was
|
||||
stamped `PersistedRoomVersion` 19 (client ceiling 16; only the S3-hit path
|
||||
clamped) and lacked the save skeleton (`last_save_time`, `activity_id` =
|
||||
LocationReplicationId, connectable graph, scene settings, object model,
|
||||
`room_mood_*`). `RoomDataBlobService.BuildRroEditableBlob` now emits that
|
||||
skeleton per room at version 16.
|
||||
|
||||
Admin switch: `POST api/admin/v1/rooms/{id}/subrooms/{sub}/blob/enable`
|
||||
stamps `RoomService.SyntheticDefaultRoomDataBlobName(id)` on the scene and
|
||||
room; `.../blob/reset` clears it. See `docs/admin.md` → "RRO room data
|
||||
|
||||
Reference in New Issue
Block a user