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/item/items.d, selery/item/items.d)
28  */
29 module selery.item.items;
30 
31 import std.string : replace, toLower;
32 
33 import selery.about : item_t;
34 import selery.block.blocks : Blocks;
35 import selery.effect : Effects;
36 import selery.item.consumeable;
37 import selery.item.item : Item, SimpleItem;
38 import selery.item.miscellaneous;
39 import selery.item.placeable;
40 import selery.item.tool;
41 
42 import sul.items : _ = Items;
43 
44 /**
45  * Storage for a world's items.
46  */
47 public class ItemStorage {
48 
49 	private static ItemStorage instance;
50 	
51 	private Item function(ushort damage)[] indexes;
52 	private Item function(ushort damage)[ushort][] java, bedrock;
53 	private Item function(ushort damage)[string] strings;
54 	
55 	public this() {
56 		if(instance is null) {
57 			version(NoItems) {} else {
58 				foreach_reverse(a ; __traits(allMembers, Items)) {
59 					mixin("alias T = Items." ~ a ~ ";");
60 					static if(is(T : Item)) {
61 						static if(__traits(compiles, new T(ushort.max))) {
62 							this.register((ushort damage){ return cast(Item)new T(damage); });
63 						} else {
64 							this.register((ushort damage){ return cast(Item)new T(); });
65 						}
66 					}
67 				}
68 			}
69 			instance = this;
70 		} else {
71 			this.indexes = instance.indexes.dup;
72 			this.java = instance.java.dup;
73 			this.bedrock = instance.bedrock.dup;
74 			this.strings = instance.strings.dup;
75 		}
76 	}
77 
78 	private void register(Item function(ushort) f) {
79 		auto item = f(0);
80 		if(this.indexes.length <= item.data.index) this.indexes.length = item.data.index + 1;
81 		this.indexes[item.data.index] = f;
82 		if(item.java) {
83 			if(this.java.length < item.javaId) this.java.length = item.javaId + 1;
84 			this.java[item.javaId][item.javaMeta] = f;
85 		}
86 		if(item.bedrock) {
87 			if(this.bedrock.length < item.bedrockId) this.bedrock.length = item.bedrockId + 1;
88 			this.bedrock[item.bedrockId][item.bedrockMeta] = f;
89 		}
90 		this.strings[item.name] = f;
91 	}
92 	
93 	public Item function(ushort) getConstructor(size_t index) {
94 		return index < this.indexes.length ? this.indexes[index] : null;
95 	}
96 	
97 	public Item get(size_t index, ushort damage=0) {
98 		return index < this.indexes.length ? this.indexes[index](damage) : null;
99 	}
100 	
101 	public Item fromJava(ushort id, ushort damage=0) {
102 		if(this.java.length < id) return null;
103 		auto data = this.java[id];
104 		auto dam = damage in data;
105 		return dam ? (*dam)(damage) : null;
106 	}
107 	
108 	public Item fromBedrock(ushort id, ushort damage=0) {
109 		if(this.bedrock.length < id) return null;
110 		auto data = this.bedrock[id];
111 		auto dam = damage in data;
112 		return dam ? (*dam)(damage) : null;
113 	}
114 
115 	/**
116 	 * Gets an item using a string.
117 	 * Returns: an instance of Item or null if there are no items with the given name
118 	 * Example:
119 	 * ---
120 	 * assert(items.fromString("grass") == Items.grass);
121 	 * assert(items.fromString("polished granite") == Items.polishedGranite);
122 	 * assert(items.fromString("polished_andesite") == Items.polishedAndesite);
123 	 * assert(items.fromString("not an item") is null);
124 	 * ---
125 	 */
126 	public Item fromString(string name, ushort damage=0) {
127 		auto f = name.toLower.replace("_", " ") in this.strings;
128 		return f ? (*f)(damage) : null;
129 	}
130 
131 }
132 
133 interface Items {
134 
135 	mixin((){
136 		string ret;
137 		foreach(member ; __traits(allMembers, _)) {
138 			ret ~= "enum " ~ member ~ "=_." ~ member ~ ".index;";
139 		}
140 		return ret;
141 	}());
142 
143 	alias Stone = PlaceableItem!(_.stone, Blocks.stone);
144 
145 	alias Granite = PlaceableItem!(_.granite, Blocks.granite);
146 
147 	alias PolishedGranite = PlaceableItem!(_.polishedGranite, Blocks.polishedGranite);
148 
149 	alias Diorite = PlaceableItem!(_.diorite, Blocks.diorite);
150 
151 	alias PolishedDiorite = PlaceableItem!(_.polishedDiorite, Blocks.polishedDiorite);
152 
153 	alias Andesite = PlaceableItem!(_.andesite, Blocks.andesite);
154 
155 	alias PolishedAndesite = PlaceableItem!(_.polishedAndesite, Blocks.polishedAndesite);
156 
157 	alias Grass = PlaceableItem!(_.grass, Blocks.grass);
158 
159 	alias Dirt = PlaceableItem!(_.dirt, Blocks.dirt);
160 
161 	alias CoarseDirt = PlaceableItem!(_.coarseDirt, Blocks.coarseDirt);
162 
163 	alias Podzol = PlaceableItem!(_.podzol, Blocks.podzol);
164 
165 	alias Cobblestone = PlaceableItem!(_.cobblestone, Blocks.cobblestone);
166 
167 	alias OakWoodPlanks = PlaceableItem!(_.oakWoodPlanks, Blocks.oakWoodPlanks);
168 	
169 	alias SpruceWoodPlanks = PlaceableItem!(_.spruceWoodPlanks, Blocks.spruceWoodPlanks);
170 
171 	alias BirchWoodPlanks = PlaceableItem!(_.birchWoodPlanks, Blocks.birchWoodPlanks);
172 
173 	alias JungleWoodPlanks = PlaceableItem!(_.jungleWoodPlanks, Blocks.jungleWoodPlanks);
174 
175 	alias AcaciaWoodPlanks = PlaceableItem!(_.acaciaWoodPlanks, Blocks.acaciaWoodPlanks);
176 
177 	alias DarkOakWoodPlanks = PlaceableItem!(_.darkOakWoodPlanks, Blocks.darkOakWoodPlanks);
178 
179 	alias OakSapling = PlaceableItem!(_.oakSapling, Blocks.oakSapling, Blocks.dirts);
180 
181 	alias SpruceSapling = PlaceableItem!(_.spruceSapling, Blocks.spruceSapling, Blocks.dirts);
182 
183 	alias BirchSapling = PlaceableItem!(_.birchSapling, Blocks.birchSapling, Blocks.dirts);
184 
185 	alias JungleSapling = PlaceableItem!(_.jungleSapling, Blocks.jungleSapling, Blocks.dirts);
186 
187 	alias AcaciaSapling = PlaceableItem!(_.acaciaSapling, Blocks.acaciaSapling, Blocks.dirts);
188 
189 	alias DarkOakSapling = PlaceableItem!(_.darkOakSapling, Blocks.darkOakSapling, Blocks.dirts);
190 
191 	alias Bedrock = PlaceableItem!(_.bedrock, Blocks.bedrock);
192 
193 	alias Sand = PlaceableItem!(_.sand, Blocks.sand);
194 
195 	alias RedSand = PlaceableItem!(_.redSand, Blocks.redSand);
196 
197 	alias Gravel = PlaceableItem!(_.gravel, Blocks.gravel);
198 
199 	alias GoldOre = PlaceableItem!(_.goldOre, Blocks.goldOre);
200 
201 	alias IronOre = PlaceableItem!(_.ironOre, Blocks.ironOre);
202 
203 	alias CoalOre = PlaceableItem!(_.coalOre, Blocks.coalOre);
204 
205 	alias OakWood = WoodItem!(_.oakWood, Blocks.oakWood);
206 
207 	alias SpruceWood = WoodItem!(_.spruceWood, Blocks.spruceWood);
208 
209 	alias BirchWood = WoodItem!(_.birchWood, Blocks.birchWood);
210 
211 	alias JungleWood = WoodItem!(_.jungleWood, Blocks.jungleWood);
212 
213 	alias AcaciaWood = WoodItem!(_.acaciaWood, Blocks.acaciaWood);
214 
215 	alias DarkOakWood = WoodItem!(_.darkOakWood, Blocks.darkOakWood);
216 
217 	alias OakLeaves = PlaceableItem!(_.oakLeaves, Blocks.oakLeavesNoDecay);
218 
219 	alias SpruceLeaves = PlaceableItem!(_.spruceLeaves, Blocks.spruceLeavesNoDecay);
220 
221 	alias BirchLeaves = PlaceableItem!(_.birchLeaves, Blocks.birchLeavesNoDecay);
222 
223 	alias JungleLeaves = PlaceableItem!(_.jungleLeaves, Blocks.jungleLeavesNoDecay);
224 
225 	alias AcaciaLeaves = PlaceableItem!(_.acaciaLeaves, Blocks.acaciaLeavesNoDecay);
226 
227 	alias DarkOakLeaves = PlaceableItem!(_.darkOakLeaves, Blocks.darkOakLeavesNoDecay);
228 
229 	alias Sponge = PlaceableItem!(_.sponge, Blocks.sponge);
230 
231 	alias WetSponge = PlaceableItem!(_.wetSponge, Blocks.wetSponge);
232 
233 	alias Glass = PlaceableItem!(_.glass, Blocks.glass);
234 
235 	alias LapisLazuliOre = PlaceableItem!(_.lapisLazuliOre, Blocks.lapisLazuliOre);
236 
237 	alias LapisLazuliBlock = PlaceableItem!(_.lapisLazuliBlock, Blocks.lapisLazuliBlock);
238 
239 	alias Dispenser = SimpleItem!(_.dispenser);
240 
241 	alias Sandstone = PlaceableItem!(_.sandstone, Blocks.sandstone);
242 
243 	alias ChiseledSandstone = PlaceableItem!(_.chiseledSandstone, Blocks.chiseledSandstone);
244 
245 	alias SmoothSandstone = PlaceableItem!(_.smoothSandstone, Blocks.smoothSandstone);
246 
247 	alias NoteBlock = PlaceableItem!(_.noteBlock, Blocks.noteBlock);
248 
249 	alias PoweredRail = SimpleItem!(_.poweredRail);
250 
251 	alias DetectorRail = SimpleItem!(_.detectorRail);
252 
253 	alias StickyPiston = SimpleItem!(_.stickyPiston);
254 
255 	alias Cobweb = PlaceableItem!(_.cobweb, Blocks.cobweb);
256 
257 	alias TallGrass = PlaceableItem!(_.tallGrass, Blocks.tallGrass, Blocks.dirts);
258 
259 	alias Fern = PlaceableItem!(_.fern, Blocks.fern, Blocks.dirts);
260 
261 	alias DeadBush = PlaceableItem!(_.deadBush, Blocks.deadBush, [Blocks.sand, Blocks.redSand, Blocks.dirt, Blocks.podzol, Blocks.coarseDirt, Blocks.hardenedClay] ~ Blocks.stainedClay);
262 
263 	alias Piston = SimpleItem!(_.piston);
264 
265 	alias WhiteWool = PlaceableItem!(_.whiteWool, Blocks.whiteWool);
266 
267 	alias OrangeWool = PlaceableItem!(_.orangeWool, Blocks.orangeWool);
268 
269 	alias MagentaWool = PlaceableItem!(_.magentaWool, Blocks.magentaWool);
270 
271 	alias LightBlueWool = PlaceableItem!(_.lightBlueWool, Blocks.lightBlueWool);
272 
273 	alias YellowWool = PlaceableItem!(_.yellowWool, Blocks.yellowWool);
274 
275 	alias LimeWool = PlaceableItem!(_.limeWool, Blocks.limeWool);
276 
277 	alias PinkWool = PlaceableItem!(_.pinkWool, Blocks.pinkWool);
278 
279 	alias GrayWool = PlaceableItem!(_.grayWool, Blocks.grayWool);
280 
281 	alias LightGrayWool = PlaceableItem!(_.lightGrayWool, Blocks.lightGrayWool);
282 
283 	alias CyanWool = PlaceableItem!(_.cyanWool, Blocks.cyanWool);
284 
285 	alias PurpleWool = PlaceableItem!(_.purpleWool, Blocks.purpleWool);
286 
287 	alias BlueWool = PlaceableItem!(_.blueWool, Blocks.blueWool);
288 
289 	alias BrownWool = PlaceableItem!(_.brownWool, Blocks.brownWool);
290 
291 	alias GreenWool = PlaceableItem!(_.greenWool, Blocks.greenWool);
292 
293 	alias RedWool = PlaceableItem!(_.redWool, Blocks.redWool);
294 
295 	alias BlackWool = PlaceableItem!(_.blackWool, Blocks.blackWool);
296 
297 	alias Dandelion = PlaceableItem!(_.dandelion, Blocks.dandelion);
298 
299 	alias Poppy = PlaceableItem!(_.poppy, Blocks.poppy);
300 	
301 	alias BlueOrchid = PlaceableItem!(_.blueOrchid, Blocks.blueOrchid);
302 	
303 	alias Allium = PlaceableItem!(_.allium, Blocks.allium);
304 	
305 	alias AzureBluet = PlaceableItem!(_.azureBluet, Blocks.azureBluet);
306 	
307 	alias RedTulip = PlaceableItem!(_.redTulip, Blocks.redTulip);
308 	
309 	alias OrangeTulip = PlaceableItem!(_.orangeTulip, Blocks.orangeTulip);
310 	
311 	alias WhiteTulip = PlaceableItem!(_.whiteTulip, Blocks.whiteTulip);
312 	
313 	alias PinkTulip = PlaceableItem!(_.pinkTulip, Blocks.pinkTulip);
314 	
315 	alias OxeyeDaisy = PlaceableItem!(_.oxeyeDaisy, Blocks.oxeyeDaisy);
316 	
317 	alias BrownMushroom = PlaceableItem!(_.brownMushroom, Blocks.brownMushroom, [Blocks.podzol]);
318 	
319 	alias RedMushroom = PlaceableItem!(_.redMushroom, Blocks.redMushroom, [Blocks.podzol]);
320 	
321 	alias GoldBlock = PlaceableItem!(_.goldBlock, Blocks.goldBlock);
322 	
323 	alias IronBlock = PlaceableItem!(_.ironBlock, Blocks.ironBlock);
324 	
325 	alias StoneSlab = SlabItem!(_.stoneSlab, Blocks.stoneSlab, Blocks.upperStoneSlab, Blocks.doubleStoneSlab);
326 	
327 	alias SandstoneSlab = SlabItem!(_.sandstoneSlab, Blocks.sandstoneSlab, Blocks.upperSandstoneSlab, Blocks.doubleSandstoneSlab);
328 	
329 	alias StoneWoodenSlab = SlabItem!(_.stoneWoodenSlab, Blocks.stoneWoodenSlab, Blocks.upperStoneWoodenSlab, Blocks.doubleStoneWoodenSlab);
330 	
331 	alias CobblestoneSlab = SlabItem!(_.cobblestoneSlab, Blocks.cobblestoneSlab, Blocks.upperCobblestoneSlab, Blocks.doubleCobblestoneSlab);
332 	
333 	alias BricksSlab = SlabItem!(_.bricksSlab, Blocks.bricksSlab, Blocks.upperBricksSlab, Blocks.doubleBricksSlab);
334 	
335 	alias StoneBrickSlab = SlabItem!(_.stoneBrickSlab, Blocks.stoneBrickSlab, Blocks.upperStoneBrickSlab, Blocks.doubleStoneBrickSlab);
336 	
337 	alias NetherBrickSlab = SlabItem!(_.netherBrickSlab, Blocks.netherBrickSlab, Blocks.upperNetherBrickSlab, Blocks.doubleNetherBrickSlab);
338 	
339 	alias QuartzSlab = SlabItem!(_.quartzSlab, Blocks.quartzSlab, Blocks.upperQuartzSlab, Blocks.doubleQuartzSlab);
340 	
341 	alias Bricks = PlaceableItem!(_.bricks, Blocks.bricks);
342 	
343 	alias Tnt = PlaceableItem!(_.tnt, Blocks.tnt);
344 	
345 	alias Bookshelf = PlaceableItem!(_.bookshelf, Blocks.bookshelf);
346 	
347 	alias MossStone = PlaceableItem!(_.mossStone, Blocks.mossStone);
348 	
349 	alias Obsidian = PlaceableItem!(_.obsidian, Blocks.obsidian);
350 	
351 	alias Torch = TorchItem!(_.torch, Blocks.torch);
352 	
353 	alias MonsterSpawner = PlaceableItem!(_.monsterSpawner, Blocks.monsterSpawner);
354 	
355 	alias OakWoodStairs = StairsItem!(_.oakWoodStairs, Blocks.oakWoodStairs);
356 	
357 	//TODO place tile in right direction
358 	
359 	alias DiamondOre = PlaceableItem!(_.diamondOre, Blocks.diamondOre);
360 	
361 	alias DiamondBlock = PlaceableItem!(_.diamondBlock, Blocks.diamondBlock);
362 	
363 	alias CraftingTable = PlaceableItem!(_.craftingTable, Blocks.craftingTable);
364 	
365 	//TODO place tile in the right direction
366 	
367 	//TODO place in the right direction
368 	
369 	alias CobblestoneStairs = StairsItem!(_.cobblestoneStairs, Blocks.cobblestoneStairs);
370 
371 	alias RedstoneOre = PlaceableItem!(_.redstoneOre, Blocks.redstoneOre);
372 
373 	alias Ice = PlaceableItem!(_.ice, Blocks.ice);
374 	
375 	alias SnowBlock = PlaceableItem!(_.snowBlock, Blocks.snow);
376 	
377 	alias Cactus = PlaceableItem!(_.cactus, Blocks.cactus0, [Blocks.sand, Blocks.redSand] ~ Blocks.cactus); //TODO do not place near other blocks
378 	
379 	alias ClayBlock = PlaceableItem!(_.clayBlock, Blocks.clay);
380 	
381 	alias Jukebox = PlaceableItem!(_.jukebox, Blocks.jukebox);
382 
383 	alias Netherrack = PlaceableItem!(_.netherrack, Blocks.netherrack);
384 	
385 	alias SoulSand = PlaceableItem!(_.soulSand, Blocks.soulSand);
386 	
387 	alias Glowstone = PlaceableItem!(_.glowstone, Blocks.glowstone);
388 
389 	alias WhiteStainedGlass = PlaceableItem!(_.whiteStainedGlass, Blocks.whiteStainedGlass);
390 	
391 	alias OrangeStainedGlass = PlaceableItem!(_.orangeStainedGlass, Blocks.orangeStainedGlass);
392 	
393 	alias MagentaStainedGlass = PlaceableItem!(_.magentaStainedGlass, Blocks.magentaStainedGlass);
394 	
395 	alias LightBlueStainedGlass = PlaceableItem!(_.lightBlueStainedGlass, Blocks.lightBlueStainedGlass);
396 	
397 	alias YellowStainedGlass = PlaceableItem!(_.yellowStainedGlass, Blocks.yellowStainedGlass);
398 	
399 	alias LimeStainedGlass = PlaceableItem!(_.limeStainedGlass, Blocks.limeStainedGlass);
400 	
401 	alias PinkStainedGlass = PlaceableItem!(_.pinkStainedGlass, Blocks.pinkStainedGlass);
402 	
403 	alias GrayStainedGlass = PlaceableItem!(_.grayStainedGlass, Blocks.grayStainedGlass);
404 	
405 	alias LightGrayStainedGlass = PlaceableItem!(_.lightGrayStainedGlass, Blocks.lightGrayStainedGlass);
406 	
407 	alias CyanStainedGlass = PlaceableItem!(_.cyanStainedGlass, Blocks.cyanStainedGlass);
408 	
409 	alias PurpleStainedGlass = PlaceableItem!(_.purpleStainedGlass, Blocks.purpleStainedGlass);
410 	
411 	alias BlueStainedGlass = PlaceableItem!(_.blueStainedGlass, Blocks.blueStainedGlass);
412 	
413 	alias BrownStainedGlass = PlaceableItem!(_.brownStainedGlass, Blocks.brownStainedGlass);
414 	
415 	alias GreenStainedGlass = PlaceableItem!(_.greenStainedGlass, Blocks.greenStainedGlass);
416 	
417 	alias RedStainedGlass = PlaceableItem!(_.redStainedGlass, Blocks.redStainedGlass);
418 	
419 	alias BlackStainedGlass = PlaceableItem!(_.blackStainedGlass, Blocks.blackStainedGlass);
420 	
421 	alias StoneMonsterEgg = PlaceableItem!(_.stoneMonsterEgg, Blocks.stoneMonsterEgg);
422 	
423 	alias CobblestoneMonsterEgg = PlaceableItem!(_.cobblestoneMonsterEgg, Blocks.cobblestoneMonsterEgg);
424 	
425 	alias StoneBrickMonsterEgg = PlaceableItem!(_.stoneBrickMonsterEgg, Blocks.stoneBrickMonsterEgg);
426 	
427 	alias MossyStoneBrickMonsterEgg = PlaceableItem!(_.mossyStoneBrickMonsterEgg, Blocks.mossyStoneBrickMonsterEgg);
428 	
429 	alias CrackedStoneBrickMonsterEgg = PlaceableItem!(_.crackedStoneBrickMonsterEgg, Blocks.crackedStoneBrickMonsterEgg);
430 	
431 	alias ChiseledStoneBrickMonsterEgg = PlaceableItem!(_.chiseledStoneBrickMonsterEgg, Blocks.chiseledStoneBrickMonsterEgg);
432 	
433 	alias StoneBricks = PlaceableItem!(_.stoneBricks, Blocks.stoneBricks);
434 	
435 	alias MossyStoneBricks = PlaceableItem!(_.mossyStoneBricks, Blocks.mossyStoneBricks);
436 	
437 	alias CrackedStoneBricks = PlaceableItem!(_.crackedStoneBricks, Blocks.crackedStoneBricks);
438 	
439 	alias ChiseledStoneBricks = PlaceableItem!(_.chiseledStoneBricks, Blocks.chiseledStoneBricks);
440 	
441 	alias BrownMushroomBlock = PlaceableItem!(_.brownMushroomBlock, Blocks.brownMushroomCapsEverywhere);
442 	
443 	alias RedMushroomBlock = PlaceableItem!(_.redMushroomBlock, Blocks.redMushroomCapsEverywhere);
444 	
445 	alias IronBars = PlaceableItem!(_.ironBars, Blocks.ironBars);
446 	
447 	alias GlassPane = PlaceableItem!(_.glassPane, Blocks.glassPane);
448 	
449 	alias MelonBlock = PlaceableItem!(_.melonBlock, Blocks.melon);
450 
451 	alias Mycelium = PlaceableItem!(_.mycelium, Blocks.mycelium);
452 	
453 	alias LilyPad = PlaceableItem!(_.lilyPad, Blocks.lilyPad, [Blocks.flowingWater0, Blocks.stillWater0, Blocks.ice] ~ Blocks.frostedIce);
454 	
455 	alias NetherBrickBlock = PlaceableItem!(_.netherBrickBlock, Blocks.netherBrick);
456 	
457 	alias NetherBrickFence = PlaceableItem!(_.netherBrickFence, Blocks.netherBrickFence);
458 	
459 	alias EnchantmentTable = PlaceableItem!(_.enchantmentTable, Blocks.enchantmentTable);
460 
461 	alias EndStone = PlaceableItem!(_.endStone, Blocks.endStone);
462 	
463 	alias DragonEgg = PlaceableItem!(_.dragonEgg, Blocks.dragonEgg);
464 	
465 	alias RedstoneLamp = PlaceableItem!(_.redstoneLamp, Blocks.redstoneLamp);
466 	
467 	alias EmeraldOre = PlaceableItem!(_.emeraldOre, Blocks.emeraldOre);
468 	
469 	alias EmeraldBlock = PlaceableItem!(_.emeraldBlock, Blocks.emeraldBlock);
470 	
471 	alias Beacon = PlaceableItem!(_.beacon, Blocks.beacon);
472 	
473 	alias CobblestoneWall = PlaceableItem!(_.cobblestoneWall, Blocks.cobblestoneWall);
474 	
475 	alias MossyCobblestoneWall = PlaceableItem!(_.mossyCobblestoneWall, Blocks.mossyCobblestoneWall);
476 
477 	alias RedstoneBlock = PlaceableItem!(_.redstoneBlock, Blocks.redstoneBlock);
478 	
479 	alias NetherQuartzOre = PlaceableItem!(_.netherQuartzOre, Blocks.netherQuartzOre);
480 	
481 	alias QuartzBlock = PlaceableItem!(_.quartzBlock, Blocks.quartzBlock);
482 	
483 	alias ChiseledQuartzBlock = PlaceableItem!(_.chiseledQuartzBlock, Blocks.chiseledQuartzBlock);
484 	
485 	alias WhiteStainedClay = PlaceableItem!(_.whiteStainedClay, Blocks.whiteStainedClay);
486 	
487 	alias OrangeStainedClay = PlaceableItem!(_.orangeStainedClay, Blocks.orangeStainedClay);
488 	
489 	alias MagentaStainedClay = PlaceableItem!(_.magentaStainedClay, Blocks.magentaStainedClay);
490 	
491 	alias LightBlueStainedClay = PlaceableItem!(_.lightBlueStainedClay, Blocks.lightBlueStainedClay);
492 	
493 	alias YellowStainedClay = PlaceableItem!(_.yellowStainedClay, Blocks.yellowStainedClay);
494 	
495 	alias LimeStainedClay = PlaceableItem!(_.limeStainedClay, Blocks.limeStainedClay);
496 	
497 	alias PinkStainedClay = PlaceableItem!(_.pinkStainedClay, Blocks.pinkStainedClay);
498 	
499 	alias GrayStainedClay = PlaceableItem!(_.grayStainedClay, Blocks.grayStainedClay);
500 	
501 	alias LightGrayStainedClay = PlaceableItem!(_.lightGrayStainedClay, Blocks.lightGrayStainedClay);
502 	
503 	alias CyanStainedClay = PlaceableItem!(_.cyanStainedClay, Blocks.cyanStainedClay);
504 	
505 	alias PurpleStainedClay = PlaceableItem!(_.purpleStainedClay, Blocks.purpleStainedClay);
506 	
507 	alias BlueStainedClay = PlaceableItem!(_.blueStainedClay, Blocks.blueStainedClay);
508 	
509 	alias BrownStainedClay = PlaceableItem!(_.brownStainedClay, Blocks.brownStainedClay);
510 	
511 	alias GreenStainedClay = PlaceableItem!(_.greenStainedClay, Blocks.greenStainedClay);
512 	
513 	alias RedStainedClay = PlaceableItem!(_.redStainedClay, Blocks.redStainedClay);
514 	
515 	alias BlackStainedClay = PlaceableItem!(_.blackStainedClay, Blocks.blackStainedClay);
516 
517 	alias WhiteStainedGlassPane = PlaceableItem!(_.whiteStainedGlassPane, Blocks.whiteStainedGlassPane);
518 	
519 	alias OrangeStainedGlassPane = PlaceableItem!(_.orangeStainedGlassPane, Blocks.orangeStainedGlassPane);
520 	
521 	alias MagentaStainedGlassPane = PlaceableItem!(_.magentaStainedGlassPane, Blocks.magentaStainedGlassPane);
522 	
523 	alias LightBlueStainedGlassPane = PlaceableItem!(_.lightBlueStainedGlassPane, Blocks.lightBlueStainedGlassPane);
524 	
525 	alias YellowStainedGlassPane = PlaceableItem!(_.yellowStainedGlassPane, Blocks.yellowStainedGlassPane);
526 	
527 	alias LimeStainedGlassPane = PlaceableItem!(_.limeStainedGlassPane, Blocks.limeStainedGlassPane);
528 	
529 	alias PinkStainedGlassPane = PlaceableItem!(_.pinkStainedGlassPane, Blocks.pinkStainedGlassPane);
530 	
531 	alias GrayStainedGlassPane = PlaceableItem!(_.grayStainedGlassPane, Blocks.grayStainedGlassPane);
532 	
533 	alias LightGrayStainedGlassPane = PlaceableItem!(_.lightGrayStainedGlassPane, Blocks.lightGrayStainedGlassPane);
534 	
535 	alias CyanStainedGlassPane = PlaceableItem!(_.cyanStainedGlassPane, Blocks.cyanStainedGlassPane);
536 	
537 	alias PurpleStainedGlassPane = PlaceableItem!(_.purpleStainedGlassPane, Blocks.purpleStainedGlassPane);
538 	
539 	alias BlueStainedGlassPane = PlaceableItem!(_.blueStainedGlassPane, Blocks.blueStainedGlassPane);
540 	
541 	alias BrownStainedGlassPane = PlaceableItem!(_.brownStainedGlassPane, Blocks.brownStainedGlassPane);
542 	
543 	alias GreenStainedGlassPane = PlaceableItem!(_.greenStainedGlassPane, Blocks.greenStainedGlassPane);
544 	
545 	alias RedStainedGlassPane = PlaceableItem!(_.redStainedGlassPane, Blocks.redStainedGlassPane);
546 	
547 	alias BlackStainedGlassPane = PlaceableItem!(_.blackStainedGlassPane, Blocks.blackStainedGlassPane);
548 
549 	alias SlimeBlock = PlaceableItem!(_.slimeBlock, Blocks.slimeBlock);
550 	
551 	alias Barrier = PlaceableItem!(_.barrier, Blocks.barrier);
552 	alias InvisibleBedrock = Barrier;
553 
554 	alias Prismarine = PlaceableItem!(_.prismarine, Blocks.prismarine);
555 	
556 	alias PrismarineBricks = PlaceableItem!(_.prismarineBricks, Blocks.prismarineBricks);
557 	
558 	alias DarkPrismarine = PlaceableItem!(_.darkPrismarine, Blocks.darkPrismarine);
559 	
560 	alias SeaLantern = PlaceableItem!(_.seaLantern, Blocks.seaLantern);
561 
562 	alias WhiteCarpet = PlaceableItem!(_.whiteCarpet, Blocks.whiteCarpet);
563 	
564 	alias OrangeCarpet = PlaceableItem!(_.orangeCarpet, Blocks.orangeCarpet);
565 	
566 	alias MagentaCarpet = PlaceableItem!(_.magentaCarpet, Blocks.magentaCarpet);
567 	
568 	alias LightBlueCarpet = PlaceableItem!(_.lightBlueCarpet, Blocks.lightBlueCarpet);
569 	
570 	alias YellowCarpet = PlaceableItem!(_.yellowCarpet, Blocks.yellowCarpet);
571 	
572 	alias LimeCarpet = PlaceableItem!(_.limeCarpet, Blocks.limeCarpet);
573 	
574 	alias PinkCarpet = PlaceableItem!(_.pinkCarpet, Blocks.pinkCarpet);
575 	
576 	alias GrayCarpet = PlaceableItem!(_.grayCarpet, Blocks.grayCarpet);
577 	
578 	alias LightGrayCarpet = PlaceableItem!(_.lightGrayCarpet, Blocks.lightGrayCarpet);
579 	
580 	alias CyanCarpet = PlaceableItem!(_.cyanCarpet, Blocks.cyanCarpet);
581 	
582 	alias PurpleCarpet = PlaceableItem!(_.purpleCarpet, Blocks.purpleCarpet);
583 	
584 	alias BlueCarpet = PlaceableItem!(_.blueCarpet, Blocks.blueCarpet);
585 	
586 	alias BrownCarpet = PlaceableItem!(_.brownCarpet, Blocks.brownCarpet);
587 	
588 	alias GreenCarpet = PlaceableItem!(_.greenCarpet, Blocks.greenCarpet);
589 	
590 	alias RedCarpet = PlaceableItem!(_.redCarpet, Blocks.redCarpet);
591 	
592 	alias BlackCarpet = PlaceableItem!(_.blackCarpet, Blocks.blackCarpet);
593 
594 	alias HardenedClay = PlaceableItem!(_.hardenedClay, Blocks.hardenedClay);
595 	
596 	alias CoalBlock = PlaceableItem!(_.coalBlock, Blocks.coalBlock);
597 	
598 	alias PackedIce = PlaceableItem!(_.packedIce, Blocks.packedIce);
599 
600 	alias RedSandstone = PlaceableItem!(_.redSandstone, Blocks.redSandstone);
601 	
602 	alias ChiseledRedSandstone = PlaceableItem!(_.chiseledRedSandstone, Blocks.chiseledRedSandstone);
603 	
604 	alias SmoothRedSandstone = PlaceableItem!(_.smoothRedSandstone, Blocks.smoothRedSandstone);
605 
606 	alias PurpurBlock = PlaceableItem!(_.purpurBlock, Blocks.purpurBlock);
607 
608 	alias EndStoneBricks = PlaceableItem!(_.endStoneBricks, Blocks.endStoneBricks);
609 	
610 	alias GrassPath = PlaceableItem!(_.grassPath, Blocks.grassPath);
611 
612 	alias FrostedIce = PlaceableItem!(_.frostedIce, Blocks.frostedIce0);
613 	
614 	alias MagmaBlock = PlaceableItem!(_.magmaBlock, Blocks.magmaBlock);
615 	
616 	alias NetherWartBlock = PlaceableItem!(_.netherWartBlock, Blocks.netherWartBlock);
617 	
618 	alias RedNetherBrick = PlaceableItem!(_.redNetherBrick, Blocks.redNetherBrick);
619 
620 	alias StructureVoid = PlaceableItem!(_.structureVoid, Blocks.structureVoid);
621 	
622 	alias WhiteShulkerBox = PlaceableItem!(_.whiteShulkerBox, Blocks.whiteShulkerBox);
623 	
624 	alias OrangeShulkerBox = PlaceableItem!(_.orangeShulkerBox, Blocks.orangeShulkerBox);
625 	
626 	alias MagentaShulkerBox = PlaceableItem!(_.magentaShulkerBox, Blocks.magentaShulkerBox);
627 	
628 	alias LightBlueShulkerBox = PlaceableItem!(_.lightBlueShulkerBox, Blocks.lightBlueShulkerBox);
629 	
630 	alias YellowShulkerBox = PlaceableItem!(_.yellowShulkerBox, Blocks.yellowShulkerBox);
631 	
632 	alias LimeShulkerBox = PlaceableItem!(_.limeShulkerBox, Blocks.limeShulkerBox);
633 	
634 	alias PinkShulkerBox = PlaceableItem!(_.pinkShulkerBox, Blocks.pinkShulkerBox);
635 	
636 	alias GrayShulkerBox = PlaceableItem!(_.grayShulkerBox, Blocks.grayShulkerBox);
637 	
638 	alias LightGrayShulkerBox = PlaceableItem!(_.lightGrayShulkerBox, Blocks.lightGrayShulkerBox);
639 	
640 	alias CyanShulkerBox = PlaceableItem!(_.cyanShulkerBox, Blocks.cyanShulkerBox);
641 	
642 	alias PurpleShulkerBox = PlaceableItem!(_.purpleShulkerBox, Blocks.purpleShulkerBox);
643 	
644 	alias BlueShulkerBox = PlaceableItem!(_.blueShulkerBox, Blocks.blueShulkerBox);
645 	
646 	alias BrownShulkerBox = PlaceableItem!(_.brownShulkerBox, Blocks.brownShulkerBox);
647 	
648 	alias GreenShulkerBox = PlaceableItem!(_.greenShulkerBox, Blocks.greenShulkerBox);
649 	
650 	alias RedShulkerBox = PlaceableItem!(_.redShulkerBox, Blocks.redShulkerBox);
651 	
652 	alias BlackShulkerBox = PlaceableItem!(_.blackShulkerBox, Blocks.blackShulkerBox);
653 
654 	alias Stonecutter = PlaceableItem!(_.stonecutter, Blocks.stonecutter);
655 	
656 	alias GlowingObsidian = PlaceableItem!(_.glowingObsidian, Blocks.glowingObsidian);
657 	
658 	alias NetherReactorCore = PlaceableItem!(_.netherReactorCore, Blocks.netherReactorCore);
659 	
660 	alias UpdateBlock = PlaceableItem!(_.updateBlock, Blocks.updateBlock);
661 	
662 	alias AteupdBlock = PlaceableItem!(_.ateupdBlock, Blocks.ateupdBlock);
663 	
664 	alias StructureSave = PlaceableItem!(_.structureSave, Blocks.structureBlockSave);
665 	
666 	alias StructureLoad = PlaceableItem!(_.structureLoad, Blocks.structureBlockLoad);
667 	
668 	alias StructureCorner = PlaceableItem!(_.structureCorner, Blocks.structureBlockCorner);
669 	
670 	alias StructureData = PlaceableItem!(_.structureData, Blocks.structureBlockData);
671 
672 	
673 	alias IronShovel = ShovelItem!(_.ironShovel, Tools.iron, Durability.iron, 4);
674 	
675 	alias IronPickaxe = PickaxeItem!(_.ironPickaxe, Tools.iron, Durability.iron, 5);
676 	
677 	alias IronAxe = AxeItem!(_.ironAxe, Tools.iron, Durability.iron, 6);
678 	
679 	alias Apple = FoodItem!(_.apple, 4, 2.4);
680 
681 	alias Arrow = SimpleItem!(_.arrow);
682 	
683 	alias Coal = SimpleItem!(_.coal);
684 	
685 	alias Charcoal = SimpleItem!(_.charcoal);
686 	
687 	alias Diamond = SimpleItem!(_.diamond);
688 	
689 	alias IronIngot = SimpleItem!(_.ironIngot);
690 	
691 	alias GoldIngot = SimpleItem!(_.goldIngot);
692 	
693 	alias IronSword = SwordItem!(_.ironSword, Tools.iron, Durability.iron, 7);
694 	
695 	alias WoodenSword = SwordItem!(_.woodenSword, Tools.wood, Durability.wood, 5);
696 	
697 	alias WoodenShovel = ShovelItem!(_.woodenShovel, Tools.wood, Durability.wood, 2);
698 	
699 	alias WoodenPickaxe = PickaxeItem!(_.woodenPickaxe, Tools.wood, Durability.wood, 3);
700 	
701 	alias WoodenAxe = AxeItem!(_.woodenAxe, Tools.wood, Durability.wood, 4);
702 	
703 	alias StoneSword = SwordItem!(_.stoneSword, Tools.stone, Durability.stone, 6);
704 	
705 	alias StoneShovel = ShovelItem!(_.stoneShovel, Tools.stone, Durability.stone, 3);
706 	
707 	alias StonePickaxe = PickaxeItem!(_.stonePickaxe, Tools.stone, Durability.stone, 4);
708 	
709 	alias StoneAxe = AxeItem!(_.stoneAxe, Tools.stone, Durability.stone, 5);
710 	
711 	alias DiamondSword = SwordItem!(_.diamondSword, Tools.diamond, Durability.diamond, 8);
712 	
713 	alias DiamondShovel = ShovelItem!(_.diamondShovel, Tools.diamond, Durability.diamond, 5);
714 	
715 	alias DiamondPickaxe = PickaxeItem!(_.diamondPickaxe, Tools.diamond, Durability.diamond, 6);
716 	
717 	alias DiamondAxe = AxeItem!(_.diamondAxe, Tools.diamond, Durability.diamond, 7);
718 	
719 	alias Stick = SimpleItem!(_.stick);
720 	
721 	alias Bowl = SimpleItem!(_.bowl);
722 	
723 	alias MushroomStew = SoupItem!(_.mushroomStew, 6, 7.2);
724 	
725 	alias GoldenSword = SwordItem!(_.goldenSword, Tools.gold, Durability.gold, 5);
726 	
727 	alias GoldenShovel = ShovelItem!(_.goldenShovel, Tools.gold, Durability.gold, 2);
728 	
729 	alias GoldenPickaxe = PickaxeItem!(_.goldenPickaxe, Tools.gold, Durability.gold, 3);
730 	
731 	alias GoldenAxe = AxeItem!(_.goldenAxe, Tools.gold, Durability.gold, 4);
732 
733 	alias Feather = SimpleItem!(_.feather);
734 	
735 	alias Gunpowder = SimpleItem!(_.gunpowder);
736 	
737 	alias WoodenHoe = HoeItem!(_.woodenHoe, Tools.wood, Durability.wood);
738 	
739 	alias StoneHoe = HoeItem!(_.stoneHoe, Tools.stone, Durability.stone);
740 	
741 	alias IronHoe = HoeItem!(_.ironHoe, Tools.iron, Durability.iron);
742 	
743 	alias DiamondHoe = HoeItem!(_.diamondHoe, Tools.diamond, Durability.diamond);
744 	
745 	alias GoldenHoe = HoeItem!(_.goldenHoe, Tools.gold, Durability.gold);
746 	
747 	alias Seeds = PlaceableItem!(_.seeds, Blocks.seeds0, Blocks.farmland);
748 	
749 	alias Wheat = SimpleItem!(_.wheat);
750 	
751 	alias Bread = FoodItem!(_.bread, 5, 6);
752 	
753 	alias LeatherCap = ColorableArmorItem!(_.leatherCap, 56, Armor.cap, 1);
754 	
755 	alias LeatherTunic = ColorableArmorItem!(_.leatherTunic, 81, Armor.tunic, 3);
756 	
757 	alias LeatherPants = ColorableArmorItem!(_.leatherPants, 76, Armor.pants, 2);
758 	
759 	alias LeatherBoots = ColorableArmorItem!(_.leatherBoots, 66, Armor.boots, 1);
760 	
761 	alias ChainHelmet = ArmorItem!(_.chainHelmet, 166, Armor.helmet, 2);
762 	
763 	alias ChainChestplate = ArmorItem!(_.chainChestplate, 241, Armor.chestplate, 5);
764 	
765 	alias ChainLeggings = ArmorItem!(_.chainLeggings, 226, Armor.leggings, 4);
766 	
767 	alias ChainBoots = ArmorItem!(_.chainBoots, 196, Armor.boots, 1);
768 	
769 	alias IronHelmet = ArmorItem!(_.ironHelmet, 166, Armor.helmet, 2);
770 	
771 	alias IronChestplate = ArmorItem!(_.ironChestplate, 241, Armor.chestplate, 6);
772 	
773 	alias IronLeggings = ArmorItem!(_.ironLeggings, 226, Armor.leggings, 5);
774 	
775 	alias IronBoots = ArmorItem!(_.ironBoots, 196, Armor.boots, 2);
776 	
777 	alias DiamondHelmet = ArmorItem!(_.diamondHelmet, 364, Armor.helmet, 3);
778 	
779 	alias DiamondChestplate = ArmorItem!(_.diamondChestplate, 529, Armor.chestplate, 8);
780 	
781 	alias DiamondLeggings = ArmorItem!(_.diamondLeggings, 496, Armor.leggings, 6);
782 	
783 	alias DiamondBoots = ArmorItem!(_.diamondBoots, 430, Armor.boots, 3);
784 	
785 	alias GoldenHelmet = ArmorItem!(_.goldenHelmet, 78, Armor.helmet, 2);
786 	
787 	alias GoldenChestplate = ArmorItem!(_.goldenChestplate, 113, Armor.chestplate, 5);
788 	
789 	alias GoldenLeggings = ArmorItem!(_.goldenLeggings, 106, Armor.leggings, 3);
790 	
791 	alias GoldenBoots = ArmorItem!(_.goldenBoots, 92, Armor.boots, 1);
792 	
793 	alias Flint = SimpleItem!(_.flint);
794 	
795 	alias RawPorkchop = FoodItem!(_.rawPorkchop, 3, 1.8);
796 	
797 	alias CookedPorkchop = FoodItem!(_.cookedPorkchop, 8, 12.8);
798 	
799 	alias GoldenApple = FoodItem!(_.goldenApple, 4, 9.6, [effectInfo(Effects.regeneration, 5, "II"), effectInfo(Effects.absorption, 120, "I")]);
800 	
801 	alias EnchantedGoldenApple = FoodItem!(_.enchantedGoldenApple, 4, 9.6, [effectInfo(Effects.regeneration, 20, "II"), effectInfo(Effects.absorption, 120, "IV"), effectInfo(Effects.resistance, 300, "I"), effectInfo(Effects.fireResistance, 300, "I")]);
802 	
803 	alias Leather = SimpleItem!(_.leather);
804 	
805 	alias MilkBucket = ClearEffectsItem!(_.milkBucket, bucket);
806 	
807 	alias Brick = SimpleItem!(_.brick);
808 	
809 	alias Clay = SimpleItem!(_.clay);
810 	
811 	alias Paper = SimpleItem!(_.paper);
812 	
813 	alias Book = SimpleItem!(_.book);
814 	
815 	alias Slimeball = SimpleItem!(_.slimeball);
816 
817 	alias Compass = SimpleItem!(_.compass);
818 	
819 	alias Clock = SimpleItem!(_.clock);
820 	
821 	alias GlowstoneDust = SimpleItem!(_.glowstoneDust);
822 	
823 	alias RawFish = FoodItem!(_.rawFish, 2, .4);
824 	
825 	alias RawSalmon = FoodItem!(_.rawSalmon, 2, .4);
826 	
827 	alias Clowfish = FoodItem!(_.clownfish, 1, .2);
828 	
829 	alias Pufferfish = FoodItem!(_.pufferfish, 1, .2, [effectInfo(Effects.hunger, 15, "III"), effectInfo(Effects.poison, 60, "IV"), effectInfo(Effects.nausea, 15, "II")]);
830 	
831 	alias CookedFish = FoodItem!(_.cookedFish, 5, 6);
832 	
833 	alias CookedSalmon = FoodItem!(_.cookedSalmon, 6, 9.6);
834 	
835 	alias InkSac = SimpleItem!(_.inkSac);
836 	
837 	alias RoseRed = SimpleItem!(_.roseRed);
838 	
839 	alias CactusGreen = SimpleItem!(_.cactusGreen);
840 	
841 	alias CocoaBeans = BeansItem!(_.cocoaBeans, [Blocks.cocoaNorth0, Blocks.cocoaEast0, Blocks.cocoaSouth0, Blocks.cocoaWest0]);
842 	
843 	alias LapisLazuli = SimpleItem!(_.lapisLazuli);
844 	
845 	alias PurpleDye = SimpleItem!(_.purpleDye);
846 	
847 	alias CyanDye = SimpleItem!(_.cyanDye);
848 	
849 	alias LightGrayDye = SimpleItem!(_.lightGrayDye);
850 	
851 	alias GrayDye = SimpleItem!(_.grayDye);
852 	
853 	alias PinkDye = SimpleItem!(_.pinkDye);
854 	
855 	alias LimeDye = SimpleItem!(_.limeDye);
856 	
857 	alias DandelionYellow = SimpleItem!(_.dandelionYellow);
858 	
859 	alias LightBlueDye = SimpleItem!(_.lightBlueDye);
860 	
861 	alias MagentaDye = SimpleItem!(_.magentaDye);
862 	
863 	alias OrangeDye = SimpleItem!(_.orangeDye);
864 	
865 	alias Bone = SimpleItem!(_.bone);
866 	
867 	alias Sugar = SimpleItem!(_.sugar);
868 	
869 	alias Cake = PlaceableItem!(_.cake, Blocks.cake0);
870 	
871 	//TODO beds
872 
873 	alias Cookie = FoodItem!(_.cookie, 2, .4);
874 	
875 	alias Map = MapItem!(_.map);
876 
877 	alias Melon = FoodItem!(_.melon, 2, 1.2);
878 	
879 	alias PumpkinSeeds = PlaceableItem!(_.pumpkinSeeds, Blocks.pumpkinStem0, Blocks.farmland);
880 	
881 	alias MelonSeeds = PlaceableItem!(_.melonSeeds, Blocks.melonStem0, Blocks.farmland);
882 	
883 	alias RawBeef = FoodItem!(_.rawBeef, 3, 1.8);
884 	
885 	alias Steak = FoodItem!(_.steak, 8, 12.8);
886 	
887 	alias RawChicken = FoodItem!(_.rawChicken, 2, 1.2);
888 	
889 	alias CookedChicked = FoodItem!(_.cookedChicken, 6, 7.2);
890 	
891 	alias RottenFlesh = FoodItem!(_.rottenFlesh, 4, .8, [effectInfo(Effects.hunger, 30, "I", .8)]);
892 	
893 	alias BlazeRod = SimpleItem!(_.blazeRod);
894 	
895 	alias GhastTear = SimpleItem!(_.ghastTear);
896 	
897 	alias GoldNugget = SimpleItem!(_.goldNugget);
898 	
899 	alias NetherWart = PlaceableItem!(_.netherWart, Blocks.netherWart0, [Blocks.soulSand]);
900 
901 	alias SpiderEye = SimpleItem!(_.spiderEye);
902 	
903 	alias FermentedSpiderEye = SimpleItem!(_.fermentedSpiderEye);
904 	
905 	alias BlazePowder = SimpleItem!(_.blazePowder);
906 	
907 	alias MagmaCream = SimpleItem!(_.magmaCream);
908 	
909 	alias BrewingStand = PlaceableItem!(_.brewingStand, Blocks.brewingStandEmpty);
910 	
911 	alias Cauldron = PlaceableItem!(_.cauldron, Blocks.cauldronEmpty);
912 	
913 	
914 	alias GlisteringMelon = SimpleItem!(_.glisteringMelon);
915 	
916 	//TODO spawn eggs
917 
918 	alias Emerald = SimpleItem!(_.emerald);
919 
920 	alias FlowerPot = PlaceableOnSolidItem!(_.flowerPot, Blocks.flowerPot);
921 	
922 	alias Carrot = CropFoodItem!(_.carrot, 3, 4.8, Blocks.carrot0);
923 	
924 	alias Potato = CropFoodItem!(_.potato, 1, .6, Blocks.potato0);
925 	
926 	alias BakedPotato = FoodItem!(_.bakedPotato, 5, 7.2);
927 	
928 	alias PoisonousPotato = FoodItem!(_.poisonousPotato, 2, 1.2, [effectInfo(Effects.poison, 4, "I", .6)]);
929 
930 	alias GoldenCarrot = FoodItem!(_.goldenCarrot, 6, 14.4);
931 
932 	alias NetherStar = SimpleItem!(_.netherStar);
933 	
934 	alias PumpkinPie = FoodItem!(_.pumpkinPie, 8, 4.8);
935 	
936 	alias NetherBrick = SimpleItem!(_.netherBrick);
937 	
938 	alias NetherQuartz = SimpleItem!(_.netherQuartz);
939 
940 	alias PrismarineShard = SimpleItem!(_.prismarineShard);
941 	
942 	alias PrismarineCrystals = SimpleItem!(_.prismarineCrystals);
943 	
944 	alias RawRabbit = FoodItem!(_.rawRabbit, 3, 1.8);
945 	
946 	alias CookedRabbit = FoodItem!(_.cookedRabbit, 5, 6);
947 	
948 	alias RabbitStew = SoupItem!(_.rabbitStew, 10, 12);
949 	
950 	alias RabbitFoot = SimpleItem!(_.rabbitFoot);
951 	
952 	alias RabbitHide = SimpleItem!(_.rabbitHide);
953 	
954 	alias RawMutton = FoodItem!(_.rawMutton, 2, 1.2);
955 	
956 	alias CookedMutton = FoodItem!(_.cookedMutton, 6, 9.6);
957 	
958 	alias ChorusFruit = TeleportationItem!(_.chorusFruit, 4, 2.4);
959 	
960 	alias PoppedChorusFruit = SimpleItem!(_.poppedChorusFruit);
961 	
962 	alias Beetroot = FoodItem!(_.beetroot, 1, 1.2);
963 	
964 	alias BeetrootSeeds = PlaceableItem!(_.beetrootSeeds, Blocks.beetroot0, Blocks.farmland);
965 	
966 	alias BeetrootSoup = SoupItem!(_.beetrootSoup, 6, 7.2);
967 	
968 	alias ShulkerShell = SimpleItem!(_.shulkerShell);
969 	
970 	alias IronNugget = SimpleItem!(_.ironNugget);
971 	
972 	//TODO discs
973 
974 
975 	enum item_t invisibleBedrock = barrier;
976 
977 	
978 	enum item_t[] woodPlanks = [oakWoodPlanks, spruceWoodPlanks, birchWoodPlanks, jungleWoodPlanks, acaciaWoodPlanks, darkOakWoodPlanks];
979 	
980 	enum item_t[] sapling = [oakSapling, spruceSapling, birchSapling, acaciaSapling, darkOakSapling];
981 	
982 	enum item_t[] wool = [whiteWool, orangeWool, magentaWool, lightBlueWool, yellowWool, limeWool, pinkWool, grayWool, lightGrayWool, cyanWool, purpleWool, blueWool, brownWool, greenWool, redWool, blackWool];
983 
984 	enum item_t[] stainedGlass = [whiteStainedGlass, orangeStainedGlass, magentaStainedGlass, lightBlueStainedGlass, yellowStainedGlass, limeStainedGlass, pinkStainedGlass, grayStainedGlass, lightGrayStainedGlass, cyanStainedGlass, purpleStainedGlass, blueStainedGlass, brownStainedGlass, greenStainedGlass, redStainedGlass, blackStainedGlass];
985 
986 	enum item_t[] stainedClay = [whiteStainedClay, orangeStainedClay, magentaStainedClay, lightBlueStainedClay, yellowStainedClay, limeStainedClay, pinkStainedClay, grayStainedClay, lightGrayStainedClay, cyanStainedClay, purpleStainedClay, blueStainedClay, brownStainedClay, greenStainedClay, redStainedClay, blackStainedClay];
987 
988 	enum item_t[] stainedGlassPane = [whiteStainedGlassPane, orangeStainedGlassPane, magentaStainedGlassPane, lightBlueStainedGlassPane, yellowStainedGlassPane, limeStainedGlassPane, pinkStainedGlassPane, grayStainedGlassPane, lightGrayStainedGlassPane, cyanStainedGlassPane, purpleStainedGlassPane, blueStainedGlassPane, brownStainedGlassPane, greenStainedGlassPane, redStainedGlassPane, blackStainedGlassPane];
989 
990 	enum item_t[] carpet = [whiteCarpet, orangeCarpet, magentaCarpet, lightBlueCarpet, yellowCarpet, limeCarpet, pinkCarpet, grayCarpet, lightGrayCarpet, cyanCarpet, purpleCarpet, blueCarpet, brownCarpet, greenCarpet, redCarpet, blackCarpet];
991 
992 	enum item_t[] shulkerBox = [whiteShulkerBox, orangeShulkerBox, magentaShulkerBox, lightBlueShulkerBox, yellowShulkerBox, limeShulkerBox, pinkShulkerBox, grayShulkerBox, lightGrayShulkerBox, cyanShulkerBox, purpleShulkerBox, blueShulkerBox, brownShulkerBox, greenShulkerBox, redShulkerBox, blackShulkerBox];
993 
994 }