public override uint getBlock(int x, int y, int z) { var ind = index(x, y, z); var node = tree.FindGreatestNotGreater(ind); var offset = node.key; var runLen = 0; using(var reader = new BinaryReader7(new MemoryStream(node.data, 0, node.data.Length))) { while(true) { if(runLen == 0) { runLen = reader.Read7BitEncodedInt() - RUN_LENGTH_SHIFT; } else if(runLen>0) { var runId = reader.ReadUInt32(); // blocks in range [offset...offset+runLen) is runId offset = offset + runLen; if(ind < offset) { return runId; } runLen = 0; } else if(runLen<0) { var blockId = reader.ReadUInt32(); if(offset==ind) { return blockId; } runLen++; offset++; } } } }
public override uint getBlock(int x, int y, int z) { var ind = index(x, y, z); var node = tree.FindGreatestNotGreater(ind); var offset = node.key; var runLen = 0; using (var reader = new BinaryReader7(new MemoryStream(node.data, 0, node.data.Length))) { while (true) { if (runLen == 0) { runLen = reader.Read7BitEncodedInt() - RUN_LENGTH_SHIFT; } else if (runLen > 0) { var runId = reader.ReadUInt32(); // blocks in range [offset...offset+runLen) is runId offset = offset + runLen; if (ind < offset) { return(runId); } runLen = 0; } else if (runLen < 0) { var blockId = reader.ReadUInt32(); if (offset == ind) { return(blockId); } runLen++; offset++; } } } }
public override void setBlock(int x, int y, int z, uint block) { var ind = index(x, y, z); var node = tree.FindGreatestNotGreater(ind); var offset = node.key; var runLen = 0; var runLenWrited = false; MemoryStream output = null; using (var reader = new BinaryReader7(new MemoryStream(node.data, 0, node.data.Length))) { using(var writer = new BinaryWriter7(output = new MemoryStream())) { while (reader.BaseStream.Position != reader.BaseStream.Length) { if (runLen == 0) { runLen = reader.Read7BitEncodedInt() - RUN_LENGTH_SHIFT; runLenWrited = false; } else if (runLen > 0) { var runId = reader.ReadUInt32(); // blocks in range [offset...offset+runLen) is runId offset = offset + runLen; if (ind < offset) { writer.Write7BitEncodedInt(ind - (offset - runLen) + RUN_LENGTH_SHIFT); writer.Write(runId); writer.Write7BitEncodedInt(1 + RUN_LENGTH_SHIFT); writer.Write(block); if (offset - ind -1 > 0) { writer.Write7BitEncodedInt(offset - ind -1 + RUN_LENGTH_SHIFT); writer.Write(runId); } } else { writer.Write7BitEncodedInt(runLen + RUN_LENGTH_SHIFT); writer.Write(runId); } runLen = 0; } else if (runLen < 0) { var blockId = reader.ReadUInt32(); if(!runLenWrited) { writer.Write7BitEncodedInt(runLen + RUN_LENGTH_SHIFT); runLenWrited = true; } if (offset == ind) { writer.Write(block); } else { writer.Write(blockId); } runLen++; offset++; } } } } var newdata = output.ToArray(); node.data = output.ToArray(); }
public override void setBlock(int x, int y, int z, uint block) { var ind = index(x, y, z); var node = tree.FindGreatestNotGreater(ind); var offset = node.key; var runLen = 0; var runLenWrited = false; MemoryStream output = null; using (var reader = new BinaryReader7(new MemoryStream(node.data, 0, node.data.Length))) { using (var writer = new BinaryWriter7(output = new MemoryStream())) { while (reader.BaseStream.Position != reader.BaseStream.Length) { if (runLen == 0) { runLen = reader.Read7BitEncodedInt() - RUN_LENGTH_SHIFT; runLenWrited = false; } else if (runLen > 0) { var runId = reader.ReadUInt32(); // blocks in range [offset...offset+runLen) is runId offset = offset + runLen; if (ind < offset) { writer.Write7BitEncodedInt(ind - (offset - runLen) + RUN_LENGTH_SHIFT); writer.Write(runId); writer.Write7BitEncodedInt(1 + RUN_LENGTH_SHIFT); writer.Write(block); if (offset - ind - 1 > 0) { writer.Write7BitEncodedInt(offset - ind - 1 + RUN_LENGTH_SHIFT); writer.Write(runId); } } else { writer.Write7BitEncodedInt(runLen + RUN_LENGTH_SHIFT); writer.Write(runId); } runLen = 0; } else if (runLen < 0) { var blockId = reader.ReadUInt32(); if (!runLenWrited) { writer.Write7BitEncodedInt(runLen + RUN_LENGTH_SHIFT); runLenWrited = true; } if (offset == ind) { writer.Write(block); } else { writer.Write(blockId); } runLen++; offset++; } } } } var newdata = output.ToArray(); node.data = output.ToArray(); }