public GameStateMapData GetStateData(uint fromTick) { var gridDatums = new Dictionary <GridId, GameStateMapData.GridDatum>(); foreach (var grid in _grids.Values) { if (grid.LastModifiedTick < fromTick) { continue; } var chunkData = new List <GameStateMapData.ChunkDatum>(); foreach (var(index, chunk) in grid._chunks) { if (chunk.LastModifiedTick < fromTick) { continue; } var tileBuffer = new Tile[grid.ChunkSize * (uint)grid.ChunkSize]; // Flatten the tile array. // NetSerializer doesn't do multi-dimensional arrays. // This is probably really expensive. for (var x = 0; x < grid.ChunkSize; x++) { for (var y = 0; y < grid.ChunkSize; y++) { tileBuffer[x * grid.ChunkSize + y] = chunk._tiles[x, y]; } } chunkData.Add(new GameStateMapData.ChunkDatum(index, tileBuffer)); } var gridDatum = new GameStateMapData.GridDatum(chunkData, new MapCoordinates(grid.WorldPosition, grid.MapID)); gridDatums.Add(grid.Index, gridDatum); } var mapDeletionsData = _mapDeletionHistory.Where(d => d.tick >= fromTick).Select(d => d.mapId).ToList(); var gridDeletionsData = _gridDeletionHistory.Where(d => d.tick >= fromTick).Select(d => d.gridId).ToList(); var mapCreations = _maps.Values.Where(m => m.CreatedTick >= fromTick) .ToDictionary(m => m.Index, m => m.DefaultGrid.Index); var gridCreations = _grids.Values.Where(g => g.CreatedTick >= fromTick).ToDictionary(g => g.Index, grid => new GameStateMapData.GridCreationDatum(grid.ChunkSize, grid.SnapSize, grid.IsDefaultGrid)); return(new GameStateMapData(gridDatums, gridDeletionsData, mapDeletionsData, mapCreations, gridCreations)); }
#pragma warning restore 649 public GameStateMapData GetStateData(GameTick fromTick) { var gridDatums = new Dictionary <GridId, GameStateMapData.GridDatum>(); foreach (var grid in _grids.Values) { if (grid.LastModifiedTick < fromTick) { continue; } var chunkData = new List <GameStateMapData.ChunkDatum>(); foreach (var(index, chunk) in grid.GetMapChunks()) { if (chunk.LastModifiedTick < fromTick) { continue; } var tileBuffer = new Tile[grid.ChunkSize * (uint)grid.ChunkSize]; // Flatten the tile array. // NetSerializer doesn't do multi-dimensional arrays. // This is probably really expensive. for (var x = 0; x < grid.ChunkSize; x++) { for (var y = 0; y < grid.ChunkSize; y++) { tileBuffer[x * grid.ChunkSize + y] = chunk.GetTile((ushort)x, (ushort)y); } } chunkData.Add(new GameStateMapData.ChunkDatum(index, tileBuffer)); } var gridDatum = new GameStateMapData.GridDatum(chunkData.ToArray(), new MapCoordinates(grid.WorldPosition, grid.ParentMapId)); gridDatums.Add(grid.Index, gridDatum); } var mapDeletionsData = _mapDeletionHistory.Where(d => d.tick >= fromTick).Select(d => d.mapId).ToList(); var gridDeletionsData = _gridDeletionHistory.Where(d => d.tick >= fromTick).Select(d => d.gridId).ToList(); var mapCreations = _mapCreationTick.Where(kv => kv.Value >= fromTick && kv.Key != MapId.Nullspace) .ToDictionary(kv => kv.Key, kv => _defaultGrids[kv.Key]); var gridCreations = _grids.Values.Where(g => g.CreatedTick >= fromTick && g.ParentMapId != MapId.Nullspace).ToDictionary(g => g.Index, grid => new GameStateMapData.GridCreationDatum(grid.ChunkSize, grid.SnapSize, grid.IsDefaultGrid)); // no point sending empty collections if (gridDatums.Count == 0) { gridDatums = default; } if (gridDeletionsData.Count == 0) { gridDeletionsData = default; } if (mapDeletionsData.Count == 0) { mapDeletionsData = default; } if (mapCreations.Count == 0) { mapCreations = default; } if (gridCreations.Count == 0) { gridCreations = default; } // no point even creating an empty map state if no data if (gridDatums == null && gridDeletionsData == null && mapDeletionsData == null && mapCreations == null && gridCreations == null) { return(default);