Structure Editor v1.4.3
Fix: save_structures on cold chunks. Third try, this one actually addresses the level of the chunk load rather than dancing around it.
What was wrong
v1.4.2 iterated entities via getOtherEntities in Phase 1 to try to trigger the async entity load. That method only iterates already-loaded sections; it does not tell PersistentEntitySectionManager to read the entity file. So on cold chunks the iteration returned zero, kicked nothing, and the subsequent save still saw an empty entity store. Finn's 1x4x1 A/B repro (single chunk, entity inside the SB's own chunk) confirmed the problem is level/timing of the chunk load, not bounds coverage.
What now happens
The actual vanilla path: chunks reach ENTITY_TICKING level via a chunk ticket, at which point ServerChunkLoadingManager tells the entity manager to load the entity file. FORCED tickets (what /forceload uses) reach that level.
save_structures now:
- Phase 1 (server thread) — enumerate every SB in scope, compute each SB's captured AABB, walk the chunks it overlaps, and add a FORCED chunk-loading ticket for every one of those chunks via
world.getChunkManager().addTicket(ChunkTicketType.FORCED, cp, 2). - Sleep 1s on the HTTP thread so ticket propagation and entity file reads complete.
- Phase 2 (server thread) — re-fetch each SB, count entities in the bounds, call
saveStructure, thenremoveTicketfor every ticket added in Phase 1 (FORCED has NO_EXPIRATION and would otherwise pin those chunks forever).
Safety net kept: the response still carries entities_captured per SB.
Test: run Finn's minimal repro (1x4x1 fortress_guard anchor, cold chunks, no player nearby). Save. Check entities_captured: 1 in the response and confirm the downloaded template contains the wither skeleton.