/// <summary> /// Get all blocks' world coordinates, block Id and block data. /// The blocks may not be ordered to maximize performance. /// </summary> /// <returns>Blocks</returns> public IEnumerable <(int X, int Y, int Z, ClassicBlock Block)> AllBlocks() { for (var sy = 0; sy < 16; sy++) { var data = _data[sy]; var add = _add[sy]; var blocks = _blocks[sy]; if (blocks == null) { continue; } var dataAvailable = data != null; var addAvailable = add != null; var baseY = sy << 4; var index = 0; int blockId, blockData; for (var y = 0; y < 16; y++) { for (var z = 0; z < 16; z++) { for (var x = 0; x < 16; x += 2) { blockId = addAvailable ? ((EndianHelper.GetHalfIntEvenIndex(add, index) << 8) | blocks[index]) : blocks[index]; blockData = dataAvailable ? EndianHelper.GetHalfIntEvenIndex(data, index) : 0; yield return(x, y + baseY, z, new ClassicBlock { Data = blockData, Id = blockId }); index += 2; } index -= 15; for (var x = 1; x < 16; x += 2) { blockId = addAvailable ? ((EndianHelper.GetHalfIntOddIndex(add, index) << 8) | blocks[index]) : blocks[index]; blockData = dataAvailable ? EndianHelper.GetHalfIntOddIndex(data, index) : 0; yield return(x, y + baseY, z, new ClassicBlock { Data = blockData, Id = blockId }); index += 2; } index -= 1; } } } }