Skip to content

Structure Editor v1.4.3

Choose a tag to compare

@FinnSetchell FinnSetchell released this 10 Sep 09:30
· 15 commits to main since this release

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:

  1. 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).
  2. Sleep 1s on the HTTP thread so ticket propagation and entity file reads complete.
  3. Phase 2 (server thread) — re-fetch each SB, count entities in the bounds, call saveStructure, then removeTicket for 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.