diff --git a/src/common/resources/lang/en_US/gui.lang b/src/common/resources/lang/en_US/gui.lang
index 03fe0ba6e..74cfb7f12 100644
--- a/src/common/resources/lang/en_US/gui.lang
+++ b/src/common/resources/lang/en_US/gui.lang
@@ -94,6 +94,9 @@ gui.create_world.pages.game_rules.title=Game Rules
 gui.dispenser.label.dispenser=Dispenser
 gui.dispenser.label.inventory=Inventory
 
+gui.activator.label.activator=Activator
+gui.activator.label.inventory=Inventory
+
 gui.downloading_terrain.label.title=Downloading Terrain
 
 gui.edit_flag.label.inventory=Inventory
diff --git a/src/common/resources/lang/en_US/tile.lang b/src/common/resources/lang/en_US/tile.lang
index eb00d76e4..ad486a6d8 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.permafrost.carved.name=Carved Permafrost
tile.permafrost.carved.desc=Polished Permafrost with lines hewn through the middle.
tile.netherrack.carved.name=Carved Netherrack
tile.netherrack.carved.desc=Polished Netherrack 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.permafrost.carved.name=Polished Permafrost Slab
tile.slab.permafrost.carved.desc=A slab of polished permafrost.

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.slab.cobble.permafrost.name=Cobbled Permafrost Slab
tile.slab.cobble.permafrost.desc=A slab of cobbled permafrost.
tile.slab.brick.sandstone.name=Sandstone Brick Slab
tile.slab.brick.sandstone.desc=A slab of sandstone bricks.
tile.slab.brick.permafrost.name=Permafrost Brick Slab
tile.slab.brick.permafrost.desc=A slab of permafrost bricks.

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.sandstone.name=Sandstone Stairs
tile.stairs.sandstone.desc=Sandstone block used for rapid vertical movement.
tile.stairs.cobble.permafrost.name=Cobbled Permafrost Stairs
tile.stairs.cobble.permafrost.desc=Cobbled permafrost block used for rapid vertical movement.
tile.stairs.brick.sandstone.name=Sandstone Brick Stairs
tile.stairs.brick.sandstone.desc=Sandstone brick block used for rapid vertical movement.
tile.stairs.brick.permafrost.name=Permafrost Brick Stairs
tile.stairs.brick.permafrost.desc=Permafrost 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.pumice.dry.name=Pumice
tile.pumice.dry.desc=A dry porous volcanic rock, good for soaking up lava.
tile.pumice.wet.name=Molten Pumice
tile.pumice.wet.desc=Rock filled with lava.

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.boneshale.name=Bone Shale
tile.boneshale.desc=An incredibly tough white rock torn from the deepest depths.

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.log.thorn.name=Thorn Log
tile.log.thorn.desc=A log from a thorn tree.
tile.log.palm.name=Palm Log
tile.log.palm.desc=A log from a palm 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.thorn.name=Thorn Leaves
tile.leaves.thorn.desc=Leaves from a thorn tree.
tile.leaves.palm.name=Palm Leaves
tile.leaves.palm.desc=Leaves from a palm 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.sapling.thorn.name=Thorn Sapling
tile.sapling.thorn.desc=Plant to grow a thorn tree.
tile.sapling.palm.name=Palm Sapling
tile.sapling.palm.desc=Plant to grow a palm 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.flower.orange.name=Marigold
tile.flower.orange.desc=A beautiful orange 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.coal.permafrost.name=Permafrost Coal Ore
tile.ore.coal.permafrost.desc=A chunk of coal embedded in permafrost.

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.iron.permafrost.name=Permafrost Iron Ore
tile.ore.iron.permafrost.desc=Iron nuggets embedded in permafrost.

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.gold.permafrost.name=Permafrost Gold Ore
tile.ore.gold.permafrost.desc=Gold nuggets embedded in permafrost.

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.lapis.permafrost.name=Permafrost Lapis Lazuli Ore
tile.ore.lapis.permafrost.desc=Chunks of lapis lazuli embedded in permafrost.

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.permafrost.name=Permafrost Redstone Ore
tile.ore.redstone.permafrost.desc=Red dust embedded in permafrost.
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.redstone.glowing.permafrost.name=Glowing Permafrost Redstone Ore
tile.ore.redstone.glowing.permafrost.desc=Red dust embedded in permafrost. 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.diamond.permafrost.name=Permafrost Diamond Ore
tile.ore.diamond.permafrost.desc=A chunk of diamond embedded in permafrost.

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.piston.base.steel.name=Reinforced Piston
tile.piston.base.steel.desc=Pushes blocks and entities with immense force.
tile.piston.head.steel.name=Reinforced Piston Head
tile.piston.head.steel.desc=The pushy part of the steel 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.pumpkin.redstone.name=Redstone Jack 'o' Lantern
tile.pumpkin.redstone.desc=An orange squash with a spooky face, lit by a redstone torch.

tile.cobble.netherrack.name=Cobbled Netherrack
tile.cobble.netherrack.desc=Dark red rock that burns forever.
tile.cobble.netherrack.igneous.name=Igneous Cobbled Netherrack
tile.cobble.netherrack.igneous.desc=Extreme heat has made this rock glow from inside.
tile.cobble.netherrack.mossy.name=Mossy Cobbled Netherrack
tile.cobble.netherrack.mossy.desc=Cobbled netherrack, covered in something like moss.
tile.netherrack.name=Netherrack
tile.netherrack.desc=Dark red rock, smoothed by heat and time.
tile.brick.netherrack.name=Netherrack Bricks
tile.brick.netherrack.desc=Stacked bricks of netherrack.
tile.slab.netherrack.carved.name=Polished Netherrack Slab
tile.slab.netherrack.carved.desc=A slab of polished netherrack.
tile.slab.cobble.netherrack.name=Cobbled Netherrack Slab
tile.slab.cobble.netherrack.desc=A slab of cobbled netherrack.
tile.slab.brick.netherrack.name=Netherrack Brick Slab
tile.slab.brick.netherrack.desc=A slab of netherrack bricks.
tile.stairs.cobble.netherrack.name=Cobbled Netherrack Stairs
tile.stairs.cobble.netherrack.desc=Cobbled netherrack block used for rapid vertical movement.
tile.stairs.brick.netherrack.name=Netherrack Brick Stairs
tile.stairs.brick.netherrack.desc=Netherrack brick block used for rapid vertical movement.

tile.soulsand.name=Soul Sand
tile.soulsand.desc=Squishy brown sand that's tough to walk through.
tile.soulschist.name=Soul Schist
tile.soulschist.desc=A hideous medley of ancient bones, fused through heat, pressure, and time.

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.permafrost.polished.name=Polished Permafrost
tile.permafrost.polished.desc=A polished block of permafrost.
tile.netherrack.polished.name=Polished Netherrack
tile.netherrack.polished.desc=A polished block of netherrack.

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.fence.steel.name=Steel Fence
tile.fence.steel.desc=A fence made of tough steel. Intimidating!

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=Top Glass Door
tile.door.glass.top.desc=You shouldn't be seeing this.
tile.door.glass.bottom.name=Bottom Glass Door
tile.door.glass.bottom.desc=And that's not just because it's glass.

tile.door.steel.top.name=Top Steel Door
tile.door.steel.top.desc=Don't take this without asking.
tile.door.steel.bottom.name=Bottom Steel Door
tile.door.steel.bottom.desc=Steeler, no steeling!

tile.trapdoor.steel.name=Steel Trapdoor
tile.trapdoor.steel.desc=Like a door, but flat and made of durable steel.

tile.glass.steel.name=Reinforced Glass
tile.glass.steel.desc=Like glass, but without the fragility.

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.permafrost.carved.name=Carved Permafrost
tile.permafrost.carved.desc=Polished Permafrost with lines hewn through the middle.
tile.netherrack.carved.name=Carved Netherrack
tile.netherrack.carved.desc=Polished Netherrack 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.permafrost.carved.name=Polished Permafrost Slab
tile.slab.permafrost.carved.desc=A slab of polished permafrost.

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.slab.cobble.permafrost.name=Cobbled Permafrost Slab
tile.slab.cobble.permafrost.desc=A slab of cobbled permafrost.
tile.slab.brick.sandstone.name=Sandstone Brick Slab
tile.slab.brick.sandstone.desc=A slab of sandstone bricks.
tile.slab.brick.permafrost.name=Permafrost Brick Slab
tile.slab.brick.permafrost.desc=A slab of permafrost bricks.

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.sandstone.name=Sandstone Stairs
tile.stairs.sandstone.desc=Sandstone block used for rapid vertical movement.
tile.stairs.cobble.permafrost.name=Cobbled Permafrost Stairs
tile.stairs.cobble.permafrost.desc=Cobbled permafrost block used for rapid vertical movement.
tile.stairs.brick.sandstone.name=Sandstone Brick Stairs
tile.stairs.brick.sandstone.desc=Sandstone brick block used for rapid vertical movement.
tile.stairs.brick.permafrost.name=Permafrost Brick Stairs
tile.stairs.brick.permafrost.desc=Permafrost 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.pumice.dry.name=Pumice
tile.pumice.dry.desc=A dry porous volcanic rock, good for soaking up lava.
tile.pumice.wet.name=Molten Pumice
tile.pumice.wet.desc=Rock filled with lava.

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.boneshale.name=Bone Shale
tile.boneshale.desc=An incredibly tough white rock torn from the deepest depths.

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.log.thorn.name=Thorn Log
tile.log.thorn.desc=A log from a thorn tree.
tile.log.palm.name=Palm Log
tile.log.palm.desc=A log from a palm 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.thorn.name=Thorn Leaves
tile.leaves.thorn.desc=Leaves from a thorn tree.
tile.leaves.palm.name=Palm Leaves
tile.leaves.palm.desc=Leaves from a palm 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.sapling.thorn.name=Thorn Sapling
tile.sapling.thorn.desc=Plant to grow a thorn tree.
tile.sapling.palm.name=Palm Sapling
tile.sapling.palm.desc=Plant to grow a palm 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.flower.orange.name=Marigold
tile.flower.orange.desc=A beautiful orange 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.coal.permafrost.name=Permafrost Coal Ore
tile.ore.coal.permafrost.desc=A chunk of coal embedded in permafrost.

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.iron.permafrost.name=Permafrost Iron Ore
tile.ore.iron.permafrost.desc=Iron nuggets embedded in permafrost.

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.gold.permafrost.name=Permafrost Gold Ore
tile.ore.gold.permafrost.desc=Gold nuggets embedded in permafrost.

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.lapis.permafrost.name=Permafrost Lapis Lazuli Ore
tile.ore.lapis.permafrost.desc=Chunks of lapis lazuli embedded in permafrost.

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.permafrost.name=Permafrost Redstone Ore
tile.ore.redstone.permafrost.desc=Red dust embedded in permafrost.
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.redstone.glowing.permafrost.name=Glowing Permafrost Redstone Ore
tile.ore.redstone.glowing.permafrost.desc=Red dust embedded in permafrost. 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.diamond.permafrost.name=Permafrost Diamond Ore
tile.ore.diamond.permafrost.desc=A chunk of diamond embedded in permafrost.

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.piston.base.steel.name=Reinforced Piston
tile.piston.base.steel.desc=Pushes blocks and entities with immense force.
tile.piston.head.steel.name=Reinforced Piston Head
tile.piston.head.steel.desc=The pushy part of the steel 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.activator.cobble.netherrack.name=Activator
tile.activator.cobble.netherrack.desc=Uses items for you.

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.pumpkin.redstone.name=Redstone Jack 'o' Lantern
tile.pumpkin.redstone.desc=An orange squash with a spooky face, lit by a redstone torch.

tile.cobble.netherrack.name=Cobbled Netherrack
tile.cobble.netherrack.desc=Dark red rock that burns forever.
tile.cobble.netherrack.igneous.name=Igneous Cobbled Netherrack
tile.cobble.netherrack.igneous.desc=Extreme heat has made this rock glow from inside.
tile.cobble.netherrack.mossy.name=Mossy Cobbled Netherrack
tile.cobble.netherrack.mossy.desc=Cobbled netherrack, covered in something like moss.
tile.netherrack.name=Netherrack
tile.netherrack.desc=Dark red rock, smoothed by heat and time.
tile.brick.netherrack.name=Netherrack Bricks
tile.brick.netherrack.desc=Stacked bricks of netherrack.
tile.slab.netherrack.carved.name=Polished Netherrack Slab
tile.slab.netherrack.carved.desc=A slab of polished netherrack.
tile.slab.cobble.netherrack.name=Cobbled Netherrack Slab
tile.slab.cobble.netherrack.desc=A slab of cobbled netherrack.
tile.slab.brick.netherrack.name=Netherrack Brick Slab
tile.slab.brick.netherrack.desc=A slab of netherrack bricks.
tile.stairs.cobble.netherrack.name=Cobbled Netherrack Stairs
tile.stairs.cobble.netherrack.desc=Cobbled netherrack block used for rapid vertical movement.
tile.stairs.brick.netherrack.name=Netherrack Brick Stairs
tile.stairs.brick.netherrack.desc=Netherrack brick block used for rapid vertical movement.

tile.soulsand.name=Soul Sand
tile.soulsand.desc=Squishy brown sand that's tough to walk through.
tile.soulschist.name=Soul Schist
tile.soulschist.desc=A hideous medley of ancient bones, fused through heat, pressure, and time.

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.permafrost.polished.name=Polished Permafrost
tile.permafrost.polished.desc=A polished block of permafrost.
tile.netherrack.polished.name=Polished Netherrack
tile.netherrack.polished.desc=A polished block of netherrack.

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.fence.steel.name=Steel Fence
tile.fence.steel.desc=A fence made of tough steel. Intimidating!

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=Top Glass Door
tile.door.glass.top.desc=You shouldn't be seeing this.
tile.door.glass.bottom.name=Bottom Glass Door
tile.door.glass.bottom.desc=And that's not just because it's glass.

tile.door.steel.top.name=Top Steel Door
tile.door.steel.top.desc=Don't take this without asking.
tile.door.steel.bottom.name=Bottom Steel Door
tile.door.steel.bottom.desc=Steeler, no steeling!

tile.trapdoor.steel.name=Steel Trapdoor
tile.trapdoor.steel.desc=Like a door, but flat and made of durable steel.

