diff --git a/paper-api/src/main/java/org/bukkit/generator/ChunkGenerator.java b/paper-api/src/main/java/org/bukkit/generator/ChunkGenerator.java
index db579cdc25..768fa39666 100644
--- a/paper-api/src/main/java/org/bukkit/generator/ChunkGenerator.java
+++ b/paper-api/src/main/java/org/bukkit/generator/ChunkGenerator.java
@@ -69,28 +69,43 @@ public abstract class ChunkGenerator {
}
/**
- * Shapes the chunk for the given coordinates.
- *
- * This method should return a short[][] array in the following format:
- *
+ * Shapes the chunk for the given coordinates, with extended block IDs supported (0-4095).
+ *
+ * As of 1.2, chunks are represented by a vertical array of chunk sections, each of which is 16 x 16 x 16 blocks. If a section + * is empty (all zero), the section does not need to be supplied, reducing memory usage. + *
+ * This method must return a short[][] array in the following format: *
- * result[y >> 4] = null IF the 16x16x16 section from y to y+15 is empty - * result[y >> 4] = new short[4096] if the section has any non-empty blocks - * - * within the section: - * - * for (int x = 0; x < 16; x++) { - * for (int z = 0; z < 16; z++) { - * for (int yy = y & 0xF; yy < 16; yy++) { - * result[(yy << 8) | (z << 4) | x] = ??; - * } - * } - * } + * short[][] result = new short[world-height / 16][]; + *+ * Each section (sectionID = (Y>>4)) that has blocks needs to be allocated space for the 4096 blocks in that section: + *
+ * result[sectionID] = new short[4096]; *- * + * while sections that are not populated can be left null. + *
+ * Setting a block at X, Y, Z within the chunk can be done with the following mapping function: + *
+ * void setBlock(short[][] result, int x, int y, int z, short blkid) { + * if (result[y >> 4) == null) { + * result[y >> 4] = new short[4096]; + * } + * result[y >> 4][((y & 0xF) << 8) | (z << 4) | x] = blkid; + * } + *+ * while reading a block ID can be done with the following mapping function: + *
+ * short getBlock(short[][] result, int x, int y, int z) { + * if (result[y >> 4) == null) { + * return (short)0; + * } + * return result[y >> 4][((y & 0xF) << 8) | (z << 4) | x]; + * } + *+ *
* Note that this method should never attempt to get the Chunk at * the passed coordinates, as doing so may cause an infinite loop - * + *
* Note generators that do not return block IDs above 255 should not implement
* this method, or should have it return null (which will result in the
* generateBlockSections() method being called).
@@ -107,23 +122,38 @@ public abstract class ChunkGenerator {
}
/**
- * Shapes the chunk for the given coordinates.
- *
- * This method should return a byte[][] array in the following format:
- *
+ * Shapes the chunk for the given coordinates.
+ *
+ * As of 1.2, chunks are represented by a vertical array of chunk sections, each of which is 16 x 16 x 16 blocks. If a section + * is empty (all zero), the section does not need to be supplied, reducing memory usage. + *
+ * This method must return a byte[][] array in the following format: *
- * result[y >> 4] = null IF the 16x16x16 section from y to y+15 is empty - * result[y >> 4] = new byte[4096] if the section has any non-empty blocks - * - * within the section: - * - * for (int x = 0; x < 16; x++) { - * for (int z = 0; z < 16; z++) { - * for (int yy = y & 0xF; yy < 16; yy++) { - * result[(yy << 8) | (z << 4) | x] = ??; - * } - * } - * } + * byte[][] result = new byte[world-height / 16][]; + *+ * Each section (sectionID = (Y>>4)) that has blocks needs to be allocated space for the 4096 blocks in that section: + *
+ * result[sectionID] = new byte[4096]; + *+ * while sections that are not populated can be left null. + *
+ * Setting a block at X, Y, Z within the chunk can be done with the following mapping function: + *
+ * void setBlock(byte[][] result, int x, int y, int z, byte blkid) { + * if (result[y >> 4) == null) { + * result[y >> 4] = new byte[4096]; + * } + * result[y >> 4][((y & 0xF) << 8) | (z << 4) | x] = blkid; + * } + *+ * while reading a block ID can be done with the following mapping function: + *
+ * byte getBlock(byte[][] result, int x, int y, int z) { + * if (result[y >> 4) == null) { + * return (byte)0; + * } + * return result[y >> 4][((y & 0xF) << 8) | (z << 4) | x]; + * } ** * Note that this method should never attempt to get the Chunk at