The "ghost shows the real thing" release. Chests, crates, baskets, generic containers, and chiseled blocks now render with their actual block-entity geometry instead of mystery placeholders. The build checklist gets a movable, scrollable, copyable dialog mode in addition to the existing always-on HUD.
Added
- BE-aware ghost rendering. Per-family mesh sources read each cell's saved block-entity tree at paste time and reconstruct the real mesh:
- Chests / labeled chests / querns / beds tessellate normally and rotate by their saved
meshAngle, so askew chests show askew in the ghost. - Crates / stationary baskets / generic containers spin up a throwaway BlockEntity from the schematic's BE tree and invoke its private mesh-builder (
GenMesh(tesselator)/loadOrCreateMesh()) via cached reflection. - Chiseled blocks / microblocks render the substrate the chisel was carved from (oak plank, granite, etc.) as a full cube. Voxel-level chisel detail stays for the v0.2 chisel phase.
- Chests / labeled chests / querns / beds tessellate normally and rotate by their saved
- Substrate-aware materials list. Chiseled cells contribute to their substrate's row in the build checklist (
planks: 0/12includes chiseled-from-plank cells) rather than showing as achiseledblockline. Placing the substrate counts the cell as matched for phase-1 build. - Checklist modal.
Ctrl+Shift+Lnow cycles three view states: HUD (transparent always-on, no cursor grab) -> Modal (draggable title bar, clipped scroll body, "Copy to clipboard" button) -> Hidden -> HUD. The HUD opens automatically on.fw place; the modal is opt-in via the cycle.
Fixed
- Paste no longer crashes with
NullReferenceExceptionon blueprints saved by v0.1.2's block-only fallback path. Reported by Fish and 3CHØ on the Vintage Story Discord.BlueprintFile.ToBlockSchematicnow callsEnsureSchematicCollectionsInitializedimmediately afterLoadFromStringso the schematic's collections are always non-null beforeBlockSchematic.Init -> Remapruns. Affects single-player saves loaded on a server, library paste, and the.fw pastechat command alike.
Notes
- Crate / basket meshes don't show in-world label / contents detail since we don't reconstruct items inside containers; mesh geometry + rotation only.
- Reflection-based BE instantiation is best-effort. Third-party BE classes that throw inside
Initializewithout populating their mesh field will fall back to bare tessellation. Warnings go to client-main.log under[fieldwright:be-mesh]. - Phase 1 build counts treat chiseled cells as their substrate. Build-vs-chisel separation lands with v0.2.