tile.glass.steel.name=Reinforced Glass
tile.glass.steel.desc=Like glass, but without the fragility.

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 67b1155a2..efe8d6ff9 100644
--- a/src/main/java/net/minecraft/client/Minecraft.java
+++ b/src/main/java/net/minecraft/client/Minecraft.java
@@ -1311,7 +1311,7 @@ public class Minecraft
 
     private void clickMiddleMouseButton()
     {
-        HitResult mouseOver = thePlayer.rayTrace(256, timer.partialTicks);
+        HitResult mouseOver = thePlayer.rayTrace(256, timer.partialTicks, false, false);
         if(mouseOver != null && mouseOver.hitType == HitResult.HitType.TILE)
         {
             int x = mouseOver.x;
@@ -2213,18 +2213,20 @@ public class Minecraft
         if(theWorld != null)
         {
             theWorld.saveWorldIndirectly(loadingScreen);
-            IChunkLoader loader = theWorld.saveHandler.getChunkLoader(theWorld.dimension);
-            if (loader != null) {
-                while (loader.isSaving()) {
-                    try {
-                        Thread.sleep(1);
-                    } catch (InterruptedException e) {
-                        throw new RuntimeException(e);
+            if (theWorld.saveHandler != null) {
+                IChunkLoader loader = theWorld.saveHandler.getChunkLoader(theWorld.dimension);
+                if (loader != null) {
+                    while (loader.isSaving()) {
+                        try {
+                            Thread.sleep(1);
+                        } catch (InterruptedException e) {
+                            throw new RuntimeException(e);
+                        }
                     }
                 }
+                theWorld.getChunkProvider().unloadAllChunks();
+                theWorld.onUnload();
             }
-            theWorld.getChunkProvider().unloadAllChunks();
-            theWorld.onUnload();
         }
         theWorld = world;
         if(world != null)
diff --git a/src/main/java/net/minecraft/client/entity/player/LocalPlayer.java b/src/main/java/net/minecraft/client/entity/player/LocalPlayer.java
index 980d205bf..7d2bb10e1 100644
--- a/src/main/java/net/minecraft/client/entity/player/LocalPlayer.java
+++ b/src/main/java/net/minecraft/client/entity/player/LocalPlayer.java
@@ -6,6 +6,7 @@ import com.mojang.nbt.CompoundTag;
 
 import net.minecraft.client.Minecraft;
 import net.minecraft.client.entity.particle.TakeAnimationParticle;
+import net.minecraft.client.gui.container.ActivatorScreen;
 import net.minecraft.client.gui.container.ContainerScreen;
 import net.minecraft.client.gui.container.CraftingScreen;
 import net.minecraft.client.gui.container.DispenserScreen;
@@ -26,6 +27,7 @@ import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.client.gui.toasts.AchievementToast;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.PortalBlock;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.DispenserBlockEntity;
 import net.minecraft.core.block.entity.FlagBlockEntity;
 import net.minecraft.core.block.entity.FurnaceBlockEntity;
@@ -318,6 +320,12 @@ public class LocalPlayer extends Player
         mc.displayScreen(new DispenserScreen(inventory, blockEntity));
     }
 
+    @Override
+    public void displayActivatorScreen(ActivatorBlockEntity blockEntity)
+    {
+        mc.displayScreen(new ActivatorScreen(inventory, blockEntity));
+    }
+
     @Override
     public void displayGuidebookScreen() {
         mc.displayScreen(new GuidebookScreen(mc.currentScreen));
diff --git a/src/main/java/net/minecraft/client/gui/Screen.java b/src/main/java/net/minecraft/client/gui/Screen.java
index 04657620f..494c62451 100644
--- a/src/main/java/net/minecraft/client/gui/Screen.java
+++ b/src/main/java/net/minecraft/client/gui/Screen.java
@@ -77,7 +77,6 @@ public abstract class Screen extends Gui {
                     return;
                 }
             }
-
         }
     }
 
diff --git a/src/main/java/net/minecraft/client/gui/container/ActivatorScreen.java b/src/main/java/net/minecraft/client/gui/container/ActivatorScreen.java
new file mode 100644
index 000000000..d280e7c08
--- /dev/null
+++ b/src/main/java/net/minecraft/client/gui/container/ActivatorScreen.java
@@ -0,0 +1,77 @@
+package net.minecraft.client.gui.container;
+
+import net.minecraft.client.gui.ButtonElement;
+import net.minecraft.client.gui.modelviewer.elements.ListenerButtonElement;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.lang.I18n;
+import net.minecraft.core.player.inventory.container.Inventory;
+import net.minecraft.core.player.inventory.menu.ActivatorMenu;
+import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Listener;
+import org.lwjgl.opengl.GL11;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ActivatorScreen extends AbstractContainerScreen {
+    protected final ActivatorBlockEntity activatorBlockEntity;
+    protected final List<ButtonElement> slotButtons = new ArrayList<>();
+
+    public ActivatorScreen(Inventory inventory, ActivatorBlockEntity activatorBlock) {
+        super(new ActivatorMenu(inventory, activatorBlock));
+        this.activatorBlockEntity = activatorBlock;
+    }
+
+    @Override
+    public void init() {
+        super.init();
+        int xLeft = (width - xSize) / 2;
+        int yTop = (height - ySize) / 2;
+        final int startX = xLeft + 7;
+        final int startY = yTop + 34;
+        buttons.clear();
+        slotButtons.clear();
+        for (int i = 0; i < activatorBlockEntity.getContainerSize(); i++) {
+            ButtonElement button = new ButtonElement(i, startX + 18 * i, startY, 18, 18, "");
+            button.visible = false;
+            slotButtons.add(button);
+        }
+    }
+
+    @Override
+    public void mouseClicked(int mx, int my, int buttonNum) {
+        if (buttonNum == 1 && mc.thePlayer.inventory.getHeldItemStack() == null) {
+            for (ButtonElement button : slotButtons) {
+                if (activatorBlockEntity.getItem(button.id) == null && button.mouseClicked(mc, mx, my)) {
+                    activatorBlockEntity.lockSlot(button.id, !activatorBlockEntity.locked(button.id));
+                    if (button.playSound) {
+                        mc.sndManager.playSound("random.click", SoundCategory.GUI_SOUNDS, 1.0F, 1.0F);
+                    }
+                    break;
+                }
+            }
+        }
+        super.mouseClicked(mx, my, buttonNum);
+    }
+
+    @Override
+    protected void drawGuiContainerForegroundLayer() {
+        font.drawString(I18n.getInstance().translateKey("gui.activator.label.activator"), 60, 6, 0x404040);
+        font.drawString(I18n.getInstance().translateKey("gui.activator.label.inventory"), 8, (ySize - 96) + 2, 0x404040);
+    }
+
+    @Override
+    protected void drawGuiContainerBackgroundLayer(float f) {
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        mc.textureManager.loadTexture("/assets/minecraft/textures/gui/container/activator.png").bind();
+        int xLeft = (width - xSize) / 2;
+        int yTop = (height - ySize) / 2;
+        drawTexturedModalRect(xLeft, yTop, 0, 0, xSize, ySize);
+
+        if (!activatorBlockEntity.locked(activatorBlockEntity.stackSelector)) { // Draw selector arrow
+            final int startX = xLeft + 7;
+            final int startY = yTop + 26;
+            drawTexturedModalRect( startX + 18 * activatorBlockEntity.stackSelector, startY, 176, 0, 18, 34);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/client/gui/container/DispenserScreen.java b/src/main/java/net/minecraft/client/gui/container/DispenserScreen.java
index 75f11ba4a..29f566d73 100644
--- a/src/main/java/net/minecraft/client/gui/container/DispenserScreen.java
+++ b/src/main/java/net/minecraft/client/gui/container/DispenserScreen.java
@@ -6,10 +6,6 @@ import net.minecraft.core.player.inventory.menu.TrapMenu;
 import net.minecraft.core.player.inventory.container.Inventory;
 import org.lwjgl.opengl.GL11;
 
-// Referenced classes of package net.minecraft.src:
-//            GuiContainer, ContainerDispenser, FontRenderer, RenderEngine, 
-//            InventoryPlayer, DispenserBlockEntity
-
 public class DispenserScreen extends AbstractContainerScreen
 {
 
diff --git a/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java b/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
index 5589746bb..a2b9e58b6 100644
--- a/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
+++ b/src/main/java/net/minecraft/client/net/command/ClientCommandSource.java
@@ -56,7 +56,7 @@ public class ClientCommandSource implements CommandSource {
 
     @Override
     public @NotNull Vec3 getCoordinates(boolean offsetHeight) {
-        Vec3 position = this.getSender().getPosition(1.0f);
+        Vec3 position = this.getSender().getPosition(1.0f, false);
         if (offsetHeight) return position.add(0.0f, -this.getSender().heightOffset, 0.0f);
         return position;
     }
diff --git a/src/main/java/net/minecraft/client/net/handler/ClientPacketHandler.java b/src/main/java/net/minecraft/client/net/handler/ClientPacketHandler.java
index 069b0d57b..c56abf098 100644
--- a/src/main/java/net/minecraft/client/net/handler/ClientPacketHandler.java
+++ b/src/main/java/net/minecraft/client/net/handler/ClientPacketHandler.java
@@ -17,6 +17,7 @@ import net.minecraft.client.player.controller.PlayerControllerMP;
 import net.minecraft.client.world.WorldClient;
 import net.minecraft.core.Global;
 import net.minecraft.core.achievement.stat.StatList;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.entity.BlastFurnaceBlockEntity;
 import net.minecraft.core.block.entity.BlockEntityDispatcher;
@@ -850,45 +851,56 @@ public class ClientPacketHandler extends PacketHandler
     @Override
     public void handleOpenWindow(ContainerOpenPacket containerOpenPacket)
     {
-        if (containerOpenPacket.inventoryType == 0)
-        {
-            SimpleContainer simpleContainer = new SimpleContainer(containerOpenPacket.windowTitle, containerOpenPacket.slotsCount);
-            mc.thePlayer.displayContainerScreen(simpleContainer);
-            mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
-        }
-        else if (containerOpenPacket.inventoryType == 2)
-        {
-            FurnaceBlockEntity furnaceBlockEntity = new FurnaceBlockEntity();
-            mc.thePlayer.displayFurnaceScreen(furnaceBlockEntity);
-            mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
-        }
-        else if (containerOpenPacket.inventoryType == 3)
-        {
-            DispenserBlockEntity dispenserBlockEntity = new DispenserBlockEntity();
-            mc.thePlayer.displayDispenserScreen(dispenserBlockEntity);
-            mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
-        }
-        else if (containerOpenPacket.inventoryType == 4)
-        {
-            BlastFurnaceBlockEntity blastFurnaceBlockEntity = new BlastFurnaceBlockEntity();
-            mc.thePlayer.displayFurnaceScreen(blastFurnaceBlockEntity);
-            mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
-        }
-        else if (containerOpenPacket.inventoryType == 5)
-        {
-            TrommelBlockEntity trommelBlockEntity = new TrommelBlockEntity();
-            mc.thePlayer.displayTrommelScreen(trommelBlockEntity);
-            mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
-        }
-        else if (containerOpenPacket.inventoryType == 7)
-        {
-            mc.thePlayer.displayPaintingPickerScreen();
-        }
-        else if (containerOpenPacket.inventoryType == 1)
-        {
-            LocalPlayer localPlayer = mc.thePlayer;
-            mc.thePlayer.displayWorkbenchScreen(MathHelper.floor(localPlayer.x), MathHelper.floor(localPlayer.y), MathHelper.floor(localPlayer.z));
-            mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
+        switch (containerOpenPacket.inventoryType) {
+            case ContainerOpenPacket.TYPE_GENERIC_CONTAINER: {
+                SimpleContainer simpleContainer = new SimpleContainer(containerOpenPacket.windowTitle, containerOpenPacket.slotsCount);
+                mc.thePlayer.displayContainerScreen(simpleContainer);
+                mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
+                break;
+            }
+            case ContainerOpenPacket.TYPE_FURNACE: {
+                FurnaceBlockEntity furnaceBlockEntity = new FurnaceBlockEntity();
+                mc.thePlayer.displayFurnaceScreen(furnaceBlockEntity);
+                mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
+                break;
+            }
+            case ContainerOpenPacket.TYPE_DISPENSER: {
+                DispenserBlockEntity dispenserBlockEntity = new DispenserBlockEntity();
+                mc.thePlayer.displayDispenserScreen(dispenserBlockEntity);
+                mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
+                break;
+            }
+            case ContainerOpenPacket.TYPE_ACTIVATOR: {
+                ActivatorBlockEntity activatorBlockEntity = new ActivatorBlockEntity();
+                mc.thePlayer.displayActivatorScreen(activatorBlockEntity);
+                mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
+                break;
+            }
+            case ContainerOpenPacket.TYPE_BLAST_FURNACE: {
+                BlastFurnaceBlockEntity blastFurnaceBlockEntity = new BlastFurnaceBlockEntity();
+                mc.thePlayer.displayFurnaceScreen(blastFurnaceBlockEntity);
+                mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
+                break;
+            }
+            case ContainerOpenPacket.TYPE_TROMMEL: {
+                TrommelBlockEntity trommelBlockEntity = new TrommelBlockEntity();
+                mc.thePlayer.displayTrommelScreen(trommelBlockEntity);
+                mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
+                break;
+            }
+            case ContainerOpenPacket.TYPE_PAINTING: {
+                mc.thePlayer.displayPaintingPickerScreen();
+                break;
+            }
+            case ContainerOpenPacket.TYPE_CRAFTING: {
+                LocalPlayer localPlayer = mc.thePlayer;
+                mc.thePlayer.displayWorkbenchScreen(MathHelper.floor(localPlayer.x), MathHelper.floor(localPlayer.y), MathHelper.floor(localPlayer.z));
+                mc.thePlayer.craftingInventory.containerId = containerOpenPacket.windowId;
+                break;
+            }
+            default: {
+                LOGGER.warn("No defined before for container open '{}' with type {}!", containerOpenPacket.windowId, containerOpenPacket.inventoryType);
+            }
         }
     }
 
@@ -1037,7 +1049,7 @@ public class ClientPacketHandler extends PacketHandler
     @Override
     public void handlePlaySoundEffect(PlaySoundEffectPacket playsoundeffectPacket)
     {
-        mc.theWorld.playSoundEffect(playsoundeffectPacket.soundID, playsoundeffectPacket.x, playsoundeffectPacket.y, playsoundeffectPacket.z, playsoundeffectPacket.data);
+        mc.theWorld.playBlockEvent(playsoundeffectPacket.soundID, playsoundeffectPacket.x, playsoundeffectPacket.y, playsoundeffectPacket.z, playsoundeffectPacket.data);
     }
 
 	@Override
diff --git a/src/main/java/net/minecraft/client/player/controller/PlayerController.java b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
index c4353c224..0f19816c7 100644
--- a/src/main/java/net/minecraft/client/player/controller/PlayerController.java
+++ b/src/main/java/net/minecraft/client/player/controller/PlayerController.java
@@ -161,7 +161,7 @@ public abstract class PlayerController {
 			heldItem = heldItemStack.getItem();
 		}
 		
-		world.playSoundEffect(EVENT_BLOCK_BREAK, x, y, z, block.id);
+		world.playBlockEvent(EVENT_BLOCK_BREAK, x, y, z, block.id);
 		int meta = world.getBlockMetadata(x, y, z);
 		boolean removed = world.setBlockWithNotify(x, y, z, 0);
 		if(removed) {
diff --git a/src/main/java/net/minecraft/client/render/RenderBlockCache.java b/src/main/java/net/minecraft/client/render/RenderBlockCache.java
index e700d2b2c..750a10e9c 100644
--- a/src/main/java/net/minecraft/client/render/RenderBlockCache.java
+++ b/src/main/java/net/minecraft/client/render/RenderBlockCache.java
@@ -91,7 +91,7 @@ final public class RenderBlockCache {
     	int index = (relX + CACHE_RANGE) * CACHE_SIZE * CACHE_SIZE + (relY + CACHE_RANGE) * CACHE_SIZE + (relZ + CACHE_RANGE);
     	if(!lightmapCoordCached[index]) {
     		int lightEmission = Block.lightEmission[block.id];
-    		lightmapCoordValue[index] = access.getLightmapCoord(relX + offsetX, relY + offsetY, relZ + offsetZ, lightEmission >= 15 ? 15 : 0);
+    		lightmapCoordValue[index] = access.getLightmapCoord(relX + offsetX, relY + offsetY, relZ + offsetZ, lightEmission);
     		lightmapCoordCached[index] = true;
     	}
     	return lightmapCoordValue[index];
diff --git a/src/main/java/net/minecraft/client/render/RenderBlocks.java b/src/main/java/net/minecraft/client/render/RenderBlocks.java
index ac192d9ad..c6e406798 100644
--- a/src/main/java/net/minecraft/client/render/RenderBlocks.java
+++ b/src/main/java/net/minecraft/client/render/RenderBlocks.java
@@ -273,20 +273,21 @@ public class RenderBlocks
                                     int topX, int topY, int topZ, float topP, float botP,
                                     int lefX, int lefY, int lefZ, float lefP, float rigP){
     	boolean ao = mc.isAmbientOcclusionEnabled() && Block.lightEmission[block.id] == 0;
-        
+        boolean isFullCube = depth <= FULL_CUBE_THRESHOLD;
+
     	if(LightmapHelper.isLightmapEnabled()) {
     		if(overbright) {
     			int dirX2 = dirX;
     			int dirY2 = dirY;
     			int dirZ2 = dirZ;
     			
-    			if(depth > FULL_CUBE_THRESHOLD) {
+    			if(!isFullCube) {
     				dirX2 = 0;
     				dirY2 = 0;
     				dirZ2 = 0;
     			}
     			
-    			int lmc = LightmapHelper.getOverbrightLightmapCoord(blockAccess.getSavedLightValue(LightLayer.Sky, x + dirX2, y + dirY2, z + dirZ2));
+    			int lmc = LightmapHelper.getOverbrightLightmapCoord(blockAccess.getSavedLightValue(LightLayer.Sky, dirX2, dirY2, dirZ2));
     			
         		lightmapCoordTopLeft = lightmapCoordBottomLeft = lightmapCoordBottomRight = lightmapCoordTopRight = lmc;
     		}else {
@@ -295,7 +296,7 @@ public class RenderBlocks
         			int dirY2 = dirY;
         			int dirZ2 = dirZ;
         			
-        			if(depth > FULL_CUBE_THRESHOLD) {
+        			if(!isFullCube) {
         				dirX2 = 0;
         				dirY2 = 0;
         				dirZ2 = 0;
@@ -329,7 +330,7 @@ public class RenderBlocks
         			lightmapCoordBottomRight = LightmapHelper.avg(lmcCen, lmcRig, lmcBot, lmcBotRig);
         		}else {
         			int lmc;
-                	if(depth > FULL_CUBE_THRESHOLD) {
+                	if(!isFullCube) {
                 		lmc = block.getLightmapCoord(blockAccess, x, y, z);
                 	}else {
                 		lmc = block.getLightmapCoord(blockAccess, x + dirX, y + dirY, z + dirZ);
@@ -372,7 +373,7 @@ public class RenderBlocks
                     lightBR = (dirB + bB + rB + brB) / 4.0F;
                     lightBL = (lB + blB + dirB + bB) / 4.0F;
                 }
-                if(depth > FULL_CUBE_THRESHOLD){
+                if(!isFullCube){
                     float dirB = cache.getBrightness(0, 0, 0);
                     boolean lefT = cache.getOpacity(lefX, lefY, lefZ);
                     boolean botT = cache.getOpacity(-topX, -topY, -topZ);
@@ -392,7 +393,17 @@ public class RenderBlocks
                     lightBL = (lB + blB + dirB + bB) / 4.0F * depth + lightBL*(1-depth);
                 }
             } else {
-                float brightness = cache.getBrightness(dirX, dirY, dirZ);
+                int dirX2 = dirX;
+                int dirY2 = dirY;
+                int dirZ2 = dirZ;
+
+                if(!isFullCube) {
+                    dirX2 = 0;
+                    dirY2 = 0;
+                    dirZ2 = 0;
+                }
+
+                float brightness = cache.getBrightness(dirX2, dirY2, dirZ2);
                 lightTL = lightBL = lightBR = lightTR = brightness;
             }
         }
diff --git a/src/main/java/net/minecraft/client/render/RenderGlobal.java b/src/main/java/net/minecraft/client/render/RenderGlobal.java
index cdc71046b..44cc472e5 100644
--- a/src/main/java/net/minecraft/client/render/RenderGlobal.java
+++ b/src/main/java/net/minecraft/client/render/RenderGlobal.java
@@ -21,6 +21,7 @@ import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.MusicDiscItem;
 import net.minecraft.core.lang.I18n;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
@@ -1718,20 +1719,22 @@ public class RenderGlobal
                 break;
 
             case EVENT_DISPENSER_PARTICLES: // Dispenser eject particles
-                int j1 = data % 3 - 1;
-                int k1 = (data / 3) % 3 - 1;
-                double d = (double)x + (double)j1 * 0.6D + 0.5D;
-                double d1 = (double)y + 0.5D;
-                double d2 = (double)z + (double)k1 * 0.6D + 0.5D;
-                for(int l1 = 0; l1 < 10; l1++) {
-                    double d3 = random.nextDouble() * 0.2D + 0.01D;
-                    double d4 = d + (double)j1 * 0.01D + (random.nextDouble() - 0.5D) * (double)k1 * 0.5D;
-                    double d5 = d1 + (random.nextDouble() - 0.5D) * 0.5D;
-                    double d6 = d2 + (double)k1 * 0.01D + (random.nextDouble() - 0.5D) * (double)j1 * 0.5D;
-                    double d7 = (double)j1 * d3 + random.nextGaussian() * 0.01D;
-                    double d8 = -0.03D + random.nextGaussian() * 0.01D;
-                    double d9 = (double)k1 * d3 + random.nextGaussian() * 0.01D;
-                    addParticle("smoke", d4, d5, d6, d7, d8, d9, 0);
+                Direction direction = Direction.getDirectionById(data);
+                int xOff = direction.getOffsetX();
+                int yOff = direction.getOffsetY();
+                int zOff = direction.getOffsetZ();
+                double px = (double)x + (double)xOff * 0.6D + 0.5D;
+                double py = (double)y + (double)yOff * 0.6D + 0.5D;
+                double pz = (double)z + (double)zOff * 0.6D + 0.5D;
+                for(int i = 0; i < 10; i++) {
+                    double rO = random.nextDouble() * 0.2D + 0.01D;
+                    double fx = px + (double)xOff * 0.01D + (random.nextDouble() - 0.5D) * (double)zOff * 0.5D;
+                    double fy = py + (double)yOff * 0.01D + (random.nextDouble() - 0.5D) * (double)yOff * 0.5D;
+                    double fz = pz + (double)zOff * 0.01D + (random.nextDouble() - 0.5D) * (double)xOff * 0.5D;
+                    double mx = (double)xOff * rO + random.nextGaussian() * 0.01D;
+                    double my = (double)yOff * rO + random.nextGaussian() * 0.01D;
+                    double mz = (double)zOff * rO + random.nextGaussian() * 0.01D;
+                    addParticle("smoke", fx, fy, fz, mx, my, mz, 0);
                 }
 
                 break;
diff --git a/src/main/java/net/minecraft/client/render/WorldRenderer.java b/src/main/java/net/minecraft/client/render/WorldRenderer.java
index 82a9c600e..db4b333fb 100644
--- a/src/main/java/net/minecraft/client/render/WorldRenderer.java
+++ b/src/main/java/net/minecraft/client/render/WorldRenderer.java
@@ -6,7 +6,6 @@ import java.util.List;
 import java.util.Random;
 
 import com.mojang.logging.LogUtils;
-import net.minecraft.client.world.chunk.provider.ChunkProviderDynamic;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.util.phys.Vec3;
 import org.lwjgl.input.Mouse;
@@ -128,7 +127,7 @@ public class WorldRenderer
 		final double blockReach = mc.playerController.getBlockReachDistance();
 		final double entityReach = mc.playerController.getEntityReachDistance();
 		
-		Vec3 pos1 = mc.thePlayer.getPosition(partialTicks);
+		Vec3 pos1 = mc.thePlayer.getPosition(partialTicks, false);
 		Vec3 look = mc.thePlayer.getViewVector(partialTicks);
 		Vec3 pos2 = pos1.add(look.x * blockReach, look.y * blockReach, look.z * blockReach);
 		
@@ -136,7 +135,7 @@ public class WorldRenderer
 		mc.objectMouseOver = mc.theWorld.checkBlockCollisionBetweenPoints(pos1, pos2);
 		
 		// Calculate again because block raytrace changes the values
-		pos1 = mc.thePlayer.getPosition(partialTicks);
+		pos1 = mc.thePlayer.getPosition(partialTicks, false);
 		look = mc.thePlayer.getViewVector(partialTicks);
 		pos2 = pos1.add(look.x * entityReach, look.y * entityReach, look.z * entityReach);
 		
diff --git a/src/main/java/net/minecraft/client/render/block/model/ActivatorBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/ActivatorBlockModel.java
new file mode 100644
index 000000000..d9161bf31
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/ActivatorBlockModel.java
@@ -0,0 +1,49 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.client.render.texture.stitcher.TextureRegistry;
+import net.minecraft.core.block.ActivatorBlock;
+import net.minecraft.core.block.FullRotatableBlock;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.VeryRotatableEntityBlock;
+import net.minecraft.core.block.RotatableBlock;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.util.helper.Sides;
+
+public class ActivatorBlockModel extends VeryRotatableBlockModel<ActivatorBlock> {
+    public final IconCoordinate frontPowered = TextureRegistry.getTexture("minecraft:block/activator_front_active");
+    public final IconCoordinate frontOverbright = TextureRegistry.getTexture("minecraft:block/activator_front_active_overlay");
+    public ActivatorBlockModel(Block block) {
+        super(block);
+    }
+
+    @Override
+    public boolean hasOverbright() {
+        return true;
+    }
+
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
+    {
+        boolean isPowered = (data & ActivatorBlock.MASK_POWERED) != 0;
+        final Direction dir = VeryRotatableEntityBlock.metaToDirection(data);
+        if (side == dir.getSide()) {
+            return isPowered ? frontPowered : atlasIndices[Side.TOP.getId()];
+        }
+        if (side == Side.BOTTOM || side == Side.TOP) return atlasIndices[Side.BOTTOM.getId()];
+        if ((dir.getSide() == Side.BOTTOM || dir.getSide() == Side.TOP) && (side == Side.NORTH || side == Side.SOUTH)) return atlasIndices[Side.BOTTOM.getId()];
+        return side.getDirection() != dir.getOpposite() ? atlasIndices[Side.NORTH.getId()] : atlasIndices[Side.BOTTOM.getId()];
+    }
+
+    @Override
+    public IconCoordinate getBlockOverbrightTextureFromSideAndMeta(Side side, int data)
+    {
+        boolean isPowered = (data & ActivatorBlock.MASK_POWERED) != 0;
+        if(isPowered && side.getId() == FullRotatableBlock.metaToDirection(data).getSide().getId())
+        {
+            return frontOverbright;
+        }
+        return null;
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/block/model/AxisAlignedBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/AxisAlignedBlockModel.java
index 235d662c3..c1a7398b1 100644
--- a/src/main/java/net/minecraft/client/render/block/model/AxisAlignedBlockModel.java
+++ b/src/main/java/net/minecraft/client/render/block/model/AxisAlignedBlockModel.java
@@ -3,8 +3,10 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.core.block.AxisAlignedBlock;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.RotatableBlock;
+import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.helper.Sides;
 
@@ -16,23 +18,23 @@ public class AxisAlignedBlockModel<T extends Block> extends StandardBlockModel<T
     @Override
     public boolean render(Tessellator tessellator, int x, int y, int z) {
         block.setBlockBoundsBasedOnState(renderBlocks.blockAccess, x, y, z);
-        int l = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
-        int i1 = RotatableBlock.getOrientation(l);
-        switch(i1)
+        int meta = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
+        Axis axis = AxisAlignedBlock.metaToAxis(meta);
+        switch(axis)
         {
-            case 0: // '\0'
+            case Y: // '\0'
                 renderBlocks.uvRotateEast = 0;
                 renderBlocks.uvRotateWest = 0;
                 renderBlocks.uvRotateSouth = 0;
                 renderBlocks.uvRotateNorth = 0;
                 break;
 
-            case 1: // '\002'
+            case Z: // '\002'
                 renderBlocks.uvRotateSouth = 1;
                 renderBlocks.uvRotateNorth = 1;
                 break;
 
-            case 2: // '\002'
+            case X: // '\002'
                 renderBlocks.uvRotateEast = 1;
                 renderBlocks.uvRotateWest = 1;
                 renderBlocks.uvRotateTop = 1;
diff --git a/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java b/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
index 54e66fac3..21bccd4cd 100644
--- a/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
+++ b/src/main/java/net/minecraft/client/render/block/model/BlockModelDispatcher.java
@@ -310,8 +310,8 @@ public class BlockModelDispatcher
         addDispatch(new StandardBlockModel<>(Blocks.PRESSURE_PLATE_PLANKS_OAK).withTextures("minecraft:block/planks_oak").withCustomItemBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2));
         addDispatch(new StandardBlockModel<>(Blocks.PRESSURE_PLATE_COBBLE_STONE).withTextures("minecraft:block/cobbled_stone").withCustomItemBounds(0.5F - f, 0.5F - f1, 0.5F - f2, 0.5F + f, 0.5F + f1, 0.5F + f2));
 
-        addDispatch(new MotionSensorBlockModel(Blocks.MOTION_SENSOR_IDLE).withTextures("minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_idle_front", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side"));
-        addDispatch(new MotionSensorBlockModel(Blocks.MOTION_SENSOR_ACTIVE).withTextures("minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_active_front", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side"));
+        addDispatch(new MotionSensorBlockModel(Blocks.MOTION_SENSOR_IDLE).withTextures("minecraft:block/motionsensor_idle_front", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side"));
+        addDispatch(new MotionSensorBlockModel(Blocks.MOTION_SENSOR_ACTIVE).withTextures("minecraft:block/motionsensor_active_front", "minecraft:block/motionsensor_side", "minecraft:block/motionsensor_side"));
 
         addDispatch(new RepeaterBlockModel(Blocks.REPEATER_IDLE).withTextures("minecraft:block/repeater_idle_top", "minecraft:block/polished_stone_top"));
         addDispatch(new RepeaterBlockModel(Blocks.REPEATER_ACTIVE).withTextures("minecraft:block/repeater_active_top", "minecraft:block/polished_stone_top").withOverbrightTexture("minecraft:block/repeater_active_overlay"));
@@ -333,7 +333,8 @@ public class BlockModelDispatcher
 
         addDispatch(new SpikesBlockModel<>(Blocks.SPIKES).withTextures("minecraft:block/spikes_top", "minecraft:block/spikes_bottom", "minecraft:block/spikes_side"));
 
-        addDispatch(new HorizontalRotationBlockModel<>(Blocks.DISPENSER_COBBLE_STONE).withTextures("minecraft:block/dispenser_top", "minecraft:block/dispenser_top", "minecraft:block/dispenser_front", "minecraft:block/dispenser_side", "minecraft:block/dispenser_side", "minecraft:block/dispenser_side"));
+        addDispatch(new VeryRotatableBlockModel<>(Blocks.DISPENSER_COBBLE_STONE).withTextures("minecraft:block/dispenser_front", "minecraft:block/dispenser_top", "minecraft:block/dispenser_side"));
+        addDispatch(new ActivatorBlockModel(Blocks.ACTIVATOR_COBBLE_NETHERRACK).withTextures("minecraft:block/activator_front", "minecraft:block/activator_top", "minecraft:block/activator_side"));
 
         addDispatch(new TrapDoorBlockModel<>(Blocks.TRAPDOOR_PLANKS_OAK).withTextures("minecraft:block/trapdoor_planks_oak_top", "minecraft:block/trapdoor_planks_oak_side"));
         addDispatch(new TrapDoorBlockModel<>(Blocks.TRAPDOOR_IRON).withTextures("minecraft:block/trapdoor_iron_top", "minecraft:block/trapdoor_iron_side"));
diff --git a/src/main/java/net/minecraft/client/render/block/model/EmptyBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/EmptyBlockModel.java
index 19e20201c..0ebe57995 100644
--- a/src/main/java/net/minecraft/client/render/block/model/EmptyBlockModel.java
+++ b/src/main/java/net/minecraft/client/render/block/model/EmptyBlockModel.java
@@ -1,7 +1,9 @@
 package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.util.helper.Side;
 import org.jetbrains.annotations.Nullable;
 
 public class EmptyBlockModel extends StandardBlockModel<Block> {
@@ -19,6 +21,11 @@ public class EmptyBlockModel extends StandardBlockModel<Block> {
 
     }
 
+    @Override
+    public IconCoordinate getParticleTexture(Side side, int meta) {
+        return null;
+    }
+
     @Override
     public boolean shouldItemRender3d() {
         return false;
diff --git a/src/main/java/net/minecraft/client/render/block/model/HorizontalRotationBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/HorizontalRotationBlockModel.java
index 6187733eb..c79954cad 100644
--- a/src/main/java/net/minecraft/client/render/block/model/HorizontalRotationBlockModel.java
+++ b/src/main/java/net/minecraft/client/render/block/model/HorizontalRotationBlockModel.java
@@ -2,6 +2,7 @@ package net.minecraft.client.render.block.model;
 
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.RotatableBlock;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.helper.Sides;
 
@@ -13,7 +14,7 @@ public class HorizontalRotationBlockModel<T extends Block> extends StandardBlock
     @Override
     public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
     {
-        int index = Sides.orientationLookUpHorizontal[6 * Math.min(data, 5) + side.getId()];
+        int index = Sides.orientationLookUpHorizontal[6 * Math.min(data & RotatableBlock.MASK_DIRECTION, 5) + side.getId()];
         if (index >= Sides.orientationLookUpHorizontal.length) return atlasIndices[0];
         return atlasIndices[index];
     }
diff --git a/src/main/java/net/minecraft/client/render/block/model/MotionSensorBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/MotionSensorBlockModel.java
index 2401550df..34929a8f3 100644
--- a/src/main/java/net/minecraft/client/render/block/model/MotionSensorBlockModel.java
+++ b/src/main/java/net/minecraft/client/render/block/model/MotionSensorBlockModel.java
@@ -3,10 +3,11 @@ package net.minecraft.client.render.block.model;
 import net.minecraft.client.render.texture.stitcher.IconCoordinate;
 import net.minecraft.client.render.texture.stitcher.TextureRegistry;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.FullRotatableBlock;
 import net.minecraft.core.block.MotionSensorBlock;
 import net.minecraft.core.util.helper.Side;
 
-public class MotionSensorBlockModel extends HorizontalRotationBlockModel<MotionSensorBlock> {
+public class MotionSensorBlockModel extends VeryRotatableBlockModel<MotionSensorBlock> {
     protected IconCoordinate overlay = TextureRegistry.getTexture("minecraft:block/motionsensor_overlay");
     public MotionSensorBlockModel(Block block) {
         super(block);
@@ -17,7 +18,7 @@ public class MotionSensorBlockModel extends HorizontalRotationBlockModel<MotionS
     {
         if (!block.isActive) return null;
 
-        if(side.getId() == data)
+        if(side.getId() == FullRotatableBlock.metaToDirection(data).getSide().getId())
         {
             return overlay;
         }
diff --git a/src/main/java/net/minecraft/client/render/block/model/TorchRedstoneBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/TorchRedstoneBlockModel.java
index 7b65a424e..de07d508e 100644
--- a/src/main/java/net/minecraft/client/render/block/model/TorchRedstoneBlockModel.java
+++ b/src/main/java/net/minecraft/client/render/block/model/TorchRedstoneBlockModel.java
@@ -24,4 +24,9 @@ public class TorchRedstoneBlockModel extends TorchBlockModel<RedstoneTorchBlock>
             return super.getBlockTextureFromSideAndMetadata(side, data);
         }
     }
+
+    @Override
+    public IconCoordinate getParticleTexture(Side side, int meta) {
+        return atlasIndices[Side.NORTH.getId()];
+    }
 }
diff --git a/src/main/java/net/minecraft/client/render/block/model/VeryRotatableBlockModel.java b/src/main/java/net/minecraft/client/render/block/model/VeryRotatableBlockModel.java
new file mode 100644
index 000000000..57c6fcf51
--- /dev/null
+++ b/src/main/java/net/minecraft/client/render/block/model/VeryRotatableBlockModel.java
@@ -0,0 +1,49 @@
+package net.minecraft.client.render.block.model;
+
+import net.minecraft.client.render.tessellator.Tessellator;
+import net.minecraft.client.render.texture.stitcher.IconCoordinate;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.VeryRotatableEntityBlock;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
+import org.jetbrains.annotations.Nullable;
+
+public class VeryRotatableBlockModel<T extends Block> extends StandardBlockModel<T> {
+    public VeryRotatableBlockModel(Block block) {
+        super(block);
+    }
+
+    @Override
+    public boolean render(Tessellator tessellator, int x, int y, int z) {
+        block.setBlockBoundsBasedOnState(renderBlocks.blockAccess, x, y, z);
+        final int meta = renderBlocks.blockAccess.getBlockMetadata(x, y, z);
+        final Direction dir = VeryRotatableEntityBlock.metaToDirection(meta);
+
+        if (dir == Direction.DOWN || dir == Direction.UP) {
+            renderBlocks.uvRotateSouth = 1;
+            renderBlocks.uvRotateNorth = 2;
+        }
+        final boolean result = renderStandardBlock(tessellator, block, x, y, z);
+        resetRenderBlocks();
+
+        return result;
+    }
+
+
+    @Override
+    public void renderBlockOnInventory(Tessellator tessellator, int metadata, float brightness, float alpha, @Nullable Integer lightmapCoordinate) {
+        super.renderBlockOnInventory(tessellator, 3, brightness, alpha, lightmapCoordinate);
+    }
+
+    @Override
+    public IconCoordinate getBlockTextureFromSideAndMetadata(Side side, int data)
+    {
+        final Direction dir = VeryRotatableEntityBlock.metaToDirection(data);
+        if (side == dir.getSide()) {
+            return atlasIndices[Side.TOP.getId()];
+        }
+        if (side == Side.BOTTOM || side == Side.TOP) return atlasIndices[Side.BOTTOM.getId()];
+        if ((dir.getSide() == Side.BOTTOM || dir.getSide() == Side.TOP) && (side == Side.NORTH || side == Side.SOUTH)) return atlasIndices[Side.BOTTOM.getId()];
+        return side.getDirection() != dir.getOpposite() ? atlasIndices[Side.NORTH.getId()] : atlasIndices[Side.BOTTOM.getId()];
+    }
+}
diff --git a/src/main/java/net/minecraft/client/render/blockentity/MeshBlockEntityRenderer.java b/src/main/java/net/minecraft/client/render/blockentity/MeshBlockEntityRenderer.java
index 2ce9fc9c6..4b832d2ee 100644
--- a/src/main/java/net/minecraft/client/render/blockentity/MeshBlockEntityRenderer.java
+++ b/src/main/java/net/minecraft/client/render/blockentity/MeshBlockEntityRenderer.java
@@ -11,12 +11,15 @@ import net.minecraft.client.render.item.model.ItemModelDispatcher;
 import net.minecraft.client.render.tessellator.Tessellator;
 import net.minecraft.core.Global;
 import net.minecraft.core.util.helper.MathHelper;
+import java.util.Random;
 import org.lwjgl.opengl.GL12;
 
 public class MeshBlockEntityRenderer extends BlockEntityRenderer<GoldMeshBlockEntity> {
 	
 	public ItemEntity renderEntity = new ItemEntity(null);
-	
+
+    private Random rand = new Random();
+
     @Override
     public void doRender(Tessellator tessellator, GoldMeshBlockEntity tileEntity, double x, double y, double z, float renderPartialTicks) {
         if(tileEntity.filterItem == null) return;
@@ -37,7 +40,7 @@ public class MeshBlockEntityRenderer extends BlockEntityRenderer<GoldMeshBlockEn
         BlockModel.setRenderBlocks(EntityRenderDispatcher.instance.itemRenderer.renderBlocksInstance);
         GL11.glEnable(GL12.GL_RESCALE_NORMAL);
         GL11.glEnable(GL11.GL_BLEND);
-        ItemModelDispatcher.getInstance().getDispatch(tileEntity.filterItem).renderAsItemEntity(Tessellator.instance, renderEntity, tileEntity.worldObj.rand, tileEntity.filterItem, 1, f3, lightLevel, renderPartialTicks);
+        ItemModelDispatcher.getInstance().getDispatch(tileEntity.filterItem).renderAsItemEntity(Tessellator.instance, renderEntity, rand, tileEntity.filterItem, 1, f3, lightLevel, renderPartialTicks);
         GL11.glDisable(GL11.GL_BLEND);
         GL11.glDisable(GL12.GL_RESCALE_NORMAL);
         GL11.glPopMatrix();
diff --git a/src/main/java/net/minecraft/core/block/ActivatorBlock.java b/src/main/java/net/minecraft/core/block/ActivatorBlock.java
new file mode 100644
index 000000000..60a44ff0c
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/ActivatorBlock.java
@@ -0,0 +1,138 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.block.entity.BlockEntity;
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.Item;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.LevelListener;
+import net.minecraft.core.world.World;
+
+import java.util.Random;
+
+public class ActivatorBlock extends VeryRotatableEntityBlock
+{
+    public static final int MASK_POWERED = 0b0000_1000;
+    public ActivatorBlock(String key, String namespaceId, int id)
+    {
+        super(key, namespaceId, id, Material.netherrack);
+    }
+
+    @Override
+    public int tickDelay()
+    {
+        return 4;
+    }
+
+    @Override
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
+    {
+        if (!world.isClientSide) {
+            ActivatorBlockEntity dispenserBlockEntity = (ActivatorBlockEntity) world.getBlockEntity(x, y, z);
+            player.displayActivatorScreen(dispenserBlockEntity);
+        }
+        return true;
+    }
+
+    private void useItem(World world, int x, int y, int z, Random random)
+    {
+        Direction direction = RotatableBlock.getDirectionFromMeta(world.getBlockMetadata(x, y, z));
+        int xOffset = direction.getOffsetX();
+        int yOffset = direction.getOffsetY();
+        int zOffset = direction.getOffsetZ();
+
+        ActivatorBlockEntity activator = (ActivatorBlockEntity)world.getBlockEntity(x, y, z);
+        if (!activator.locked(activator.stackSelector)) {
+            ItemStack itemStack = activator.getNextStack();
+
+            double px = (double)xOffset * 0.6D + 0.5D;
+            double py = (double)yOffset * 0.6D + 0.5D;
+            double pz = (double)zOffset * 0.6D + 0.5D;
+            if(itemStack == null)
+            {
+                Block block = world.getBlock(x + xOffset, y + yOffset, z + zOffset);
+                if (block != null) {
+                    block.onActivatorInteract(world, x + xOffset, y + yOffset, z + zOffset, activator, direction);
+                } else {
+                    world.playBlockEvent(LevelListener.EVENT_DISPENSER_EMPTY, x, y, z, 0);
+                }
+            }
+            else
+            {
+                Item item = itemStack.getItem();
+                item.onUseByActivator(itemStack, activator, world, random, x, y, z, px, py, pz, direction);
+                activator.nullDeadItems();
+                world.playBlockEvent(LevelListener.EVENT_DISPENSER_PARTICLES, x, y, z, direction.getId());
+            }
+        } else {
+            activator.shiftSelector();
+        }
+    }
+
+    @Override
+    public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
+    {
+        int meta = world.getBlockMetadata(x, y, z);
+        boolean flag = getNeighborSignal(world, x, y, z, RotatableBlock.getDirectionFromMeta(meta));
+        if(flag && (meta & MASK_POWERED) == 0)
+        {
+            world.scheduleBlockUpdate(x, y, z, id, tickDelay());
+            world.setBlockMetadata(x, y, z, meta | MASK_POWERED);
+        } else if (!flag){
+            world.setBlockMetadata(x, y, z, meta & ~MASK_POWERED);
+        }
+    }
+
+    @Override
+    public void updateTick(World world, int x, int y, int z, Random rand)
+    {
+        if(getNeighborSignal(world, x, y, z, RotatableBlock.getDirectionFromMeta(world.getBlockMetadata(x, y, z))))
+        {
+            useItem(world, x, y, z, rand);
+        }
+    }
+
+    private boolean getNeighborSignal(World world, int x, int y, int z, Direction direction) {
+        if(direction != Direction.DOWN && world.getSignal(x, y - 1, z, Side.BOTTOM)) {
+            return true;
+        }
+        if(direction != Direction.UP && world.getSignal(x, y + 1, z, Side.TOP)) {
+            return true;
+        }
+        if(direction != Direction.NORTH && world.getSignal(x, y, z - 1, Side.NORTH)) {
+            return true;
+        }
+        if(direction != Direction.SOUTH && world.getSignal(x, y, z + 1, Side.SOUTH)) {
+            return true;
+        }
+        if(direction != Direction.EAST && world.getSignal(x + 1, y, z, Side.EAST)) {
+            return true;
+        }
+        if(direction != Direction.WEST && world.getSignal(x - 1, y, z, Side.WEST)) {
+            return true;
+        }
+        if(world.getSignal(x, y, z, Side.BOTTOM)) {
+            return true;
+        }
+        if(world.getSignal(x, y + 1, z - 1, Side.NORTH)) {
+            return true;
+        }
+        if(world.getSignal(x, y + 1, z + 1, Side.SOUTH)) {
+            return true;
+        }
+        if(world.getSignal(x - 1, y + 1, z, Side.WEST)) {
+            return true;
+        }
+        return world.getSignal(x + 1, y + 1, z, Side.EAST);
+    }
+
+    @Override
+    protected BlockEntity getNewBlockEntity()
+    {
+        return new ActivatorBlockEntity();
+    }
+
+}
diff --git a/src/main/java/net/minecraft/core/block/AlgaeBlock.java b/src/main/java/net/minecraft/core/block/AlgaeBlock.java
index 8d1a21c09..733f29bd5 100644
--- a/src/main/java/net/minecraft/core/block/AlgaeBlock.java
+++ b/src/main/java/net/minecraft/core/block/AlgaeBlock.java
@@ -30,7 +30,7 @@ public class AlgaeBlock extends Block
     {
         if(entity instanceof BoatEntity) {
             int data = world.getBlockMetadata(x, y, z);
-            world.playSoundEffect(null, 2001, x, y, z, id);
+            world.playBlockEvent(null, 2001, x, y, z, id);
             world.setBlockWithNotify(x, y, z, 0);
             this.onBlockRemoved(world, x, y, z, data);
         }
diff --git a/src/main/java/net/minecraft/core/block/AxisAlignedBlock.java b/src/main/java/net/minecraft/core/block/AxisAlignedBlock.java
index 07cc04736..fde1697f2 100644
--- a/src/main/java/net/minecraft/core/block/AxisAlignedBlock.java
+++ b/src/main/java/net/minecraft/core/block/AxisAlignedBlock.java
@@ -6,6 +6,7 @@ import net.minecraft.core.enums.PlacementMode;
 import net.minecraft.core.util.helper.Axis;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 
 public class AxisAlignedBlock extends Block {
 
@@ -14,7 +15,7 @@ public class AxisAlignedBlock extends Block {
 	}
 
 	@Override
-	public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+	public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
 		Axis axis = mob.getPlacementDirection(side, PlacementMode.SIDE).getAxis();
 		
 		world.setBlockMetadataWithNotify(x, y, z, axisToMeta(axis));
diff --git a/src/main/java/net/minecraft/core/block/BaseLeavesBlock.java b/src/main/java/net/minecraft/core/block/BaseLeavesBlock.java
index 44fe14a60..2da2ab76f 100644
--- a/src/main/java/net/minecraft/core/block/BaseLeavesBlock.java
+++ b/src/main/java/net/minecraft/core/block/BaseLeavesBlock.java
@@ -12,6 +12,7 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.season.Season;
+import org.jetbrains.annotations.Nullable;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, IBlockAccess, Material
@@ -214,7 +215,7 @@ public abstract class BaseLeavesBlock extends Block
     }
     
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
     	return LeavesLayerBlock.MASK_PERMANENT;
     }
     
diff --git a/src/main/java/net/minecraft/core/block/Block.java b/src/main/java/net/minecraft/core/block/Block.java
index c019e3bf9..e362db9e7 100644
--- a/src/main/java/net/minecraft/core/block/Block.java
+++ b/src/main/java/net/minecraft/core/block/Block.java
@@ -9,8 +9,10 @@ import java.util.Random;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.support.FullSupport;
 import net.minecraft.core.block.support.ISupport;
+import net.minecraft.core.util.helper.Direction;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
@@ -552,6 +554,10 @@ public class Block
         return false;
     }
 
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+
+    }
+
     public void onEntityWalking(World world, int x, int y, int z, Entity entity)
     {
     }
@@ -675,7 +681,7 @@ public class Block
         return true;
     }
 
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
 
     }
 
@@ -716,7 +722,7 @@ public class Block
         return blockMaterial.getPushReaction();
     }
     
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced)
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced)
     {
     	return 0;
     }
diff --git a/src/main/java/net/minecraft/core/block/Blocks.java b/src/main/java/net/minecraft/core/block/Blocks.java
index 3842e3af3..353dacc8c 100644
--- a/src/main/java/net/minecraft/core/block/Blocks.java
+++ b/src/main/java/net/minecraft/core/block/Blocks.java
@@ -313,6 +313,7 @@ public final class Blocks {
     public static Block SPIKES;
 
     public static Block DISPENSER_COBBLE_STONE;
+    public static Block ACTIVATOR_COBBLE_NETHERRACK;
 
     public static Block TRAPDOOR_PLANKS_OAK;
     public static Block TRAPDOOR_IRON;
@@ -973,7 +974,7 @@ public final class Blocks {
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
         PISTON_BASE_STICKY = new StickyPistonBaseBlock("piston.base.sticky", "minecraft:block/piston_base_sticky", 521, 12).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
-        PISTON_HEAD = new PistonHeadBlock("piston.head", "minecraft:block/piston_head", 522, 4/16d).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withDisabledStats()
+        PISTON_HEAD = new PistonHeadBlock("piston.head", "minecraft:block/piston_head", 522, 4/16d).withSound(BlockSounds.STONE).withDisabledNeighborNotifyOnMetadataChange().withDisabledStats().withImmovableFlagSet()
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU, BlockTags.MINEABLE_BY_PICKAXE);
         PISTON_MOVING = new MovingPistonBlock("piston.moving", "minecraft:block/piston_moving", 523).withSound(BlockSounds.STONE).withDisabledStats()
             .withTags(BlockTags.NOT_IN_CREATIVE_MENU);
@@ -997,6 +998,8 @@ public final class Blocks {
 
         DISPENSER_COBBLE_STONE = new DispenserBlock("dispenser.cobble.stone", "minecraft:block/dispenser_cobble_stone", 560).withSound(BlockSounds.STONE).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_PICKAXE);
+        ACTIVATOR_COBBLE_NETHERRACK = new ActivatorBlock("activator.cobble.netherrack", "minecraft:block/activator_cobble_netherrack", 561).withSound(BlockSounds.STONE).withHardness(3.5F).withDisabledNeighborNotifyOnMetadataChange()
+            .withTags(BlockTags.MINEABLE_BY_PICKAXE);
 
         TRAPDOOR_PLANKS_OAK = new TrapDoorBlock("trapdoor.planks.oak", "minecraft:block/trapdoor_planks_oak", 570, Material.wood).withSound(BlockSounds.WOOD).withHardness(3F).withDisabledNeighborNotifyOnMetadataChange()
             .withTags(BlockTags.MINEABLE_BY_AXE);
diff --git a/src/main/java/net/minecraft/core/block/BrazierBlock.java b/src/main/java/net/minecraft/core/block/BrazierBlock.java
index 998713d28..ffa7a1a0c 100644
--- a/src/main/java/net/minecraft/core/block/BrazierBlock.java
+++ b/src/main/java/net/minecraft/core/block/BrazierBlock.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.player.Player;
@@ -7,6 +8,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.FireStrikerItem;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
@@ -63,6 +65,13 @@ public class BrazierBlock
         return false;
     }
 
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        if (burning) {
+            world.setBlockAndMetadataWithNotify(x, y, z, Blocks.BRAZIER_INACTIVE.id, 0);
+        }
+    }
+
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data) {
         if (burning) {
diff --git a/src/main/java/net/minecraft/core/block/ButtonBlock.java b/src/main/java/net/minecraft/core/block/ButtonBlock.java
index dd5884682..c6d345cb4 100644
--- a/src/main/java/net/minecraft/core/block/ButtonBlock.java
+++ b/src/main/java/net/minecraft/core/block/ButtonBlock.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
@@ -7,10 +8,13 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -84,7 +88,7 @@ public class ButtonBlock extends Block
     }
     
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         int i1 = world.getBlockMetadata(x, y, z);
         int j1 = i1 & 8;
         i1 &= 7;
@@ -225,6 +229,10 @@ public class ButtonBlock extends Block
     @Override
     public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
+        return press(world, x, y, z, player);
+    }
+
+    public boolean press(World world, int x, int y, int z, @Nullable Player player) {
         int l = world.getBlockMetadata(x, y, z);
         int i1 = l & 7;
         int j1 = 8 - (l & 8);
@@ -253,6 +261,11 @@ public class ButtonBlock extends Block
         return true;
     }
 
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        press(world, x, y, z, null);
+    }
+
     @Override
     public void onBlockRemoved(World world, int x, int y, int z, int data)
     {
diff --git a/src/main/java/net/minecraft/core/block/CacaoLeavesBlock.java b/src/main/java/net/minecraft/core/block/CacaoLeavesBlock.java
index 8d3d0e2a1..0f231c41a 100644
--- a/src/main/java/net/minecraft/core/block/CacaoLeavesBlock.java
+++ b/src/main/java/net/minecraft/core/block/CacaoLeavesBlock.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.player.Player;
@@ -7,10 +8,12 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.season.Seasons;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -54,8 +57,11 @@ public class CacaoLeavesBlock extends BaseLeavesBlock implements IBonemealable {
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
-    {
+    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced) {
+        return harvest(world, x, y, z, player);
+    }
+
+    public boolean harvest(World world, int x, int y, int z, @Nullable Player player) {
         int meta = world.getBlockMetadata(x, y, z);
         int decayData = meta & 0x0F;
         int growthRate = (meta & 0xF0) >> 4;
@@ -70,7 +76,12 @@ public class CacaoLeavesBlock extends BaseLeavesBlock implements IBonemealable {
             world.scheduleBlockUpdate(x, y, z, Blocks.LEAVES_CACAO.id, tickDelay());
             return true;
         }
-        return super.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
+        return false;
+    }
+
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        harvest(world, x, y, z, null);
     }
 
     @Override
@@ -100,7 +111,7 @@ public class CacaoLeavesBlock extends BaseLeavesBlock implements IBonemealable {
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         int meta = world.getBlockMetadata(blockX, blockY, blockZ);
         if(((meta & 0xF0) >> 4) < 4)
         {
@@ -109,7 +120,7 @@ public class CacaoLeavesBlock extends BaseLeavesBlock implements IBonemealable {
                 if(world.getSeasonManager().getCurrentSeason() != Seasons.OVERWORLD_SUMMER)
                     return true;
                 world.setBlockMetadataWithNotify(blockX, blockY, blockZ, (4 << 4) | meta);
-                if (entityplayer.getGamemode().consumeBlocks())
+                if (player == null || player.getGamemode().consumeBlocks())
                 {
                     itemstack.stackSize--;
                 }
diff --git a/src/main/java/net/minecraft/core/block/CactusBlock.java b/src/main/java/net/minecraft/core/block/CactusBlock.java
index 3734e86a6..5a8134634 100644
--- a/src/main/java/net/minecraft/core/block/CactusBlock.java
+++ b/src/main/java/net/minecraft/core/block/CactusBlock.java
@@ -15,6 +15,7 @@ import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -150,11 +151,11 @@ public class CactusBlock extends Block implements IBonemealable
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(!world.isClientSide)
         {
             ((CactusBlock)Block.blocksList[id]).growCactusOnTop(world, blockX, blockY, blockZ);
-            if (entityplayer.getGamemode().consumeBlocks())
+            if (player == null || player.getGamemode().consumeBlocks())
             {
                 itemstack.stackSize--;
             }
diff --git a/src/main/java/net/minecraft/core/block/ChestBlock.java b/src/main/java/net/minecraft/core/block/ChestBlock.java
index 638e7035b..9c866fa9e 100644
--- a/src/main/java/net/minecraft/core/block/ChestBlock.java
+++ b/src/main/java/net/minecraft/core/block/ChestBlock.java
@@ -4,16 +4,15 @@ import com.mojang.logging.LogUtils;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.entity.ChestBlockEntity;
 import net.minecraft.core.block.material.Material;
-import net.minecraft.core.entity.ItemEntity;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
-import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.container.Container;
 import net.minecraft.core.player.inventory.container.CompoundContainer;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
 
 public class ChestBlock extends EntityBlock implements IPaintable {
@@ -23,7 +22,7 @@ public class ChestBlock extends EntityBlock implements IPaintable {
 	}
 	
 	@Override
-	public void onBlockPlacedByMob(World world, int x, int y, int z, Side placeSide, Mob mob, double sideHeight) {
+	public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side placeSide, Mob mob, double sideHeight) {
 		Direction direction = mob.getHorizontalPlacementDirection(placeSide).getOpposite();
 		Type type = Type.SINGLE;
 		
diff --git a/src/main/java/net/minecraft/core/block/ChestBlockPainted.java b/src/main/java/net/minecraft/core/block/ChestBlockPainted.java
index cf08e3e1d..d7453247e 100644
--- a/src/main/java/net/minecraft/core/block/ChestBlockPainted.java
+++ b/src/main/java/net/minecraft/core/block/ChestBlockPainted.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class ChestBlockPainted extends ChestBlock implements IPainted {
 
@@ -16,7 +17,7 @@ public class ChestBlockPainted extends ChestBlock implements IPainted {
 	}
 	
 	@Override
-	public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		return stack.getMetadata();
 	}
 
diff --git a/src/main/java/net/minecraft/core/block/CropsPumpkinBlock.java b/src/main/java/net/minecraft/core/block/CropsPumpkinBlock.java
index 025397d92..512446800 100644
--- a/src/main/java/net/minecraft/core/block/CropsPumpkinBlock.java
+++ b/src/main/java/net/minecraft/core/block/CropsPumpkinBlock.java
@@ -10,6 +10,7 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -125,13 +126,13 @@ public class CropsPumpkinBlock
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if (world.getBlockMetadata(blockX, blockY, blockZ) < 5)
         {
             if (!world.isClientSide)
             {
                 ((CropsPumpkinBlock)Blocks.CROPS_PUMPKIN).fertilize(world, blockX, blockY, blockZ);
-                if (entityplayer.getGamemode().consumeBlocks())
+                if (player == null || player.getGamemode().consumeBlocks())
                 {
                     itemstack.stackSize--;
                 }
diff --git a/src/main/java/net/minecraft/core/block/CropsWheatBlock.java b/src/main/java/net/minecraft/core/block/CropsWheatBlock.java
index e46da3a28..2edf0870f 100644
--- a/src/main/java/net/minecraft/core/block/CropsWheatBlock.java
+++ b/src/main/java/net/minecraft/core/block/CropsWheatBlock.java
@@ -11,6 +11,7 @@ import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 // Referenced classes of package net.minecraft.src:
 //            FlowerBlock, Block, World, ItemEntity,
@@ -134,13 +135,13 @@ public class CropsWheatBlock extends FlowerBlock implements IBonemealable
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(world.getBlockMetadata(blockX, blockY, blockZ) < 7)
         {
             if(!world.isClientSide)
             {
                 ((CropsWheatBlock)Blocks.CROPS_WHEAT).fertilize(world, blockX, blockY, blockZ);
-                if (entityplayer.getGamemode().consumeBlocks())
+                if (player == null || player.getGamemode().consumeBlocks())
                 {
                     itemstack.stackSize--;
                 }
diff --git a/src/main/java/net/minecraft/core/block/DispenserBlock.java b/src/main/java/net/minecraft/core/block/DispenserBlock.java
index fd02b04f7..fc358c38d 100644
--- a/src/main/java/net/minecraft/core/block/DispenserBlock.java
+++ b/src/main/java/net/minecraft/core/block/DispenserBlock.java
@@ -10,20 +10,15 @@ import net.minecraft.core.entity.projectile.*;
 import net.minecraft.core.item.IDispensable;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.LevelListener;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
 
-// Referenced classes of package net.minecraft.src:
-//            BlockContainer, Material, Block, World, 
-//            IBlockAccess, DispenserBlockEntity, Player, ItemStack,
-//            Item, ArrowProjectile, EggProjectile, SnowballProjectile,
-//            ItemEntity, Mob, MathHelper, IInventory,
-//            BlockEntity
-
-public class DispenserBlock extends RotatableEntityBlock
+public class DispenserBlock extends VeryRotatableEntityBlock
 {
+    public static final int MASK_POWERED = 0b0000_1000;
 	public DispenserBlock(String key, String namespaceId, int id)
     {
         super(key, namespaceId, id, Material.stone);
@@ -35,44 +30,6 @@ public class DispenserBlock extends RotatableEntityBlock
         return 4;
     }
 
-    @Override
-	public void onBlockPlacedByWorld(World world, int x, int y, int z)
-    {
-        super.onBlockPlacedByWorld(world, x, y, z);
-        recalculateLookDirection(world, x, y, z);
-    }
-
-    private void recalculateLookDirection(World world, int x, int y, int z)
-    {
-        if(world.isClientSide)
-        {
-            return;
-        }
-        int l = world.getBlockId(x, y, z - 1);
-        int i1 = world.getBlockId(x, y, z + 1);
-        int j1 = world.getBlockId(x - 1, y, z);
-        int k1 = world.getBlockId(x + 1, y, z);
-        byte byte0 = 3;
-        if(Block.solid[l] && !Block.solid[i1])
-        {
-            byte0 = 3;
-        }
-        if(Block.solid[i1] && !Block.solid[l])
-        {
-            byte0 = 2;
-        }
-        if(Block.solid[j1] && !Block.solid[k1])
-        {
-            byte0 = 5;
-        }
-        if(Block.solid[k1] && !Block.solid[j1])
-        {
-            byte0 = 4;
-        }
-        world.setBlockMetadataWithNotify(x, y, z, byte0);
-    }
-
-
     @Override
     public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
@@ -89,78 +46,72 @@ public class DispenserBlock extends RotatableEntityBlock
 
     private void dispenseItem(World world, int x, int y, int z, Random random)
     {
-        int data = world.getBlockMetadata(x, y, z);
-        int xOffset = 0;
-        int zOffset = 0;
-        if (data == 3) {
-            zOffset = 1;
-        } else if (data == 2) {
-            zOffset = -1;
-        } else if (data == 5) {
-            xOffset = 1;
-        } else {
-            xOffset = -1;
-        }
+        Direction direction = VeryRotatableEntityBlock.metaToDirection(world.getBlockMetadata(x, y, z));
+        int xOffset = direction.getOffsetX();
+        int yOffset = direction.getOffsetX();
+        int zOffset = direction.getOffsetZ();
+
         DispenserBlockEntity tileEntity = (DispenserBlockEntity)world.getBlockEntity(x, y, z);
         ItemStack itemStack = tileEntity.getRandomStackFromInventory();
         double px = (double)x + (double)xOffset * 0.6D + 0.5D;
-        double py = (double)y + 0.5D;
+        double py = (double)y + (double)yOffset * 0.6D + 0.5D;
         double pz = (double)z + (double)zOffset * 0.6D + 0.5D;
         if(itemStack == null)
         {
-            world.playSoundEffect(LevelListener.EVENT_DISPENSER_EMPTY, x, y, z, 0);
+            world.playBlockEvent(LevelListener.EVENT_DISPENSER_EMPTY, x, y, z, 0);
         }
         else
         {
             if (itemStack.getItem() instanceof IDispensable)
             {
                 IDispensable dispensable = (IDispensable) itemStack.getItem();
-                dispensable.onDispensed(itemStack, world, px, py, pz, xOffset, zOffset, random);
-                world.playSoundEffect(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
+                dispensable.onDispensed(itemStack, world, px, py, pz, xOffset, yOffset, zOffset, random);
+                world.playBlockEvent(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
             }
             else if (itemStack.itemID == Items.AMMO_ARROW.id || itemStack.itemID == Items.AMMO_ARROW_GOLD.id)
             {
 
                 ArrowProjectile arrow = itemStack.itemID == Items.AMMO_ARROW.id ? new ArrowProjectile(world, px, py, pz, 0) : new GoldenArrowProjectile(world, px, py, pz);
-                arrow.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
+                arrow.setHeading(xOffset, yOffset + 0.1D, zOffset, 1.1F, 6F);
                 arrow.setDoesArrowBelongToPlayer(true);
                 world.entityJoinedWorld(arrow);
-                world.playSoundEffect(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
+                world.playBlockEvent(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
             }
             else if (itemStack.itemID == Items.AMMO_CHARGE_EXPLOSIVE.id)
             {
                 CannonballProjectile cannonballProjectile = new CannonballProjectile(world, px, py, pz);
-                cannonballProjectile.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
+                cannonballProjectile.setHeading(xOffset, yOffset + 0.1D, zOffset, 1.1F, 6F);
                 world.entityJoinedWorld(cannonballProjectile);
-                world.playSoundEffect(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
+                world.playBlockEvent(LevelListener.EVENT_DISPENSER_PROJECTILE, x, y, z, 0);
             }
             else
             {
                 ItemEntity item = new ItemEntity(world, px, py - 0.3D, pz, itemStack);
                 double randOffset = random.nextDouble() * 0.1D + 0.2D;
                 item.xd = (double)xOffset * randOffset;
-                item.yd = 0.2D;
+                item.yd = (double)yOffset + 0.2D;
                 item.zd = (double)zOffset * randOffset;
                 item.xd += random.nextGaussian() * 0.0075D * 6D;
                 item.yd += random.nextGaussian() * 0.0075D * 6D;
                 item.zd += random.nextGaussian() * 0.0075D * 6D;
                 world.entityJoinedWorld(item);
-                world.playSoundEffect(LevelListener.EVENT_DISPENSER_ITEM, x, y, z, 0);
+                world.playBlockEvent(LevelListener.EVENT_DISPENSER_ITEM, x, y, z, 0);
             }
-            world.playSoundEffect(LevelListener.EVENT_DISPENSER_PARTICLES, x, y, z, xOffset + 1 + (zOffset + 1) * 3);
+            world.playBlockEvent(LevelListener.EVENT_DISPENSER_PARTICLES, x, y, z, xOffset + 1 + (zOffset + 1) * 3);
         }
     }
 
     @Override
-	public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
+    public void onNeighborBlockChange(World world, int x, int y, int z, int blockId)
     {
-        if(blockId > 0 && Block.blocksList[blockId].isSignalSource())
+        boolean flag = world.hasNeighborSignal(x, y, z) || world.hasNeighborSignal(x, y + 1, z);
+        int meta = world.getBlockMetadata(x, y, z);
+        if(flag && (meta & MASK_POWERED) == 0)
         {
-            boolean flag = world.hasNeighborSignal(x, y, z) || world.hasNeighborSignal(x, y + 1, z);
-            if(flag)
-            {
-                world.scheduleBlockUpdate(x, y, z, id, tickDelay());
-            }
+            world.scheduleBlockUpdate(x, y, z, id, tickDelay());
+            world.setBlockMetadata(x, y, z, meta | MASK_POWERED);
+        } else if (!flag){
+            world.setBlockMetadata(x, y, z, meta & ~MASK_POWERED);
         }
     }
 
diff --git a/src/main/java/net/minecraft/core/block/DoorBlock.java b/src/main/java/net/minecraft/core/block/DoorBlock.java
index 0a6469005..a01317bed 100644
--- a/src/main/java/net/minecraft/core/block/DoorBlock.java
+++ b/src/main/java/net/minecraft/core/block/DoorBlock.java
@@ -3,8 +3,10 @@ package net.minecraft.core.block;
 import java.util.Random;
 import java.util.function.Supplier;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.block.entity.BlockEntity;
@@ -19,6 +21,7 @@ import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.LevelListener;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 // Referenced classes of package net.minecraft.src:
@@ -52,7 +55,7 @@ public class DoorBlock extends Block implements IPaintable
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         super.onBlockPlacedByMob(world, x, y, z, side, mob, sideHeight);
 
         int meta = world.getBlockMetadata(x, y, z);
@@ -160,10 +163,15 @@ public class DoorBlock extends Block implements IPaintable
         }
         world.setBlockMetadataWithNotify(x, y, z, l ^ 4);
         world.markBlocksDirty(x, y - 1, z, x, y, z);
-        world.playSoundEffect(player, LevelListener.EVENT_DOOR_SOUND, x, y, z, 0);
+        world.playBlockEvent(player, LevelListener.EVENT_DOOR_SOUND, x, y, z, 0);
         return true;
     }
 
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        onBlockRightClicked(world, x, y, z, null, direction.getSide(), 0.5, 0.5);
+    }
+
     public void onPoweredBlockChange(World world, int x, int y, int z, boolean isPowered)
     {
         int l = world.getBlockMetadata(x, y, z);
@@ -189,7 +197,7 @@ public class DoorBlock extends Block implements IPaintable
         }
         world.setBlockMetadataWithNotify(x, y, z, l ^ 4);
         world.markBlocksDirty(x, y - 1, z, x, y, z);
-        world.playSoundEffect(null, 1003, x, y, z, 0);
+        world.playBlockEvent(null, 1003, x, y, z, 0);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/FarmlandBlock.java b/src/main/java/net/minecraft/core/block/FarmlandBlock.java
index 04fdfdcbd..29085bf58 100644
--- a/src/main/java/net/minecraft/core/block/FarmlandBlock.java
+++ b/src/main/java/net/minecraft/core/block/FarmlandBlock.java
@@ -13,6 +13,7 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -180,7 +181,7 @@ public class FarmlandBlock extends Block implements IBonemealable
 	}
 
 	@Override
-	public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		int data = world.getBlockMetadata(blockX, blockY, blockZ);
 		if (!isFertilized(data)) {
 			world.setBlockMetadataWithNotify(blockX, blockY, blockZ, setFertilized(data, true));
diff --git a/src/main/java/net/minecraft/core/block/FenceGateBlock.java b/src/main/java/net/minecraft/core/block/FenceGateBlock.java
index 65998b750..8630ba6e4 100644
--- a/src/main/java/net/minecraft/core/block/FenceGateBlock.java
+++ b/src/main/java/net/minecraft/core/block/FenceGateBlock.java
@@ -1,17 +1,22 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
 public class FenceGateBlock extends Block implements IPaintable
 {
 
@@ -78,7 +83,7 @@ public class FenceGateBlock extends Block implements IPaintable
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
     	int directionmeta = mob.getHorizontalPlacementDirection(side).getHorizontalIndex();
         int colormeta = world.getBlockMetadata(x, y, z);
         world.setBlockMetadataWithNotify(x, y, z, directionmeta | (colormeta & 0xF0));
@@ -92,7 +97,7 @@ public class FenceGateBlock extends Block implements IPaintable
     }
     
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, @Nullable Player player, Side side, double xPlaced, double yPlaced)
     {
         int l = world.getBlockMetadata(x, y, z);
         if(func_35291_d(l))
@@ -100,7 +105,10 @@ public class FenceGateBlock extends Block implements IPaintable
             world.setBlockMetadataWithNotify(x, y, z, l & -5);
         } else
         {
-            int i1 = (MathHelper.floor((double)((player.yRot * 4F) / 360F) + 0.5D) & 3) % 4;
+            int i1 = 0;
+            if (player != null) {
+                i1 = (MathHelper.floor((double)((player.yRot * 4F) / 360F) + 0.5D) & 3) % 4;
+            }
             int j1 = func_35290_f(l);
             if(j1 == (i1 + 2) % 4)
             {
@@ -118,6 +126,11 @@ public class FenceGateBlock extends Block implements IPaintable
         return true;
     }
 
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        onBlockRightClicked(world, x, y, z, null, direction.getSide(), 0.5, 0.5);
+    }
+
     public static boolean func_35291_d(int i)
     {
         return (i & 4) != 0;
diff --git a/src/main/java/net/minecraft/core/block/FireflyLanternBlock.java b/src/main/java/net/minecraft/core/block/FireflyLanternBlock.java
index 173a92ab7..5e3ed709d 100644
--- a/src/main/java/net/minecraft/core/block/FireflyLanternBlock.java
+++ b/src/main/java/net/minecraft/core/block/FireflyLanternBlock.java
@@ -92,7 +92,7 @@ public class FireflyLanternBlock extends Block{
         return true;
     }
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         if ((side == Side.BOTTOM || (side != Side.TOP && sideHeight >= 0.5d)) && (world.isBlockNormalCube(x, y+1, z) || Block.hasTag(world.getBlockId(x, y + 1, z), BlockTags.CAN_HANG_OFF))){
             world.setBlockMetadataWithNotify(x, y, z, 1);
             return;
diff --git a/src/main/java/net/minecraft/core/block/FlowerBlock.java b/src/main/java/net/minecraft/core/block/FlowerBlock.java
index d6386bddf..a5a25e320 100644
--- a/src/main/java/net/minecraft/core/block/FlowerBlock.java
+++ b/src/main/java/net/minecraft/core/block/FlowerBlock.java
@@ -11,6 +11,7 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -38,7 +39,7 @@ public class FlowerBlock extends Block implements IBonemealable {
     }
 
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
         return MASK_PERMANENT;
     }
 
@@ -103,10 +104,10 @@ public class FlowerBlock extends Block implements IBonemealable {
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, 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()) {
+            if (player == null || player.getGamemode().consumeBlocks()) {
                 itemstack.stackSize--;
             }
             label0:
diff --git a/src/main/java/net/minecraft/core/block/FloweringCherryLeavesBlock.java b/src/main/java/net/minecraft/core/block/FloweringCherryLeavesBlock.java
index ae7bb152f..1f0d820a3 100644
--- a/src/main/java/net/minecraft/core/block/FloweringCherryLeavesBlock.java
+++ b/src/main/java/net/minecraft/core/block/FloweringCherryLeavesBlock.java
@@ -1,14 +1,17 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.IBonemealable;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.season.Seasons;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -41,6 +44,10 @@ public class FloweringCherryLeavesBlock extends CherryLeavesBlock implements IBo
     @Override
     public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
+        return harvest(world, x, y, z, player);
+    }
+
+    public boolean harvest(World world, int x, int y, int z, @Nullable Player player) {
         int meta = world.getBlockMetadata(x, y, z);
         int decayData = meta & MASK_DECAY_DATA;
         int growthRate = getGrowthRate(meta);
@@ -55,8 +62,12 @@ public class FloweringCherryLeavesBlock extends CherryLeavesBlock implements IBo
             world.scheduleBlockUpdate(x, y, z, Blocks.LEAVES_CHERRY_FLOWERING.id, tickDelay());
             return true;
         }
-        return super.onBlockRightClicked(world, x, y, z, player, side, xPlaced, yPlaced);
+        return false;
+    }
 
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        harvest(world, x, y, z, null);
     }
 
     @Override
@@ -80,7 +91,7 @@ public class FloweringCherryLeavesBlock extends CherryLeavesBlock implements IBo
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         int meta = world.getBlockMetadata(blockX, blockY, blockZ);
         if(((meta & 0xF0) >> 4) == 0)
         {
@@ -89,7 +100,7 @@ public class FloweringCherryLeavesBlock extends CherryLeavesBlock implements IBo
                 if(world.getSeasonManager().getCurrentSeason() != Seasons.OVERWORLD_SPRING)
                     return true;
                 world.setBlockMetadataWithNotify(blockX, blockY, blockZ, (1 << 4) | meta);
-                if (entityplayer.getGamemode().consumeBlocks())
+                if (player == null || player.getGamemode().consumeBlocks())
                 {
                     itemstack.stackSize--;
                 }
diff --git a/src/main/java/net/minecraft/core/block/FullRotatableBlock.java b/src/main/java/net/minecraft/core/block/FullRotatableBlock.java
index 4488c5f3e..26a9682a5 100644
--- a/src/main/java/net/minecraft/core/block/FullRotatableBlock.java
+++ b/src/main/java/net/minecraft/core/block/FullRotatableBlock.java
@@ -2,10 +2,10 @@ package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
-import net.minecraft.core.enums.PlacementMode;
 import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 
 public abstract class FullRotatableBlock extends Block {
     public FullRotatableBlock(String translationKey, String namespaceId, int id, Material material) {
@@ -13,7 +13,7 @@ public abstract class FullRotatableBlock extends Block {
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         final Direction direction = mob.getPlacementDirection(side).getOpposite();
 
         world.setBlockMetadataWithNotify(x, y, z, directionToMeta(direction));
diff --git a/src/main/java/net/minecraft/core/block/JukeboxBlock.java b/src/main/java/net/minecraft/core/block/JukeboxBlock.java
index 096fbdb3f..7dac2e605 100644
--- a/src/main/java/net/minecraft/core/block/JukeboxBlock.java
+++ b/src/main/java/net/minecraft/core/block/JukeboxBlock.java
@@ -4,11 +4,13 @@ package net.minecraft.core.block;
 //            BlockContainer, Material, World, JukeboxBlockEntity,
 //            ItemEntity, ItemStack, Player, BlockEntity
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.entity.JukeboxBlockEntity;
 import net.minecraft.core.entity.ItemEntity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
@@ -34,13 +36,20 @@ public class JukeboxBlock extends EntityBlock
         }
     }
 
-    public void playRecord(World world, int i, int j, int k, int l)
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        if (world.getBlockMetadata(x, y, z) != 0) {
+            ejectRecord(world, x, y, z);
+        }
+    }
+
+    public void playRecord(World world, int x, int y, int z, int recordId)
     {
         if (!world.isClientSide) {
-            JukeboxBlockEntity tileentityrecordplayer = (JukeboxBlockEntity) world.getBlockEntity(i, j, k);
-            tileentityrecordplayer.record = l;
-            tileentityrecordplayer.setChanged();
-            world.setBlockMetadataWithNotify(i, j, k, 1);
+            JukeboxBlockEntity jukebox = (JukeboxBlockEntity) world.getBlockEntity(x, y, z);
+            jukebox.record = recordId;
+            jukebox.setChanged();
+            world.setBlockMetadataWithNotify(x, y, z, 1);
         }
     }
 
diff --git a/src/main/java/net/minecraft/core/block/LampBlock.java b/src/main/java/net/minecraft/core/block/LampBlock.java
index bd5d968fe..f185e66fc 100644
--- a/src/main/java/net/minecraft/core/block/LampBlock.java
+++ b/src/main/java/net/minecraft/core/block/LampBlock.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 
 public class LampBlock extends Block implements IPainted {
     public boolean isActive;
@@ -18,7 +19,7 @@ public class LampBlock extends Block implements IPainted {
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         if (world.isClientSide) {
             return;
         }
diff --git a/src/main/java/net/minecraft/core/block/LeverBlock.java b/src/main/java/net/minecraft/core/block/LeverBlock.java
index 7cc1b88b0..81440557e 100644
--- a/src/main/java/net/minecraft/core/block/LeverBlock.java
+++ b/src/main/java/net/minecraft/core/block/LeverBlock.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
@@ -8,10 +9,13 @@ import net.minecraft.core.item.Item;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.util.helper.Axis;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class LeverBlock extends Block
 {
@@ -68,7 +72,7 @@ public class LeverBlock extends Block
     }
     
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         int meta = world.getBlockMetadata(x, y, z);
         boolean isPowered = isPowered(meta);
         int rotation = -1;
@@ -199,6 +203,11 @@ public class LeverBlock extends Block
     @Override
     public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xPlaced, double yPlaced)
     {
+        flip(world, x, y, z, player);
+        return true;
+    }
+
+    public void flip(World world, int x, int y, int z, @Nullable Player player) {
         int meta = world.getBlockMetadata(x, y, z);
         int rotation = getRotation(meta);
         if (isPowered(meta)){
@@ -223,7 +232,11 @@ public class LeverBlock extends Block
         } else {
             world.notifyBlocksOfNeighborChange(x, y + 1, z, id);
         }
-        return true;
+    }
+
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        flip(world, x, y, z, null);
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/core/block/MobSpawnerBlock.java b/src/main/java/net/minecraft/core/block/MobSpawnerBlock.java
index b322e98ce..ede40f130 100644
--- a/src/main/java/net/minecraft/core/block/MobSpawnerBlock.java
+++ b/src/main/java/net/minecraft/core/block/MobSpawnerBlock.java
@@ -13,6 +13,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.gamemode.Gamemode;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 
 public class MobSpawnerBlock extends EntityBlock
 {
@@ -39,7 +40,7 @@ public class MobSpawnerBlock extends EntityBlock
     }
 
     @Override
-	public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+	public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
     	MobSpawnerBlockEntity tileEntity = (MobSpawnerBlockEntity) world.getBlockEntity(x, y, z);
     	tileEntity.setMobId("none");
     }
diff --git a/src/main/java/net/minecraft/core/block/MossBlock.java b/src/main/java/net/minecraft/core/block/MossBlock.java
index ecdf73702..3ba84e837 100644
--- a/src/main/java/net/minecraft/core/block/MossBlock.java
+++ b/src/main/java/net/minecraft/core/block/MossBlock.java
@@ -6,6 +6,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -110,10 +111,10 @@ public class MossBlock extends Block implements IBonemealable {
 	}
 
 	@Override
-	public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(!world.isClientSide)
 		{
-			if (entityplayer.getGamemode().consumeBlocks())
+			if (player == null || player.getGamemode().consumeBlocks())
 			{
 				itemstack.stackSize--;
 			}
diff --git a/src/main/java/net/minecraft/core/block/MotionSensorBlock.java b/src/main/java/net/minecraft/core/block/MotionSensorBlock.java
index f2f3c668b..a1a0153e4 100644
--- a/src/main/java/net/minecraft/core/block/MotionSensorBlock.java
+++ b/src/main/java/net/minecraft/core/block/MotionSensorBlock.java
@@ -19,7 +19,7 @@ import net.minecraft.core.world.WorldSource;
 //            Block, Material, World, Item,
 //            Player, Entity
 
-public class MotionSensorBlock extends RotatableEntityBlock
+public class MotionSensorBlock extends VeryRotatableEntityBlock
 {
     public final boolean isActive;
 
@@ -29,13 +29,6 @@ public class MotionSensorBlock extends RotatableEntityBlock
         this.isActive = isActive;
     }
 
-    @Override
-	public void onBlockPlacedByWorld(World world, int x, int y, int z)
-    {
-        super.onBlockPlacedByWorld(world, x, y, z);
-        setDefaultDirection(world, x, y, z);
-    }
-
     @Override
 	public void animationTick(World world, int x, int y, int z, Random rand)
     {
@@ -116,6 +109,8 @@ public class MotionSensorBlock extends RotatableEntityBlock
     }
     
     public static Direction getFacingDirection(int meta) {
+    	if(meta == 0) return Direction.DOWN;
+    	if(meta == 1) return Direction.UP;
     	if(meta == 2) return Direction.NORTH;
     	if(meta == 3) return Direction.SOUTH;
     	if(meta == 4) return Direction.WEST;
diff --git a/src/main/java/net/minecraft/core/block/NoteBlock.java b/src/main/java/net/minecraft/core/block/NoteBlock.java
index e82d6bd7f..90811c569 100644
--- a/src/main/java/net/minecraft/core/block/NoteBlock.java
+++ b/src/main/java/net/minecraft/core/block/NoteBlock.java
@@ -1,9 +1,11 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.entity.NoteBlockEntity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.block.material.Material;
@@ -49,6 +51,13 @@ public class NoteBlock extends EntityBlock
         }
     }
 
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        NoteBlockEntity noteBlock = (NoteBlockEntity)world.getBlockEntity(x, y, z);
+        noteBlock.changePitch();
+        noteBlock.triggerNote(world, x, y, z);
+    }
+
     @Override
     public void onBlockLeftClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
     {
diff --git a/src/main/java/net/minecraft/core/block/PaintedFenceBlock.java b/src/main/java/net/minecraft/core/block/PaintedFenceBlock.java
index 0e78e1721..006bb02d8 100644
--- a/src/main/java/net/minecraft/core/block/PaintedFenceBlock.java
+++ b/src/main/java/net/minecraft/core/block/PaintedFenceBlock.java
@@ -7,6 +7,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class PaintedFenceBlock extends FenceBlock implements IPainted
 {
@@ -16,7 +17,7 @@ public class PaintedFenceBlock extends FenceBlock implements IPainted
 	}
 	
 	@Override
-	public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		return stack.getMetadata();
 	}
 
diff --git a/src/main/java/net/minecraft/core/block/PaintedFenceGateBlock.java b/src/main/java/net/minecraft/core/block/PaintedFenceGateBlock.java
index 88e93a734..2734b05ff 100644
--- a/src/main/java/net/minecraft/core/block/PaintedFenceGateBlock.java
+++ b/src/main/java/net/minecraft/core/block/PaintedFenceGateBlock.java
@@ -7,6 +7,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class PaintedFenceGateBlock extends FenceGateBlock implements IPainted
 {
@@ -16,7 +17,7 @@ public class PaintedFenceGateBlock extends FenceGateBlock implements IPainted
 	}
 	
 	@Override
-	public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		return stack.getMetadata();
 	}
 
diff --git a/src/main/java/net/minecraft/core/block/PaintedPlanksBlock.java b/src/main/java/net/minecraft/core/block/PaintedPlanksBlock.java
index 2b7fa7b0b..dbb593e77 100644
--- a/src/main/java/net/minecraft/core/block/PaintedPlanksBlock.java
+++ b/src/main/java/net/minecraft/core/block/PaintedPlanksBlock.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class PaintedPlanksBlock extends Block implements IPainted
 {
@@ -17,7 +18,7 @@ public class PaintedPlanksBlock extends Block implements IPainted
     }
     
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced)
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced)
     {
     	return stack.getMetadata();
     }
diff --git a/src/main/java/net/minecraft/core/block/PaintedSlabBlock.java b/src/main/java/net/minecraft/core/block/PaintedSlabBlock.java
index 5afa1a745..a9508082c 100644
--- a/src/main/java/net/minecraft/core/block/PaintedSlabBlock.java
+++ b/src/main/java/net/minecraft/core/block/PaintedSlabBlock.java
@@ -7,6 +7,8 @@ import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class PaintedSlabBlock extends SlabBlock implements IPainted
 {
@@ -16,12 +18,12 @@ public class PaintedSlabBlock extends SlabBlock implements IPainted
 	}
 	
 	@Override
-	public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		return stack.getMetadata();
 	}
 
 	@Override
-	public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+	public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
 		int meta = mob.getVerticalPlacementDirection(side, sideHeight) == Direction.UP ? 2 : 0;
 		world.setBlockMetadataWithNotify(x, y, z, meta | (world.getBlockMetadata(x, y, z) & 0xF0));
 	}
diff --git a/src/main/java/net/minecraft/core/block/PaintedTrapDoorBlock.java b/src/main/java/net/minecraft/core/block/PaintedTrapDoorBlock.java
index a98faf1e2..df6618ca8 100644
--- a/src/main/java/net/minecraft/core/block/PaintedTrapDoorBlock.java
+++ b/src/main/java/net/minecraft/core/block/PaintedTrapDoorBlock.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class PaintedTrapDoorBlock extends TrapDoorBlock implements IPainted {
     public PaintedTrapDoorBlock(String key, String namespaceId, int id, Material material) {
@@ -15,7 +16,7 @@ public class PaintedTrapDoorBlock extends TrapDoorBlock implements IPainted {
     }
     
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
     	return stack.getMetadata() | super.getPlacedBlockMetadata(player, stack, world, x, y, z, side, xPlaced, yPlaced);
     }
     
diff --git a/src/main/java/net/minecraft/core/block/PressurePlateBlock.java b/src/main/java/net/minecraft/core/block/PressurePlateBlock.java
index 7e3565584..0c02f172d 100644
--- a/src/main/java/net/minecraft/core/block/PressurePlateBlock.java
+++ b/src/main/java/net/minecraft/core/block/PressurePlateBlock.java
@@ -9,6 +9,7 @@ import net.minecraft.core.sound.SoundCategory;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
 import net.minecraft.core.util.phys.AABB;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.List;
 import java.util.Random;
@@ -195,7 +196,7 @@ public class PressurePlateBlock extends Block
         return 1;
     }
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         if (!world.canPlaceOnSurfaceOfBlock(x, y - 1 , z) || (side.isHorizontal() && sideHeight > 0.5 && world.isBlockNormalCube(x, y + 1, z))){
             world.setBlockMetadata(x, y, z, world.getBlockMetadata(x, y, z) | 0b10);
         }
diff --git a/src/main/java/net/minecraft/core/block/RepeaterBlock.java b/src/main/java/net/minecraft/core/block/RepeaterBlock.java
index 9e8f2227d..cd036866e 100644
--- a/src/main/java/net/minecraft/core/block/RepeaterBlock.java
+++ b/src/main/java/net/minecraft/core/block/RepeaterBlock.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.block;
 
 import net.minecraft.client.util.helper.Colors;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.BlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
@@ -9,13 +10,26 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.util.helper.Color;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 public class RepeaterBlock extends Block
 {
+    public static final double[] torchPosOffset = {
+        -0.0625D, 0.0625D, 0.1875D, 0.3125D
+    };
+    private static final int[] tickDelayMap = {
+        1, 2, 3, 4
+    };
+    public static final int MASK_DIRECTION = 0b0000_0011;
+    public static final int MASK_TICK_DELAY = 0b0000_1100;
+
+    public final boolean isRepeaterPowered;
 
 	public RepeaterBlock(String key, String namespaceId, int id, boolean flag)
     {
@@ -63,13 +77,13 @@ public class RepeaterBlock extends Block
     @Override
 	public void updateTick(World world, int x, int y, int z, Random rand) {
         int meta = world.getBlockMetadata(x, y, z);
-        boolean flag = func_22022_g(world, x, y, z, meta);
+        boolean flag = isGettingPower(world, x, y, z, meta);
         if(isRepeaterPowered && !flag) {
             world.setBlockAndMetadataWithNotify(x, y, z, Blocks.REPEATER_IDLE.id, meta);
         } else if(!isRepeaterPowered) {
             world.setBlockAndMetadataWithNotify(x, y, z, Blocks.REPEATER_ACTIVE.id, meta);
             if(!flag) {
-                int i1 = (meta & 0xc) >> 2;
+                int i1 = (meta & MASK_TICK_DELAY) >> 2;
                 world.scheduleBlockUpdate(x, y, z, Blocks.REPEATER_ACTIVE.id, tickDelayMap[i1] * 2);
             }
         }
@@ -85,7 +99,7 @@ public class RepeaterBlock extends Block
         if(!isRepeaterPowered) {
             return false;
         }
-        int meta = worldSource.getBlockMetadata(x, y, z) & 3;
+        int meta = worldSource.getBlockMetadata(x, y, z) & MASK_DIRECTION;
         if(meta == 0 && side == Side.SOUTH) {
             return true;
         }
@@ -106,18 +120,18 @@ public class RepeaterBlock extends Block
             return;
         }
         int meta = world.getBlockMetadata(x, y, z);
-        boolean flag = func_22022_g(world, x, y, z, meta);
-        int j1 = (meta & 0xc) >> 2;
+        boolean flag = isGettingPower(world, x, y, z, meta);
+        int tickDelay = (meta & MASK_TICK_DELAY) >> 2;
         if(isRepeaterPowered && !flag) {
-            world.scheduleBlockUpdate(x, y, z, id, tickDelayMap[j1] * 2);
+            world.scheduleBlockUpdate(x, y, z, id, tickDelayMap[tickDelay] * 2);
         } else if(!isRepeaterPowered && flag) {
-            world.scheduleBlockUpdate(x, y, z, id, tickDelayMap[j1] * 2);
+            world.scheduleBlockUpdate(x, y, z, id, tickDelayMap[tickDelay] * 2);
         }
     }
 
-    private boolean func_22022_g(World world, int x, int y, int z, int meta)
+    private boolean isGettingPower(World world, int x, int y, int z, int meta)
     {
-        int direction = meta & 3;
+        int direction = meta & MASK_DIRECTION;
         switch(direction)
         {
         case 0: // '\0'
@@ -136,20 +150,25 @@ public class RepeaterBlock extends Block
     }
 
     @Override
-    public boolean onBlockRightClicked(World world, int x, int y, int z, Player player, Side side, double xHit, double yHit)
+    public boolean onBlockRightClicked(World world, int x, int y, int z, @Nullable Player player, Side side, double xHit, double yHit)
     {
-        int l = world.getBlockMetadata(x, y, z);
-        int i1 = (l & 0xc) >> 2;
-        i1 = i1 + 1 << 2 & 0xc;
-        world.setBlockMetadataWithNotify(x, y, z, i1 | l & 3);
+        int metadata = world.getBlockMetadata(x, y, z);
+        int tickDelay = (metadata & MASK_TICK_DELAY) >> 2;
+        tickDelay = ((tickDelay + 1) << 2) & MASK_TICK_DELAY;
+        world.setBlockMetadataWithNotify(x, y, z, tickDelay | metadata & MASK_DIRECTION);
         return true;
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        onBlockRightClicked(world, x, y, z, null, Side.NONE, 0.5, 0.5);
+    }
+
+    @Override
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
 		int l = mob.getHorizontalPlacementDirection(side).index;
 		world.setBlockMetadataWithNotify(x, y, z, l);
-		boolean flag = func_22022_g(world, x, y, z, l);
+		boolean flag = isGettingPower(world, x, y, z, l);
 		if(flag)
 		{
 		    world.scheduleBlockUpdate(x, y, z, id, 1);
@@ -196,7 +215,7 @@ public class RepeaterBlock extends Block
 		float blue = color.getBlue() / 255.0f;
 		
 		if (rand.nextInt(2) == 0) {
-			switch (meta & 3) {
+			switch (meta & MASK_DIRECTION) {
 			case 0:
 				zOffset = -0.3125D;
 				break;
@@ -211,31 +230,23 @@ public class RepeaterBlock extends Block
 				break;
 			}
 		} else {
-			int i1 = (meta & 0xc) >> 2;
-			switch (meta & 3) {
+			int tickDelay = (meta & MASK_TICK_DELAY) >> 2;
+			switch (meta & MASK_DIRECTION) {
 			case 0:
-				zOffset = torchPosOffset[i1];
+				zOffset = torchPosOffset[tickDelay];
 				break;
 			case 2:
-				zOffset = -torchPosOffset[i1];
+				zOffset = -torchPosOffset[tickDelay];
 				break;
 			case 3:
-				xOffset = torchPosOffset[i1];
+				xOffset = torchPosOffset[tickDelay];
 				break;
 			case 1:
-				xOffset = -torchPosOffset[i1];
+				xOffset = -torchPosOffset[tickDelay];
 				break;
 			}
 		}
 		world.spawnParticle("reddust", px + xOffset, py, pz + zOffset, red, green, blue, redstoneBrightness);
 	}
 
-    public static final double[] torchPosOffset = {
-        -0.0625D, 0.0625D, 0.1875D, 0.3125D
-    };
-    private static final int[] tickDelayMap = {
-        1, 2, 3, 4
-    };
-    public final boolean isRepeaterPowered;
-
 }
diff --git a/src/main/java/net/minecraft/core/block/RotatableBlock.java b/src/main/java/net/minecraft/core/block/RotatableBlock.java
index c48a984e8..6c6972c9e 100644
--- a/src/main/java/net/minecraft/core/block/RotatableBlock.java
+++ b/src/main/java/net/minecraft/core/block/RotatableBlock.java
@@ -2,10 +2,13 @@ package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 
 public abstract class RotatableBlock extends Block{
+    public static final int MASK_DIRECTION = 0b0000_0111;
     public RotatableBlock(String key, String namespaceId, int id, Material material) {
         super(key, namespaceId, id, material);
     }
@@ -20,33 +23,37 @@ public abstract class RotatableBlock extends Block{
         int idPosZ = world.getBlockId(x, y, z + 1);
         int idNegX = world.getBlockId(x - 1, y, z);
         int idPosX = world.getBlockId(x + 1, y, z);
-        byte byte0 = 3;
+        Direction direction = Direction.SOUTH;
         if(Block.solid[idNegZ] && !Block.solid[idPosZ])
         {
-            byte0 = 3;
+            direction = Direction.SOUTH;
         }
         if(Block.solid[idPosZ] && !Block.solid[idNegZ])
         {
-            byte0 = 2;
+            direction = Direction.NORTH;
         }
         if(Block.solid[idNegX] && !Block.solid[idPosX])
         {
-            byte0 = 5;
+            direction = Direction.EAST;
         }
         if(Block.solid[idPosX] && !Block.solid[idNegX])
         {
-            byte0 = 4;
+            direction = Direction.WEST;
         }
-        world.setBlockMetadataWithNotify(x, y, z, byte0);
+        world.setBlockMetadataWithNotify(x, y, z, setDirection(0, direction));
     }
 
-    public static int getOrientation(int i)
+    public static Direction getDirectionFromMeta(int meta)
     {
-        return i & 7;
+        return Direction.getDirectionById(meta & MASK_DIRECTION);
+    }
+
+    public static int setDirection(int meta, Direction direction) {
+        return (meta & ~MASK_DIRECTION) | direction.getId();
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         world.setBlockMetadataWithNotify(x, y, z, mob.getHorizontalPlacementDirection(side).getOpposite().getId());
     }
 
diff --git a/src/main/java/net/minecraft/core/block/RotatableEntityBlock.java b/src/main/java/net/minecraft/core/block/RotatableEntityBlock.java
index f8523a78e..21a7614f1 100644
--- a/src/main/java/net/minecraft/core/block/RotatableEntityBlock.java
+++ b/src/main/java/net/minecraft/core/block/RotatableEntityBlock.java
@@ -2,46 +2,48 @@ package net.minecraft.core.block;
 
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 
 public abstract class RotatableEntityBlock extends EntityBlock {
 
 	public RotatableEntityBlock(String key, String namespaceId, int id, Material material) {
         super(key, namespaceId, id, material);
     }
-	public void setDefaultDirection(World world, int i, int j, int k)
+	public void setDefaultDirection(World world, int x, int y, int z)
     {
         if(world.isClientSide)
         {
             return;
         }
-        int l = world.getBlockId(i, j, k - 1);
-        int i1 = world.getBlockId(i, j, k + 1);
-        int j1 = world.getBlockId(i - 1, j, k);
-        int k1 = world.getBlockId(i + 1, j, k);
-        byte byte0 = 3;
-        if(Block.solid[l] && !Block.solid[i1])
+        int idNegZ = world.getBlockId(x, y, z - 1);
+        int idPosZ = world.getBlockId(x, y, z + 1);
+        int idNegX = world.getBlockId(x - 1, y, z);
+        int idPosX = world.getBlockId(x + 1, y, z);
+        Direction direction = Direction.SOUTH;
+        if(Block.solid[idNegZ] && !Block.solid[idPosZ])
         {
-            byte0 = 3;
+            direction = Direction.SOUTH;
         }
-        if(Block.solid[i1] && !Block.solid[l])
+        if(Block.solid[idPosZ] && !Block.solid[idNegZ])
         {
-            byte0 = 2;
+            direction = Direction.NORTH;
         }
-        if(Block.solid[j1] && !Block.solid[k1])
+        if(Block.solid[idNegX] && !Block.solid[idPosX])
         {
-            byte0 = 5;
+            direction = Direction.EAST;
         }
-        if(Block.solid[k1] && !Block.solid[j1])
+        if(Block.solid[idPosX] && !Block.solid[idNegX])
         {
-            byte0 = 4;
+            direction = Direction.WEST;
         }
-        world.setBlockMetadataWithNotify(i, j, k, byte0);
+        world.setBlockMetadataWithNotify(x, y, z, RotatableBlock.setDirection(0, direction));
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
     	world.setBlockMetadataWithNotify(x, y, z, mob.getHorizontalPlacementDirection(side).getOpposite().getId());
     }
 
diff --git a/src/main/java/net/minecraft/core/block/SaplingBaseBlock.java b/src/main/java/net/minecraft/core/block/SaplingBaseBlock.java
index 13e3af427..b03aa8d7a 100644
--- a/src/main/java/net/minecraft/core/block/SaplingBaseBlock.java
+++ b/src/main/java/net/minecraft/core/block/SaplingBaseBlock.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 // Referenced classes of package net.minecraft.src:
 //            FlowerBlock, World, WorldGenTaiga2, WorldGenForest,
@@ -63,11 +64,11 @@ public abstract class SaplingBaseBlock extends FlowerBlock implements IBonemeala
     }
     
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced){
+    public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced){
         if(!world.isClientSide)
         {
             ((SaplingBaseBlock)Block.blocksList[id]).growTree(world, blockX, blockY, blockZ, world.rand);
-            if (entityplayer.getGamemode().consumeBlocks())
+            if (player == null || player.getGamemode().consumeBlocks())
             {
                 itemstack.stackSize--;
             }
diff --git a/src/main/java/net/minecraft/core/block/SlabBlock.java b/src/main/java/net/minecraft/core/block/SlabBlock.java
index d0a5116fe..d640de755 100644
--- a/src/main/java/net/minecraft/core/block/SlabBlock.java
+++ b/src/main/java/net/minecraft/core/block/SlabBlock.java
@@ -14,6 +14,7 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Random;
 
@@ -187,7 +188,7 @@ public class SlabBlock extends Block
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
     	Direction dir = mob.getVerticalPlacementDirection(side, sideHeight);
     	if(dir == Direction.DOWN) {
             world.setBlockMetadataWithNotify(x, y, z, 0);
diff --git a/src/main/java/net/minecraft/core/block/SpikesBlock.java b/src/main/java/net/minecraft/core/block/SpikesBlock.java
index 264769122..7eb59e2d6 100644
--- a/src/main/java/net/minecraft/core/block/SpikesBlock.java
+++ b/src/main/java/net/minecraft/core/block/SpikesBlock.java
@@ -13,6 +13,7 @@ import net.minecraft.core.block.material.Material;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.helper.DamageType;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
 
 public class SpikesBlock extends Block
 {
@@ -23,7 +24,7 @@ public class SpikesBlock extends Block
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         if (world.isClientSide) {
             return;
         }
@@ -65,10 +66,10 @@ public class SpikesBlock extends Block
 		
 		if(isPowered != wasPowered) {
 			if(isPowered) {
-				world.playSoundEffect(null, 1007, x, y, z, 0);
+				world.playBlockEvent(null, 1007, x, y, z, 0);
 				world.setBlockMetadataWithNotify(x, y, z, 1);
 			}else {
-				world.playSoundEffect(null, 1006, x, y, z, 0);
+				world.playBlockEvent(null, 1006, x, y, z, 0);
 				world.setBlockMetadataWithNotify(x, y, z, 0);
 			}
 		}
diff --git a/src/main/java/net/minecraft/core/block/StackedFlowerBlock.java b/src/main/java/net/minecraft/core/block/StackedFlowerBlock.java
index 313f005cc..fb726d84b 100644
--- a/src/main/java/net/minecraft/core/block/StackedFlowerBlock.java
+++ b/src/main/java/net/minecraft/core/block/StackedFlowerBlock.java
@@ -7,6 +7,7 @@ import net.minecraft.core.enums.EnumDropCause;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Represents a flower block that can store multiple flowers within itself, up to a maximum of 4.
@@ -21,7 +22,7 @@ public class StackedFlowerBlock extends FlowerBlock {
     }
 
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
         final int metadata = stack.getMetadata();
         return setPermanent(metadata, true);
     }
diff --git a/src/main/java/net/minecraft/core/block/StairsBlock.java b/src/main/java/net/minecraft/core/block/StairsBlock.java
index e76946f91..39336b3c0 100644
--- a/src/main/java/net/minecraft/core/block/StairsBlock.java
+++ b/src/main/java/net/minecraft/core/block/StairsBlock.java
@@ -16,6 +16,7 @@ import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.WorldSource;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, World, Mob, MathHelper,
@@ -306,7 +307,7 @@ public class StairsBlock extends Block
     }
     
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
 //    	System.out.println("Placed Side: "+side+" Height: "+sideHeight);
     	
         int meta = world.getBlockMetadata(x, y, z) & 0xF0;
diff --git a/src/main/java/net/minecraft/core/block/SugarcaneBlock.java b/src/main/java/net/minecraft/core/block/SugarcaneBlock.java
index b0ac21819..261a510c6 100644
--- a/src/main/java/net/minecraft/core/block/SugarcaneBlock.java
+++ b/src/main/java/net/minecraft/core/block/SugarcaneBlock.java
@@ -12,6 +12,7 @@ import net.minecraft.core.block.material.Material;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
@@ -137,11 +138,11 @@ public class SugarcaneBlock extends Block implements IBonemealable
     }
 
     @Override
-    public boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(!world.isClientSide)
         {
             ((SugarcaneBlock)Block.blocksList[id]).growReedOnTop(world, blockX, blockY, blockZ);
-            if (entityplayer.getGamemode().consumeBlocks())
+            if (player == null || player.getGamemode().consumeBlocks())
             {
                 itemstack.stackSize--;
             }
diff --git a/src/main/java/net/minecraft/core/block/TorchBlock.java b/src/main/java/net/minecraft/core/block/TorchBlock.java
index c0174f91a..2481adc2c 100644
--- a/src/main/java/net/minecraft/core/block/TorchBlock.java
+++ b/src/main/java/net/minecraft/core/block/TorchBlock.java
@@ -9,6 +9,7 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Random;
 
@@ -72,7 +73,7 @@ public class TorchBlock extends Block
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
     	int l = side.getId();
         int i1 = world.getBlockMetadata(x, y, z);
         if(l == 1 && canPlaceOnTop(world, x, y - 1, z))
diff --git a/src/main/java/net/minecraft/core/block/TrapDoorBlock.java b/src/main/java/net/minecraft/core/block/TrapDoorBlock.java
index 719283f39..ea399580d 100644
--- a/src/main/java/net/minecraft/core/block/TrapDoorBlock.java
+++ b/src/main/java/net/minecraft/core/block/TrapDoorBlock.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.block;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.material.Material;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
@@ -8,19 +9,25 @@ import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.tag.ItemTags;
 import net.minecraft.core.util.helper.Direction;
-import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.LevelListener;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 // Referenced classes of package net.minecraft.src:
 //            Block, Material, IBlockAccess, World, 
 //            AxisAlignedBB, Player, Vec3D, MovingObjectPosition
 
-public class TrapDoorBlock extends Block implements IPaintable {
+public class TrapDoorBlock extends Block {
+    public static final int MASK_DIRECTION = 0b0000_0011;
+    public static final int MASK_OPEN = 0b0000_0100;
+    public static final int MASK_UPPER_HALF = 0b0000_1000;
+
     public TrapDoorBlock(String key, String namespaceId, int id, Material material) {
         super(key, namespaceId, id, material);
         float f = 0.5F;
@@ -29,16 +36,15 @@ public class TrapDoorBlock extends Block implements IPaintable {
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
         super.onBlockPlacedByMob(world, x, y, z, side, mob, sideHeight);
 
         int meta = world.getBlockMetadata(x, y, z);
-        final boolean isPowered = world.hasNeighborSignal(x, y, z);
+        boolean isOpened = isTrapdoorOpen(meta);
+        boolean isPowered = world.hasNeighborSignal(x, y, z);
 
-        if (isPowered) {
-            meta = setTrapdoorPowered(meta, true);
-            meta = setTrapdoorOpen(meta, true);
-            world.setBlockMetadataWithNotify(x, y, z, setTrapdoorPowered(meta, true));
+        if (isOpened != isPowered) {
+            world.setBlockMetadataWithNotify(x, y, z, setTrapdoorOpen(meta, isPowered));
         }
     }
 
@@ -106,12 +112,21 @@ public class TrapDoorBlock extends Block implements IPaintable {
         if (blockMaterial != Material.metal) {
             int l = world.getBlockMetadata(x, y, z);
             world.setBlockMetadataWithNotify(x, y, z, l ^ 4);
-            world.playSoundEffect(player, 1003, x, y, z, 0);
+            world.playBlockEvent(player, LevelListener.EVENT_DOOR_SOUND, x, y, z, 0);
             return true;
         }
         return false;
     }
 
+    @Override
+    public void onActivatorInteract(World world, int x, int y, int z, ActivatorBlockEntity activator, Direction direction) {
+        if (blockMaterial != Material.metal) {
+            int l = world.getBlockMetadata(x, y, z);
+            world.setBlockMetadataWithNotify(x, y, z, l ^ 4);
+            world.playBlockEvent(null, LevelListener.EVENT_DOOR_SOUND, x, y, z, 0);
+        }
+    }
+
     @Override
     public void onNeighborBlockChange(World world, int x, int y, int z, int blockId) {
         if (world.isClientSide) {
@@ -119,16 +134,12 @@ public class TrapDoorBlock extends Block implements IPaintable {
         }
 
         int meta = world.getBlockMetadata(x, y, z);
-        final boolean wasPowered = isTrapdoorPowered(meta);
-        final boolean isPowered = world.hasNeighborSignal(x, y, z);
+        boolean isOpened = isTrapdoorOpen(meta);
+        boolean isPowered = world.hasNeighborSignal(x, y, z);
 
-        if (wasPowered != isPowered) {
-            if (isPowered != isTrapdoorOpen(meta)) {
-                world.playSoundEffect(null, 1003, x, y, z, 0);
-            }
-            meta = setTrapdoorPowered(meta, isPowered);
-            meta = setTrapdoorOpen(meta, isPowered);
-            world.setBlockMetadataWithNotify(x, y, z, setTrapdoorPowered(meta, isPowered));
+        if (isOpened != isPowered) {
+            world.setBlockMetadataWithNotify(x, y, z, setTrapdoorOpen(meta, isPowered));
+            world.playBlockEvent(null, LevelListener.EVENT_DOOR_SOUND, x, y, z, 0);
         }
     }
 
@@ -139,10 +150,10 @@ public class TrapDoorBlock extends Block implements IPaintable {
     }
 
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
-        int meta = getMetaForDirection(player.getHorizontalPlacementDirection(side, PlacementMode.SIDE));
-        if (player.getVerticalPlacementDirection(side, yPlaced) == Direction.UP) {
-            meta = setUpperHalf(meta, true);
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+        int meta = getMetaForDirection(player == null ? side.getDirection().getOpposite() : player.getHorizontalPlacementDirection(side, PlacementMode.SIDE));
+        if (player != null && player.getVerticalPlacementDirection(side, yPlaced) == Direction.UP) {
+            meta |= 8;
         }
         return meta;
     }
@@ -161,65 +172,37 @@ public class TrapDoorBlock extends Block implements IPaintable {
     }
 
     public static boolean isTrapdoorOpen(int metadata) {
-        return (metadata & 0b0000_0100) != 0;
+        return (metadata & MASK_OPEN) != 0;
     }
 
     public static int setTrapdoorOpen(int metadata, boolean isOpen) {
         if (isOpen) {
-            metadata |= 0b0000_0100;
+            metadata |= MASK_OPEN;
         } else {
-            metadata &= 0b1111_1011;
-        }
-        return metadata;
-    }
-
-    public static boolean isTrapdoorPowered(int metadata) {
-        return (metadata & 0b0001_0000) != 0;
-    }
-
-    public static int setTrapdoorPowered(int metadata, boolean isPowered) {
-        if (isPowered) {
-            metadata |= 0b0001_0000;
-        } else {
-            metadata &= 0b1110_1111;
+            metadata &= ~MASK_OPEN;
         }
         return metadata;
     }
 
     public static boolean isUpperHalf(int meta) {
-        return (meta & 8) != 0;
+        return (meta & MASK_UPPER_HALF) != 0;
     }
 
-    public static int setUpperHalf(int metadata, boolean isUpperHalf) {
+    public static int setUpperHalf(int meta, boolean isUpperHalf) {
         if (isUpperHalf) {
-            metadata |= 0b0000_1000;
+            meta |= MASK_UPPER_HALF;
         } else {
-            metadata &= 0b1111_0111;
+            meta &= ~MASK_UPPER_HALF;
         }
-        return metadata;
+        return meta;
     }
 
     public int getMetaForDirection(Direction dir) {
-        if (dir == Direction.NORTH) return 1;
-        if (dir == Direction.EAST) return 2;
-        if (dir == Direction.SOUTH) return 0;
-        if (dir == Direction.WEST) return 3;
-        return 0;
+        return dir.getId();
     }
 
-    public Direction getDirectionForMeta(int metadata) {
-        metadata = metadata & 3;
-        if (metadata == 0) return Direction.SOUTH;
-        if (metadata == 1) return Direction.NORTH;
-        if (metadata == 2) return Direction.EAST;
-        if (metadata == 3) return Direction.WEST;
-        return Direction.NONE;
-    }
-
-    @Override
-    public void setColor(World world, int x, int y, int z, DyeColor color) {
-        final int meta = world.getBlockMetadata(x, y, z);
-        world.setBlockAndMetadata(x, y, z, Blocks.TRAPDOOR_PLANKS_PAINTED.id, meta);
-        ((IPaintable) Blocks.TRAPDOOR_PLANKS_PAINTED).setColor(world, x, y, z, color);
+    public Direction getDirectionForMeta(int meta) {
+        meta = meta & MASK_DIRECTION;
+        return Direction.getDirectionById(meta);
     }
 }
diff --git a/src/main/java/net/minecraft/core/block/VeryRotatableEntityBlock.java b/src/main/java/net/minecraft/core/block/VeryRotatableEntityBlock.java
new file mode 100644
index 000000000..8b2403694
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/VeryRotatableEntityBlock.java
@@ -0,0 +1,29 @@
+package net.minecraft.core.block;
+
+import net.minecraft.core.block.material.Material;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.enums.PlacementMode;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.helper.Side;
+import net.minecraft.core.world.World;
+
+public abstract class VeryRotatableEntityBlock extends RotatableEntityBlock {
+	public VeryRotatableEntityBlock(String key, String namespaceId, int id, Material material) {
+        super(key, namespaceId, id, material);
+    }
+
+    @Override
+    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+        final Direction direction = mob.getPlacementDirection(side).getOpposite();
+
+        world.setBlockMetadataWithNotify(x, y, z, directionToMeta(direction));
+    }
+
+    public static int directionToMeta(Direction direction) {
+        return direction.getId() & 7;
+    }
+
+    public static Direction metaToDirection(int meta) {
+        return Direction.getDirectionById(meta & 7);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/WoolBlock.java b/src/main/java/net/minecraft/core/block/WoolBlock.java
index 95b3062ad..e0d5a70ed 100644
--- a/src/main/java/net/minecraft/core/block/WoolBlock.java
+++ b/src/main/java/net/minecraft/core/block/WoolBlock.java
@@ -8,6 +8,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class WoolBlock extends Block implements IPainted
 {
@@ -17,7 +18,7 @@ public class WoolBlock extends Block implements IPainted
     }
     
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
     	return stack.getMetadata() & 0xF;
     }
 
diff --git a/src/main/java/net/minecraft/core/block/entity/ActivatorBlockEntity.java b/src/main/java/net/minecraft/core/block/entity/ActivatorBlockEntity.java
new file mode 100644
index 000000000..5676b4578
--- /dev/null
+++ b/src/main/java/net/minecraft/core/block/entity/ActivatorBlockEntity.java
@@ -0,0 +1,239 @@
+package net.minecraft.core.block.entity;
+
+import com.mojang.nbt.CompoundTag;
+import com.mojang.nbt.ListTag;
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.RotatableBlock;
+import net.minecraft.core.block.motion.CarriedBlock;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.ItemEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.world.World;
+
+import java.util.Random;
+
+public class ActivatorBlockEntity extends BlockEntity implements Container {
+    public static final int CONTAINER_SIZE = 9;
+    private ItemStack[] dispenserContents;
+    private final Random random;
+    protected short lockedSlotBitSet;
+    public int stackSelector = 0;
+
+    public ActivatorBlockEntity()
+    {
+        dispenserContents = new ItemStack[CONTAINER_SIZE];
+        random = new Random();
+    }
+
+    @Override
+    public int getContainerSize()
+    {
+        return CONTAINER_SIZE;
+    }
+
+    @Override
+    public ItemStack getItem(int index)
+    {
+        return dispenserContents[index];
+    }
+
+    @Override
+    public ItemStack removeItem(int index, int takeAmount)
+    {
+        if(dispenserContents[index] != null)
+        {
+            if(dispenserContents[index].stackSize <= takeAmount)
+            {
+                ItemStack itemstack = dispenserContents[index];
+                dispenserContents[index] = null;
+                setChanged();
+                return itemstack;
+            }
+            ItemStack itemstack1 = dispenserContents[index].splitStack(takeAmount);
+            if(dispenserContents[index].stackSize <= 0)
+            {
+                dispenserContents[index] = null;
+            }
+            setChanged();
+            return itemstack1;
+        } else
+        {
+            return null;
+        }
+    }
+
+    public ItemStack getNextStack()
+    {
+        if (locked(stackSelector)) {
+            shiftSelector();
+            return null;
+        }
+        int itemIndex = stackSelector;
+        shiftSelector();
+        return getItem(itemIndex);
+    }
+
+    public void shiftSelector() {
+        stackSelector = (stackSelector + 1) % CONTAINER_SIZE;
+        int i = 0;
+        while (locked(stackSelector)) {
+            i++;
+            stackSelector = (stackSelector + 1) % CONTAINER_SIZE;
+            if (i >= CONTAINER_SIZE) {
+                stackSelector = 0;
+                break;
+            }
+        }
+    }
+
+    public void nullDeadItems() {
+        for (int i = 0; i < dispenserContents.length; i++) {
+            if (dispenserContents[i] != null && dispenserContents[i].stackSize <= 0) {
+                dispenserContents[i] = null;
+            }
+        }
+    }
+
+    public void lockSlot(int slot, boolean flag) {
+        assert slot >= 0 && slot < CONTAINER_SIZE : "Target slot to lock is outside the container bounds";
+        int mask = 0b1 << slot;
+        if (flag) {
+            lockedSlotBitSet |= (short) mask;
+        } else {
+            lockedSlotBitSet &= (short) ~mask;
+        }
+        if (locked(stackSelector)) {
+            shiftSelector();
+        }
+    }
+
+    @Override
+    public boolean locked(int slot) {
+        assert slot >= 0 && slot < CONTAINER_SIZE : "Target slot to lock is outside the container bounds";
+        int mask = 0b1 << slot;
+        return (lockedSlotBitSet & mask) != 0;
+    }
+
+    @Override
+    public void setItem(int index, ItemStack itemstack)
+    {
+        dispenserContents[index] = itemstack;
+        if(itemstack != null && itemstack.stackSize > getMaxStackSize())
+        {
+            itemstack.stackSize = getMaxStackSize();
+        }
+        setChanged();
+    }
+
+    @Override
+    public String getName()
+    {
+        return "Activator";
+    }
+
+    @Override
+    public void readFromNBT(CompoundTag compoundTag)
+    {
+        super.readFromNBT(compoundTag);
+        stackSelector = compoundTag.getByte("Selector");
+        lockedSlotBitSet = compoundTag.getShort("LockedSlots");
+        ListTag itemListTag = compoundTag.getList("Items");
+        dispenserContents = new ItemStack[getContainerSize()];
+        for(int i = 0; i < itemListTag.tagCount(); i++)
+        {
+            CompoundTag slotTag = (CompoundTag)itemListTag.tagAt(i);
+            int j = slotTag.getByte("Slot") & 0xff;
+            if(j < dispenserContents.length)
+            {
+                dispenserContents[j] = ItemStack.readItemStackFromNbt(slotTag);
+            }
+        }
+
+    }
+
+    @Override
+    public void writeToNBT(CompoundTag compoundTag)
+    {
+        super.writeToNBT(compoundTag);
+        compoundTag.putByte("Selector", (byte) stackSelector);
+        compoundTag.putShort("LockedSlots", lockedSlotBitSet);
+        ListTag itemListTag = new ListTag();
+        for(int i = 0; i < dispenserContents.length; i++)
+        {
+            if(dispenserContents[i] != null)
+            {
+                CompoundTag slotTag = new CompoundTag();
+                slotTag.putByte("Slot", (byte)i);
+                dispenserContents[i].writeToNBT(slotTag);
+                itemListTag.addTag(slotTag);
+            }
+        }
+
+        compoundTag.put("Items", itemListTag);
+    }
+
+    @Override
+    public int getMaxStackSize()
+    {
+        return 64;
+    }
+
+    @Override
+    public boolean stillValid(Player entityplayer)
+    {
+        if(worldObj.getBlockEntity(x, y, z) != this)
+        {
+            return false;
+        }
+        return entityplayer.distanceToSqr((double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D) <= 64D;
+    }
+
+    @Override
+    public void sortContainer() {
+        // Do nothing
+    }
+
+    @Override
+    public void dropContents(World world, int x, int y, int z) {
+        super.dropContents(world, x, y, z);
+        label0:
+        for (int l = 0; l < this.getContainerSize(); l++) {
+            ItemStack itemstack = this.getItem(l);
+            if (itemstack == null) {
+                continue;
+            }
+            float f = random.nextFloat() * 0.8F + 0.1F;
+            float f1 = random.nextFloat() * 0.8F + 0.1F;
+            float f2 = random.nextFloat() * 0.8F + 0.1F;
+            do {
+                if (itemstack.stackSize <= 0) {
+                    continue label0;
+                }
+                int i1 = random.nextInt(21) + 10;
+                if (i1 > itemstack.stackSize) {
+                    i1 = itemstack.stackSize;
+                }
+                itemstack.stackSize -= i1;
+                ItemEntity item = new ItemEntity(world, (float) x + f, (float) y + f1, (float) z + f2, new ItemStack(itemstack.itemID, i1, itemstack.getMetadata()));
+                float f3 = 0.05F;
+                item.xd = (float) random.nextGaussian() * f3;
+                item.yd = (float) random.nextGaussian() * f3 + 0.2F;
+                item.zd = (float) random.nextGaussian() * f3;
+                world.entityJoinedWorld(item);
+            } while (true);
+        }
+    }
+
+    @Override
+    public boolean canBeCarried(World world, Entity potentialHolder) {
+        return true;
+    }
+
+    @Override
+    public CarriedBlock getCarriedEntry(World world, Entity holder, Block currentBlock, int currentMeta) {
+        return super.getCarriedEntry(world, holder, currentBlock, RotatableBlock.setDirection(currentMeta, Direction.NORTH) /*Reset rotation, primarily to make it render in hand properly*/);
+    }
+}
diff --git a/src/main/java/net/minecraft/core/block/entity/BlockEntityDispatcher.java b/src/main/java/net/minecraft/core/block/entity/BlockEntityDispatcher.java
index 953a78d42..69971c553 100644
--- a/src/main/java/net/minecraft/core/block/entity/BlockEntityDispatcher.java
+++ b/src/main/java/net/minecraft/core/block/entity/BlockEntityDispatcher.java
@@ -63,10 +63,12 @@ public class BlockEntityDispatcher {
 
     static
     {
+        // TODO make these ids namespaced
         addMapping(FurnaceBlockEntity.class, "Furnace");
         addMapping(ChestBlockEntity.class, "Chest");
         addMapping(JukeboxBlockEntity.class, "RecordPlayer");
         addMapping(DispenserBlockEntity.class, "Trap");
+        addMapping(ActivatorBlockEntity.class, "Activator");
         addMapping(SignBlockEntity.class, "Sign");
         addMapping(MobSpawnerBlockEntity.class, "MobSpawner");
         addMapping(NoteBlockEntity.class, "Music");
diff --git a/src/main/java/net/minecraft/core/block/entity/DispenserBlockEntity.java b/src/main/java/net/minecraft/core/block/entity/DispenserBlockEntity.java
index 4dc9298a7..5e02514dc 100644
--- a/src/main/java/net/minecraft/core/block/entity/DispenserBlockEntity.java
+++ b/src/main/java/net/minecraft/core/block/entity/DispenserBlockEntity.java
@@ -1,6 +1,7 @@
 package net.minecraft.core.block.entity;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.RotatableBlock;
 import net.minecraft.core.block.motion.CarriedBlock;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.ItemEntity;
@@ -10,14 +11,11 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.player.inventory.container.Container;
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-// Referenced classes of package net.minecraft.src:
-//            BlockEntity, IInventory, ItemStack, NBTTagCompound,
-//            NBTTagList, World, Player
-
 public class DispenserBlockEntity extends BlockEntity
     implements Container
 {
@@ -209,7 +207,7 @@ public class DispenserBlockEntity extends BlockEntity
 
     @Override
     public CarriedBlock getCarriedEntry(World world, Entity holder, Block currentBlock, int currentMeta) {
-        return super.getCarriedEntry(world, holder, currentBlock, (currentMeta & ~0b111) | 0b010 /*Reset rotation, primarily to make it render in hand properly*/);
+        return super.getCarriedEntry(world, holder, currentBlock, RotatableBlock.setDirection(currentMeta, Direction.NORTH) /*Reset rotation, primarily to make it render in hand properly*/);
     }
 
     private ItemStack dispenserContents[];
diff --git a/src/main/java/net/minecraft/core/block/entity/JukeboxBlockEntity.java b/src/main/java/net/minecraft/core/block/entity/JukeboxBlockEntity.java
index 311a622a6..0c6fc6ebe 100644
--- a/src/main/java/net/minecraft/core/block/entity/JukeboxBlockEntity.java
+++ b/src/main/java/net/minecraft/core/block/entity/JukeboxBlockEntity.java
@@ -5,7 +5,6 @@ package net.minecraft.core.block.entity;
 //            BlockEntity, NBTTagCompound
 
 import net.minecraft.core.block.Block;
-import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.ItemEntity;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.world.LevelListener;
@@ -54,7 +53,7 @@ public class JukeboxBlockEntity extends BlockEntity {
             item.pickupDelay = 10;
             world.entityJoinedWorld(item);
 
-            world.playSoundEffect(LevelListener.EVENT_JUKEBOX_TOGGLE, x, y, z, 0);
+            world.playBlockEvent(LevelListener.EVENT_JUKEBOX_TOGGLE, x, y, z, 0);
             world.playRecord(null, null, x, y, z);
             record = 0;
             setChanged();
diff --git a/src/main/java/net/minecraft/core/block/entity/SeatBlockEntity.java b/src/main/java/net/minecraft/core/block/entity/SeatBlockEntity.java
index c2f64de27..30727fdd7 100644
--- a/src/main/java/net/minecraft/core/block/entity/SeatBlockEntity.java
+++ b/src/main/java/net/minecraft/core/block/entity/SeatBlockEntity.java
@@ -1,11 +1,13 @@
 package net.minecraft.core.block.entity;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.Blocks;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.world.IVehicle;
 import net.minecraft.core.world.World;
+import com.mojang.nbt.CompoundTag;
 
 public class SeatBlockEntity
     extends BlockEntity
@@ -13,6 +15,9 @@ public class SeatBlockEntity
     private Entity passenger;
 
     public Block seat;
+    public SeatBlockEntity() {
+        this(null);
+    }
     public SeatBlockEntity(Block seat) {
         passenger = null;
         this.seat = seat;
@@ -132,4 +137,20 @@ public class SeatBlockEntity
     public void heldTick(World world, Entity holder) {
         tick();
     }
+
+    @Override
+    public void writeToNBT(CompoundTag compoundTag)
+    {
+        super.writeToNBT(compoundTag);
+        if (seat != null && seat != Blocks.SEAT) {
+            compoundTag.putInt("Block", seat.id);
+        }
+    }
+
+    @Override
+    public void readFromNBT(CompoundTag compoundTag)
+    {
+        super.readFromNBT(compoundTag);
+        seat = Block.getBlock(compoundTag.getIntegerOrDefault("Block", Blocks.SEAT.id));
+    }
 }
diff --git a/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
index fbe867f72..375b508c8 100644
--- a/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
+++ b/src/main/java/net/minecraft/core/block/piston/MovingPistonBlockEntity.java
@@ -143,8 +143,9 @@ public class MovingPistonBlockEntity extends BlockEntity
         worldObj.removeBlockTileEntity(x, y, z);
         invalidate();
         if(worldObj.getBlockId(x, y, z) == Blocks.PISTON_MOVING.id) {
-            worldObj.setBlockAndMetadata(x, y, z, movedId, movedData);
-            worldObj.notifyBlockChange(x, y, z, movedId);
+            // Don't combine these into setBlockAndMetadata, then onBlockPlacedByWorld can override the metadata
+            worldObj.setBlock(x, y, z, movedId);
+            worldObj.setBlockMetadata(x, y, z, movedData);
             if (movedEntity != null) {
                 BlockEntity oldEnt = worldObj.getBlockEntity(x, y, z);
                 if (oldEnt != null) {
@@ -156,6 +157,7 @@ public class MovingPistonBlockEntity extends BlockEntity
                 movedEntity.z = z;
                 worldObj.replaceBlockTileEntity(x, y, z, movedEntity);
             }
+            worldObj.notifyBlockChange(x, y, z, movedId);
         }
     }
 
diff --git a/src/main/java/net/minecraft/core/block/piston/PistonBaseBlock.java b/src/main/java/net/minecraft/core/block/piston/PistonBaseBlock.java
index 8d860ad50..f1adc8914 100644
--- a/src/main/java/net/minecraft/core/block/piston/PistonBaseBlock.java
+++ b/src/main/java/net/minecraft/core/block/piston/PistonBaseBlock.java
@@ -18,6 +18,8 @@ import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.LevelListener;
 import net.minecraft.core.world.World;
 import net.minecraft.core.world.WorldSource;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 public class PistonBaseBlock extends Block
 {
@@ -43,7 +45,7 @@ public class PistonBaseBlock extends Block
     }
 
     @Override
-    public void onBlockPlacedByMob(World world, int x, int y, int z, Side side, Mob mob, double sideHeight) {
+    public void onBlockPlacedByMob(World world, int x, int y, int z, @NotNull Side side, Mob mob, double sideHeight) {
     	Direction placementDirection = mob.getPlacementDirection(side).getOpposite();
         world.setBlockMetadataWithNotify(x, y, z, placementDirection.getId());
         if(!world.isClientSide)
@@ -290,7 +292,7 @@ public class PistonBaseBlock extends Block
         int z2 = z + direction.getOffsetZ();
         Block block = world.getBlock(x2, y2, z2);
         if (block == null) return true;
-        world.playSoundEffect(null, LevelListener.EVENT_BLOCK_BREAK, x2, y2, z2, world.getBlockId(x2, y2, z2));
+        world.playBlockEvent(null, LevelListener.EVENT_BLOCK_BREAK, x2, y2, z2, world.getBlockId(x2, y2, z2));
         block.dropBlockWithCause(world, EnumDropCause.SILK_TOUCH, x2, y2, z2, world.getBlockMetadata(x2, y2, z2), null, null);
         world.setBlockWithNotify(x2, y2, z2, 0);
         return true;
@@ -337,6 +339,9 @@ public class PistonBaseBlock extends Block
             int pushId = world.getBlockId(px, py, pz);
             int pushMeta = world.getBlockMetadata(px, py, pz);
             BlockEntity pushEntity = world.getBlockEntity(px, py, pz);
+            if (pushEntity instanceof MovingPistonBlockEntity) {
+                break;
+            }
             if(pushId == id && px == x && py == y && pz == z)
             {
                 createPistonHeadAt(world, xo, yo, zo, data, direction);
@@ -374,7 +379,7 @@ public class PistonBaseBlock extends Block
     }
     
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
     	return MASK_DIRECTION; // For all faces piston blocks ig
     }
 }
diff --git a/src/main/java/net/minecraft/core/data/gamerule/TreecapitatorHelper.java b/src/main/java/net/minecraft/core/data/gamerule/TreecapitatorHelper.java
index 98d010b18..45c6d8828 100644
--- a/src/main/java/net/minecraft/core/data/gamerule/TreecapitatorHelper.java
+++ b/src/main/java/net/minecraft/core/data/gamerule/TreecapitatorHelper.java
@@ -206,7 +206,7 @@ public class TreecapitatorHelper {
 				}	
 			}
 			if(particle) {
-				world.playSoundEffect(player, 2001, pos.x, pos.y, pos.z, block.id);
+				world.playBlockEvent(player, 2001, pos.x, pos.y, pos.z, block.id);
 			}
 			return true;
 		}
diff --git a/src/main/java/net/minecraft/core/entity/Entity.java b/src/main/java/net/minecraft/core/entity/Entity.java
index 09a8590b1..cfab3ca98 100644
--- a/src/main/java/net/minecraft/core/entity/Entity.java
+++ b/src/main/java/net/minecraft/core/entity/Entity.java
@@ -709,9 +709,9 @@ public abstract class Entity
         return true;
     }
 
-    protected void checkFallDamage(double d, boolean flag)
+    protected void checkFallDamage(double yd, boolean onGround)
     {
-        if (flag)
+        if (onGround)
         {
             if(fallDistance > 0.0F)
             {
@@ -719,12 +719,18 @@ public abstract class Entity
                 fallDistance = 0.0F;
             }
         }
-        else if (d < 0.0D)
+        else if (isFalling())
         {
-            fallDistance -= d;
+            fallDistance -= yd;
+        } else {
+            fallDistance = 0;
         }
     }
 
+    public boolean isFalling() {
+        return !onGround && !noPhysics && yd < 0 && vehicle == null;
+    }
+
     public AABB getBb()
     {
         return null;
diff --git a/src/main/java/net/minecraft/core/entity/ItemEntity.java b/src/main/java/net/minecraft/core/entity/ItemEntity.java
index 3fc5b2ac2..a176c3a65 100644
--- a/src/main/java/net/minecraft/core/entity/ItemEntity.java
+++ b/src/main/java/net/minecraft/core/entity/ItemEntity.java
@@ -39,7 +39,7 @@ public class ItemEntity extends Entity
     public ItemEntity(World world, double x, double y, double z, ItemStack itemstack) {
         super(world);
         age = 0;
-        health = 5;
+        health = 8;
         bobOffset = (float)(Math.random() * Math.PI * 2D);
         setSize(0.25F, 0.25F);
         heightOffset = bbHeight / 2.0F;
@@ -100,7 +100,7 @@ public class ItemEntity extends Entity
         yo = y;
         zo = z;
         yd -= 0.04D;
-        if(world.getBlockMaterial(MathHelper.floor(x), MathHelper.floor(y), MathHelper.floor(z)) == Material.lava)
+        if(isInLava())
         {
             yd = 0.2D;
             xd = (random.nextFloat() - random.nextFloat()) * 0.2F;
diff --git a/src/main/java/net/minecraft/core/entity/Mob.java b/src/main/java/net/minecraft/core/entity/Mob.java
index 3a1a5db8c..bac30820c 100644
--- a/src/main/java/net/minecraft/core/entity/Mob.java
+++ b/src/main/java/net/minecraft/core/entity/Mob.java
@@ -1207,17 +1207,17 @@ public abstract class Mob extends Entity
         return prevSwingProgress + f1 * partialTick;
     }
 
-    public Vec3 getPosition(float partialTick)
+    public Vec3 getPosition(float partialTick, boolean headOffset)
     {
         if(partialTick == 1.0F)
         {
-            return Vec3.getTempVec3(x, y, z);
+            return Vec3.getTempVec3(x, y + (headOffset ? getHeadHeight() : 0), z);
         } else
         {
-            double d = xo + (x - xo) * (double)partialTick;
-            double d1 = yo + (y - yo) * (double)partialTick;
-            double d2 = zo + (z - zo) * (double)partialTick;
-            return Vec3.getTempVec3(d, d1, d2);
+            double x = MathHelper.lerp(xo, this.x, partialTick);
+            double y = MathHelper.lerp(yo, this.y, partialTick);
+            double z = MathHelper.lerp(zo, this.z, partialTick);
+            return Vec3.getTempVec3(x, y + (headOffset ? getHeadHeight() : 0), z);
         }
     }
 
@@ -1231,11 +1231,11 @@ public abstract class Mob extends Entity
     {
         if(partialTick == 1.0F)
         {
-            float f1 = MathHelper.cos(-yRot * (MathHelper.PI / 180f) - MathHelper.PI);
-            float f3 = MathHelper.sin(-yRot * (MathHelper.PI / 180f) - MathHelper.PI);
-            float f5 = -MathHelper.cos(-xRot * (MathHelper.PI / 180f));
-            float f7 = MathHelper.sin(-xRot * (MathHelper.PI / 180f));
-            return Vec3.getTempVec3(f3 * f5, f7, f1 * f5);
+            float z = MathHelper.cos(-yRot * (MathHelper.PI / 180f) - MathHelper.PI);
+            float x = MathHelper.sin(-yRot * (MathHelper.PI / 180f) - MathHelper.PI);
+            float xzLen = -MathHelper.cos(-xRot * (MathHelper.PI / 180f));
+            float y = MathHelper.sin(-xRot * (MathHelper.PI / 180f));
+            return Vec3.getTempVec3(x * xzLen, y, z * xzLen);
         }
         else
         {
@@ -1249,12 +1249,12 @@ public abstract class Mob extends Entity
         }
     }
 
-    public HitResult rayTrace(double d, float partialTick)
+    public HitResult rayTrace(double distance, float partialTick, boolean collideWithFluids, boolean ignoreNonColliderBlocks)
     {
-        Vec3 vec3 = getPosition(partialTick);
-        Vec3 vec31 = getViewVector(partialTick);
-        Vec3 vec32 = vec3.add(vec31.x * d, vec31.y * d, vec31.z * d);
-        return world.checkBlockCollisionBetweenPoints(vec3, vec32);
+        Vec3 head = getPosition(partialTick, true);
+        Vec3 viewDirection = getViewVector(partialTick);
+        Vec3 furthestPoint = head.add(viewDirection.x * distance, viewDirection.y * distance, viewDirection.z * distance);
+        return world.checkBlockCollisionBetweenPoints(head, furthestPoint, collideWithFluids, ignoreNonColliderBlocks);
     }
 
     public int getMaxSpawnedInChunk()
diff --git a/src/main/java/net/minecraft/core/entity/animal/SheepMob.java b/src/main/java/net/minecraft/core/entity/animal/SheepMob.java
index e47b0eec9..c1b5a0639 100644
--- a/src/main/java/net/minecraft/core/entity/animal/SheepMob.java
+++ b/src/main/java/net/minecraft/core/entity/animal/SheepMob.java
@@ -80,6 +80,22 @@ public class SheepMob extends Animal
         return false;
     }
 
+    public void onItemInteract(ItemStack itemStack) {
+        if (itemStack.getItem() instanceof ToolShearsItem && !getSheared()){
+            if(!world.isClientSide) {
+                setSheared(true);
+                int count = 2 + random.nextInt(3);
+                for (int j = 0; j < count; j++) {
+                    ItemEntity itemEntity = spawnAtLocation(new ItemStack(Blocks.WOOL.id, 1, getFleeceColor().blockMeta), 1.0F);
+                    itemEntity.yd += random.nextFloat() * 0.05F;
+                    itemEntity.xd += (random.nextFloat() - random.nextFloat()) * 0.1F;
+                    itemEntity.zd += (random.nextFloat() - random.nextFloat()) * 0.1F;
+                }
+            }
+            itemStack.damageItem(1, null);
+        }
+    }
+
     @Override
     public void addAdditionalSaveData(CompoundTag tag)
     {
@@ -155,7 +171,7 @@ public class SheepMob extends Animal
 			if (prevTimeSheepEating == 35) {
 				if(blockBelow == Blocks.GRASS || blockBelow == Blocks.GRASS_RETRO) {
 					if(!world.isClientSide) {
-						world.playSoundEffect(null, 2001, (int) x, (int) y - 1, (int) z, world.getBlockId((int) x, (int) y - 1, (int) z));
+						world.playBlockEvent(null, 2001, (int) x, (int) y - 1, (int) z, world.getBlockId((int) x, (int) y - 1, (int) z));
 						world.setBlockWithNotify(blockX, blockY - 1, blockZ, Blocks.DIRT.id);
 						setSheared(false);
 					}
diff --git a/src/main/java/net/minecraft/core/entity/monster/SkeletonMob.java b/src/main/java/net/minecraft/core/entity/monster/SkeletonMob.java
index a1981b76b..cb6960d9e 100644
--- a/src/main/java/net/minecraft/core/entity/monster/SkeletonMob.java
+++ b/src/main/java/net/minecraft/core/entity/monster/SkeletonMob.java
@@ -82,13 +82,13 @@ public class SkeletonMob extends Monster
             if(attackTime == 0)
             {
                 if(!world.isClientSide) {
-                    ArrowProjectile entityarrow = new ArrowProjectile(world, this, false, 0);
-                    entityarrow.y += 1.3999999761581421D;
-                    double d2 = (entity.y + (double) entity.getHeadHeight()) - 0.2D - entityarrow.y;
+                    ArrowProjectile arrow = new ArrowProjectile(world, this, false, 0);
+//                    arrow.y += 1.3999999761581421D;
+                    double d2 = (entity.y + (double) entity.getHeadHeight()) - 0.2D - arrow.y;
                     float f1 = MathHelper.sqrt(d * d + d1 * d1) * 0.2F;
                     world.playSoundAtEntity(null, this, "random.bow", 1.0F, 1.0F / (random.nextFloat() * 0.4F + 0.8F));
-                    entityarrow.setHeading(d, d2 + (double) f1, d1, 0.6F, 12F);
-                    world.entityJoinedWorld(entityarrow);
+                    arrow.setHeading(d, d2 + (double) f1, d1, 0.6F, 12F);
+                    world.entityJoinedWorld(arrow);
                 }
                 attackTime = 30;
             }
diff --git a/src/main/java/net/minecraft/core/entity/monster/SlimeMob.java b/src/main/java/net/minecraft/core/entity/monster/SlimeMob.java
index 57b604f42..9b655a930 100644
--- a/src/main/java/net/minecraft/core/entity/monster/SlimeMob.java
+++ b/src/main/java/net/minecraft/core/entity/monster/SlimeMob.java
@@ -92,8 +92,8 @@ public class SlimeMob extends Mob
     @Override
 	public void readAdditionalSaveData(CompoundTag tag)
     {
+        setSlimeSize(tag.getInteger("Size") + 1); sizeSet = true; // Loaded before the rest of data specifically to prevent it setting the size *after* loading the saved health
         super.readAdditionalSaveData(tag);
-        setSlimeSize(tag.getInteger("Size") + 1);
     }
 
     @Override
@@ -181,10 +181,10 @@ public class SlimeMob extends Mob
             {
                 float f = (((float)(j % 2) - 0.5F) * (float)size) / 4F;
                 float f1 = (((float)(j / 2) - 0.5F) * (float)size) / 4F;
-                SlimeMob entityslime = new SlimeMob(world, true);
-                entityslime.setSlimeSize(size / 2);
-                entityslime.moveTo(x + (double)f, y + 0.5D, z + (double)f1, random.nextFloat() * 360F, 0.0F);
-                world.entityJoinedWorld(entityslime);
+                SlimeMob slimeMob = new SlimeMob(world, true);
+                slimeMob.setSlimeSize(size / 2);
+                slimeMob.moveTo(x + (double)f, y + 0.5D, z + (double)f1, random.nextFloat() * 360F, 0.0F);
+                world.entityJoinedWorld(slimeMob);
             }
 
         }
diff --git a/src/main/java/net/minecraft/core/entity/player/Player.java b/src/main/java/net/minecraft/core/entity/player/Player.java
index cbec30952..2bdfb5881 100644
--- a/src/main/java/net/minecraft/core/entity/player/Player.java
+++ b/src/main/java/net/minecraft/core/entity/player/Player.java
@@ -2,6 +2,7 @@ package net.minecraft.core.entity.player;
 
 import com.mojang.nbt.CompoundTag;
 import com.mojang.nbt.ListTag;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.enums.Difficulty;
 import net.minecraft.core.achievement.Achievements;
 import net.minecraft.core.achievement.stat.Stat;
@@ -831,7 +832,7 @@ public abstract class Player extends Mob
     @Override
 	public float getHeadHeight()
     {
-        return 0.12F;
+        return 0;
     }
 
     protected void resetHeight()
@@ -973,6 +974,10 @@ public abstract class Player extends Mob
     {
     }
 
+    public void displayActivatorScreen(ActivatorBlockEntity blockEntity)
+    {
+    }
+
     public void displaySignEditorScreen(SignBlockEntity blockEntity)
     {
     }
diff --git a/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java b/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java
index 2d7f1a860..ddb05f295 100644
--- a/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java
+++ b/src/main/java/net/minecraft/core/entity/vehicle/MinecartEntity.java
@@ -771,6 +771,7 @@ public class MinecartEntity extends Entity implements Container {
     @Override
     public void addAdditionalSaveData(CompoundTag tag) {
         tag.putInt("Type", type);
+        tag.putInt("TypeMeta", typeMeta);
         switch (type){
             case CHEST_CART:
                 ListTag nbttaglist = new ListTag();
@@ -795,6 +796,7 @@ public class MinecartEntity extends Entity implements Container {
     @Override
     public void readAdditionalSaveData(CompoundTag tag) {
         type = tag.getInteger("Type");
+        typeMeta = tag.getInteger("TypeMeta");
         switch (type){
             case CHEST_CART:
                 ListTag nbttaglist = tag.getList("Items");
diff --git a/src/main/java/net/minecraft/core/item/BoatItem.java b/src/main/java/net/minecraft/core/item/BoatItem.java
index 3dbe8f6b4..a90562476 100644
--- a/src/main/java/net/minecraft/core/item/BoatItem.java
+++ b/src/main/java/net/minecraft/core/item/BoatItem.java
@@ -6,14 +6,18 @@ package net.minecraft.core.item;
 //            World, MovingObjectPosition, EnumMovingObjectType, Block, 
 //            BoatEntity, ItemStack
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.entity.vehicle.BoatEntity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.block.Blocks;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
 
+import java.util.Random;
+
 public class BoatItem extends Item
 {
 
@@ -57,7 +61,7 @@ public class BoatItem extends Item
                 {
                     j--;
                 }
-                BoatEntity boat = new BoatEntity(world, (float)i + 0.5F, (float)j + 1.0F, (float)k + 0.5F);
+                BoatEntity boat = new BoatEntity(world, i + 0.5F, j + 1.0F, k + 0.5F);
                 boat.setRot(entityplayer.yRot - 90, 0);
                 world.entityJoinedWorld(boat);
             }
@@ -65,4 +69,14 @@ public class BoatItem extends Item
         }
         return itemstack;
     }
+
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        double x = blockX + offX + direction.getOffsetX();
+        double y = blockY + offY + direction.getOffsetY();
+        double z = blockZ + offZ + direction.getOffsetZ();
+        itemStack.consumeItem(null);
+        BoatEntity boat = new BoatEntity(world, x, y, z);
+        world.entityJoinedWorld(boat);
+    }
 }
diff --git a/src/main/java/net/minecraft/core/item/BucketItem.java b/src/main/java/net/minecraft/core/item/BucketItem.java
index 5d92fb0fa..2dfb760fc 100644
--- a/src/main/java/net/minecraft/core/item/BucketItem.java
+++ b/src/main/java/net/minecraft/core/item/BucketItem.java
@@ -38,24 +38,8 @@ public class BucketItem extends Item
 
     @Override
 	public ItemStack onUseItem(ItemStack stack, World world, Player player) {
-		float f = 1.0F;
-		float f1 = player.xRotO + (player.xRot - player.xRotO) * f;
-		float f2 = player.yRotO + (player.yRot - player.yRotO) * f;
-		double posX = player.xo + (player.x - player.xo) * (double) f;
-		float yOff = player instanceof ServerPlayer ? player.getHeightOffset() : 0;
-		double posY = (player.yo + (player.y - player.yo)) + yOff;
-		double posZ = player.zo + (player.z - player.zo) * (double) f;
-		Vec3 vec3 = Vec3.getTempVec3(posX, posY, posZ);
-		float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
-		float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
-		float f5 = -MathHelper.cos(-f1 * 0.01745329F);
-		float f6 = MathHelper.sin(-f1 * 0.01745329F);
-		float f7 = f4 * f5;
-		float f8 = f6;
-		float f9 = f3 * f5;
 		double reachDistance = player.getGamemode().getBlockReachDistance();
-		Vec3 vec31 = vec3.add((double) f7 * reachDistance, (double) f8 * reachDistance, (double) f9 * reachDistance);
-		HitResult rayTraceResult = world.checkBlockCollisionBetweenPoints(vec3, vec31, idToPlace == 0);
+		HitResult rayTraceResult = player.rayTrace(reachDistance, 1f, idToPlace == 0, false);
 		
 		if(rayTraceResult == null || rayTraceResult.hitType != HitResult.HitType.TILE) {
 			return stack;
@@ -88,13 +72,13 @@ public class BucketItem extends Item
 		
 		if(world.isAirBlock(x, y, z) || !world.getBlockMaterial(x, y, z).isSolid()) {
 			if(world.dimension == Dimension.NETHER && idToPlace == Blocks.FLUID_WATER_FLOWING.id) {
-				world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, z + 0.5, y + 0.5, x + 0.5, "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
+				world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, z + 0.5, y + 0.5, x + 0.5, "random.fizz", 0.5F, 2.6F + (world.rand.nextFloat() - world.rand.nextFloat()) * 0.8F);
 				for (int l = 0; l < 8; l++) {
 					world.spawnParticle("largesmoke", x + Math.random(), y + Math.random(), z + Math.random(), 0.0D, 0.0D, 0.0D, 0);
 				}
 			} else {
 				if(idToPlace == Blocks.FLUID_WATER_FLOWING.id) {
-					world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, x + 0.5F, y + 0.5F, z + 0.5F, "liquid.splash", 0.5f, 1.0f);
+					world.playSoundEffect(player, SoundCategory.WORLD_SOUNDS, x + 0.5F, y + 0.5F, z + 0.5F, "liquid.splash", 0.5f, 1.0f);
 				}
 				player.swingItem();
 				Block block1 = world.getBlock(x, y, z);
diff --git a/src/main/java/net/minecraft/core/item/DyeItem.java b/src/main/java/net/minecraft/core/item/DyeItem.java
index b05a59dca..7dcca1e28 100644
--- a/src/main/java/net/minecraft/core/item/DyeItem.java
+++ b/src/main/java/net/minecraft/core/item/DyeItem.java
@@ -3,18 +3,23 @@ package net.minecraft.core.item;
 
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.entity.SignBlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.animal.SheepMob;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.net.command.TextFormatting;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.DyeColor;
 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;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
 
 public class DyeItem extends Item
 {
@@ -33,7 +38,7 @@ public class DyeItem extends Item
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         if (world.getBlockId(blockX, blockY, blockZ) == Blocks.SIGN_POST_PLANKS_OAK.id || world.getBlockId(blockX, blockY, blockZ) == Blocks.SIGN_WALL_PLANKS_OAK.id)
         {
@@ -41,7 +46,7 @@ public class DyeItem extends Item
             if ((DyeColor.WHITE.itemMeta - itemstack.getMetadata()) != sign.getColor().id)
             {
                 sign.setColor(TextFormatting.get(DyeColor.WHITE.itemMeta - itemstack.getMetadata()));
-                if (entityplayer.getGamemode().consumeBlocks())
+                if (player == null || player.getGamemode().consumeBlocks())
                 {
                     itemstack.stackSize--;
                 }
@@ -54,7 +59,7 @@ public class DyeItem extends Item
             int id = world.getBlockId(blockX, blockY, blockZ);
             Block block = Block.blocksList[id];
             if (block instanceof IBonemealable){
-               if (((IBonemealable) block).onBonemealUsed(itemstack, entityplayer, world, blockX, blockY, blockZ, side, xPlaced, yPlaced)){
+               if (((IBonemealable) block).onBonemealUsed(itemstack, player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced)){
                    return true;
                }
             }
@@ -68,7 +73,7 @@ public class DyeItem extends Item
                     		grass = Blocks.GRASS_RETRO.id;
                     	}
                         world.setBlockWithNotify(blockX, blockY, blockZ, grass);
-                        if (entityplayer.getGamemode().consumeBlocks())
+                        if (player == null || player.getGamemode().consumeBlocks())
                         {
                         	itemstack.stackSize--;        	
                         }
@@ -83,7 +88,7 @@ public class DyeItem extends Item
                     if(Block.lightBlock[world.getBlockId(blockX, blockY + 1, blockZ)] <= 2) {
                         int grass = Blocks.GRASS_SCORCHED.id;
                         world.setBlockWithNotify(blockX, blockY, blockZ, grass);
-                        if (entityplayer.getGamemode().consumeBlocks())
+                        if (player == null || player.getGamemode().consumeBlocks())
                         {
                             itemstack.stackSize--;
                         }
@@ -96,7 +101,7 @@ public class DyeItem extends Item
             {
                 if(!world.isClientSide)
                 {
-                    if (entityplayer.getGamemode().consumeBlocks())
+                    if (player == null || player.getGamemode().consumeBlocks())
                     {
                     	itemstack.stackSize--;        	
                     }
@@ -154,6 +159,11 @@ label0:
         return false;
     }
 
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        onUseItemOnBlock(itemStack, null, world, blockX + direction.getOffsetX(), blockY + direction.getOffsetY(), blockZ + direction.getOffsetZ(), direction.getSide(), 0.5, 0.5);
+    }
+
     @Override
     public boolean useItemOnEntity(ItemStack itemstack, Mob mob, Player entityPlayer)
     {
diff --git a/src/main/java/net/minecraft/core/item/EggItem.java b/src/main/java/net/minecraft/core/item/EggItem.java
index 4c7771690..279118092 100644
--- a/src/main/java/net/minecraft/core/item/EggItem.java
+++ b/src/main/java/net/minecraft/core/item/EggItem.java
@@ -4,15 +4,16 @@ package net.minecraft.core.item;
 //            Item, ItemStack, World, EggProjectile,
 //            Player
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.entity.projectile.EggProjectile;
 import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
 public class EggItem
-    extends Item
-    implements IDispensable
+    extends Item implements IDispensable
 {
 
     public EggItem(String name, String namespaceId, int id)
@@ -34,9 +35,17 @@ public class EggItem
     }
 
     @Override
-    public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int zOffset, Random random) {
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        EggProjectile eggProjectile = new EggProjectile(world, blockX + offX, blockY + offY, blockZ + offZ);
+        eggProjectile.setHeading(direction.getOffsetX() * 0.6, direction.getOffsetY() == 0 ? 0.1 : direction.getOffsetY() * 0.6, direction.getOffsetZ() * 0.6f, 1.1F, 6F);
+        world.entityJoinedWorld(eggProjectile);
+        itemStack.stackSize -= 1;
+    }
+
+    @Override
+    public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int yOffset, int zOffset, Random random) {
         EggProjectile eggProjectile = new EggProjectile(world, x, y, z);
-        eggProjectile.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
+        eggProjectile.setHeading(xOffset, yOffset + 0.1D, zOffset, 1.1F, 6F);
         world.entityJoinedWorld(eggProjectile);
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/EmptyBucketItem.java b/src/main/java/net/minecraft/core/item/EmptyBucketItem.java
index f0ad17c3c..c587fdef8 100644
--- a/src/main/java/net/minecraft/core/item/EmptyBucketItem.java
+++ b/src/main/java/net/minecraft/core/item/EmptyBucketItem.java
@@ -25,33 +25,18 @@ public class EmptyBucketItem extends Item
     @Override
     public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
     {
-        float f = 1.0F;
-        float f1 = entityplayer.xRotO + (entityplayer.xRot - entityplayer.xRotO) * f;
-        float f2 = entityplayer.yRotO + (entityplayer.yRot - entityplayer.yRotO) * f;
-        double d = entityplayer.xo + (entityplayer.x - entityplayer.xo) * (double)f;
-        float yOff = entityplayer instanceof ServerPlayer ? entityplayer.getHeightOffset() : 0;
-        double d1 = (entityplayer.yo + (entityplayer.y - entityplayer.yo)) + yOff;
-        double d2 = entityplayer.zo + (entityplayer.z - entityplayer.zo) * (double)f;
-        Vec3 vec3 = Vec3.getTempVec3(d, d1, d2);
-        float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
-        float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
-        float f5 = -MathHelper.cos(-f1 * 0.01745329F);
-        float f6 = MathHelper.sin(-f1 * 0.01745329F);
-        float f7 = f4 * f5;
-        float f8 = f6;
-        float f9 = f3 * f5;
         double reachDistance = entityplayer.getGamemode().getBlockReachDistance();
-        Vec3 vec31 = vec3.add((double)f7 * reachDistance, (double)f8 * reachDistance, (double)f9 * reachDistance);
-        HitResult movingobjectposition = world.checkBlockCollisionBetweenPoints(vec3, vec31, true);
-        if(movingobjectposition == null)
+        HitResult hitResult = entityplayer.rayTrace(reachDistance, 1f, true, false);
+
+        if(hitResult == null)
         {
             return itemstack;
         }
-        if(movingobjectposition.hitType == HitResult.HitType.TILE)
+        if(hitResult.hitType == HitResult.HitType.TILE)
         {
-            int i = movingobjectposition.x;
-            int j = movingobjectposition.y;
-            int k = movingobjectposition.z;
+            int i = hitResult.x;
+            int j = hitResult.y;
+            int k = hitResult.z;
             if(!world.canMineBlock(entityplayer, i, j, k))
             {
                 return itemstack;
diff --git a/src/main/java/net/minecraft/core/item/FireStrikerItem.java b/src/main/java/net/minecraft/core/item/FireStrikerItem.java
index bfd478a53..9e18c7434 100644
--- a/src/main/java/net/minecraft/core/item/FireStrikerItem.java
+++ b/src/main/java/net/minecraft/core/item/FireStrikerItem.java
@@ -4,13 +4,22 @@ package net.minecraft.core.item;
 //            Item, World, Block, FireBlock,
 //            ItemStack, Player
 
+import net.minecraft.core.block.Block;
+import net.minecraft.core.block.BrazierBlock;
+import net.minecraft.core.block.FluidBlock;
+import net.minecraft.core.block.TNTBlock;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.item.material.ToolMaterial;
 import net.minecraft.core.sound.SoundCategory;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.block.Blocks;
 import net.minecraft.core.world.World;
 
+import java.util.Random;
+
 public class FireStrikerItem extends Item
 {
 
@@ -39,4 +48,27 @@ public class FireStrikerItem extends Item
         }
         return false;
     }
+
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        if (!onUseItemOnBlock(itemStack, null, world, blockX, blockY, blockZ, direction.getSide(), 0.5, 0.5)) {
+            blockX += direction.getOffsetX();
+            blockY += direction.getOffsetY();
+            blockZ += direction.getOffsetZ();
+            Block b = world.getBlock(blockX, blockY, blockZ);
+            if (b instanceof BrazierBlock && !((BrazierBlock)b).isBurning()) {
+                if (world.getBlock(blockX + 1,  blockY, blockZ) instanceof FluidBlock ||
+                    world.getBlock(blockX - 1,  blockY, blockZ) instanceof FluidBlock ||
+                    world.getBlock(blockX,      blockY, blockZ + 1) instanceof FluidBlock ||
+                    world.getBlock(blockX,      blockY, blockZ - 1) instanceof FluidBlock) {
+                    return;
+                }
+                world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.BRAZIER_ACTIVE.id, 0);
+                itemStack.damageItem(1, null);
+                world.playSoundEffect(null, SoundCategory.WORLD_SOUNDS, (double) blockX + 0.5D, (double) blockY + 0.5D, (double) blockZ + 0.5D, "fire.ignite", 1.0F, world.rand.nextFloat() * 0.4F + 0.8F);
+            } else if (b instanceof TNTBlock) {
+                ((TNTBlock)b).ignite(world, blockX, blockY, blockZ, true);
+            }
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/core/item/IBonemealable.java b/src/main/java/net/minecraft/core/item/IBonemealable.java
index 936ebb1e8..0fe7a2762 100644
--- a/src/main/java/net/minecraft/core/item/IBonemealable.java
+++ b/src/main/java/net/minecraft/core/item/IBonemealable.java
@@ -3,7 +3,8 @@ package net.minecraft.core.item;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public interface IBonemealable {
-    boolean onBonemealUsed(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced);
+    boolean onBonemealUsed(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced);
 }
diff --git a/src/main/java/net/minecraft/core/item/IDispensable.java b/src/main/java/net/minecraft/core/item/IDispensable.java
index da3871c81..b4bffb2bf 100644
--- a/src/main/java/net/minecraft/core/item/IDispensable.java
+++ b/src/main/java/net/minecraft/core/item/IDispensable.java
@@ -5,9 +5,9 @@ import net.minecraft.core.world.World;
 import java.util.Random;
 
 public interface IDispensable {
-    void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int zOffset, Random random);
+    void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int yOffset, int zOffset, Random random);
 
     default boolean isRemovedOnDispense() {
         return true;
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/core/item/Item.java b/src/main/java/net/minecraft/core/item/Item.java
index e5eca2bcb..4dc0b3dd1 100644
--- a/src/main/java/net/minecraft/core/item/Item.java
+++ b/src/main/java/net/minecraft/core/item/Item.java
@@ -5,6 +5,7 @@ import net.minecraft.core.achievement.stat.Stat;
 import net.minecraft.core.achievement.stat.StatItem;
 import net.minecraft.core.achievement.stat.StatList;
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.data.tag.ITaggable;
 import net.minecraft.core.data.tag.Tag;
 import net.minecraft.core.entity.Entity;
@@ -15,6 +16,7 @@ import net.minecraft.core.lang.I18n;
 import net.minecraft.core.player.inventory.slot.Slot;
 import net.minecraft.core.util.HardIllegalArgumentException;
 import net.minecraft.core.util.collection.NamespaceID;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 import org.jetbrains.annotations.NotNull;
@@ -160,6 +162,9 @@ public class Item implements ITaggable<Item>, IItemConvertible
         return false;
     }
 
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+    }
+
     public float getStrVsBlock(ItemStack itemstack, Block block)
     {
         return 1.0F;
diff --git a/src/main/java/net/minecraft/core/item/ItemStack.java b/src/main/java/net/minecraft/core/item/ItemStack.java
index 1497bf1fb..8cd3acf39 100644
--- a/src/main/java/net/minecraft/core/item/ItemStack.java
+++ b/src/main/java/net/minecraft/core/item/ItemStack.java
@@ -255,7 +255,7 @@ public final class ItemStack {
         return Item.itemsList[itemID].getMaxDamage();
     }
 
-    public void damageItem(int i, Entity entity)
+    public void damageItem(int i, @Nullable Entity entity)
     {
         if (entity instanceof Player) {
             if (!((Player)entity).getGamemode().toolDurability()) return;
@@ -314,10 +314,10 @@ public final class ItemStack {
         }
     }
 
-    public boolean consumeItem(Player entityplayer){
+    public boolean consumeItem(@Nullable Player entityplayer){
         if(stackSize <= 0)
             return false;
-        if (entityplayer.getGamemode().consumeBlocks()) {
+        if (entityplayer == null || entityplayer.getGamemode().consumeBlocks()) {
             stackSize--;
         }
         return true;
diff --git a/src/main/java/net/minecraft/core/item/JarItem.java b/src/main/java/net/minecraft/core/item/JarItem.java
index 6ec22d8b3..9d56fd748 100644
--- a/src/main/java/net/minecraft/core/item/JarItem.java
+++ b/src/main/java/net/minecraft/core/item/JarItem.java
@@ -6,6 +6,8 @@ import net.minecraft.core.entity.animal.FireflyClusterMob;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.List;
 
@@ -19,20 +21,22 @@ public class JarItem extends PlaceableItem {
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
-        if (player.isSneaking()) {
+    public boolean onUseItemOnBlock(ItemStack stack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+        if (player != null && player.isSneaking()) {
             return super.onUseItemOnBlock(stack, player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
         }
-        int count = stack.stackSize;
-        ItemStack used = onUseItem(stack, world, player);
-        if (used != null && used.stackSize != count){
-            return true;
+        if (player != null) {int count = stack.stackSize;
+            ItemStack used = onUseItem(stack, world, player);
+            if (used != null && used.stackSize != count){
+                return true;
+            }
+
         }
         return super.onUseItemOnBlock(stack, player, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
     }
 
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, @NotNull Player entityplayer)
     {
         if (entityplayer.isSneaking()) {
             return itemstack;
diff --git a/src/main/java/net/minecraft/core/item/LabelItem.java b/src/main/java/net/minecraft/core/item/LabelItem.java
index 366a5ee7b..cc7a3400a 100644
--- a/src/main/java/net/minecraft/core/item/LabelItem.java
+++ b/src/main/java/net/minecraft/core/item/LabelItem.java
@@ -1,8 +1,19 @@
 package net.minecraft.core.item;
 
+import com.b100.utils.StringUtils;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.entity.Entity;
+import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.SheepMob;
 import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
 
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+
 public class LabelItem extends Item
 {
     protected LabelItem(String name, String namespaceId, int id) {
@@ -31,4 +42,20 @@ public class LabelItem extends Item
 		}
 		return stack;
 	}
+
+	@Override
+	public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+		if (!itemStack.hasCustomName()) return;
+		blockX += direction.getOffsetX();
+		blockY += direction.getOffsetY();
+		blockZ += direction.getOffsetZ();
+		AABB box = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX + 1, blockY + 1, blockZ + 1);
+		List<Entity> entities = world.getEntitiesWithinAABBExcludingEntity(null, box);
+        for (Entity entity : entities) {
+            if (entity instanceof Mob && !entity.hadNicknameSet) {
+                ((Mob) entity).setNickname(StringUtils.substring(itemStack.getCustomName(), 0, 32));
+				break;
+            }
+        }
+	}
 }
diff --git a/src/main/java/net/minecraft/core/item/MinecartItem.java b/src/main/java/net/minecraft/core/item/MinecartItem.java
index 0735d2dd6..136a97ba8 100644
--- a/src/main/java/net/minecraft/core/item/MinecartItem.java
+++ b/src/main/java/net/minecraft/core/item/MinecartItem.java
@@ -4,10 +4,16 @@ package net.minecraft.core.item;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.RailBlock;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.entity.vehicle.MinecartEntity;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
 
 public class MinecartItem extends Item {
     public final int minecartType;
@@ -18,16 +24,24 @@ public class MinecartItem extends Item {
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onUseItemOnBlock(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         Block block = world.getBlock(blockX, blockY, blockZ);
         if (!(block instanceof RailBlock)) { return false; }
 
         if(!world.isClientSide) {
             world.entityJoinedWorld(new MinecartEntity(world, (float) blockX + 0.5F, (float) blockY + 0.5F, (float) blockZ + 0.5F, minecartType));
         }
-        if (entityplayer.getGamemode().consumeBlocks()) {
+        if (player == null || player.getGamemode().consumeBlocks()) {
             itemstack.stackSize--;
         }
         return true;
     }
+
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        int x = blockX + direction.getOffsetX();
+        int y = blockY + direction.getOffsetY();
+        int z = blockZ + direction.getOffsetZ();
+        onUseItemOnBlock(itemStack, null, world, x, y, z, direction.getSide(), 0.5, 0.5);
+    }
 }
diff --git a/src/main/java/net/minecraft/core/item/MusicDiscItem.java b/src/main/java/net/minecraft/core/item/MusicDiscItem.java
index 3b7f2cff8..16588bba0 100644
--- a/src/main/java/net/minecraft/core/item/MusicDiscItem.java
+++ b/src/main/java/net/minecraft/core/item/MusicDiscItem.java
@@ -5,12 +5,19 @@ package net.minecraft.core.item;
 //            Item, World, Block, JukeboxBlock,
 //            ItemStack, Player
 
+import net.minecraft.core.block.Block;
 import net.minecraft.core.block.JukeboxBlock;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.block.Blocks;
+import net.minecraft.core.world.LevelListener;
 import net.minecraft.core.world.World;
 
+import java.util.Random;
+
 public class MusicDiscItem extends Item
 {
     public final String recordName;
@@ -32,7 +39,7 @@ public class MusicDiscItem extends Item
         {
             if (!world.isClientSide) {
                 ((JukeboxBlock) Blocks.JUKEBOX).playRecord(world, blockX, blockY, blockZ, id);
-                world.playSoundEffect(null, 1005, blockX, blockY, blockZ, id);
+                world.playBlockEvent(null, LevelListener.EVENT_JUKEBOX_TOGGLE, blockX, blockY, blockZ, id);
                 itemstack.consumeItem(entityplayer);
             }
             return true;
@@ -41,4 +48,17 @@ public class MusicDiscItem extends Item
             return false;
         }
     }
+
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        int x = blockX + direction.getOffsetX();
+        int y = blockY + direction.getOffsetY();
+        int z = blockZ + direction.getOffsetZ();
+        int b = world.getBlockId(x, y, z);
+        if (b == Blocks.JUKEBOX.id && world.getBlockMetadata(x, y, z) == 0) {
+            ((JukeboxBlock) Blocks.JUKEBOX).playRecord(world, x, y, z, id);
+            world.playBlockEvent(null, LevelListener.EVENT_JUKEBOX_TOGGLE, blockX, blockY, blockZ, id);
+            itemStack.consumeItem(null);
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/core/item/PaintBrushItem.java b/src/main/java/net/minecraft/core/item/PaintBrushItem.java
index 13531e0f1..39a3d2b42 100644
--- a/src/main/java/net/minecraft/core/item/PaintBrushItem.java
+++ b/src/main/java/net/minecraft/core/item/PaintBrushItem.java
@@ -3,11 +3,17 @@ package net.minecraft.core.item;
 import com.mojang.nbt.CompoundTag;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.IPaintable;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.player.inventory.slot.Slot;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
 
 public class PaintBrushItem extends Item {
     private static final int DAMAGE_PER_DYE = 8;
@@ -19,7 +25,7 @@ public class PaintBrushItem extends Item {
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onUseItemOnBlock(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if (itemstack.getMetadata() >= itemstack.getMaxDamage()) {
             return false;
         }
@@ -32,7 +38,7 @@ public class PaintBrushItem extends Item {
             final DyeColor color = getColor(itemstack);
             if (color != null) {
                 paintable.setColor(world, blockX, blockY, blockZ, color);
-                itemstack.damageItem(1, entityplayer);
+                itemstack.damageItem(1, player);
                 return true;
             }
         }
@@ -40,6 +46,14 @@ public class PaintBrushItem extends Item {
         return false;
     }
 
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        int x = blockX + direction.getOffsetX();
+        int y = blockY + direction.getOffsetY();
+        int z = blockZ + direction.getOffsetZ();
+        onUseItemOnBlock(itemStack, null, world, x, y, z, direction.getSide(), 0.5, 0.5);
+    }
+
     @Override
     public boolean hasInventoryInteraction() {
         return true;
diff --git a/src/main/java/net/minecraft/core/item/PebbleItem.java b/src/main/java/net/minecraft/core/item/PebbleItem.java
index 8e4a8538b..18758812e 100644
--- a/src/main/java/net/minecraft/core/item/PebbleItem.java
+++ b/src/main/java/net/minecraft/core/item/PebbleItem.java
@@ -1,24 +1,21 @@
 package net.minecraft.core.item;
 
-// Referenced classes of package net.minecraft.src:
-//            Item, ItemStack, World, SnowballProjectile,
-//            Player
-
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.entity.projectile.PebbleProjectile;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Random;
 
-public class PebbleItem
-    extends Item
-    implements IDispensable
+public class PebbleItem extends Item implements IDispensable
 {
 
     public PebbleItem(String name, String namespaceId, int id)
@@ -42,7 +39,7 @@ public class PebbleItem
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
         int id = world.getBlockId(blockX, blockY, blockZ);
         int meta = world.getBlockMetadata(blockX, blockY, blockZ);
@@ -73,8 +70,8 @@ public class PebbleItem
             if (newMeta < 3)
             {
                 world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.OVERLAY_PEBBLES.id, newMeta);
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
-                itemstack.consumeItem(entityplayer);
+                world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
+                itemstack.consumeItem(player);
                 return true;
             }
 
@@ -105,8 +102,8 @@ public class PebbleItem
             if (newMeta < 3)
             {
                 world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.OVERLAY_PEBBLES.id, newMeta);
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
-                itemstack.consumeItem(entityplayer);
+                world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
+                itemstack.consumeItem(player);
                 return true;
             }
 
@@ -117,9 +114,9 @@ public class PebbleItem
         {
             if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.OVERLAY_PEBBLES.id, 0))
             {
-                Blocks.OVERLAY_PEBBLES.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, entityplayer, yPlaced);
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
-                itemstack.consumeItem(entityplayer);
+                Blocks.OVERLAY_PEBBLES.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
+                world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.OVERLAY_PEBBLES, EnumBlockSoundEffectType.PLACE);
+                itemstack.consumeItem(player);
 				return true;
             }
         }
@@ -128,9 +125,17 @@ public class PebbleItem
     }
 
     @Override
-    public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int zOffset, Random random) {
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        PebbleProjectile pebbleProjectile = new PebbleProjectile(world, blockX + offX, blockY + offY, blockZ + offZ);
+        pebbleProjectile.setHeading(direction.getOffsetX() * 0.6, direction.getOffsetY() == 0 ? 0.1 : direction.getOffsetY() * 0.6, direction.getOffsetZ() * 0.6f, 1.1F, 6F);
+        world.entityJoinedWorld(pebbleProjectile);
+        itemStack.stackSize -= 1;
+    }
+
+    @Override
+    public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int yOffset, int zOffset, Random random) {
         PebbleProjectile pebbleProjectile = new PebbleProjectile(world, x, y, z);
-        pebbleProjectile.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
+        pebbleProjectile.setHeading(xOffset, yOffset + 0.1D, zOffset, 1.1F, 6F);
         world.entityJoinedWorld(pebbleProjectile);
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/PlaceableItem.java b/src/main/java/net/minecraft/core/item/PlaceableItem.java
index 9cdf81b84..76f265a6c 100644
--- a/src/main/java/net/minecraft/core/item/PlaceableItem.java
+++ b/src/main/java/net/minecraft/core/item/PlaceableItem.java
@@ -1,10 +1,16 @@
 package net.minecraft.core.item;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
 
 public class PlaceableItem extends Item {
 	
@@ -17,7 +23,7 @@ public class PlaceableItem extends Item {
 	}
 
 	@Override
-	public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
 		if(stack.stackSize <= 0) {
 			return false;
 		}
@@ -32,7 +38,11 @@ public class PlaceableItem extends Item {
 		}
 		if(world.canBlockBePlacedAt(blockToPlace.id, blockX, blockY, blockZ, false, side) && stack.consumeItem(player)) {
 			if(world.setBlockWithNotify(blockX, blockY, blockZ, blockToPlace.id)) {
-				blockToPlace.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
+				if (player == null) {
+					blockToPlace.onBlockPlacedByWorld(world, blockX, blockY, blockZ);
+				} else {
+					blockToPlace.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
+				}
 				world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockToPlace, EnumBlockSoundEffectType.PLACE);
 				return true;
 			}
@@ -40,4 +50,14 @@ public class PlaceableItem extends Item {
 		return false;
 	}
 
+	@Override
+	public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+		int x = blockX + direction.getOffsetX();
+		int y = blockY + direction.getOffsetY();
+		int z = blockZ + direction.getOffsetZ();
+		Block b = world.getBlock(x, y, z);
+		if (b == null || BlockTags.PLACE_OVERWRITES.appliesTo(b)) {
+			onUseItemOnBlock(itemStack, null, world, x, y, z, direction.getSide(), 0.5, 0.5);
+		}
+	}
 }
diff --git a/src/main/java/net/minecraft/core/item/RopeItem.java b/src/main/java/net/minecraft/core/item/RopeItem.java
index 955f815e1..52366e44b 100644
--- a/src/main/java/net/minecraft/core/item/RopeItem.java
+++ b/src/main/java/net/minecraft/core/item/RopeItem.java
@@ -1,22 +1,27 @@
 package net.minecraft.core.item;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
 
 public class RopeItem extends PlaceableItem {
     public RopeItem(String name, String namespaceId, int id, Block blockToPlace) {
         super(name, namespaceId, id, blockToPlace);
     }
     @Override
-    public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
+    public boolean onUseItemOnBlock(ItemStack stack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced) {
         if(stack.stackSize <= 0) {
             return false;
         }
         boolean placeOnSide = true;
-        if (world.getBlock(blockX, blockY, blockZ) == blockToPlace && !player.isSneaking()){
+        if (world.getBlock(blockX, blockY, blockZ) == blockToPlace && player != null && !player.isSneaking()){
             placeOnSide = false;
             int _y = blockY;
             while (_y > 0){
@@ -43,11 +48,16 @@ public class RopeItem extends PlaceableItem {
         }
         if(world.canBlockBePlacedAt(blockToPlace.id, blockX, blockY, blockZ, false, side) && stack.consumeItem(player)) {
             if(world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockToPlace.id, placeOnSide ? 0b1000_0000 : 0)) {
-                blockToPlace.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
+                if (player == null) {
+                    blockToPlace.onBlockPlacedByWorld(world, blockX, blockY, blockZ);
+                } else {
+                    blockToPlace.onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
+                }
                 world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockToPlace, EnumBlockSoundEffectType.PLACE);
 				return true;
             }
         }
         return false;
     }
+
 }
diff --git a/src/main/java/net/minecraft/core/item/SeedsItem.java b/src/main/java/net/minecraft/core/item/SeedsItem.java
index aa6f45789..1813b320b 100644
--- a/src/main/java/net/minecraft/core/item/SeedsItem.java
+++ b/src/main/java/net/minecraft/core/item/SeedsItem.java
@@ -3,11 +3,16 @@ package net.minecraft.core.item;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
+import java.util.Random;
+
 public class SeedsItem extends Item {
 	private int cropsId;
 
@@ -32,5 +37,14 @@ public class SeedsItem extends Item {
 		}
 		return false;
 	}
-
+	@Override
+	public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+		int x = blockX + direction.getOffsetX();
+		int y = blockY + direction.getOffsetY();
+		int z = blockZ + direction.getOffsetZ();
+		Block b = world.getBlock(x, y, z);
+		if (b == null || BlockTags.PLACE_OVERWRITES.appliesTo(b)) {
+			onUseItemOnBlock(itemStack, null, world, x, y, z, direction.getSide(), 0.5, 0.5);
+		}
+	}
 }
diff --git a/src/main/java/net/minecraft/core/item/SnowballItem.java b/src/main/java/net/minecraft/core/item/SnowballItem.java
index 80f1c6ba1..e5f7028c0 100644
--- a/src/main/java/net/minecraft/core/item/SnowballItem.java
+++ b/src/main/java/net/minecraft/core/item/SnowballItem.java
@@ -1,18 +1,14 @@
 package net.minecraft.core.item;
 
-// Referenced classes of package net.minecraft.src:
-//            Item, ItemStack, World, SnowballProjectile,
-//            Player
-
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.entity.projectile.SnowballProjectile;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.world.World;
 
 import java.util.Random;
 
-public class SnowballItem
-    extends Item
-    implements IDispensable
+public class SnowballItem extends Item implements IDispensable
 {
 
     public SnowballItem(String name, String namespaceId, int id)
@@ -34,9 +30,17 @@ public class SnowballItem
     }
 
     @Override
-    public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int zOffset, Random random) {
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        SnowballProjectile snowballProjectile = new SnowballProjectile(world, blockX + offX, blockY + offY, blockZ + offZ);
+        snowballProjectile.setHeading(direction.getOffsetX() * 0.6, direction.getOffsetY() == 0 ? 0.1 : direction.getOffsetY() * 0.6, direction.getOffsetZ() * 0.6f, 1.1F, 6F);
+        world.entityJoinedWorld(snowballProjectile);
+        itemStack.stackSize -= 1;
+    }
+
+    @Override
+    public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int yOffset, int zOffset, Random random) {
         SnowballProjectile entitysnowball = new SnowballProjectile(world, x, y, z);
-        entitysnowball.setHeading(xOffset, 0.1D, zOffset, 1.1F, 6F);
+        entitysnowball.setHeading(xOffset, yOffset + 0.1D, zOffset, 1.1F, 6F);
         world.entityJoinedWorld(entitysnowball);
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/SpawnerWandItem.java b/src/main/java/net/minecraft/core/item/SpawnerWandItem.java
index 5f6bde1f5..5ee620f8d 100644
--- a/src/main/java/net/minecraft/core/item/SpawnerWandItem.java
+++ b/src/main/java/net/minecraft/core/item/SpawnerWandItem.java
@@ -1,6 +1,8 @@
 package net.minecraft.core.item;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.entity.Mob;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.phys.HitResult;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.EntityDispatcher;
@@ -13,9 +15,7 @@ import net.minecraft.server.entity.player.ServerPlayer;
 
 import java.util.Random;
 
-public class SpawnerWandItem
-    extends Item
-    implements IDispensable
+public class SpawnerWandItem extends Item implements IDispensable
 {
     public SpawnerWandItem(String name, String namespaceId, int id) {
         super(name, namespaceId, id);
@@ -29,24 +29,8 @@ public class SpawnerWandItem
         }
 
         if (!player.isSneaking()){
-            float f = 1.0F;
-            float f1 = player.xRotO + (player.xRot - player.xRotO) * f;
-            float f2 = player.yRotO + (player.yRot - player.yRotO) * f;
-            double posX = player.xo + (player.x - player.xo) * (double) f;
-            float yOff = player instanceof ServerPlayer ? player.getHeightOffset() : 0;
-            double posY = (player.yo + (player.y - player.yo)) + yOff;
-            double posZ = player.zo + (player.z - player.zo) * (double) f;
-            Vec3 vec3 = Vec3.getTempVec3(posX, posY, posZ);
-            float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
-            float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
-            float f5 = -MathHelper.cos(-f1 * 0.01745329F);
-            float f6 = MathHelper.sin(-f1 * 0.01745329F);
-            float f7 = f4 * f5;
-            float f8 = f6;
-            float f9 = f3 * f5;
             double reachDistance = player.getGamemode().getBlockReachDistance();
-            Vec3 vec31 = vec3.add((double) f7 * reachDistance, (double) f8 * reachDistance, (double) f9 * reachDistance);
-            HitResult rayTraceResult = world.checkBlockCollisionBetweenPoints(vec3, vec31, false);
+            HitResult rayTraceResult = player.rayTrace(reachDistance, 1f, false, false);
 
             if (rayTraceResult != null){
                 if (!world.isClientSide){
@@ -79,13 +63,14 @@ public class SpawnerWandItem
             world.entityJoinedWorld(entity);
         }
     }
+
     @Override
-    public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int zOffset, Random random) {
-        spawnEntity(itemStack, world, x + xOffset * 0.5, y, z + zOffset * 0.5);
+    public void onDispensed(ItemStack itemStack, World world, double x, double y, double z, int xOffset, int yOffset, int zOffset, Random random) {
+        spawnEntity(itemStack, world, x + xOffset * 0.5, y + yOffset * 0.5, z + zOffset * 0.5);
     }
 
     @Override
-    public boolean isRemovedOnDispense() {
-        return false;
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        spawnEntity(itemStack, world, blockX + offX + direction.getOffsetX() * 0.5, blockY + offY + direction.getOffsetY() * 0.5, blockZ + offZ + direction.getOffsetZ() * 0.5);
     }
 }
diff --git a/src/main/java/net/minecraft/core/item/ToolShearsItem.java b/src/main/java/net/minecraft/core/item/ToolShearsItem.java
index 811380791..851a813b9 100644
--- a/src/main/java/net/minecraft/core/item/ToolShearsItem.java
+++ b/src/main/java/net/minecraft/core/item/ToolShearsItem.java
@@ -6,11 +6,22 @@ package net.minecraft.core.item;
 //            Mob
 
 import net.minecraft.core.block.BaseLeavesBlock;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
+import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.Mob;
+import net.minecraft.core.entity.animal.SheepMob;
 import net.minecraft.core.item.material.ToolMaterial;
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
+import net.minecraft.core.util.helper.Direction;
+import net.minecraft.core.util.phys.AABB;
+import net.minecraft.core.util.phys.HitResult;
+import net.minecraft.core.util.phys.Vec3;
+import net.minecraft.core.world.World;
+
+import java.util.List;
+import java.util.Random;
 
 public class ToolShearsItem extends Item
 {
@@ -46,4 +57,16 @@ public class ToolShearsItem extends Item
             return super.getStrVsBlock(itemstack, block);
         }
     }
+
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        blockX += direction.getOffsetX();
+        blockY += direction.getOffsetY();
+        blockZ += direction.getOffsetZ();
+        AABB box = AABB.getTemporaryBB(blockX, blockY, blockZ, blockX + 1, blockY + 1, blockZ + 1);
+        List<Entity> entities = world.getEntitiesWithinAABB(SheepMob.class, box);
+        if (!entities.isEmpty()) {
+            ((SheepMob)(entities.get(0))).onItemInteract(itemStack);
+        }
+    }
 }
diff --git a/src/main/java/net/minecraft/core/item/block/AlgaeBlockItem.java b/src/main/java/net/minecraft/core/item/block/AlgaeBlockItem.java
index 95871617b..bf4333752 100644
--- a/src/main/java/net/minecraft/core/item/block/AlgaeBlockItem.java
+++ b/src/main/java/net/minecraft/core/item/block/AlgaeBlockItem.java
@@ -14,6 +14,7 @@ import net.minecraft.core.util.helper.MathHelper;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.Vec3;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class AlgaeBlockItem extends BlockItem
 {
@@ -26,20 +27,20 @@ public class AlgaeBlockItem extends BlockItem
     }
     
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	return false;
     }
     
     @Override
-    public ItemStack onUseItem(ItemStack itemstack, World world, Player entityplayer)
+    public ItemStack onUseItem(ItemStack itemstack, World world, Player player)
     {
         float f = 1.0F;
-        float f1 = entityplayer.xRotO + (entityplayer.xRot - entityplayer.xRotO) * f;
-        float f2 = entityplayer.yRotO + (entityplayer.yRot - entityplayer.yRotO) * f;
-        double d = entityplayer.xo + (entityplayer.x - entityplayer.xo) * (double)f;
-        double d1 = (entityplayer.yo + (entityplayer.y - entityplayer.yo) * (double)f + 1.62D) - (double)entityplayer.heightOffset;
-        double d2 = entityplayer.zo + (entityplayer.z - entityplayer.zo) * (double)f;
+        float f1 = player.xRotO + (player.xRot - player.xRotO) * f;
+        float f2 = player.yRotO + (player.yRot - player.yRotO) * f;
+        double d = player.xo + (player.x - player.xo) * (double)f;
+        double d1 = (player.yo + (player.y - player.yo) * (double)f + 1.62D) - (double)player.heightOffset;
+        double d2 = player.zo + (player.z - player.zo) * (double)f;
         Vec3 vec3 = Vec3.getTempVec3(d, d1, d2);
         float f3 = MathHelper.cos(-f2 * 0.01745329F - MathHelper.PI);
         float f4 = MathHelper.sin(-f2 * 0.01745329F - MathHelper.PI);
@@ -57,26 +58,26 @@ public class AlgaeBlockItem extends BlockItem
         }
         if(movingobjectposition.hitType == HitResult.HitType.TILE)
         {
-            int i = movingobjectposition.x;
-            int j = movingobjectposition.y;
-            int k = movingobjectposition.z;
+            int blockX = movingobjectposition.x;
+            int blockY = movingobjectposition.y;
+            int blockZ = movingobjectposition.z;
 
-            if(world.getBlockId(i, j, k) == Blocks.FLUID_WATER_STILL.id)
+            if(world.getBlockId(blockX, blockY, blockZ) == Blocks.FLUID_WATER_STILL.id)
             {
-                j++;
+                blockY++;
             }
             else{
                 return itemstack;
             }
 
-            if(world.getBlockId(i, j, k) != 0)
+            if(world.getBlockId(blockX, blockY, blockZ) != 0)
                 return itemstack;
             Block block = Block.blocksList[Blocks.ALGAE.id];
-            if(itemstack.consumeItem(entityplayer) && world.setBlockAndMetadataWithNotify(i, j, k, Blocks.ALGAE.id, 0))
+            if(itemstack.consumeItem(player) && world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, Blocks.ALGAE.id, 0))
             {
-                block.onBlockPlacedByMob(world, i, j, k, null, entityplayer, 0.0);
-                world.playBlockSoundEffect(entityplayer, i + 0.5F, j + 0.5F, k + 0.5F, block, EnumBlockSoundEffectType.PLACE);
-                entityplayer.swingItem();
+                Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, Side.NONE, player, 0.0);
+                world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
+                player.swingItem();
             }
 
         }
diff --git a/src/main/java/net/minecraft/core/item/block/BlockItem.java b/src/main/java/net/minecraft/core/item/block/BlockItem.java
index 78fbdf5fc..73e3fa9a3 100644
--- a/src/main/java/net/minecraft/core/item/block/BlockItem.java
+++ b/src/main/java/net/minecraft/core/item/block/BlockItem.java
@@ -1,12 +1,18 @@
 package net.minecraft.core.item.block;
 
 import net.minecraft.core.block.Block;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, Block, World, ItemStack, 
@@ -30,7 +36,7 @@ public class BlockItem extends Item
     }
 
     @Override
-	public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, @Nullable Player player, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		if(stack.stackSize <= 0) {
 			return false;
 		}
@@ -47,15 +53,30 @@ public class BlockItem extends Item
 			int meta = getPlacedBlockMetadata(player, stack, world, x, y, z, side, xPlaced, yPlaced);
 			if(world.setBlockAndMetadataWithNotify(x, y, z, blockID, meta)) {
 				stack.consumeItem(player);
-				block.onBlockPlacedByMob(world, x, y, z, side, player, yPlaced);
+				if (player == null) {
+                    block.onBlockPlacedByWorld(world, x, y, z);
+                } else {
+                    block.onBlockPlacedByMob(world, x, y, z, side, player, yPlaced);
+                }
 				world.playBlockSoundEffect(player, x + 0.5F, y + 0.5F, z + 0.5F, block, EnumBlockSoundEffectType.PLACE);
 				return true;
 			}
 		}
 		return false;
 	}
-    
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced)
+
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        int x = blockX + direction.getOffsetX();
+        int y = blockY + direction.getOffsetY();
+        int z = blockZ + direction.getOffsetZ();
+        Block b = world.getBlock(x, y, z);
+        if (b == null || BlockTags.PLACE_OVERWRITES.appliesTo(b)) {
+            onUseItemOnBlock(itemStack, null, world, x, y, z, direction.getSide(), 0.5, 0.5);
+        }
+    }
+
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced)
     {
     	return Block.getBlock(blockID).getPlacedBlockMetadata(player, stack, world, x, y, z, side, xPlaced, yPlaced);
     }
diff --git a/src/main/java/net/minecraft/core/item/block/LadderBlockItem.java b/src/main/java/net/minecraft/core/item/block/LadderBlockItem.java
index 00858722e..8ab95f928 100644
--- a/src/main/java/net/minecraft/core/item/block/LadderBlockItem.java
+++ b/src/main/java/net/minecraft/core/item/block/LadderBlockItem.java
@@ -7,6 +7,7 @@ import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class LadderBlockItem extends BlockItem {
 
@@ -19,10 +20,10 @@ public class LadderBlockItem extends BlockItem {
 	}
 	
 	@Override
-	public boolean onUseItemOnBlock(ItemStack stack, Player player, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public boolean onUseItemOnBlock(ItemStack stack, @Nullable Player player, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		Block clickedBlock = world.getBlock(x, y, z);
 		
-		if(clickedBlock == ladderBlock && !player.isSneaking()) {
+		if(clickedBlock == ladderBlock && player != null && !player.isSneaking()) {
 			Side clickedLadderSide = ladderBlock.getSideFromMeta(world.getBlockMetadata(x, y, z));
 			while(world.getBlock(x, y, z) == ladderBlock && ladderBlock.getSideFromMeta(world.getBlockMetadata(x, y, z)) == clickedLadderSide) y--;
 			int meta = ladderBlock.getMetaForSide(clickedLadderSide);
@@ -52,7 +53,7 @@ public class LadderBlockItem extends BlockItem {
 		return false;
 	}
 	
-	public boolean placeBlock(World world, int x, int y, int z, int meta, Player player, ItemStack stack, Side side, double sideHeight) {
+	public boolean placeBlock(World world, int x, int y, int z, int meta, @Nullable Player player, ItemStack stack, Side side, double sideHeight) {
 		if(world.canPlaceInsideBlock(x, y, z) && world.canBlockBePlacedAt(blockID, x, y, z, false, side) && stack.consumeItem(player)) {
 			if(world.setBlockAndMetadataWithNotify(x, y, z, blockID, meta)) {
 				Block.getBlock(blockID).onBlockPlacedByMob(world, x, y, z, side, player, sideHeight);
diff --git a/src/main/java/net/minecraft/core/item/block/LampBlockItem.java b/src/main/java/net/minecraft/core/item/block/LampBlockItem.java
index f088b21b4..5eb27fa99 100644
--- a/src/main/java/net/minecraft/core/item/block/LampBlockItem.java
+++ b/src/main/java/net/minecraft/core/item/block/LampBlockItem.java
@@ -6,6 +6,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.DyeColor;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class LampBlockItem extends BlockItem
 {
@@ -18,7 +19,7 @@ public class LampBlockItem extends BlockItem
     }
     
     @Override
-    public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+    public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
     	return stack.getMetadata();
     }
 
diff --git a/src/main/java/net/minecraft/core/item/block/LayerBlockItem.java b/src/main/java/net/minecraft/core/item/block/LayerBlockItem.java
index 03a60d60e..49fa05fed 100644
--- a/src/main/java/net/minecraft/core/item/block/LayerBlockItem.java
+++ b/src/main/java/net/minecraft/core/item/block/LayerBlockItem.java
@@ -14,6 +14,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 
 public class LayerBlockItem extends BlockItem
@@ -24,7 +25,7 @@ public class LayerBlockItem extends BlockItem
 	}
 
 	@Override
-	public boolean onUseItemOnBlock(final ItemStack itemstack, final Player entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
+	public boolean onUseItemOnBlock(final ItemStack itemstack, final @Nullable Player player, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
 	{
 		int id = world.getBlockId(blockX, blockY, blockZ);
 		int meta = world.getBlockMetadata(blockX, blockY, blockZ);
@@ -71,8 +72,8 @@ public class LayerBlockItem extends BlockItem
 					world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, blockID, 0);
 				}
 			}
-			world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
-			itemstack.consumeItem(entityplayer);
+			world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
+			itemstack.consumeItem(player);
 			return true;
 
 		}
@@ -116,8 +117,8 @@ public class LayerBlockItem extends BlockItem
 					world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, blockID, 0);
 				}
 			}
-			world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
-			itemstack.consumeItem(entityplayer);
+			world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
+			itemstack.consumeItem(player);
 			return true;
 		}
 
@@ -125,12 +126,16 @@ public class LayerBlockItem extends BlockItem
 		if (world.canBlockBePlacedAt(blockID, blockX, blockY, blockZ, false, side))
 		{
 			final Block block = Block.blocksList[blockID];
-			int placeMeta = getPlacedBlockMetadata(entityplayer, itemstack, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
+			int placeMeta = getPlacedBlockMetadata(player, itemstack, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
 			if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, placeMeta))
 			{
-				Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, null, entityplayer, yPlaced);
-				world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
-				itemstack.consumeItem(entityplayer);
+				if (player == null) {
+					Block.blocksList[blockID].onBlockPlacedByWorld(world, blockX, blockY, blockZ);
+				} else {
+					Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, Side.NONE, player, yPlaced);
+				}
+				world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
+				itemstack.consumeItem(player);
 				return true;
 			}
 		}
diff --git a/src/main/java/net/minecraft/core/item/block/LeavesLayerBlockItem.java b/src/main/java/net/minecraft/core/item/block/LeavesLayerBlockItem.java
index 9179e3f21..86303dcf7 100644
--- a/src/main/java/net/minecraft/core/item/block/LeavesLayerBlockItem.java
+++ b/src/main/java/net/minecraft/core/item/block/LeavesLayerBlockItem.java
@@ -11,6 +11,7 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
 
 public class LeavesLayerBlockItem extends BlockItem
 {
@@ -20,7 +21,7 @@ public class LeavesLayerBlockItem extends BlockItem
 	}
 
 	@Override
-	public boolean onUseItemOnBlock(final ItemStack itemstack, final Player entityplayer, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
+	public boolean onUseItemOnBlock(final ItemStack itemstack, final Player player, final World world, int blockX, int blockY, int blockZ, final Side side, double xPlaced, final double yPlaced)
 	{
 		int id = world.getBlockId(blockX, blockY, blockZ);
 		int meta = world.getBlockMetadata(blockX, blockY, blockZ);
@@ -67,8 +68,8 @@ public class LeavesLayerBlockItem extends BlockItem
 					world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, blockID, LeavesLayerBlock.setPermanent(0, true));
 				}
 			}
-			world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
-			itemstack.consumeItem(entityplayer);
+			world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
+			itemstack.consumeItem(player);
 			return true;
 
 		}
@@ -112,8 +113,8 @@ public class LeavesLayerBlockItem extends BlockItem
 					world.setBlockAndMetadataWithNotify(blockX, blockY + 1, blockZ, blockID, LeavesLayerBlock.setPermanent(0, true));
 				}
 			}
-			world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
-			itemstack.consumeItem(entityplayer);
+			world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockLayer, EnumBlockSoundEffectType.PLACE);
+			itemstack.consumeItem(player);
 			return true;
 		}
 
@@ -121,12 +122,16 @@ public class LeavesLayerBlockItem extends BlockItem
 		if (world.canBlockBePlacedAt(blockID, blockX, blockY, blockZ, false, side))
 		{
 			final Block block = Block.blocksList[blockID];
-			int placeMeta = getPlacedBlockMetadata(entityplayer, itemstack, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
+			int placeMeta = getPlacedBlockMetadata(player, itemstack, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
 			if (world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, placeMeta))
 			{
-				Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, null, entityplayer, yPlaced);
-				world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
-				itemstack.consumeItem(entityplayer);
+				if (player == null) {
+					Block.blocksList[blockID].onBlockPlacedByWorld(world, blockX, blockY, blockZ);
+				} else {
+					Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
+				}
+				world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
+				itemstack.consumeItem(player);
 				return true;
 			}
 		}
@@ -135,7 +140,7 @@ public class LeavesLayerBlockItem extends BlockItem
 	}
 	
 	@Override
-	public int getPlacedBlockMetadata(Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
+	public int getPlacedBlockMetadata(@Nullable Player player, ItemStack stack, World world, int x, int y, int z, Side side, double xPlaced, double yPlaced) {
 		return LeavesLayerBlock.MASK_PERMANENT;
 	}
 
diff --git a/src/main/java/net/minecraft/core/item/block/SlabBlockItem.java b/src/main/java/net/minecraft/core/item/block/SlabBlockItem.java
index cba832a33..27291fc9b 100644
--- a/src/main/java/net/minecraft/core/item/block/SlabBlockItem.java
+++ b/src/main/java/net/minecraft/core/item/block/SlabBlockItem.java
@@ -8,6 +8,8 @@ import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.util.phys.AABB;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
 public class SlabBlockItem extends BlockItem
 {
 
@@ -17,7 +19,7 @@ public class SlabBlockItem extends BlockItem
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
     	int id = world.getBlockId(blockX, blockY, blockZ);
     	int meta = world.getBlockMetadata(blockX, blockY, blockZ) & 0x3;
@@ -47,8 +49,8 @@ public class SlabBlockItem extends BlockItem
 
         		Block blockSlab = Block.blocksList[blockID];
         		world.setBlockMetadataWithNotify(blockX, blockY, blockZ, 1 | itemstack.getMetadata());
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockSlab, EnumBlockSoundEffectType.PLACE);
-            	itemstack.consumeItem(entityplayer);
+                world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockSlab, EnumBlockSoundEffectType.PLACE);
+            	itemstack.consumeItem(player);
             	return true;
         	}
         }
@@ -75,8 +77,8 @@ public class SlabBlockItem extends BlockItem
 
         		Block blockSlab = Block.blocksList[blockID];
         		world.setBlockMetadataWithNotify(blockX, blockY, blockZ, 1 | itemstack.getMetadata());
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockSlab, EnumBlockSoundEffectType.PLACE);
-                itemstack.consumeItem(entityplayer);
+                world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, blockSlab, EnumBlockSoundEffectType.PLACE);
+                itemstack.consumeItem(player);
             	return true;
         	}
         }
@@ -85,12 +87,16 @@ public class SlabBlockItem extends BlockItem
         if(world.canBlockBePlacedAt(blockID, blockX, blockY, blockZ, false, side))
         {
             Block block = Block.blocksList[blockID];
-            int placeMeta = getPlacedBlockMetadata(entityplayer, itemstack, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
+            int placeMeta = getPlacedBlockMetadata(player, itemstack, world, blockX, blockY, blockZ, side, xPlaced, yPlaced);
             if(world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, blockID, placeMeta))
             {
-            	Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, side, entityplayer, yPlaced);
-                world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
-                itemstack.consumeItem(entityplayer);
+                if (player == null) {
+                    Block.blocksList[blockID].onBlockPlacedByWorld(world, blockX, blockY, blockZ);
+                } else {
+                    Block.blocksList[blockID].onBlockPlacedByMob(world, blockX, blockY, blockZ, side, player, yPlaced);
+                }
+                world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, block, EnumBlockSoundEffectType.PLACE);
+                itemstack.consumeItem(player);
 				return true;
             }
         }
diff --git a/src/main/java/net/minecraft/core/item/tool/HoeToolItem.java b/src/main/java/net/minecraft/core/item/tool/HoeToolItem.java
index 26b47034b..6ac7533ee 100644
--- a/src/main/java/net/minecraft/core/item/tool/HoeToolItem.java
+++ b/src/main/java/net/minecraft/core/item/tool/HoeToolItem.java
@@ -2,6 +2,7 @@ package net.minecraft.core.item.tool;
 
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
@@ -10,8 +11,12 @@ import net.minecraft.core.item.Item;
 import net.minecraft.core.item.Items;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            Item, EnumToolMaterial, World, Block, 
@@ -33,8 +38,12 @@ public class HoeToolItem extends ToolItem
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
+        return till(itemstack, player, world, blockX, blockY, blockZ, side);
+    }
+
+    public boolean till(ItemStack itemstack, @Nullable Player player, World world, int blockX, int blockY, int blockZ, Side side) {
         int id = world.getBlockId(blockX, blockY, blockZ);
         int j1 = world.getBlockId(blockX, blockY + 1, blockZ);
         if(side != Side.BOTTOM && j1 == 0 && (id == Blocks.GRASS.id || id == Blocks.DIRT.id || id == Blocks.PATH_DIRT.id || id == Blocks.GRASS_RETRO.id || id == Blocks.MUD.id))
@@ -43,12 +52,12 @@ public class HoeToolItem extends ToolItem
             if(id == Blocks.MUD.id)
                 meta = 1;
             Block block = Blocks.FARMLAND_DIRT;
-            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.DIRT, EnumBlockSoundEffectType.MINE);
+            world.playBlockSoundEffect(player, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Blocks.DIRT, EnumBlockSoundEffectType.MINE);
             if(!world.isClientSide) {
                 if(id == Blocks.GRASS.id || id == Blocks.GRASS_RETRO.id || id == Blocks.GRASS_SCORCHED.id) {
-                	if(world.rand.nextInt(5) == 0) {
-                		world.dropItem(blockX, blockY + 1, blockZ, new ItemStack(Items.SEEDS_WHEAT));
-                	}
+                    if(world.rand.nextInt(5) == 0) {
+                        world.dropItem(blockX, blockY + 1, blockZ, new ItemStack(Items.SEEDS_WHEAT));
+                    }
                 }
             }
             if(world.isClientSide)
@@ -57,7 +66,7 @@ public class HoeToolItem extends ToolItem
             } else
             {
                 world.setBlockAndMetadataWithNotify(blockX, blockY, blockZ, block.id, meta);
-                itemstack.damageItem(1, entityplayer);
+                itemstack.damageItem(1, player);
                 return true;
             }
         } else
@@ -65,7 +74,12 @@ public class HoeToolItem extends ToolItem
             return false;
         }
     }
-    
+
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        till(itemStack, null, world, blockX + direction.getOffsetX(), blockY + direction.getOffsetY(), blockZ + direction.getOffsetZ(), direction.getSide());
+    }
+
     @Override
     public boolean onBlockDestroyed(World world, ItemStack itemstack, int id, int x, int y, int z, Side side, Mob mob) {
     	if(mob != null && !mob.world.isClientSide) {
diff --git a/src/main/java/net/minecraft/core/item/tool/ShovelToolItem.java b/src/main/java/net/minecraft/core/item/tool/ShovelToolItem.java
index a19e2d050..902650fd2 100644
--- a/src/main/java/net/minecraft/core/item/tool/ShovelToolItem.java
+++ b/src/main/java/net/minecraft/core/item/tool/ShovelToolItem.java
@@ -2,14 +2,19 @@ package net.minecraft.core.item.tool;
 
 import net.minecraft.core.block.Block;
 import net.minecraft.core.block.Blocks;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Mob;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.enums.EnumBlockSoundEffectType;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Random;
 
 // Referenced classes of package net.minecraft.src:
 //            ToolItem, Block, EnumToolMaterial
@@ -28,14 +33,18 @@ public class ShovelToolItem extends ToolItem
     }
 
     @Override
-    public boolean onUseItemOnBlock(ItemStack itemstack, Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
+    public boolean onUseItemOnBlock(ItemStack itemstack, Player player, World world, int blockX, int blockY, int blockZ, Side side, double xPlaced, double yPlaced)
     {
-        int i1 = world.getBlockId(blockX, blockY, blockZ);
-        int j1 = world.getBlockId(blockX, blockY + 1, blockZ);
-        if(side != Side.BOTTOM && j1 == 0 && (i1 == Blocks.GRASS.id || i1 == Blocks.DIRT.id || i1 == Blocks.GRASS_RETRO.id || i1 == Blocks.FARMLAND_DIRT.id))
+        return shovelBlock(itemstack, player, world, blockX, blockY, blockZ, side);
+    }
+
+    public boolean shovelBlock(ItemStack itemstack, @Nullable Player entityplayer, World world, int blockX, int blockY, int blockZ, Side side) {
+        int blockId = world.getBlockId(blockX, blockY, blockZ);
+        int blockAbove = world.getBlockId(blockX, blockY + 1, blockZ);
+        if(side != Side.BOTTOM && blockAbove == 0 && (blockId == Blocks.GRASS.id || blockId == Blocks.DIRT.id || blockId == Blocks.GRASS_RETRO.id || blockId == Blocks.FARMLAND_DIRT.id))
         {
             Block block = Blocks.PATH_DIRT;
-            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.blocksList[i1], EnumBlockSoundEffectType.PLACE);
+            world.playBlockSoundEffect(entityplayer, blockX + 0.5F, blockY + 0.5F, blockZ + 0.5F, Block.blocksList[blockId], EnumBlockSoundEffectType.PLACE);
             if (!world.isClientSide) {
                 world.setBlockWithNotify(blockX, blockY, blockZ, block.id);
                 itemstack.damageItem(1, entityplayer);
@@ -44,4 +53,9 @@ public class ShovelToolItem extends ToolItem
         }
         return false;
     }
+
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        shovelBlock(itemStack, null, world, blockX + direction.getOffsetX(), blockY + direction.getOffsetY(), blockZ + direction.getOffsetZ(), direction.getSide());
+    }
 }
diff --git a/src/main/java/net/minecraft/core/item/tool/SwordToolItem.java b/src/main/java/net/minecraft/core/item/tool/SwordToolItem.java
index b71675049..c199b3f71 100644
--- a/src/main/java/net/minecraft/core/item/tool/SwordToolItem.java
+++ b/src/main/java/net/minecraft/core/item/tool/SwordToolItem.java
@@ -1,5 +1,6 @@
 package net.minecraft.core.item.tool;
 
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
 import net.minecraft.core.block.tag.BlockTags;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.Mob;
@@ -8,9 +9,12 @@ import net.minecraft.core.block.Blocks;
 import net.minecraft.core.item.Item;
 import net.minecraft.core.item.ItemStack;
 import net.minecraft.core.item.material.ToolMaterial;
+import net.minecraft.core.util.helper.Direction;
 import net.minecraft.core.util.helper.Side;
 import net.minecraft.core.world.World;
 
+import java.util.Random;
+
 // Referenced classes of package net.minecraft.src:
 //            Item, EnumToolMaterial, Block, ItemStack, 
 //            Mob, Entity
@@ -52,6 +56,18 @@ public class SwordToolItem extends Item
         return true;
     }
 
+    @Override
+    public void onUseByActivator(ItemStack itemStack, ActivatorBlockEntity activatorBlock, World world, Random random, int blockX, int blockY, int blockZ, double offX, double offY, double offZ, Direction direction) {
+        blockX += direction.getOffsetX();
+        blockY += direction.getOffsetY();
+        blockZ += direction.getOffsetZ();
+        Block b = world.getBlock(blockX, blockY, blockZ);
+        if (b == Blocks.PUMPKIN) {
+            world.setBlockAndMetadata(blockX, blockY, blockZ, Blocks.PUMPKIN_CARVED_IDLE.id, direction.getOpposite().getId());
+            itemStack.damageItem(1, null);
+        }
+    }
+
     @Override
     public int getDamageVsEntity(Entity entity)
     {
diff --git a/src/main/java/net/minecraft/core/net/packet/ContainerOpenPacket.java b/src/main/java/net/minecraft/core/net/packet/ContainerOpenPacket.java
index 2b585519f..88ea5573d 100644
--- a/src/main/java/net/minecraft/core/net/packet/ContainerOpenPacket.java
+++ b/src/main/java/net/minecraft/core/net/packet/ContainerOpenPacket.java
@@ -9,17 +9,33 @@ import java.io.*;
 
 public class ContainerOpenPacket extends Packet
 {
+    public static final int TYPE_GENERIC_CONTAINER = 0;
+    public static final int TYPE_CRAFTING = 1;
+    public static final int TYPE_FURNACE = 2;
+    public static final int TYPE_DISPENSER = 3;
+    public static final int TYPE_BLAST_FURNACE = 4;
+    public static final int TYPE_TROMMEL = 5;
+    public static final int TYPE_ACTIVATOR = 6;
+    public static final int TYPE_PAINTING = 7;
+
+    public int windowId;
+    public int inventoryType;
+    public String windowTitle;
+    public int slotsCount;
 
     public ContainerOpenPacket()
     {
     }
     
-    public ContainerOpenPacket(int i, int j, String s, int k)
+    public ContainerOpenPacket(int windowId, int inventoryType, String windowTitle, int slotCount)
     {
-        windowId = i;
-        inventoryType = j;
-        windowTitle = s;
-        slotsCount = k;
+        assert windowId <= Byte.MAX_VALUE : "Window Id > 127 won't serialize properly";
+        assert inventoryType <= Byte.MAX_VALUE : "Inventory Type > 127 won't serialize properly";
+        assert slotCount <= Byte.MAX_VALUE : "Slot Count > 127 won't serialize properly";
+        this.windowId = windowId;
+        this.inventoryType = inventoryType;
+        this.windowTitle = windowTitle;
+        slotsCount = slotCount;
     }
 
     @Override
@@ -53,9 +69,4 @@ public class ContainerOpenPacket extends Packet
     {
         return 3 + windowTitle.length();
     }
-
-    public int windowId;
-    public int inventoryType;
-    public String windowTitle;
-    public int slotsCount;
 }
diff --git a/src/main/java/net/minecraft/core/player/inventory/menu/AbstractContainerMenu.java b/src/main/java/net/minecraft/core/player/inventory/menu/AbstractContainerMenu.java
index 9501fb09a..0611efd83 100644
--- a/src/main/java/net/minecraft/core/player/inventory/menu/AbstractContainerMenu.java
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/AbstractContainerMenu.java
@@ -15,6 +15,7 @@ import net.minecraft.core.player.inventory.container.Inventory;
 import net.minecraft.core.player.inventory.slot.Slot;
 import net.minecraft.core.player.inventory.slot.ResultSlot;
 import net.minecraft.core.util.helper.MathHelper;
+import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
 
 public abstract class AbstractContainerMenu
@@ -90,10 +91,15 @@ public abstract class AbstractContainerMenu
 
 	}
 
-	public Slot getSlotFor(Container container, int i)
+	/**
+	 * @param container Inventory
+	 * @param index integer index of slot in container
+	 * @return Slot for index in current container, null otherwise
+	 */
+	public @Nullable Slot getSlotFor(Container container, int index)
 	{
 		for (Slot inventorySlot : slots) {
-            if (inventorySlot.isAt(container, i)) {
+            if (inventorySlot.isAt(container, index)) {
 				return inventorySlot;
 			}
 		}
diff --git a/src/main/java/net/minecraft/core/player/inventory/menu/ActivatorMenu.java b/src/main/java/net/minecraft/core/player/inventory/menu/ActivatorMenu.java
new file mode 100644
index 000000000..e12b597ff
--- /dev/null
+++ b/src/main/java/net/minecraft/core/player/inventory/menu/ActivatorMenu.java
@@ -0,0 +1,75 @@
+package net.minecraft.core.player.inventory.menu;
+
+import net.minecraft.core.InventoryAction;
+import net.minecraft.core.block.entity.ActivatorBlockEntity;
+import net.minecraft.core.entity.player.Player;
+import net.minecraft.core.player.inventory.container.Container;
+import net.minecraft.core.player.inventory.slot.Slot;
+
+import java.util.List;
+
+public class ActivatorMenu extends AbstractContainerMenu {
+
+	public ActivatorBlockEntity activator;
+
+	private final int activatorSlotsStart;
+	private final int inventorySlotsStart;
+	private final int hotbarSlotsStart;
+
+	public ActivatorMenu(Container container, ActivatorBlockEntity activator) {
+		this.activator = activator;
+		for (int i = 0; i < ActivatorBlockEntity.CONTAINER_SIZE; i++) {
+			addSlot(new Slot(activator, i, 8 + i * 18, 35));
+		}
+
+		for (int j = 0; j < 3; j++) {
+			for (int i1 = 0; i1 < 9; i1++) {
+				addSlot(new Slot(container, i1 + j * 9 + 9, 8 + i1 * 18, 84 + j * 18));
+			}
+		}
+
+		for (int k = 0; k < 9; k++) {
+			addSlot(new Slot(container, k, 8 + k * 18, 142));
+		}
+		
+		activatorSlotsStart = 0;
+		inventorySlotsStart = 9;
+		hotbarSlotsStart = 36;
+	}
+	
+	@Override
+	public boolean stillValid(Player entityplayer) {
+		return activator.stillValid(entityplayer);
+	}
+
+	@Override
+	public List<Integer> getMoveSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= activatorSlotsStart && slot.index < inventorySlotsStart) {
+			return getSlots(activatorSlotsStart, 9, false);
+		}
+		
+		if(action == InventoryAction.MOVE_ALL) {
+			if(slot.index >= inventorySlotsStart && slot.index < hotbarSlotsStart) {
+				return getSlots(inventorySlotsStart, 27, false);
+			}
+			if(slot.index >= hotbarSlotsStart) {
+				return getSlots(hotbarSlotsStart, 9, false);
+			}
+		}
+		if(action == InventoryAction.MOVE_SIMILAR) {
+			if(slot.index >= inventorySlotsStart) {
+				return getSlots(inventorySlotsStart, 36, false);
+			}
+		}
+		return null;
+	}
+
+	@Override
+	public List<Integer> getTargetSlots(InventoryAction action, Slot slot, int target, Player player) {
+		if(slot.index >= activatorSlotsStart && slot.index < inventorySlotsStart) {
+			return getSlots(inventorySlotsStart, 36, false);
+		}else {
+			return getSlots(activatorSlotsStart, 9, false);
+		}
+	}
+}
diff --git a/src/main/java/net/minecraft/core/world/LevelListener.java b/src/main/java/net/minecraft/core/world/LevelListener.java
index 2df368461..9cf700e2a 100644
--- a/src/main/java/net/minecraft/core/world/LevelListener.java
+++ b/src/main/java/net/minecraft/core/world/LevelListener.java
@@ -3,6 +3,7 @@ package net.minecraft.core.world;
 // Referenced classes of package net.minecraft.src:
 //            Entity, BlockEntity, Player
 
+import net.minecraft.client.render.RenderGlobal;
 import net.minecraft.core.entity.Entity;
 import net.minecraft.core.entity.player.Player;
 import net.minecraft.core.block.entity.BlockEntity;
diff --git a/src/main/java/net/minecraft/core/world/SpawnerMobs.java b/src/main/java/net/minecraft/core/world/SpawnerMobs.java
index 8e2d7aa8a..378da74f8 100644
--- a/src/main/java/net/minecraft/core/world/SpawnerMobs.java
+++ b/src/main/java/net/minecraft/core/world/SpawnerMobs.java
@@ -297,7 +297,7 @@ public final class SpawnerMobs
 									entity.spawnInit();
 									world.entityJoinedWorld(entity);
 									player.wakeUpPlayer(true, false);
-									world.playSoundEffect(null, 2001, (int) player.x, (int) player.y - 1, (int) player.z, world.getBlockId((int) player.x, (int) player.y - 1, (int) player.z));
+									world.playBlockEvent(null, 2001, (int) player.x, (int) player.y - 1, (int) player.z, world.getBlockId((int) player.x, (int) player.y - 1, (int) player.z));
 									entity.playLivingSound();
 									spawnedEntity = true;
 									spawnedEntityForPlayer = true;
diff --git a/src/main/java/net/minecraft/core/world/World.java b/src/main/java/net/minecraft/core/world/World.java
index a15af5e56..9ff87705c 100644
--- a/src/main/java/net/minecraft/core/world/World.java
+++ b/src/main/java/net/minecraft/core/world/World.java
@@ -1171,7 +1171,7 @@ public class World implements WorldSource {
     }
 
     @Nullable
-    public HitResult checkBlockCollisionBetweenPoints(Vec3 start, Vec3 end, boolean shouldCollideWithFluids, boolean flag1)
+    public HitResult checkBlockCollisionBetweenPoints(Vec3 start, Vec3 end, boolean shouldCollideWithFluids, boolean ignoreNonColliderBlocks)
     {
         if(Double.isNaN(start.x) || Double.isNaN(start.y) || Double.isNaN(start.z))
         {
@@ -1190,7 +1190,7 @@ public class World implements WorldSource {
         int id = getBlockId(blockStartX, blockStartY, blockStartZ);
         int meta = getBlockMetadata(blockStartX, blockStartY, blockStartZ);
         Block block = Block.blocksList[id];
-        if((!flag1 || block == null || block.getCollisionBoundingBoxFromPool(this, blockStartX, blockStartY, blockStartZ) != null) && id > 0 && (block.canCollideCheck(meta, shouldCollideWithFluids)))
+        if((!ignoreNonColliderBlocks || block == null || block.getCollisionBoundingBoxFromPool(this, blockStartX, blockStartY, blockStartZ) != null) && id > 0 && (block.canCollideCheck(meta, shouldCollideWithFluids)))
         {
             HitResult movingobjectposition = block.collisionRayTrace(this, blockStartX, blockStartY, blockStartZ, start, end);
             if(movingobjectposition != null)
@@ -1326,7 +1326,7 @@ public class World implements WorldSource {
             int j2 = getBlockId(blockStartX, blockStartY, blockStartZ);
             int k2 = getBlockMetadata(blockStartX, blockStartY, blockStartZ);
             Block block1 = Block.blocksList[j2];
-            if((!flag1 || block1 == null || block1.getCollisionBoundingBoxFromPool(this, blockStartX, blockStartY, blockStartZ) != null) && j2 > 0 && block1.canCollideCheck(k2, shouldCollideWithFluids))
+            if((!ignoreNonColliderBlocks || block1 == null || block1.getCollisionBoundingBoxFromPool(this, blockStartX, blockStartY, blockStartZ) != null) && j2 > 0 && block1.canCollideCheck(k2, shouldCollideWithFluids))
             {
                 HitResult movingobjectposition1 = block1.collisionRayTrace(this, blockStartX, blockStartY, blockStartZ, start, end);
                 if(movingobjectposition1 != null)
@@ -1339,7 +1339,7 @@ public class World implements WorldSource {
         return null;
     }
     
-    public void playSoundAtEntity(Entity player, Entity entity, String soundPath, float volume, float pitch)
+    public void playSoundAtEntity(@Nullable Entity player, Entity entity, String soundPath, float volume, float pitch)
     {
         for (LevelListener listener : listeners)
         {
@@ -1348,7 +1348,7 @@ public class World implements WorldSource {
 
     }
     
-    public void playSoundEffect(Entity player, SoundCategory category, double x, double y, double z, String soundPath,
+    public void playSoundEffect(@Nullable Entity player, SoundCategory category, double x, double y, double z, String soundPath,
                                 float volume, float pitch)
     {
         for (LevelListener listener : listeners)
@@ -1357,7 +1357,7 @@ public class World implements WorldSource {
         }
     }
     
-    public void playBlockSoundEffect(Entity player, double x, double y, double z, Block block, EnumBlockSoundEffectType soundType)
+    public void playBlockSoundEffect(@Nullable Entity player, double x, double y, double z, Block block, EnumBlockSoundEffectType soundType)
     {
         if (block == null) return;
 
@@ -2226,7 +2226,7 @@ public class World implements WorldSource {
         z += side.getOffsetZ();
         if(getBlockId(x, y, z) == Blocks.FIRE.id)
         {
-            playSoundEffect(entityplayer, 1004, x, y, z, 0);
+            playBlockEvent(entityplayer, 1004, x, y, z, 0);
             setBlockWithNotify(x, y, z, 0);
         }
     }
@@ -3278,12 +3278,12 @@ public class World implements WorldSource {
         return savedDataStorage.getFreeMetadataFor(s);
     }
 
-    public void playSoundEffect(int id, int x, int y, int z, int data)
+    public void playBlockEvent(int id, int x, int y, int z, int data)
     {
-        playSoundEffect(null, id, x, y, z, data);
+        playBlockEvent(null, id, x, y, z, data);
     }
 
-    public void playSoundEffect(Player entityplayer, int id, int x, int y, int z, int data)
+    public void playBlockEvent(Player entityplayer, int id, int x, int y, int z, int data)
     {
         for (LevelListener listener : listeners) {
             listener.levelEvent(entityplayer, id, x, y, z, data);
diff --git a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLake.java b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLake.java
index 9c351498c..47d50bed8 100644
--- a/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLake.java
+++ b/src/main/java/net/minecraft/core/world/generate/feature/WorldFeatureLake.java
@@ -98,7 +98,7 @@ public class WorldFeatureLake extends WorldFeature
             {
                 for(int dy = 0; dy < 8; dy++)
                 {
-                    if(shouldPlaceLiquid[(dx * 16 + dz) * 8 + dy])
+                    if(shouldPlaceLiquid[(dx * 16 + dz) * 8 + dy] && world.getBlockId(x + dx, y + dy, z + dz) != Blocks.BEDROCK.id)
                     {
                         world.setBlockWithNotify(x + dx, y + dy, z + dz, dy < 4 ? liquidId : 0);
                     }
@@ -114,7 +114,7 @@ public class WorldFeatureLake extends WorldFeature
             {
                 for(int dy = 4; dy < 8; dy++)
                 {
-                    if(shouldPlaceLiquid[(dx * 16 + dz) * 8 + dy] && world.getBlockId(x + dx, (y + dy) - 1, z + dz) == Blocks.DIRT.id && world.getSavedLightValue(LightLayer.Sky, x + dx, y + dy, z + dz) > 0)
+                    if(shouldPlaceLiquid[(dx * 16 + dz) * 8 + dy] && world.getBlockId(x + dx, y + dy - 1, z + dz) != Blocks.BEDROCK.id && world.getBlockId(x + dx, (y + dy) - 1, z + dz) == Blocks.DIRT.id && world.getSavedLightValue(LightLayer.Sky, x + dx, y + dy, z + dz) > 0)
                     {
                         world.setBlock(x + dx, (y + dy) - 1, z + dz, Blocks.GRASS.id);
                     }
@@ -133,7 +133,7 @@ public class WorldFeatureLake extends WorldFeature
                     for(int dy = 0; dy < 8; dy++)
                     {
                         boolean flag1 = !shouldPlaceLiquid[(dx * 16 + dz) * 8 + dy] && (dx < 15 && shouldPlaceLiquid[((dx + 1) * 16 + dz) * 8 + dy] || dx > 0 && shouldPlaceLiquid[((dx - 1) * 16 + dz) * 8 + dy] || dz < 15 && shouldPlaceLiquid[(dx * 16 + (dz + 1)) * 8 + dy] || dz > 0 && shouldPlaceLiquid[(dx * 16 + (dz - 1)) * 8 + dy] || dy < 7 && shouldPlaceLiquid[(dx * 16 + dz) * 8 + (dy + 1)] || dy > 0 && shouldPlaceLiquid[(dx * 16 + dz) * 8 + (dy - 1)]);
-                        if(flag1 && (dy < 4 || random.nextInt(2) != 0) && world.getBlockMaterial(x + dx, y + dy, z + dz).isSolid())
+                        if(flag1 && (dy < 4 || random.nextInt(2) != 0) && world.getBlockId(x + dx, y + dy, z + dz) != Blocks.BEDROCK.id && world.getBlockMaterial(x + dx, y + dy, z + dz).isSolid())
                         {
                             world.setBlock(x + dx, y + dy, z + dz, world.getWorldType().getFillerBlockId());
                         }
diff --git a/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java b/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
index caf11602c..09baaa878 100644
--- a/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
+++ b/src/main/java/net/minecraft/datagen/WorkbenchGenerator.java
@@ -143,6 +143,17 @@ class WorkbenchGenerator {
             .addInput('R', Items.DUST_REDSTONE)
             .create("dispenser", Blocks.DISPENSER_COBBLE_STONE.getDefaultStack());
 
+        RecipeBuilder.Shaped(CORE_NAMESPACE)
+            .setShape(
+                "#S#",
+                "#N#",
+                "#R#")
+            .addInput('#', Blocks.COBBLE_NETHERRACK)
+            .addInput('S', Blocks.SOULSAND)
+            .addInput('N', Items.NETHERCOAL)
+            .addInput('R', Items.DUST_REDSTONE)
+            .create("activator", Blocks.ACTIVATOR_COBBLE_NETHERRACK.getDefaultStack());
+
         RecipeBuilder.Shaped(CORE_NAMESPACE)
             .setShape(
                 "###",
diff --git a/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java b/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
index c05fb0ac7..4e6f1520d 100644
--- a/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
+++ b/src/main/java/net/minecraft/server/entity/player/ServerPlayer.java
@@ -185,7 +185,7 @@ public class ServerPlayer extends Player implements ContainerListener {
     @Override
 	public float getHeadHeight()
     {
-        return 1.62F;
+        return getHeightOffset(); // since server player heights and y values aren't synced, this is correct for server but not the client
     }
 
     @Override
@@ -490,13 +490,13 @@ public class ServerPlayer extends Player implements ContainerListener {
     }
 
     @Override
-	protected void checkFallDamage(double d, boolean flag)
+	protected void checkFallDamage(double yd, boolean onGround)
     {
     }
 
-    public void handleFalling(double d, boolean flag)
+    public void handleFalling(double dy, boolean onGround)
     {
-        super.checkFallDamage(d, flag);
+        super.checkFallDamage(dy, onGround);
     }
 
     private void getNextWindowId()
@@ -508,7 +508,7 @@ public class ServerPlayer extends Player implements ContainerListener {
 	public void displayWorkbenchScreen(int x, int y, int z)
     {
         getNextWindowId();
-        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 1, "Crafting", 9));
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, ContainerOpenPacket.TYPE_CRAFTING, "Crafting", 9));
         craftingInventory = new CraftingMenu(inventory, world, x, y, z);
         craftingInventory.containerId = currentWindowId;
         craftingInventory.addSlotListener(this);
@@ -517,15 +517,15 @@ public class ServerPlayer extends Player implements ContainerListener {
     @Override
     public void displayPaintingPickerScreen()
     {
-        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 7, "Painting", 0));
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, ContainerOpenPacket.TYPE_PAINTING, "Painting", 0));
     }
 
     @Override
 	public void displayContainerScreen(Container container)
     {
         getNextWindowId();
-        ServerPacketHandler.LOGGER.info((new StringBuilder()).append(username).append(" interacted with chest at (").append(x).append(", ").append(y).append(", ").append(z).append(")").toString());
-        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 0, container.getName(), container.getContainerSize()));
+        ServerPacketHandler.LOGGER.info("{} interacted with chest at ({}, {}, {})", username, x, y, z);
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, ContainerOpenPacket.TYPE_GENERIC_CONTAINER, container.getName(), container.getContainerSize()));
         craftingInventory = new ContainerMenu(inventory, container);
         craftingInventory.containerId = currentWindowId;
         craftingInventory.addSlotListener(this);
@@ -537,11 +537,11 @@ public class ServerPlayer extends Player implements ContainerListener {
         getNextWindowId();
         if (blockEntity instanceof BlastFurnaceBlockEntity)
         {
-            playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 4, blockEntity.getName(), blockEntity.getContainerSize()));
+            playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, ContainerOpenPacket.TYPE_BLAST_FURNACE, blockEntity.getName(), blockEntity.getContainerSize()));
         }
         else
         {
-            playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 2, blockEntity.getName(), blockEntity.getContainerSize()));
+            playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, ContainerOpenPacket.TYPE_FURNACE, blockEntity.getName(), blockEntity.getContainerSize()));
         }
 
         craftingInventory = new FurnaceMenu(inventory, blockEntity);
@@ -553,17 +553,28 @@ public class ServerPlayer extends Player implements ContainerListener {
 	public void displayDispenserScreen(DispenserBlockEntity blockEntity)
     {
         getNextWindowId();
-        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 3, blockEntity.getName(), blockEntity.getContainerSize()));
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, ContainerOpenPacket.TYPE_DISPENSER, blockEntity.getName(), blockEntity.getContainerSize()));
         craftingInventory = new TrapMenu(inventory, blockEntity);
         craftingInventory.containerId = currentWindowId;
         craftingInventory.addSlotListener(this);
     }
 
+    @Override
+    public void displayActivatorScreen(ActivatorBlockEntity blockEntity)
+    {
+        getNextWindowId();
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, ContainerOpenPacket.TYPE_ACTIVATOR, blockEntity.getName(), blockEntity.getContainerSize()));
+        craftingInventory = new ActivatorMenu(inventory, blockEntity);
+        craftingInventory.containerId = currentWindowId;
+        craftingInventory.addSlotListener(this);
+    }
+
+
     @Override
 	public void displayTrommelScreen(TrommelBlockEntity blockEntity)
     {
         getNextWindowId();
-        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, 5, blockEntity.getName(), blockEntity.getContainerSize()));
+        playerNetServerHandler.sendPacket(new ContainerOpenPacket(currentWindowId, ContainerOpenPacket.TYPE_TROMMEL, blockEntity.getName(), blockEntity.getContainerSize()));
         craftingInventory = new TrommelMenu(inventory, blockEntity);
         craftingInventory.containerId = currentWindowId;
         craftingInventory.addSlotListener(this);
diff --git a/src/main/java/net/minecraft/server/net/command/ServerCommandSource.java b/src/main/java/net/minecraft/server/net/command/ServerCommandSource.java
index ec5e577ff..ba637d1ba 100644
--- a/src/main/java/net/minecraft/server/net/command/ServerCommandSource.java
+++ b/src/main/java/net/minecraft/server/net/command/ServerCommandSource.java
@@ -55,7 +55,7 @@ public class ServerCommandSource implements CommandSource, IServerCommandSource
 
     @Override
     public @NotNull Vec3 getCoordinates(boolean offsetHeight) {
-        Vec3 position = this.getSender().getPosition(1.0f);
+        Vec3 position = this.getSender().getPosition(1.0f, false);
         if (offsetHeight) return position.add(0.0f, -this.getSender().heightOffset, 0.0f);
         return position;
     }
diff --git a/src/main/java/net/minecraft/server/net/handler/ServerPacketHandler.java b/src/main/java/net/minecraft/server/net/handler/ServerPacketHandler.java
index 35e1c234a..458320918 100644
--- a/src/main/java/net/minecraft/server/net/handler/ServerPacketHandler.java
+++ b/src/main/java/net/minecraft/server/net/handler/ServerPacketHandler.java
@@ -169,7 +169,7 @@ public class ServerPacketHandler extends PacketHandler
                 worldserver.updateEntity(playerEntity);
                 return;
             }
-            double d1 = playerEntity.y;
+            double oldY = playerEntity.y;
             lastPosX = playerEntity.x;
             lastPosY = playerEntity.y;
             lastPosZ = playerEntity.z;
@@ -275,7 +275,7 @@ public class ServerPacketHandler extends PacketHandler
             }
             playerEntity.onGround = packet.onGround;
             mcServer.playerList.func_613_b(playerEntity);
-            playerEntity.handleFalling(playerEntity.y - d1, packet.onGround);
+            playerEntity.handleFalling(playerEntity.y - oldY, packet.onGround);
 
         }
     }
@@ -330,14 +330,13 @@ public class ServerPacketHandler extends PacketHandler
         }
 
         // Check spawn protection
-        boolean ignoreSpawnProtection = world.field_819_z = mcServer.spawnProtectionRange <= 0 || world.dimension.id != 0 || mcServer.playerList.isOp(playerEntity.uuid);
+        boolean ignoreSpawnProtection = mcServer.spawnProtectionRange <= 0 || world.dimension.id != 0 || mcServer.playerList.isOp(playerEntity.uuid);
         ChunkCoordinates spawnPos = world.getSpawnPoint();
         int spawnDistX = (int) MathHelper.abs(x - spawnPos.x);
         int spawnDistZ = (int) MathHelper.abs(z - spawnPos.z);
         int distanceFromSpawn = Math.max(spawnDistX, spawnDistZ);
         if(distanceFromSpawn <= mcServer.spawnProtectionRange && !ignoreSpawnProtection) {
             playerEntity.playerNetServerHandler.sendPacket(new BlockUpdatePacket(x, y, z, world));
-            world.field_819_z = false;
             return;
         }
 
@@ -354,7 +353,6 @@ public class ServerPacketHandler extends PacketHandler
                 playerEntity.playerNetServerHandler.sendPacket(new BlockUpdatePacket(x, y, z, world));
             }
         }
-        world.field_819_z = false;
     }
 
     public void handleSendInitialPlayerList()
@@ -371,7 +369,7 @@ public class ServerPacketHandler extends PacketHandler
         if (!playerEntity.getGamemode().canInteract() || !playerEntity.isAlive()) return;
         WorldServer worldserver = mcServer.getDimensionWorld(playerEntity.dimension);
         ItemStack itemstack = playerEntity.inventory.getCurrentItem();
-        boolean flag = worldserver.field_819_z = worldserver.dimension.id != 0 || mcServer.playerList.isOp(playerEntity.uuid);
+        boolean ignoreSpawnProtection = mcServer.spawnProtectionRange <= 0 || worldserver.dimension.id != 0 || mcServer.playerList.isOp(playerEntity.uuid);
         if (packet.direction == Direction.NONE)
         {
             if (itemstack == null)
@@ -395,7 +393,7 @@ public class ServerPacketHandler extends PacketHandler
             {
                 j1 = i1;
             }
-            if (hasMoved && playerEntity.distanceToSqr((double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D) < 64D && (j1 > mcServer.spawnProtectionRange || flag))
+            if (hasMoved && playerEntity.distanceToSqr((double) x + 0.5D, (double) y + 0.5D, (double) z + 0.5D) < 64D && (j1 > mcServer.spawnProtectionRange || ignoreSpawnProtection))
             {
                 playerEntity.playerController.activateBlockOrUseItem(playerEntity, worldserver, itemstack, x, y, z, direction.getSide(), xPlaced, yPlaced);
             }
@@ -415,11 +413,14 @@ public class ServerPacketHandler extends PacketHandler
         Slot slot = playerEntity.craftingInventory.getSlotFor(playerEntity.inventory, playerEntity.inventory.getCurrentItemIndex());
         playerEntity.craftingInventory.broadcastChanges();
         playerEntity.isChangingQuantityOnly = false;
+        if (slot == null) {
+            LOGGER.warn("Couldn't find slot for index '{}' in {}'s inventory while they were in the {} container!", playerEntity.inventory.getCurrentItemIndex(), playerEntity.username, playerEntity.craftingInventory.getClass().getSimpleName());
+            return;
+        }
         if (!ItemStack.areItemStacksEqual(playerEntity.inventory.getCurrentItem(), packet.itemStack))
         {
             sendPacket(new ContainerSetSlotPacket(playerEntity.craftingInventory.containerId, slot.index, playerEntity.inventory.getCurrentItem()));
         }
-        worldserver.field_819_z = false;
     }
 
     @Override
diff --git a/src/main/java/net/minecraft/server/world/ServerPlayerController.java b/src/main/java/net/minecraft/server/world/ServerPlayerController.java
index b94708763..9a92019e7 100644
--- a/src/main/java/net/minecraft/server/world/ServerPlayerController.java
+++ b/src/main/java/net/minecraft/server/world/ServerPlayerController.java
@@ -121,7 +121,7 @@ public class ServerPlayerController
     	}
         Block block = Block.getBlock(id);
         BlockEntity blockEntity = thisWorld.getBlockEntity(x, y, z);
-        thisWorld.playSoundEffect(player, 2001, x, y, z, id);
+        thisWorld.playBlockEvent(player, 2001, x, y, z, id);
         boolean flag = removeBlock(x, y, z);
         if(flag) {
         	if(block != null) {
diff --git a/src/main/java/net/minecraft/server/world/WorldServer.java b/src/main/java/net/minecraft/server/world/WorldServer.java
index bfdbf2b9b..05158ca3d 100644
--- a/src/main/java/net/minecraft/server/world/WorldServer.java
+++ b/src/main/java/net/minecraft/server/world/WorldServer.java
@@ -33,7 +33,6 @@ public class WorldServer extends World
     public WorldServer(MinecraftServer minecraftserver, LevelStorage isavehandler, String name, int dimensionId, WorldType worldType, long seed, SpawnerMobs.SpawnerConfig spawnerConfig)
     {
         super(isavehandler, name, seed, Dimension.getDimensionList().get(dimensionId), worldType, spawnerConfig);
-        field_819_z = false;
         entityIntHashMap = new IntHashMap<>();
         mcServer = minecraftserver;
     }
@@ -262,7 +261,6 @@ public class WorldServer extends World
         super.addRainbow(rainbowTicks);
     }
     public ChunkProviderServer chunkProviderServer;
-    public boolean field_819_z;
     public boolean dontSave;
     public MinecraftServer mcServer;
     private final IntHashMap<Entity> entityIntHashMap;
diff --git a/src/main/resources/assets/minecraft/textures/block/activator_front.png b/src/main/resources/assets/minecraft/textures/block/activator_front.png
new file mode 100644
index 000000000..e4f3fc79a
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/activator_front.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/activator_front_active.png b/src/main/resources/assets/minecraft/textures/block/activator_front_active.png
new file mode 100644
index 000000000..82783c98e
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/activator_front_active.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/activator_front_active_overlay.png b/src/main/resources/assets/minecraft/textures/block/activator_front_active_overlay.png
new file mode 100644
index 000000000..afcac194b
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/activator_front_active_overlay.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/activator_side.png b/src/main/resources/assets/minecraft/textures/block/activator_side.png
new file mode 100644
index 000000000..60bbf3a47
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/activator_side.png differ
diff --git a/src/main/resources/assets/minecraft/textures/block/activator_top.png b/src/main/resources/assets/minecraft/textures/block/activator_top.png
new file mode 100644
index 000000000..db9c8abd5
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/block/activator_top.png differ
diff --git a/src/main/resources/assets/minecraft/textures/gui/container/activator.png b/src/main/resources/assets/minecraft/textures/gui/container/activator.png
new file mode 100644
index 000000000..8db6f8acf
Binary files /dev/null and b/src/main/resources/assets/minecraft/textures/gui/container/activator.png differ
