using ProjectM.Simulation; using Unity.Burst; using Unity.Collections; using Unity.Entities; using Unity.NetCode; namespace ProjectM.Server { /// /// Server-authoritative handler for RPCs (deposit/withdraw on the /// shared storage container). Resolves the single as a singleton, /// applies the op to its replicated buffer via , /// and destroys the request entity. Runs in the default SimulationSystemGroup (NOT the prediction /// loop), so a server event is applied exactly once (no rollback double-apply). Op is read as a byte /// (see ); the buffer mutation auto-replicates to all clients via GhostField. /// [BurstCompile] [WorldSystemFilter(WorldSystemFilterFlags.ServerSimulation)] public partial struct StorageOpReceiveSystem : ISystem { [BurstCompile] public void OnCreate(ref SystemState state) { state.RequireForUpdate(); var builder = new EntityQueryBuilder(Allocator.Temp) .WithAll(); state.RequireForUpdate(state.GetEntityQuery(builder)); } [BurstCompile] public void OnUpdate(ref SystemState state) { var containerEntity = SystemAPI.GetSingletonEntity(); var contents = SystemAPI.GetBuffer(containerEntity); var ecb = new EntityCommandBuffer(Allocator.Temp); foreach (var (request, requestEntity) in SystemAPI.Query>().WithAll().WithEntityAccess()) { var op = request.ValueRO; if (op.Op == StorageOp.Withdraw) StorageMath.Withdraw(contents, op.ItemId, op.Count); else StorageMath.Deposit(contents, op.ItemId, op.Count); ecb.DestroyEntity(requestEntity); } ecb.Playback(state.EntityManager); } } }