From 4e32eebf05ebaf1254bc973a743b2fbaedf39599 Mon Sep 17 00:00:00 2001 From: Mike Primm Date: Wed, 14 Mar 2012 21:18:55 -0500 Subject: [Bleeding] Clean up and clarify javadocs on new generator methods. --- .../java/org/bukkit/generator/ChunkGenerator.java | 98 ++++++++++++++-------- 1 file changed, 64 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/main/java/org/bukkit/generator/ChunkGenerator.java b/src/main/java/org/bukkit/generator/ChunkGenerator.java index db579cdc..768fa396 100644 --- a/src/main/java/org/bukkit/generator/ChunkGenerator.java +++ b/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 -- cgit v1.2.3