mirror of
https://github.com/DorkSquadRR/DorkNet.git
synced 2026-10-25 23:18:44 -07:00
fix: a cloned template carries its content instead of starting empty
Cloning a first-party template (RecCenter and friends) deliberately left the
new room with no blob, on the reasoning that its content is baked client
geometry and any blob is just a MakerPen overlay. That left the copy with
nothing to load.
The copy flow is what exposes it. IBEOONPEELF.GetRoomData / GetRoomMetadata
fetch "/room/{blob}" from the CDN as part of copying and throw a
BCPHBJHOIEM-family exception when that does not give them a usable room —
surfacing as the bare "Failed to copy room: Exception of type 'CEMNLBKJABA'"
with no message. For a name nothing is stored under, the CDN synthesises a
~1.8 KB stub: room_1583_dorknet_v8.dat served 1872 bytes where the source's
room_100_v1.dat is 10,930. The clone that DID work carried real content.
Since GiveCloneItsOwnBlobsAsync copies the bytes under the clone's own name,
the original worry — inheriting an overlay on a SHARED template — no longer
applies: nothing is shared either way. IsFirstPartyTemplate had no other
callers and is gone.
The existing assertion that a template clone must have NO blob encoded the
belief this replaces, so it now asserts the clone carries content. The
"doesn't share the source's object" half is covered by
RoomCloneShapeTests.Clone_does_not_reference_the_source_rooms_blob, which runs
with a real object store; this suite has none and deliberately falls back to
keeping the reference.
This commit is contained in:
@@ -198,8 +198,22 @@ public sealed class RoomSave2023Tests : IClassFixture<DorkNetServerFactory>
|
||||
var firstCloneId = await CloneAndAssertAsync(
|
||||
roomsClient, roomId, "FirstClone", pathPrefix: "/roomserver");
|
||||
Assert.NotEqual(roomId, firstCloneId);
|
||||
await AssertBlobsAsync(firstCloneId, expectEmpty: true,
|
||||
"first-party template blob must not be copied onto the clone");
|
||||
// A clone of a first-party template used to be left with NO blob, on
|
||||
// the reasoning that its content is baked client geometry. That left
|
||||
// the copy with nothing to load: the CDN synthesises a ~1.8 KB stub for
|
||||
// a name it has nothing stored under, and the client fetches exactly
|
||||
// that through GetRoomData ("/room/{blob}") while copying, then rejects
|
||||
// it. Clones that carried real content joined fine.
|
||||
//
|
||||
// The content now comes across. Sharing the SOURCE's object is still
|
||||
// wrong, but that is prevented by copying it under the clone's own name
|
||||
// rather than by having no blob at all — see
|
||||
// RoomCloneShapeTests.Clone_does_not_reference_the_source_rooms_blob,
|
||||
// which runs with a real object store. This suite has none, so the
|
||||
// copy deliberately falls back to keeping the reference and only the
|
||||
// "has content" half is checkable here.
|
||||
await AssertBlobsAsync(firstCloneId, expectEmpty: false,
|
||||
"a clone of a first-party template must carry its content");
|
||||
|
||||
// Simulate the player saving MakerPen edits into their clone.
|
||||
var editedBlob = $"room_{firstCloneId}_edit_{Guid.NewGuid():N}.dat";
|
||||
|
||||
Reference in New Issue
Block a user