diff --git a/src/common/resources/lang/en_US/item.lang b/src/common/resources/lang/en_US/item.lang
index e66e80d74..3f8f8fc72 100644
--- a/src/common/resources/lang/en_US/item.lang
+++ b/src/common/resources/lang/en_US/item.lang
@@ -287,7 +287,7 @@ item.dust.sugar.desc=Can craft sweet treats.
 item.food.cake.name=Cake
 item.food.cake.desc=Not a lie!
 item.food.pumpkin_pie.name=Pumpkin Pie
-item.food.pumpkin_pie.desc=Thanks!
+item.food.pumpkin_pie.desc=The cake is a pie!
 item.bed.name=Bed
 item.bed.desc=Take a nap overnight.
 item.repeater.name=Redstone Repeater
@@ -412,4 +412,7 @@ item.door.glass.name=Glass Door
 item.door.glass.desc=Great for aesthetics, terrible for privacy.
 
 item.rope.name=Rope
-item.rope.desc=Strong enough to climb.
\ No newline at end of file
+item.rope.desc=Strong enough to climb.
+
+item.wand.monster.name=Summoning Wand
+item.wand.monster.desc=A magical tool allowing the wielder to manifest living entities.
\ No newline at end of file
diff --git a/src/common/resources/lang/en_US/options.lang b/src/common/resources/lang/en_US/options.lang
index 1217a7a19..951f1dd42 100644
--- a/src/common/resources/lang/en_US/options.lang
+++ b/src/common/resources/lang/en_US/options.lang
@@ -55,6 +55,10 @@ options.slimeParticles=Slime Chunk Particles
 options.3Ditems=3D Items
 options.screenPadding=Screen Padding
 options.gamma=Gamma
+options.brightness=Brightness
+options.brightness.min=Moody
+options.brightness.default=Default
+options.brightness.max=Bright
 options.fxaa=FXAA
 options.placementMode=Placement Mode
 options.placementMode.default=Default
diff --git a/src/common/resources/lang/en_US/strings.lang b/src/common/resources/lang/en_US/strings.lang
index 40b0d9769..35b58ce69 100644
--- a/src/common/resources/lang/en_US/strings.lang
+++ b/src/common/resources/lang/en_US/strings.lang
@@ -132,4 +132,6 @@ sign.image.brb=BRB
 
 flag.full=You have too many flags on this map!
 flag.overwrite=Cannot overwrite an existing pattern.
-flag.copied=Flag pattern copied.
\ No newline at end of file
+flag.copied=Flag pattern copied.
+
+wand.wrongmode=You must be in Creative mode to use this item!
\ No newline at end of file
diff --git a/src/common/resources/lang/en_US/tile.lang b/src/common/resources/lang/en_US/tile.lang
index 013b7217b..d9c265e44 100644
--- a/src/common/resources/lang/en_US/tile.lang
+++ b/src/common/resources/lang/en_US/tile.lang
@@ -1 +1 @@
-tile.stone.name=Stone
tile.stone.desc=A block of solid stone.
tile.basalt.name=Basalt
tile.basalt.desc=A block of solid basalt.
tile.limestone.name=Limestone
tile.limestone.desc=A block of solid limestone.
tile.granite.name=Granite
tile.granite.desc=A block of solid granite.
tile.marble.name=Marble
tile.marble.desc=A block of solid marble.
tile.slate.name=Slate
tile.slate.desc=A block of solid slate.
tile.permafrost.name=Permafrost
tile.permafrost.desc=A block of frozen stone.

tile.cobble.stone.name=Cobblestone
tile.cobble.stone.desc=Stone, smashed apart and reconstituted.
tile.cobble.stone.mossy.name=Mossy Cobblestone
tile.cobble.stone.mossy.desc=Cobblestone with added greenery.
tile.cobble.basalt.name=Cobbled Basalt
tile.cobble.basalt.desc=Basalt, smashed apart and reconstituted.
tile.cobble.limestone.name=Cobbled Limestone
tile.cobble.limestone.desc=Limestone, smashed apart and reconstituted.
tile.cobble.granite.name=Cobbled Granite
tile.cobble.granite.desc=Granite, smashed apart and reconstituted.
tile.cobble.permafrost.name=Cobbled Permafrost
tile.cobble.permafrost.desc=Permafrost, smashed apart and reconstituted.

tile.pillar.marble.name=Marble Pillar
tile.pillar.marble.desc=A block of marble engraved into a pillar.
tile.capstone.marble.name=Marble Capstone
tile.capstone.marble.desc=A pillar capstone made of solid marble.

tile.sandstone.name=Sandstone
tile.sandstone.desc=Compacted sand.

tile.stone.carved.name=Carved Stone
tile.stone.carved.desc=Polished Stone with lines hewn through the middle.
tile.granite.carved.name=Carved Granite
tile.granite.carved.desc=Polished Granite with lines hewn through the middle.
tile.limestone.carved.name=Carved Limestone
tile.limestone.carved.desc=Polished Limestone with lines hewn through the middle.
tile.basalt.carved.name=Carved Basalt
tile.basalt.carved.desc=Polished Basalt with lines hewn through the middle.

tile.planks.oak.name=Wooden Planks
tile.planks.oak.desc=Processed tree insides.
tile.planks.oak.painted.name=Mystery Planks
tile.planks.oak.painted.desc=How did you get this?!
tile.planks.oak.painted.black.name=Black Wooden Planks
tile.planks.oak.painted.black.desc=Wooden planks, stained black.
tile.planks.oak.painted.red.name=Red Wooden Planks
tile.planks.oak.painted.red.desc=Wooden planks, stained red.
tile.planks.oak.painted.green.name=Green Wooden Planks
tile.planks.oak.painted.green.desc=Wooden planks, stained green.
tile.planks.oak.painted.brown.name=Brown Wooden Planks
tile.planks.oak.painted.brown.desc=Wooden planks, stained brown.
tile.planks.oak.painted.blue.name=Blue Wooden Planks
tile.planks.oak.painted.blue.desc=Wooden planks, stained blue.
tile.planks.oak.painted.purple.name=Purple Wooden Planks
tile.planks.oak.painted.purple.desc=Wooden planks, stained purple.
tile.planks.oak.painted.cyan.name=Cyan Wooden Planks
tile.planks.oak.painted.cyan.desc=Wooden planks, stained cyan.
tile.planks.oak.painted.silver.name=Light Gray Wooden Planks
tile.planks.oak.painted.silver.desc=Wooden planks, stained light gray.
tile.planks.oak.painted.gray.name=Gray Wooden Planks
tile.planks.oak.painted.gray.desc=Wooden planks, stained gray.
tile.planks.oak.painted.pink.name=Pink Wooden Planks
tile.planks.oak.painted.pink.desc=Wooden planks, stained pink.
tile.planks.oak.painted.lime.name=Lime Wooden Planks
tile.planks.oak.painted.lime.desc=Wooden planks, stained lime.
tile.planks.oak.painted.yellow.name=Yellow Wooden Planks
tile.planks.oak.painted.yellow.desc=Wooden planks, stained yellow.
tile.planks.oak.painted.lightblue.name=Light Blue Wooden Planks
tile.planks.oak.painted.lightblue.desc=Wooden planks, stained light blue.
tile.planks.oak.painted.magenta.name=Magenta Wooden Planks
tile.planks.oak.painted.magenta.desc=Wooden planks, stained magenta.
tile.planks.oak.painted.orange.name=Orange Wooden Planks
tile.planks.oak.painted.orange.desc=Wooden planks, stained orange.
tile.planks.oak.painted.white.name=White Wooden Planks
tile.planks.oak.painted.white.desc=Wooden planks, stained white.

tile.torch.coal.name=Torch
tile.torch.coal.desc=Helps light the way.

tile.ladder.oak.name=Oak Ladder
tile.ladder.oak.desc=For very rapid vertical movement.

tile.fence.planks.oak.name=Oak Fence
tile.fence.planks.oak.desc=Too tall to jump over.

tile.fence.planks.oak.painted.name=Mystery Wooden Fence
tile.fence.planks.oak.painted.desc=How did you get this?!
tile.fence.planks.oak.painted.black.name=Black Wooden Fence
tile.fence.planks.oak.painted.black.desc=A wooden fence, stained black.
tile.fence.planks.oak.painted.red.name=Red Wooden Fence
tile.fence.planks.oak.painted.red.desc=A wooden fence, stained red.
tile.fence.planks.oak.painted.green.name=Green Wooden Fence
tile.fence.planks.oak.painted.green.desc=A wooden fence, stained green.
tile.fence.planks.oak.painted.brown.name=Brown Wooden Fence
tile.fence.planks.oak.painted.brown.desc=A wooden fence, stained brown.
tile.fence.planks.oak.painted.blue.name=Blue Wooden Fence
tile.fence.planks.oak.painted.blue.desc=A wooden fence, stained blue.
tile.fence.planks.oak.painted.purple.name=Purple Wooden Fence
tile.fence.planks.oak.painted.purple.desc=A wooden fence, stained purple.
tile.fence.planks.oak.painted.cyan.name=Cyan Wooden Fence
tile.fence.planks.oak.painted.cyan.desc=A wooden fence, stained cyan.
tile.fence.planks.oak.painted.silver.name=Light Gray Wooden Fence
tile.fence.planks.oak.painted.silver.desc=A wooden fence, stained light gray.
tile.fence.planks.oak.painted.gray.name=Gray Wooden Fence
tile.fence.planks.oak.painted.gray.desc=A wooden fence, stained gray.
tile.fence.planks.oak.painted.pink.name=Pink Wooden Fence
tile.fence.planks.oak.painted.pink.desc=A wooden fence, stained pink.
tile.fence.planks.oak.painted.lime.name=Lime Wooden Fence
tile.fence.planks.oak.painted.lime.desc=A wooden fence, stained lime.
tile.fence.planks.oak.painted.yellow.name=Yellow Wooden Fence
tile.fence.planks.oak.painted.yellow.desc=A wooden fence, stained yellow.
tile.fence.planks.oak.painted.lightblue.name=Light Blue Wooden Fence
tile.fence.planks.oak.painted.lightblue.desc=A wooden fence, stained light blue.
tile.fence.planks.oak.painted.magenta.name=Magenta Wooden Fence
tile.fence.planks.oak.painted.magenta.desc=A wooden fence, stained magenta.
tile.fence.planks.oak.painted.orange.name=Orange Wooden Fence
tile.fence.planks.oak.painted.orange.desc=A wooden fence, stained orange.
tile.fence.planks.oak.painted.white.name=White Wooden Fence
tile.fence.planks.oak.painted.white.desc=A wooden fence, stained white.

tile.fencegate.planks.oak.name=Wooden Fence Gate
tile.fencegate.planks.oak.desc=Like a door but for fences.

tile.fencegate.planks.oak.painted.name=Mystery Wooden Fence Gate
tile.fencegate.planks.oak.painted.desc=How did you get this?!
tile.fencegate.planks.oak.painted.black.name=Black Wooden Fence Gate
tile.fencegate.planks.oak.painted.black.desc=A wooden fence gate, stained black.
tile.fencegate.planks.oak.painted.red.name=Red Wooden Fence Gate
tile.fencegate.planks.oak.painted.red.desc=A wooden fence gate, stained red.
tile.fencegate.planks.oak.painted.green.name=Green Wooden Fence Gate
tile.fencegate.planks.oak.painted.green.desc=A wooden fence gate, stained green.
tile.fencegate.planks.oak.painted.brown.name=Brown Wooden Fence Gate
tile.fencegate.planks.oak.painted.brown.desc=A wooden fence gate, stained brown.
tile.fencegate.planks.oak.painted.blue.name=Blue Wooden Fence Gate
tile.fencegate.planks.oak.painted.blue.desc=A wooden fence gate, stained blue.
tile.fencegate.planks.oak.painted.purple.name=Purple Wooden Fence Gate
tile.fencegate.planks.oak.painted.purple.desc=A wooden fence gate, stained purple.
tile.fencegate.planks.oak.painted.cyan.name=Cyan Wooden Fence Gate
tile.fencegate.planks.oak.painted.cyan.desc=A wooden fence gate, stained cyan.
tile.fencegate.planks.oak.painted.silver.name=Light Gray Wooden Fence Gate
tile.fencegate.planks.oak.painted.silver.desc=A wooden fence gate, stained light gray.
tile.fencegate.planks.oak.painted.gray.name=Gray Wooden Fence Gate
tile.fencegate.planks.oak.painted.gray.desc=A wooden fence gate, stained gray.
tile.fencegate.planks.oak.painted.pink.name=Pink Wooden Fence Gate
tile.fencegate.planks.oak.painted.pink.desc=A wooden fence gate, stained pink.
tile.fencegate.planks.oak.painted.lime.name=Lime Wooden Fence Gate
tile.fencegate.planks.oak.painted.lime.desc=A wooden fence gate, stained lime.
tile.fencegate.planks.oak.painted.yellow.name=Yellow Wooden Fence Gate
tile.fencegate.planks.oak.painted.yellow.desc=A wooden fence gate, stained yellow.
tile.fencegate.planks.oak.painted.lightblue.name=Light Blue Wooden Fence Gate
tile.fencegate.planks.oak.painted.lightblue.desc=A wooden fence gate, stained light blue.
tile.fencegate.planks.oak.painted.magenta.name=Magenta Wooden Fence Gate
tile.fencegate.planks.oak.painted.magenta.desc=A wooden fence gate, stained magenta.
tile.fencegate.planks.oak.painted.orange.name=Orange Wooden Fence Gate
tile.fencegate.planks.oak.painted.orange.desc=A wooden fence gate, stained orange.
tile.fencegate.planks.oak.painted.white.name=White Wooden Fence Gate
tile.fencegate.planks.oak.painted.white.desc=A wooden fence gate, stained white.

tile.bookshelf.planks.oak.name=Bookshelf
tile.bookshelf.planks.oak.desc=A repository of knowledge.

tile.wool.name=Wool
tile.wool.desc=How did you get this?!
tile.wool.black.name=Black Wool
tile.wool.black.desc=Sheep's wool, dyed black.
tile.wool.red.name=Red Wool
tile.wool.red.desc=Sheep's wool, dyed red.
tile.wool.green.name=Green Wool
tile.wool.green.desc=Sheep's wool, dyed green.
tile.wool.brown.name=Brown Wool
tile.wool.brown.desc=Sheep's wool, dyed brown.
tile.wool.blue.name=Blue Wool
tile.wool.blue.desc=Sheep's wool, dyed blue.
tile.wool.purple.name=Purple Wool
tile.wool.purple.desc=Sheep's wool, dyed purple.
tile.wool.cyan.name=Cyan Wool
tile.wool.cyan.desc=Sheep's wool, dyed cyan.
tile.wool.silver.name=Light Gray Wool
tile.wool.silver.desc=Sheep's wool, dyed light gray.
tile.wool.gray.name=Gray Wool
tile.wool.gray.desc=Sheep's wool, dyed gray.
tile.wool.pink.name=Pink Wool
tile.wool.pink.desc=Sheep's wool, dyed pink.
tile.wool.lime.name=Lime Wool
tile.wool.lime.desc=Sheep's wool, dyed lime.
tile.wool.yellow.name=Yellow Wool
tile.wool.yellow.desc=Sheep's wool, dyed yellow.
tile.wool.lightblue.name=Light Blue Wool
tile.wool.lightblue.desc=Sheep's wool, dyed light blue.
tile.wool.magenta.name=Magenta Wool
tile.wool.magenta.desc=Sheep's wool, dyed magenta.
tile.wool.orange.name=Orange Wool
tile.wool.orange.desc=Sheep's wool, dyed orange.
tile.wool.white.name=White Wool
tile.wool.white.desc=Sheep's wool, dyed white.

tile.brick.clay.name=Clay Bricks
tile.brick.clay.desc=Stacked bricks of baked clay.
tile.brick.stone.polished.name=Polished Stone Bricks
tile.brick.stone.polished.desc=Stacked bricks of polished stone.
tile.brick.stone.polished.mossy.name=Mossy Polished Stone Bricks
tile.brick.stone.polished.mossy.desc=Stacked bricks of polished stone with added greenery.
tile.brick.sandstone.name=Sandstone Bricks
tile.brick.sandstone.desc=Stacked bricks of sandstone.
tile.brick.gold.name=Gold Bricks
tile.brick.gold.desc=Stacked bricks of gold.
tile.brick.lapis.name=Lapis Lazuli Bricks
tile.brick.lapis.desc=Stacked bricks of lapis lazuli.
tile.brick.basalt.name=Basalt Bricks
tile.brick.basalt.desc=Stacked bricks of basalt.
tile.brick.limestone.name=Limestone Bricks
tile.brick.limestone.desc=Stacked bricks of limestone.
tile.brick.granite.name=Granite Bricks
tile.brick.granite.desc=Stacked bricks of granite.
tile.brick.marble.name=Marble Bricks
tile.brick.marble.desc=Stacked bricks of marble.
tile.brick.slate.name=Slate Bricks
tile.brick.slate.desc=Stacked bricks of slate.
tile.brick.stone.name=Stone Bricks
tile.brick.stone.desc=Stacked bricks of stone.
tile.brick.permafrost.name=Permafrost Bricks
tile.brick.permafrost.desc=Stacked bricks of permafrost.
tile.brick.iron.name=Iron Bricks
tile.brick.iron.desc=Stacked bricks of iron.

tile.slab.planks.oak.name=Wooden Slab
tile.slab.planks.oak.desc=A slab of wooden planks.
tile.slab.cobble.stone.name=Cobblestone Slab
tile.slab.cobble.stone.desc=A slab of cobblestone.
tile.slab.sandstone.name=Sandstone Slab
tile.slab.sandstone.desc=A slab of sandstone.
tile.slab.brick.stone.polished.name=Polished Stone Brick Slab
tile.slab.brick.stone.polished.desc=A slab of polished stone bricks.
tile.slab.stone.carved.name=Polished Stone Slab
tile.slab.stone.carved.desc=A slab of polished stone.
tile.slab.brick.marble.name=Marble Brick Slab
tile.slab.brick.marble.desc=A slab of marble bricks.
tile.slab.brick.clay.name=Clay Brick Slab
tile.slab.brick.clay.desc=A slab of clay bricks.
tile.slab.capstone.marble.name=Marble Capstone Slab
tile.slab.capstone.marble.desc=Marble sculpted into a capstone.
tile.slab.cobble.basalt.name=Cobbled Basalt Slab
tile.slab.cobble.basalt.desc=A slab of cobbled basalt.
tile.slab.cobble.limestone.name=Cobbled Limestone Slab
tile.slab.cobble.limestone.desc=A slab of cobbled limestone.
tile.slab.cobble.granite.name=Cobbled Granite Slab
tile.slab.cobble.granite.desc=A slab of cobbled granite.
tile.slab.brick.basalt.name=Basalt Brick Slab
tile.slab.brick.basalt.desc=A slab of basalt bricks.
tile.slab.brick.limestone.name=Limestone Brick Slab
tile.slab.brick.limestone.desc=A slab of limestone bricks.
tile.slab.brick.granite.name=Granite Brick Slab
tile.slab.brick.granite.desc=A slab of granite bricks.
tile.slab.brick.slate.name=Slate Brick Slab
tile.slab.brick.slate.desc=A slab of slate bricks.
tile.slab.brick.stone.name=Stone Brick Slab
tile.slab.brick.stone.desc=A slab of stone bricks.
tile.slab.granite.carved.name=Polished Granite Slab
tile.slab.granite.carved.desc=A slab of polished granite.
tile.slab.limestone.carved.name=Polished Limestone Slab
tile.slab.limestone.carved.desc=A slab of polished limestone.
tile.slab.basalt.carved.name=Polished Basalt Slab
tile.slab.basalt.carved.desc=A slab of polished basalt.

tile.slab.planks.oak.painted.name=Mystery Wooden Slab
tile.slab.planks.oak.painted.desc=How did you get this?!
tile.slab.planks.oak.painted.black.name=Black Wooden Slab
tile.slab.planks.oak.painted.black.desc=A slab of wooden planks, stained black.
tile.slab.planks.oak.painted.red.name=Red Wooden Slab
tile.slab.planks.oak.painted.red.desc=A slab of wooden planks, stained red.
tile.slab.planks.oak.painted.green.name=Green Wooden Slab
tile.slab.planks.oak.painted.green.desc=A slab of wooden planks, stained green.
tile.slab.planks.oak.painted.brown.name=Brown Wooden Slab
tile.slab.planks.oak.painted.brown.desc=A slab of wooden planks, stained brown.
tile.slab.planks.oak.painted.blue.name=Blue Wooden Slab
tile.slab.planks.oak.painted.blue.desc=A slab of wooden planks, stained blue.
tile.slab.planks.oak.painted.purple.name=Purple Wooden Slab
tile.slab.planks.oak.painted.purple.desc=A slab of wooden planks, stained purple.
tile.slab.planks.oak.painted.cyan.name=Cyan Wooden Slab
tile.slab.planks.oak.painted.cyan.desc=A slab of wooden planks, stained cyan.
tile.slab.planks.oak.painted.silver.name=Light Gray Wooden Slab
tile.slab.planks.oak.painted.silver.desc=A slab of wooden planks, stained light gray.
tile.slab.planks.oak.painted.gray.name=Gray Wooden Slab
tile.slab.planks.oak.painted.gray.desc=A slab of wooden planks, stained gray.
tile.slab.planks.oak.painted.pink.name=Pink Wooden Slab
tile.slab.planks.oak.painted.pink.desc=A slab of wooden planks, stained pink.
tile.slab.planks.oak.painted.lime.name=Lime Wooden Slab
tile.slab.planks.oak.painted.lime.desc=A slab of wooden planks, stained lime.
tile.slab.planks.oak.painted.yellow.name=Yellow Wooden Slab
tile.slab.planks.oak.painted.yellow.desc=A slab of wooden planks, stained yellow.
tile.slab.planks.oak.painted.lightblue.name=Light Blue Wooden Slab
tile.slab.planks.oak.painted.lightblue.desc=A slab of wooden planks, stained light blue.
tile.slab.planks.oak.painted.magenta.name=Magenta Wooden Slab
tile.slab.planks.oak.painted.magenta.desc=A slab of wooden planks, stained magenta.
tile.slab.planks.oak.painted.orange.name=Orange Wooden Slab
tile.slab.planks.oak.painted.orange.desc=A slab of wooden planks, stained orange.
tile.slab.planks.oak.painted.white.name=White Wooden Slab
tile.slab.planks.oak.painted.white.desc=A slab of wooden planks, stained white.

tile.stairs.planks.oak.name=Wooden Stairs
tile.stairs.planks.oak.desc=Wooden block used for rapid vertical movement.
tile.stairs.cobble.stone.name=Cobblestone Stairs
tile.stairs.cobble.stone.desc=Cobblestone block used for rapid vertical movement.
tile.stairs.brick.stone.polished.name=Polished Stone Brick Stairs
tile.stairs.brick.stone.polished.desc=Polished stone brick block used for rapid vertical movement.
tile.stairs.brick.marble.name=Marble Brick Stairs
tile.stairs.brick.marble.desc=Marble brick block used for rapid vertical movement.
tile.stairs.cobble.basalt.name=Cobbled Basalt Stairs
tile.stairs.cobble.basalt.desc=Cobbled basalt block used for rapid vertical movement.
tile.stairs.cobble.limestone.name=Cobbled Limestone Stairs
tile.stairs.cobble.limestone.desc=Cobbled limestone block used for rapid vertical movement.
tile.stairs.cobble.granite.name=Cobbled Granite Stairs
tile.stairs.cobble.granite.desc=Cobbled granite block used for rapid vertical movement.
tile.stairs.brick.basalt.name=Basalt Brick Stairs
tile.stairs.brick.basalt.desc=Basalt brick block used for rapid vertical movement.
tile.stairs.brick.limestone.name=Limestone Brick Stairs
tile.stairs.brick.limestone.desc=Limestone brick block used for rapid vertical movement.
tile.stairs.brick.granite.name=Granite Brick Stairs
tile.stairs.brick.granite.desc=Granite brick block used for rapid vertical movement.
tile.stairs.brick.clay.name=Clay Brick Stairs
tile.stairs.brick.clay.desc=Clay brick block used for rapid vertical movement.
tile.stairs.brick.slate.name=Slate Brick Stairs
tile.stairs.brick.slate.desc=Slate brick block used for rapid vertical movement.
tile.stairs.brick.stone.name=Stone Brick Stairs
tile.stairs.brick.stone.desc=Stone brick block used for rapid vertical movement.

tile.stairs.planks.oak.painted.name=Mystery Wooden Stairs
tile.stairs.planks.oak.painted.desc=How did you get this?!
tile.stairs.planks.oak.painted.black.name=Black Wooden Stairs
tile.stairs.planks.oak.painted.black.desc=Wooden steps, stained black.
tile.stairs.planks.oak.painted.red.name=Red Wooden Stairs
tile.stairs.planks.oak.painted.red.desc=Wooden steps, stained red.
tile.stairs.planks.oak.painted.green.name=Green Wooden Stairs
tile.stairs.planks.oak.painted.green.desc=Wooden steps, stained green.
tile.stairs.planks.oak.painted.brown.name=Brown Wooden Stairs
tile.stairs.planks.oak.painted.brown.desc=Wooden steps, stained brown.
tile.stairs.planks.oak.painted.blue.name=Blue Wooden Stairs
tile.stairs.planks.oak.painted.blue.desc=Wooden steps, stained blue.
tile.stairs.planks.oak.painted.purple.name=Purple Wooden Stairs
tile.stairs.planks.oak.painted.purple.desc=Wooden steps, stained purple.
tile.stairs.planks.oak.painted.cyan.name=Cyan Wooden Stairs
tile.stairs.planks.oak.painted.cyan.desc=Wooden steps, stained cyan.
tile.stairs.planks.oak.painted.silver.name=Light Gray Wooden Stairs
tile.stairs.planks.oak.painted.silver.desc=Wooden steps, stained light gray.
tile.stairs.planks.oak.painted.gray.name=Gray Wooden Stairs
tile.stairs.planks.oak.painted.gray.desc=Wooden steps, stained gray.
tile.stairs.planks.oak.painted.pink.name=Pink Wooden Stairs
tile.stairs.planks.oak.painted.pink.desc=Wooden steps, stained pink.
tile.stairs.planks.oak.painted.lime.name=Lime Wooden Stairs
tile.stairs.planks.oak.painted.lime.desc=Wooden steps, stained lime.
tile.stairs.planks.oak.painted.yellow.name=Yellow Wooden Stairs
tile.stairs.planks.oak.painted.yellow.desc=Wooden steps, stained yellow.
tile.stairs.planks.oak.painted.lightblue.name=Light Blue Wooden Stairs
tile.stairs.planks.oak.painted.lightblue.desc=Wooden steps, stained light blue.
tile.stairs.planks.oak.painted.magenta.name=Magenta Wooden Stairs
tile.stairs.planks.oak.painted.magenta.desc=Wooden steps, stained magenta.
tile.stairs.planks.oak.painted.orange.name=Orange Wooden Stairs
tile.stairs.planks.oak.painted.orange.desc=Wooden steps, stained orange.
tile.stairs.planks.oak.painted.white.name=White Wooden Stairs
tile.stairs.planks.oak.painted.white.desc=Wooden steps, stained white.

tile.obsidian.name=Obsidian
tile.obsidian.desc=Rapidly cooled volcanic rock.

tile.glass.name=Glass
tile.glass.desc=Sand heated until it becomes translucent.
tile.glass.tinted.name=Tinted Glass
tile.glass.tinted.desc=Darkened glass that blocks light.

tile.grass.name=Grass
tile.grass.desc=Crisp, crunchy grass.
tile.grass.retro.name=Retro Grass
tile.grass.retro.desc=Crisp, crunchy grass. Smells old.
tile.grass.scorched.name=Scorched Grass
tile.grass.scorched.desc=Grass that has baked in the sun.

tile.path.dirt.name=Dirt Path
tile.path.dirt.desc=Dirt worn down by frequent travelling.

tile.dirt.name=Dirt
tile.dirt.desc=Crumbly brown dirt.
tile.dirt.scorched.name=Scorched Dirt
tile.dirt.scorched.desc=Dirt that has baked in the sun.
tile.dirt.scorched.rich.name=Rich Scorched Dirt
tile.dirt.scorched.rich.desc=Dirt that has baked in the sun, searing in minerals.

tile.mud.name=Mud
tile.mud.desc=Mud sodden to its core.
tile.mud.baked.name=Baked Mud
tile.mud.baked.desc=Mud that's been dried out and cracked.

tile.sponge.dry.name=Sponge
tile.sponge.dry.desc=A dry sponge, good for soaking up water.
tile.sponge.wet.name=Wet Sponge
tile.sponge.wet.desc=A sponge full of water.

tile.moss.stone.name=Mossy Stone
tile.moss.stone.desc=Moss covering a block of stone.
tile.moss.basalt.name=Mossy Basalt
tile.moss.basalt.desc=Moss covering a block of basalt.
tile.moss.limestone.name=Mossy Limestone
tile.moss.limestone.desc=Moss covering a block of limestone.
tile.moss.granite.name=Mossy Granite
tile.moss.granite.desc=Moss covering a block of granite.

tile.sand.name=Sand
tile.sand.desc=Gets everywhere.
tile.gravel.name=Gravel
tile.gravel.desc=A loose collection of pebbles.

tile.bedrock.name=Bedrock
tile.bedrock.desc=The toughest substance known to man.

tile.fluid.water.flowing.name=Flowing Water
tile.fluid.water.flowing.desc=Water that flows when placed.
tile.fluid.water.still.name=Still Water
tile.fluid.water.still.desc=Water that does not flow when placed.
tile.fluid.lava.flowing.name=Flowing Lava
tile.fluid.lava.flowing.desc=Lava that flows when placed.
tile.fluid.lava.still.name=Still Lava
tile.fluid.lava.still.desc=Lava that does not flow when placed.

tile.log.oak.name=Oak Log
tile.log.oak.desc=A log from an oak tree.
tile.log.pine.name=Pine Log
tile.log.pine.desc=A log from a pine tree.
tile.log.birch.name=Birch Log
tile.log.birch.desc=A log from a birch tree.
tile.log.cherry.name=Cherry Log
tile.log.cherry.desc=A log from a cherry tree.
tile.log.eucalyptus.name=Eucalyptus Log
tile.log.eucalyptus.desc=A log from a eucalyptus tree.
tile.log.oak.mossy.name=Mossy Oak Log
tile.log.oak.mossy.desc=A log from a mossy oak tree.

tile.leaves.oak.name=Oak Leaves
tile.leaves.oak.desc=Leaves from an oak tree.
tile.leaves.pine.name=Pine Leaves
tile.leaves.pine.desc=Leaves from a pine tree.
tile.leaves.birch.name=Birch Leaves
tile.leaves.birch.desc=Leaves from a birch tree.
tile.leaves.cherry.name=Cherry Leaves
tile.leaves.cherry.desc=Leaves from a cherry tree.
tile.leaves.eucalyptus.name=Eucalyptus Leaves
tile.leaves.eucalyptus.desc=Leaves from a eucalyptus tree.
tile.leaves.oak.retro.name=Retro Leaves
tile.leaves.oak.retro.desc=Leaves from long ago.
tile.leaves.shrub.name=Shrub Leaves
tile.leaves.shrub.desc=Leaves from a shrub.
tile.leaves.cherry.flowering.name=Flowering Cherry Leaves
tile.leaves.cherry.flowering.desc=Leaves from a cherry tree that are budding with fruit.
tile.leaves.cacao.name=Cacao Leaves
tile.leaves.cacao.desc=Leaves from a cacao tree.
tile.leaves.caatinga.name=Caatinga Leaves
tile.leaves.caatinga.desc=Leaves from a caatinga tree.

tile.sapling.oak.name=Oak Sapling
tile.sapling.oak.desc=Plant to grow an oak tree.
tile.sapling.pine.name=Pine Sapling
tile.sapling.pine.desc=Plant to grow a pine tree.
tile.sapling.birch.name=Birch Sapling
tile.sapling.birch.desc=Plant to grow a birch tree.
tile.sapling.cherry.name=Cherry Sapling
tile.sapling.cherry.desc=Plant to grow a cherry tree.
tile.sapling.eucalyptus.name=Eucalyptus Sapling
tile.sapling.eucalyptus.desc=Plant to grow a eucalyptus tree.
tile.sapling.oak.retro.name=Retro Oak Sapling
tile.sapling.oak.retro.desc=Plant to grow a tree from long ago.
tile.sapling.shrub.name=Shrub Sapling
tile.sapling.shrub.desc=Plant to grow a shrub.
tile.sapling.cacao.name=Cacao Sapling
tile.sapling.cacao.desc=Plant to grow a cacao tree.

tile.tallgrass.name=Tall Grass
tile.tallgrass.desc=Lush, growing grass.
tile.tallgrass.fern.name=Fern
tile.tallgrass.fern.desc=A fern plant.
tile.deadbush.name=Dead Bush
tile.deadbush.desc=A dried and withered plant.
tile.spinifex.name=Spinifex
tile.spinifex.desc=A spindly, thin grass from dry regions.
tile.algae.name=Algae
tile.algae.desc=Gooey vegetation that floats on the water's surface.

tile.flower.yellow.name=Dandelion
tile.flower.yellow.desc=A beautiful yellow flower.
tile.flower.red.name=Rose
tile.flower.red.desc=A beautiful red flower.
tile.flower.purple.name=Heather
tile.flower.purple.desc=Sprigs of purple petals. Brings good luck.
tile.flower.lightblue.name=Bluebell
tile.flower.lightblue.desc=A sad-looking blue flower.
tile.flower.pink.name=Orchid
tile.flower.pink.desc=A beautiful pink flower.

tile.mushroom.red.name=Red Mushroom
tile.mushroom.red.desc=A tasty red mushroom. Good for stew.
tile.mushroom.brown.name=Brown Mushroom
tile.mushroom.brown.desc=A tasty brown mushroom. Good for stew.

tile.ore.coal.stone.name=Stone Coal Ore
tile.ore.coal.stone.desc=A chunk of coal embedded in stone.
tile.ore.coal.basalt.name=Basalt Coal Ore
tile.ore.coal.basalt.desc=A chunk of coal embedded in basalt.
tile.ore.coal.limestone.name=Limestone Coal Ore
tile.ore.coal.limestone.desc=A chunk of coal embedded in limestone.
tile.ore.coal.granite.name=Granite Coal Ore
tile.ore.coal.granite.desc=A chunk of coal embedded in granite.

