1 /*
2  * Copyright (c) 2017-2018 sel-project
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in all
12  * copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20  * SOFTWARE.
21  *
22  */
23 /**
24  * Copyright: 2017-2018 sel-project
25  * License: MIT
26  * Authors: Kripth
27  * Source: $(HTTP github.com/sel-project/selery/source/selery/block/blocks.d, selery/block/blocks.d)
28  */
29 module selery.block.blocks;
30 
31 import selery.about : block_t, item_t;
32 import selery.block.block : Block;
33 import selery.block.farming;
34 import selery.block.fluid;
35 import selery.block.miscellaneous;
36 import selery.block.redstone;
37 import selery.block.solid;
38 import selery.block.tile;
39 import selery.item.items : Items;
40 import selery.item.tool : Tools;
41 
42 import sul.blocks : _ = Blocks;
43 
44 /**
45  * Storage for a world's blocks.
46  */
47 public class BlockStorage {
48 
49 	private static BlockStorage instance;
50 	
51 	private Block[] sel;
52 	private Block*[][256] java, bedrock;
53 	
54 	public this() {
55 		if(instance is null) {
56 			this.instantiateDefaultBlocks();
57 			foreach(immutable member ; __traits(allMembers, Tiles)) {
58 				mixin("alias T = Tiles." ~ member ~ ";");
59 				this.registerTile!T(new T());
60 			}
61 			instance = this;
62 		} else {
63 			this.sel = instance.sel.dup;
64 			this.java = instance.java.dup;
65 			this.bedrock = instance.bedrock.dup;
66 		}
67 	}
68 	
69 	public void register(Block block) {
70 		if(block !is null) {
71 			if(this.sel.length <= block.id) this.sel.length = block.id + 1;
72 			this.sel[block.id] = block;
73 			auto pointer = &this.sel[block.id];
74 			if(block.java) {
75 				if(this.java[block.javaId].length <= block.javaMeta) this.java[block.javaId].length = block.javaMeta + 1;
76 				this.java[block.javaId][block.javaMeta] = pointer;
77 			}
78 			if(block.bedrock) {
79 				if(this.bedrock[block.bedrockId].length <= block.bedrockMeta) this.bedrock[block.bedrockId].length = block.bedrockMeta + 1;
80 				this.bedrock[block.bedrockId][block.bedrockMeta] = pointer;
81 			}
82 		}
83 	}
84 
85 	public void registerTile(T:Tile)(T tile) {
86 		this.register(tile);
87 		//TODO register tile data
88 	}
89 
90 	/**
91 	 * Gets a block using its sel-id.
92 	 * This method only takes an argument as SEL blocks
93 	 * are identified by a single number instead of an id and
94 	 * optional metadata as in Minecraft and Minecraft: Pocket Edition.
95 	 * Example:
96 	 * ---
97 	 * auto block = 1 in blocks;
98 	 * assert(block.name == "stone");
99 	 * assert(blocks[Blocks.grass].name == "grass");
100 	 * ---
101 	 */
102 	public @safe Block* opBinaryRight(string op : "in")(block_t id) {
103 		if(id < this.sel.length) {
104 			auto ret = &this.sel[id];
105 			if(*ret !is null) return ret;
106 		}
107 		return null;
108 	}
109 
110 	/// ditto
111 	public @safe Block* opIndex(block_t id) {
112 		return id in this;
113 	}
114 
115 	/**
116 	 * Gets a block with the id used in Minecraft.
117 	 * Example:
118 	 * ---
119 	 * auto block = blocks.fromMinecraft(217);
120 	 * assert(block.name == "structure void");
121 	 * assert(blocks.fromMinecraft(248) is null);
122 	 * ---
123 	 */
124 	public @safe Block* fromJava(ubyte id, ubyte meta=0) {
125 		auto data = this.java[id];
126 		if(data.length > meta) return data[meta];
127 		else return null;
128 	}
129 
130 	/**
131 	 * Gets a block with the id used in Minecraft.
132 	 * Example:
133 	 * ---
134 	 * auto block = blocks.fromBedrock(33, 2);
135 	 * assert(block && block.name == "piston facing north");
136 	 * assert(blocks.fromBedrock(255) is null); // structure block
137 	 * ---
138 	 */
139 	public @safe Block* fromBedrock(ubyte id, ubyte meta=0) {
140 		auto data = this.bedrock[id];
141 		if(data.length > meta) return data[meta];
142 		else return null;
143 	}
144 
145 	public pure nothrow @property @safe @nogc size_t length() {
146 		return this.sel.length;
147 	}
148 
149 	version(NoBlocks) {
150 
151 		private void instantiateDefaultBlocks() {}
152 
153 	} else {
154 
155 		private void instantiateDefaultBlocks() {
156 
157 			const woodPickaxe = MiningTool(true, Tools.pickaxe, Tools.wood);
158 			const stonePickaxe = MiningTool(true, Tools.pickaxe, Tools.stone);
159 			const ironPickaxe = MiningTool(true, Tools.pickaxe, Tools.iron);
160 			const diamondPickaxe = MiningTool(true, Tools.pickaxe, Tools.diamond);
161 
162 			const woodAxe = MiningTool(false, Tools.axe, Tools.wood);
163 
164 			this.register(new Block(_.air));
165 			this.register(new StoneBlock(_.stone, Items.cobblestone, Items.stone));
166 			this.register(new StoneBlock(_.granite, Items.granite));
167 			this.register(new StoneBlock(_.polishedGranite, Items.polishedGranite));
168 			this.register(new StoneBlock(_.diorite, Items.diorite));
169 			this.register(new StoneBlock(_.polishedDiorite, Items.polishedDiorite));
170 			this.register(new StoneBlock(_.andesite, Items.andesite));
171 			this.register(new StoneBlock(_.polishedAndesite, Items.polishedAndesite));
172 			this.register(new StoneBlock(_.stoneBricks, Items.stoneBricks));
173 			this.register(new StoneBlock(_.mossyStoneBricks, Items.mossyStoneBricks));
174 			this.register(new StoneBlock(_.crackedStoneBricks, Items.crackedStoneBricks));
175 			this.register(new StoneBlock(_.chiseledStoneBricks, Items.chiseledStoneBricks));
176 			this.register(new StoneBlock(_.cobblestone, Items.cobblestone));
177 			this.register(new StoneBlock(_.mossStone, Items.mossStone));
178 			this.register(new StoneBlock(_.cobblestoneWall, Items.cobblestoneWall));
179 			this.register(new StoneBlock(_.mossyCobblestoneWall, Items.mossyCobblestoneWall));
180 			this.register(new StoneBlock(_.bricks, Items.bricks));
181 			this.register(new MineableBlock(_.coalOre, woodPickaxe, Drop(Items.coal, 1, 1, Items.coalOre, &Drop.plusOne), Experience(0, 2)));
182 			this.register(new MineableBlock(_.ironOre, stonePickaxe, Drop(Items.ironOre, 1)));
183 			this.register(new MineableBlock(_.goldOre, ironPickaxe, Drop(Items.goldOre, 1)));
184 			this.register(new MineableBlock(_.diamondOre, ironPickaxe, Drop(Items.diamond, 1, 1, Items.diamondOre))); //TODO +1 with fortune
185 			this.register(new MineableBlock(_.emeraldOre, ironPickaxe, Drop(Items.emerald, 1, 1, Items.emeraldOre))); //TODO +1 with fortune
186 			this.register(new MineableBlock(_.lapisLazuliOre, stonePickaxe, Drop(Items.lapisLazuli, 4, 8, Items.lapisLazuliOre), Experience(2, 5))); //TODO fortune
187 			this.register(new RedstoneOreBlock!false(_.redstoneOre, Blocks.litRedstoneOre));
188 			this.register(new RedstoneOreBlock!true(_.litRedstoneOre, Blocks.redstoneOre));
189 			this.register(new MineableBlock(_.netherQuartzOre, woodPickaxe, Drop(Items.netherQuartz, 2, 5, Items.netherQuartzOre), Experience(2, 5, 1))); //TODO fortune
190 			this.register(new MineableBlock(_.coalBlock, woodPickaxe, Drop(Items.coalBlock, 1)));
191 			this.register(new MineableBlock(_.ironBlock, stonePickaxe, Drop(Items.ironBlock, 1)));
192 			this.register(new MineableBlock(_.goldBlock, ironPickaxe, Drop(Items.goldBlock, 1)));
193 			this.register(new MineableBlock(_.diamondBlock, ironPickaxe, Drop(Items.diamondBlock, 1)));
194 			this.register(new MineableBlock(_.emeraldBlock, ironPickaxe, Drop(Items.emeraldBlock, 1)));
195 			this.register(new MineableBlock(_.redstoneBlock, woodPickaxe, Drop(Items.redstoneBlock, 1)));
196 			this.register(new MineableBlock(_.lapisLazuliOre, stonePickaxe, Drop(Items.lapisLazuliBlock, 1)));
197 			this.register(new MineableBlock(_.netherReactorCore, woodPickaxe, [Drop(Items.diamond, 3), Drop(Items.ironIngot, 6)]));
198 			this.register(new MineableBlock(_.activeNetherReactorCore, woodPickaxe, [Drop(Items.diamond, 3), Drop(Items.ironIngot, 6)]));
199 			this.register(new MineableBlock(_.usedNetherReactorCore, woodPickaxe, [Drop(Items.diamond, 3), Drop(Items.ironIngot, 6)]));
200 			this.register(new SuffocatingSpreadingBlock(_.grass, MiningTool(false, Tools.shovel, Tools.wood), [Drop(Items.dirt, 1, 1, Items.grass)], [Blocks.dirt], 1, 1, 2, 2, Blocks.dirt));
201 			this.register(new MineableBlock(_.dirt, MiningTool(false, Tools.shovel, Tools.wood), Drop(Items.dirt, 1)));
202 			this.register(new MineableBlock(_.coarseDirt, MiningTool(false, Tools.shovel, Tools.wood), Drop(Items.dirt, 1)));
203 			this.register(new MineableBlock(_.podzol, MiningTool(false, Tools.shovel, Tools.wood), Drop(Items.dirt, 1, 1, Items.podzol)));
204 			this.register(new SpreadingBlock(_.mycelium, MiningTool(false, Tools.shovel, Tools.wood), [Drop(Items.dirt, 1, 1, Items.mycelium)], [Blocks.dirt, Blocks.grass, Blocks.podzol], 1, 1, 3, 1));
205 			this.register(new MineableBlock(_.grassPath, MiningTool(false, Tools.shovel, Tools.wood), Drop(Items.grassPath, 1)));
206 			this.register(new FertileTerrainBlock!false(_.farmland0, Blocks.farmland7, Blocks.dirt));
207 			this.register(new FertileTerrainBlock!false(_.farmland1, Blocks.farmland7, Blocks.farmland0));
208 			this.register(new FertileTerrainBlock!false(_.farmland2, Blocks.farmland7, Blocks.farmland1));
209 			this.register(new FertileTerrainBlock!false(_.farmland3, Blocks.farmland7, Blocks.farmland2));
210 			this.register(new FertileTerrainBlock!false(_.farmland4, Blocks.farmland7, Blocks.farmland4));
211 			this.register(new FertileTerrainBlock!false(_.farmland5, Blocks.farmland7, Blocks.farmland4));
212 			this.register(new FertileTerrainBlock!false(_.farmland6, Blocks.farmland7, Blocks.farmland5));
213 			this.register(new FertileTerrainBlock!true(_.farmland7, 0, Blocks.farmland6));
214 			this.register(new MineableBlock(_.oakWoodPlanks, woodAxe, Drop(Items.oakWoodPlanks, 1)));
215 			this.register(new MineableBlock(_.spruceWoodPlanks, woodAxe, Drop(Items.spruceWoodPlanks, 1)));
216 			this.register(new MineableBlock(_.birchWoodPlanks, woodAxe, Drop(Items.birchWoodPlanks, 1)));
217 			this.register(new MineableBlock(_.jungleWoodPlanks, woodAxe, Drop(Items.jungleWoodPlanks, 1)));
218 			this.register(new MineableBlock(_.acaciaWoodPlanks, woodAxe, Drop(Items.acaciaWoodPlanks, 1)));
219 			this.register(new MineableBlock(_.darkOakWoodPlanks, woodAxe, Drop(Items.darkOakWoodPlanks, 1)));
220 			this.register(new SaplingBlock(_.oakSapling, Items.oakSapling, Blocks.oakWood, Blocks.oakLeaves));
221 			this.register(new SaplingBlock(_.spruceSapling, Items.spruceSapling, Blocks.spruceWood, Blocks.spruceLeaves));
222 			this.register(new SaplingBlock(_.birchSapling, Items.birchSapling, Blocks.birchWood, Blocks.birchLeaves));
223 			this.register(new SaplingBlock(_.jungleSapling, Items.jungleSapling, Blocks.jungleWood, Blocks.jungleLeaves));
224 			this.register(new SaplingBlock(_.acaciaSapling, Items.acaciaSapling, Blocks.acaciaWood, Blocks.acaciaLeaves));
225 			this.register(new SaplingBlock(_.darkOakSapling, Items.darkOakSapling, Blocks.darkOakWood, Blocks.darkOakLeaves));
226 			this.register(new Block(_.bedrock));
227 			this.register(new GravityBlock(_.sand, MiningTool(false, Tools.shovel, Tools.wood), Drop(Items.sand, 1)));
228 			this.register(new GravityBlock(_.redSand, MiningTool(false, Tools.shovel, Tools.wood), Drop(Items.redSand, 1)));
229 			this.register(new GravelBlock(_.gravel));
230 			this.register(new WoodBlock(_.oakWoodUpDown, Items.oakWood));
231 			this.register(new WoodBlock(_.oakWoodEastWest, Items.oakWood));
232 			this.register(new WoodBlock(_.oakWoodNorthSouth, Items.oakWood));
233 			this.register(new WoodBlock(_.oakWoodBark, Items.oakWood));
234 			this.register(new WoodBlock(_.spruceWoodUpDown, Items.spruceWood));
235 			this.register(new WoodBlock(_.spruceWoodEastWest, Items.spruceWood));
236 			this.register(new WoodBlock(_.spruceWoodNorthSouth, Items.spruceWood));
237 			this.register(new WoodBlock(_.spruceWoodBark, Items.spruceWood));
238 			this.register(new WoodBlock(_.birchWoodUpDown, Items.birchWood));
239 			this.register(new WoodBlock(_.birchWoodEastWest, Items.birchWood));
240 			this.register(new WoodBlock(_.birchWoodNorthSouth, Items.birchWood));
241 			this.register(new WoodBlock(_.birchWoodBark, Items.birchWood));
242 			this.register(new WoodBlock(_.jungleWoodUpDown, Items.jungleWood));
243 			this.register(new WoodBlock(_.jungleWoodEastWest, Items.jungleWood));
244 			this.register(new WoodBlock(_.jungleWoodNorthSouth, Items.jungleWood));
245 			this.register(new WoodBlock(_.jungleWoodBark, Items.jungleWood));
246 			this.register(new WoodBlock(_.acaciaWoodUpDown, Items.acaciaWood));
247 			this.register(new WoodBlock(_.acaciaWoodEastWest, Items.acaciaWood));
248 			this.register(new WoodBlock(_.acaciaWoodNorthSouth, Items.acaciaWood));
249 			this.register(new WoodBlock(_.acaciaWoodBark, Items.acaciaWood));
250 			this.register(new WoodBlock(_.darkOakWoodUpDown, Items.darkOakWood));
251 			this.register(new WoodBlock(_.darkOakWoodEastWest, Items.darkOakWood));
252 			this.register(new WoodBlock(_.darkOakWoodNorthSouth, Items.darkOakWood));
253 			this.register(new WoodBlock(_.darkOakWoodBark, Items.darkOakWood));
254 			this.register(new LeavesBlock!(true, true)(_.oakLeavesDecay, Items.oakLeaves, Items.oakSapling, false));
255 			this.register(new LeavesBlock!(false, true)(_.oakLeavesNoDecay, Items.oakLeaves, Items.oakSapling, false));
256 			this.register(new LeavesBlock!(true, true)(_.oakLeavesCheckDecay, Items.oakLeaves, Items.oakSapling, false));
257 			this.register(new LeavesBlock!(false, true)(_.oakLeavesNoDecayCheckDecay, Items.oakLeaves, Items.oakSapling, false));
258 			this.register(new LeavesBlock!(true, false)(_.spruceLeavesDecay, Items.spruceLeaves, Items.spruceSapling, false));
259 			this.register(new LeavesBlock!(false, false)(_.spruceLeavesNoDecay, Items.spruceLeaves, Items.spruceSapling, false));
260 			this.register(new LeavesBlock!(true, false)(_.spruceLeavesCheckDecay, Items.spruceLeaves, Items.spruceSapling, false));
261 			this.register(new LeavesBlock!(true, false)(_.spruceLeavesNoDecayCheckDecay, Items.spruceLeaves, Items.spruceSapling, false));
262 			this.register(new LeavesBlock!(true, false)(_.birchLeavesDecay, Items.birchLeaves, Items.birchSapling, false));
263 			this.register(new LeavesBlock!(false, false)(_.birchLeavesNoDecay, Items.birchLeaves, Items.birchSapling, false));
264 			this.register(new LeavesBlock!(true, false)(_.birchLeavesCheckDecay, Items.birchLeaves, Items.birchSapling, false));
265 			this.register(new LeavesBlock!(false, false)(_.birchLeavesNoDecayCheckDecay, Items.birchLeaves, Items.birchSapling, false));
266 			this.register(new LeavesBlock!(true, false)(_.jungleLeavesDecay, Items.jungleLeaves, Items.jungleSapling, true));
267 			this.register(new LeavesBlock!(false, false)(_.jungleLeavesNoDecay, Items.jungleLeaves, Items.jungleSapling, true));
268 			this.register(new LeavesBlock!(true, false)(_.jungleLeavesCheckDecay, Items.jungleLeaves, Items.jungleSapling, true));
269 			this.register(new LeavesBlock!(false, true)(_.jungleLeavesNoDecayCheckDecay, Items.jungleLeaves, Items.jungleSapling, true));
270 			this.register(new LeavesBlock!(true, false)(_.acaciaLeavesDecay, Items.acaciaLeaves, Items.acaciaSapling, false));
271 			this.register(new LeavesBlock!(false, false)(_.acaciaLeavesNoDecay, Items.acaciaLeaves, Items.acaciaSapling, false));
272 			this.register(new LeavesBlock!(true, false)(_.acaciaLeavesCheckDecay, Items.acaciaLeaves, Items.acaciaSapling, false));
273 			this.register(new LeavesBlock!(false, false)(_.acaciaLeavesNoDecayCheckDecay, Items.acaciaLeaves, Items.acaciaSapling, false));
274 			this.register(new LeavesBlock!(true, true)(_.darkOakLeavesDecay, Items.darkOakLeaves, Items.darkOakSapling, false));
275 			this.register(new LeavesBlock!(false, true)(_.darkOakLeavesNoDecay, Items.darkOakLeaves, Items.darkOakSapling, false));
276 			this.register(new LeavesBlock!(true, true)(_.darkOakLeavesCheckDecay, Items.darkOakLeaves, Items.darkOakSapling, false));
277 			this.register(new LeavesBlock!(false, true)(_.darkOakLeavesNoDecayCheckDecay, Items.darkOakLeaves, Items.darkOakSapling, false));
278 			this.register(new AbsorbingBlock(_.sponge, Items.sponge, Blocks.wetSponge, Blocks.water, 7, 65));
279 			this.register(new MineableBlock(_.wetSponge, MiningTool.init, Drop(Items.wetSponge, 1)));
280 			this.register(new MineableBlock(_.glass, MiningTool.init, Drop(0, 0, 0, Items.glass)));
281 			this.register(new MineableBlock(_.whiteStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.whiteStainedGlass)));
282 			this.register(new MineableBlock(_.orangeStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.orangeStainedGlass)));
283 			this.register(new MineableBlock(_.magentaStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.magentaStainedGlass)));
284 			this.register(new MineableBlock(_.lightBlueStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.lightBlueStainedGlass)));
285 			this.register(new MineableBlock(_.yellowStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.yellowStainedGlass)));
286 			this.register(new MineableBlock(_.limeStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.limeStainedGlass)));
287 			this.register(new MineableBlock(_.pinkStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.pinkStainedGlass)));
288 			this.register(new MineableBlock(_.grayStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.grayStainedGlass)));
289 			this.register(new MineableBlock(_.lightGrayStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.lightGrayStainedGlass)));
290 			this.register(new MineableBlock(_.cyanStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.cyanStainedGlass)));
291 			this.register(new MineableBlock(_.purpleStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.purpleStainedGlass)));
292 			this.register(new MineableBlock(_.blueStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.blueStainedGlass)));
293 			this.register(new MineableBlock(_.brownStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.brownStainedGlass)));
294 			this.register(new MineableBlock(_.greenStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.greenStainedGlass)));
295 			this.register(new MineableBlock(_.redStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.redStainedGlass)));
296 			this.register(new MineableBlock(_.blackStainedGlass, MiningTool.init, Drop(0, 0, 0, Items.blackStainedGlass)));
297 			this.register(new MineableBlock(_.glassPane, MiningTool.init, Drop(0, 0, 0, Items.glassPane)));
298 			this.register(new MineableBlock(_.whiteStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.whiteStainedGlassPane)));
299 			this.register(new MineableBlock(_.orangeStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.orangeStainedGlassPane)));
300 			this.register(new MineableBlock(_.magentaStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.magentaStainedGlassPane)));
301 			this.register(new MineableBlock(_.lightBlueStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.lightBlueStainedGlassPane)));
302 			this.register(new MineableBlock(_.yellowStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.yellowStainedGlassPane)));
303 			this.register(new MineableBlock(_.limeStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.limeStainedGlassPane)));
304 			this.register(new MineableBlock(_.pinkStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.pinkStainedGlassPane)));
305 			this.register(new MineableBlock(_.grayStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.grayStainedGlassPane)));
306 			this.register(new MineableBlock(_.lightGrayStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.lightGrayStainedGlassPane)));
307 			this.register(new MineableBlock(_.cyanStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.cyanStainedGlassPane)));
308 			this.register(new MineableBlock(_.purpleStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.purpleStainedGlassPane)));
309 			this.register(new MineableBlock(_.blueStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.blueStainedGlassPane)));
310 			this.register(new MineableBlock(_.brownStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.brownStainedGlassPane)));
311 			this.register(new MineableBlock(_.greenStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.greenStainedGlassPane)));
312 			this.register(new MineableBlock(_.redStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.redStainedGlassPane)));
313 			this.register(new MineableBlock(_.blackStainedGlassPane, MiningTool.init, Drop(0, 0, 0, Items.blackStainedGlassPane)));
314 			this.register(new MineableBlock(_.sandstone, woodPickaxe, Drop(Items.sandstone, 1)));
315 			this.register(new MineableBlock(_.chiseledSandstone, woodPickaxe, Drop(Items.chiseledSandstone, 1)));
316 			this.register(new MineableBlock(_.smoothSandstone, woodPickaxe, Drop(Items.smoothSandstone, 1)));
317 			this.register(new MineableBlock(_.redSandstone, woodPickaxe, Drop(Items.redSandstone, 1)));
318 			this.register(new MineableBlock(_.chiseledRedSandstone, woodPickaxe, Drop(Items.chiseledRedSandstone, 1)));
319 			this.register(new MineableBlock(_.smoothRedSandstone, woodPickaxe, Drop(Items.smoothRedSandstone, 1)));
320 			this.register(new MineableBlock(_.whiteWool, MiningTool(false, Tools.shears), Drop(Items.whiteWool, 1)));
321 			this.register(new MineableBlock(_.orangeWool, MiningTool(false, Tools.shears), Drop(Items.orangeWool, 1)));
322 			this.register(new MineableBlock(_.magentaWool, MiningTool(false, Tools.shears), Drop(Items.magentaWool, 1)));
323 			this.register(new MineableBlock(_.lightBlueWool, MiningTool(false, Tools.shears), Drop(Items.lightBlueWool, 1)));
324 			this.register(new MineableBlock(_.yellowWool, MiningTool(false, Tools.shears), Drop(Items.yellowWool, 1)));
325 			this.register(new MineableBlock(_.limeWool, MiningTool(false, Tools.shears), Drop(Items.limeWool, 1)));
326 			this.register(new MineableBlock(_.pinkWool, MiningTool(false, Tools.shears), Drop(Items.pinkWool, 1)));
327 			this.register(new MineableBlock(_.grayWool, MiningTool(false, Tools.shears), Drop(Items.grayWool, 1)));
328 			this.register(new MineableBlock(_.lightGrayWool, MiningTool(false, Tools.shears), Drop(Items.lightGrayWool, 1)));
329 			this.register(new MineableBlock(_.cyanWool, MiningTool(false, Tools.shears), Drop(Items.cyanWool, 1)));
330 			this.register(new MineableBlock(_.purpleWool, MiningTool(false, Tools.shears), Drop(Items.purpleWool, 1)));
331 			this.register(new MineableBlock(_.blueWool, MiningTool(false, Tools.shears), Drop(Items.blueWool, 1)));
332 			this.register(new MineableBlock(_.brownWool, MiningTool(false, Tools.shears), Drop(Items.brownWool, 1)));
333 			this.register(new MineableBlock(_.greenWool, MiningTool(false, Tools.shears), Drop(Items.greenWool, 1)));
334 			this.register(new MineableBlock(_.redWool, MiningTool(false, Tools.shears), Drop(Items.redWool, 1)));
335 			this.register(new MineableBlock(_.blackWool, MiningTool(false, Tools.shears), Drop(Items.blackWool, 1)));
336 			this.register(new MineableBlock(_.whiteCarpet, MiningTool.init, Drop(Items.whiteCarpet, 1)));
337 			this.register(new MineableBlock(_.orangeCarpet, MiningTool.init, Drop(Items.orangeCarpet, 1)));
338 			this.register(new MineableBlock(_.magentaCarpet, MiningTool.init, Drop(Items.magentaCarpet, 1)));
339 			this.register(new MineableBlock(_.lightBlueCarpet, MiningTool.init, Drop(Items.lightBlueCarpet, 1)));
340 			this.register(new MineableBlock(_.yellowCarpet, MiningTool.init, Drop(Items.yellowCarpet, 1)));
341 			this.register(new MineableBlock(_.limeCarpet, MiningTool.init, Drop(Items.limeCarpet, 1)));
342 			this.register(new MineableBlock(_.pinkCarpet, MiningTool.init, Drop(Items.pinkCarpet, 1)));
343 			this.register(new MineableBlock(_.grayCarpet, MiningTool.init, Drop(Items.grayCarpet, 1)));
344 			this.register(new MineableBlock(_.lightGrayCarpet, MiningTool.init, Drop(Items.lightGrayCarpet, 1)));
345 			this.register(new MineableBlock(_.cyanCarpet, MiningTool.init, Drop(Items.cyanCarpet, 1)));
346 			this.register(new MineableBlock(_.purpleCarpet, MiningTool.init, Drop(Items.purpleCarpet, 1)));
347 			this.register(new MineableBlock(_.blueCarpet, MiningTool.init, Drop(Items.blueCarpet, 1)));
348 			this.register(new MineableBlock(_.brownCarpet, MiningTool.init, Drop(Items.brownCarpet, 1)));
349 			this.register(new MineableBlock(_.greenCarpet, MiningTool.init, Drop(Items.greenCarpet, 1)));
350 			this.register(new MineableBlock(_.redCarpet, MiningTool.init, Drop(Items.redCarpet, 1)));
351 			this.register(new MineableBlock(_.blackCarpet, MiningTool.init, Drop(Items.blackCarpet, 1)));
352 			this.register(new FlowerBlock(_.dandelion, Items.dandelion));
353 			this.register(new FlowerBlock(_.poppy, Items.poppy));
354 			this.register(new FlowerBlock(_.blueOrchid, Items.blueOrchid));
355 			this.register(new FlowerBlock(_.allium, Items.allium));
356 			this.register(new FlowerBlock(_.azureBluet, Items.azureBluet));
357 			this.register(new FlowerBlock(_.redTulip, Items.redTulip));
358 			this.register(new FlowerBlock(_.orangeTulip, Items.orangeTulip));
359 			this.register(new FlowerBlock(_.whiteTulip, Items.whiteTulip));
360 			this.register(new FlowerBlock(_.pinkTulip, Items.pinkTulip));
361 			this.register(new FlowerBlock(_.oxeyeDaisy, Items.oxeyeDaisy));
362 			this.register(new DoublePlantBlock(_.sunflowerBottom, false, Blocks.sunflowerTop, Items.sunflower));
363 			this.register(new DoublePlantBlock(_.sunflowerTop, true, Blocks.sunflowerBottom, Items.sunflower));
364 			this.register(new DoublePlantBlock(_.liliacBottom, false, Blocks.liliacTop, Items.liliac));
365 			this.register(new DoublePlantBlock(_.liliacTop, true, Blocks.liliacBottom, Items.liliac));
366 			this.register(new GrassDoublePlantBlock(_.doubleTallgrassBottom, false, Blocks.doubleTallgrassTop, Items.tallGrass));
367 			this.register(new GrassDoublePlantBlock(_.doubleTallgrassTop, true, Blocks.doubleTallgrassBottom, Items.tallGrass));
368 			this.register(new GrassDoublePlantBlock(_.largeFernBottom, false, Blocks.largeFernTop, Items.fern));
369 			this.register(new GrassDoublePlantBlock(_.largeFernTop, true, Blocks.largeFernBottom, Items.fern));
370 			this.register(new DoublePlantBlock(_.roseBushBottom, false, Blocks.roseBushTop, Items.roseBush));
371 			this.register(new DoublePlantBlock(_.roseBushTop, true, Blocks.roseBushBottom, Items.roseBush));
372 			this.register(new DoublePlantBlock(_.peonyBottom, false, Blocks.peonyTop, Items.peony));
373 			this.register(new DoublePlantBlock(_.peonyTop, true, Blocks.peonyBottom, Items.peony));
374 			this.register(new PlantBlock(_.tallGrass, Items.tallGrass, Drop(Items.seeds, 0, 1)));
375 			this.register(new PlantBlock(_.fern, Items.fern, Drop(Items.seeds, 0, 1)));
376 			this.register(new PlantBlock(_.deadBush, Items.deadBush, Drop(Items.stick, 0, 2)));
377 			this.register(new MineableBlock(_.stoneSlab, woodPickaxe, Drop(Items.stoneSlab, 1)));
378 			this.register(new MineableBlock(_.sandstoneSlab, woodPickaxe, Drop(Items.sandstoneSlab, 1)));
379 			this.register(new MineableBlock(_.stoneWoodenSlab, woodPickaxe, Drop(Items.stoneWoodenSlab, 1)));
380 			this.register(new MineableBlock(_.cobblestoneSlab, woodPickaxe, Drop(Items.cobblestoneSlab, 1)));
381 			this.register(new MineableBlock(_.bricksSlab, woodPickaxe, Drop(Items.bricksSlab, 1)));
382 			this.register(new MineableBlock(_.stoneBrickSlab, woodPickaxe, Drop(Items.stoneBrickSlab, 1)));
383 			this.register(new MineableBlock(_.netherBrickSlab, woodPickaxe, Drop(Items.netherBrickSlab, 1)));
384 			this.register(new MineableBlock(_.quartzSlab, woodPickaxe, Drop(Items.quartzSlab, 1)));
385 			this.register(new MineableBlock(_.redSandstoneSlab, woodPickaxe, Drop(Items.redSandstoneSlab, 1)));
386 			this.register(new MineableBlock(_.purpurSlab, woodPickaxe, Drop(Items.purpurSlab, 1)));
387 			this.register(new MineableBlock(_.oakWoodSlab, woodAxe, Drop(Items.oakWoodSlab, 1)));
388 			this.register(new MineableBlock(_.spruceWoodSlab, woodAxe, Drop(Items.spruceWoodSlab, 1)));
389 			this.register(new MineableBlock(_.birchWoodSlab, woodAxe, Drop(Items.birchWoodSlab, 1)));
390 			this.register(new MineableBlock(_.jungleWoodSlab, woodAxe, Drop(Items.jungleWoodSlab, 1)));
391 			this.register(new MineableBlock(_.acaciaWoodSlab, woodAxe, Drop(Items.acaciaWoodSlab, 1)));
392 			this.register(new MineableBlock(_.darkOakWoodSlab, woodAxe, Drop(Items.darkOakWoodSlab, 1)));
393 			this.register(new MineableBlock(_.upperStoneSlab, woodPickaxe, Drop(Items.stoneSlab, 1)));
394 			this.register(new MineableBlock(_.upperSandstoneSlab, woodPickaxe, Drop(Items.sandstoneSlab, 1)));
395 			this.register(new MineableBlock(_.upperStoneWoodenSlab, woodPickaxe, Drop(Items.stoneWoodenSlab, 1)));
396 			this.register(new MineableBlock(_.upperCobblestoneSlab, woodPickaxe, Drop(Items.cobblestoneSlab, 1)));
397 			this.register(new MineableBlock(_.upperBricksSlab, woodPickaxe, Drop(Items.bricksSlab, 1)));
398 			this.register(new MineableBlock(_.upperStoneBrickSlab, woodPickaxe, Drop(Items.stoneBrickSlab, 1)));
399 			this.register(new MineableBlock(_.upperNetherBrickSlab, woodPickaxe, Drop(Items.netherBrickSlab, 1)));
400 			this.register(new MineableBlock(_.upperQuartzSlab, woodPickaxe, Drop(Items.quartzSlab, 1)));
401 			this.register(new MineableBlock(_.upperRedSandstoneSlab, woodPickaxe, Drop(Items.redSandstoneSlab, 1)));
402 			this.register(new MineableBlock(_.upperPurpurSlab, woodPickaxe, Drop(Items.purpurSlab, 1)));
403 			this.register(new MineableBlock(_.upperOakWoodSlab, woodAxe, Drop(Items.oakWoodSlab, 1)));
404 			this.register(new MineableBlock(_.upperSpruceWoodSlab, woodAxe, Drop(Items.spruceWoodSlab, 1)));
405 			this.register(new MineableBlock(_.birchWoodSlab, woodAxe, Drop(Items.birchWoodSlab, 1)));
406 			this.register(new MineableBlock(_.upperJungleWoodSlab, woodAxe, Drop(Items.jungleWoodSlab, 1)));
407 			this.register(new MineableBlock(_.upperAcaciaWoodSlab, woodAxe, Drop(Items.acaciaWoodSlab, 1)));
408 			this.register(new MineableBlock(_.upperDarkOakWoodSlab, woodAxe, Drop(Items.darkOakWoodSlab, 1)));
409 			this.register(new MineableBlock(_.doubleStoneSlab, woodPickaxe, Drop(Items.stoneSlab, 2)));
410 			this.register(new MineableBlock(_.doubleSandstoneSlab, woodPickaxe, Drop(Items.sandstoneSlab, 2)));
411 			this.register(new MineableBlock(_.doubleStoneWoodenSlab, woodPickaxe, Drop(Items.stoneWoodenSlab, 2)));
412 			this.register(new MineableBlock(_.doubleCobblestoneSlab, woodPickaxe, Drop(Items.cobblestoneSlab, 2)));
413 			this.register(new MineableBlock(_.doubleBricksSlab, woodPickaxe, Drop(Items.bricksSlab, 1)));
414 			this.register(new MineableBlock(_.doubleStoneBrickSlab, woodPickaxe, Drop(Items.stoneBrickSlab, 2)));
415 			this.register(new MineableBlock(_.doubleNetherBrickSlab, woodPickaxe, Drop(Items.netherBrickSlab, 2)));
416 			this.register(new MineableBlock(_.doubleQuartzSlab, woodPickaxe, Drop(Items.quartzSlab, 2)));
417 			this.register(new MineableBlock(_.doubleRedSandstoneSlab, woodPickaxe, Drop(Items.redSandstoneSlab, 2)));
418 			this.register(new MineableBlock(_.doublePurpurSlab, woodPickaxe, Drop(Items.purpurSlab, 2)));
419 			this.register(new MineableBlock(_.doubleOakWoodSlab, woodAxe, Drop(Items.oakWoodSlab, 2)));
420 			this.register(new MineableBlock(_.doubleSpruceWoodSlab, woodAxe, Drop(Items.spruceWoodSlab, 2)));
421 			this.register(new MineableBlock(_.birchWoodSlab, woodAxe, Drop(Items.birchWoodSlab, 2)));
422 			this.register(new MineableBlock(_.doubleJungleWoodSlab, woodAxe, Drop(Items.jungleWoodSlab, 2)));
423 			this.register(new MineableBlock(_.doubleAcaciaWoodSlab, woodAxe, Drop(Items.acaciaWoodSlab, 2)));
424 			this.register(new MineableBlock(_.doubleDarkOakWoodSlab, woodAxe, Drop(Items.darkOakWoodSlab, 2)));
425 			this.register(new StairsBlock(_.cobblestoneStairsFacingEast, Facing.east, false, woodPickaxe, Items.cobblestoneStairs));
426 			this.register(new StairsBlock(_.cobblestoneStairsFacingWest, Facing.west, false, woodPickaxe, Items.cobblestoneStairs));
427 			this.register(new StairsBlock(_.cobblestoneStairsFacingSouth, Facing.south, false, woodPickaxe, Items.cobblestoneStairs));
428 			this.register(new StairsBlock(_.cobblestoneStairsFacingNorth, Facing.north, false, woodPickaxe, Items.cobblestoneStairs));
429 			this.register(new StairsBlock(_.upsideDownCobblestoneStairsFacingEast, Facing.east, true, woodPickaxe, Items.cobblestoneStairs));
430 			this.register(new StairsBlock(_.upsideDownCobblestoneStairsFacingWest, Facing.west, true, woodPickaxe, Items.cobblestoneStairs));
431 			this.register(new StairsBlock(_.upsideDownCobblestoneStairsFacingSouth, Facing.south, true, woodPickaxe, Items.cobblestoneStairs));
432 			this.register(new StairsBlock(_.upsideDownCobblestoneStairsFacingNorth, Facing.north, true, woodPickaxe, Items.cobblestoneStairs));
433 			this.register(new StairsBlock(_.brickStairsFacingEast, Facing.east, false, woodPickaxe, Items.brickStairs));
434 			this.register(new StairsBlock(_.brickStairsFacingWest, Facing.west, false, woodPickaxe, Items.brickStairs));
435 			this.register(new StairsBlock(_.brickStairsFacingSouth, Facing.south, false, woodPickaxe, Items.brickStairs));
436 			this.register(new StairsBlock(_.brickStairsFacingNorth, Facing.north, false, woodPickaxe, Items.brickStairs));
437 			this.register(new StairsBlock(_.upsideDownBrickStairsFacingEast, Facing.east, true, woodPickaxe, Items.brickStairs));
438 			this.register(new StairsBlock(_.upsideDownBrickStairsFacingWest, Facing.west, true, woodPickaxe, Items.brickStairs));
439 			this.register(new StairsBlock(_.upsideDownBrickStairsFacingSouth, Facing.south, true, woodPickaxe, Items.brickStairs));
440 			this.register(new StairsBlock(_.upsideDownBrickStairsFacingNorth, Facing.north, true, woodPickaxe, Items.brickStairs));
441 			this.register(new StairsBlock(_.netherBrickStairsFacingEast, Facing.east, false, woodPickaxe, Items.netherBrickStairs));
442 			this.register(new StairsBlock(_.netherBrickStairsFacingWest, Facing.west, false, woodPickaxe, Items.netherBrickStairs));
443 			this.register(new StairsBlock(_.netherBrickStairsFacingSouth, Facing.south, false, woodPickaxe, Items.netherBrickStairs));
444 			this.register(new StairsBlock(_.netherBrickStairsFacingNorth, Facing.north, false, woodPickaxe, Items.netherBrickStairs));
445 			this.register(new StairsBlock(_.upsideDownNetherBrickStairsFacingEast, Facing.east, true, woodPickaxe, Items.netherBrickStairs));
446 			this.register(new StairsBlock(_.upsideDownNetherBrickStairsFacingWest, Facing.west, true, woodPickaxe, Items.netherBrickStairs));
447 			this.register(new StairsBlock(_.upsideDownNetherBrickStairsFacingSouth, Facing.south, true, woodPickaxe, Items.netherBrickStairs));
448 			this.register(new StairsBlock(_.upsideDownNetherBrickStairsFacingNorth, Facing.north, true, woodPickaxe, Items.netherBrickStairs));
449 			this.register(new StairsBlock(_.stoneBrickStairsFacingEast, Facing.east, false, woodPickaxe, Items.stoneBrickStairs));
450 			this.register(new StairsBlock(_.stoneBrickStairsFacingWest, Facing.west, false, woodPickaxe, Items.stoneBrickStairs));
451 			this.register(new StairsBlock(_.stoneBrickStairsFacingSouth, Facing.south, false, woodPickaxe, Items.stoneBrickStairs));
452 			this.register(new StairsBlock(_.stoneBrickStairsFacingNorth, Facing.north, false, woodPickaxe, Items.stoneBrickStairs));
453 			this.register(new StairsBlock(_.upsideDownStoneBrickStairsFacingEast, Facing.east, true, woodPickaxe, Items.stoneBrickStairs));
454 			this.register(new StairsBlock(_.upsideDownStoneBrickStairsFacingWest, Facing.west, true, woodPickaxe, Items.stoneBrickStairs));
455 			this.register(new StairsBlock(_.upsideDownStoneBrickStairsFacingSouth, Facing.south, true, woodPickaxe, Items.stoneBrickStairs));
456 			this.register(new StairsBlock(_.upsideDownStoneBrickStairsFacingNorth, Facing.north, true, woodPickaxe, Items.stoneBrickStairs));
457 			this.register(new StairsBlock(_.purpurStairsFacingEast, Facing.east, false, woodPickaxe, Items.purpurStairs));
458 			this.register(new StairsBlock(_.purpurStairsFacingWest, Facing.west, false, woodPickaxe, Items.purpurStairs));
459 			this.register(new StairsBlock(_.purpurStairsFacingSouth, Facing.south, false, woodPickaxe, Items.purpurStairs));
460 			this.register(new StairsBlock(_.purpurStairsFacingNorth, Facing.north, false, woodPickaxe, Items.purpurStairs));
461 			this.register(new StairsBlock(_.upsideDownPurpurStairsFacingEast, Facing.east, true, woodPickaxe, Items.purpurStairs));
462 			this.register(new StairsBlock(_.upsideDownPurpurStairsFacingWest, Facing.west, true, woodPickaxe, Items.purpurStairs));
463 			this.register(new StairsBlock(_.upsideDownPurpurStairsFacingSouth, Facing.south, true, woodPickaxe, Items.purpurStairs));
464 			this.register(new StairsBlock(_.upsideDownPurpurStairsFacingNorth, Facing.north, true, woodPickaxe, Items.purpurStairs));
465 			this.register(new StairsBlock(_.quartzStairsFacingEast, Facing.east, false, woodPickaxe, Items.quartzStairs));
466 			this.register(new StairsBlock(_.quartzStairsFacingWest, Facing.west, false, woodPickaxe, Items.quartzStairs));
467 			this.register(new StairsBlock(_.quartzStairsFacingSouth, Facing.south, false, woodPickaxe, Items.quartzStairs));
468 			this.register(new StairsBlock(_.quartzStairsFacingNorth, Facing.north, false, woodPickaxe, Items.quartzStairs));
469 			this.register(new StairsBlock(_.upsideDownQuartzStairsFacingEast, Facing.east, true, woodPickaxe, Items.quartzStairs));
470 			this.register(new StairsBlock(_.upsideDownQuartzStairsFacingWest, Facing.west, true, woodPickaxe, Items.quartzStairs));
471 			this.register(new StairsBlock(_.upsideDownQuartzStairsFacingSouth, Facing.south, true, woodPickaxe, Items.quartzStairs));
472 			this.register(new StairsBlock(_.upsideDownQuartzStairsFacingNorth, Facing.north, true, woodPickaxe, Items.quartzStairs));
473 			this.register(new StairsBlock(_.sandstoneStairsFacingEast, Facing.east, false, woodPickaxe, Items.sandstoneStairs));
474 			this.register(new StairsBlock(_.sandstoneStairsFacingWest, Facing.west, false, woodPickaxe, Items.sandstoneStairs));
475 			this.register(new StairsBlock(_.sandstoneStairsFacingSouth, Facing.south, false, woodPickaxe, Items.sandstoneStairs));
476 			this.register(new StairsBlock(_.sandstoneStairsFacingNorth, Facing.north, false, woodPickaxe, Items.sandstoneStairs));
477 			this.register(new StairsBlock(_.upsideDownSandstoneStairsFacingEast, Facing.east, true, woodPickaxe, Items.sandstoneStairs));
478 			this.register(new StairsBlock(_.upsideDownSandstoneStairsFacingWest, Facing.west, true, woodPickaxe, Items.sandstoneStairs));
479 			this.register(new StairsBlock(_.upsideDownSandstoneStairsFacingSouth, Facing.south, true, woodPickaxe, Items.sandstoneStairs));
480 			this.register(new StairsBlock(_.upsideDownSandstoneStairsFacingNorth, Facing.north, true, woodPickaxe, Items.sandstoneStairs));
481 			this.register(new StairsBlock(_.redSandstoneStairsFacingEast, Facing.east, false, woodPickaxe, Items.redSandstoneStairs));
482 			this.register(new StairsBlock(_.redSandstoneStairsFacingWest, Facing.west, false, woodPickaxe, Items.redSandstoneStairs));
483 			this.register(new StairsBlock(_.redSandstoneStairsFacingSouth, Facing.south, false, woodPickaxe, Items.redSandstoneStairs));
484 			this.register(new StairsBlock(_.redSandstoneStairsFacingNorth, Facing.north, false, woodPickaxe, Items.redSandstoneStairs));
485 			this.register(new StairsBlock(_.upsideDownRedSandstoneStairsFacingEast, Facing.east, true, woodPickaxe, Items.redSandstoneStairs));
486 			this.register(new StairsBlock(_.upsideDownRedSandstoneStairsFacingWest, Facing.west, true, woodPickaxe, Items.redSandstoneStairs));
487 			this.register(new StairsBlock(_.upsideDownRedSandstoneStairsFacingSouth, Facing.south, true, woodPickaxe, Items.redSandstoneStairs));
488 			this.register(new StairsBlock(_.upsideDownRedSandstoneStairsFacingNorth, Facing.north, true, woodPickaxe, Items.redSandstoneStairs));
489 			this.register(new StairsBlock(_.oakWoodStairsFacingEast, Facing.east, false, woodAxe, Items.oakWoodStairs));
490 			this.register(new StairsBlock(_.oakWoodStairsFacingWest, Facing.west, false, woodAxe, Items.oakWoodStairs));
491 			this.register(new StairsBlock(_.oakWoodStairsFacingSouth, Facing.south, false, woodAxe, Items.oakWoodStairs));
492 			this.register(new StairsBlock(_.oakWoodStairsFacingNorth, Facing.north, false, woodAxe, Items.oakWoodStairs));
493 			this.register(new StairsBlock(_.upsideDownOakWoodStairsFacingEast, Facing.east, true, woodAxe, Items.oakWoodStairs));
494 			this.register(new StairsBlock(_.upsideDownOakWoodStairsFacingWest, Facing.west, true, woodAxe, Items.oakWoodStairs));
495 			this.register(new StairsBlock(_.upsideDownOakWoodStairsFacingSouth, Facing.south, true, woodAxe, Items.oakWoodStairs));
496 			this.register(new StairsBlock(_.upsideDownOakWoodStairsFacingNorth, Facing.north, true, woodAxe, Items.oakWoodStairs));
497 			this.register(new StairsBlock(_.spruceWoodStairsFacingEast, Facing.east, false, woodAxe, Items.spruceWoodStairs));
498 			this.register(new StairsBlock(_.spruceWoodStairsFacingWest, Facing.west, false, woodAxe, Items.spruceWoodStairs));
499 			this.register(new StairsBlock(_.spruceWoodStairsFacingSouth, Facing.south, false, woodAxe, Items.spruceWoodStairs));
500 			this.register(new StairsBlock(_.spruceWoodStairsFacingNorth, Facing.north, false, woodAxe, Items.spruceWoodStairs));
501 			this.register(new StairsBlock(_.upsideDownSpruceWoodStairsFacingEast, Facing.east, true, woodAxe, Items.spruceWoodStairs));
502 			this.register(new StairsBlock(_.upsideDownSpruceWoodStairsFacingWest, Facing.west, true, woodAxe, Items.spruceWoodStairs));
503 			this.register(new StairsBlock(_.upsideDownSpruceWoodStairsFacingSouth, Facing.south, true, woodAxe, Items.spruceWoodStairs));
504 			this.register(new StairsBlock(_.upsideDownSpruceWoodStairsFacingNorth, Facing.north, true, woodAxe, Items.spruceWoodStairs));
505 			this.register(new StairsBlock(_.birchWoodStairsFacingEast, Facing.east, false, woodAxe, Items.birchWoodStairs));
506 			this.register(new StairsBlock(_.birchWoodStairsFacingWest, Facing.west, false, woodAxe, Items.birchWoodStairs));
507 			this.register(new StairsBlock(_.birchWoodStairsFacingSouth, Facing.south, false, woodAxe, Items.birchWoodStairs));
508 			this.register(new StairsBlock(_.birchWoodStairsFacingNorth, Facing.north, false, woodAxe, Items.birchWoodStairs));
509 			this.register(new StairsBlock(_.upsideDownBirchWoodStairsFacingEast, Facing.east, true, woodAxe, Items.birchWoodStairs));
510 			this.register(new StairsBlock(_.upsideDownBirchWoodStairsFacingWest, Facing.west, true, woodAxe, Items.birchWoodStairs));
511 			this.register(new StairsBlock(_.upsideDownBirchWoodStairsFacingSouth, Facing.south, true, woodAxe, Items.birchWoodStairs));
512 			this.register(new StairsBlock(_.upsideDownBirchWoodStairsFacingNorth, Facing.north, true, woodAxe, Items.birchWoodStairs));
513 			this.register(new StairsBlock(_.jungleWoodStairsFacingEast, Facing.east, false, woodAxe, Items.jungleWoodStairs));
514 			this.register(new StairsBlock(_.jungleWoodStairsFacingWest, Facing.west, false, woodAxe, Items.jungleWoodStairs));
515 			this.register(new StairsBlock(_.jungleWoodStairsFacingSouth, Facing.south, false, woodAxe, Items.jungleWoodStairs));
516 			this.register(new StairsBlock(_.jungleWoodStairsFacingNorth, Facing.north, false, woodAxe, Items.jungleWoodStairs));
517 			this.register(new StairsBlock(_.upsideDownJungleWoodStairsFacingEast, Facing.east, true, woodAxe, Items.jungleWoodStairs));
518 			this.register(new StairsBlock(_.upsideDownJungleWoodStairsFacingWest, Facing.west, true, woodAxe, Items.jungleWoodStairs));
519 			this.register(new StairsBlock(_.upsideDownJungleWoodStairsFacingSouth, Facing.south, true, woodAxe, Items.jungleWoodStairs));
520 			this.register(new StairsBlock(_.upsideDownJungleWoodStairsFacingNorth, Facing.north, true, woodAxe, Items.jungleWoodStairs));
521 			this.register(new StairsBlock(_.acaciaWoodStairsFacingEast, Facing.east, false, woodAxe, Items.acaciaWoodStairs));
522 			this.register(new StairsBlock(_.acaciaWoodStairsFacingWest, Facing.west, false, woodAxe, Items.acaciaWoodStairs));
523 			this.register(new StairsBlock(_.acaciaWoodStairsFacingSouth, Facing.south, false, woodAxe, Items.acaciaWoodStairs));
524 			this.register(new StairsBlock(_.acaciaWoodStairsFacingNorth, Facing.north, false, woodAxe, Items.acaciaWoodStairs));
525 			this.register(new StairsBlock(_.upsideDownAcaciaWoodStairsFacingEast, Facing.east, true, woodAxe, Items.acaciaWoodStairs));
526 			this.register(new StairsBlock(_.upsideDownAcaciaWoodStairsFacingWest, Facing.west, true, woodAxe, Items.acaciaWoodStairs));
527 			this.register(new StairsBlock(_.upsideDownAcaciaWoodStairsFacingSouth, Facing.south, true, woodAxe, Items.acaciaWoodStairs));
528 			this.register(new StairsBlock(_.upsideDownAcaciaWoodStairsFacingNorth, Facing.north, true, woodAxe, Items.acaciaWoodStairs));
529 			this.register(new StairsBlock(_.darkOakWoodStairsFacingEast, Facing.east, false, woodAxe, Items.darkOakWoodStairs));
530 			this.register(new StairsBlock(_.darkOakWoodStairsFacingWest, Facing.west, false, woodAxe, Items.darkOakWoodStairs));
531 			this.register(new StairsBlock(_.darkOakWoodStairsFacingSouth, Facing.south, false, woodAxe, Items.darkOakWoodStairs));
532 			this.register(new StairsBlock(_.darkOakWoodStairsFacingNorth, Facing.north, false, woodAxe, Items.darkOakWoodStairs));
533 			this.register(new StairsBlock(_.upsideDownDarkOakWoodStairsFacingEast, Facing.east, true, woodAxe, Items.darkOakWoodStairs));
534 			this.register(new StairsBlock(_.upsideDownDarkOakWoodStairsFacingWest, Facing.west, true, woodAxe, Items.darkOakWoodStairs));
535 			this.register(new StairsBlock(_.upsideDownDarkOakWoodStairsFacingSouth, Facing.south, true, woodAxe, Items.darkOakWoodStairs));
536 			this.register(new StairsBlock(_.upsideDownDarkOakWoodStairsFacingNorth, Facing.north, true, woodAxe, Items.darkOakWoodStairs));
537 			this.register(new MineableBlock(_.bookshelf, woodAxe, Drop(Items.book, 3, 3, Items.bookshelf)));
538 			this.register(new MineableBlock(_.obsidian, diamondPickaxe, Drop(Items.obsidian, 1)));
539 			this.register(new MineableBlock(_.glowingObsidian, diamondPickaxe, Drop(Items.glowingObsidian, 1)));
540 			this.register(new MineableBlock(_.torchFacingEast, MiningTool.init, Drop(Items.torch, 1)));
541 			this.register(new MineableBlock(_.torchFacingWest, MiningTool.init, Drop(Items.torch, 1)));
542 			this.register(new MineableBlock(_.torchFacingSouth, MiningTool.init, Drop(Items.torch, 1)));
543 			this.register(new MineableBlock(_.torchFacingNorth, MiningTool.init, Drop(Items.torch, 1)));
544 			this.register(new MineableBlock(_.torchFacingUp, MiningTool.init, Drop(Items.torch, 1)));
545 			this.register(new MineableBlock(_.craftingTable, MiningTool(Tools.axe, Tools.all), Drop(Items.craftingTable, 1))); //TODO open window on click
546 			this.register(new StageCropBlock(_.seeds0, Blocks.seeds1, [Drop(Items.seeds, 1)]));
547 			this.register(new StageCropBlock(_.seeds1, Blocks.seeds2, [Drop(Items.seeds, 1)]));
548 			this.register(new StageCropBlock(_.seeds2, Blocks.seeds3, [Drop(Items.seeds, 1)]));
549 			this.register(new StageCropBlock(_.seeds3, Blocks.seeds4, [Drop(Items.seeds, 1)]));
550 			this.register(new StageCropBlock(_.seeds4, Blocks.seeds5, [Drop(Items.seeds, 1)]));
551 			this.register(new StageCropBlock(_.seeds5, Blocks.seeds6, [Drop(Items.seeds, 1)]));
552 			this.register(new StageCropBlock(_.seeds6, Blocks.seeds7, [Drop(Items.seeds, 1)]));
553 			this.register(new FarmingBlock(_.seeds7, [Drop(Items.seeds, 0, 3), Drop(Items.wheat, 1)]));
554 			this.register(new ChanceCropBlock(_.beetroot0, Blocks.beetroot1, [Drop(Items.beetrootSeeds, 1)], 2, 3));
555 			this.register(new ChanceCropBlock(_.beetroot1, Blocks.beetroot2, [Drop(Items.beetrootSeeds, 1)], 2, 3));
556 			this.register(new ChanceCropBlock(_.beetroot2, Blocks.beetroot3, [Drop(Items.beetrootSeeds, 1)], 2, 3));
557 			this.register(new FarmingBlock(_.beetroot3, [Drop(Items.beetroot, 1), Drop(Items.beetrootSeeds, 0, 3)]));
558 			this.register(new StageCropBlock(_.carrot0, Blocks.carrot1, [Drop(Items.carrot, 1)]));
559 			this.register(new StageCropBlock(_.carrot1, Blocks.carrot2, [Drop(Items.carrot, 1)]));
560 			this.register(new StageCropBlock(_.carrot2, Blocks.carrot3, [Drop(Items.carrot, 1)]));
561 			this.register(new StageCropBlock(_.carrot3, Blocks.carrot4, [Drop(Items.carrot, 1)]));
562 			this.register(new StageCropBlock(_.carrot4, Blocks.carrot5, [Drop(Items.carrot, 1)]));
563 			this.register(new StageCropBlock(_.carrot5, Blocks.carrot6, [Drop(Items.carrot, 1)]));
564 			this.register(new StageCropBlock(_.carrot6, Blocks.carrot7, [Drop(Items.carrot, 1)]));
565 			this.register(new FarmingBlock(_.carrot7, [Drop(Items.carrot, 1, 4)]));
566 			this.register(new StageCropBlock(_.potato0, Blocks.potato1, [Drop(Items.potato, 1)]));
567 			this.register(new StageCropBlock(_.potato1, Blocks.potato2, [Drop(Items.potato, 1)]));
568 			this.register(new StageCropBlock(_.potato2, Blocks.potato3, [Drop(Items.potato, 1)]));
569 			this.register(new StageCropBlock(_.potato3, Blocks.potato4, [Drop(Items.potato, 1)]));
570 			this.register(new StageCropBlock(_.potato4, Blocks.potato5, [Drop(Items.potato, 1)]));
571 			this.register(new StageCropBlock(_.potato5, Blocks.potato6, [Drop(Items.potato, 1)]));
572 			this.register(new StageCropBlock(_.potato6, Blocks.potato7, [Drop(Items.potato, 1)]));
573 			this.register(new FarmingBlock(_.potato7, [Drop(Items.potato, 1, 4), Drop(Items.poisonousPotato, -49, 1)]));
574 			this.register(new StemBlock!StageCropBlock(_.melonStem0, Items.melonSeeds, Blocks.melonStem1));
575 			this.register(new StemBlock!StageCropBlock(_.melonStem1, Items.melonSeeds, Blocks.melonStem2));
576 			this.register(new StemBlock!StageCropBlock(_.melonStem2, Items.melonSeeds, Blocks.melonStem3));
577 			this.register(new StemBlock!StageCropBlock(_.melonStem3, Items.melonSeeds, Blocks.melonStem4));
578 			this.register(new StemBlock!StageCropBlock(_.melonStem4, Items.melonSeeds, Blocks.melonStem5));
579 			this.register(new StemBlock!StageCropBlock(_.melonStem5, Items.melonSeeds, Blocks.melonStem6));
580 			this.register(new StemBlock!StageCropBlock(_.melonStem6, Items.melonSeeds, Blocks.melonStem7));
581 			this.register(new StemBlock!(FruitCropBlock!false)(_.melonStem7, Items.melonSeeds, Blocks.melon));
582 			this.register(new StemBlock!StageCropBlock(_.pumpkinStem0, Items.pumpkinSeeds, Blocks.pumpkinStem1));
583 			this.register(new StemBlock!StageCropBlock(_.pumpkinStem1, Items.pumpkinSeeds, Blocks.pumpkinStem2));
584 			this.register(new StemBlock!StageCropBlock(_.pumpkinStem2, Items.pumpkinSeeds, Blocks.pumpkinStem3));
585 			this.register(new StemBlock!StageCropBlock(_.pumpkinStem3, Items.pumpkinSeeds, Blocks.pumpkinStem4));
586 			this.register(new StemBlock!StageCropBlock(_.pumpkinStem4, Items.pumpkinSeeds, Blocks.pumpkinStem5));
587 			this.register(new StemBlock!StageCropBlock(_.pumpkinStem5, Items.pumpkinSeeds, Blocks.pumpkinStem6));
588 			this.register(new StemBlock!StageCropBlock(_.pumpkinStem6, Items.pumpkinSeeds, Blocks.pumpkinStem7));
589 			this.register(new StemBlock!(FruitCropBlock!true)(_.pumpkinStem7, Items.pumpkinSeeds, cast(block_t[4])Blocks.pumpkin[0..4]));
590 			this.register(new SugarCanesBlock(_.sugarCanes0, Blocks.sugarCanes1));
591 			this.register(new SugarCanesBlock(_.sugarCanes1, Blocks.sugarCanes2));
592 			this.register(new SugarCanesBlock(_.sugarCanes2, Blocks.sugarCanes3));
593 			this.register(new SugarCanesBlock(_.sugarCanes3, Blocks.sugarCanes4));
594 			this.register(new SugarCanesBlock(_.sugarCanes4, Blocks.sugarCanes5));
595 			this.register(new SugarCanesBlock(_.sugarCanes5, Blocks.sugarCanes6));
596 			this.register(new SugarCanesBlock(_.sugarCanes6, Blocks.sugarCanes7));
597 			this.register(new SugarCanesBlock(_.sugarCanes7, Blocks.sugarCanes8));
598 			this.register(new SugarCanesBlock(_.sugarCanes8, Blocks.sugarCanes9));
599 			this.register(new SugarCanesBlock(_.sugarCanes9, Blocks.sugarCanes10));
600 			this.register(new SugarCanesBlock(_.sugarCanes10, Blocks.sugarCanes11));
601 			this.register(new SugarCanesBlock(_.sugarCanes11, Blocks.sugarCanes12));
602 			this.register(new SugarCanesBlock(_.sugarCanes12, Blocks.sugarCanes13));
603 			this.register(new SugarCanesBlock(_.sugarCanes13, Blocks.sugarCanes14));
604 			this.register(new SugarCanesBlock(_.sugarCanes14, Blocks.sugarCanes15));
605 			this.register(new SugarCanesBlock(_.sugarCanes15, 0));
606 			this.register(new StageNetherCropBlock(_.netherWart0, Blocks.netherWart1, Drop(Items.netherWart, 1)));
607 			this.register(new StageNetherCropBlock(_.netherWart1, Blocks.netherWart2, Drop(Items.netherWart, 1)));
608 			this.register(new StageNetherCropBlock(_.netherWart2, Blocks.netherWart3, Drop(Items.netherWart, 1)));
609 			this.register(new NetherCropBlock(_.netherWart3, Drop(Items.netherWart, 1, 4, 0))); //TODO +1 with fortune
610 			this.register(new MineableBlock(_.stonecutter, woodPickaxe, Drop(Items.stonecutter, 1)));
611 			this.register(new GravityBlock(_.snowLayer0, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 2)));
612 			this.register(new GravityBlock(_.snowLayer1, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 3)));
613 			this.register(new GravityBlock(_.snowLayer2, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 4)));
614 			this.register(new GravityBlock(_.snowLayer3, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 5)));
615 			this.register(new GravityBlock(_.snowLayer4, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 6)));
616 			this.register(new GravityBlock(_.snowLayer5, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 7)));
617 			this.register(new GravityBlock(_.snowLayer6, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 8)));
618 			this.register(new GravityBlock(_.snowLayer7, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 9)));
619 			this.register(new MineableBlock(_.snow, MiningTool(Tools.shovel, Tools.wood), Drop(Items.snowball, 4, 4, Items.snowBlock)));
620 			this.register(new CactusBlock(_.cactus0, Blocks.cactus1));
621 			this.register(new CactusBlock(_.cactus1, Blocks.cactus2));
622 			this.register(new CactusBlock(_.cactus2, Blocks.cactus3));
623 			this.register(new CactusBlock(_.cactus3, Blocks.cactus4));
624 			this.register(new CactusBlock(_.cactus4, Blocks.cactus5));
625 			this.register(new CactusBlock(_.cactus5, Blocks.cactus6));
626 			this.register(new CactusBlock(_.cactus6, Blocks.cactus7));
627 			this.register(new CactusBlock(_.cactus7, Blocks.cactus8));
628 			this.register(new CactusBlock(_.cactus8, Blocks.cactus9));
629 			this.register(new CactusBlock(_.cactus9, Blocks.cactus10));
630 			this.register(new CactusBlock(_.cactus10, Blocks.cactus11));
631 			this.register(new CactusBlock(_.cactus11, Blocks.cactus12));
632 			this.register(new CactusBlock(_.cactus12, Blocks.cactus13));
633 			this.register(new CactusBlock(_.cactus13, Blocks.cactus14));
634 			this.register(new CactusBlock(_.cactus14, Blocks.cactus15));
635 			this.register(new CactusBlock(_.cactus15, 0));
636 			this.register(new MineableBlock(_.clay, MiningTool(false, Tools.shovel, Tools.wood), Drop(Items.clay, 4, 4, Items.clayBlock)));
637 			this.register(new MineableBlock(_.hardenedClay, woodPickaxe, Drop(Items.hardenedClay, 1)));
638 			this.register(new MineableBlock(_.whiteStainedClay, woodPickaxe, Drop(Items.whiteStainedClay, 1)));
639 			this.register(new MineableBlock(_.orangeStainedClay, woodPickaxe, Drop(Items.orangeStainedClay, 1)));
640 			this.register(new MineableBlock(_.magentaStainedClay, woodPickaxe, Drop(Items.magentaStainedClay, 1)));
641 			this.register(new MineableBlock(_.lightBlueStainedClay, woodPickaxe, Drop(Items.lightBlueStainedClay, 1)));
642 			this.register(new MineableBlock(_.yellowStainedClay, woodPickaxe, Drop(Items.yellowStainedClay, 1)));
643 			this.register(new MineableBlock(_.limeStainedClay, woodPickaxe, Drop(Items.limeStainedClay, 1)));
644 			this.register(new MineableBlock(_.pinkStainedClay, woodPickaxe, Drop(Items.pinkStainedClay, 1)));
645 			this.register(new MineableBlock(_.grayStainedClay, woodPickaxe, Drop(Items.grayStainedClay, 1)));
646 			this.register(new MineableBlock(_.lightGrayStainedClay, woodPickaxe, Drop(Items.lightGrayStainedClay, 1)));
647 			this.register(new MineableBlock(_.cyanStainedClay, woodPickaxe, Drop(Items.cyanStainedClay, 1)));
648 			this.register(new MineableBlock(_.purpleStainedClay, woodPickaxe, Drop(Items.purpleStainedClay, 1)));
649 			this.register(new MineableBlock(_.blueStainedClay, woodPickaxe, Drop(Items.blueStainedClay, 1)));
650 			this.register(new MineableBlock(_.brownStainedClay, woodPickaxe, Drop(Items.brownStainedClay, 1)));
651 			this.register(new MineableBlock(_.greenStainedClay, woodPickaxe, Drop(Items.greenStainedClay, 1)));
652 			this.register(new MineableBlock(_.redStainedClay, woodPickaxe, Drop(Items.redStainedClay, 1)));
653 			this.register(new MineableBlock(_.blackStainedClay, woodPickaxe, Drop(Items.blackStainedClay, 1)));
654 			this.register(new MineableBlock(_.pumpkinFacingSouth, woodAxe, Drop(Items.pumpkin, 1)));
655 			this.register(new MineableBlock(_.pumpkinFacingWest, woodAxe, Drop(Items.pumpkin, 1)));
656 			this.register(new MineableBlock(_.pumpkinFacingNorth, woodAxe, Drop(Items.pumpkin, 1)));
657 			this.register(new MineableBlock(_.pumpkinFacingEast, woodAxe, Drop(Items.pumpkin, 1)));
658 			this.register(new MineableBlock(_.facelessPumpkinFacingSouth, woodAxe, Drop(Items.pumpkin, 1)));
659 			this.register(new MineableBlock(_.facelessPumpkinFacingWest, woodAxe, Drop(Items.pumpkin, 1)));
660 			this.register(new MineableBlock(_.facelessPumpkinFacingNorth, woodAxe, Drop(Items.pumpkin, 1)));
661 			this.register(new MineableBlock(_.facelessPumpkinFacingEast, woodAxe, Drop(Items.pumpkin, 1)));
662 			this.register(new MineableBlock(_.jackOLanternFacingSouth, woodAxe, Drop(Items.jackOLantern, 1)));
663 			this.register(new MineableBlock(_.jackOLanternFacingWest, woodAxe, Drop(Items.jackOLantern, 1)));
664 			this.register(new MineableBlock(_.jackOLanternFacingNorth, woodAxe, Drop(Items.jackOLantern, 1)));
665 			this.register(new MineableBlock(_.jackOLanternFacingEast, woodAxe, Drop(Items.jackOLantern, 1)));
666 			this.register(new MineableBlock(_.facelessJackOLanternFacingSouth, woodAxe, Drop(Items.jackOLantern, 1)));
667 			this.register(new MineableBlock(_.facelessJackOLanternFacingWest, woodAxe, Drop(Items.jackOLantern, 1)));
668 			this.register(new MineableBlock(_.facelessJackOLanternFacingNorth, woodAxe, Drop(Items.jackOLantern, 1)));
669 			this.register(new MineableBlock(_.facelessJackOLanternFacingEast, woodAxe, Drop(Items.jackOLantern, 1)));
670 			this.register(new MineableBlock(_.netherrack, woodPickaxe, Drop(Items.netherrack, 1))); //TODO infinite fire
671 			this.register(new MineableBlock(_.soulSand, MiningTool(false, Tools.pickaxe, Tools.wood), Drop(Items.soulSand, 1)));
672 			this.register(new MineableBlock(_.glowstone, MiningTool.init, Drop(Items.glowstoneDust, 2, 4, Items.glowstone))); //TODO fortune +1 but max 4
673 			this.register(new MineableBlock(_.netherBrick, woodPickaxe, Drop(Items.netherBrick, 1)));
674 			this.register(new MineableBlock(_.redNetherBrick, woodPickaxe, Drop(Items.redNetherBrick, 1)));
675 			this.register(new CakeBlock(_.cake0, Blocks.cake1));
676 			this.register(new CakeBlock(_.cake1, Blocks.cake2));
677 			this.register(new CakeBlock(_.cake2, Blocks.cake3));
678 			this.register(new CakeBlock(_.cake3, Blocks.cake4));
679 			this.register(new CakeBlock(_.cake4, Blocks.cake5));
680 			this.register(new CakeBlock(_.cake5, Blocks.cake6));
681 			this.register(new CakeBlock(_.cake6, 0));
682 			this.register(new SwitchingBlock!false(_.woodenTrapdoorSouthSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.openedWoodenTrapdoorSouthSide));
683 			this.register(new SwitchingBlock!false(_.woodenTrapdoorNorthSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.openedWoodenTrapdoorNorthSide));
684 			this.register(new SwitchingBlock!false(_.woodenTrapdoorEastSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.openedWoodenTrapdoorEastSide));
685 			this.register(new SwitchingBlock!false(_.woodenTrapdoorWestSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.openedWoodenTrapdoorWestSide));
686 			this.register(new SwitchingBlock!false(_.openedWoodenTrapdoorSouthSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.woodenTrapdoorSouthSide));
687 			this.register(new SwitchingBlock!false(_.openedWoodenTrapdoorNorthSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.woodenTrapdoorNorthSide));
688 			this.register(new SwitchingBlock!false(_.openedWoodenTrapdoorEastSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.woodenTrapdoorEastSide));
689 			this.register(new SwitchingBlock!false(_.openedWoodenTrapdoorWestSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.woodenTrapdoorWestSide));
690 			this.register(new SwitchingBlock!false(_.topWoodenTrapdoorSouthSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.openedTopWoodenTrapdoorSouthSide));
691 			this.register(new SwitchingBlock!false(_.topWoodenTrapdoorNorthSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.openedTopWoodenTrapdoorNorthSide));
692 			this.register(new SwitchingBlock!false(_.topWoodenTrapdoorEastSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.openedTopWoodenTrapdoorEastSide));
693 			this.register(new SwitchingBlock!false(_.topWoodenTrapdoorWestSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.openedTopWoodenTrapdoorWestSide));
694 			this.register(new SwitchingBlock!false(_.openedTopWoodenTrapdoorSouthSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.topWoodenTrapdoorSouthSide));
695 			this.register(new SwitchingBlock!false(_.openedTopWoodenTrapdoorNorthSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.topWoodenTrapdoorNorthSide));
696 			this.register(new SwitchingBlock!false(_.openedTopWoodenTrapdoorEastSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.topWoodenTrapdoorEastSide));
697 			this.register(new SwitchingBlock!false(_.openedTopWoodenTrapdoorWestSide, MiningTool(Tools.axe, Tools.all), Drop(Items.woodenTrapdoor, 1), Blocks.topWoodenTrapdoorWestSide));
698 			this.register(new SwitchingBlock!true(_.ironTrapdoorSouthSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.openedIronTrapdoorSouthSide));
699 			this.register(new SwitchingBlock!true(_.ironTrapdoorNorthSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.openedIronTrapdoorNorthSide));
700 			this.register(new SwitchingBlock!true(_.ironTrapdoorEastSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.openedIronTrapdoorEastSide));
701 			this.register(new SwitchingBlock!true(_.ironTrapdoorWestSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.openedIronTrapdoorWestSide));
702 			this.register(new SwitchingBlock!true(_.openedIronTrapdoorSouthSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.ironTrapdoorSouthSide));
703 			this.register(new SwitchingBlock!true(_.openedIronTrapdoorNorthSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.ironTrapdoorNorthSide));
704 			this.register(new SwitchingBlock!true(_.openedIronTrapdoorEastSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.ironTrapdoorEastSide));
705 			this.register(new SwitchingBlock!true(_.openedIronTrapdoorWestSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.ironTrapdoorWestSide));
706 			this.register(new SwitchingBlock!true(_.topIronTrapdoorSouthSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.openedTopIronTrapdoorSouthSide));
707 			this.register(new SwitchingBlock!true(_.topIronTrapdoorNorthSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.openedTopIronTrapdoorNorthSide));
708 			this.register(new SwitchingBlock!true(_.topIronTrapdoorEastSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.openedTopIronTrapdoorEastSide));
709 			this.register(new SwitchingBlock!true(_.topIronTrapdoorWestSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.openedTopIronTrapdoorWestSide));
710 			this.register(new SwitchingBlock!true(_.openedTopIronTrapdoorSouthSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.topIronTrapdoorSouthSide));
711 			this.register(new SwitchingBlock!true(_.openedTopIronTrapdoorNorthSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.topIronTrapdoorNorthSide));
712 			this.register(new SwitchingBlock!true(_.openedTopIronTrapdoorEastSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.topIronTrapdoorEastSide));
713 			this.register(new SwitchingBlock!true(_.openedTopIronTrapdoorWestSide, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironTrapdoor, 1), Blocks.topIronTrapdoorWestSide));
714 			this.register(new MonsterEggBlock(_.stoneMonsterEgg, Blocks.stone));
715 			this.register(new MonsterEggBlock(_.cobblestoneMonsterEgg, Blocks.cobblestone));
716 			this.register(new MonsterEggBlock(_.stoneBrickMonsterEgg, Blocks.stoneBricks));
717 			this.register(new MonsterEggBlock(_.mossyStoneBrickMonsterEgg, Blocks.mossyStoneBricks));
718 			this.register(new MonsterEggBlock(_.crackedStoneBrickMonsterEgg, Blocks.crackedStoneBricks));
719 			this.register(new MonsterEggBlock(_.chiseledStoneBrickMonsterEgg, Blocks.chiseledStoneBricks));
720 			this.register(new MineableBlock(_.brownMushroomPoresEverywhere, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
721 			this.register(new MineableBlock(_.brownMushroomCapTopWestNorth, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
722 			this.register(new MineableBlock(_.brownMushroomCapTopNorth, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
723 			this.register(new MineableBlock(_.brownMushroomCapTopNorthEast, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
724 			this.register(new MineableBlock(_.brownMushroomCapTopWest, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
725 			this.register(new MineableBlock(_.brownMushroomCapTop, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
726 			this.register(new MineableBlock(_.brownMushroomCapTopEast, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
727 			this.register(new MineableBlock(_.brownMushroomCapTopSouthWest, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
728 			this.register(new MineableBlock(_.brownMushroomCapTopSouth, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
729 			this.register(new MineableBlock(_.brownMushroomCapTopEastSouth, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
730 			this.register(new MineableBlock(_.brownMushroomStemEverySide, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
731 			this.register(new MineableBlock(_.brownMushroomCapsEverywhere, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
732 			this.register(new MineableBlock(_.brownMushroomStemsEverywhere, MiningTool(Tools.axe, Tools.all), Drop(Items.brownMushroom, 0, 2, Items.brownMushroomBlock)));
733 			this.register(new MineableBlock(_.redMushroomPoresEverywhere, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
734 			this.register(new MineableBlock(_.redMushroomCapTopWestNorth, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
735 			this.register(new MineableBlock(_.redMushroomCapTopNorth, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
736 			this.register(new MineableBlock(_.redMushroomCapTopNorthEast, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
737 			this.register(new MineableBlock(_.redMushroomCapTopWest, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
738 			this.register(new MineableBlock(_.redMushroomCapTop, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
739 			this.register(new MineableBlock(_.redMushroomCapTopEast, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
740 			this.register(new MineableBlock(_.redMushroomCapTopSouthWest, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
741 			this.register(new MineableBlock(_.redMushroomCapTopSouth, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
742 			this.register(new MineableBlock(_.redMushroomCapTopEastSouth, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
743 			this.register(new MineableBlock(_.redMushroomStemEverySide, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
744 			this.register(new MineableBlock(_.redMushroomCapsEverywhere, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
745 			this.register(new MineableBlock(_.redMushroomStemsEverywhere, MiningTool(Tools.axe, Tools.all), Drop(Items.redMushroom, 0, 2, Items.redMushroomBlock)));
746 			this.register(new MineableBlock(_.ironBars, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.ironBars, 1)));
747 			this.register(new MineableBlock(_.melon, MiningTool(Tools.axe | Tools.sword, Tools.all), Drop(Items.melon, 3, 7, Items.melonBlock)));
748 			this.register(new InactiveEndPortalBlock(_.endPortalFrameSouth, Blocks.activeEndPortalFrameSouth, Facing.south));
749 			this.register(new InactiveEndPortalBlock(_.endPortalFrameWest, Blocks.activeEndPortalFrameWest, Facing.west));
750 			this.register(new InactiveEndPortalBlock(_.endPortalFrameNorth, Blocks.activeEndPortalFrameNorth, Facing.north));
751 			this.register(new InactiveEndPortalBlock(_.endPortalFrameEast, Blocks.activeEndPortalFrameEast, Facing.east));
752 			this.register(new Block(_.activeEndPortalFrameSouth));
753 			this.register(new Block(_.activeEndPortalFrameWest));
754 			this.register(new Block(_.activeEndPortalFrameNorth));
755 			this.register(new Block(_.activeEndPortalFrameEast));
756 			this.register(new MineableBlock(_.endStone, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.endStone, 1)));
757 			this.register(new MineableBlock(_.endStoneBricks, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.endStoneBricks, 1)));
758 			this.register(new Block(_.endPortal)); //TODO teleport to end dimension
759 			this.register(new GrowingBeansBlock(_.cocoaNorth0, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 1), Facing.south, Blocks.cocoaNorth1));
760 			this.register(new GrowingBeansBlock(_.cocoaEast0, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 1), Facing.west, Blocks.cocoaEast1));
761 			this.register(new GrowingBeansBlock(_.cocoaSouth0, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 1), Facing.north, Blocks.cocoaSouth1));
762 			this.register(new GrowingBeansBlock(_.cocoaWest0, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 1), Facing.east, Blocks.cocoaWest1));
763 			this.register(new GrowingBeansBlock(_.cocoaNorth1, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 1), Facing.south, Blocks.cocoaNorth2));
764 			this.register(new GrowingBeansBlock(_.cocoaEast1, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 1), Facing.west, Blocks.cocoaEast2));
765 			this.register(new GrowingBeansBlock(_.cocoaSouth1, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 1), Facing.north, Blocks.cocoaSouth2));
766 			this.register(new GrowingBeansBlock(_.cocoaWest1, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 1), Facing.east, Blocks.cocoaWest2));
767 			this.register(new BeansBlock(_.cocoaNorth2, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 2, 3), Facing.south));
768 			this.register(new BeansBlock(_.cocoaEast2, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 2, 3), Facing.west));
769 			this.register(new BeansBlock(_.cocoaSouth2, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 2, 3), Facing.north));
770 			this.register(new BeansBlock(_.cocoaWest2, MiningTool(Tools.axe, Tools.wood), Drop(Items.cocoaBeans, 2, 3), Facing.east));
771 			this.register(new MineableBlock(_.lilyPad, MiningTool.init, Drop(Items.lilyPad, 1))); //TODO drop when the block underneath is not water nor ice
772 			this.register(new MineableBlock(_.quartzBlock, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.quartzBlock, 1)));
773 			this.register(new MineableBlock(_.chiseledQuartzBlock, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.chiseledQuartzBlock, 1)));
774 			this.register(new MineableBlock(_.pillarQuartzBlockVertical, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.pillarQuartzBlock, 1)));
775 			this.register(new MineableBlock(_.pillarQuartzBlockNorthSouth, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.pillarQuartzBlock, 1)));
776 			this.register(new MineableBlock(_.pillarQuartzBlockEastWest, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.pillarQuartzBlock, 1)));
777 			this.register(new Block(_.barrier));
778 			this.register(new MineableBlock(_.prismarine, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.prismarine, 1)));
779 			this.register(new MineableBlock(_.prismarineBricks, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.prismarineBricks, 1)));
780 			this.register(new MineableBlock(_.darkPrismarine, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.darkPrismarine, 1)));
781 			this.register(new MineableBlock(_.seaLantern, MiningTool.init, Drop(Items.prismarineCrystals, 2, 3, Items.seaLantern))); //TODO fortune
782 			this.register(new MineableBlock(_.hayBaleVertical, MiningTool.init, Drop(Items.hayBale, 1)));
783 			this.register(new MineableBlock(_.hayBaleEastWest, MiningTool.init, Drop(Items.hayBale, 1)));
784 			this.register(new MineableBlock(_.hayBaleNorthSouth, MiningTool.init, Drop(Items.hayBale, 1)));
785 			this.register(new MineableBlock(_.endRodFacingDown, MiningTool.init, Drop(Items.endRod, 1)));
786 			this.register(new MineableBlock(_.endRodFacingUp, MiningTool.init, Drop(Items.endRod, 1)));
787 			this.register(new MineableBlock(_.endRodFacingNorth, MiningTool.init, Drop(Items.endRod, 1)));
788 			this.register(new MineableBlock(_.endRodFacingSouth, MiningTool.init, Drop(Items.endRod, 1)));
789 			this.register(new MineableBlock(_.endRodFacingWest, MiningTool.init, Drop(Items.endRod, 1)));
790 			this.register(new MineableBlock(_.endRodFacingEast, MiningTool.init, Drop(Items.endRod, 1)));
791 			this.register(new MineableBlock(_.purpurBlock, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.purpurBlock, 1)));
792 			this.register(new MineableBlock(_.purpurPillarVertical, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.purpurPillar, 1)));
793 			this.register(new MineableBlock(_.purpurPillarEastWest, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.purpurPillar, 1)));
794 			this.register(new MineableBlock(_.purpurPillarNorthSouth, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.purpurPillar, 1)));
795 			this.register(new MineableBlock(_.netherWartBlock, MiningTool.init, Drop(Items.netherWartBlock, 1)));
796 			this.register(new MineableBlock(_.boneBlockVertical, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.boneBlock, 1)));
797 			this.register(new MineableBlock(_.boneBlockEastWest, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.boneBlock, 1)));
798 			this.register(new MineableBlock(_.boneBlockNorthSouth, MiningTool(Tools.pickaxe, Tools.wood), Drop(Items.boneBlock, 1)));
799 			this.register(new Block(_.structureVoid));
800 			this.register(new Block(_.updateBlock));
801 			this.register(new Block(_.ateupdBlock));
802 			
803 		}
804 
805 	}
806 
807 }
808 
809 interface Blocks {
810 
811 	mixin((){
812 		string ret;
813 		foreach(member ; __traits(allMembers, _)) {
814 			ret ~= "enum " ~ member ~ "=_." ~ member ~ ".id;";
815 		}
816 		return ret;
817 	}());
818 
819 	// dirt and related
820 	enum block_t[] farmland = [farmland0, farmland1, farmland2, farmland3, farmland4, farmland5, farmland6, farmland7];
821 	enum block_t[] dirts = cast(block_t[])[dirt, grass, podzol, coarseDirt] ~ farmland;
822 
823 	// wooden logs
824 	enum block_t[] oakWood = [oakWoodUpDown, oakWoodEastWest, oakWoodNorthSouth, oakWoodBark];
825 	enum block_t[] spruceWood = [spruceWoodUpDown, spruceWoodEastWest, spruceWoodNorthSouth, spruceWoodBark];
826 	enum block_t[] birchWood = [birchWoodUpDown, birchWoodEastWest, birchWoodNorthSouth, birchWoodBark];
827 	enum block_t[] jungleWood = [jungleWoodUpDown, jungleWoodEastWest, jungleWoodNorthSouth, jungleWoodBark];
828 	enum block_t[] acaciaWood = [acaciaWoodUpDown, acaciaWoodEastWest, acaciaWoodNorthSouth, acaciaWoodBark];
829 	enum block_t[] darkOakWood = [darkOakWoodUpDown, darkOakWoodEastWest, darkOakWoodNorthSouth, darkOakWoodBark];
830 	enum block_t[] wood = oakWood ~ spruceWood ~ birchWood ~ jungleWood ~ acaciaWood ~ darkOakWood;
831 
832 	// wooden logs (in another order)
833 	enum block_t[] woodUpDown = [oakWoodUpDown, spruceWoodUpDown, birchWoodUpDown, jungleWoodUpDown, acaciaWoodUpDown, darkOakWoodUpDown];
834 	enum block_t[] woodEastWest = [oakWoodEastWest, spruceWoodEastWest, birchWoodEastWest, jungleWoodEastWest, acaciaWoodEastWest, darkOakWoodEastWest];
835 	enum block_t[] woodNorthSouth = [oakWoodNorthSouth, spruceWoodNorthSouth, birchWoodNorthSouth, jungleWoodNorthSouth, acaciaWoodNorthSouth, darkOakWoodNorthSouth];
836 	enum block_t[] woodBark = [oakWoodBark, spruceWoodBark, birchWoodBark, jungleWoodBark, acaciaWoodBark, darkOakWoodBark];
837 
838 	// planks
839 
840 	// leaves
841 	enum block_t[] oakLeaves = [oakLeavesDecay, oakLeavesNoDecay, oakLeavesCheckDecay, oakLeavesNoDecayCheckDecay];
842 	enum block_t[] spruceLeaves = [spruceLeavesDecay, spruceLeavesNoDecay, spruceLeavesCheckDecay, spruceLeavesNoDecayCheckDecay];
843 	enum block_t[] birchLeaves = [birchLeavesDecay, birchLeavesNoDecay, birchLeavesCheckDecay, birchLeavesNoDecayCheckDecay];
844 	enum block_t[] jungleLeaves = [jungleLeavesDecay, jungleLeavesNoDecay, jungleLeavesCheckDecay, jungleLeavesNoDecayCheckDecay];
845 	enum block_t[] acaciaLeaves = [acaciaLeavesDecay, acaciaLeavesNoDecay, acaciaLeavesCheckDecay, acaciaLeavesNoDecayCheckDecay];
846 	enum block_t[] darkOakLeaves = [darkOakLeavesDecay, darkOakLeavesNoDecay, darkOakLeavesCheckDecay, darkOakLeavesNoDecayCheckDecay];
847 	enum block_t[] leaves = oakLeaves ~ spruceLeaves ~ birchLeaves ~ jungleLeaves ~ acaciaLeaves ~ darkOakLeaves;
848 
849 	// leaves (in another order)
850 	enum block_t[] leavesDecay = [oakLeavesDecay, spruceLeavesDecay, birchLeavesDecay, jungleLeavesDecay, acaciaLeavesDecay, darkOakLeavesDecay];
851 	enum block_t[] leavesNoDecay = [oakLeavesNoDecay, spruceLeavesNoDecay, birchLeavesNoDecay, jungleLeavesNoDecay, acaciaLeavesNoDecay, darkOakLeavesNoDecay];
852 	enum block_t[] leavesCheckDecay = [oakLeavesCheckDecay, spruceLeavesCheckDecay, birchLeavesCheckDecay, jungleLeavesCheckDecay, acaciaLeavesCheckDecay, darkOakLeavesCheckDecay];
853 	enum block_t[] leavesNoDecayCheckDecay = [oakLeavesNoDecayCheckDecay, spruceLeavesNoDecayCheckDecay, birchLeavesNoDecayCheckDecay, jungleLeavesNoDecayCheckDecay, acaciaLeavesNoDecayCheckDecay, darkOakLeavesNoDecayCheckDecay];
854 
855 	// water
856 	enum block_t[] flowingWater = [flowingWater0, flowingWater1, flowingWater2, flowingWater3, flowingWater4, flowingWater5, flowingWater6, flowingWater7];
857 	enum block_t[] flowingWaterFalling = [flowingWaterFalling0, flowingWaterFalling1, flowingWaterFalling2, flowingWaterFalling3, flowingWaterFalling4, flowingWaterFalling5, flowingWaterFalling6, flowingWaterFalling7];
858 	enum block_t[] stillWater = [stillWater0, stillWater1, stillWater2, stillWater3, stillWater4, stillWater5, stillWater6, stillWater7];
859 	enum block_t[] stillWaterFalling = [stillWaterFalling0, stillWaterFalling1, stillWaterFalling2, stillWaterFalling3, stillWaterFalling4, stillWaterFalling5, stillWaterFalling6, stillWaterFalling7];
860 	enum block_t[] water = flowingWater ~ flowingWaterFalling ~ stillWater ~ stillWaterFalling;
861 
862 	// lava
863 	enum block_t[] flowingLava = [flowingLava0, flowingLava1, flowingLava2, flowingLava3, flowingLava4, flowingLava5, flowingLava6, flowingLava7];
864 	enum block_t[] flowingLavaFalling = [flowingLavaFalling0, flowingLavaFalling1, flowingLavaFalling2, flowingLavaFalling3, flowingLavaFalling4, flowingLavaFalling5, flowingLavaFalling6, flowingLavaFalling7];
865 	enum block_t[] stillLava = [stillLava0, stillLava1, stillLava2, stillLava3, stillLava4, stillLava5, stillLava6, stillLava7];
866 	enum block_t[] stillLavaFalling = [stillLavaFalling0, stillLavaFalling1, stillLavaFalling2, stillLavaFalling3, stillLavaFalling4, stillLavaFalling5, stillLavaFalling6, stillLavaFalling7];
867 	enum block_t[] lava = flowingLava ~ flowingLavaFalling ~ stillLava ~ stillLavaFalling;
868 
869 	// stairs
870 	enum block_t[] cobblestoneStairs = [cobblestoneStairsFacingEast, cobblestoneStairsFacingWest, cobblestoneStairsFacingSouth, cobblestoneStairsFacingNorth, upsideDownCobblestoneStairsFacingEast, upsideDownCobblestoneStairsFacingWest, upsideDownCobblestoneStairsFacingSouth, upsideDownCobblestoneStairsFacingNorth];
871 	enum block_t[] brickStairs = [brickStairsFacingEast, brickStairsFacingWest, brickStairsFacingSouth, brickStairsFacingNorth, upsideDownBrickStairsFacingEast, upsideDownBrickStairsFacingWest, upsideDownBrickStairsFacingSouth, upsideDownBrickStairsFacingNorth];
872 	enum block_t[] netherStairs = [netherBrickStairsFacingEast, netherBrickStairsFacingWest, netherBrickStairsFacingSouth, netherBrickStairsFacingNorth, upsideDownNetherBrickStairsFacingEast, upsideDownNetherBrickStairsFacingWest, upsideDownNetherBrickStairsFacingSouth, upsideDownNetherBrickStairsFacingNorth];
873 	enum block_t[] stoneBrickStairs = [stoneBrickStairsFacingEast, stoneBrickStairsFacingWest, stoneBrickStairsFacingSouth, stoneBrickStairsFacingNorth, upsideDownStoneBrickStairsFacingEast, upsideDownStoneBrickStairsFacingWest, upsideDownStoneBrickStairsFacingSouth, upsideDownStoneBrickStairsFacingNorth];
874 	enum block_t[] purpurStairs = [purpurStairsFacingEast, purpurStairsFacingWest, purpurStairsFacingSouth, purpurStairsFacingNorth, upsideDownPurpurStairsFacingEast, upsideDownPurpurStairsFacingWest, upsideDownPurpurStairsFacingSouth, upsideDownPurpurStairsFacingNorth];
875 	enum block_t[] quartzStairs = [quartzStairsFacingEast, quartzStairsFacingWest, quartzStairsFacingSouth, quartzStairsFacingNorth, upsideDownQuartzStairsFacingEast, upsideDownQuartzStairsFacingWest, upsideDownQuartzStairsFacingSouth, upsideDownQuartzStairsFacingNorth];
876 	enum block_t[] sandstoneStairs = [sandstoneStairsFacingEast, sandstoneStairsFacingWest, sandstoneStairsFacingSouth, sandstoneStairsFacingNorth, upsideDownSandstoneStairsFacingEast, upsideDownSandstoneStairsFacingWest, upsideDownSandstoneStairsFacingSouth, upsideDownSandstoneStairsFacingNorth];
877 	enum block_t[] redSandstoneStairs = [redSandstoneStairsFacingEast, redSandstoneStairsFacingWest, redSandstoneStairsFacingSouth, redSandstoneStairsFacingNorth, upsideDownRedSandstoneStairsFacingEast, upsideDownRedSandstoneStairsFacingWest, upsideDownRedSandstoneStairsFacingSouth, upsideDownRedSandstoneStairsFacingNorth];
878 	enum block_t[] oakWoodStairs = [oakWoodStairsFacingEast, oakWoodStairsFacingWest, oakWoodStairsFacingSouth, oakWoodStairsFacingNorth, upsideDownOakWoodStairsFacingEast, upsideDownOakWoodStairsFacingWest, upsideDownOakWoodStairsFacingSouth, upsideDownOakWoodStairsFacingNorth];
879 	enum block_t[] spruceWoodStairs = [spruceWoodStairsFacingEast, spruceWoodStairsFacingWest, spruceWoodStairsFacingSouth, spruceWoodStairsFacingNorth, upsideDownSpruceWoodStairsFacingEast, upsideDownSpruceWoodStairsFacingWest, upsideDownSpruceWoodStairsFacingSouth, upsideDownSpruceWoodStairsFacingNorth];
880 	enum block_t[] birchWoodStairs = [birchWoodStairsFacingEast, birchWoodStairsFacingWest, birchWoodStairsFacingSouth, birchWoodStairsFacingNorth, upsideDownBirchWoodStairsFacingEast, upsideDownBirchWoodStairsFacingWest, upsideDownBirchWoodStairsFacingSouth, upsideDownBirchWoodStairsFacingNorth];
881 	enum block_t[] jungleWoodStairs = [jungleWoodStairsFacingEast, jungleWoodStairsFacingWest, jungleWoodStairsFacingSouth, jungleWoodStairsFacingNorth, upsideDownJungleWoodStairsFacingEast, upsideDownJungleWoodStairsFacingWest, upsideDownJungleWoodStairsFacingSouth, upsideDownJungleWoodStairsFacingNorth];
882 	enum block_t[] acaciaWoodStairs = [acaciaWoodStairsFacingEast, acaciaWoodStairsFacingWest, acaciaWoodStairsFacingSouth, acaciaWoodStairsFacingNorth, upsideDownAcaciaWoodStairsFacingEast, upsideDownAcaciaWoodStairsFacingWest, upsideDownAcaciaWoodStairsFacingSouth, upsideDownAcaciaWoodStairsFacingNorth];
883 	enum block_t[] darkOakWoodStairs = [darkOakWoodStairsFacingEast, darkOakWoodStairsFacingWest, darkOakWoodStairsFacingSouth, darkOakWoodStairsFacingNorth, upsideDownDarkOakWoodStairsFacingEast, upsideDownDarkOakWoodStairsFacingWest, upsideDownDarkOakWoodStairsFacingSouth, upsideDownDarkOakWoodStairsFacingNorth];
884 
885 	// blocks with colours
886 	enum block_t[] wool = [whiteWool, orangeWool, magentaWool, lightBlueWool, yellowWool, limeWool, pinkWool, grayWool, lightGrayWool, cyanWool, purpleWool, blueWool, brownWool, greenWool, redWool, blackWool];
887 	enum block_t[] stainedClay = [whiteStainedClay, orangeStainedClay, magentaStainedClay, lightBlueStainedClay, yellowStainedClay, limeStainedClay, pinkStainedClay, grayStainedClay, lightGrayStainedClay, cyanStainedClay, purpleStainedClay, blueStainedClay, brownStainedClay, greenStainedClay, redStainedClay, blackStainedClay];
888 
889 	// torches
890 	enum block_t[] torch = [torchFacingUp, torchFacingEast, torchFacingWest, torchFacingSouth, torchFacingNorth];
891 	enum block_t[] redstoneTorch = [redstoneTorchFacingUp, redstoneTorchFacingEast, redstoneTorchFacingWest, redstoneTorchFacingSouth, redstoneTorchFacingNorth];
892 
893 	// farming
894 	enum block_t[] sugarCanes = [sugarCanes0, sugarCanes1, sugarCanes2, sugarCanes3, sugarCanes4, sugarCanes5, sugarCanes6, sugarCanes7, sugarCanes8, sugarCanes9, sugarCanes10, sugarCanes11, sugarCanes12, sugarCanes13, sugarCanes14, sugarCanes15];
895 	enum block_t[] cactus = [cactus0, cactus1, cactus2, cactus3, cactus4, cactus5, cactus6, cactus7, cactus8, cactus9, cactus10, cactus11, cactus12, cactus13, cactus14, cactus15];
896 
897 	// products of the earth
898 	enum block_t[] pumpkin = [pumpkinFacingSouth, pumpkinFacingWest, pumpkinFacingNorth, pumpkinFacingEast, facelessPumpkinFacingSouth, facelessPumpkinFacingWest, facelessPumpkinFacingNorth, facelessPumpkinFacingEast];
899 
900 	// ice
901 	enum block_t[] frostedIce = [frostedIce0, frostedIce1, frostedIce2, frostedIce3];
902 
903 	// cauldron
904 	enum block_t[] cauldron = [cauldronEmpty, cauldronOneSixthFilled, cauldronOneThirdFilled, cauldronThreeSixthFilled, cauldronTwoThirdFilled, cauldronFiveSixthFilled, cauldronFilled];
905 
906 }