2b7e0e090d
Extends ChunkAdapter with readSections() (reads non-empty 16x16x16 sections via the chunk's ExtendedBlockStorage array, skipping fully-air ones for free) and DeltaSink with onChunkDirty(), additive to Phase 1's column-based readChunk()/onDelta — 2D column tracking is unchanged. BackendConnection grows sendSections(), base64-encoding each section's 4096-entry char[] (char, not short, since short would overflow for any blockId >= 2048 — see SectionData's javadoc) into the wire protocol's new "sections" message, mirrored in MCMapper-Backend's matching commit. MCMapperMod now tracks dirty chunks (not just dirty columns) and, on the same flush tick as column deltas, re-reads and resends full section data for any chunk touched since the last flush — same "current state, not a diff" approach as columns, at chunk instead of column granularity. Verified against a live MCMapper-Backend instance: a known half-solid section sent through this exact code path round-trips to a mesh with exactly 24 vertices / 36 indices at the backend's mesh-serving endpoint, matching the worker's greedy-mesher unit tests for a uniform section.
common
Loader-agnostic Java: protocol types, config model, and the interfaces each leaf module
(forge-1_7_10, forge-1_12_2, neoforge-26_1) implements against its own Minecraft/Forge
API generation.
This module is not consumed as a compiled binary dependency. The legacy leaves (1.7.10,
1.12.2) target Java 8; neoforge-26_1 targets a modern JDK. To avoid cross-version binary
compatibility issues, each leaf module adds common/src/main/java directly to its own source
set (see the sourceSets.main.java.srcDirs line in each leaf's build.gradle) and compiles it
itself, once per leaf, against its own toolchain. Keep this module free of any
Minecraft/Forge/NeoForge API usage — it must compile standalone under plain javac.
Layout
protocol/— wire types shared with the backend (delta events, chat/waypoint payloads, link request/response). Mirrors the WS protocol described in the root plan.config/— the common config model (backend URL, server token, tracking/reconciliation intervals) each leaf loads via its own loader-specific config system.