using ProjectM.Simulation; using Unity.Burst; using Unity.Collections; using Unity.Entities; using Unity.Transforms; namespace ProjectM.Server { /// /// Server-only, one-shot spawner for the shared home-base storage container (mirrors /// UpgradePickupSpawnSystem). On its first update it reads the baked /// singleton and the , instantiates the container ghost at the cell center /// (), then destroys the spawner singleton so the system idles /// (spawned exactly once). Runs in the default SimulationSystemGroup (NOT the prediction loop); the /// container replicates to clients as an ownerless interpolated ghost. The container is intentionally /// NOT linked to any connection's LinkedEntityGroup, so it persists across player disconnects. /// [BurstCompile] [WorldSystemFilter(WorldSystemFilterFlags.ServerSimulation)] public partial struct SharedStorageSpawnSystem : ISystem { [BurstCompile] public void OnCreate(ref SystemState state) { state.RequireForUpdate(); state.RequireForUpdate(); } [BurstCompile] public void OnUpdate(ref SystemState state) { var spawnerEntity = SystemAPI.GetSingletonEntity(); var spawner = SystemAPI.GetComponent(spawnerEntity); var anchor = SystemAPI.GetSingleton(); var ecb = new EntityCommandBuffer(Allocator.Temp); if (spawner.Prefab != Entity.Null) { var container = ecb.Instantiate(spawner.Prefab); var position = BaseGridMath.CellToWorld(anchor, spawner.Cell); ecb.SetComponent(container, LocalTransform.FromPosition(position)); } // One-shot: remove the spawner so RequireForUpdate fails and the system idles. ecb.DestroyEntity(spawnerEntity); ecb.Playback(state.EntityManager); } } }