tile.ore.iron.stone.name=Stone Iron Ore
tile.ore.iron.stone.desc=Iron nuggets embedded in stone.
tile.ore.iron.basalt.name=Basalt Iron Ore
tile.ore.iron.basalt.desc=Iron nuggets embedded in basalt.
tile.ore.iron.limestone.name=Limestone Iron Ore
tile.ore.iron.limestone.desc=Iron nuggets embedded in limestone.
tile.ore.iron.granite.name=Granite Iron Ore
tile.ore.iron.granite.desc=Iron nuggets embedded in granite.

tile.ore.gold.stone.name=Stone Gold Ore
tile.ore.gold.stone.desc=Gold nuggets embedded in stone.
tile.ore.gold.basalt.name=Basalt Gold Ore
tile.ore.gold.basalt.desc=Gold nuggets embedded in basalt.
tile.ore.gold.limestone.name=Limestone Gold Ore
tile.ore.gold.limestone.desc=Gold nuggets embedded in limestone.
tile.ore.gold.granite.name=Granite Gold Ore
tile.ore.gold.granite.desc=Gold nuggets embedded in granite.

tile.ore.lapis.stone.name=Stone Lapis Lazuli Ore
tile.ore.lapis.stone.desc=Chunks of lapis lazuli embedded in stone.
tile.ore.lapis.basalt.name=Basalt Lapis Lazuli Ore
tile.ore.lapis.basalt.desc=Chunks of lapis lazuli embedded in basalt.
tile.ore.lapis.limestone.name=Limestone Lapis Lazuli Ore
tile.ore.lapis.limestone.desc=Chunks of lapis lazuli embedded in limestone.
tile.ore.lapis.granite.name=Granite Lapis Lazuli Ore
tile.ore.lapis.granite.desc=Chunks of lapis lazuli embedded in granite.

tile.ore.redstone.stone.name=Stone Redstone Ore
tile.ore.redstone.stone.desc=Red dust embedded in stone.
tile.ore.redstone.basalt.name=Basalt Redstone Ore
tile.ore.redstone.basalt.desc=Red dust embedded in basalt.
tile.ore.redstone.limestone.name=Limestone Redstone Ore
tile.ore.redstone.limestone.desc=Red dust embedded in limestone.
tile.ore.redstone.granite.name=Granite Redstone Ore
tile.ore.redstone.granite.desc=Red dust embedded in granite.
tile.ore.redstone.glowing.stone.name=Glowing Stone Redstone Ore
tile.ore.redstone.glowing.stone.desc=Red dust embedded in stone. Emits a faint light.
tile.ore.redstone.glowing.basalt.name=Glowing Basalt Redstone Ore
tile.ore.redstone.glowing.basalt.desc=Red dust embedded in basalt. Emits a faint light.
tile.ore.redstone.glowing.limestone.name=Glowing Limestone Redstone Ore
tile.ore.redstone.glowing.limestone.desc=Red dust embedded in limestone. Emits a faint light.
tile.ore.redstone.glowing.granite.name=Glowing Granite Redstone Ore
tile.ore.redstone.glowing.granite.desc=Red dust embedded in granite. Emits a faint light.

tile.ore.diamond.stone.name=Stone Diamond Ore
tile.ore.diamond.stone.desc=A chunk of diamond embedded in stone.
tile.ore.diamond.basalt.name=Basalt Diamond Ore
tile.ore.diamond.basalt.desc=A chunk of diamond embedded in basalt.
tile.ore.diamond.limestone.name=Limestone Diamond Ore
tile.ore.diamond.limestone.desc=A chunk of diamond embedded in limestone.
tile.ore.diamond.granite.name=Granite Diamond Ore
tile.ore.diamond.granite.desc=A chunk of diamond embedded in granite.

tile.ore.nethercoal.netherrack.name=Nether Coal Ore
tile.ore.nethercoal.netherrack.desc=A lump of Nether Coal embedded in netherrack.

tile.block.coal.name=Block of Coal
tile.block.coal.desc=A solid block of coal.
tile.block.iron.name=Block of Iron
tile.block.iron.desc=A solid block of iron. Heavy!
tile.block.gold.name=Block of Gold
tile.block.gold.desc=A solid block of gold, for flaunting your bling.
tile.block.lapis.name=Block of Lapis Lazuli
tile.block.lapis.desc=A solid block of lapis lazuli.
tile.block.redstone.name=Block of Redstone
tile.block.redstone.desc=A solid block of redstone.
tile.block.diamond.name=Block of Diamond
tile.block.diamond.desc=A solid block of diamond. Well done you.
tile.block.nethercoal.name=Block of Nether Coal
tile.block.nethercoal.desc=A solid block of Nether Coal.
tile.block.steel.name=Block of Steel
tile.block.steel.desc=A solid block of steel.
tile.block.quartz.name=Block of Quartz
tile.block.quartz.desc=A solid block of quartz.
tile.block.olivine.name=Block of Olivine
tile.block.olivine.desc=A solid block of olivine.
tile.block.charcoal.name=Block of Charcoal
tile.block.charcoal.desc=A solid block of charcoal.

tile.wire.redstone.name=Redstone Wire
tile.wire.redstone.desc=A strand of redstone dust laid on the ground.

tile.torch.redstone.idle.name=Redstone Torch
tile.torch.redstone.idle.desc=Emits a constant redstone signal.
tile.torch.redstone.active.name=Redstone Torch
tile.torch.redstone.active.desc=Emits a constant redstone signal.

tile.button.stone.name=Stone Button
tile.button.stone.desc=Emits a brief redstone signal when pressed.

tile.lever.cobble.stone.name=Cobblestone Lever
tile.lever.cobble.stone.desc=Allows turning a redstone signal on or off.

tile.pressureplate.stone.name=Stone Pressure Plate
tile.pressureplate.stone.desc=Emits a redstone signal when living creatures step on it.
tile.pressureplate.planks.oak.name=Wooden Pressure Plate
tile.pressureplate.planks.oak.desc=Emits a redstone signal when anything steps on it.
tile.pressureplate.cobble.stone.name=Cobblestone Pressure Plate
tile.pressureplate.cobble.stone.desc=Emits a redstone signal when players step on it.

tile.motionsensor.idle.name=Motion Sensor
tile.motionsensor.idle.desc=Emits a redstone signal when something moves past it.
tile.motionsensor.active.name=Active Motion Sensor
tile.motionsensor.active.desc=Emits a redstone signal when something moves past it.

tile.repeater.idle.name=Redstone Repeater
tile.repeater.idle.desc=Repeats redstone signals over a distance.
tile.repeater.active.name=Redstone Repeater
tile.repeater.active.desc=Repeats redstone signals over a distance.

tile.piston.base.name=Piston
tile.piston.base.desc=Pushes blocks but does not pull them.
tile.piston.base.sticky.name=Sticky Piston
tile.piston.base.sticky.desc=Pushes and pulls blocks.
tile.piston.head.name=Piston Head
tile.piston.head.desc=The pushy part of the piston.
tile.piston.moving.name=Piston Mover
tile.piston.moving.desc=The invisible moving part of the piston.

tile.noteblock.name=Note Block
tile.noteblock.desc=Plays a musical note when powered.

tile.rail.name=Rail
tile.rail.desc=For rapid horizontal movement via minecart.
tile.rail.powered.name=Powered Rail
tile.rail.powered.desc=Makes minecarts go faster when powered.
tile.rail.detector.name=Detector Rail
tile.rail.detector.desc=Emits a redstone signal when a minecart crosses it.

tile.spikes.name=Spike Trap
tile.spikes.desc=Deactivates when powered. Technically a war crime.

tile.dispenser.cobble.stone.name=Dispenser
tile.dispenser.cobble.stone.desc=Fires items out of the hole in the front.

tile.trapdoor.planks.oak.name=Oak Trapdoor
tile.trapdoor.planks.oak.desc=Like a door, but flat.
tile.trapdoor.iron.name=Iron Trapdoor
tile.trapdoor.iron.desc=Like a door, but flat and made of iron.
tile.trapdoor.glass.name=Glass Trapdoor
tile.trapdoor.glass.desc=Useless at its job.

tile.tnt.name=TNT
tile.tnt.desc=Goes off with a bang.

tile.door.planks.oak.bottom.name=Bottom Wooden Door
tile.door.planks.oak.bottom.desc=/give Honeydew 64 46
tile.door.planks.oak.top.name=Top Wooden Door
tile.door.planks.oak.top.desc=Oh, wait, that's not TNT, that's half a door.
tile.door.iron.bottom.name=Bottom Iron Door
tile.door.iron.bottom.desc=Not much good on its own.
tile.door.iron.top.name=Top Iron Door
tile.door.iron.top.desc=Could use a friend.

tile.mesh.name=Mesh Block
tile.mesh.desc=Allows items to pass through but nothing else.
tile.mesh.gold.name=Gold Mesh Block
tile.mesh.gold.desc=Allows a specified item to pass through but nothing else.

tile.bed.name=Bed
tile.bed.desc=Bed!
tile.seat.name=Seat
tile.seat.desc=Sit down and relax.

tile.cobweb.name=Cobweb
tile.cobweb.desc=Sticky silky strands woven by spiders.

tile.fire.name=Fire
tile.fire.desc=Ouch, fire hot!
tile.brazier.inactive.name=Brazier
tile.brazier.inactive.desc=A safe place to keep a fire.
tile.brazier.active.name=Lit Brazier
tile.brazier.active.desc=A safe place to keep a fire.

tile.mobspawner.name=Mob Spawner
tile.mobspawner.desc=A cage filled with horror.
tile.mobspawner.deactivated.name=Deactivated Mob Spawner
tile.mobspawner.deactivated.desc=A cage no longer filled with horror.

tile.workbench.name=Workbench
tile.workbench.desc=For bigger projects.

tile.furnace.stone.idle.name=Furnace
tile.furnace.stone.idle.desc=For melting, heating, and cooking blocks and items.
tile.furnace.stone.active.name=Lit Furnace
tile.furnace.stone.active.desc=For melting, heating, and cooking blocks and items.
tile.furnace.blast.idle.name=Blast Furnace
tile.furnace.blast.idle.desc=Burns hotter than a normal furnace.
tile.furnace.blast.active.name=Lit Blast Furnace
tile.furnace.blast.active.desc=Burns hotter than a normal furnace.

tile.trommel.idle.name=Trommel
tile.trommel.idle.desc=A machine that separates dirt from other useful items.
tile.trommel.active.name=Lit Trommel
tile.trommel.active.desc=A machine that separates dirt from other useful items.

tile.chest.planks.oak.name=Wooden Chest
tile.chest.planks.oak.desc=A place to store your items.
tile.chest.planks.oak.painted.name=Mystery Wooden Chest
tile.chest.planks.oak.painted.desc=How did you get this?!
tile.chest.planks.oak.painted.black.name=Black Wooden Chest
tile.chest.planks.oak.painted.black.desc=A place to store your items.
tile.chest.planks.oak.painted.red.name=Red Wooden Chest
tile.chest.planks.oak.painted.red.desc=A place to store your items.
tile.chest.planks.oak.painted.green.name=Green Wooden Chest
tile.chest.planks.oak.painted.green.desc=A place to store your items.
tile.chest.planks.oak.painted.brown.name=Brown Wooden Chest
tile.chest.planks.oak.painted.brown.desc=A place to store your items.
tile.chest.planks.oak.painted.blue.name=Blue Wooden Chest
tile.chest.planks.oak.painted.blue.desc=A place to store your items.
tile.chest.planks.oak.painted.purple.name=Purple Wooden Chest
tile.chest.planks.oak.painted.purple.desc=A place to store your items.
tile.chest.planks.oak.painted.cyan.name=Cyan Wooden Chest
tile.chest.planks.oak.painted.cyan.desc=A place to store your items.
tile.chest.planks.oak.painted.silver.name=Light Gray Wooden Chest
tile.chest.planks.oak.painted.silver.desc=A place to store your items.
tile.chest.planks.oak.painted.gray.name=Gray Wooden Chest
tile.chest.planks.oak.painted.gray.desc=A place to store your items.
tile.chest.planks.oak.painted.pink.name=Pink Wooden Chest
tile.chest.planks.oak.painted.pink.desc=A place to store your items.
tile.chest.planks.oak.painted.lime.name=Lime Wooden Chest
tile.chest.planks.oak.painted.lime.desc=A place to store your items.
tile.chest.planks.oak.painted.yellow.name=Yellow Wooden Chest
tile.chest.planks.oak.painted.yellow.desc=A place to store your items.
tile.chest.planks.oak.painted.lightblue.name=Light Blue Wooden Chest
tile.chest.planks.oak.painted.lightblue.desc=A place to store your items.
tile.chest.planks.oak.painted.magenta.name=Magenta Wooden Chest
tile.chest.planks.oak.painted.magenta.desc=A place to store your items.
tile.chest.planks.oak.painted.orange.name=Orange Wooden Chest
tile.chest.planks.oak.painted.orange.desc=A place to store your items.
tile.chest.planks.oak.painted.white.name=White Wooden Chest
tile.chest.planks.oak.painted.white.desc=A place to store your items.
tile.chest.legacy.name=Legacy Chest

tile.crops.wheat.name=Wheat Crops
tile.crops.wheat.desc=Wheat, plucked from the ground.
tile.crops.pumpkin.name=Pumpkin Crops
tile.crops.pumpkin.desc=A ripening pumpkin, plucked from the ground.

tile.farmland.dirt.name=Farmland
tile.farmland.dirt.desc=Tilled soil for growing crops.

tile.sign.post.planks.oak.name=Oak Signpost
tile.sign.post.planks.oak.desc=A free-standing oak sign.
tile.sign.wall.planks.oak.name=Oak Wall Sign
tile.sign.wall.planks.oak.desc=An oak sign placed on a wall.

tile.layer.snow.name=Snow Layer
tile.layer.snow.desc=A flat layer of snow.
tile.layer.leaves.oak.name=Leaf Pile
tile.layer.leaves.oak.desc=A pile of leaves.
tile.layer.slate.name=Slate Layer
tile.layer.slate.desc=A flat sheet of slate.

tile.ice.name=Ice
tile.ice.desc=Slippery frozen water.
tile.ice.perma.name=Perma-Ice
tile.ice.perma.desc=Ice imbued with the essence of stone.

tile.block.snow.name=Block of Snow
tile.block.snow.desc=Lots of snow compacted into a block.

tile.cactus.name=Cactus
tile.cactus.desc=A spiky plant that grows in the desert.

tile.block.clay.name=Block of Clay
tile.block.clay.desc=A block of compacted clay.

tile.sugarcane.name=Sugarcane
tile.sugarcane.desc=Not as sweet as you.

tile.block.sugarcane.name=Block of Sugarcane
tile.block.sugarcane.desc=One very big sugar cube.
tile.block.sugarcane.baked.name=Baked Block of Sugarcane
tile.block.sugarcane.baked.desc=Smells absolutely delicious.

tile.jukebox.name=Jukebox
tile.jukebox.desc=Plays your favourite tunes, assuming you have the right record.

tile.pumpkin.name=Pumpkin
tile.pumpkin.desc=An orange squash that grows in the wild.
tile.pumpkin.carved.idle.name=Carved Pumpkin
tile.pumpkin.carved.idle.desc=An orange squash with a spooky face.
tile.pumpkin.carved.active.name=Jack 'o' Lantern
tile.pumpkin.carved.active.desc=An orange squash with a spooky face, lit by a torch.

tile.netherrack.name=Netherrack
tile.netherrack.desc=Dark red rock that burns forever.
tile.netherrack.igneous.name=Igneous Netherrack
tile.netherrack.igneous.desc=Extreme heat has made this rock glow from inside.

tile.soulsand.name=Soul Sand
tile.soulsand.desc=Squishy brown sand that's tough to walk through.

tile.glowstone.name=Block of Glowstone
tile.glowstone.desc=Constantly emits a strong yellowish light.

tile.portal.nether.name=Nether Portal
tile.portal.nether.desc=A portal to the Nether.
tile.portal.paradise.name=Paradise Portal
tile.portal.paradise.desc=A portal to Paradise.

tile.cake.name=Cake
tile.cake.desc=I just can't cake it any more.
tile.cake.name=Pumpkin Pie
tile.cake.desc=I just can't pumpkin it any more.

tile.lamp.idle.name=Lamp
tile.lamp.idle.desc=How did you get this?!
tile.lamp.idle.black.name=Black Lamp
tile.lamp.idle.black.desc=A redstone lamp that can emit light. Tinted black.
tile.lamp.idle.red.name=Red Lamp
tile.lamp.idle.red.desc=A redstone lamp that can emit light. Tinted red.
tile.lamp.idle.green.name=Green Lamp
tile.lamp.idle.green.desc=A redstone lamp that can emit light. Tinted green.
tile.lamp.idle.brown.name=Brown Lamp
tile.lamp.idle.brown.desc=A redstone lamp that can emit light. Tinted brown.
tile.lamp.idle.blue.name=Blue Lamp
tile.lamp.idle.blue.desc=A redstone lamp that can emit light. Tinted blue.
tile.lamp.idle.purple.name=Purple Lamp
tile.lamp.idle.purple.desc=A redstone lamp that can emit light. Tinted purple.
tile.lamp.idle.cyan.name=Cyan Lamp
tile.lamp.idle.cyan.desc=A redstone lamp that can emit light. Tinted cyan.
tile.lamp.idle.silver.name=Light Gray Lamp
tile.lamp.idle.silver.desc=A redstone lamp that can emit light. Tinted light gray.
tile.lamp.idle.gray.name=Gray Lamp
tile.lamp.idle.gray.desc=A redstone lamp that can emit light. Tinted gray.
tile.lamp.idle.pink.name=Pink Lamp
tile.lamp.idle.pink.desc=A redstone lamp that can emit light. Tinted pink.
tile.lamp.idle.lime.name=Lime Lamp
tile.lamp.idle.lime.desc=A redstone lamp that can emit light. Tinted lime.
tile.lamp.idle.yellow.name=Yellow Lamp
tile.lamp.idle.yellow.desc=A redstone lamp that can emit light. Tinted yellow.
tile.lamp.idle.lightblue.name=Light Blue Lamp
tile.lamp.idle.lightblue.desc=A redstone lamp that can emit light. Tinted light blue.
tile.lamp.idle.magenta.name=Magenta Lamp
tile.lamp.idle.magenta.desc=A redstone lamp that can emit light. Tinted magenta.
tile.lamp.idle.orange.name=Orange Lamp
tile.lamp.idle.orange.desc=A redstone lamp that can emit light. Tinted orange.
tile.lamp.idle.white.name=White Lamp
tile.lamp.idle.white.desc=A redstone lamp that can emit light.

tile.lamp.active.name=Lit Lamp
tile.lamp.active.desc=How did you get this?!
tile.lamp.active.black.name=Lit Black Lamp
tile.lamp.active.black.desc=A redstone lamp that emits light. Tinted black.
tile.lamp.active.red.name=Lit Red Lamp
tile.lamp.active.red.desc=A redstone lamp that emits light. Tinted red.
tile.lamp.active.green.name=Lit Green Lamp
tile.lamp.active.green.desc=A redstone lamp that emits light. Tinted green.
tile.lamp.active.brown.name=Lit Brown Lamp
tile.lamp.active.brown.desc=A redstone lamp that emits light. Tinted brown.
tile.lamp.active.blue.name=Lit Blue Lamp
tile.lamp.active.blue.desc=A redstone lamp that emits light. Tinted blue.
tile.lamp.active.purple.name=Lit Purple Lamp
tile.lamp.active.purple.desc=A redstone lamp that emits light. Tinted purple.
tile.lamp.active.cyan.name=Lit Cyan Lamp
tile.lamp.active.cyan.desc=A redstone lamp that emits light. Tinted cyan.
tile.lamp.active.silver.name=Lit Light Gray Lamp
tile.lamp.active.silver.desc=A redstone lamp that emits light. Tinted light gray.
tile.lamp.active.gray.name=Lit Gray Lamp
tile.lamp.active.gray.desc=A redstone lamp that emits light. Tinted gray.
tile.lamp.active.pink.name=Lit Pink Lamp
tile.lamp.active.pink.desc=A redstone lamp that emits light. Tinted pink.
tile.lamp.active.lime.name=Lit Lime Lamp
tile.lamp.active.lime.desc=A redstone lamp that emits light. Tinted lime.
tile.lamp.active.yellow.name=Yellow Lamp
tile.lamp.active.yellow.desc=A redstone lamp that emits light. Tinted yellow.
tile.lamp.active.lightblue.name=Light Blue Lamp
tile.lamp.active.lightblue.desc=A redstone lamp that emits light. Tinted light blue.
tile.lamp.active.magenta.name=Magenta Lamp
tile.lamp.active.magenta.desc=A redstone lamp that emits light. Tinted magenta.
tile.lamp.active.orange.name=Orange Lamp
tile.lamp.active.orange.desc=A redstone lamp that emits light. Tinted orange.
tile.lamp.active.white.name=White Lamp
tile.lamp.active.white.desc=A redstone lamp that emits light.

tile.stone.polished.name=Polished Stone
tile.stone.polished.desc=A polished block of stone.
tile.granite.polished.name=Polished Granite
tile.granite.polished.desc=A polished block of granite.
tile.limestone.polished.name=Polished Limestone
tile.limestone.polished.desc=A polished block of limestone.
tile.basalt.polished.name=Polished Basalt
tile.basalt.polished.desc=A polished block of basalt.
tile.slate.polished.name=Polished Slate
tile.slate.polished.desc=A polished block of slate.

tile.candle.wax.soul.name=Soul Wax Candle
tile.candle.wax.soul.desc=A waxy brown candle that glows with an unnatural light.

tile.basket.name=Basket
tile.basket.desc=A wicker container for holding items.

tile.overlay.pebbles.name=Pebbles
tile.overlay.pebbles.desc=A cluster of pebbles.

tile.fence.chainlink.name=Chainlink Fence
tile.fence.chainlink.desc=A fence made of interconnected chain links. Can be climbed!
tile.fence.paper_wall.name=Paper Wall Fence
tile.fence.paper_wall.desc=A fence made of delicate paper. Be careful!

tile.lantern.firefly.green.name=Green Firefly Lantern
tile.lantern.firefly.green.desc=A glass jar containing a swarm of green fireflies.
tile.lantern.firefly.orange.name=Orange Firefly Lantern
tile.lantern.firefly.orange.desc=A glass jar containing a swarm of orange fireflies.
tile.lantern.firefly.blue.name=Blue Firefly Lantern
tile.lantern.firefly.blue.desc=A glass jar containing a swarm of blue fireflies.
tile.lantern.firefly.red.name=Red Firefly Lantern
tile.lantern.firefly.red.desc=A glass jar containing a swarm of red fireflies.

tile.flag.name=Flag
tile.flag.desc=A flag to mark your territory.

tile.paper_wall.name=Paper Wall
tile.paper_wall.desc=A wall made of delicate paper. Be careful!

tile.trapdoor.planks.oak.painted.name=Painted Trapdoor
tile.trapdoor.planks.oak.painted.desc=How did you get this?!
tile.trapdoor.planks.oak.painted.black.name=Black Oak Trapdoor
tile.trapdoor.planks.oak.painted.black.desc=Like a door, but flat and painted black.
tile.trapdoor.planks.oak.painted.red.name=Red Oak Trapdoor
tile.trapdoor.planks.oak.painted.red.desc=Like a door, but flat and painted red.
tile.trapdoor.planks.oak.painted.green.name=Green Oak Trapdoor
tile.trapdoor.planks.oak.painted.green.desc=Like a door, but flat and painted green.
tile.trapdoor.planks.oak.painted.brown.name=Brown Oak Trapdoor
tile.trapdoor.planks.oak.painted.brown.desc=Like a door, but flat and painted brown.
tile.trapdoor.planks.oak.painted.blue.name=Blue Oak Trapdoor
tile.trapdoor.planks.oak.painted.blue.desc=Like a door, but flat and painted blue.
tile.trapdoor.planks.oak.painted.purple.name=Purple Oak Trapdoor
tile.trapdoor.planks.oak.painted.purple.desc=Like a door, but flat and painted purple.
tile.trapdoor.planks.oak.painted.cyan.name=Cyan Oak Trapdoor
tile.trapdoor.planks.oak.painted.cyan.desc=Like a door, but flat and painted cyan.
tile.trapdoor.planks.oak.painted.silver.name=Light Gray Oak Trapdoor
tile.trapdoor.planks.oak.painted.silver.desc=Like a door, but flat and painted light gray.
tile.trapdoor.planks.oak.painted.gray.name=Gray Oak Trapdoor
tile.trapdoor.planks.oak.painted.gray.desc=Like a door, but flat and painted gray.
tile.trapdoor.planks.oak.painted.pink.name=Pink Oak Trapdoor
tile.trapdoor.planks.oak.painted.pink.desc=Like a door, but flat and painted pink.
tile.trapdoor.planks.oak.painted.lime.name=Lime Oak Trapdoor
tile.trapdoor.planks.oak.painted.lime.desc=Like a door, but flat and painted lime.
tile.trapdoor.planks.oak.painted.yellow.name=Yellow Oak Trapdoor
tile.trapdoor.planks.oak.painted.yellow.desc=Like a door, but flat and painted yellow.
tile.trapdoor.planks.oak.painted.lightblue.name=Light Blue Oak Trapdoor
tile.trapdoor.planks.oak.painted.lightblue.desc=Like a door, but flat and painted light blue.
tile.trapdoor.planks.oak.painted.magenta.name=Magenta Oak Trapdoor
tile.trapdoor.planks.oak.painted.magenta.desc=Like a door, but flat and painted magenta.
tile.trapdoor.planks.oak.painted.orange.name=Orange Oak Trapdoor
tile.trapdoor.planks.oak.painted.orange.desc=Like a door, but flat and painted orange.
tile.trapdoor.planks.oak.painted.white.name=White Oak Trapdoor
tile.trapdoor.planks.oak.painted.white.desc=Like a door, but flat and painted white.

tile.door.planks.oak.painted.bottom.name=Bottom Painted Wooden Door
tile.door.planks.oak.painted.bottom.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.black.name=Black Bottom Wooden Door
tile.door.planks.oak.painted.bottom.black.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.red.name=Red Bottom Wooden Door
tile.door.planks.oak.painted.bottom.red.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.green.name=Green Bottom Wooden Door
tile.door.planks.oak.painted.bottom.green.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.brown.name=Brown Bottom Wooden Door
tile.door.planks.oak.painted.bottom.brown.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.blue.name=Blue Bottom Wooden Door
tile.door.planks.oak.painted.bottom.blue.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.purple.name=Purple Bottom Wooden Door
tile.door.planks.oak.painted.bottom.purple.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.cyan.name=Cyan Bottom Wooden Door
tile.door.planks.oak.painted.bottom.cyan.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.silver.name=Light Gray Bottom Wooden Door
tile.door.planks.oak.painted.bottom.silver.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.gray.name=Gray Bottom Wooden Door
tile.door.planks.oak.painted.bottom.gray.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.pink.name=Pink Bottom Wooden Door
tile.door.planks.oak.painted.bottom.pink.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.lime.name=Lime Bottom Wooden Door
tile.door.planks.oak.painted.bottom.lime.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.yellow.name=Yellow Bottom Wooden Door
tile.door.planks.oak.painted.bottom.yellow.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.lightblue.name=Light Blue Bottom Wooden Door
tile.door.planks.oak.painted.bottom.lightblue.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.magenta.name=Magenta Bottom Wooden Door
tile.door.planks.oak.painted.bottom.magenta.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.orange.name=Orange Bottom Wooden Door
tile.door.planks.oak.painted.bottom.orange.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.white.name=White Bottom Wooden Door
tile.door.planks.oak.painted.bottom.white.desc=How did you get this?!

tile.door.planks.oak.painted.top.name=Top Painted Wooden Door
tile.door.planks.oak.painted.top.desc=How did you get this?!
tile.door.planks.oak.painted.top.black.name=Black Top Wooden Door
tile.door.planks.oak.painted.top.black.desc=How did you get this?!
tile.door.planks.oak.painted.top.red.name=Red Top Wooden Door
tile.door.planks.oak.painted.top.red.desc=How did you get this?!
tile.door.planks.oak.painted.top.green.name=Green Top Wooden Door
tile.door.planks.oak.painted.top.green.desc=How did you get this?!
tile.door.planks.oak.painted.top.brown.name=Brown Top Wooden Door
tile.door.planks.oak.painted.top.brown.desc=How did you get this?!
tile.door.planks.oak.painted.top.blue.name=Blue Top Wooden Door
tile.door.planks.oak.painted.top.blue.desc=How did you get this?!
tile.door.planks.oak.painted.top.purple.name=Purple Top Wooden Door
tile.door.planks.oak.painted.top.purple.desc=How did you get this?!
tile.door.planks.oak.painted.top.cyan.name=Cyan Top Wooden Door
tile.door.planks.oak.painted.top.cyan.desc=How did you get this?!
tile.door.planks.oak.painted.top.silver.name=Light Gray Top Wooden Door
tile.door.planks.oak.painted.top.silver.desc=How did you get this?!
tile.door.planks.oak.painted.top.gray.name=Gray Top Wooden Door
tile.door.planks.oak.painted.top.gray.desc=How did you get this?!
tile.door.planks.oak.painted.top.pink.name=Pink Top Wooden Door
tile.door.planks.oak.painted.top.pink.desc=How did you get this?!
tile.door.planks.oak.painted.top.lime.name=Lime Top Wooden Door
tile.door.planks.oak.painted.top.lime.desc=How did you get this?!
tile.door.planks.oak.painted.top.yellow.name=Yellow Top Wooden Door
tile.door.planks.oak.painted.top.yellow.desc=How did you get this?!
tile.door.planks.oak.painted.top.lightblue.name=Light Blue Top Wooden Door
tile.door.planks.oak.painted.top.lightblue.desc=How did you get this?!
tile.door.planks.oak.painted.top.magenta.name=Magenta Top Wooden Door
tile.door.planks.oak.painted.top.magenta.desc=How did you get this?!
tile.door.planks.oak.painted.top.orange.name=Orange Top Wooden Door
tile.door.planks.oak.painted.top.orange.desc=How did you get this?!
tile.door.planks.oak.painted.top.white.name=White Top Wooden Door
tile.door.planks.oak.painted.top.white.desc=How did you get this?!

tile.door.glass.top.name=Glass Top Door
tile.door.glass.top.desc=You shouldn't be seeing this.
tile.door.glass.bottom.name=Glass Bottom Door
tile.door.glass.bottom.desc=And that's not just because it's glass.

tile.rope.name=Rope
tile.rope.desc=Rope, rope, rope your boat.
\ No newline at end of file
+tile.stone.name=Stone
tile.stone.desc=A block of solid stone.
tile.basalt.name=Basalt
tile.basalt.desc=A block of solid basalt.
tile.limestone.name=Limestone
tile.limestone.desc=A block of solid limestone.
tile.granite.name=Granite
tile.granite.desc=A block of solid granite.
tile.marble.name=Marble
tile.marble.desc=A block of solid marble.
tile.slate.name=Slate
tile.slate.desc=A block of solid slate.
tile.permafrost.name=Permafrost
tile.permafrost.desc=A block of frozen stone.

tile.cobble.stone.name=Cobblestone
tile.cobble.stone.desc=Stone, smashed apart and reconstituted.
tile.cobble.stone.mossy.name=Mossy Cobblestone
tile.cobble.stone.mossy.desc=Cobblestone with added greenery.
tile.cobble.basalt.name=Cobbled Basalt
tile.cobble.basalt.desc=Basalt, smashed apart and reconstituted.
tile.cobble.limestone.name=Cobbled Limestone
tile.cobble.limestone.desc=Limestone, smashed apart and reconstituted.
tile.cobble.granite.name=Cobbled Granite
tile.cobble.granite.desc=Granite, smashed apart and reconstituted.
tile.cobble.permafrost.name=Cobbled Permafrost
tile.cobble.permafrost.desc=Permafrost, smashed apart and reconstituted.

tile.pillar.marble.name=Marble Pillar
tile.pillar.marble.desc=A block of marble engraved into a pillar.
tile.capstone.marble.name=Marble Capstone
tile.capstone.marble.desc=A pillar capstone made of solid marble.

tile.sandstone.name=Sandstone
tile.sandstone.desc=Compacted sand.

tile.stone.carved.name=Carved Stone
tile.stone.carved.desc=Polished Stone with lines hewn through the middle.
tile.granite.carved.name=Carved Granite
tile.granite.carved.desc=Polished Granite with lines hewn through the middle.
tile.limestone.carved.name=Carved Limestone
tile.limestone.carved.desc=Polished Limestone with lines hewn through the middle.
tile.basalt.carved.name=Carved Basalt
tile.basalt.carved.desc=Polished Basalt with lines hewn through the middle.

tile.planks.oak.name=Wooden Planks
tile.planks.oak.desc=Processed tree insides.
tile.planks.oak.painted.name=Mystery Planks
tile.planks.oak.painted.desc=How did you get this?!
tile.planks.oak.painted.black.name=Black Wooden Planks
tile.planks.oak.painted.black.desc=Wooden planks, stained black.
tile.planks.oak.painted.red.name=Red Wooden Planks
tile.planks.oak.painted.red.desc=Wooden planks, stained red.
tile.planks.oak.painted.green.name=Green Wooden Planks
tile.planks.oak.painted.green.desc=Wooden planks, stained green.
tile.planks.oak.painted.brown.name=Brown Wooden Planks
tile.planks.oak.painted.brown.desc=Wooden planks, stained brown.
tile.planks.oak.painted.blue.name=Blue Wooden Planks
tile.planks.oak.painted.blue.desc=Wooden planks, stained blue.
tile.planks.oak.painted.purple.name=Purple Wooden Planks
tile.planks.oak.painted.purple.desc=Wooden planks, stained purple.
tile.planks.oak.painted.cyan.name=Cyan Wooden Planks
tile.planks.oak.painted.cyan.desc=Wooden planks, stained cyan.
tile.planks.oak.painted.silver.name=Light Gray Wooden Planks
tile.planks.oak.painted.silver.desc=Wooden planks, stained light gray.
tile.planks.oak.painted.gray.name=Gray Wooden Planks
tile.planks.oak.painted.gray.desc=Wooden planks, stained gray.
tile.planks.oak.painted.pink.name=Pink Wooden Planks
tile.planks.oak.painted.pink.desc=Wooden planks, stained pink.
tile.planks.oak.painted.lime.name=Lime Wooden Planks
tile.planks.oak.painted.lime.desc=Wooden planks, stained lime.
tile.planks.oak.painted.yellow.name=Yellow Wooden Planks
tile.planks.oak.painted.yellow.desc=Wooden planks, stained yellow.
tile.planks.oak.painted.lightblue.name=Light Blue Wooden Planks
tile.planks.oak.painted.lightblue.desc=Wooden planks, stained light blue.
tile.planks.oak.painted.magenta.name=Magenta Wooden Planks
tile.planks.oak.painted.magenta.desc=Wooden planks, stained magenta.
tile.planks.oak.painted.orange.name=Orange Wooden Planks
tile.planks.oak.painted.orange.desc=Wooden planks, stained orange.
tile.planks.oak.painted.white.name=White Wooden Planks
tile.planks.oak.painted.white.desc=Wooden planks, stained white.

