using System.Collections.Generic; using Unity.Collections; using Unity.Entities; namespace ProjectM.Simulation { /// /// Scans a server world for PLAYER-built structures ( + ) /// into the flat SaveData arrays — the SINGLE shared scan used by BOTH the autosave (SaveWriteSystem) and the /// quit-to-menu save (WorldLauncher), so the two paths can never drift (only RuntimePlacedTag structures are saved; /// anything baked into the subscene is the subscene's source of truth, not the save's). Managed (List/array) — /// runs only on a save, never in the hot loop. /// public static class SaveStructureScan { public static void Collect(EntityManager em, uint nowTick, out StructureSave[] structures, out StructureIoRow[] io) { var structs = new List(); using var q = em.CreateEntityQuery( ComponentType.ReadOnly(), ComponentType.ReadOnly()); using var entities = q.ToEntityArray(Allocator.Temp); for (int k = 0; k < entities.Length; k++) { var e = entities[k]; var ps = em.GetComponentData(e); structs.Add(new StructureSave { Type = ps.Type, CellX = ps.Cell.x, CellZ = ps.Cell.y, // EB-1: guarded so structures without Health don't crash the autosave path (no try/catch). HP = em.HasComponent(e) ? em.GetComponentData(e).Current : 0f, }); } structures = structs.ToArray(); io = System.Array.Empty(); // machine I/O retired with the automation chain (row type dies at save v7) } } }