예제 #1
0
        /// <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;
                    }
                }
            }
        }