tile.torch.coal.name=Torch
tile.torch.coal.desc=Helps light the way.

tile.ladder.oak.name=Oak Ladder
tile.ladder.oak.desc=For very rapid vertical movement.

tile.fence.planks.oak.name=Oak Fence
tile.fence.planks.oak.desc=Too tall to jump over.

tile.fence.planks.oak.painted.name=Mystery Wooden Fence
tile.fence.planks.oak.painted.desc=How did you get this?!
tile.fence.planks.oak.painted.black.name=Black Wooden Fence
tile.fence.planks.oak.painted.black.desc=A wooden fence, stained black.
tile.fence.planks.oak.painted.red.name=Red Wooden Fence
tile.fence.planks.oak.painted.red.desc=A wooden fence, stained red.
tile.fence.planks.oak.painted.green.name=Green Wooden Fence
tile.fence.planks.oak.painted.green.desc=A wooden fence, stained green.
tile.fence.planks.oak.painted.brown.name=Brown Wooden Fence
tile.fence.planks.oak.painted.brown.desc=A wooden fence, stained brown.
tile.fence.planks.oak.painted.blue.name=Blue Wooden Fence
tile.fence.planks.oak.painted.blue.desc=A wooden fence, stained blue.
tile.fence.planks.oak.painted.purple.name=Purple Wooden Fence
tile.fence.planks.oak.painted.purple.desc=A wooden fence, stained purple.
tile.fence.planks.oak.painted.cyan.name=Cyan Wooden Fence
tile.fence.planks.oak.painted.cyan.desc=A wooden fence, stained cyan.
tile.fence.planks.oak.painted.silver.name=Light Gray Wooden Fence
tile.fence.planks.oak.painted.silver.desc=A wooden fence, stained light gray.
tile.fence.planks.oak.painted.gray.name=Gray Wooden Fence
tile.fence.planks.oak.painted.gray.desc=A wooden fence, stained gray.
tile.fence.planks.oak.painted.pink.name=Pink Wooden Fence
tile.fence.planks.oak.painted.pink.desc=A wooden fence, stained pink.
tile.fence.planks.oak.painted.lime.name=Lime Wooden Fence
tile.fence.planks.oak.painted.lime.desc=A wooden fence, stained lime.
tile.fence.planks.oak.painted.yellow.name=Yellow Wooden Fence
tile.fence.planks.oak.painted.yellow.desc=A wooden fence, stained yellow.
tile.fence.planks.oak.painted.lightblue.name=Light Blue Wooden Fence
tile.fence.planks.oak.painted.lightblue.desc=A wooden fence, stained light blue.
tile.fence.planks.oak.painted.magenta.name=Magenta Wooden Fence
tile.fence.planks.oak.painted.magenta.desc=A wooden fence, stained magenta.
tile.fence.planks.oak.painted.orange.name=Orange Wooden Fence
tile.fence.planks.oak.painted.orange.desc=A wooden fence, stained orange.
tile.fence.planks.oak.painted.white.name=White Wooden Fence
tile.fence.planks.oak.painted.white.desc=A wooden fence, stained white.

tile.fencegate.planks.oak.name=Wooden Fence Gate
tile.fencegate.planks.oak.desc=Like a door but for fences.

tile.fencegate.planks.oak.painted.name=Mystery Wooden Fence Gate
tile.fencegate.planks.oak.painted.desc=How did you get this?!
tile.fencegate.planks.oak.painted.black.name=Black Wooden Fence Gate
tile.fencegate.planks.oak.painted.black.desc=A wooden fence gate, stained black.
tile.fencegate.planks.oak.painted.red.name=Red Wooden Fence Gate
tile.fencegate.planks.oak.painted.red.desc=A wooden fence gate, stained red.
tile.fencegate.planks.oak.painted.green.name=Green Wooden Fence Gate
tile.fencegate.planks.oak.painted.green.desc=A wooden fence gate, stained green.
tile.fencegate.planks.oak.painted.brown.name=Brown Wooden Fence Gate
tile.fencegate.planks.oak.painted.brown.desc=A wooden fence gate, stained brown.
tile.fencegate.planks.oak.painted.blue.name=Blue Wooden Fence Gate
tile.fencegate.planks.oak.painted.blue.desc=A wooden fence gate, stained blue.
tile.fencegate.planks.oak.painted.purple.name=Purple Wooden Fence Gate
tile.fencegate.planks.oak.painted.purple.desc=A wooden fence gate, stained purple.
tile.fencegate.planks.oak.painted.cyan.name=Cyan Wooden Fence Gate
tile.fencegate.planks.oak.painted.cyan.desc=A wooden fence gate, stained cyan.
tile.fencegate.planks.oak.painted.silver.name=Light Gray Wooden Fence Gate
tile.fencegate.planks.oak.painted.silver.desc=A wooden fence gate, stained light gray.
tile.fencegate.planks.oak.painted.gray.name=Gray Wooden Fence Gate
tile.fencegate.planks.oak.painted.gray.desc=A wooden fence gate, stained gray.
tile.fencegate.planks.oak.painted.pink.name=Pink Wooden Fence Gate
tile.fencegate.planks.oak.painted.pink.desc=A wooden fence gate, stained pink.
tile.fencegate.planks.oak.painted.lime.name=Lime Wooden Fence Gate
tile.fencegate.planks.oak.painted.lime.desc=A wooden fence gate, stained lime.
tile.fencegate.planks.oak.painted.yellow.name=Yellow Wooden Fence Gate
tile.fencegate.planks.oak.painted.yellow.desc=A wooden fence gate, stained yellow.
tile.fencegate.planks.oak.painted.lightblue.name=Light Blue Wooden Fence Gate
tile.fencegate.planks.oak.painted.lightblue.desc=A wooden fence gate, stained light blue.
tile.fencegate.planks.oak.painted.magenta.name=Magenta Wooden Fence Gate
tile.fencegate.planks.oak.painted.magenta.desc=A wooden fence gate, stained magenta.
tile.fencegate.planks.oak.painted.orange.name=Orange Wooden Fence Gate
tile.fencegate.planks.oak.painted.orange.desc=A wooden fence gate, stained orange.
tile.fencegate.planks.oak.painted.white.name=White Wooden Fence Gate
tile.fencegate.planks.oak.painted.white.desc=A wooden fence gate, stained white.

tile.bookshelf.planks.oak.name=Bookshelf
tile.bookshelf.planks.oak.desc=A repository of knowledge.

tile.wool.name=Wool
tile.wool.desc=How did you get this?!
tile.wool.black.name=Black Wool
tile.wool.black.desc=Sheep's wool, dyed black.
tile.wool.red.name=Red Wool
tile.wool.red.desc=Sheep's wool, dyed red.
tile.wool.green.name=Green Wool
tile.wool.green.desc=Sheep's wool, dyed green.
tile.wool.brown.name=Brown Wool
tile.wool.brown.desc=Sheep's wool, dyed brown.
tile.wool.blue.name=Blue Wool
tile.wool.blue.desc=Sheep's wool, dyed blue.
tile.wool.purple.name=Purple Wool
tile.wool.purple.desc=Sheep's wool, dyed purple.
tile.wool.cyan.name=Cyan Wool
tile.wool.cyan.desc=Sheep's wool, dyed cyan.
tile.wool.silver.name=Light Gray Wool
tile.wool.silver.desc=Sheep's wool, dyed light gray.
tile.wool.gray.name=Gray Wool
tile.wool.gray.desc=Sheep's wool, dyed gray.
tile.wool.pink.name=Pink Wool
tile.wool.pink.desc=Sheep's wool, dyed pink.
tile.wool.lime.name=Lime Wool
tile.wool.lime.desc=Sheep's wool, dyed lime.
tile.wool.yellow.name=Yellow Wool
tile.wool.yellow.desc=Sheep's wool, dyed yellow.
tile.wool.lightblue.name=Light Blue Wool
tile.wool.lightblue.desc=Sheep's wool, dyed light blue.
tile.wool.magenta.name=Magenta Wool
tile.wool.magenta.desc=Sheep's wool, dyed magenta.
tile.wool.orange.name=Orange Wool
tile.wool.orange.desc=Sheep's wool, dyed orange.
tile.wool.white.name=White Wool
tile.wool.white.desc=Sheep's wool, dyed white.

tile.brick.clay.name=Clay Bricks
tile.brick.clay.desc=Stacked bricks of baked clay.
tile.brick.stone.polished.name=Polished Stone Bricks
tile.brick.stone.polished.desc=Stacked bricks of polished stone.
tile.brick.stone.polished.mossy.name=Mossy Polished Stone Bricks
tile.brick.stone.polished.mossy.desc=Stacked bricks of polished stone with added greenery.
tile.brick.sandstone.name=Sandstone Bricks
tile.brick.sandstone.desc=Stacked bricks of sandstone.
tile.brick.gold.name=Gold Bricks
tile.brick.gold.desc=Stacked bricks of gold.
tile.brick.lapis.name=Lapis Lazuli Bricks
tile.brick.lapis.desc=Stacked bricks of lapis lazuli.
tile.brick.basalt.name=Basalt Bricks
tile.brick.basalt.desc=Stacked bricks of basalt.
tile.brick.limestone.name=Limestone Bricks
tile.brick.limestone.desc=Stacked bricks of limestone.
tile.brick.granite.name=Granite Bricks
tile.brick.granite.desc=Stacked bricks of granite.
tile.brick.marble.name=Marble Bricks
tile.brick.marble.desc=Stacked bricks of marble.
tile.brick.slate.name=Slate Bricks
tile.brick.slate.desc=Stacked bricks of slate.
tile.brick.stone.name=Stone Bricks
tile.brick.stone.desc=Stacked bricks of stone.
tile.brick.permafrost.name=Permafrost Bricks
tile.brick.permafrost.desc=Stacked bricks of permafrost.
tile.brick.iron.name=Iron Bricks
tile.brick.iron.desc=Stacked bricks of iron.

tile.slab.planks.oak.name=Wooden Slab
tile.slab.planks.oak.desc=A slab of wooden planks.
tile.slab.cobble.stone.name=Cobblestone Slab
tile.slab.cobble.stone.desc=A slab of cobblestone.
tile.slab.sandstone.name=Sandstone Slab
tile.slab.sandstone.desc=A slab of sandstone.
tile.slab.brick.stone.polished.name=Polished Stone Brick Slab
tile.slab.brick.stone.polished.desc=A slab of polished stone bricks.
tile.slab.stone.carved.name=Polished Stone Slab
tile.slab.stone.carved.desc=A slab of polished stone.
tile.slab.brick.marble.name=Marble Brick Slab
tile.slab.brick.marble.desc=A slab of marble bricks.
tile.slab.brick.clay.name=Clay Brick Slab
tile.slab.brick.clay.desc=A slab of clay bricks.
tile.slab.capstone.marble.name=Marble Capstone Slab
tile.slab.capstone.marble.desc=Marble sculpted into a capstone.
tile.slab.cobble.basalt.name=Cobbled Basalt Slab
tile.slab.cobble.basalt.desc=A slab of cobbled basalt.
tile.slab.cobble.limestone.name=Cobbled Limestone Slab
tile.slab.cobble.limestone.desc=A slab of cobbled limestone.
tile.slab.cobble.granite.name=Cobbled Granite Slab
tile.slab.cobble.granite.desc=A slab of cobbled granite.
tile.slab.brick.basalt.name=Basalt Brick Slab
tile.slab.brick.basalt.desc=A slab of basalt bricks.
tile.slab.brick.limestone.name=Limestone Brick Slab
tile.slab.brick.limestone.desc=A slab of limestone bricks.
tile.slab.brick.granite.name=Granite Brick Slab
tile.slab.brick.granite.desc=A slab of granite bricks.
tile.slab.brick.slate.name=Slate Brick Slab
tile.slab.brick.slate.desc=A slab of slate bricks.
tile.slab.brick.stone.name=Stone Brick Slab
tile.slab.brick.stone.desc=A slab of stone bricks.
tile.slab.granite.carved.name=Polished Granite Slab
tile.slab.granite.carved.desc=A slab of polished granite.
tile.slab.limestone.carved.name=Polished Limestone Slab
tile.slab.limestone.carved.desc=A slab of polished limestone.
tile.slab.basalt.carved.name=Polished Basalt Slab
tile.slab.basalt.carved.desc=A slab of polished basalt.

tile.slab.planks.oak.painted.name=Mystery Wooden Slab
tile.slab.planks.oak.painted.desc=How did you get this?!
tile.slab.planks.oak.painted.black.name=Black Wooden Slab
tile.slab.planks.oak.painted.black.desc=A slab of wooden planks, stained black.
tile.slab.planks.oak.painted.red.name=Red Wooden Slab
tile.slab.planks.oak.painted.red.desc=A slab of wooden planks, stained red.
tile.slab.planks.oak.painted.green.name=Green Wooden Slab
tile.slab.planks.oak.painted.green.desc=A slab of wooden planks, stained green.
tile.slab.planks.oak.painted.brown.name=Brown Wooden Slab
tile.slab.planks.oak.painted.brown.desc=A slab of wooden planks, stained brown.
tile.slab.planks.oak.painted.blue.name=Blue Wooden Slab
tile.slab.planks.oak.painted.blue.desc=A slab of wooden planks, stained blue.
tile.slab.planks.oak.painted.purple.name=Purple Wooden Slab
tile.slab.planks.oak.painted.purple.desc=A slab of wooden planks, stained purple.
tile.slab.planks.oak.painted.cyan.name=Cyan Wooden Slab
tile.slab.planks.oak.painted.cyan.desc=A slab of wooden planks, stained cyan.
tile.slab.planks.oak.painted.silver.name=Light Gray Wooden Slab
tile.slab.planks.oak.painted.silver.desc=A slab of wooden planks, stained light gray.
tile.slab.planks.oak.painted.gray.name=Gray Wooden Slab
tile.slab.planks.oak.painted.gray.desc=A slab of wooden planks, stained gray.
tile.slab.planks.oak.painted.pink.name=Pink Wooden Slab
tile.slab.planks.oak.painted.pink.desc=A slab of wooden planks, stained pink.
tile.slab.planks.oak.painted.lime.name=Lime Wooden Slab
tile.slab.planks.oak.painted.lime.desc=A slab of wooden planks, stained lime.
tile.slab.planks.oak.painted.yellow.name=Yellow Wooden Slab
tile.slab.planks.oak.painted.yellow.desc=A slab of wooden planks, stained yellow.
tile.slab.planks.oak.painted.lightblue.name=Light Blue Wooden Slab
tile.slab.planks.oak.painted.lightblue.desc=A slab of wooden planks, stained light blue.
tile.slab.planks.oak.painted.magenta.name=Magenta Wooden Slab
tile.slab.planks.oak.painted.magenta.desc=A slab of wooden planks, stained magenta.
tile.slab.planks.oak.painted.orange.name=Orange Wooden Slab
tile.slab.planks.oak.painted.orange.desc=A slab of wooden planks, stained orange.
tile.slab.planks.oak.painted.white.name=White Wooden Slab
tile.slab.planks.oak.painted.white.desc=A slab of wooden planks, stained white.

tile.stairs.planks.oak.name=Wooden Stairs
tile.stairs.planks.oak.desc=Wooden block used for rapid vertical movement.
tile.stairs.cobble.stone.name=Cobblestone Stairs
tile.stairs.cobble.stone.desc=Cobblestone block used for rapid vertical movement.
tile.stairs.brick.stone.polished.name=Polished Stone Brick Stairs
tile.stairs.brick.stone.polished.desc=Polished stone brick block used for rapid vertical movement.
tile.stairs.brick.marble.name=Marble Brick Stairs
tile.stairs.brick.marble.desc=Marble brick block used for rapid vertical movement.
tile.stairs.cobble.basalt.name=Cobbled Basalt Stairs
tile.stairs.cobble.basalt.desc=Cobbled basalt block used for rapid vertical movement.
tile.stairs.cobble.limestone.name=Cobbled Limestone Stairs
tile.stairs.cobble.limestone.desc=Cobbled limestone block used for rapid vertical movement.
tile.stairs.cobble.granite.name=Cobbled Granite Stairs
tile.stairs.cobble.granite.desc=Cobbled granite block used for rapid vertical movement.
tile.stairs.brick.basalt.name=Basalt Brick Stairs
tile.stairs.brick.basalt.desc=Basalt brick block used for rapid vertical movement.
tile.stairs.brick.limestone.name=Limestone Brick Stairs
tile.stairs.brick.limestone.desc=Limestone brick block used for rapid vertical movement.
tile.stairs.brick.granite.name=Granite Brick Stairs
tile.stairs.brick.granite.desc=Granite brick block used for rapid vertical movement.
tile.stairs.brick.clay.name=Clay Brick Stairs
tile.stairs.brick.clay.desc=Clay brick block used for rapid vertical movement.
tile.stairs.brick.slate.name=Slate Brick Stairs
tile.stairs.brick.slate.desc=Slate brick block used for rapid vertical movement.
tile.stairs.brick.stone.name=Stone Brick Stairs
tile.stairs.brick.stone.desc=Stone brick block used for rapid vertical movement.

tile.stairs.planks.oak.painted.name=Mystery Wooden Stairs
tile.stairs.planks.oak.painted.desc=How did you get this?!
tile.stairs.planks.oak.painted.black.name=Black Wooden Stairs
tile.stairs.planks.oak.painted.black.desc=Wooden steps, stained black.
tile.stairs.planks.oak.painted.red.name=Red Wooden Stairs
tile.stairs.planks.oak.painted.red.desc=Wooden steps, stained red.
tile.stairs.planks.oak.painted.green.name=Green Wooden Stairs
tile.stairs.planks.oak.painted.green.desc=Wooden steps, stained green.
tile.stairs.planks.oak.painted.brown.name=Brown Wooden Stairs
tile.stairs.planks.oak.painted.brown.desc=Wooden steps, stained brown.
tile.stairs.planks.oak.painted.blue.name=Blue Wooden Stairs
tile.stairs.planks.oak.painted.blue.desc=Wooden steps, stained blue.
tile.stairs.planks.oak.painted.purple.name=Purple Wooden Stairs
tile.stairs.planks.oak.painted.purple.desc=Wooden steps, stained purple.
tile.stairs.planks.oak.painted.cyan.name=Cyan Wooden Stairs
tile.stairs.planks.oak.painted.cyan.desc=Wooden steps, stained cyan.
tile.stairs.planks.oak.painted.silver.name=Light Gray Wooden Stairs
tile.stairs.planks.oak.painted.silver.desc=Wooden steps, stained light gray.
tile.stairs.planks.oak.painted.gray.name=Gray Wooden Stairs
tile.stairs.planks.oak.painted.gray.desc=Wooden steps, stained gray.
tile.stairs.planks.oak.painted.pink.name=Pink Wooden Stairs
tile.stairs.planks.oak.painted.pink.desc=Wooden steps, stained pink.
tile.stairs.planks.oak.painted.lime.name=Lime Wooden Stairs
tile.stairs.planks.oak.painted.lime.desc=Wooden steps, stained lime.
tile.stairs.planks.oak.painted.yellow.name=Yellow Wooden Stairs
tile.stairs.planks.oak.painted.yellow.desc=Wooden steps, stained yellow.
tile.stairs.planks.oak.painted.lightblue.name=Light Blue Wooden Stairs
tile.stairs.planks.oak.painted.lightblue.desc=Wooden steps, stained light blue.
tile.stairs.planks.oak.painted.magenta.name=Magenta Wooden Stairs
tile.stairs.planks.oak.painted.magenta.desc=Wooden steps, stained magenta.
tile.stairs.planks.oak.painted.orange.name=Orange Wooden Stairs
tile.stairs.planks.oak.painted.orange.desc=Wooden steps, stained orange.
tile.stairs.planks.oak.painted.white.name=White Wooden Stairs
tile.stairs.planks.oak.painted.white.desc=Wooden steps, stained white.

tile.obsidian.name=Obsidian
tile.obsidian.desc=Rapidly cooled volcanic rock.

tile.glass.name=Glass
tile.glass.desc=Sand heated until it becomes translucent.
tile.glass.tinted.name=Tinted Glass
tile.glass.tinted.desc=Darkened glass that blocks light.

tile.grass.name=Grass
tile.grass.desc=Crisp, crunchy grass.
tile.grass.retro.name=Retro Grass
tile.grass.retro.desc=Crisp, crunchy grass. Smells old.
tile.grass.scorched.name=Scorched Grass
tile.grass.scorched.desc=Grass that has baked in the sun.

tile.path.dirt.name=Dirt Path
tile.path.dirt.desc=Dirt worn down by frequent travelling.

tile.dirt.name=Dirt
tile.dirt.desc=Crumbly brown dirt.
tile.dirt.scorched.name=Scorched Dirt
tile.dirt.scorched.desc=Dirt that has baked in the sun.
tile.dirt.scorched.rich.name=Rich Scorched Dirt
tile.dirt.scorched.rich.desc=Dirt that has baked in the sun, searing in minerals.

tile.mud.name=Mud
tile.mud.desc=Mud sodden to its core.
tile.mud.baked.name=Baked Mud
tile.mud.baked.desc=Mud that's been dried out and cracked.

tile.sponge.dry.name=Sponge
tile.sponge.dry.desc=A dry sponge, good for soaking up water.
tile.sponge.wet.name=Wet Sponge
tile.sponge.wet.desc=A sponge full of water.

tile.moss.stone.name=Mossy Stone
tile.moss.stone.desc=Moss covering a block of stone.
tile.moss.basalt.name=Mossy Basalt
tile.moss.basalt.desc=Moss covering a block of basalt.
tile.moss.limestone.name=Mossy Limestone
tile.moss.limestone.desc=Moss covering a block of limestone.
tile.moss.granite.name=Mossy Granite
tile.moss.granite.desc=Moss covering a block of granite.

tile.sand.name=Sand
tile.sand.desc=Gets everywhere.
tile.gravel.name=Gravel
tile.gravel.desc=A loose collection of pebbles.

tile.bedrock.name=Bedrock
tile.bedrock.desc=The toughest substance known to man.

tile.fluid.water.flowing.name=Flowing Water
tile.fluid.water.flowing.desc=Water that flows when placed.
tile.fluid.water.still.name=Still Water
tile.fluid.water.still.desc=Water that does not flow when placed.
tile.fluid.lava.flowing.name=Flowing Lava
tile.fluid.lava.flowing.desc=Lava that flows when placed.
tile.fluid.lava.still.name=Still Lava
tile.fluid.lava.still.desc=Lava that does not flow when placed.

tile.log.oak.name=Oak Log
tile.log.oak.desc=A log from an oak tree.
tile.log.pine.name=Pine Log
tile.log.pine.desc=A log from a pine tree.
tile.log.birch.name=Birch Log
tile.log.birch.desc=A log from a birch tree.
tile.log.cherry.name=Cherry Log
tile.log.cherry.desc=A log from a cherry tree.
tile.log.eucalyptus.name=Eucalyptus Log
tile.log.eucalyptus.desc=A log from a eucalyptus tree.
tile.log.oak.mossy.name=Mossy Oak Log
tile.log.oak.mossy.desc=A log from a mossy oak tree.

tile.leaves.oak.name=Oak Leaves
tile.leaves.oak.desc=Leaves from an oak tree.
tile.leaves.pine.name=Pine Leaves
tile.leaves.pine.desc=Leaves from a pine tree.
tile.leaves.birch.name=Birch Leaves
tile.leaves.birch.desc=Leaves from a birch tree.
tile.leaves.cherry.name=Cherry Leaves
tile.leaves.cherry.desc=Leaves from a cherry tree.
tile.leaves.eucalyptus.name=Eucalyptus Leaves
tile.leaves.eucalyptus.desc=Leaves from a eucalyptus tree.
tile.leaves.oak.retro.name=Retro Leaves
tile.leaves.oak.retro.desc=Leaves from long ago.
tile.leaves.shrub.name=Shrub Leaves
tile.leaves.shrub.desc=Leaves from a shrub.
tile.leaves.cherry.flowering.name=Flowering Cherry Leaves
tile.leaves.cherry.flowering.desc=Leaves from a cherry tree that are budding with fruit.
tile.leaves.cacao.name=Cacao Leaves
tile.leaves.cacao.desc=Leaves from a cacao tree.
tile.leaves.caatinga.name=Caatinga Leaves
tile.leaves.caatinga.desc=Leaves from a caatinga tree.

tile.sapling.oak.name=Oak Sapling
tile.sapling.oak.desc=Plant to grow an oak tree.
tile.sapling.pine.name=Pine Sapling
tile.sapling.pine.desc=Plant to grow a pine tree.
tile.sapling.birch.name=Birch Sapling
tile.sapling.birch.desc=Plant to grow a birch tree.
tile.sapling.cherry.name=Cherry Sapling
tile.sapling.cherry.desc=Plant to grow a cherry tree.
tile.sapling.eucalyptus.name=Eucalyptus Sapling
tile.sapling.eucalyptus.desc=Plant to grow a eucalyptus tree.
tile.sapling.oak.retro.name=Retro Oak Sapling
tile.sapling.oak.retro.desc=Plant to grow a tree from long ago.
tile.sapling.shrub.name=Shrub Sapling
tile.sapling.shrub.desc=Plant to grow a shrub.
tile.sapling.cacao.name=Cacao Sapling
tile.sapling.cacao.desc=Plant to grow a cacao tree.

tile.tallgrass.name=Tall Grass
tile.tallgrass.desc=Lush, growing grass.
tile.tallgrass.fern.name=Fern
tile.tallgrass.fern.desc=A fern plant.
tile.deadbush.name=Dead Bush
tile.deadbush.desc=A dried and withered plant.
tile.spinifex.name=Spinifex
tile.spinifex.desc=A spindly, thin grass from dry regions.
tile.algae.name=Algae
tile.algae.desc=Gooey vegetation that floats on the water's surface.

tile.flower.yellow.name=Dandelion
tile.flower.yellow.desc=A beautiful yellow flower.
tile.flower.red.name=Rose
tile.flower.red.desc=A beautiful red flower.
tile.flower.purple.name=Heather
tile.flower.purple.desc=Sprigs of purple petals. Brings good luck.
tile.flower.lightblue.name=Bluebell
tile.flower.lightblue.desc=A sad-looking blue flower.
tile.flower.pink.name=Orchid
tile.flower.pink.desc=A beautiful pink flower.

tile.mushroom.red.name=Red Mushroom
tile.mushroom.red.desc=A tasty red mushroom. Good for stew.
tile.mushroom.brown.name=Brown Mushroom
tile.mushroom.brown.desc=A tasty brown mushroom. Good for stew.

tile.ore.coal.stone.name=Stone Coal Ore
tile.ore.coal.stone.desc=A chunk of coal embedded in stone.
tile.ore.coal.basalt.name=Basalt Coal Ore
tile.ore.coal.basalt.desc=A chunk of coal embedded in basalt.
tile.ore.coal.limestone.name=Limestone Coal Ore
tile.ore.coal.limestone.desc=A chunk of coal embedded in limestone.
tile.ore.coal.granite.name=Granite Coal Ore
tile.ore.coal.granite.desc=A chunk of coal embedded in granite.

tile.ore.iron.stone.name=Stone Iron Ore
tile.ore.iron.stone.desc=Iron nuggets embedded in stone.
tile.ore.iron.basalt.name=Basalt Iron Ore
tile.ore.iron.basalt.desc=Iron nuggets embedded in basalt.
tile.ore.iron.limestone.name=Limestone Iron Ore
tile.ore.iron.limestone.desc=Iron nuggets embedded in limestone.
tile.ore.iron.granite.name=Granite Iron Ore
tile.ore.iron.granite.desc=Iron nuggets embedded in granite.

tile.ore.gold.stone.name=Stone Gold Ore
tile.ore.gold.stone.desc=Gold nuggets embedded in stone.
tile.ore.gold.basalt.name=Basalt Gold Ore
tile.ore.gold.basalt.desc=Gold nuggets embedded in basalt.
tile.ore.gold.limestone.name=Limestone Gold Ore
tile.ore.gold.limestone.desc=Gold nuggets embedded in limestone.
tile.ore.gold.granite.name=Granite Gold Ore
tile.ore.gold.granite.desc=Gold nuggets embedded in granite.

tile.ore.lapis.stone.name=Stone Lapis Lazuli Ore
tile.ore.lapis.stone.desc=Chunks of lapis lazuli embedded in stone.
tile.ore.lapis.basalt.name=Basalt Lapis Lazuli Ore
tile.ore.lapis.basalt.desc=Chunks of lapis lazuli embedded in basalt.
tile.ore.lapis.limestone.name=Limestone Lapis Lazuli Ore
tile.ore.lapis.limestone.desc=Chunks of lapis lazuli embedded in limestone.
tile.ore.lapis.granite.name=Granite Lapis Lazuli Ore
tile.ore.lapis.granite.desc=Chunks of lapis lazuli embedded in granite.

tile.ore.redstone.stone.name=Stone Redstone Ore
tile.ore.redstone.stone.desc=Red dust embedded in stone.
tile.ore.redstone.basalt.name=Basalt Redstone Ore
tile.ore.redstone.basalt.desc=Red dust embedded in basalt.
tile.ore.redstone.limestone.name=Limestone Redstone Ore
tile.ore.redstone.limestone.desc=Red dust embedded in limestone.
tile.ore.redstone.granite.name=Granite Redstone Ore
tile.ore.redstone.granite.desc=Red dust embedded in granite.
tile.ore.redstone.glowing.stone.name=Glowing Stone Redstone Ore
tile.ore.redstone.glowing.stone.desc=Red dust embedded in stone. Emits a faint light.
tile.ore.redstone.glowing.basalt.name=Glowing Basalt Redstone Ore
tile.ore.redstone.glowing.basalt.desc=Red dust embedded in basalt. Emits a faint light.
tile.ore.redstone.glowing.limestone.name=Glowing Limestone Redstone Ore
tile.ore.redstone.glowing.limestone.desc=Red dust embedded in limestone. Emits a faint light.
tile.ore.redstone.glowing.granite.name=Glowing Granite Redstone Ore
tile.ore.redstone.glowing.granite.desc=Red dust embedded in granite. Emits a faint light.

tile.ore.diamond.stone.name=Stone Diamond Ore
tile.ore.diamond.stone.desc=A chunk of diamond embedded in stone.
tile.ore.diamond.basalt.name=Basalt Diamond Ore
tile.ore.diamond.basalt.desc=A chunk of diamond embedded in basalt.
tile.ore.diamond.limestone.name=Limestone Diamond Ore
tile.ore.diamond.limestone.desc=A chunk of diamond embedded in limestone.
tile.ore.diamond.granite.name=Granite Diamond Ore
tile.ore.diamond.granite.desc=A chunk of diamond embedded in granite.

tile.ore.nethercoal.netherrack.name=Nether Coal Ore
tile.ore.nethercoal.netherrack.desc=A lump of Nether Coal embedded in netherrack.

tile.block.coal.name=Block of Coal
tile.block.coal.desc=A solid block of coal.
tile.block.iron.name=Block of Iron
tile.block.iron.desc=A solid block of iron. Heavy!
tile.block.gold.name=Block of Gold
tile.block.gold.desc=A solid block of gold, for flaunting your bling.
tile.block.lapis.name=Block of Lapis Lazuli
tile.block.lapis.desc=A solid block of lapis lazuli.
tile.block.redstone.name=Block of Redstone
tile.block.redstone.desc=A solid block of redstone.
tile.block.diamond.name=Block of Diamond
tile.block.diamond.desc=A solid block of diamond. Well done you.
tile.block.nethercoal.name=Block of Nether Coal
tile.block.nethercoal.desc=A solid block of Nether Coal.
tile.block.steel.name=Block of Steel
tile.block.steel.desc=A solid block of steel.
tile.block.quartz.name=Block of Quartz
tile.block.quartz.desc=A solid block of quartz.
tile.block.olivine.name=Block of Olivine
tile.block.olivine.desc=A solid block of olivine.
tile.block.charcoal.name=Block of Charcoal
tile.block.charcoal.desc=A solid block of charcoal.

tile.wire.redstone.name=Redstone Wire
tile.wire.redstone.desc=A strand of redstone dust laid on the ground.

tile.torch.redstone.idle.name=Redstone Torch
tile.torch.redstone.idle.desc=Emits a constant redstone signal.
tile.torch.redstone.active.name=Redstone Torch
tile.torch.redstone.active.desc=Emits a constant redstone signal.

tile.button.stone.name=Stone Button
tile.button.stone.desc=Emits a brief redstone signal when pressed.

tile.lever.cobble.stone.name=Cobblestone Lever
tile.lever.cobble.stone.desc=Allows turning a redstone signal on or off.

tile.pressureplate.stone.name=Stone Pressure Plate
tile.pressureplate.stone.desc=Emits a redstone signal when living creatures step on it.
tile.pressureplate.planks.oak.name=Wooden Pressure Plate
tile.pressureplate.planks.oak.desc=Emits a redstone signal when anything steps on it.
tile.pressureplate.cobble.stone.name=Cobblestone Pressure Plate
tile.pressureplate.cobble.stone.desc=Emits a redstone signal when players step on it.

tile.motionsensor.idle.name=Motion Sensor
tile.motionsensor.idle.desc=Emits a redstone signal when something moves past it.
tile.motionsensor.active.name=Active Motion Sensor
tile.motionsensor.active.desc=Emits a redstone signal when something moves past it.

tile.repeater.idle.name=Redstone Repeater
tile.repeater.idle.desc=Repeats redstone signals over a distance.
tile.repeater.active.name=Redstone Repeater
tile.repeater.active.desc=Repeats redstone signals over a distance.

tile.piston.base.name=Piston
tile.piston.base.desc=Pushes blocks but does not pull them.
tile.piston.base.sticky.name=Sticky Piston
tile.piston.base.sticky.desc=Pushes and pulls blocks.
tile.piston.head.name=Piston Head
tile.piston.head.desc=The pushy part of the piston.
tile.piston.moving.name=Piston Mover
tile.piston.moving.desc=The invisible moving part of the piston.

tile.noteblock.name=Note Block
tile.noteblock.desc=Plays a musical note when powered.

tile.rail.name=Rail
tile.rail.desc=For rapid horizontal movement via minecart.
tile.rail.powered.name=Powered Rail
tile.rail.powered.desc=Makes minecarts go faster when powered.
tile.rail.detector.name=Detector Rail
tile.rail.detector.desc=Emits a redstone signal when a minecart crosses it.

tile.spikes.name=Spike Trap
tile.spikes.desc=Deactivates when powered. Technically a war crime.

tile.dispenser.cobble.stone.name=Dispenser
tile.dispenser.cobble.stone.desc=Fires items out of the hole in the front.

tile.trapdoor.planks.oak.name=Oak Trapdoor
tile.trapdoor.planks.oak.desc=Like a door, but flat.
tile.trapdoor.iron.name=Iron Trapdoor
tile.trapdoor.iron.desc=Like a door, but flat and made of iron.
tile.trapdoor.glass.name=Glass Trapdoor
tile.trapdoor.glass.desc=Useless at its job.

tile.tnt.name=TNT
tile.tnt.desc=Goes off with a bang.

tile.door.planks.oak.bottom.name=Bottom Wooden Door
tile.door.planks.oak.bottom.desc=/give Honeydew 64 46
tile.door.planks.oak.top.name=Top Wooden Door
tile.door.planks.oak.top.desc=Oh, wait, that's not TNT, that's half a door.
tile.door.iron.bottom.name=Bottom Iron Door
tile.door.iron.bottom.desc=Not much good on its own.
tile.door.iron.top.name=Top Iron Door
tile.door.iron.top.desc=Could use a friend.

tile.mesh.name=Mesh Block
tile.mesh.desc=Allows items to pass through but nothing else.
tile.mesh.gold.name=Gold Mesh Block
tile.mesh.gold.desc=Allows a specified item to pass through but nothing else.

tile.bed.name=Bed
tile.bed.desc=Bed!
tile.seat.name=Seat
tile.seat.desc=Sit down and relax.

tile.cobweb.name=Cobweb
tile.cobweb.desc=Sticky silky strands woven by spiders.

tile.fire.name=Fire
tile.fire.desc=Ouch, fire hot!
tile.brazier.inactive.name=Brazier
tile.brazier.inactive.desc=A safe place to keep a fire.
tile.brazier.active.name=Lit Brazier
tile.brazier.active.desc=A safe place to keep a fire.

tile.mobspawner.name=Mob Spawner
tile.mobspawner.desc=A cage filled with horror.
tile.mobspawner.deactivated.name=Deactivated Mob Spawner
tile.mobspawner.deactivated.desc=A cage no longer filled with horror.

tile.workbench.name=Workbench
tile.workbench.desc=For bigger projects.

tile.furnace.stone.idle.name=Furnace
tile.furnace.stone.idle.desc=For melting, heating, and cooking blocks and items.
tile.furnace.stone.active.name=Lit Furnace
tile.furnace.stone.active.desc=For melting, heating, and cooking blocks and items.
tile.furnace.blast.idle.name=Blast Furnace
tile.furnace.blast.idle.desc=Burns hotter than a normal furnace.
tile.furnace.blast.active.name=Lit Blast Furnace
tile.furnace.blast.active.desc=Burns hotter than a normal furnace.

tile.trommel.idle.name=Trommel
tile.trommel.idle.desc=A machine that separates dirt from other useful items.
tile.trommel.active.name=Lit Trommel
tile.trommel.active.desc=A machine that separates dirt from other useful items.

tile.chest.planks.oak.name=Wooden Chest
tile.chest.planks.oak.desc=A place to store your items.
tile.chest.planks.oak.painted.name=Mystery Wooden Chest
tile.chest.planks.oak.painted.desc=How did you get this?!
tile.chest.planks.oak.painted.black.name=Black Wooden Chest
tile.chest.planks.oak.painted.black.desc=A place to store your items.
tile.chest.planks.oak.painted.red.name=Red Wooden Chest
tile.chest.planks.oak.painted.red.desc=A place to store your items.
tile.chest.planks.oak.painted.green.name=Green Wooden Chest
tile.chest.planks.oak.painted.green.desc=A place to store your items.
tile.chest.planks.oak.painted.brown.name=Brown Wooden Chest
tile.chest.planks.oak.painted.brown.desc=A place to store your items.
tile.chest.planks.oak.painted.blue.name=Blue Wooden Chest
tile.chest.planks.oak.painted.blue.desc=A place to store your items.
tile.chest.planks.oak.painted.purple.name=Purple Wooden Chest
tile.chest.planks.oak.painted.purple.desc=A place to store your items.
tile.chest.planks.oak.painted.cyan.name=Cyan Wooden Chest
tile.chest.planks.oak.painted.cyan.desc=A place to store your items.
tile.chest.planks.oak.painted.silver.name=Light Gray Wooden Chest
tile.chest.planks.oak.painted.silver.desc=A place to store your items.
tile.chest.planks.oak.painted.gray.name=Gray Wooden Chest
tile.chest.planks.oak.painted.gray.desc=A place to store your items.
tile.chest.planks.oak.painted.pink.name=Pink Wooden Chest
tile.chest.planks.oak.painted.pink.desc=A place to store your items.
tile.chest.planks.oak.painted.lime.name=Lime Wooden Chest
tile.chest.planks.oak.painted.lime.desc=A place to store your items.
tile.chest.planks.oak.painted.yellow.name=Yellow Wooden Chest
tile.chest.planks.oak.painted.yellow.desc=A place to store your items.
tile.chest.planks.oak.painted.lightblue.name=Light Blue Wooden Chest
tile.chest.planks.oak.painted.lightblue.desc=A place to store your items.
tile.chest.planks.oak.painted.magenta.name=Magenta Wooden Chest
tile.chest.planks.oak.painted.magenta.desc=A place to store your items.
tile.chest.planks.oak.painted.orange.name=Orange Wooden Chest
tile.chest.planks.oak.painted.orange.desc=A place to store your items.
tile.chest.planks.oak.painted.white.name=White Wooden Chest
tile.chest.planks.oak.painted.white.desc=A place to store your items.
tile.chest.legacy.name=Legacy Chest

tile.crops.wheat.name=Wheat Crops
tile.crops.wheat.desc=Wheat, plucked from the ground.
tile.crops.pumpkin.name=Pumpkin Crops
tile.crops.pumpkin.desc=A ripening pumpkin, plucked from the ground.

tile.farmland.dirt.name=Farmland
tile.farmland.dirt.desc=Tilled soil for growing crops.

tile.sign.post.planks.oak.name=Oak Signpost
tile.sign.post.planks.oak.desc=A free-standing oak sign.
tile.sign.wall.planks.oak.name=Oak Wall Sign
tile.sign.wall.planks.oak.desc=An oak sign placed on a wall.

tile.layer.snow.name=Snow Layer
tile.layer.snow.desc=A flat layer of snow.
tile.layer.leaves.oak.name=Leaf Pile
tile.layer.leaves.oak.desc=A pile of leaves.
tile.layer.slate.name=Slate Layer
tile.layer.slate.desc=A flat sheet of slate.

tile.ice.name=Ice
tile.ice.desc=Slippery frozen water.
tile.ice.perma.name=Perma-Ice
tile.ice.perma.desc=Ice imbued with the essence of stone.

tile.block.snow.name=Block of Snow
tile.block.snow.desc=Lots of snow compacted into a block.

tile.cactus.name=Cactus
tile.cactus.desc=A spiky plant that grows in the desert.

tile.block.clay.name=Block of Clay
tile.block.clay.desc=A block of compacted clay.

tile.sugarcane.name=Sugarcane
tile.sugarcane.desc=Not as sweet as you.

tile.block.sugarcane.name=Block of Sugarcane
tile.block.sugarcane.desc=One very big sugar cube.
tile.block.sugarcane.baked.name=Baked Block of Sugarcane
tile.block.sugarcane.baked.desc=Smells absolutely delicious.

tile.jukebox.name=Jukebox
tile.jukebox.desc=Plays your favourite tunes, assuming you have the right record.

tile.pumpkin.name=Pumpkin
tile.pumpkin.desc=An orange squash that grows in the wild.
tile.pumpkin.carved.idle.name=Carved Pumpkin
tile.pumpkin.carved.idle.desc=An orange squash with a spooky face.
tile.pumpkin.carved.active.name=Jack 'o' Lantern
tile.pumpkin.carved.active.desc=An orange squash with a spooky face, lit by a torch.

tile.netherrack.name=Netherrack
tile.netherrack.desc=Dark red rock that burns forever.
tile.netherrack.igneous.name=Igneous Netherrack
tile.netherrack.igneous.desc=Extreme heat has made this rock glow from inside.

tile.soulsand.name=Soul Sand
tile.soulsand.desc=Squishy brown sand that's tough to walk through.

tile.glowstone.name=Block of Glowstone
tile.glowstone.desc=Constantly emits a strong yellowish light.

tile.portal.nether.name=Nether Portal
tile.portal.nether.desc=A portal to the Nether.
tile.portal.paradise.name=Paradise Portal
tile.portal.paradise.desc=A portal to Paradise.

tile.cake.name=Cake
tile.cake.desc=I just can't cake it any more.
tile.pumpkin_pie.name=Pumpkin Pie
tile.pumpkin_pie.desc=I don't wanna pie!

tile.lamp.idle.name=Lamp
tile.lamp.idle.desc=How did you get this?!
tile.lamp.idle.black.name=Black Lamp
tile.lamp.idle.black.desc=A redstone lamp that can emit light. Tinted black.
tile.lamp.idle.red.name=Red Lamp
tile.lamp.idle.red.desc=A redstone lamp that can emit light. Tinted red.
tile.lamp.idle.green.name=Green Lamp
tile.lamp.idle.green.desc=A redstone lamp that can emit light. Tinted green.
tile.lamp.idle.brown.name=Brown Lamp
tile.lamp.idle.brown.desc=A redstone lamp that can emit light. Tinted brown.
tile.lamp.idle.blue.name=Blue Lamp
tile.lamp.idle.blue.desc=A redstone lamp that can emit light. Tinted blue.
tile.lamp.idle.purple.name=Purple Lamp
tile.lamp.idle.purple.desc=A redstone lamp that can emit light. Tinted purple.
tile.lamp.idle.cyan.name=Cyan Lamp
tile.lamp.idle.cyan.desc=A redstone lamp that can emit light. Tinted cyan.
tile.lamp.idle.silver.name=Light Gray Lamp
tile.lamp.idle.silver.desc=A redstone lamp that can emit light. Tinted light gray.
tile.lamp.idle.gray.name=Gray Lamp
tile.lamp.idle.gray.desc=A redstone lamp that can emit light. Tinted gray.
tile.lamp.idle.pink.name=Pink Lamp
tile.lamp.idle.pink.desc=A redstone lamp that can emit light. Tinted pink.
tile.lamp.idle.lime.name=Lime Lamp
tile.lamp.idle.lime.desc=A redstone lamp that can emit light. Tinted lime.
tile.lamp.idle.yellow.name=Yellow Lamp
tile.lamp.idle.yellow.desc=A redstone lamp that can emit light. Tinted yellow.
tile.lamp.idle.lightblue.name=Light Blue Lamp
tile.lamp.idle.lightblue.desc=A redstone lamp that can emit light. Tinted light blue.
tile.lamp.idle.magenta.name=Magenta Lamp
tile.lamp.idle.magenta.desc=A redstone lamp that can emit light. Tinted magenta.
tile.lamp.idle.orange.name=Orange Lamp
tile.lamp.idle.orange.desc=A redstone lamp that can emit light. Tinted orange.
tile.lamp.idle.white.name=White Lamp
tile.lamp.idle.white.desc=A redstone lamp that can emit light.

tile.lamp.active.name=Lit Lamp
tile.lamp.active.desc=How did you get this?!
tile.lamp.active.black.name=Lit Black Lamp
tile.lamp.active.black.desc=A redstone lamp that emits light. Tinted black.
tile.lamp.active.red.name=Lit Red Lamp
tile.lamp.active.red.desc=A redstone lamp that emits light. Tinted red.
tile.lamp.active.green.name=Lit Green Lamp
tile.lamp.active.green.desc=A redstone lamp that emits light. Tinted green.
tile.lamp.active.brown.name=Lit Brown Lamp
tile.lamp.active.brown.desc=A redstone lamp that emits light. Tinted brown.
tile.lamp.active.blue.name=Lit Blue Lamp
tile.lamp.active.blue.desc=A redstone lamp that emits light. Tinted blue.
tile.lamp.active.purple.name=Lit Purple Lamp
tile.lamp.active.purple.desc=A redstone lamp that emits light. Tinted purple.
tile.lamp.active.cyan.name=Lit Cyan Lamp
tile.lamp.active.cyan.desc=A redstone lamp that emits light. Tinted cyan.
tile.lamp.active.silver.name=Lit Light Gray Lamp
tile.lamp.active.silver.desc=A redstone lamp that emits light. Tinted light gray.
tile.lamp.active.gray.name=Lit Gray Lamp
tile.lamp.active.gray.desc=A redstone lamp that emits light. Tinted gray.
tile.lamp.active.pink.name=Lit Pink Lamp
tile.lamp.active.pink.desc=A redstone lamp that emits light. Tinted pink.
tile.lamp.active.lime.name=Lit Lime Lamp
tile.lamp.active.lime.desc=A redstone lamp that emits light. Tinted lime.
tile.lamp.active.yellow.name=Yellow Lamp
tile.lamp.active.yellow.desc=A redstone lamp that emits light. Tinted yellow.
tile.lamp.active.lightblue.name=Light Blue Lamp
tile.lamp.active.lightblue.desc=A redstone lamp that emits light. Tinted light blue.
tile.lamp.active.magenta.name=Magenta Lamp
tile.lamp.active.magenta.desc=A redstone lamp that emits light. Tinted magenta.
tile.lamp.active.orange.name=Orange Lamp
tile.lamp.active.orange.desc=A redstone lamp that emits light. Tinted orange.
tile.lamp.active.white.name=White Lamp
tile.lamp.active.white.desc=A redstone lamp that emits light.

tile.stone.polished.name=Polished Stone
tile.stone.polished.desc=A polished block of stone.
tile.granite.polished.name=Polished Granite
tile.granite.polished.desc=A polished block of granite.
tile.limestone.polished.name=Polished Limestone
tile.limestone.polished.desc=A polished block of limestone.
tile.basalt.polished.name=Polished Basalt
tile.basalt.polished.desc=A polished block of basalt.
tile.slate.polished.name=Polished Slate
tile.slate.polished.desc=A polished block of slate.

tile.candle.wax.soul.name=Soul Wax Candle
tile.candle.wax.soul.desc=A waxy brown candle that glows with an unnatural light.

tile.basket.name=Basket
tile.basket.desc=A wicker container for holding items.

tile.overlay.pebbles.name=Pebbles
tile.overlay.pebbles.desc=A cluster of pebbles.

tile.fence.chainlink.name=Chainlink Fence
tile.fence.chainlink.desc=A fence made of interconnected chain links. Can be climbed!
tile.fence.paper_wall.name=Paper Wall Fence
tile.fence.paper_wall.desc=A fence made of delicate paper. Be careful!

tile.lantern.firefly.green.name=Green Firefly Lantern
tile.lantern.firefly.green.desc=A glass jar containing a swarm of green fireflies.
tile.lantern.firefly.orange.name=Orange Firefly Lantern
tile.lantern.firefly.orange.desc=A glass jar containing a swarm of orange fireflies.
tile.lantern.firefly.blue.name=Blue Firefly Lantern
tile.lantern.firefly.blue.desc=A glass jar containing a swarm of blue fireflies.
tile.lantern.firefly.red.name=Red Firefly Lantern
tile.lantern.firefly.red.desc=A glass jar containing a swarm of red fireflies.

tile.flag.name=Flag
tile.flag.desc=A flag to mark your territory.

tile.paper_wall.name=Paper Wall
tile.paper_wall.desc=A wall made of delicate paper. Be careful!

tile.trapdoor.planks.oak.painted.name=Painted Trapdoor
tile.trapdoor.planks.oak.painted.desc=How did you get this?!
tile.trapdoor.planks.oak.painted.black.name=Black Oak Trapdoor
tile.trapdoor.planks.oak.painted.black.desc=Like a door, but flat and painted black.
tile.trapdoor.planks.oak.painted.red.name=Red Oak Trapdoor
tile.trapdoor.planks.oak.painted.red.desc=Like a door, but flat and painted red.
tile.trapdoor.planks.oak.painted.green.name=Green Oak Trapdoor
tile.trapdoor.planks.oak.painted.green.desc=Like a door, but flat and painted green.
tile.trapdoor.planks.oak.painted.brown.name=Brown Oak Trapdoor
tile.trapdoor.planks.oak.painted.brown.desc=Like a door, but flat and painted brown.
tile.trapdoor.planks.oak.painted.blue.name=Blue Oak Trapdoor
tile.trapdoor.planks.oak.painted.blue.desc=Like a door, but flat and painted blue.
tile.trapdoor.planks.oak.painted.purple.name=Purple Oak Trapdoor
tile.trapdoor.planks.oak.painted.purple.desc=Like a door, but flat and painted purple.
tile.trapdoor.planks.oak.painted.cyan.name=Cyan Oak Trapdoor
tile.trapdoor.planks.oak.painted.cyan.desc=Like a door, but flat and painted cyan.
tile.trapdoor.planks.oak.painted.silver.name=Light Gray Oak Trapdoor
tile.trapdoor.planks.oak.painted.silver.desc=Like a door, but flat and painted light gray.
tile.trapdoor.planks.oak.painted.gray.name=Gray Oak Trapdoor
tile.trapdoor.planks.oak.painted.gray.desc=Like a door, but flat and painted gray.
tile.trapdoor.planks.oak.painted.pink.name=Pink Oak Trapdoor
tile.trapdoor.planks.oak.painted.pink.desc=Like a door, but flat and painted pink.
tile.trapdoor.planks.oak.painted.lime.name=Lime Oak Trapdoor
tile.trapdoor.planks.oak.painted.lime.desc=Like a door, but flat and painted lime.
tile.trapdoor.planks.oak.painted.yellow.name=Yellow Oak Trapdoor
tile.trapdoor.planks.oak.painted.yellow.desc=Like a door, but flat and painted yellow.
tile.trapdoor.planks.oak.painted.lightblue.name=Light Blue Oak Trapdoor
tile.trapdoor.planks.oak.painted.lightblue.desc=Like a door, but flat and painted light blue.
tile.trapdoor.planks.oak.painted.magenta.name=Magenta Oak Trapdoor
tile.trapdoor.planks.oak.painted.magenta.desc=Like a door, but flat and painted magenta.
tile.trapdoor.planks.oak.painted.orange.name=Orange Oak Trapdoor
tile.trapdoor.planks.oak.painted.orange.desc=Like a door, but flat and painted orange.
tile.trapdoor.planks.oak.painted.white.name=White Oak Trapdoor
tile.trapdoor.planks.oak.painted.white.desc=Like a door, but flat and painted white.

tile.door.planks.oak.painted.bottom.name=Bottom Painted Wooden Door
tile.door.planks.oak.painted.bottom.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.black.name=Black Bottom Wooden Door
tile.door.planks.oak.painted.bottom.black.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.red.name=Red Bottom Wooden Door
tile.door.planks.oak.painted.bottom.red.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.green.name=Green Bottom Wooden Door
tile.door.planks.oak.painted.bottom.green.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.brown.name=Brown Bottom Wooden Door
tile.door.planks.oak.painted.bottom.brown.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.blue.name=Blue Bottom Wooden Door
tile.door.planks.oak.painted.bottom.blue.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.purple.name=Purple Bottom Wooden Door
tile.door.planks.oak.painted.bottom.purple.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.cyan.name=Cyan Bottom Wooden Door
tile.door.planks.oak.painted.bottom.cyan.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.silver.name=Light Gray Bottom Wooden Door
tile.door.planks.oak.painted.bottom.silver.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.gray.name=Gray Bottom Wooden Door
tile.door.planks.oak.painted.bottom.gray.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.pink.name=Pink Bottom Wooden Door
tile.door.planks.oak.painted.bottom.pink.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.lime.name=Lime Bottom Wooden Door
tile.door.planks.oak.painted.bottom.lime.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.yellow.name=Yellow Bottom Wooden Door
tile.door.planks.oak.painted.bottom.yellow.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.lightblue.name=Light Blue Bottom Wooden Door
tile.door.planks.oak.painted.bottom.lightblue.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.magenta.name=Magenta Bottom Wooden Door
tile.door.planks.oak.painted.bottom.magenta.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.orange.name=Orange Bottom Wooden Door
tile.door.planks.oak.painted.bottom.orange.desc=How did you get this?!
tile.door.planks.oak.painted.bottom.white.name=White Bottom Wooden Door
tile.door.planks.oak.painted.bottom.white.desc=How did you get this?!

tile.door.planks.oak.painted.top.name=Top Painted Wooden Door
tile.door.planks.oak.painted.top.desc=How did you get this?!
tile.door.planks.oak.painted.top.black.name=Black Top Wooden Door
tile.door.planks.oak.painted.top.black.desc=How did you get this?!
tile.door.planks.oak.painted.top.red.name=Red Top Wooden Door
tile.door.planks.oak.painted.top.red.desc=How did you get this?!
tile.door.planks.oak.painted.top.green.name=Green Top Wooden Door
tile.door.planks.oak.painted.top.green.desc=How did you get this?!
tile.door.planks.oak.painted.top.brown.name=Brown Top Wooden Door
tile.door.planks.oak.painted.top.brown.desc=How did you get this?!
tile.door.planks.oak.painted.top.blue.name=Blue Top Wooden Door
tile.door.planks.oak.painted.top.blue.desc=How did you get this?!
tile.door.planks.oak.painted.top.purple.name=Purple Top Wooden Door
tile.door.planks.oak.painted.top.purple.desc=How did you get this?!
tile.door.planks.oak.painted.top.cyan.name=Cyan Top Wooden Door
tile.door.planks.oak.painted.top.cyan.desc=How did you get this?!
tile.door.planks.oak.painted.top.silver.name=Light Gray Top Wooden Door
tile.door.planks.oak.painted.top.silver.desc=How did you get this?!
tile.door.planks.oak.painted.top.gray.name=Gray Top Wooden Door
tile.door.planks.oak.painted.top.gray.desc=How did you get this?!
tile.door.planks.oak.painted.top.pink.name=Pink Top Wooden Door
tile.door.planks.oak.painted.top.pink.desc=How did you get this?!
tile.door.planks.oak.painted.top.lime.name=Lime Top Wooden Door
tile.door.planks.oak.painted.top.lime.desc=How did you get this?!
tile.door.planks.oak.painted.top.yellow.name=Yellow Top Wooden Door
tile.door.planks.oak.painted.top.yellow.desc=How did you get this?!
tile.door.planks.oak.painted.top.lightblue.name=Light Blue Top Wooden Door
tile.door.planks.oak.painted.top.lightblue.desc=How did you get this?!
tile.door.planks.oak.painted.top.magenta.name=Magenta Top Wooden Door
tile.door.planks.oak.painted.top.magenta.desc=How did you get this?!
tile.door.planks.oak.painted.top.orange.name=Orange Top Wooden Door
tile.door.planks.oak.painted.top.orange.desc=How did you get this?!
tile.door.planks.oak.painted.top.white.name=White Top Wooden Door
tile.door.planks.oak.painted.top.white.desc=How did you get this?!

tile.door.glass.top.name=Glass Top Door
tile.door.glass.top.desc=You shouldn't be seeing this.
tile.door.glass.bottom.name=Glass Bottom Door
tile.door.glass.bottom.desc=And that's not just because it's glass.

tile.rope.name=Rope
tile.rope.desc=Rope, rope, rope your boat.
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/Minecraft.java b/src/main/java/net/minecraft/client/Minecraft.java
index d32b21f04..0a9b3b1bb 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -60,6 +60,7 @@ import net.minecraft.client.net.thread.ThreadSleepForeverClient;
 import net.minecraft.client.option.GameSettings;
 import net.minecraft.client.option.InputDevice;
 import net.minecraft.client.option.KeyBinding;
+import net.minecraft.client.option.enums.LightmapStyle;
 import net.minecraft.client.player.controller.PlayerController;
 import net.minecraft.client.render.ChunkRenderer;
 import net.minecraft.client.render.EffectRenderer;
@@ -102,6 +103,7 @@ import net.minecraft.core.UnexpectedThrowable;
 import net.minecraft.core.achievement.AchievementList;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.achievement.stat.StatsCounter;
+import net.minecraft.core.block.BlockLeavesBase;
 import net.minecraft.core.crafting.legacy.CraftingManager;
 import net.minecraft.core.data.DataLoader;
 import net.minecraft.core.data.registry.Registries;
@@ -818,6 +820,7 @@ public class Minecraft
                     OpenGLHelper.checkError("pre render");
                     RenderBlocks.fancyGrass = gameSettings.fancyGraphics.value == 1;
                     EntityItem.enableItemClumping = gameSettings.enableItemClumping.value;
+                    BlockLeavesBase.enableTreeShadowing = gameSettings.treeShadows.value;
                     sndManager.updateListenerPosition(thePlayer, timer.partialTicks);
                     glEnable(GL_TEXTURE_2D);
                     if(theWorld != null)
@@ -1325,6 +1328,7 @@ public class Minecraft
                                 ingameGUI.addChatMessage("F3 + F: Toggle fullbright");
                                 ingameGUI.addChatMessage("F3 + G: Show chunk borders");
                                 ingameGUI.addChatMessage("F3 + H: Toggle item durability");
+                                ingameGUI.addChatMessage("F3 + L: Toggle lightmap");
                                 ingameGUI.addChatMessage("F3 + N: Switch gamemode");
                                 ingameGUI.addChatMessage("F3 + P: Toggle pause on lost focus");
                                 ingameGUI.addChatMessage("F3 + R: Reload");
@@ -1381,6 +1385,18 @@ public class Minecraft
                                 }
                                 ingameGUI.guiHeldItemTooltip.setString("Fullbright: " + (fullbright ? "On" : "Off"));
                             }
+                            else if (Keyboard.getEventKey() == Keyboard.KEY_L)
+                            {
+                            	if(gameSettings.lightmapStyle.value == LightmapStyle.DISABLED) {
+                            		gameSettings.lightmapStyle.value = LightmapStyle.DEFAULT;
+                            		ingameGUI.guiHeldItemTooltip.setString("Lightmap: On");
+                            		renderGlobal.loadRenderers();
+                            	}else {
+                            		gameSettings.lightmapStyle.value = LightmapStyle.DISABLED;
+                            		ingameGUI.guiHeldItemTooltip.setString("Lightmap: Off");
+                            		renderGlobal.loadRenderers();
+                            	}
+                            }
                             else if (Keyboard.getEventKey() == Keyboard.KEY_B)
                             {
                             	gameSettings.showCollisionBoxes.toggle();
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityDiggingFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityDiggingFX.java
index e88af6d34..009811c7b 100644
--- a/src/main/java/net/minecraft/client/entity/fx/EntityDiggingFX.java
+++ b/src/main/java/net/minecraft/client/entity/fx/EntityDiggingFX.java
@@ -1,5 +1,7 @@
 package net.minecraft.client.entity.fx;
 
+import net.minecraft.client.render.LightmapHelper;
+
 // Referenced classes of package net.minecraft.src:
 //            EntityFX, Block, TessellatorStandard, World
 
@@ -57,8 +59,13 @@ public class EntityDiggingFX extends EntityFX
         float f11 = (float)((xo + (x - xo) * (double) partialTick) - lerpPosX);
         float f12 = (float)((yo + (y - yo) * (double) partialTick) - lerpPosY);
         float f13 = (float)((zo + (z - zo) * (double) partialTick) - lerpPosZ);
-        float f14 = getBrightness(partialTick);
-        t.setColorOpaque_F(f14 * particleRed, f14 * particleGreen, f14 * particleBlue);
+        float brightness = 1.0f;
+        if(LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        }else {
+        	brightness = getBrightness(partialTick);
+        }
+        t.setColorOpaque_F(brightness * particleRed, brightness * particleGreen, brightness * particleBlue);
         t.addVertexWithUV(f11 - rotationX * f10 - rotationYZ * f10, f12 - rotationXZ * f10, f13 - rotationZ * f10 - rotationXY * f10, f6, f9);
         t.addVertexWithUV((f11 - rotationX * f10) + rotationYZ * f10, f12 + rotationXZ * f10, (f13 - rotationZ * f10) + rotationXY * f10, f6, f8);
         t.addVertexWithUV(f11 + rotationX * f10 + rotationYZ * f10, f12 + rotationXZ * f10, f13 + rotationZ * f10 + rotationXY * f10, f7, f8);
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityFX.java
index a2a923c92..8e1a36204 100644
--- a/src/main/java/net/minecraft/client/entity/fx/EntityFX.java
+++ b/src/main/java/net/minecraft/client/entity/fx/EntityFX.java
@@ -1,6 +1,7 @@
 package net.minecraft.client.entity.fx;
 
 import net.minecraft.client.render.tessalator.Tessellator;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.util.helper.MathHelper;
@@ -106,7 +107,12 @@ public class EntityFX extends Entity
         float posX = (float)((xo + (this.x - xo) * (double)partialTick) - lerpPosX);
         float posY = (float)((yo + (this.y - yo) * (double)partialTick) - lerpPosY);
         float posZ = (float)((zo + (this.z - zo) * (double)partialTick) - lerpPosZ);
-        float brightness = getBrightness(partialTick);
+        float brightness = 1.0f;
+        if(LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        }else {
+        	brightness = getBrightness(partialTick);
+        }
         t.setColorOpaque_F(particleRed * brightness, particleGreen * brightness, particleBlue * brightness);
         t.addVertexWithUV(posX - rotationX * scale - rotationYZ * scale, posY - rotationXZ * scale, posZ - rotationZ * scale - rotationXY * scale, texMaxU, texMaxV);
         t.addVertexWithUV((posX - rotationX * scale) + rotationYZ * scale, posY + rotationXZ * scale, (posZ - rotationZ * scale) + rotationXY * scale, texMaxU, texMinV);
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityFireflyFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityFireflyFX.java
index b3a6d57b9..d774fde68 100644
--- a/src/main/java/net/minecraft/client/entity/fx/EntityFireflyFX.java
+++ b/src/main/java/net/minecraft/client/entity/fx/EntityFireflyFX.java
@@ -2,6 +2,7 @@ package net.minecraft.client.entity.fx;
 
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.tessalator.TessellatorStandard;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.core.entity.animal.EntityFireflyCluster;
 import net.minecraft.core.util.helper.MathHelper;
@@ -124,13 +125,23 @@ public class EntityFireflyFX extends EntityFX
         float scale = 0.1F * particleScale;
         float posX = (float)(xo + (x - xo) * partialTick);
         float posY = (float)(yo + (y - yo) * partialTick);
-        float brightness = getBrightness(partialTick);
+        float brightness = 1.0f;
+        if(LightmapHelper.isLightmapEnabled()) {
+        	t.setLightmapCoord(getLightmapCoord(partialTick));
+        }else {
+        	brightness = getBrightness(partialTick);
+        }
         t.setColorOpaque_F(particleRed * brightness, particleGreen * brightness, particleBlue * brightness);
         t.addVertexWithUV(posX + scale, posY - scale, 0, texMaxU, texMaxV);
         t.addVertexWithUV(posX + scale, posY + scale, 0, texMaxU, texMinV);
         t.addVertexWithUV(posX - scale, posY + scale, 0, texMinU, texMinV);
         t.addVertexWithUV(posX - scale, posY - scale, 0, texMinU, texMaxV);
     }
+    
+    @Override
+    public int getLightmapCoord(float partialTicks) {
+    	return LightmapHelper.setBlocklightValue(super.getLightmapCoord(partialTicks), 15);
+    }
 
     public void tickGUI() {
         sinTimer++;
diff --git a/src/main/java/net/minecraft/client/entity/fx/EntityFlameFX.java b/src/main/java/net/minecraft/client/entity/fx/EntityFlameFX.java
index 015131549..76c45f27e 100644
--- a/src/main/java/net/minecraft/client/entity/fx/EntityFlameFX.java
+++ b/src/main/java/net/minecraft/client/entity/fx/EntityFlameFX.java
@@ -4,6 +4,7 @@ package net.minecraft.client.entity.fx;
 //            EntityFX, World, TessellatorStandard
 
 import net.minecraft.client.render.tessalator.Tessellator;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.core.util.helper.MathHelper;
@@ -43,6 +44,11 @@ public class EntityFlameFX extends EntityFX
         float decay = MathHelper.clamp(((float)particleAge + partialTick) / (float)particleMaxAge, 0.0f, 1.0f);
         return super.getBrightness(partialTick) * decay + (1.0F - decay);
     }
+    
+    @Override
+    public int getLightmapCoord(float partialTicks) {
+    	return LightmapHelper.setBlocklightValue(super.getLightmapCoord(partialTicks), 15);
+    }
 
     @Override
 	public void tick()
diff --git a/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java b/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java
index 45824e61c..669b12bd4 100644
--- a/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java
+++ b/src/main/java/net/minecraft/client/entity/player/EntityPlayerSP.java
@@ -16,6 +16,7 @@ import net.minecraft.client.gui.GuiFurnace;
 import net.minecraft.client.gui.GuiPaintingPicker;
 import net.minecraft.client.gui.GuiPickMonster;
 import net.minecraft.client.gui.GuiTrommel;
+import net.minecraft.client.gui.GuiWandPickerMonster;
 import net.minecraft.client.input.PlayerInput;
 import net.minecraft.core.achievement.Achievement;
 import net.minecraft.core.achievement.AchievementList;
@@ -229,9 +230,9 @@ public class EntityPlayerSP extends EntityPlayer
         }
         super.onLivingUpdate();
 
-        if (Minecraft.getMinecraft(this) != null)
+        if (mc != null)
         {
-            Minecraft.getMinecraft(this).ppm.update();
+           mc.ppm.update();
         }
     }
     
@@ -303,6 +304,11 @@ public class EntityPlayerSP extends EntityPlayer
         String currentMobId = ((TileEntityMobSpawner) world.getBlockTileEntity(x, y, z)).getMobId();
         mc.displayGuiScreen(new GuiPickMonster(currentMobId, x, y, z));
     }
+    @Override
+    public void displayGUIWandMonsterPicker(ItemStack stack) {
+        String currentMobId = stack.getData().getStringOrDefault("monster", "Pig");
+        mc.displayGuiScreen(new GuiWandPickerMonster(currentMobId, stack));
+    }
 
     @Override
     public void displayGUIFurnace(TileEntityFurnace tileentityfurnace)
diff --git a/src/main/java/net/minecraft/client/gui/GuiIngameMenu.java b/src/main/java/net/minecraft/client/gui/GuiIngameMenu.java
index 5fd8099c4..8c6f53089 100644
--- a/src/main/java/net/minecraft/client/gui/GuiIngameMenu.java
+++ b/src/main/java/net/minecraft/client/gui/GuiIngameMenu.java
@@ -108,7 +108,7 @@ public class GuiIngameMenu extends GuiScreen
         I18n i = I18n.getInstance();
         drawDefaultBackground();
         if(mc == null || mc.theWorld == null) {
-        	Minecraft.getMinecraft(this).displayGuiScreen(null);
+        	mc.displayGuiScreen(null);
         	return;
         }
         boolean isSaving = !mc.theWorld.pauseScreenSave(updateCounter2++);
diff --git a/src/main/java/net/minecraft/client/gui/GuiWandPickerMonster.java b/src/main/java/net/minecraft/client/gui/GuiWandPickerMonster.java
new file mode 100644
index 000000000..93585cd1a
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/GuiWandPickerMonster.java
@@ -0,0 +1,80 @@
+package net.minecraft.client.gui;
+
+import net.minecraft.client.gui.popup.GuiPopup;
+import net.minecraft.client.gui.popup.PopupBuilder;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityDispatcher;
+import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.net.packet.Packet250CustomPayload;
+
+import java.lang.reflect.Modifier;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class GuiWandPickerMonster extends GuiScreen {
+    private String mobId;
+    private boolean shouldClose = false;
+    private final ItemStack wand;
+
+
+    public GuiWandPickerMonster(String mobId, ItemStack itemStack) {
+        this.mobId = mobId;
+        wand = itemStack;
+    }
+
+    @Override
+    public void init() {
+        List<String> monsters = new ArrayList<>();
+        for (Class<? extends Entity> clazz : EntityDispatcher.classToKeyMap.keySet()) {
+            if (EntityLiving.class.isAssignableFrom(clazz) && !Modifier.isAbstract(clazz.getModifiers())) {
+                monsters.add(EntityDispatcher.classToKeyMap.get(clazz));
+            }
+        }
+        Collections.sort(monsters);
+        List<String> prettyMonsters = new ArrayList<>();
+        for (String monster : monsters) {
+            StringBuilder sb = new StringBuilder();
+            for (char c : monster.toCharArray()) {
+                if (Character.isUpperCase(c)) {
+                    sb.append(' ');
+                }
+                sb.append(c);
+            }
+            prettyMonsters.add(sb.toString());
+        }
+
+        GuiPopup popup = new PopupBuilder(this, 150)
+                .withLabel("gui.pick_monster.label.title")
+                .withList("list", 140, prettyMonsters.toArray(new String[0]), null, -1, true)
+                .closeOnEsc(0)
+                .closeOnClickOut(0)
+                .withOnCloseListener((statusCode, results) -> {
+                    if (statusCode == 1) {
+                        mobId = monsters.get((Integer) results.get("list"));
+                        if (!mc.theWorld.isClientSide) {
+                            wand.getData().putString("monster", mobId);
+                        } else {
+                            mc.getSendQueue().addToSendQueue(new Packet250CustomPayload("BTA|WandMonster", mobId.getBytes(StandardCharsets.UTF_8)));
+                        }
+                    }
+                    shouldClose = true;
+                })
+                .build();
+        mc.displayGuiScreen(popup);
+    }
+
+    @Override
+    public void tick() {
+        super.tick();
+        if (shouldClose) {
+            mc.displayGuiScreen(null);
+        }
+    }
+
+    public String getMobId() {
+        return mobId;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobPage.java b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobPage.java
index 86d19359f..7765d0baa 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobPage.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobPage.java
@@ -251,8 +251,6 @@ public class MobPage
 
         float heightFactor = 50f / 1.8f;
 
-        Minecraft mc = Minecraft.getMinecraft(this);
-
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
 
         Scissor.enable(x + 9, y + 9, 52, 70);
diff --git a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobSection.java b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobSection.java
index bd567155b..c0f43b63f 100644
--- a/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobSection.java
+++ b/src/main/java/net/minecraft/client/gui/guidebook/mobs/MobSection.java
@@ -87,8 +87,9 @@ public class MobSection
 
         @Override
         public String getName() {
-            boolean discovered = Minecraft.getMinecraft(this).statsCounter.readStat(StatList.mobEncounterStats.get(EntityDispatcher.classToKeyMap.get(mobInfo.getEntityClass()))) > 0;
-            if (Minecraft.getMinecraft(this).thePlayer.getGamemode() == Gamemode.creative) discovered = true;
+        	Minecraft mc = Minecraft.getMinecraft(this);
+            boolean discovered = mc.statsCounter.readStat(StatList.mobEncounterStats.get(EntityDispatcher.classToKeyMap.get(mobInfo.getEntityClass()))) > 0;
+            if (mc.thePlayer.getGamemode() == Gamemode.creative) discovered = true;
 
             if (discovered) {
                 return I18n.getInstance().translateKey(mobInfo.getNameTranslationKey());
diff --git a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/DispatcherEntry.java b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/DispatcherEntry.java
index 1551922d5..f0ac1a7cf 100644
--- a/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/DispatcherEntry.java
+++ b/src/main/java/net/minecraft/client/gui/modelviewer/categories/entries/entity/DispatcherEntry.java
@@ -26,7 +26,7 @@ public class DispatcherEntry extends EntityEntry<Entity> {
 
     @Override
     public Entity getEntityInstance(Minecraft mc, World world) {
-        return EntityDispatcher.createEntityInWorld(id, Minecraft.getMinecraft(this).theWorld);
+        return EntityDispatcher.createEntityInWorld(id, mc.theWorld);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/client/gui/options/components/LanguagePackListComponent.java b/src/main/java/net/minecraft/client/gui/options/components/LanguagePackListComponent.java
index f009d8cd9..a651ccf00 100644
--- a/src/main/java/net/minecraft/client/gui/options/components/LanguagePackListComponent.java
+++ b/src/main/java/net/minecraft/client/gui/options/components/LanguagePackListComponent.java
@@ -83,6 +83,7 @@ public class LanguagePackListComponent
     }
 
     private static class LanguagePackComponent {
+    	private Minecraft mc = Minecraft.getMinecraft(this);
         public final int index;
         public final Language languagePack;
         public final int height = BUTTON_HEIGHT;
@@ -93,7 +94,7 @@ public class LanguagePackListComponent
         }
 
         public void render(int x, int y, int width, int mouseX, int mouseY) {
-            FontRenderer textRenderer = Minecraft.getMinecraft(this).fontRenderer;
+            FontRenderer textRenderer = mc.fontRenderer;
             TessellatorStandard tessellator = TessellatorStandard.instance;
 
             if (mc.gameSettings.language.value.equals(languagePack.getId())) {
diff --git a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
index 8bf33c70c..78835f997 100644
--- a/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
+++ b/src/main/java/net/minecraft/client/gui/options/data/OptionsPages.java
@@ -92,6 +92,7 @@ public abstract class OptionsPages
         )
         .withComponent(new OptionsCategory("gui.options.page.video.category.visuals")
             .withComponent(new ToggleableOptionComponent<>(mc.gameSettings.lightmapStyle))
+            .withComponent(new FloatOptionComponent(mc.gameSettings.brightness))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.fog))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.biomeWater))
             .withComponent(new BooleanOptionComponent(mc.gameSettings.treeShadows))
diff --git a/src/main/java/net/minecraft/client/option/GameSettings.java b/src/main/java/net/minecraft/client/option/GameSettings.java
index e88aace56..01be9a240 100644
--- a/src/main/java/net/minecraft/client/option/GameSettings.java
+++ b/src/main/java/net/minecraft/client/option/GameSettings.java
@@ -47,6 +47,7 @@ public class GameSettings {
 	public FloatOption mouseSensitivity = new FloatOption(this, "mouseSensitivity", 0.5f);
 	public FloatOption screenPadding = new FloatOption(this, "screenPadding", 0.0f);
 	public FloatOption gamma = new FloatOption(this, "gamma", 0.5f);
+	public FloatOption brightness = new FloatOption(this, "brightness", 0.5f);
 
 	public FloatOption fxaa = new FloatOption(this, "fxaa", 0.0f);
 	public FloatOption controllerSensitivity = new FloatOption(this, "controllerSensitivity", 0.5f);
@@ -238,47 +239,59 @@ public class GameSettings {
 			return trans.translateKey("options.borderlessFullscreen.unavailable");
 		}
 		if (option instanceof FloatOption) {
-			Float f = (Float) option.value;
+			float value = (float) option.value;
+			if (option == brightness) {
+				int percent = (int)(value * 200.0f);
+				if (percent == 0) {
+					return trans.translateKey("options.brightness.min");
+				}else if (percent == 100) {
+					return trans.translateKey("options.brightness.default");
+				}else if (percent == 200) {
+					return trans.translateKey("options.brightness.max");
+				}else {
+					return percent + "%";
+				}
+			}
 			if (option == mouseSensitivity) {
-				if (f == 0.0F) {
+				if (value == 0.0F) {
 					return trans.translateKey("options.mouseSensitivity.min");
 				}
-				if (f == 1.0F) {
+				if (value == 1.0F) {
 					return trans.translateKey("options.mouseSensitivity.max");
 				} else {
-					return (int) (f * 200F) + "%";
+					return (int) (value * 200F) + "%";
 				}
 			}
 			if (option == FoV) {
-				if (f == 0) {
+				if (value == 0) {
 					return trans.translateKey("options.fov.min");
 				}
-				if (f == 1) {
+				if (value == 1) {
 					return trans.translateKey("options.fov.max");
 				} else {
-					return (int) (f * 100 + 30) + "°";
+					return (int) (value * 100 + 30) + "°";
 				}
 			}
 			if (option == screenPadding) {
-				int percent = (int) (f * 100);
+				int percent = (int) (value * 100);
 				return percent + "%";
 			}
 			if (option == gamma) {
-				int percent = (int) (f * 200);
+				int percent = (int) (value * 200);
 				return percent + "%";
 			}
 			if (option == autosaveTimer) {
-				int timer = (int) (f * 24);
+				int timer = (int) (value * 24);
 				if (timer == 0) {
 					return trans.translateKey("options.autosaveTimer.off");
 				} else {
 					return (timer * 5) + " seconds";
 				}
 			}
-			if (f == 0.0F) {
+			if (value == 0.0F) {
 				return trans.translateKey("options.off");
 			} else {
-				return (int) (f * 100F) + "%";
+				return (int) (value * 100F) + "%";
 			}
 		}
 		if (option == guiScale) {
diff --git a/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java b/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
index 03c85818c..f9acfa263 100644
--- a/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/EntityRenderDispatcher.java
@@ -1,23 +1,95 @@
 package net.minecraft.client.render;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
 
-import net.minecraft.client.Minecraft;
+import org.lwjgl.opengl.GL11;
+
+import net.minecraft.client.option.GameSettings;
 import net.minecraft.client.render.camera.ICamera;
-import net.minecraft.client.render.entity.*;
-import net.minecraft.client.render.model.*;
+import net.minecraft.client.render.entity.ArmoredZombieRenderer;
+import net.minecraft.client.render.entity.ArrowRenderer;
+import net.minecraft.client.render.entity.BoatRenderer;
+import net.minecraft.client.render.entity.BobberRenderer;
+import net.minecraft.client.render.entity.CannonballRenderer;
+import net.minecraft.client.render.entity.ChickenRenderer;
+import net.minecraft.client.render.entity.CowRenderer;
+import net.minecraft.client.render.entity.CreeperRenderer;
+import net.minecraft.client.render.entity.DefaultRenderer;
+import net.minecraft.client.render.entity.EntityRenderer;
+import net.minecraft.client.render.entity.FallingSandRenderer;
+import net.minecraft.client.render.entity.FireballRenderer;
+import net.minecraft.client.render.entity.FireflyRenderer;
+import net.minecraft.client.render.entity.GhastRenderer;
+import net.minecraft.client.render.entity.GiantRenderer;
+import net.minecraft.client.render.entity.ItemEntityRenderer;
+import net.minecraft.client.render.entity.LightningBoltRenderer;
+import net.minecraft.client.render.entity.LivingRenderer;
+import net.minecraft.client.render.entity.MinecartRenderer;
+import net.minecraft.client.render.entity.MobRenderer;
+import net.minecraft.client.render.entity.MonsterRenderer;
+import net.minecraft.client.render.entity.PaintingRenderer;
+import net.minecraft.client.render.entity.PigRenderer;
+import net.minecraft.client.render.entity.PlayerRenderer;
+import net.minecraft.client.render.entity.ScorpionRenderer;
+import net.minecraft.client.render.entity.SheepRenderer;
+import net.minecraft.client.render.entity.SlimeRenderer;
+import net.minecraft.client.render.entity.SnowballRenderer;
+import net.minecraft.client.render.entity.SpiderRenderer;
+import net.minecraft.client.render.entity.SquidRenderer;
+import net.minecraft.client.render.entity.TNTRenderer;
+import net.minecraft.client.render.entity.WolfRenderer;
+import net.minecraft.client.render.model.ModelBiped;
+import net.minecraft.client.render.model.ModelChicken;
+import net.minecraft.client.render.model.ModelCow;
+import net.minecraft.client.render.model.ModelPig;
+import net.minecraft.client.render.model.ModelSheep;
+import net.minecraft.client.render.model.ModelSheepOverlay;
+import net.minecraft.client.render.model.ModelSheepWool;
+import net.minecraft.client.render.model.ModelSkeleton;
+import net.minecraft.client.render.model.ModelSlime;
+import net.minecraft.client.render.model.ModelSquid;
+import net.minecraft.client.render.model.ModelWolf;
+import net.minecraft.client.render.model.ModelZombie;
 import net.minecraft.client.render.tessalator.Tessellator;
-import net.minecraft.core.entity.*;
-import net.minecraft.core.entity.animal.*;
-import net.minecraft.core.entity.monster.*;
+import net.minecraft.core.Global;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityBobber;
+import net.minecraft.core.entity.EntityFallingSand;
+import net.minecraft.core.entity.EntityItem;
+import net.minecraft.core.entity.EntityLightningBolt;
+import net.minecraft.core.entity.EntityLiving;
+import net.minecraft.core.entity.EntityPainting;
+import net.minecraft.core.entity.EntityTNT;
+import net.minecraft.core.entity.animal.EntityChicken;
+import net.minecraft.core.entity.animal.EntityCow;
+import net.minecraft.core.entity.animal.EntityFireflyCluster;
+import net.minecraft.core.entity.animal.EntityPig;
+import net.minecraft.core.entity.animal.EntitySheep;
+import net.minecraft.core.entity.animal.EntitySquid;
+import net.minecraft.core.entity.animal.EntityWolf;
+import net.minecraft.core.entity.monster.EntityArmoredZombie;
+import net.minecraft.core.entity.monster.EntityCreeper;
+import net.minecraft.core.entity.monster.EntityGhast;
+import net.minecraft.core.entity.monster.EntityGiant;
+import net.minecraft.core.entity.monster.EntityHuman;
+import net.minecraft.core.entity.monster.EntityScorpion;
+import net.minecraft.core.entity.monster.EntitySkeleton;
+import net.minecraft.core.entity.monster.EntitySlime;
+import net.minecraft.core.entity.monster.EntitySnowman;
+import net.minecraft.core.entity.monster.EntitySpider;
+import net.minecraft.core.entity.monster.EntityZombie;
 import net.minecraft.core.entity.player.EntityPlayer;
-import net.minecraft.core.entity.projectile.*;
+import net.minecraft.core.entity.projectile.EntityArrow;
+import net.minecraft.core.entity.projectile.EntityCannonball;
+import net.minecraft.core.entity.projectile.EntityEgg;
+import net.minecraft.core.entity.projectile.EntityFireball;
+import net.minecraft.core.entity.projectile.EntityPebble;
+import net.minecraft.core.entity.projectile.EntitySnowball;
 import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.entity.vehicle.EntityMinecart;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.world.World;
-import net.minecraft.client.option.GameSettings;
-import org.lwjgl.opengl.GL11;
 
 public class EntityRenderDispatcher
 {
@@ -103,9 +175,21 @@ public class EntityRenderDispatcher
         double lerpPosY = entity.yo + (entity.y - entity.yo) * (double)partialTick;
         double lerpPosZ = entity.zo + (entity.z - entity.zo) * (double)partialTick;
         float lerpYaw = entity.yRotO + (entity.yRot - entity.yRotO) * partialTick;
-        float brightness = entity.getBrightness(partialTick);
-        if (Minecraft.getMinecraft(this).fullbright) brightness = 1.0f;
+        float brightness;
+        
+        if(LightmapHelper.isLightmapEnabled()) {
+        	brightness = 1.0f;
+        	
+        	LightmapHelper.setLightmapCoord(entity.getLightmapCoord(partialTick));
+        }else if(Global.accessor.isFullbrightEnabled()) {
+        	brightness = 1.0f;
+        }else {
+        	brightness = entity.getBrightness(partialTick);
+        }
+        
+        if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
         GL11.glColor3f(brightness, brightness, brightness);
+        
         renderEntityWithPosYaw(tessellator, entity, lerpPosX - renderPosX, lerpPosY - renderPosY, lerpPosZ - renderPosZ, lerpYaw, partialTick);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/ItemRenderer.java b/src/main/java/net/minecraft/client/render/ItemRenderer.java
index fb43cd95c..2448bf04a 100644
--- a/src/main/java/net/minecraft/client/render/ItemRenderer.java
+++ b/src/main/java/net/minecraft/client/render/ItemRenderer.java
@@ -85,9 +85,15 @@ public class ItemRenderer
             ItemModelDispatcher.getInstance().getDispatch(itemstack.getItem()).renderItemFirstPerson(TessellatorStandard.instance,this, player, itemstack, partialTick);
         } else
         {
-            float brightness = mc.theWorld.getLightBrightness(MathHelper.floor_double(player.x), MathHelper.floor_double(player.y), MathHelper.floor_double(player.z));
-            if (mc.fullbright) brightness = 1.0f;
-            GL11.glColor4f(brightness, brightness, brightness, 1.0F);
+        	float brightness = 1.0f;
+        	if(LightmapHelper.isLightmapEnabled() || mc.fullbright) {
+        		LightmapHelper.setLightmapCoord(mc.thePlayer.getLightmapCoord(partialTick));
+        	}else if(mc.fullbright) {
+        		
+        	}else {
+        		brightness = mc.theWorld.getLightBrightness(MathHelper.floor_double(player.x), MathHelper.floor_double(player.y), MathHelper.floor_double(player.z));
+        	}
+            GL11.glColor4f(brightness, brightness, brightness, 1.0f);
             float f6 = 0.8F;
             float swingProgress = player.getSwingProgress(partialTick);
             float f14 = MathHelper.sin(swingProgress * MathHelper.PI);
diff --git a/src/main/java/net/minecraft/client/render/LightmapHelper.java b/src/main/java/net/minecraft/client/render/LightmapHelper.java
index 6be738409..eb29e66fb 100644
--- a/src/main/java/net/minecraft/client/render/LightmapHelper.java
+++ b/src/main/java/net/minecraft/client/render/LightmapHelper.java
@@ -115,6 +115,10 @@ public class LightmapHelper {
 			int light = Math.max(skyLight, blockLight);
 
 			float brightness = world.worldType.getBrightnessRamp()[light];
+			
+			brightness = applyGamma(brightness, mc.gameSettings.brightness.value - 0.5f);
+			
+			brightness = MathHelper.clamp(brightness, 0.0f, 1.0f);
 
 			int brightnessI = (int) (brightness * 255);
 
@@ -126,7 +130,7 @@ public class LightmapHelper {
 
 	public void generateVanillaLightmap(World world, float partialTicks) {
 		float ambientBrightness = world.getAmbientBrightness(partialTicks);
-		float brightness = 0.0f;
+		float brightness = mc.gameSettings.brightness.value - 0.5f;
 
 		for(int i = 0; i < 256; i++) {
 			float skyLight = getBrightnessRemoveMinLight(world, i / 16) * (ambientBrightness * 0.95f + 0.05f);
@@ -268,5 +272,24 @@ public class LightmapHelper {
 //		return (lmc01 + lmc23) >> 1;
 		return avg(avg(lmc0, lmc1), avg(lmc2, lmc3));
 	}
+	
+	public static void setLightmapCoord(int skylight, int blocklight) {
+		glMultiTexCoord2f(GL_TEXTURE1, blocklight * 16.0f, skylight * 16.0f);
+	}
+	
+	public static void setLightmapCoord(int lightmapCoord) {
+		int sky = lightmapCoord >> 16;
+		int block = lightmapCoord & 0xFFFF;
+		
+		glMultiTexCoord2f(GL_TEXTURE1, block, sky);
+	}
+	
+	public static int setBlocklightValue(int lightmapCoord, int blocklight) {
+		return lightmapCoord & 0xFFFF0000 | blocklight << 4;
+	}
+	
+	public static int setSkylightValue(int lightmapCoord, int skylight) {
+		return lightmapCoord & 0x0000FFFF | skylight << 20;
+	}
 
 }
diff --git a/src/main/java/net/minecraft/client/render/RenderBlockCache.java b/src/main/java/net/minecraft/client/render/RenderBlockCache.java
index abcf39cfc..123c7d1fb 100644
--- a/src/main/java/net/minecraft/client/render/RenderBlockCache.java
+++ b/src/main/java/net/minecraft/client/render/RenderBlockCache.java
@@ -1,12 +1,11 @@
 package net.minecraft.client.render;
 
+import java.util.Arrays;
+
 import net.minecraft.client.Minecraft;
 import net.minecraft.core.block.Block;
-import net.minecraft.core.block.BlockLeavesBase;
 import net.minecraft.core.world.WorldSource;
 
-import java.util.Arrays;
-
 final public class RenderBlockCache {
     private final Minecraft mc = Minecraft.getMinecraft(this);
     
@@ -41,33 +40,37 @@ final public class RenderBlockCache {
             offsetZ = z;
         }
     }
+    
+    private float calcBrightness(int x, int y, int z) {
+		float brightness = block.getBlockBrightness(access, x, y, z);
 
-	public float getBrightness(int relX, int relY, int relZ) {
-		int x1 = relX + offsetX;
-		int y1 = relY + offsetY;
-		int z1 = relZ + offsetZ;
-		
 		if(LightmapHelper.isLightmapEnabled() || mc.fullbright) {
-			Block block = access.getBlock(x1, y1, z1);
-			if(block == null) {
+			int lightEmission = Block.lightEmission[block.id];
+			if(lightEmission > 0) {
 				return 1.0f;
 			}
-			return 1.0f - block.getAmbientOcclusionStrength(access, x1, y1, z1);
-		}
-		
-		if(mc.isTreeShadingEnabled() && mc.isAmbientOcclusionEnabled()) {
-			if(access.getBlock(x1, y1, z1) instanceof BlockLeavesBase) {
-				float brightness = access.getBrightness(x1, y1, z1, Block.lightEmission[access.getBlockId(x1, y1, z1)]);
-				if(brightness > 0.2F) {
-					brightness = 0.2F;
-				}
-				return brightness;
+			if(!mc.isAmbientOcclusionEnabled()) {
+				return 1.0f;
+			}
+			Block block = access.getBlock(x, y, z);
+			if(block == null) {
+				return 1.0f;
 			}
+			return 1.0f - block.getAmbientOcclusionStrength(access, x, y, z);
 		}
 		
+		return brightness;
+    }
+    
+	public float getBrightness(int relX, int relY, int relZ) {
 		int index = (relX + CACHE_RANGE) * CACHE_SIZE * CACHE_SIZE + (relY + CACHE_RANGE) * CACHE_SIZE + (relZ + CACHE_RANGE);
+		
 		if(!brightnessCached[index]) {
-			brightnessValue[index] = block.getBlockBrightness(access, x1, y1, z1);
+			int x1 = relX + offsetX;
+			int y1 = relY + offsetY;
+			int z1 = relZ + offsetZ;
+			
+			brightnessValue[index] = calcBrightness(x1, y1, z1);
 			brightnessCached[index] = true;
 		}
 		
diff --git a/src/main/java/net/minecraft/client/render/RenderBlocks.java b/src/main/java/net/minecraft/client/render/RenderBlocks.java
index e7c35ec0c..5f2030421 100644
--- a/src/main/java/net/minecraft/client/render/RenderBlocks.java
+++ b/src/main/java/net/minecraft/client/render/RenderBlocks.java
@@ -249,55 +249,57 @@ public class RenderBlocks
     	boolean ao = mc.isAmbientOcclusionEnabled();
         
     	if(LightmapHelper.isLightmapEnabled()) {
-    		int lmc;
     		if(overbright) {
 				// TODO use correct skylight value, requires a getSavedLightValue method in WorldSource
-    			lmc = LightmapHelper.getOverbrightLightmapCoord(0);
+    			int lmc = LightmapHelper.getOverbrightLightmapCoord(0);
+        		lightmapCoordTopLeft = lightmapCoordBottomLeft = lightmapCoordBottomRight = lightmapCoordTopRight = lmc;
     		}else {
-            	if(depth > FULL_CUBE_THRESHOLD) {
-            		lmc = block.getLightmapCoord(blockAccess, x, y, z);
-            	}else {
-            		lmc = block.getLightmapCoord(blockAccess, x + dirX, y + dirY, z + dirZ);
-            	}	
-    		}
-    		lightmapCoordTopLeft = lightmapCoordBottomLeft = lightmapCoordBottomRight = lightmapCoordTopRight = lmc;
-    		if(ao) {
-    			int dirX2 = dirX;
-    			int dirY2 = dirY;
-    			int dirZ2 = dirZ;
-    			
-    			if(depth > FULL_CUBE_THRESHOLD) {
-    				dirX2 = 0;
-    				dirY2 = 0;
-    				dirZ2 = 0;
-    			}
-    			
-    			boolean topT = cache.getOpacity(dirX2 + topX, dirY2 + topY, dirZ2 + topZ);
-    			boolean botT = cache.getOpacity(dirX2 - topX, dirY2 - topY, dirZ2 - topZ);
-    			boolean lefT = cache.getOpacity(dirX2 + lefX, dirY2 + lefY, dirZ2 + lefZ);
-    			boolean rigT = cache.getOpacity(dirX2 - lefX, dirY2 - lefY, dirZ2 - lefZ);
-    			
-    			boolean topLefT = cache.getOpacity(dirX2 + topX + lefX, dirY2 + topY + lefY, dirZ2 + topZ + lefZ);
-    			boolean topRigT = cache.getOpacity(dirX2 + topX - lefX, dirY2 + topY - lefY, dirZ2 + topZ - lefZ);
-    			boolean botLefT = cache.getOpacity(dirX2 - topX + lefX, dirY2 - topY + lefY, dirZ2 - topZ + lefZ);
-    			boolean botRigT = cache.getOpacity(dirX2 - topX - lefX, dirY2 - topY - lefY, dirZ2 - topZ - lefZ);
-    			
-    			int lmcCen = cache.getLightmapCoord(dirX2, dirY2, dirZ2);
-    			
-    			int lmcTop = topT ? lmcCen : cache.getLightmapCoord(dirX2 + topX, dirY2 + topY, dirZ2 + topZ);
-    			int lmcBot = botT ? lmcCen : cache.getLightmapCoord(dirX2 - topX, dirY2 - topY, dirZ2 - topZ);
-    			int lmcLef = lefT ? lmcCen : cache.getLightmapCoord(dirX2 + lefX, dirY2 + lefY, dirZ2 + lefZ);
-    			int lmcRig = rigT ? lmcCen : cache.getLightmapCoord(dirX2 - lefX, dirY2 - lefY, dirZ2 - lefZ);
+        		if(ao) {
+        			int dirX2 = dirX;
+        			int dirY2 = dirY;
+        			int dirZ2 = dirZ;
+        			
+        			if(depth > FULL_CUBE_THRESHOLD) {
+        				dirX2 = 0;
+        				dirY2 = 0;
+        				dirZ2 = 0;
+        			}
+        			
+        			boolean topT = cache.getOpacity(dirX2 + topX, dirY2 + topY, dirZ2 + topZ);
+        			boolean botT = cache.getOpacity(dirX2 - topX, dirY2 - topY, dirZ2 - topZ);
+        			boolean lefT = cache.getOpacity(dirX2 + lefX, dirY2 + lefY, dirZ2 + lefZ);
+        			boolean rigT = cache.getOpacity(dirX2 - lefX, dirY2 - lefY, dirZ2 - lefZ);
+        			
+        			boolean topLefT = cache.getOpacity(dirX2 + topX + lefX, dirY2 + topY + lefY, dirZ2 + topZ + lefZ);
+        			boolean topRigT = cache.getOpacity(dirX2 + topX - lefX, dirY2 + topY - lefY, dirZ2 + topZ - lefZ);
+        			boolean botLefT = cache.getOpacity(dirX2 - topX + lefX, dirY2 - topY + lefY, dirZ2 - topZ + lefZ);
+        			boolean botRigT = cache.getOpacity(dirX2 - topX - lefX, dirY2 - topY - lefY, dirZ2 - topZ - lefZ);
+        			
+        			int lmcCen = cache.getLightmapCoord(dirX2, dirY2, dirZ2);
+        			
+        			int lmcTop = topT ? lmcCen : cache.getLightmapCoord(dirX2 + topX, dirY2 + topY, dirZ2 + topZ);
+        			int lmcBot = botT ? lmcCen : cache.getLightmapCoord(dirX2 - topX, dirY2 - topY, dirZ2 - topZ);
+        			int lmcLef = lefT ? lmcCen : cache.getLightmapCoord(dirX2 + lefX, dirY2 + lefY, dirZ2 + lefZ);
+        			int lmcRig = rigT ? lmcCen : cache.getLightmapCoord(dirX2 - lefX, dirY2 - lefY, dirZ2 - lefZ);
 
-    			int lmcTopLef = topT && lefT ? lmcLef : (topLefT ? lmcCen : cache.getLightmapCoord(dirX2 + topX + lefX, dirY2 + topY + lefY, dirZ2 + topZ + lefZ));
-    			int lmcBotLef = botT && lefT ? lmcLef : (botLefT ? lmcCen : cache.getLightmapCoord(dirX2 - topX + lefX, dirY2 - topY + lefY, dirZ2 - topZ + lefZ));
-    			int lmcTopRig = topT && rigT ? lmcRig : (topRigT ? lmcCen : cache.getLightmapCoord(dirX2 + topX - lefX, dirY2 + topY - lefY, dirZ2 + topZ - lefZ));
-    			int lmcBotRig = botT && rigT ? lmcRig : (botRigT ? lmcCen : cache.getLightmapCoord(dirX2 - topX - lefX, dirY2 - topY - lefY, dirZ2 - topZ - lefZ));
+        			int lmcTopLef = topT && lefT ? lmcLef : (topLefT ? lmcCen : cache.getLightmapCoord(dirX2 + topX + lefX, dirY2 + topY + lefY, dirZ2 + topZ + lefZ));
+        			int lmcBotLef = botT && lefT ? lmcLef : (botLefT ? lmcCen : cache.getLightmapCoord(dirX2 - topX + lefX, dirY2 - topY + lefY, dirZ2 - topZ + lefZ));
+        			int lmcTopRig = topT && rigT ? lmcRig : (topRigT ? lmcCen : cache.getLightmapCoord(dirX2 + topX - lefX, dirY2 + topY - lefY, dirZ2 + topZ - lefZ));
+        			int lmcBotRig = botT && rigT ? lmcRig : (botRigT ? lmcCen : cache.getLightmapCoord(dirX2 - topX - lefX, dirY2 - topY - lefY, dirZ2 - topZ - lefZ));
 
-    			lightmapCoordTopLeft     = LightmapHelper.avg(lmcCen, lmcLef, lmcTop, lmcTopLef);
-    			lightmapCoordTopRight    = LightmapHelper.avg(lmcCen, lmcRig, lmcTop, lmcTopRig);
-    			lightmapCoordBottomLeft  = LightmapHelper.avg(lmcCen, lmcLef, lmcBot, lmcBotLef);
-    			lightmapCoordBottomRight = LightmapHelper.avg(lmcCen, lmcRig, lmcBot, lmcBotRig);
+        			lightmapCoordTopLeft     = LightmapHelper.avg(lmcCen, lmcLef, lmcTop, lmcTopLef);
+        			lightmapCoordTopRight    = LightmapHelper.avg(lmcCen, lmcRig, lmcTop, lmcTopRig);
+        			lightmapCoordBottomLeft  = LightmapHelper.avg(lmcCen, lmcLef, lmcBot, lmcBotLef);
+        			lightmapCoordBottomRight = LightmapHelper.avg(lmcCen, lmcRig, lmcBot, lmcBotRig);
+        		}else {
+        			int lmc;
+                	if(depth > FULL_CUBE_THRESHOLD) {
+                		lmc = block.getLightmapCoord(blockAccess, x, y, z);
+                	}else {
+                		lmc = block.getLightmapCoord(blockAccess, x + dirX, y + dirY, z + dirZ);
+                	}
+            		lightmapCoordTopLeft = lightmapCoordBottomLeft = lightmapCoordBottomRight = lightmapCoordTopRight = lmc;
+        		}
     		}
     	}
     	
@@ -476,7 +478,6 @@ public class RenderBlocks
             tessellator.addVertexWithUV(d12, d13, d15, d4, d6);
         } else
         {
-        	if(LightmapHelper.isLightmapEnabled()) tessellator.setLightmapCoord(lightmapCoordTopLeft);
             tessellator.addVertexWithUV(d11, d13, d15, d8, d10);
             tessellator.addVertexWithUV(d11, d13, d14, d3, d5);
             tessellator.addVertexWithUV(d12, d13, d14, d7, d9);
@@ -564,7 +565,6 @@ public class RenderBlocks
             tessellator.addVertexWithUV(d11, d13, d15, d8, d10);
         } else
         {
-        	if(LightmapHelper.isLightmapEnabled()) tessellator.setLightmapCoord(lightmapCoordTopLeft);
             tessellator.addVertexWithUV(d12, d13, d15, d4, d6);
             tessellator.addVertexWithUV(d12, d13, d14, d7, d9);
             tessellator.addVertexWithUV(d11, d13, d14, d3, d5);
@@ -658,7 +658,6 @@ public class RenderBlocks
             tessellator.addVertexWithUV(d12, d14, d16, d4, d6);
         } else
         {
-        	if(LightmapHelper.isLightmapEnabled()) tessellator.setLightmapCoord(lightmapCoordTopLeft);
             tessellator.addVertexWithUV(d12, d15, d16, d8, d10);
             tessellator.addVertexWithUV(d13, d15, d16, d3, d5);
             tessellator.addVertexWithUV(d13, d14, d16, d9, d11);
@@ -752,7 +751,6 @@ public class RenderBlocks
             tessellator.addVertexWithUV(x1, y1, z0, d8, d10);
         } else
         {
-        	if(LightmapHelper.isLightmapEnabled()) tessellator.setLightmapCoord(lightmapCoordTopLeft);
             tessellator.addVertexWithUV(x0, y1, z0, d3, d5);
             tessellator.addVertexWithUV(x0, y0, z0, d9, d11);
             tessellator.addVertexWithUV(x1, y0, z0, d4, d6);
@@ -848,7 +846,6 @@ public class RenderBlocks
             tessellator.addVertexWithUV(d12, d13, d16, d4, d6);
         } else
         {
-        	if(LightmapHelper.isLightmapEnabled()) tessellator.setLightmapCoord(lightmapCoordTopLeft);
             tessellator.addVertexWithUV(d12, d14, d16, d8, d10);
             tessellator.addVertexWithUV(d12, d14, d15, d3, d5);
             tessellator.addVertexWithUV(d12, d13, d15, d9, d11);
@@ -943,7 +940,6 @@ public class RenderBlocks
             tessellator.addVertexWithUV(xMax, yMax, zMax, uMin, vMin);
         } else
         {
-        	if(LightmapHelper.isLightmapEnabled()) tessellator.setLightmapCoord(lightmapCoordTopLeft);
             tessellator.addVertexWithUV(xMax, yMin, zMax, uMin2, vMax2);
             tessellator.addVertexWithUV(xMax, yMin, zMin, uMax, vMax);
             tessellator.addVertexWithUV(xMax, yMax, zMin, uMax2, vMin2);
diff --git a/src/main/java/net/minecraft/client/render/Scissor.java b/src/main/java/net/minecraft/client/render/Scissor.java
index 04ef49b10..98ce7458f 100644
--- a/src/main/java/net/minecraft/client/render/Scissor.java
+++ b/src/main/java/net/minecraft/client/render/Scissor.java
@@ -7,8 +7,10 @@ import org.lwjgl.opengl.GL11;
 import static org.lwjgl.opengl.GL11.GL_SCISSOR_TEST;
 
 public abstract class Scissor {
+	private static Minecraft mc = Minecraft.getMinecraft(Scissor.class);
+	
     public static void enable(int x, int y, int xSize, int ySize) {
-        GameResolution resolution = Minecraft.getMinecraft(Scissor.class).resolution;
+        GameResolution resolution = mc.resolution;
         int xScaled = x * resolution.scale;
         int yScaled = resolution.height - ((y + ySize) * resolution.scale);
         int xSizeScaled = xSize * resolution.scale;
diff --git a/src/main/java/net/minecraft/client/render/WorldRenderer.java b/src/main/java/net/minecraft/client/render/WorldRenderer.java
index 52c76cafb..b067277c9 100644
--- a/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -393,7 +393,9 @@ public class WorldRenderer
         }
         if(mc.gameSettings.thirdPersonView.value == 0 && !(mc.currentScreen instanceof GuiPhotoMode) && !(!(mc.activeCamera instanceof EntityCamera) || ((EntityCamera) mc.activeCamera).entity.isPlayerSleeping()) && mc.gameSettings.immersiveMode.drawHand())
         {
+            lightmapHelper.enableLightmapRendering();
             if(!zooming) itemRenderer.renderItemInFirstPerson(partialTick);
+            lightmapHelper.disableLightmapRendering();
         }
         GL11.glPopMatrix();
         if(mc.gameSettings.thirdPersonView.value == 0 && !(!(mc.activeCamera instanceof EntityCamera) || ((EntityCamera) mc.activeCamera).entity.isPlayerSleeping()))
@@ -677,7 +679,6 @@ public class WorldRenderer
         Debug.change("terrain");
         lightmapHelper.enableLightmapRendering();
         renderGlobal.sortAndRender(mc.activeCamera, 0, partialTick);
-        lightmapHelper.disableLightmapRendering();
 
         Debug.change("entities");
         GL11.glShadeModel(7424 /*GL_FLAT*/);
@@ -698,6 +699,8 @@ public class WorldRenderer
         fogManager.setupFog(FogManager.FOG_MODE_NORMAL, farPlaneDistance, partialTick);
         effectRenderer.renderParticles(mc.activeCamera, partialTick);
 
+        lightmapHelper.disableLightmapRendering();
+        
         Debug.change("outline");
         if(mc.objectMouseOver != null)
         {
diff --git a/src/main/java/net/minecraft/client/render/block/color/BlockColorWater.java b/src/main/java/net/minecraft/client/render/block/color/BlockColorWater.java
index 83103fa06..100362b2c 100644
--- a/src/main/java/net/minecraft/client/render/block/color/BlockColorWater.java
+++ b/src/main/java/net/minecraft/client/render/block/color/BlockColorWater.java
@@ -7,10 +7,12 @@ import net.minecraft.core.world.WorldSource;
 public class BlockColorWater
     extends BlockColor
 {
+	private final Minecraft mc = Minecraft.getMinecraft(this);
+	
     @Override
     public int getFallbackColor(int meta)
     {
-        if (Minecraft.getMinecraft(this).gameSettings.biomeWater.value)
+        if (mc.gameSettings.biomeWater.value)
         {
             return ColorizerWater.getWaterColor(0.5, 0.5);
         }
@@ -22,7 +24,7 @@ public class BlockColorWater
     public int getWorldColor(WorldSource world, int x, int y, int z)
     {
         if (world != null) {
-            if (Minecraft.getMinecraft(this).gameSettings.biomeWater.value)
+            if (mc.gameSettings.biomeWater.value)
             {
                 double temp = world.getBlockTemperature(x, z);
                 double hum = world.getBlockHumidity(x, z);
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
index a493c0a0b..1f743beba 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelFire.java
@@ -1,6 +1,7 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.tessalator.Tessellator;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.BlockFire;
@@ -25,7 +26,13 @@ public class BlockModelFire<T extends Block> extends BlockModelStandard<T>{
         {
             tex = renderBlocks.overrideBlockTexture;
         }
-        float brightness = renderBlocks.getBlockBrightness(renderBlocks.blockAccess, x, y, z);
+        float brightness = 1.0f;
+        if(LightmapHelper.isLightmapEnabled()) {
+        	// TODO skylight
+        	tessellator.setLightmapCoord(LightmapHelper.getOverbrightLightmapCoord(0));
+        }else {
+        	brightness = renderBlocks.getBlockBrightness(renderBlocks.blockAccess, x, y, z);
+        }
         tessellator.setColorOpaque_F(brightness, brightness, brightness);
         double uMin = tex.getIconUMin();
         double uMax = tex.getIconUMax();
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelPumpkinPie.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelPumpkinPie.java
index ad91d66e4..5fa45ba6d 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelPumpkinPie.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelPumpkinPie.java
@@ -15,6 +15,9 @@ public class BlockModelPumpkinPie<T extends Block> extends BlockModelStandard<T>
 
     public BlockModelPumpkinPie(Block block) {
         super(block);
+        float f = 0.0625F;
+        float f1 = 0.375F;
+        withCustomItemBounds(f, 0.0F, f, 1.0F - f, f1, 1.0F - f);
     }
 
     public void renderSliceSide(Tessellator tessellator, Block block, int x, int y, int z, Side side, boolean overrideTex) {
@@ -77,10 +80,6 @@ public class BlockModelPumpkinPie<T extends Block> extends BlockModelStandard<T>
         renderBlocks.enableAO = false;
         return true;
     }
-    @Override
-    public boolean shouldItemRender3d() {
-        return false;
-    }
 
     public int maxSlices;
 
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java
index c956b6df2..0ea591b0b 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelStandard.java
@@ -3,6 +3,7 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.Side;
@@ -39,7 +40,7 @@ public class BlockModelStandard<T extends Block> extends BlockModel<T>{
             GL11.glColor4f(brightness, brightness, brightness, alpha);
         }
         float yOffset = 0.5F;
-
+        
         setBlockBoundsForItemRender();
         GL11.glTranslatef(-0.5F, 0.0F - yOffset, -0.5F);
 
diff --git a/src/main/java/net/minecraft/client/render/colorizer/ColorizerWater.java b/src/main/java/net/minecraft/client/render/colorizer/ColorizerWater.java
index 26775f279..49fbcae1b 100644
--- a/src/main/java/net/minecraft/client/render/colorizer/ColorizerWater.java
+++ b/src/main/java/net/minecraft/client/render/colorizer/ColorizerWater.java
@@ -5,6 +5,7 @@ import net.minecraft.core.world.Dimension;
 
 public class ColorizerWater {
 
+	private static Minecraft mc = Minecraft.getMinecraft(ColorizerWater.class);
 	private static int colorData[] = new int[65536];
 
 	public static void updateColorData(int[] colorData) {
@@ -13,9 +14,9 @@ public class ColorizerWater {
 
 	public static int getWaterColor(double temperature, double humidity) {
 		try {
-			if (Minecraft.getMinecraft(ColorizerWater.class).gameSettings.biomeWater.value) {
+			if (mc.gameSettings.biomeWater.value) {
 
-				if(Minecraft.getMinecraft(ColorizerWater.class).theWorld.dimension == Dimension.nether){
+				if(mc.theWorld.dimension == Dimension.nether){
 					return 0XF54242;
 				}
 
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterFlow.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterFlow.java
index a8b13db57..049c77706 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterFlow.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterFlow.java
@@ -1,12 +1,12 @@
 package net.minecraft.client.render.dynamictexture;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.block.model.BlockModelStandard;
-import net.minecraft.client.render.stitcher.AtlasStitcher;
 import net.minecraft.client.render.stitcher.TextureRegistry;
 
 public class DynamicTextureWaterFlow extends DynamicTexture {
-
+	
+	private final Minecraft mc = Minecraft.getMinecraft(this);
+	
 	private float[] arr1;
 	private float[] arr2;
 	private float[] arr3;
@@ -75,7 +75,7 @@ public class DynamicTextureWaterFlow extends DynamicTexture {
 			int b = 255;
 			int a = (int) (146.0F + var13 * 50.0F);
 
-			if (Minecraft.getMinecraft(this).gameSettings.biomeWater.value) {
+			if (mc.gameSettings.biomeWater.value) {
 				r = g = b = (r + g + b) / 3;
 			}
 
diff --git a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterStill.java b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterStill.java
index 06caf9c42..d40cea63a 100644
--- a/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterStill.java
+++ b/src/main/java/net/minecraft/client/render/dynamictexture/DynamicTextureWaterStill.java
@@ -1,11 +1,11 @@
 package net.minecraft.client.render.dynamictexture;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.block.model.BlockModelStandard;
-import net.minecraft.client.render.stitcher.AtlasStitcher;
 import net.minecraft.client.render.stitcher.TextureRegistry;
 
 public class DynamicTextureWaterStill extends DynamicTexture {
+	
+	private final Minecraft mc = Minecraft.getMinecraft(this);
 
 	private float[] arr1;
 	private float[] arr2;
@@ -75,7 +75,7 @@ public class DynamicTextureWaterStill extends DynamicTexture {
 			int b = 255;
 			int a = (int) (146.0F + var13 * 50.0F);
 
-			if (Minecraft.getMinecraft(this).gameSettings.biomeWater.value) {
+			if (mc.gameSettings.biomeWater.value) {
 				r = g = b = (r + g + b) / 3;
 			}
 
diff --git a/src/main/java/net/minecraft/client/render/entity/BoatRenderer.java b/src/main/java/net/minecraft/client/render/entity/BoatRenderer.java
index eeb103680..bc5ca629c 100644
--- a/src/main/java/net/minecraft/client/render/entity/BoatRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/BoatRenderer.java
@@ -19,6 +19,8 @@ import org.lwjgl.opengl.GL11;
 
 public class BoatRenderer extends EntityRenderer<EntityBoat>
 {
+	
+	private final Minecraft mc = Minecraft.getMinecraft(this);
 
     public BoatRenderer()
     {
@@ -45,7 +47,7 @@ public class BoatRenderer extends EntityRenderer<EntityBoat>
         }
         if (entity.tileEntityFlag != null)
         {
-            World theWorld = Minecraft.getMinecraft(this).theWorld;
+            World theWorld = mc.theWorld;
             WindManager theWind = theWorld.getWorldType().getWindManager();
 
             float windAngle = theWind.getWindDirection(theWorld, (float) x, (float) y, (float) z) * 360f + (180 - yaw);
diff --git a/src/main/java/net/minecraft/client/render/entity/EntityRenderer.java b/src/main/java/net/minecraft/client/render/entity/EntityRenderer.java
index bb1fd2116..e2ffd69e5 100644
--- a/src/main/java/net/minecraft/client/render/entity/EntityRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/EntityRenderer.java
@@ -1,20 +1,22 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.tessalator.Tessellator;
-import net.minecraft.client.render.tessalator.TessellatorStandard;
+import org.lwjgl.opengl.GL11;
+
 import net.minecraft.client.render.EntityRenderDispatcher;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ImageParser;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderEngine;
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.client.render.tessalator.Tessellator;
+import net.minecraft.client.render.tessalator.TessellatorStandard;
+import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
-import org.lwjgl.opengl.GL11;
 
 public abstract class EntityRenderer<T extends Entity>
 {
@@ -54,6 +56,11 @@ public abstract class EntityRenderer<T extends Entity>
         GL11.glRotatef(-renderDispatcher.viewLerpYaw, 0.0F, 1.0F, 0.0F);
         GL11.glTranslatef(0.0F, 0.0F, -0.3F + (float)(int)f12 * 0.02F);
         GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        if(LightmapHelper.isLightmapEnabled()) {
+        	int lightmapCoord = entity.getLightmapCoord(partialTick);
+        	lightmapCoord = LightmapHelper.setBlocklightValue(lightmapCoord, 15);
+        	LightmapHelper.setLightmapCoord(lightmapCoord);
+        }
         float f14 = 0.0F;
         int l = 0;
         tessellator.startDrawingQuads();
@@ -143,7 +150,7 @@ public abstract class EntityRenderer<T extends Entity>
             return;
         }
         double brightness = getWorld().getLightBrightness(x, y, z);
-        if (Minecraft.getMinecraft(this).fullbright) brightness = 1.0f;
+        if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
         double alpha = ((double)opacity - (d1 - ((double)(y + 1) + d4)) / 2D) * 0.5D * brightness;
         if(alpha < 0.0D)
         {
diff --git a/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java b/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java
index 45e614f14..48e4f5b90 100644
--- a/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/ItemEntityRenderer.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.block.ItemBlock;
 import org.lwjgl.opengl.GL11;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderBlocks;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
@@ -48,8 +49,10 @@ public class ItemEntityRenderer extends EntityRenderer<EntityItem>
 	}
 
 	public void doRender(Tessellator tessellator, final EntityItem entity, final double x, final double y, final double z, final float yaw, final float partialTick) {
-		final Minecraft mc = Minecraft.getMinecraft(this);
-		float brightness = entity.getBrightness(partialTick);
+		float brightness = 1.0f;
+		if(!LightmapHelper.isLightmapEnabled()) {
+			brightness = entity.getBrightness(partialTick);
+		}
 		random.setSeed(187L);
 		final ItemStack itemstack = entity.item;
 		if(itemstack == null) {
diff --git a/src/main/java/net/minecraft/client/render/entity/LivingRenderer.java b/src/main/java/net/minecraft/client/render/entity/LivingRenderer.java
index 5e18a3963..a39bda049 100644
--- a/src/main/java/net/minecraft/client/render/entity/LivingRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/LivingRenderer.java
@@ -2,9 +2,11 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.tessalator.TessellatorStandard;
 import net.minecraft.client.render.model.ModelBase;
+import net.minecraft.core.Global;
 import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.util.helper.MathHelper;
 import org.lwjgl.opengl.GL11;
@@ -94,7 +96,7 @@ public class LivingRenderer<T extends EntityLiving> extends EntityRenderer<T>
 
             renderEquippedItems(entity, partialTick);
             float f9 = entity.getBrightness(partialTick);
-            if (Minecraft.getMinecraft(this).fullbright) f9 = 1.0f;
+            if (Global.accessor.isFullbrightEnabled() || LightmapHelper.isLightmapEnabled()) f9 = 1.0f;
             int j = getColorMultiplier(entity, f9, partialTick);
             if((j >> 24 & 0xff) > 0 || entity.hurtTime > 0 || entity.deathTime > 0)
             {
diff --git a/src/main/java/net/minecraft/client/render/entity/MinecartRenderer.java b/src/main/java/net/minecraft/client/render/entity/MinecartRenderer.java
index e183a50ca..37c909384 100644
--- a/src/main/java/net/minecraft/client/render/entity/MinecartRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/MinecartRenderer.java
@@ -8,6 +8,7 @@ import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.tessalator.TessellatorStandard;
 import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.core.entity.vehicle.EntityMinecart;
+import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.Vec3d;
@@ -83,7 +84,7 @@ public class MinecartRenderer extends EntityRenderer<EntityMinecart>
             GL11.glTranslatef(0.0F, 0.3125F, 0.0F);
             GL11.glRotatef(90F, 0.0F, 1.0F, 0.0F);
             float brightness = minecart.getBrightness(f1);
-            if (Minecraft.getMinecraft(this).fullbright) brightness = 1.0f;
+            if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
             if(minecart.minecartType == 1)
             {
                 BlockModelDispatcher.getInstance().getDispatch(Block.chestPlanksOak).renderBlockOnInventory(tessellator, 0, brightness);
diff --git a/src/main/java/net/minecraft/client/render/entity/PaintingRenderer.java b/src/main/java/net/minecraft/client/render/entity/PaintingRenderer.java
index d5792995d..d922e676c 100644
--- a/src/main/java/net/minecraft/client/render/entity/PaintingRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/PaintingRenderer.java
@@ -7,6 +7,7 @@ import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.tessalator.TessellatorStandard;
+import net.minecraft.core.Global;
 import net.minecraft.core.entity.EntityPainting;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.item.ItemStack;
@@ -125,7 +126,7 @@ public class PaintingRenderer extends EntityRenderer<EntityPainting>
             worldZ = MathHelper.floor_double(entity.z + (double)(centerX / 16F));
         }
         float brightness = renderDispatcher.world.getLightBrightness(worldX, worldY, worldZ);
-        if (Minecraft.getMinecraft(this).fullbright) brightness = 1.0f;
+        if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
         GL11.glColor3f(brightness, brightness, brightness);
     }
 
diff --git a/src/main/java/net/minecraft/client/render/entity/SheepRenderer.java b/src/main/java/net/minecraft/client/render/entity/SheepRenderer.java
index f6a7506a8..7d5359f1f 100644
--- a/src/main/java/net/minecraft/client/render/entity/SheepRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/SheepRenderer.java
@@ -1,9 +1,11 @@
 package net.minecraft.client.render.entity;
 
-import net.minecraft.client.Minecraft;
+import org.lwjgl.opengl.GL11;
+
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.model.ModelBase;
+import net.minecraft.core.Global;
 import net.minecraft.core.entity.animal.EntitySheep;
-import org.lwjgl.opengl.GL11;
 
 // Referenced classes of package net.minecraft.src:
 //            RenderLiving, EntitySheep, ModelBase, EntityLiving
@@ -22,10 +24,14 @@ public class SheepRenderer extends LivingRenderer<EntitySheep>
         if(i == 0 && !entitysheep.getSheared())
         {
             loadTexture("/mob/sheep_fur.png");
-            float f1 = entitysheep.getBrightness(f);
-            if (Minecraft.getMinecraft(this).fullbright) f1 = 1.0f;
+            float brightness = 1.0f;
+            if(LightmapHelper.isLightmapEnabled() || Global.accessor.isFullbrightEnabled()) {
+            	
+            }else {
+            	brightness = entitysheep.getBrightness(f);
+            }
             int j = entitysheep.getFleeceColor();
-            GL11.glColor3f(f1 * EntitySheep.fleeceColorTable[j][0], f1 * EntitySheep.fleeceColorTable[j][1], f1 * EntitySheep.fleeceColorTable[j][2]);
+            GL11.glColor3f(brightness * EntitySheep.fleeceColorTable[j][0], brightness * EntitySheep.fleeceColorTable[j][1], brightness * EntitySheep.fleeceColorTable[j][2]);
             return true;
         } else
         {
diff --git a/src/main/java/net/minecraft/client/render/entity/SpiderRenderer.java b/src/main/java/net/minecraft/client/render/entity/SpiderRenderer.java
index 7b7d37cf3..c764fa89b 100644
--- a/src/main/java/net/minecraft/client/render/entity/SpiderRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/SpiderRenderer.java
@@ -2,6 +2,7 @@ package net.minecraft.client.render.entity;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.model.ModelSpider;
+import net.minecraft.core.Global;
 import net.minecraft.core.entity.monster.EntitySpider;
 import org.lwjgl.opengl.GL11;
 
@@ -28,7 +29,7 @@ public class SpiderRenderer extends LivingRenderer<EntitySpider>
         {
             loadTexture("/mob/spider_eyes.png");
             float brightness = spider.getBrightness(1.0f);
-            if (Minecraft.getMinecraft(this).fullbright) brightness = 1.0f;
+            if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
             float f1 = (1.0F - brightness) * 0.5F;
             GL11.glEnable(3042 /*GL_BLEND*/);
             GL11.glDisable(3008 /*GL_ALPHA_TEST*/);
diff --git a/src/main/java/net/minecraft/client/render/entity/TNTRenderer.java b/src/main/java/net/minecraft/client/render/entity/TNTRenderer.java
index 67843681d..9f7f72d5a 100644
--- a/src/main/java/net/minecraft/client/render/entity/TNTRenderer.java
+++ b/src/main/java/net/minecraft/client/render/entity/TNTRenderer.java
@@ -8,6 +8,7 @@ import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.tessalator.TessellatorStandard;
 import net.minecraft.client.render.stitcher.TextureRegistry;
 import net.minecraft.core.entity.EntityTNT;
+import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import org.lwjgl.opengl.GL11;
 
@@ -49,7 +50,7 @@ public class TNTRenderer extends EntityRenderer<EntityTNT>
         float f3 = (1.0F - (((float)tnt.fuse - f1) + 1.0F) / 100F) * 0.8F;
         TextureRegistry.blockAtlas.bindTexture();
         float brightness = tnt.getBrightness(f1);
-        if (Minecraft.getMinecraft(this).fullbright) brightness = 1.0f;
+        if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
         BlockModel<Block> model = BlockModelDispatcher.getInstance().getDispatch(Block.tnt);
         model.renderBlockOnInventory(tessellator, 0, brightness);
         if((tnt.fuse / 5) % 2 == 0)
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
index 772fbd1e0..1657eab7a 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelBlock.java
@@ -3,12 +3,14 @@ package net.minecraft.client.render.item.model;
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderEngine;
 import net.minecraft.client.render.block.color.BlockColorDispatcher;
 import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.EntityPlayer;
@@ -35,9 +37,19 @@ public class ItemModelBlock extends ItemModelStandard {
     @Override
     public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick) {
         final Minecraft mc = Minecraft.getMinecraft(this);
-        float brightness = player.getBrightness(1.0f);
-        if (mc.fullbright || itemfullBright) brightness = 1.0f;
-
+        float brightness = 1.0f;
+        if(LightmapHelper.isLightmapEnabled()) {
+        	int lightmapCoord = player.getLightmapCoord(partialTick);
+        	if(itemfullBright) {
+        		lightmapCoord = LightmapHelper.setBlocklightValue(lightmapCoord, 15);
+        	}
+        	LightmapHelper.setLightmapCoord(lightmapCoord);	
+        }else if(mc.fullbright || itemfullBright) {
+        	
+        }else {
+        	brightness = player.getBrightness(1.0f);
+        }
+        
         final float distanceScale = 0.8F; // Relates to how close the held item renders from the camera
         final float swingProgress = player.getSwingProgress(partialTick);
         final float animationProgress2 = MathHelper.sin(swingProgress * MathHelper.PI);
@@ -138,7 +150,13 @@ public class ItemModelBlock extends ItemModelStandard {
                     final float rOffZ = ((random.nextFloat() * 2.0F - 1.0F) * 0.2F) / itemSize;
                     GL11.glTranslatef(rOffX, rOffY, rOffZ);
                 }
-                if (Minecraft.getMinecraft(this).fullbright || itemfullBright) brightness = 1.0f;
+                if(LightmapHelper.isLightmapEnabled()) {
+                	brightness = 1.0f;
+                	LightmapHelper.setLightmapCoord(entity.getLightmapCoord(partialTick));
+                }
+                if (Global.accessor.isFullbrightEnabled() || itemfullBright) {
+                	brightness = 1.0f;
+                }
                 blockModel.renderBlockOnInventory(tessellator, itemstack.getMetadata(), brightness);
                 GL11.glPopMatrix();
             }
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
index bef9f0d97..3bc301f0e 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelDispatcher.java
@@ -203,6 +203,8 @@ public class ItemModelDispatcher extends Dispatcher<Item, ItemModel> {
 
         addDispatch(new ItemModelStandard(Item.rope, "minecraft"));
 
+        addDispatch(new ItemModelStandard(Item.wandMonsterSpawner, "minecraft").setFull3D());
+
         addDispatch(new ItemModelStandard(Item.record13, "minecraft"));
         addDispatch(new ItemModelStandard(Item.recordCat, "minecraft"));
         addDispatch(new ItemModelStandard(Item.recordBlocks, "minecraft"));
diff --git a/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java b/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
index c93496e82..dd6766d9f 100644
--- a/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
+++ b/src/main/java/net/minecraft/client/render/item/model/ItemModelStandard.java
@@ -4,6 +4,7 @@ import net.minecraft.client.Minecraft;
 import net.minecraft.client.render.EntityRenderDispatcher;
 import net.minecraft.client.render.FontRenderer;
 import net.minecraft.client.render.ItemRenderer;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.client.render.RenderEngine;
 import net.minecraft.client.render.stitcher.IconCoordinate;
 import net.minecraft.client.render.stitcher.TextureRegistry;
@@ -37,6 +38,7 @@ import static org.lwjgl.opengl.GL11.glScaled;
 import static org.lwjgl.opengl.GL11.glTranslated;
 
 public class ItemModelStandard extends ItemModel{
+    final Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
     public static final IconCoordinate ITEM_TEXTURE_MISSING = TextureRegistry.getTexture("minecraft:item/texture_missing");
     public static final IconCoordinate ITEM_TEXTURE_UNASSIGNED = TextureRegistry.getTexture("minecraft:item/texture_unassigned");
     protected boolean useColor = true;
@@ -55,9 +57,18 @@ public class ItemModelStandard extends ItemModel{
 
     @Override
     public void renderItemFirstPerson(Tessellator tessellator, ItemRenderer renderer, EntityPlayer player, ItemStack stack, float partialTick) {
-        final Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
-        float brightness = player.getBrightness(1f);
-        if (mc.fullbright || itemfullBright) brightness = 1.0f;
+        float brightness = 1.0f;
+        if(mc.fullbright || itemfullBright || LightmapHelper.isLightmapEnabled()) {
+        	if(LightmapHelper.isLightmapEnabled()) {
+            	int lightmapCoord = player.getLightmapCoord(partialTick);
+            	if(itemfullBright) {
+            		lightmapCoord = LightmapHelper.setBlocklightValue(lightmapCoord, 15);
+            	}
+            	LightmapHelper.setLightmapCoord(lightmapCoord);	
+        	}
+        }else {
+        	brightness = player.getBrightness(1.0f);
+        }
 
         final float distanceScale = 0.8F; // Relates to how close the held item renders from the camera
         final float swingProgress = player.getSwingProgress(partialTick);
@@ -100,7 +111,6 @@ public class ItemModelStandard extends ItemModel{
 
     @Override
     public void renderItemThirdPerson(Tessellator tessellator, ItemRenderer renderer, Entity entity, ItemStack itemstack, boolean handheldTransform) {
-        final Minecraft mc = Minecraft.getMinecraft(Minecraft.class);
         float brightness = entity.getBrightness(1f);
         if (mc.fullbright || itemfullBright) brightness = 1.0f;
 
diff --git a/src/main/java/net/minecraft/client/render/model/ModelSheepOverlay.java b/src/main/java/net/minecraft/client/render/model/ModelSheepOverlay.java
index f47de9ca7..67dcf5de7 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelSheepOverlay.java
+++ b/src/main/java/net/minecraft/client/render/model/ModelSheepOverlay.java
@@ -5,6 +5,8 @@ package net.minecraft.client.render.model;
 //            ModelQuadruped, ModelRenderer
 
 import net.minecraft.client.Minecraft;
+import net.minecraft.client.render.LightmapHelper;
+import net.minecraft.core.Global;
 import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.entity.animal.EntitySheep;
 import org.lwjgl.opengl.GL11;
@@ -24,7 +26,7 @@ public class ModelSheepOverlay extends ModelSheep
         super.setLivingAnimations(entityliving, limbSwing, limbYaw, partialTick);
         this.sheep = entityliving;
         float brightness = sheep.getBrightness(limbSwing);
-        if (Minecraft.getMinecraft(this).fullbright) brightness = 1.0f;
+        if (Global.accessor.isFullbrightEnabled() || LightmapHelper.isLightmapEnabled()) brightness = 1.0f;
         int j = ((EntitySheep)sheep).getFleeceColor();
         GL11.glColor3f(brightness * EntitySheep.fleeceColorTable[j][0], brightness * EntitySheep.fleeceColorTable[j][1], brightness * EntitySheep.fleeceColorTable[j][2]);
 
diff --git a/src/main/java/net/minecraft/client/render/model/ModelWolf.java b/src/main/java/net/minecraft/client/render/model/ModelWolf.java
index b41ec8e0a..4421ca952 100644
--- a/src/main/java/net/minecraft/client/render/model/ModelWolf.java
+++ b/src/main/java/net/minecraft/client/render/model/ModelWolf.java
@@ -1,6 +1,7 @@
 package net.minecraft.client.render.model;
 
 import net.minecraft.client.Minecraft;
+import net.minecraft.core.Global;
 import net.minecraft.core.entity.EntityLiving;
 import net.minecraft.core.entity.animal.EntityWolf;
 import net.minecraft.core.util.helper.MathHelper;
@@ -124,7 +125,7 @@ public class ModelWolf extends ModelBase
         if(entitywolf.getWolfShaking())
         {
             float brightness = entitywolf.getBrightness(partialTick);
-            if (Minecraft.getMinecraft(this).fullbright) brightness = 1.0f;
+            if (Global.accessor.isFullbrightEnabled()) brightness = 1.0f;
             float f4 = brightness * entitywolf.getShadingWhileShaking(partialTick);
             GL11.glColor3f(f4, f4, f4);
         }
diff --git a/src/main/java/net/minecraft/client/render/tessalator/TessellatorStandard.java b/src/main/java/net/minecraft/client/render/tessalator/TessellatorStandard.java
index da405a480..98896a081 100644
--- a/src/main/java/net/minecraft/client/render/tessalator/TessellatorStandard.java
+++ b/src/main/java/net/minecraft/client/render/tessalator/TessellatorStandard.java
@@ -176,6 +176,7 @@ public class TessellatorStandard extends Tessellator
             hasNormals = false;
             hasColor = false;
             hasTexture = false;
+            hasLightmap = false;
             isColorDisabled = false;
         }
     }
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java b/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java
index aa159027a..e4fa63ce9 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java
+++ b/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererFlowerJar.java
@@ -6,6 +6,7 @@ import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.block.model.BlockModelDispatcher;
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.stitcher.TextureRegistry;
+import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.entity.TileEntityFlowerJar;
 import net.minecraft.core.world.World;
@@ -29,7 +30,7 @@ public class TileEntityRendererFlowerJar extends TileEntityRenderer<TileEntityFl
             GL11.glScalef(scaleValue, scaleValue, scaleValue);
             GL11.glTranslatef(0.66F, 0.75F, 0.66F);
             float lightLevel = Minecraft.getMinecraft(this).theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
-            if (Minecraft.getMinecraft(this).fullbright) lightLevel = 1.0f;
+            if (Global.accessor.isFullbrightEnabled()) lightLevel = 1.0f;
             BlockModel.setRenderBlocks(renderBlocks);
             BlockModelDispatcher.getInstance().getDispatch(block).renderBlockOnInventory(tessellator, 0, lightLevel);
         }
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java b/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java
index 4e6926f9d..82b6332b3 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java
+++ b/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererMesh.java
@@ -7,6 +7,7 @@ import net.minecraft.client.render.block.model.BlockModel;
 import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.tessalator.Tessellator;
 import net.minecraft.client.render.tessalator.TessellatorStandard;
+import net.minecraft.core.Global;
 import net.minecraft.core.block.entity.TileEntityMeshGold;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.World;
@@ -25,7 +26,7 @@ public class TileEntityRendererMesh extends TileEntityRenderer<TileEntityMeshGol
         GL11.glTranslatef((float) x + 0.5f, (float) y + bobbingOffset + 0.25f, (float) z + 0.5f);
 
         float lightLevel = Minecraft.getMinecraft(this).theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
-        if (Minecraft.getMinecraft(this).fullbright) lightLevel = 1.0f;
+        if (Global.accessor.isFullbrightEnabled()) lightLevel = 1.0f;
         BlockModel.setRenderBlocks(EntityRenderDispatcher.instance.itemRenderer.renderBlocksInstance);
         GL11.glEnable(32826 /*GL_RESCALE_NORMAL_EXT*/);
         ItemModelDispatcher.getInstance().getDispatch(tileEntity.filterItem).renderAsItemEntity(TessellatorStandard.instance, null, tileEntity.worldObj.rand, tileEntity.filterItem, 1, f3, lightLevel, renderPartialTicks);
diff --git a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java b/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
index 87042fdd4..4f8801ad8 100644
--- a/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
+++ b/src/main/java/net/minecraft/client/render/tileentity/TileEntityRendererSign.java
@@ -18,6 +18,8 @@ import org.lwjgl.opengl.GL11;
 public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
 {
 
+	private final Minecraft mc = Minecraft.getMinecraft(this);
+	
     public TileEntityRendererSign()
     {
         signModel = new ModelSign();
@@ -80,7 +82,7 @@ public class TileEntityRendererSign extends TileEntityRenderer<TileEntitySign>
         GL11.glPopMatrix();
         
         // Render text
-        float lightLevel = Minecraft.getMinecraft(this).theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
+        float lightLevel = mc.theWorld.getLightBrightness(tileEntity.x, tileEntity.y, tileEntity.z);
         
         GL11.glPushMatrix();
         f4 = 0.01666667F * scale;
diff --git a/src/main/java/net/minecraft/client/util/helper/Colors.java b/src/main/java/net/minecraft/client/util/helper/Colors.java
index b9d520cab..a0c46dd94 100644
--- a/src/main/java/net/minecraft/client/util/helper/Colors.java
+++ b/src/main/java/net/minecraft/client/util/helper/Colors.java
@@ -7,11 +7,12 @@ import java.io.InputStream;
 import javax.imageio.ImageIO;
 
 import net.minecraft.client.Minecraft;
-import net.minecraft.client.render.texturepack.TexturePack;
 import net.minecraft.core.util.helper.Color;
 
 public abstract class Colors {
 	
+	private static Minecraft mc = Minecraft.getMinecraft(Colors.class);
+	
 	public static final Color[] allChatColors = new Color[16];
 	public static final Color[] allPlankColors = new Color[16];
 	public static final Color[] allLampColors = new Color[16];
@@ -30,7 +31,7 @@ public abstract class Colors {
 	
 	public static void fillColorArray(String path, Color[] colors) {
 		try {
-			InputStream stream = Minecraft.getMinecraft(Colors.class).texturePackList.getResourceAsStream(path);
+			InputStream stream = mc.texturePackList.getResourceAsStream(path);
 			BufferedImage image = ImageIO.read(stream);
 			stream.close();
 			fillColorArray(colors, image);
diff --git a/src/main/java/net/minecraft/core/block/Block.java b/src/main/java/net/minecraft/core/block/Block.java
index c2bbff2fe..de85fed6c 100644
--- a/src/main/java/net/minecraft/core/block/Block.java
+++ b/src/main/java/net/minecraft/core/block/Block.java
@@ -1050,15 +1050,15 @@ public class Block
     public static final Block algae = new BlockAlgae("algae", 324, Material.plant).withHardness(0.0F).withLitInteriorSurface(true)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLACE_OVERWRITES, BlockTags.SHEARS_DO_SILK_TOUCH);
 
-    public static final Block flowerYellow = new BlockFlower("flower.yellow", 330).setKilledByWeather().withHardness(0.0F)
+    public static final Block flowerYellow = new BlockFlower("flower.yellow", 330).setKilledByWeather().setBonemealable().withHardness(0.0F)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerRed = new BlockFlower("flower.red", 331).setKilledByWeather().withHardness(0.0F)
+    public static final Block flowerRed = new BlockFlower("flower.red", 331).setKilledByWeather().setBonemealable().withHardness(0.0F)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerPink = new BlockFlower("flower.pink", 332).setKilledByWeather().withHardness(0.0F)
+    public static final Block flowerPink = new BlockFlower("flower.pink", 332).setKilledByWeather().setBonemealable().withHardness(0.0F)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerPurple = new BlockFlower("flower.purple", 333).setKilledByWeather().withHardness(0.0F)
+    public static final Block flowerPurple = new BlockFlower("flower.purple", 333).setKilledByWeather().setBonemealable().withHardness(0.0F)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
-    public static final Block flowerLightBlue = new BlockFlower("flower.lightblue", 334).setKilledByWeather().withHardness(0.0F)
+    public static final Block flowerLightBlue = new BlockFlower("flower.lightblue", 334).setKilledByWeather().setBonemealable().withHardness(0.0F)
             .withTags(BlockTags.BROKEN_BY_FLUIDS, BlockTags.PLANTABLE_IN_JAR);
 
     public static final Block mushroomBrown = new BlockMushroom("mushroom.brown", 340).withHardness(0.0F).withLightEmission(0.125F)
diff --git a/src/main/java/net/minecraft/core/block/BlockFlower.java b/src/main/java/net/minecraft/core/block/BlockFlower.java
index d371b0fbf..4852eefa9 100644
--- a/src/main/java/net/minecraft/core/block/BlockFlower.java
+++ b/src/main/java/net/minecraft/core/block/BlockFlower.java
@@ -1,5 +1,9 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.item.IBonemealable;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.enums.EnumDropCause;
@@ -13,11 +17,12 @@ import java.util.Random;
 //            Block, Material, World, BlockGrass, 
 //            AxisAlignedBB
 
-public class BlockFlower extends Block
+public class BlockFlower extends Block implements IBonemealable
 {
 
 	public boolean killedByWeather = false;
-	
+	public boolean canBeBonemealed = false;
+
 	public BlockFlower(String key, int id)
     {
         super(key, id, Material.plant);
@@ -26,11 +31,16 @@ public class BlockFlower extends Block
         setBlockBounds(0.5F - f, 0.0F, 0.5F - f, 0.5F + f, f * 3F, 0.5F + f);
     }
     
-    public Block setKilledByWeather()
+    public BlockFlower setKilledByWeather()
     {
     	killedByWeather = true;
     	return this;
     }
+    public BlockFlower setBonemealable()
+    {
+        canBeBonemealed = true;
+        return this;
+    }
 
     @Override
 	public boolean canPlaceBlockAt(World world, int x, int y, int z)
@@ -95,4 +105,44 @@ public class BlockFlower extends Block
         return false;
     }
 
+    @Override
+    public boolean onBonemealUsed(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+        Random rand = world.rand;
+        if(!world.isClientSide && canBeBonemealed)
+        {
+            if (entityplayer.getGamemode().consumeBlocks())
+            {
+                itemstack.stackSize--;
+            }
+            label0:
+            for(int j1 = 0; j1 < 128; j1++)
+            {
+                int k1 = blockX;
+                int l1 = blockY;
+                int i2 = blockZ;
+                for(int j2 = 0; j2 < j1 / 16; j2++)
+                {
+                    k1 += rand.nextInt(3) - 1;
+                    l1 += ((rand.nextInt(3) - 1) * rand.nextInt(3)) / 2;
+                    i2 += rand.nextInt(3) - 1;
+                    int id1 = world.getBlockId(k1, l1 - 1, i2);
+                    if(Block.blocksList[id1] == null || !Block.blocksList[id1].hasTag(BlockTags.GROWS_FLOWERS))
+                    {
+                        continue label0;
+                    }
+                }
+
+                if(world.getBlockId(k1, l1, i2) != 0)
+                {
+                    continue;
+                }
+                if(rand.nextFloat() > 0.75)
+                {
+                    world.setBlockWithNotify(k1, l1, i2, id);
+                }
+            }
+            return true;
+        }
+        return canBeBonemealed;
+    }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockGlowStone.java b/src/main/java/net/minecraft/core/block/BlockGlowStone.java
index 173b93f7a..09d18b186 100644
--- a/src/main/java/net/minecraft/core/block/BlockGlowStone.java
+++ b/src/main/java/net/minecraft/core/block/BlockGlowStone.java
@@ -6,6 +6,7 @@ import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.WorldSource;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Item, Material
@@ -30,4 +31,9 @@ public class BlockGlowStone extends Block
                 return new ItemStack[] { new ItemStack(Item.dustGlowstone, 2 + world.rand.nextInt(2)) };
         }
     }
+    
+    @Override
+    public float getAmbientOcclusionStrength(WorldSource blockAccess, int x, int y, int z) {
+    	return 0.0f;
+    }
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockGrass.java b/src/main/java/net/minecraft/core/block/BlockGrass.java
index 2df3323fe..d0317fe91 100644
--- a/src/main/java/net/minecraft/core/block/BlockGrass.java
+++ b/src/main/java/net/minecraft/core/block/BlockGrass.java
@@ -11,6 +11,8 @@ import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biome;
+import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.noise.ImprovedNoise;
 
 // Referenced classes of package net.minecraft.src:
@@ -61,6 +63,15 @@ public class BlockGrass extends Block
                     idToSpawn = Block.flowerRed.id;
                 } else if (r < 41) {
                     idToSpawn = Block.flowerYellow.id;
+                } else if (r < 60) {
+                    Biome biome = world.getBlockBiome(x, y + 1, z);
+                    if (biome == Biomes.OVERWORLD_BIRCH_FOREST || biome == Biomes.OVERWORLD_SEASONAL_FOREST){
+                        idToSpawn = Block.flowerPink.id;
+                    } else if (biome == Biomes.OVERWORLD_MEADOW || biome == Biomes.OVERWORLD_BOREAL_FOREST || biome == Biomes.OVERWORLD_SHRUBLAND) {
+                        idToSpawn = Block.flowerPurple.id;
+                    } else if (biome == Biomes.OVERWORLD_FOREST || biome == Biomes.OVERWORLD_SWAMPLAND || biome == Biomes.OVERWORLD_RAINFOREST || biome == Biomes.OVERWORLD_GRASSLANDS || biome == Biomes.OVERWORLD_CAATINGA) {
+                        idToSpawn = Block.flowerLightBlue.id;
+                    }
                 } else {
                     if(rand.nextInt(8) == 0) {
                         idToSpawn = Block.tallgrassFern.id;
diff --git a/src/main/java/net/minecraft/core/block/BlockLeavesBase.java b/src/main/java/net/minecraft/core/block/BlockLeavesBase.java
index dc177788e..8e0b0207d 100644
--- a/src/main/java/net/minecraft/core/block/BlockLeavesBase.java
+++ b/src/main/java/net/minecraft/core/block/BlockLeavesBase.java
@@ -188,8 +188,9 @@ public abstract class BlockLeavesBase extends Block
     
     @Override
     public float getAmbientOcclusionStrength(WorldSource blockAccess, int x, int y, int z) {
-    	return 1.0f;
+    	return enableTreeShadowing ? 0.8f : 0.0f;
     }
 
+    public static boolean enableTreeShadowing = false;
     int[] adjacentTreeBlocks;
 }
diff --git a/src/main/java/net/minecraft/core/block/BlockMud.java b/src/main/java/net/minecraft/core/block/BlockMud.java
index 142598a1c..ba6819318 100644
--- a/src/main/java/net/minecraft/core/block/BlockMud.java
+++ b/src/main/java/net/minecraft/core/block/BlockMud.java
@@ -162,12 +162,13 @@ public class BlockMud extends Block{
     @Override
     public void updateTick(final World world, final int x, final int y, final int z, final Random rand)
     {
-        tryToFall(world, x, y, z);
         // dry out mud
         if(isHardened) {
             if(!isLavaNearby(world, x, y, z)) {
                 if (canBecomeWet(world, x, y, z)) {
                     world.setBlock(x, y, z, Block.mud.id);
+                    world.notifyBlockChange(x, y, z, Block.mud.id);
+                    return;
                 }
             }
         }
@@ -180,8 +181,11 @@ public class BlockMud extends Block{
                     world.spawnParticle("largesmoke", (double)x + Math.random(), (double)y + Math.random(), (double)z + Math.random(), 0.0D, 0.0D, 0.0D);
                 }
                 world.setBlock(x, y, z, Block.mudBaked.id);
+                world.notifyBlockChange(x, y, z, Block.mudBaked.id);
+                return;
             }
         }
+        tryToFall(world, x, y, z);
     }
 
 
diff --git a/src/main/java/net/minecraft/core/block/BlockStairs.java b/src/main/java/net/minecraft/core/block/BlockStairs.java
index ea26a6f61..bcae219a6 100644
--- a/src/main/java/net/minecraft/core/block/BlockStairs.java
+++ b/src/main/java/net/minecraft/core/block/BlockStairs.java
@@ -302,6 +302,11 @@ public class BlockStairs extends Block
 
         world.setBlockMetadataWithNotify(x, y, z, meta);
     }
+    
+    @Override
+    public float getAmbientOcclusionStrength(WorldSource blockAccess, int x, int y, int z) {
+    	return 0.0f;
+    }
 
     public Block modelBlock;
 }
diff --git a/src/main/java/net/minecraft/core/entity/Entity.java b/src/main/java/net/minecraft/core/entity/Entity.java
index 3e6853b5e..1817e7995 100644
--- a/src/main/java/net/minecraft/core/entity/Entity.java
+++ b/src/main/java/net/minecraft/core/entity/Entity.java
@@ -9,6 +9,7 @@ import com.mojang.nbt.FloatTag;
 import com.mojang.nbt.ListTag;
 
 import net.minecraft.client.gui.guidebook.mobs.MobInfoRegistry;
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.core.Global;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.BlockFluid;
@@ -16,6 +17,7 @@ import net.minecraft.core.block.material.Material;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
+import net.minecraft.core.enums.LightLayer;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.lang.I18n;
 import net.minecraft.core.util.helper.DamageType;
@@ -799,6 +801,17 @@ public abstract class Entity
             return entityBrightness;
         }
     }
+    
+    public int getLightmapCoord(float partialTicks) {
+    	int blockX = MathHelper.floor_double(x);
+    	int blockY = MathHelper.floor_double(y);
+    	int blockZ = MathHelper.floor_double(z);
+    	
+    	int skylight = world.getSavedLightValue(LightLayer.Sky, blockX, blockY, blockZ);
+    	int blocklight = world.getSavedLightValue(LightLayer.Block, blockX, blockY, blockZ);
+    	
+    	return LightmapHelper.getLightmapCoord(skylight, blocklight);
+    }
 
     public void setWorld(World world)
     {
diff --git a/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java b/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java
index a4efec458..973776d4a 100644
--- a/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java
+++ b/src/main/java/net/minecraft/core/entity/player/EntityPlayer.java
@@ -560,6 +560,7 @@ public abstract class EntityPlayer extends EntityLiving
     }
 
     public void displayGUIMobSpawnerPicker(int x, int y, int z) { }
+    public void displayGUIWandMonsterPicker(ItemStack stack) { }
 
     public void onItemPickup(Entity entity, int i)
     {
diff --git a/src/main/java/net/minecraft/core/item/IBonemealable.java b/src/main/java/net/minecraft/core/item/IBonemealable.java
index 68c3b6767..0e2bc51ad 100644
--- a/src/main/java/net/minecraft/core/item/IBonemealable.java
+++ b/src/main/java/net/minecraft/core/item/IBonemealable.java
@@ -1,6 +1,5 @@
 package net.minecraft.core.item;
 
-import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
diff --git a/src/main/java/net/minecraft/core/item/Item.java b/src/main/java/net/minecraft/core/item/Item.java
index 1e9991be0..3086c9d15 100644
--- a/src/main/java/net/minecraft/core/item/Item.java
+++ b/src/main/java/net/minecraft/core/item/Item.java
@@ -427,6 +427,7 @@ public class Item
     public static Item doorGlass = (new ItemDoor("door.glass", 16533, Block.doorGlassBottom, Block.doorGlassTop));
     public static Item rope = new ItemRope("rope", 16534, Block.rope);
     public static Item foodPumpkinPie = (new ItemPlaceable("food.pumpkin_pie", 16535, Block.pumpkinPie)).setMaxStackSize(1);
+    public static Item wandMonsterSpawner = (new ItemWandSpawner("wand.monster", 16536)).setMaxStackSize(1);
 
 
     public static int highestItemId = 0;
diff --git a/src/main/java/net/minecraft/core/item/ItemDye.java b/src/main/java/net/minecraft/core/item/ItemDye.java
index a542d6d28..128d44818 100644
--- a/src/main/java/net/minecraft/core/item/ItemDye.java
+++ b/src/main/java/net/minecraft/core/item/ItemDye.java
@@ -11,6 +11,8 @@ import net.minecraft.core.entity.player.EntityPlayer;
 import net.minecraft.core.net.command.TextFormatting;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import net.minecraft.core.world.biome.Biome;
+import net.minecraft.core.world.biome.Biomes;
 import net.minecraft.core.world.type.WorldTypes;
 
 public class ItemDye extends Item
@@ -125,18 +127,23 @@ label0:
                                     world.getBlockId(k1, l1-1, i2) == Block.dirtScorchedRich.id)
                                 world.setBlockWithNotify(k1, l1, i2, Block.spinifex.id);
                             else
-                            world.setBlockWithNotify(k1, l1, i2, Block.tallgrass.id);
+                                world.setBlockWithNotify(k1, l1, i2, Block.tallgrass.id);
                             continue;
                         }
-                        if(itemRand.nextInt(3) != 0)
-                        {
+                        int r = itemRand.nextInt(10);
+                        Biome biome = world.getBlockBiome(k1, l1, i2);
+                        if (r < 1){
                             world.setBlockWithNotify(k1, l1, i2, Block.flowerYellow.id);
-                        } else
-                        {
+                        } else if (r < 2) {
                             world.setBlockWithNotify(k1, l1, i2, Block.flowerRed.id);
+                        } else if (r < 4 && (biome == Biomes.OVERWORLD_BIRCH_FOREST || biome == Biomes.OVERWORLD_SEASONAL_FOREST)) {
+                            world.setBlockWithNotify(k1, l1, i2, Block.flowerPink.id);
+                        } else if (r < 6 && (biome == Biomes.OVERWORLD_MEADOW || biome == Biomes.OVERWORLD_BOREAL_FOREST || biome == Biomes.OVERWORLD_SHRUBLAND)) {
+                            world.setBlockWithNotify(k1, l1, i2, Block.flowerPurple.id);
+                        } else if (r < 8 && (biome == Biomes.OVERWORLD_FOREST || biome == Biomes.OVERWORLD_SWAMPLAND || biome == Biomes.OVERWORLD_RAINFOREST || biome == Biomes.OVERWORLD_GRASSLANDS || biome == Biomes.OVERWORLD_CAATINGA)) {
+                            world.setBlockWithNotify(k1, l1, i2, Block.flowerLightBlue.id);
                         }
                     }
-
                 }
                 return true;
             }
diff --git a/src/main/java/net/minecraft/core/item/ItemWandSpawner.java b/src/main/java/net/minecraft/core/item/ItemWandSpawner.java
new file mode 100644
index 000000000..70e0fc930
--- /dev/null
+++ b/src/main/java/net/minecraft/core/item/ItemWandSpawner.java
@@ -0,0 +1,47 @@
+package net.minecraft.core.item;
+
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.EntityDispatcher;
+import net.minecraft.core.entity.player.EntityPlayer;
+import net.minecraft.core.player.gamemode.Gamemode;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+
+public class ItemWandSpawner extends Item{
+    public ItemWandSpawner(String name, int id) {
+        super(name, id);
+    }
+    @Override
+    public ItemStack onItemRightClick(ItemStack itemstack, World world, EntityPlayer entityplayer)
+    {
+        if (entityplayer.gamemode != Gamemode.creative){
+            entityplayer.sendTranslatedChatMessage("wand.wrongmode");
+            return itemstack;
+        }
+        entityplayer.displayGUIWandMonsterPicker(itemstack);
+
+        return itemstack;
+    }
+
+    @Override
+    public boolean onItemUse(ItemStack itemstack, EntityPlayer entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    {
+        if (entityplayer.gamemode != Gamemode.creative){
+            entityplayer.sendTranslatedChatMessage("wand.wrongmode");
+            return false;
+        }
+        if (!world.isClientSide){
+            String id = itemstack.getData().getString("monster");
+            if (id == null || id.isEmpty()){
+                id = "Pig";
+            }
+            Entity entity = EntityDispatcher.createEntityInWorld(id, world);
+            if (entity != null){
+                entity.setPos(blockX + side.getOffsetX() + 0.5f, blockY + side.getOffsetY(), blockZ + side.getOffsetZ() + 0.5f);
+                entity.spawnInit();
+                world.entityJoinedWorld(entity);
+            }
+        }
+        return true;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/sound/BlockSounds.java b/src/main/java/net/minecraft/core/sound/BlockSounds.java
index c3ac8f167..149c96e10 100644
--- a/src/main/java/net/minecraft/core/sound/BlockSounds.java
+++ b/src/main/java/net/minecraft/core/sound/BlockSounds.java
@@ -10,7 +10,7 @@ public abstract class BlockSounds
     public static final BlockSound METAL = new BlockSound("step.stone", "step.stone", 1.0F, 1.5F);
     public static final BlockSound GLASS = new BlockSound("step.stone", "random.glass", 1.0F, 1.0F);
     public static final BlockSound CLOTH = new BlockSound("step.cloth", "step.cloth", 1.0F, 1.0F);
-    public static final BlockSound SAND = new BlockSound("step.sand", "step.gravel", 1.0F, 1.0F);
+    public static final BlockSound SAND = new BlockSound("step.sand", "step.sand", 1.0F, 1.0F);
     public static final BlockSound FIRE = new BlockSound("", "random.fizz", 0.5F, 2.6F);
 
 }
diff --git a/src/main/java/net/minecraft/core/world/World.java b/src/main/java/net/minecraft/core/world/World.java
index 39c84d7c1..7df0318d5 100644
--- a/src/main/java/net/minecraft/core/world/World.java
+++ b/src/main/java/net/minecraft/core/world/World.java
@@ -1095,6 +1095,22 @@ public class World implements WorldSource {
 		int skyLight = getSavedLightValue(LightLayer.Sky, x, y, z);
 		int blockLight = Math.max(getSavedLightValue(LightLayer.Block, x, y, z), blockLightValue);
 		
+		if(getBlockLitInteriorSurface(x, y, z)) {
+			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y + 1, z));
+			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y - 1, z));
+			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x + 1, y, z));
+			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x - 1, y, z));
+			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y, z + 1));
+			skyLight = Math.max(skyLight, getSavedLightValue(LightLayer.Sky, x, y, z - 1));
+			
+			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y + 1, z));
+			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y - 1, z));
+			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x + 1, y, z));
+			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x - 1, y, z));
+			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y, z + 1));
+			blockLight = Math.max(blockLight, getSavedLightValue(LightLayer.Block, x, y, z - 1));
+		}
+		
 		return LightmapHelper.getLightmapCoord(skyLight, blockLight);
     }
 
diff --git a/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java b/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
index 712560b4a..86b6079a2 100644
--- a/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
+++ b/src/main/java/net/minecraft/core/world/chunk/ChunkCache.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.world.chunk;
 
+import net.minecraft.client.render.LightmapHelper;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.entity.TileEntity;
 import net.minecraft.core.block.material.Material;
@@ -114,7 +115,23 @@ public class ChunkCache
 		int skyLight = worldObj.getSavedLightValue(LightLayer.Sky, x, y, z);
 		int blockLight = Math.max(worldObj.getSavedLightValue(LightLayer.Block, x, y, z), blockLightValue);
 		
-		return skyLight << 20 | blockLight << 4;
+		if(getBlockLitInteriorSurface(x, y, z)) {
+			skyLight = Math.max(skyLight, worldObj.getSavedLightValue(LightLayer.Sky, x, y + 1, z));
+			skyLight = Math.max(skyLight, worldObj.getSavedLightValue(LightLayer.Sky, x, y - 1, z));
+			skyLight = Math.max(skyLight, worldObj.getSavedLightValue(LightLayer.Sky, x + 1, y, z));
+			skyLight = Math.max(skyLight, worldObj.getSavedLightValue(LightLayer.Sky, x - 1, y, z));
+			skyLight = Math.max(skyLight, worldObj.getSavedLightValue(LightLayer.Sky, x, y, z + 1));
+			skyLight = Math.max(skyLight, worldObj.getSavedLightValue(LightLayer.Sky, x, y, z - 1));
+			
+			blockLight = Math.max(blockLight, worldObj.getSavedLightValue(LightLayer.Block, x, y + 1, z));
+			blockLight = Math.max(blockLight, worldObj.getSavedLightValue(LightLayer.Block, x, y - 1, z));
+			blockLight = Math.max(blockLight, worldObj.getSavedLightValue(LightLayer.Block, x + 1, y, z));
+			blockLight = Math.max(blockLight, worldObj.getSavedLightValue(LightLayer.Block, x - 1, y, z));
+			blockLight = Math.max(blockLight, worldObj.getSavedLightValue(LightLayer.Block, x, y, z + 1));
+			blockLight = Math.max(blockLight, worldObj.getSavedLightValue(LightLayer.Block, x, y, z - 1));
+		}
+		
+		return LightmapHelper.getLightmapCoord(skyLight, blockLight);
 	}
 
     @Override
diff --git a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
index 453ba9673..500c7c9df 100644
--- a/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
+++ b/src/main/java/net/minecraft/core/world/generate/chunk/perlin/overworld/SurfaceGeneratorOverworld.java
@@ -162,6 +162,12 @@ public class SurfaceGeneratorOverworld
                                 topBlock = (short) Block.sand.id;
                                 fillerBlock = (short) Block.sand.id;
                             }
+                        } else if (y <= oceanY) {
+                            if(biome == Biomes.OVERWORLD_CAATINGA || biome == Biomes.OVERWORLD_SWAMPLAND || biome == Biomes.OVERWORLD_SWAMPLAND_MUDDY) // Make mud under the ocean always be regular mud
+                            {
+                                topBlock = (short) Block.mud.id;
+                                fillerBlock = (short) Block.mud.id;
+                            }
                         }
 
                         //failsafe so that if a basin is generated under the ocean, the ocean is not replaced with air
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancy.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancy.java
index 95f58d6bd..509a2e260 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancy.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/WorldFeatureTreeFancy.java
@@ -15,6 +15,25 @@ public class WorldFeatureTreeFancy extends WorldFeature
 {
 	protected int leavesID;
 	protected int logID;
+
+    static final byte[] dimensionLookup = {
+        2, 0, 0, 1, 2, 1
+    };
+    Random treeRand;
+    World worldObj;
+    int[] pos = { 0, 0, 0 };
+    int height;
+    int trunkHeight;
+    double trunkHeightScale;
+    double field_875_h;
+    double branchSlope;
+    double field_873_j;
+    double field_872_k;
+    int trunkThickness;
+    int trunkHeightVariance;
+    int leavesHeight;
+    int[][] foliageCoords;
+    int heightMod;
 	
     public WorldFeatureTreeFancy(int leavesID, int logID)
     {
@@ -27,7 +46,7 @@ public class WorldFeatureTreeFancy extends WorldFeature
         height = 0;
         trunkHeightScale = 0.6D;
         field_875_h = 1.0D;
-        field_874_i = 0.4D;
+        branchSlope = 0.4D;
         field_873_j = 1.0D;
         field_872_k = 1.0D;
         trunkThickness = 1;
@@ -38,134 +57,120 @@ public class WorldFeatureTreeFancy extends WorldFeature
         this.heightMod = heightMod;
     }
 
-    void generateBranchPoints()
+    void prepare()
     {
         trunkHeight = (int)((double) height * trunkHeightScale);
-        if(trunkHeight >= height)
+        if (trunkHeight >= height)
         {
             trunkHeight = height - 1;
         }
-        int numBranchPoints = (int)(1.4D + Math.pow((field_872_k * (double) height) / 13D, 2D));
-        if(numBranchPoints < 1)
-        {
-            numBranchPoints = 1;
-        }
-        int[][] branchPoints = new int[numBranchPoints * height][4];
-        int highestBranchY = (basePos[1] + height) - leavesHeight;
-        int branchIndex = 1;
-        int trunkTop = basePos[1] + trunkHeight;
-        int dy = highestBranchY - basePos[1];
-        branchPoints[0][0] = basePos[0];
-        branchPoints[0][1] = highestBranchY;
-        branchPoints[0][2] = basePos[2];
-        branchPoints[0][3] = trunkTop;
-        highestBranchY--;
-        while(dy >= 0)
-        {
-            float f = func_528_a(dy);
-            if(f < 0.0F)
-            {
-                highestBranchY--;
-                dy--;
-            }
-            else
-            {
-                double d = 0.5D;
-                for(int j1 = 0; j1 < numBranchPoints; j1++)
-                {
-                    double branchRadius = field_873_j * ((double)f * ((double) treeRand.nextFloat() + 0.328D));
-                    double branchAngle = (double) treeRand.nextFloat() * 2D * Math.PI;
-                    int branchX = MathHelper.floor_double(branchRadius * Math.sin(branchAngle) + (double)basePos[0] + d);
-                    int branchZ = MathHelper.floor_double(branchRadius * Math.cos(branchAngle) + (double)basePos[2] + d);
-                    int[] branchEnd = { branchX, highestBranchY, branchZ };
-                    int[] branchTopOfTree = { branchX, highestBranchY + leavesHeight, branchZ };
-                    if(drawLineAndStopIfInterrupted(branchEnd, branchTopOfTree) != -1)
-                    {
+        int numOfClustersPerY = (int)(1.4D + Math.pow((field_872_k * (double) height) / 13D, 2D));
+        if (numOfClustersPerY < 1)
+        {
+            numOfClustersPerY = 1;
+        }
+        int[][] foliageCoords = new int[numOfClustersPerY * height][4];
+        int yEnd = (pos[1] + height) - leavesHeight;
+        int foliageCoordsIndex = 1;
+        int topY = pos[1] + trunkHeight;
+        int y = yEnd - pos[1];
+        foliageCoords[0][0] = pos[0];
+        foliageCoords[0][1] = yEnd;
+        foliageCoords[0][2] = pos[2];
+        foliageCoords[0][3] = topY;
+        yEnd--;
+        while (y >= 0) {
+            float shapeFac = shapeFunc(y);
+            if (shapeFac < 0.0F) {
+                yEnd--;
+                y--;
+            } else {
+                double offset = 0.5D;
+                for (int i = 0; i < numOfClustersPerY; i++) {
+                    double r = field_873_j * ((double)shapeFac * ((double) treeRand.nextFloat() + 0.328D));
+                    double theta = (double) treeRand.nextFloat() * 2D * Math.PI;
+                    int x = MathHelper.floor_double(r * Math.sin(theta) + (double) pos[0] + offset);
+                    int z = MathHelper.floor_double(r * Math.cos(theta) + (double) pos[2] + offset);
+                    int[] branchEnd = { x, yEnd, z };
+                    int[] branchTopOfTree = { x, yEnd + leavesHeight, z };
+                    if (distToMat(branchEnd, branchTopOfTree) != -1) {
                         continue;
                     }
-                    int[] branchStart = { basePos[0], basePos[1], basePos[2] };
-                    double branchLength = Math.sqrt(Math.pow(Math.abs(basePos[0] - branchEnd[0]), 2D) + Math.pow(Math.abs(basePos[2] - branchEnd[2]), 2D));
-                    double d4 = branchLength * field_874_i;
-                    if((double)branchEnd[1] - d4 > (double)trunkTop)
-                    {
-                        branchStart[1] = trunkTop;
+                    int[] branchStart = { pos[0], pos[1], pos[2] };
+                    double dist = Math.sqrt(Math.pow(Math.abs(pos[0] - branchEnd[0]), 2D) + Math.pow(Math.abs(pos[2] - branchEnd[2]), 2D));
+                    if ((double)branchEnd[1] - dist * branchSlope > (double)topY) {
+                        branchStart[1] = topY;
                     }
-                    else
-                    {
-                        branchStart[1] = (int)((double)branchEnd[1] - d4);
+                    else {
+                        branchStart[1] = (int)((double)branchEnd[1] - dist * branchSlope);
                     }
-                    if(drawLineAndStopIfInterrupted(branchStart, branchEnd) == -1)
-                    {
-                        branchPoints[branchIndex][0] = branchX;
-                        branchPoints[branchIndex][1] = highestBranchY;
-                        branchPoints[branchIndex][2] = branchZ;
-                        branchPoints[branchIndex][3] = branchStart[1];
-                        branchIndex++;
+                    if(distToMat(branchStart, branchEnd) == -1) {
+                        foliageCoords[foliageCoordsIndex][0] = x;
+                        foliageCoords[foliageCoordsIndex][1] = yEnd;
+                        foliageCoords[foliageCoordsIndex][2] = z;
+                        foliageCoords[foliageCoordsIndex][3] = branchStart[1];
+                        foliageCoordsIndex++;
                     }
                 }
 
-                highestBranchY--;
-                dy--;
+                yEnd--;
+                y--;
             }
         }
-        this.branchPoints = new int[branchIndex][4];
-        System.arraycopy(branchPoints, 0, this.branchPoints, 0, branchIndex);
+        this.foliageCoords = new int[foliageCoordsIndex][4];
+        System.arraycopy(foliageCoords, 0, this.foliageCoords, 0, foliageCoordsIndex);
     }
 
-    void placeLeafCircle(int x, int y, int z, float radius, int blockId)
+    void crossSection(int x, int y, int z, float radius, int blockId)
     {
-        int radiusBlocks = (int)((double)radius + 0.6D);
+        int rad = (int)(radius + 0.618D);
 
-        int[] centrePos = { x, y, z };
-        int[] lookupPos = { 0, 0, 0 };
+        int[] center = { x, y, z };
+        int[] coord = { 0, 0, 0 };
 
-        lookupPos[1] = centrePos[1];
-        for(int dx = -radiusBlocks; dx <= radiusBlocks; dx++)
+        coord[1] = center[1];
+        for(int off1 = -rad; off1 <= rad; off1++)
         {
-            lookupPos[0] = centrePos[0] + dx;
+            coord[0] = center[0] + off1;
 
-            for(int dz = -radiusBlocks; dz <= radiusBlocks; dz++)
+            for(int off2 = -rad; off2 <= rad; off2++)
             {
-                lookupPos[2] = centrePos[2] + dz;
+                coord[2] = center[2] + off2;
 
-                double distance = Math.sqrt(Math.pow((double) Math.abs(dx) + 0.5D, 2D) + Math.pow((double) Math.abs(dz) + 0.5D, 2D));
-                if(distance <= (double)radius)
+                double thisDist = Math.sqrt(Math.pow((double) Math.abs(off1) + 0.5D, 2D) + Math.pow((double) Math.abs(off2) + 0.5D, 2D));
+                if(thisDist <= (double)radius)
                 {
-                    int idAtBlock = worldObj.getBlockId(lookupPos[0], lookupPos[1], lookupPos[2]);
-                    if (idAtBlock == 0 || idAtBlock == leavesID)
+                    int id = worldObj.getBlockId(coord[0], coord[1], coord[2]);
+                    if (id == 0 || id == leavesID)
                     {
-                        worldObj.setBlockWithNotify(lookupPos[0], lookupPos[1], lookupPos[2], blockId);
+                        worldObj.setBlockWithNotify(coord[0], coord[1], coord[2], blockId);
                     }
                 }
             }
         }
     }
 
-    float func_528_a(int i)
+    float shapeFunc(int y)
     {
-        if((double)i < (double)(float) height * 0.3D)
+        if (y < height * 0.3D)
         {
             return -1.618F;
         }
-        float f = (float) height / 2.0F;
-        float f1 = (float) height / 2.0F - (float)i;
-        float f2;
-        if(f1 == 0.0F)
-        {
-            f2 = f;
-        } else
-        if(java.lang.Math.abs(f1) >= f)
-        {
-            f2 = 0.0F;
-        } else
-        {
-            f2 = (float) Math.sqrt(Math.pow(Math.abs(f), 2D) - Math.pow(Math.abs(f1), 2D));
-        }
-        f2 *= 0.5F;
-        return f2;
+        float radius = height / 2.0F;
+        float adj = height / 2.0F - y;
+        float dist;
+        if (adj == 0.0F) {
+            dist = radius;
+        } else if (java.lang.Math.abs(adj) >= radius) {
+            dist = 0.0F;
+        } else {
+            dist = (float) Math.sqrt(Math.pow(Math.abs(radius), 2D) - Math.pow(Math.abs(adj), 2D));
+        }
+        dist *= 0.5F;
+        return dist;
     }
 
-    float getLeavesRadius(int y)
+    float getFoliageShape(int y)
     {
         if(y < 0 || y >= leavesHeight)
         {
@@ -181,27 +186,27 @@ public class WorldFeatureTreeFancy extends WorldFeature
         }
     }
 
-    void placeLeafSphere(int x, int y, int z)
+    void foliageCluster(int x, int y, int z)
     {
         for(int leavesY = y; leavesY < y + leavesHeight; leavesY++)
         {
-            float leavesRadius = getLeavesRadius(leavesY - y);
-            placeLeafCircle(x, leavesY, z, leavesRadius, leavesID);
+            float radius = getFoliageShape(leavesY - y);
+            crossSection(x, leavesY, z, radius, leavesID);
         }
     }
 
-    void placeLeavesAtPoints()
+    void makeFoliage()
     {
-        for (int[] branchPoint : branchPoints)
+        for (int[] foliageCoord : foliageCoords)
         {
-            int x = branchPoint[0];
-            int y = branchPoint[1];
-            int z = branchPoint[2];
-            placeLeafSphere(x, y, z);
+            int x = foliageCoord[0];
+            int y = foliageCoord[1];
+            int z = foliageCoord[2];
+            foliageCluster(x, y, z);
         }
     }
 
-    void placeBranch(int[] startPos, int[] endPos, int blockId)
+    void makeBranch(int[] startPos, int[] endPos, int blockId)
     {
         int[] dimensions = { 0, 0, 0 };
         int dim0 = 0;
@@ -255,45 +260,45 @@ public class WorldFeatureTreeFancy extends WorldFeature
         return (double)i >= (double) height * 0.2D;
     }
 
-    void generateTrunk()
+    void makeTrunk()
     {
-        int x = basePos[0];
-        int minY = basePos[1];
-        int maxY = basePos[1] + trunkHeight;
-        int z = basePos[2];
+        int x = pos[0];
+        int minY = pos[1];
+        int maxY = pos[1] + trunkHeight;
+        int z = pos[2];
         int[] startPos = { x, minY, z };
         int[] endPos = { x, maxY, z };
-        placeBranch(startPos, endPos, logID);
+        makeBranch(startPos, endPos, logID);
         if(trunkThickness == 2)
         {
             startPos[0]++;
             endPos[0]++;
-            placeBranch(startPos, endPos, logID);
+            makeBranch(startPos, endPos, logID);
             startPos[2]++;
             endPos[2]++;
-            placeBranch(startPos, endPos, logID);
+            makeBranch(startPos, endPos, logID);
             startPos[0]--;
             endPos[0]--;
-            placeBranch(startPos, endPos, logID);
+            makeBranch(startPos, endPos, logID);
         }
     }
 
-    void generateBranches()
+    void makeBranches()
     {
-        int[] startPos = { basePos[0], basePos[1], basePos[2] };
-        for (int[] branchPoint : branchPoints)
+        int[] startPos = { pos[0], pos[1], pos[2] };
+        for (int[] branchPoint : foliageCoords)
         {
             int[] endPos = { branchPoint[0], branchPoint[1], branchPoint[2] };
             startPos[1] = branchPoint[3];
-            int dy = startPos[1] - basePos[1];
+            int dy = startPos[1] - pos[1];
             if (isHighEnoughToBranch(dy))
             {
-                placeBranch(startPos, endPos, logID);
+                makeBranch(startPos, endPos, logID);
             }
         }
     }
 
-    int drawLineAndStopIfInterrupted(int[] startPos, int[] endPos)
+    int distToMat(int[] startPos, int[] endPos)
     {
         int[] dimensions = { 0, 0, 0 };
         int dim0 = 0;
@@ -361,14 +366,14 @@ public class WorldFeatureTreeFancy extends WorldFeature
 
     boolean canGenerateTree()
     {
-        int[] bottomPos = { basePos[0], basePos[1], basePos[2] };
-        int[] topPos = { basePos[0], (basePos[1] + height) - 1, basePos[2] };
-        int blockIdUnderneath = worldObj.getBlockId(basePos[0], basePos[1] - 1, basePos[2]);
+        int[] bottomPos = { pos[0], pos[1], pos[2] };
+        int[] topPos = { pos[0], (pos[1] + height) - 1, pos[2] };
+        int blockIdUnderneath = worldObj.getBlockId(pos[0], pos[1] - 1, pos[2]);
         if(!Block.hasTag(blockIdUnderneath, BlockTags.GROWS_TREES))
         {
             return false;
         }
-        int interruptedTrunkHeight = drawLineAndStopIfInterrupted(bottomPos, topPos);
+        int interruptedTrunkHeight = distToMat(bottomPos, topPos);
         if(interruptedTrunkHeight == -1)
         {
             return true;
@@ -402,20 +407,20 @@ public class WorldFeatureTreeFancy extends WorldFeature
         worldObj = world;
         long seed = random.nextLong();
         treeRand.setSeed(seed);
-        basePos[0] = x;
-        basePos[1] = y;
-        basePos[2] = z;
+        pos[0] = x;
+        pos[1] = y;
+        pos[2] = z;
         if(height == 0)
         {
             height = 5 + treeRand.nextInt(trunkHeightVariance);
         }
         if(canGenerateTree())
         {
-            WorldFeatureTree.onTreeGrown(worldObj, basePos[0], basePos[1], basePos[2]);
-            generateBranchPoints();
-            placeLeavesAtPoints();
-            generateTrunk();
-            generateBranches();
+            WorldFeatureTree.onTreeGrown(worldObj, pos[0], pos[1], pos[2]);
+            prepare();
+            makeFoliage();
+            makeTrunk();
+            makeBranches();
             return true;
         }
         else
@@ -423,24 +428,4 @@ public class WorldFeatureTreeFancy extends WorldFeature
             return false;
         }
     }
-
-    static final byte dimensionLookup[] = {
-        2, 0, 0, 1, 2, 1
-    };
-    Random treeRand;
-    World worldObj;
-    int basePos[] = { 0, 0, 0 };
-    int height;
-    int trunkHeight;
-    double trunkHeightScale;
-    double field_875_h;
-    double field_874_i;
-    double field_873_j;
-    double field_872_k;
-    int trunkThickness;
-    int trunkHeightVariance;
-    int leavesHeight;
-    int branchPoints[][];
-    int heightMod;
-
 }
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTree.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTree.java
new file mode 100644
index 000000000..9aef45d9b
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTree.java
@@ -0,0 +1,81 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+import net.minecraft.core.world.generate.feature.WorldFeature;
+
+import java.util.List;
+import java.util.Random;
+
+public abstract class WorldFeatureSpoonerTree
+    extends WorldFeature {
+    protected static int distToMat(double[] coord, double[] vec, List<Integer> matidxlist, World world, boolean invert, double limit) {
+        /* travel from cord along vec and return how far it was to a point of matidx
+         *
+         * the distance is returned in number of iterations. If the edge of the map
+         * is reached, then return the number of iterations as well.
+         * if invert == true, search for anything other than those in matidxlist
+         */
+        double[] curCoord = new double[] { coord[0] + 0.5, coord[1] + 0.5, coord[2] + 0.5 };
+        int iterations = 0;
+        while (true) {
+            int x = (int) Math.floor(curCoord[0]);
+            int y = (int) Math.floor(curCoord[1]);
+            int z = (int) Math.floor(curCoord[2]);
+            int blockId = world.getBlockId(x, y, z);
+            if (matidxlist.contains(blockId) && !invert) {
+                break;
+            } else if (!matidxlist.contains(blockId) && invert) {
+                break;
+            } else {
+                for (int i = 0; i < 3; i++) {
+                    curCoord[i] += vec[i];
+                }
+                iterations++;
+            }
+            if (limit != 0.0 && iterations > limit) {
+                break;
+            }
+        }
+        return iterations;
+    }
+
+    protected static boolean assignValue(int x, int y, int z, int id, int meta, World world) {
+        /* assign a block to the world */
+        return world.setBlockAndMetadata(x, y, z, id, meta);
+    }
+
+    protected final int[] pos;
+    protected final int height;
+    protected final int trunkId;
+    protected final int trunkData;
+    protected final int leavesId;
+    protected final int leavesData;
+
+    protected Random random = null;
+
+    public WorldFeatureSpoonerTree(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        this.pos = new int[] { x, y, z };
+        this.height = height;
+        this.trunkId = trunkId;
+        this.trunkData = trunkData;
+        this.leavesId = leavesId;
+        this.leavesData = leavesData;
+    }
+
+    protected void prepare(World world) { }
+
+    protected void makeTrunk(World world) { }
+
+    protected void makeFoliage(World world) { }
+
+    @Override
+    public boolean generate(World world, Random random, int x, int y, int z) {
+        this.random = random;
+
+        prepare(world);
+        makeFoliage(world);
+        makeTrunk(world);
+
+        return false;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeBamboo.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeBamboo.java
new file mode 100644
index 000000000..143a4c596
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeBamboo.java
@@ -0,0 +1,28 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+
+public class WorldFeatureSpoonerTreeBamboo
+    extends WorldFeatureSpoonerTreeStick {
+    public WorldFeatureSpoonerTreeBamboo(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    @Override
+    /* Set up the foliage for a bamboo tree.
+     * Make foliage sparse and adjacent to the trunk.
+     */
+    protected void makeFoliage(World world) {
+        int start = this.pos[1];
+        int end = this.pos[1] + this.height + 1;
+        for (int y = start; y < end; y++) {
+            for (int i = 0; i < 2; i++) {
+                int xoff = random.nextInt(2) * 2 - 1;
+                int zoff = random.nextInt(2) * 2 - 1;
+                int x = this.pos[0] + xoff;
+                int z = this.pos[2] + zoff;
+                assignValue(x, y, z, this.leavesId, this.leavesData, world);
+            }
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeCone.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeCone.java
new file mode 100644
index 000000000..1aaa6de03
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeCone.java
@@ -0,0 +1,35 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+
+public class WorldFeatureSpoonerTreeCone
+    extends WorldFeatureSpoonerTreeProcedural {
+    public WorldFeatureSpoonerTreeCone(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    @Override
+    protected void prepare(World world) {
+        super.prepare(world);
+        this.branchSlope = 0.15;
+        this.foliageShape = new double[] { 3, 2.6, 2, 1 };
+        this.trunkRadius = this.trunkRadius * 0.618;
+        this.trunkHeight = this.height;
+    }
+
+    @Override
+    protected Double shapeFunc(int y) {
+        Double twigs = super.shapeFunc(y);
+        if (twigs != null) {
+            return twigs;
+        }
+        if (y < this.height * (0.25 + 0.05 * Math.sqrt(random.nextDouble()))) {
+            return null;
+        }
+        double radius = (this.height - y) * 0.382;
+        if (radius < 0) {
+            radius = 0;
+        }
+        return radius;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeMangrove.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeMangrove.java
new file mode 100644
index 000000000..493792162
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeMangrove.java
@@ -0,0 +1,27 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+
+public class WorldFeatureSpoonerTreeMangrove
+    extends WorldFeatureSpoonerTreeRound {
+    public WorldFeatureSpoonerTreeMangrove(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    @Override
+    protected void prepare(World world) {
+        super.prepare(world);
+        this.branchSlope = 1.0;
+        this.trunkRadius = this.trunkRadius * 0.618;
+    }
+
+    @Override
+    protected Double shapeFunc(int y) {
+        Double val = super.shapeFunc(y);
+        if (val == null) {
+            return val;
+        }
+        val = val * 1.618;
+        return val;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeNormal.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeNormal.java
new file mode 100644
index 000000000..958bc8c93
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeNormal.java
@@ -0,0 +1,44 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+
+public class WorldFeatureSpoonerTreeNormal
+    extends WorldFeatureSpoonerTreeStick {
+
+    public WorldFeatureSpoonerTreeNormal(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    @Override
+    /* Set up the foliage for a 'normal' tree.
+     *
+     * This tree will be a single bulb of foliage above a single width trunk.
+     * This shape is very similar to the default Minecraft tree.
+     */
+    protected void makeFoliage(World world) {
+        int topY = this.pos[1] + this.height - 1;
+        int start = topY - 2;
+        int end = topY + 2;
+        for (int y = start; y < end; y++) {
+            int rad;
+            if (y > start + 1) {
+                rad = 1;
+            } else {
+                rad = 2;
+            }
+
+            for (int xoff = -rad; xoff < rad + 1; xoff++) {
+                for (int zoff = -rad; zoff < rad + 1; zoff++) {
+                    if (random.nextDouble() > 0.618 && Math.abs(xoff) == Math.abs(zoff) && Math.abs(xoff) == rad) {
+                        continue;
+                    }
+
+                    int x = this.pos[0] + xoff;
+                    int z = this.pos[2] + zoff;
+
+                    assignValue(x, y, z, this.leavesId, this.leavesData, world);
+                }
+            }
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreePalm.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreePalm.java
new file mode 100644
index 000000000..5c7525d17
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreePalm.java
@@ -0,0 +1,24 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+
+public class WorldFeatureSpoonerTreePalm
+    extends WorldFeatureSpoonerTree {
+
+    public WorldFeatureSpoonerTreePalm(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    @Override
+    protected void makeFoliage(World world) {
+        int y = this.pos[1] + this.height;
+        for (int xoff = -2; xoff < 3; xoff++) {
+            for (int zoff = -2; zoff < 3; zoff++) {
+                int x = this.pos[0] + xoff;
+                int z = this.pos[2] + zoff;
+
+                assignValue(x, y, z, this.leavesId, this.leavesData, world);
+            }
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeProcedural.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeProcedural.java
new file mode 100644
index 000000000..266bdd7fd
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeProcedural.java
@@ -0,0 +1,350 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.util.helper.MathHelper;
+import net.minecraft.core.world.World;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public abstract class WorldFeatureSpoonerTreeProcedural
+    extends WorldFeatureSpoonerTree {
+    protected static double TRUNK_THICKNESS = 1.0;
+    protected static double BRANCH_DENSITY = 1.0;
+    protected static double FOLIAGE_DENSITY = 1.0;
+    protected static double TRUNK_HEIGHT = 0.7;
+    protected static double HEIGHT = 25;
+
+    protected double trunkHeight = 0.0D;
+    protected double trunkRadius = 0.0D;
+    protected double branchDensity = 0.0D;
+    protected double branchSlope = 0.0D;
+    protected double[] foliageShape = null;
+    protected List<int[]> foliageCoords = null;
+
+    public WorldFeatureSpoonerTreeProcedural(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    protected void crossSection(int[] center, double radius, int dirAxis, int id, int data, World world) {
+        int rad = MathHelper.floor_double(radius + 0.618);
+        int secidx1 = (dirAxis + 1) % 3;
+        int secidx2 = (dirAxis + 2) % 3;
+        int[] coord = new int[3];
+        for (int off1 = -rad; off1 < rad + 1; off1++) {
+            for (int off2 = -rad; off2 < rad + 1; off2++) {
+                double thisDist = Math.sqrt(Math.pow(Math.abs(off1) + 0.5, 2) + Math.pow(Math.abs(off2) + 0.5, 2));
+                if (thisDist > radius) {
+                    continue;
+                }
+                int pri = center[dirAxis];
+                int sec1 = center[secidx1] + off1;
+                int sec2 = center[secidx2] + off2;
+                coord[dirAxis] = pri;
+                coord[secidx1] = sec1;
+                coord[secidx2] = sec2;
+                assignValue(coord[0], coord[1], coord[2], id, data, world);
+            }
+        }
+    }
+
+    /*
+     * Take y and return a radius for the location of the foliage cluster.
+     *
+     * If no foliage cluster is to be created, return null
+     */
+    protected Double shapeFunc(int y) {
+        if (random.nextDouble() < 100 / Math.pow(this.height, 2) && y < this.trunkHeight) {
+            return this.height * 0.12;
+        }
+        return null;
+    }
+
+    /* Generate a round cluster of foliage at the location center.
+     *
+     * The shape of the cluster is defined by the array foliageShape.
+     */
+    protected void foliageCluster(int[] center, World world) {
+        double[] levelRadius = this.foliageShape;
+        int x = center[0];
+        int y = center[1];
+        int z = center[2];
+        for (double i : levelRadius) {
+            crossSection(new int[] { x, y, z }, i, 1, leavesId, leavesData, world);
+            y++;
+        }
+    }
+
+    /* Create a tapered cylinder.
+     *
+     * start and end are the beginning and ending coordinates of form [x,y,z].
+     * startSize and endSize are the beginning and ending radius.
+     */
+    protected void taperedLimb(int[] start, int[] end, double startSize, double endSize, World world) {
+        // delta is the coordinate vector for the difference between
+        // start and end.
+        int[] delta = new int[] { end[0] - start[0], end[1] - start[1], end[2] - start[2] };
+        int maxDist = Math.max(delta[0], Math.max(delta[1], delta[2]));
+        if (maxDist == 0) {
+            return;
+        }
+        int primidx = 0;
+        for (int i = 0; i < 3; i++) {
+            if (delta[i] == maxDist) {
+                primidx = i;
+                break;
+            }
+        }
+        // secidx1 and secidx2 are the remaining indices out of [0,1,2].
+        int secidx1 = (primidx - 1) % 3;
+        if (secidx1 < 0) secidx1 += 3;
+        int secidx2 = (1 + primidx) % 3;
+        // primSign is the digit 1 or -1 depending on whether the limb is headed
+        // along the positive or negative primidx axis.
+        int primSign = delta[primidx] / Math.abs(delta[primidx]);
+        // secdelta1 and ...2 are the amount the associated values change
+        // for every step along the prime axis.
+        int secdelta1 = delta[secidx1];
+        float secfac1 = ((float)secdelta1) / delta[primidx];
+        int secdelta2 = delta[secidx2];
+        float secfac2 = ((float)secdelta2) / delta[primidx];
+        // Initialize coord
+        int[] coord = new int[3];
+        // Loop through each cross-section along the primary axis,
+        // from start to end.
+        int endOffset = delta[primidx] + primSign;
+        for (int primOffset = 0; primOffset < endOffset; primOffset += primSign) {
+            int primLoc = start[primidx] + primOffset;
+            int secloc1 = (int)(start[secidx1] + primOffset * secfac1);
+            int secloc2 = (int)(start[secidx2] + primOffset * secfac2);
+            coord[primidx] = primLoc;
+            coord[secidx1] = secloc1;
+            coord[secidx2] = secloc2;
+            int primDist = Math.abs(delta[primidx]);
+            double radius = endSize + (startSize - endSize) * Math.abs(delta[primidx] - primOffset) / primDist;
+            crossSection(coord, radius, primidx, trunkId, trunkData, world);
+        }
+    }
+
+    @Override
+    protected void makeFoliage(World world) {
+        List<int[]> foliageCoords = this.foliageCoords;
+
+        for (int[] coord: foliageCoords) {
+            foliageCluster(coord, world);
+        }
+        for (int[] coord: foliageCoords) {
+            assignValue(coord[0], coord[1], coord[2], trunkId, trunkData, world);
+        }
+    }
+
+    /* Generate the branches.
+     */
+    protected void makeBranches(World world) {
+        int[] treePosition = this.pos;
+        int height = this.height;
+        int topY = treePosition[1] + (int)(this.trunkHeight + 0.5);
+        double endRad = this.trunkRadius * (1 - this.trunkHeight / height);
+        if (endRad < 1.0) {
+            endRad = 1.0;
+        }
+        for (int[] coord: foliageCoords) {
+            double dist = Math.sqrt(Math.pow(coord[0] - treePosition[0], 2) + Math.pow(coord[2] - treePosition[2], 2));
+            int yDist = coord[1] - treePosition[1];
+            double value = (this.branchDensity * 220 * height) / (Math.pow(yDist + dist, 3));
+            if (value < random.nextDouble()) {
+                continue;
+            }
+
+            int posY = coord[1];
+            double slope = this.branchSlope + (0.5 - random.nextDouble()) * 0.16;
+            double branchY;
+            double baseSize;
+            if (coord[1] - dist * slope > topY) {
+                double threshold = 1.0 / height;
+                if (Math.random() < threshold) {
+                    continue;
+                }
+                branchY = topY;
+                baseSize = endRad;
+            } else {
+                branchY = posY - dist * slope;
+                baseSize = (endRad + (this.trunkRadius - endRad) * (topY - branchY) / this.trunkHeight);
+            }
+            double startSize = (baseSize * (1 + random.nextDouble()) * 0.618 * Math.pow(dist / height, 0.618));
+            double rndr = Math.sqrt(random.nextDouble()) * baseSize * 0.618;
+            double rndang = Math.random() * 2 * Math.PI;
+            int rndx = (int)(rndr * Math.sin(rndang) + 0.5);
+            int rndz = (int)(rndr * Math.cos(rndang) + 0.5);
+            int[] startCoord = new int[] { treePosition[0] + rndx, (int) branchY, treePosition[2] + rndz };
+            if (startSize < 1.0) {
+                startSize = 1.0;
+            }
+            double endSize = 1.0;
+            taperedLimb(startCoord, coord, startSize, endSize, world);
+        }
+    }
+
+    /* Generate the roots.
+     *
+     * rootBases = [[x, z, baseRadius], ...] and is the list of locations
+     * the roots can originate from, and the size of that location.
+     */
+    void makeRoots(List<double[]> rootBases, World world) {
+        int[] treePosition = this.pos;
+        int height = this.height;
+        for (int[] coord: this.foliageCoords) {
+            // First, set the threshold for randomly selecting this
+            // coordinate for root creation.
+            double dist = Math.sqrt(Math.pow(coord[0] - treePosition[0], 2) + Math.pow(coord[2] - treePosition[2], 2));
+            int yDist = coord[1] - treePosition[1];
+            double value = (this.branchDensity * 220 * height) / Math.pow(yDist + dist, 3);
+            // Randomly skip roots, based on the above threshold
+            if (value < random.nextDouble()) {
+                continue;
+            }
+            // initialize the internal variables from a selection of
+            // starting locations.
+            double[] rootBase = rootBases.get(random.nextInt(rootBases.size()));
+            int rootX = (int) rootBase[0];
+            int rootZ = (int) rootBase[1];
+            double rootBaseRadius = rootBase[2];
+            // Offset the root origin location by a random amount
+            // (radially) from the starting location.
+            double rndr = Math.sqrt(random.nextDouble()) * rootBaseRadius * 0.618;
+            double rndang = random.nextDouble() * 2 * Math.PI;
+            int rndx = (int)(rndr * Math.sin(rndang) + 0.5);
+            int rndz = (int)(rndr * Math.cos(rndang) + 0.5);
+            int rndy = (int)(random.nextDouble() * rootBaseRadius * 0.5);
+            int[] startCoord = new int[] { rootX + rndx, treePosition[1] + rndy, rootZ + rndz };
+            // offset is the distance from the root base to the root tip
+            int[] offset = new int[] { startCoord[0] - coord[0], startCoord[1] - coord[1], startCoord[2] - coord[2] };
+            // If this is a mangrove tree, make the roots longer.
+            if (this instanceof WorldFeatureSpoonerTreeMangrove) {
+                offset = new int[] { (int)(offset[0] * 1.618 - 1.5), (int)(offset[1] * 1.618 - 1.5), (int)(offset[2] * 1.618 - 1.5) };
+            }
+            int[] endCoord = new int[] { startCoord[0] + offset[0], startCoord[1] + offset[1], startCoord[2] + offset[2] };
+            double rootStartSize = rootBaseRadius * 0.618 * Math.abs(offset[1]) / (height * 0.618);
+            if (rootStartSize < 1.0) {
+                rootStartSize = 1.0;
+            }
+            double endSize = 1.0;
+            // TODO: accommodate tostone and hanging behaviours
+            if (false) {
+
+            } else {
+                taperedLimb(startCoord, endCoord, rootStartSize, endSize, world);
+            }
+        }
+    }
+
+    @Override
+    protected void makeTrunk(World world) {
+        int height = this.height;
+        double trunkHeight = this.trunkHeight;
+        double trunkRadius = this.trunkRadius;
+        int[] treePosition = this.pos;
+        int startY = treePosition[1];
+        int midY = treePosition[1] + (int)(trunkHeight * 0.382);
+        int topY = treePosition[1] + (int)(trunkHeight + 0.5);
+        // In this method, x and z are the position of the trunk.
+        int x = treePosition[0];
+        int z = treePosition[2];
+        double midRad = trunkRadius * 0.8;
+        double endRad = trunkRadius * (1 - trunkHeight / height);
+        if (endRad < 1.0) {
+            endRad = 1.0;
+        }
+        if (midRad < endRad) {
+            midRad = endRad;
+        }
+        double startRad;
+        List<double[]> rootBases;
+        // Make the root buttresses, if indicated
+        // TODO: root buttresses
+        if (/* root buttresses or */ this instanceof WorldFeatureSpoonerTreeMangrove) {
+            // The start radius of the trunk should be a little smaller if we
+            // are using root buttresses.
+            startRad = trunkRadius * 0.8;
+            // rootbases is used later in makeRoots(...) as
+            // starting locations for the roots.
+            rootBases = new ArrayList<>();
+            rootBases.add(new double[] { x, z, startRad });
+            double buttressRadius = trunkRadius * 0.382;
+            // posRadius is how far the root buttresses should be offset
+            // from the trunk.
+            double posRadius = trunkRadius;
+            // In mangroves, the root buttresses are much more extended.
+            if (this instanceof WorldFeatureSpoonerTreeMangrove) {
+                posRadius = posRadius * 2.618;
+            }
+            int numOfButtresses = (int)(Math.sqrt(trunkRadius) + 3.5);
+            for (int i = 0; i < numOfButtresses; i++) {
+                double rndang = random.nextDouble() * 2 * Math.PI;
+                double thisPosRadius = posRadius * (0.9 + random.nextDouble() * 0.2);
+                // thisX and thisZ are the X and Z position for the base of
+                // the root buttress.
+                int thisX = x + (int)(thisPosRadius * Math.sin(rndang));
+                int thisZ = z + (int)(thisPosRadius * Math.cos(rndang));
+                // thisButtressRadius is the radius of the buttress.
+                // Currently, root buttresses do not taper.
+                double thisButtressRadius = buttressRadius * (0.618 * random.nextDouble());
+                if (thisButtressRadius < 1.0) {
+                    thisButtressRadius = 1.0;
+                }
+                // Make the root buttress.
+                taperedLimb(new int[] { thisX, startY, thisZ }, new int[] { x, midY, z }, thisButtressRadius, thisButtressRadius, world);
+                // Adds this root buttress as a possible location at which roots can spawn.
+                rootBases.add(new double[] { thisX, thisZ, thisButtressRadius });
+            }
+        } else {
+            // If root buttresses are turned off, set the trunk radius
+            // to normal size.
+            startRad = trunkRadius;
+            rootBases = new ArrayList<>();
+            rootBases.add(new double[] { x, z, startRad });
+        }
+        // Make the lower and upper sections of the trunk.
+        taperedLimb(new int[] { x, startY, z }, new int[] { x, midY, z }, startRad, midRad, world);
+        taperedLimb(new int[] { x, midY, z }, new int[] { x, topY, z }, midRad, endRad, world);
+        // Make the branches
+        makeBranches(world);
+        // Make the roots, if indicated
+        // TODO: roots
+        if (false) {
+
+        }
+    }
+
+    @Override
+    protected void prepare(World world) {
+        // Primarily sets up the foliage cluster locations
+        this.trunkRadius = Math.sqrt(this.height * TRUNK_THICKNESS);
+        if (this.trunkRadius < 1) {
+            this.trunkRadius = 1;
+        }
+        this.trunkHeight = this.height * 0.618;
+        this.branchDensity = BRANCH_DENSITY / FOLIAGE_DENSITY;
+        List<int[]> foliageCoords = new ArrayList<>();
+        int yStart = this.pos[1];
+        int yEnd = this.pos[1] + this.height;
+        int numOfClustersPerY = (int)(1.5 + Math.pow(FOLIAGE_DENSITY * this.height / 19.0, 2));
+        if (numOfClustersPerY < 1) {
+            numOfClustersPerY = 1;
+        }
+        for (int y = yEnd; y > yStart; y--) {
+            for (int i = 0; i < numOfClustersPerY; i++) {
+                Double shapefac = shapeFunc(y - yStart);
+                if (shapefac == null) {
+                    continue;
+                }
+                double r = (Math.sqrt(random.nextDouble()) + 0.328) * shapefac;
+
+                double theta = random.nextDouble() * 2 * Math.PI;
+                int x = (int)(r * Math.sin(theta)) + this.pos[0];
+                int z = (int)(r * Math.cos(theta)) + this.pos[2];
+                foliageCoords.add(new int[] { x, y, z });
+            }
+        }
+        this.foliageCoords = foliageCoords;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeRainforest.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeRainforest.java
new file mode 100644
index 000000000..9710b49ba
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeRainforest.java
@@ -0,0 +1,36 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+
+public class WorldFeatureSpoonerTreeRainforest
+    extends WorldFeatureSpoonerTreeProcedural {
+    public WorldFeatureSpoonerTreeRainforest(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    @Override
+    protected void prepare(World world) {
+        this.foliageShape = new double[] { 3.4, 2.6 };
+        super.prepare(world);
+        this.branchSlope = 1.0;
+        this.trunkRadius = this.trunkRadius * 0.382;
+        this.trunkHeight = this.height * 0.9;
+    }
+
+    @Override
+    protected Double shapeFunc(int y) {
+        if (y < this.height * 0.8) {
+            if (HEIGHT < this.height) {
+                Double twigs = super.shapeFunc(y);
+                if (twigs != null && random.nextDouble() < 0.05) {
+                    return twigs;
+                }
+            }
+            return null;
+        } else {
+            double width = this.height * 0.382;
+            double topDist = (this.height - y) / (this.height * 0.2);
+            return width * (0.618 + topDist) * (0.618 + random.nextDouble()) * 0.382;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeRound.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeRound.java
new file mode 100644
index 000000000..4b30d4ece
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeRound.java
@@ -0,0 +1,43 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+
+public class WorldFeatureSpoonerTreeRound
+    extends WorldFeatureSpoonerTreeProcedural {
+
+    public WorldFeatureSpoonerTreeRound(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    @Override
+    protected void prepare(World world) {
+        super.prepare(world);
+        this.branchSlope = 0.382;
+        this.foliageShape = new double[] { 2, 3, 3, 2.5, 1.6 };
+        this.trunkRadius = this.trunkRadius * 0.8;
+        this.trunkHeight = TRUNK_HEIGHT * this.height;
+    }
+
+    @Override
+    protected Double shapeFunc(int y) {
+        Double twigs = super.shapeFunc(y);
+        if (twigs != null) {
+            return twigs;
+        }
+        if (y < this.height * (0.282 + 0.1 * Math.sqrt(random.nextDouble()))) {
+            return null;
+        }
+        double radius = this.height / 2.0;
+        double adj = this.height / 2.0 - y;
+        double dist;
+        if (adj == 0) {
+            dist = radius;
+        } else if (Math.abs(adj) >= radius) {
+            dist = 0;
+        } else {
+            dist = Math.sqrt(Math.pow(radius, 2) - Math.pow(adj, 2));
+        }
+        dist = dist * 0.618;
+        return dist;
+    }
+}
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeStick.java b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeStick.java
new file mode 100644
index 000000000..afe7b203e
--- /dev/null
+++ b/src/main/java/net/minecraft/core/world/generate/feature/tree/spooner/WorldFeatureSpoonerTreeStick.java
@@ -0,0 +1,22 @@
+package net.minecraft.core.world.generate.feature.tree.spooner;
+
+import net.minecraft.core.world.World;
+
+public abstract class WorldFeatureSpoonerTreeStick
+    extends WorldFeatureSpoonerTree {
+    public WorldFeatureSpoonerTreeStick(int x, int y, int z, int height, int trunkId, int trunkData, int leavesId, int leavesData) {
+        super(x, y, z, height, trunkId, trunkData, leavesId, leavesData);
+    }
+
+    @Override
+    protected void makeTrunk(World world) {
+        int x = this.pos[0];
+        int y = this.pos[1];
+        int z = this.pos[2];
+
+        for (int i = 0; i < this.height; i++) {
+            assignValue(x, y, z, this.trunkId, this.trunkData, world);
+            y++;
+        }
+    }
+}
diff --git a/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java b/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
index 104992762..72d01acde 100644
--- a/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
+++ b/src/main/java/net/minecraft/server/net/handler/NetServerHandler.java
@@ -1,5 +1,6 @@
 package net.minecraft.server.net.handler;
 
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
@@ -14,6 +15,7 @@ import net.minecraft.core.entity.vehicle.EntityBoat;
 import net.minecraft.core.enums.ArtType;
 import net.minecraft.core.enums.EnumSignPicture;
 import net.minecraft.core.enums.PlacementMode;
+import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.net.ICommandListener;
 import net.minecraft.core.net.NetworkManager;
@@ -904,7 +906,12 @@ public class NetServerHandler extends NetHandler
     				playerEntity.world.markBlockNeedsUpdate(tileEntity.x, tileEntity.y, tileEntity.z);
     			}
     		}
-    	}
+    	} else if ("BTA|WandMonster".equals(packet.channel)) {
+            if (playerEntity.getHeldItem() != null && playerEntity.getHeldItem().getItem() == Item.wandMonsterSpawner){
+                String id = new String(packet.data, StandardCharsets.UTF_8);
+                playerEntity.getHeldItem().getData().putString("monster", id);
+            }
+        }
     }
 
     @Override
diff --git a/src/main/resources/assets/minecraft/textures/item/wand_monster.png b/src/main/resources/assets/minecraft/textures/item/wand_monster.png
new file mode 100644
index 000000000..90da10cb3
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/item/wand_monster.png differ
