From 270c9402c20923df43086f2fb05f6d5f528e6bfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Balogh?= Date: Thu, 16 Feb 2017 14:58:31 +0100 Subject: [PATCH 01/12] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0eab3678..199407c3 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,4 @@ CodeMetropolis See your software as never before. Official community page: https://plus.google.com/communities/110235162339639686953 +BlockModifier-API aviable at: https://github.com/blip24/BlockModifier-API From 0432da3a86db7dd7209b080e10e92ce38160a6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20Balogh?= Date: Thu, 16 Feb 2017 14:58:41 +0100 Subject: [PATCH 02/12] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 199407c3..7bdbb380 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,5 @@ CodeMetropolis See your software as never before. Official community page: https://plus.google.com/communities/110235162339639686953 + BlockModifier-API aviable at: https://github.com/blip24/BlockModifier-API From 1573d341369085d00eb96893cc4dc81ce95473fb Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 22 Apr 2017 22:47:55 +0200 Subject: [PATCH 03/12] Full palette added in basic form Character is no longer an enum --- .gitignore | 1 + .project | 17 + .../toolchain/rendering/model/BasicBlock.java | 5 +- .../rendering/model/building/Floor.java | 18 +- .../toolchain/rendering/util/Character.java | 79 +--- .../src/main/resources/blocks.csv | 342 +++++++++--------- 6 files changed, 220 insertions(+), 242 deletions(-) create mode 100644 .project diff --git a/.gitignore b/.gitignore index 72cfcd2b..0d9d16b7 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ *.bak *.swp *~.nib +/bin/ diff --git a/.project b/.project new file mode 100644 index 00000000..88b57729 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + CodeMetropolis + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java index dc71b59d..415f8fee 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.Map; +import codemetropolis.toolchain.rendering.util.Character; import codemetropolis.toolchain.rendering.RenderingExecutor; public class BasicBlock { @@ -32,10 +33,12 @@ public class BasicBlock { idToName.put(Short.parseShort(blockInfo[0]), blockInfo[1]); idToHumanReadableName.put(Short.parseShort(blockInfo[0]), blockInfo[2]); nameToId.put(blockInfo[1], Short.parseShort(blockInfo[0])); + humanReadableNameToId.put(blockInfo[2].toLowerCase(), Short.parseShort(blockInfo[0])); } + Character.init(humanReadableNameToId); } catch (IOException e) { e.printStackTrace(); - } + } } private short id; diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java index ced4a538..dfec74dd 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java @@ -188,22 +188,22 @@ protected void prepareWalls() { BasicBlock _sideBlock; BasicBlock _strcBlock; - if(innerBuildable.hasAttribute( "character" )) + if(innerBuildable.hasAttribute( "character" ) && BasicBlock.humanReadableNameToId.containsKey(innerBuildable.getAttributeValue("character").toLowerCase())) { - Character character = Character.parse(innerBuildable.getAttributeValue("character")); - _sideBlock = character.getBlock(); - _topFill = new RepeationPattern( new BasicBlock[][][] { { { character.getTopBlock() } } } ); + String str = innerBuildable.getAttributeValue("character").toLowerCase(); + _sideBlock = Character.getBlock(str); + _topFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getTopBlock(str) } } } ); } else { _sideBlock = new BasicBlock( "minecraft:wool", 2 ); _topFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", 2 ) } } } ); } - if(innerBuildable.hasAttribute( "external_character" )) + if(innerBuildable.hasAttribute( "external_character" ) && BasicBlock.humanReadableNameToId.containsKey(innerBuildable.getAttributeValue("external_character").toLowerCase())) { - Character externalCharacter = Character.parse(innerBuildable.getAttributeValue("external_character")); - _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { externalCharacter.getBlock() } } } ); - _strcBlock = externalCharacter.getBlock(); - _stroke = new RepeationPattern( new BasicBlock[][][] { { { externalCharacter.getBlock() } } } ); + String str = innerBuildable.getAttributeValue("external_character").toLowerCase(); + _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); + _strcBlock = Character.getBlock(str); + _stroke = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); } else { _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", 2 ) } } } ); _strcBlock = new BasicBlock( "minecraft:wool", 10 ); diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java index 6dab99fd..9cd1d70a 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java @@ -1,74 +1,31 @@ package codemetropolis.toolchain.rendering.util; import codemetropolis.toolchain.rendering.model.BasicBlock; +import java.util.Map; -public enum Character { +public abstract class Character { - STONE, - COBBLESTONE, - MOSSY_STONE, - SANDSTONE, - OBSIDIAN, - WOOD, - DARK_WOOD, - BIRCH_WOOD, - PLANKS, - DARK_PLANKS, - METAL, - DIRT, - SAND, - RED_SAND, - BRICK, - STONE_BRICK, - DARK_BRICK, - GLASS, - GOLD, - DIAMOND, - UNDEFINED; + protected static Map ids; - public static Character parse(String str) { - for(Character c : Character.values()) { - if(c.toString().equalsIgnoreCase(str)) return c; - } - return Character.UNDEFINED; + public static void init(Map ids){ + Character.ids = ids; } - public BasicBlock getBlock() { - switch(this) { - case STONE: return new BasicBlock( "minecraft:stone" ); - case COBBLESTONE: return new BasicBlock( "minecraft:cobblestone" ); - case MOSSY_STONE: return new BasicBlock( "minecraft:mossy_cobblestone" ); - case SANDSTONE: return new BasicBlock( "minecraft:sandstone" ); - case OBSIDIAN: return new BasicBlock( "minecraft:obsidian" ); - case WOOD: return new BasicBlock( "minecraft:log" ); - case DARK_WOOD: return new BasicBlock( "minecraft:log", 1 ); - case BIRCH_WOOD: return new BasicBlock( "minecraft:log", 2 ); - case PLANKS: return new BasicBlock( "minecraft:planks" ); - case DARK_PLANKS: return new BasicBlock( "minecraft:planks", 5 ); - case METAL: return new BasicBlock( "minecraft:iron_block" ); - case DIRT: return new BasicBlock( "minecraft:dirt" ); - case SAND: return new BasicBlock( "minecraft:sandstone" , 2 ); - case RED_SAND: return new BasicBlock( "minecraft:sand" ); - case BRICK: return new BasicBlock( "minecraft:double_stone_slab", 4 ); - case STONE_BRICK: return new BasicBlock( "minecraft:double_stone_slab", 5 ); - case DARK_BRICK: return new BasicBlock( "minecraft:double_stone_slab", 6 ); - case GLASS: return new BasicBlock( "minecraft:glass" ); - case GOLD: return new BasicBlock( "minecraft:gold_block" ); - case DIAMOND: return new BasicBlock( "minecraft:diamond_block" ); - case UNDEFINED: return new BasicBlock( "minecraft:wool", 2 ); - default: return null; - } + public static BasicBlock getBlock(String str){ + if (ids.containsKey(str)) + return new BasicBlock(ids.get(str)); + else + return new BasicBlock("minecraft:wool", 2); } - public BasicBlock getTopBlock() { - switch(this) { - case WOOD: - case DARK_WOOD: - case BIRCH_WOOD: - case PLANKS: - case DARK_PLANKS: - return new BasicBlock( "minecraft:fence" ); - default: return getBlock(); + public static BasicBlock getTopBlock(String str) { + if (ids.containsKey(str)){ + switch (ids.get(str)){ + case 5: + case 17: + return new BasicBlock((short)85); + } } + return getBlock(str); } } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv index b8379969..cc08a5dd 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv +++ b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv @@ -1,171 +1,171 @@ -0,minecraft:air,Air -1,minecraft:stone,Stone -2,minecraft:grass,Grass Block -3,minecraft:dirt,Dirt D B -4,minecraft:cobblestone,Cobblestone -5,minecraft:planks,Wood Planks D B -6,minecraft:sapling,Saplings D B -7,minecraft:bedrock,Bedrock -8,minecraft:flowing_water,Water D -9,minecraft:water,Stationary water D -10,minecraft:flowing_lava,Lava D -11,minecraft:lava,Stationary lava D -12,minecraft:sand,Sand D B -13,minecraft:gravel,Gravel -14,minecraft:gold_ore,Gold Ore -15,minecraft:iron_ore,Iron Ore -16,minecraft:coal_ore,Coal Ore -17,minecraft:log,Wood D B -18,minecraft:leaves,Leaves D B -19,minecraft:sponge,Sponge -20,minecraft:glass,Glass -21,minecraft:lapis_ore,Lapis Lazuli Ore -22,minecraft:lapis_block,Lapis Lazuli Block -23,minecraft:dispenser,Dispenser D T -24,minecraft:sandstone,Sandstone D B -25,minecraft:noteblock,Note Block T -26,minecraft:bed,Bed D I -27,minecraft:golden_rail,Powered Rail D -28,minecraft:detector_rail,Detector Rail D -29,minecraft:sticky_piston,Sticky Piston D -30,minecraft:web,Cobweb -31,minecraft:tallgrass,Grass D B -32,minecraft:deadbush,Dead Bush -33,minecraft:piston,Piston D -34,minecraft:piston_head,Piston Extension D -35,minecraft:wool,Wool D B -36,minecraft:piston_extension,Block moved by Piston T -37,minecraft:yellow_flower,Dandelion -38,minecraft:red_flower,Poppy D B -39,minecraft:brown_mushroom,Brown Mushroom -40,minecraft:red_mushroom,Red Mushroom -41,minecraft:gold_block,Block of Gold -42,minecraft:iron_block,Block of Iron -43,minecraft:double_stone_slab,Double Stone Slab D B -44,minecraft:stone_slab,Stone Slab D B -45,minecraft:brick_block,Bricks -46,minecraft:tnt,TNT -47,minecraft:bookshelf,Bookshelf -48,minecraft:mossy_cobblestone,Moss Stone -49,minecraft:obsidian,Obsidian -50,minecraft:torch,Torch D -51,minecraft:fire,Fire D -52,minecraft:mob_spawner,Monster Spawner T -53,minecraft:oak_stairs,Oak Wood Stairs D -54,minecraft:chest,Chest D T -55,minecraft:redstone_wire,Redstone Wire D I -56,minecraft:diamond_ore,Diamond Ore -57,minecraft:diamond_block,Block of Diamond -58,minecraft:crafting_table,Crafting Table -59,minecraft:wheat,Wheat D -60,minecraft:farmland,Farmland D -61,minecraft:furnace,Furnace D T -62,minecraft:lit_furnace,Burning Furnace D T -63,minecraft:standing_sign,Sign Post D I T -64,minecraft:wooden_door,Wooden Door D I -65,minecraft:ladder,Ladders D -66,minecraft:rail,Rail D -67,minecraft:stone_stairs,Cobblestone Stairs D -68,minecraft:wall_sign,Wall Sign D T -69,minecraft:lever,Lever D -70,minecraft:stone_pressure_plate,Stone Pressure Plate D -71,minecraft:iron_door,Iron Door D I -72,minecraft:wooden_pressure_plate,Wooden Pressure Plate D -73,minecraft:redstone_ore,Redstone Ore -74,minecraft:lit_redstone_ore,Glowing Redstone Ore -75,minecraft:unlit_redstone_torch,Redstone Torch (inactive) D -76,minecraft:redstone_torch,Redstone Torch (active) D -77,minecraft:stone_button,Stone Button D -78,minecraft:snow_layer,Snow D -79,minecraft:ice,Ice -80,minecraft:snow,Snow -81,minecraft:cactus,Cactus D -82,minecraft:clay,Clay -83,minecraft:reeds,Sugar Cane D I -84,minecraft:jukebox,Jukebox D T -85,minecraft:fence,Fence -86,minecraft:pumpkin,Pumpkin D -87,minecraft:netherrack,Netherrack -88,minecraft:soul_sand,Soul Sand -89,minecraft:glowstone,Glowstone -90,minecraft:portal,Nether Portal -91,minecraft:lit_pumpkin,Jack 'o' Lantern D -92,minecraft:cake,Cake Block D I -93,minecraft:unpowered_repeater,Redstone Repeater (inactive) D I -94,minecraft:powered_repeater,Redstone Repeater (active) D I -95,minecraft:stained_glass,Stained Glass -96,minecraft:trapdoor,Trapdoor D -97,minecraft:monster_egg,Monster Egg D B -98,minecraft:stonebrick,Stone Bricks D B -99,minecraft:brown_mushroom_block,Huge Brown Mushroom D -100,minecraft:red_mushroom_block,Huge Red Mushroom D -101,minecraft:iron_bars,Iron Bars -102,minecraft:glass_pane,Glass Pane -103,minecraft:melon_block,Melon -104,minecraft:pumpkin_stem,Pumpkin Stem D -105,minecraft:melon_stem,Melon Stem D -106,minecraft:vine,Vines D -107,minecraft:fence_gate,Fence Gate D -108,minecraft:brick_stairs,Brick Stairs D -109,minecraft:stone_brick_stairs,Stone Brick Stairs D -110,minecraft:mycelium,Mycelium -111,minecraft:waterlily,Lily Pad -112,minecraft:nether_brick,Nether Brick -113,minecraft:nether_brick_fence,Nether Brick Fence -114,minecraft:nether_brick_stairs,Nether Brick Stairs D -115,minecraft:nether_wart,Nether Wart D I -116,minecraft:enchanting_table,Enchantment Table T -117,minecraft:brewing_stand,Brewing Stand D T I -118,minecraft:cauldron,Cauldron D I -119,minecraft:end_portal,End Portal T -120,minecraft:end_portal_frame,End Portal Block D -121,minecraft:end_stone,End Stone -122,minecraft:dragon_egg,Dragon Egg -123,minecraft:redstone_lamp,Redstone Lamp (inactive) -124,minecraft:lit_redstone_lamp,Redstone Lamp (active) -125,minecraft:double_wooden_slab,Wooden Double Slab D B -126,minecraft:wooden_slab,Wooden Slab D B -127,minecraft:cocoa,Cocoa D I -128,minecraft:sandstone_stairs,Sandstone Stairs D -129,minecraft:emerald_ore,Emerald Ore -130,minecraft:ender_chest,Ender Chest D T -131,minecraft:tripwire_hook,Tripwire Hook D -132,minecraft:tripwire,Tripwire D I -133,minecraft:emerald_block,Block of Emerald -134,minecraft:spruce_stairs,Spruce Wood Stairs D -135,minecraft:birch_stairs,Birch Wood Stairs D -136,minecraft:jungle_stairs,Jungle Wood Stairs D -137,minecraft:command_block,Command Block T -138,minecraft:beacon,Beacon T -139,minecraft:cobblestone_wall,Cobblestone Wall D B -140,minecraft:flower_pot,Flower Pot D I -141,minecraft:carrots,Carrots D I -142,minecraft:potatoes,Potatoes D I -143,minecraft:wooden_button,Wooden Button D -144,minecraft:skull,Mob Head D T I -145,minecraft:anvil,Anvil D B -146,minecraft:trapped_chest,Trapped Chest D T -147,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light) D -148,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy) D -149,minecraft:unpowered_comparator,Redstone Comparator (inactive & active) D I -150,,(unused) -151,minecraft:daylight_detector,Daylight Sensor T -152,minecraft:redstone_block,Block of Redstone -153,minecraft:quartz_ore,Nether Quartz Ore -154,minecraft:hopper,Hopper D T -155,minecraft:quartz_block,Block of Quartz D B -156,minecraft:quartz_stairs,Quartz Stairs D -157,minecraft:activator_rail,Activator Rail D -158,minecraft:dropper,Dropper D T -159,minecraft:stained_hardened_clay,Stained Clay D B -160,minecraft:stained_glass_pane,Stained Glass Pane D -161,minecraft:leaves2,Leaves (Acacia/Dark Oak) D B -162,minecraft:log2,Wood (Acacia/Dark Oak) D B -163,minecraft:acacia_stairs,Acacia Wood Stairs D -164,minecraft:dark_oak_stairs,Dark Oak Wood Stairs D -170,minecraft:hay_block,Hay Block D -171,minecraft:carpet,Carpet D B -172,minecraft:hardened_clay,Hardened Clay -173,minecraft:coal_block,Block of Coal -174,minecraft:packed_ice,Packed Ice -175,minecraft:double_plant,Large Flowers D B \ No newline at end of file +0,minecraft:air,Air +1,minecraft:stone,Stone +2,minecraft:grass,Grass Block +3,minecraft:dirt,Dirt +4,minecraft:cobblestone,Cobblestone +5,minecraft:planks,Wood Planks +6,minecraft:sapling,Saplings +7,minecraft:bedrock,Bedrock +8,minecraft:flowing_water,Water +9,minecraft:water,Stationary water +10,minecraft:flowing_lava,Lava +11,minecraft:lava,Stationary lava +12,minecraft:sand,Sand +13,minecraft:gravel,Gravel +14,minecraft:gold_ore,Gold Ore +15,minecraft:iron_ore,Iron Ore +16,minecraft:coal_ore,Coal Ore +17,minecraft:log,Wood +18,minecraft:leaves,Leaves +19,minecraft:sponge,Sponge +20,minecraft:glass,Glass +21,minecraft:lapis_ore,Lapis Lazuli Ore +22,minecraft:lapis_block,Lapis Lazuli Block +23,minecraft:dispenser,Dispenser +24,minecraft:sandstone,Sandstone +25,minecraft:noteblock,Note Block +26,minecraft:bed,Bed +27,minecraft:golden_rail,Powered Rail +28,minecraft:detector_rail,Detector Rail +29,minecraft:sticky_piston,Sticky Piston +30,minecraft:web,Cobweb +31,minecraft:tallgrass,Grass +32,minecraft:deadbush,Dead Bush +33,minecraft:piston,Piston +34,minecraft:piston_head,Piston Extension +35,minecraft:wool,Wool +36,minecraft:piston_extension,Block moved by Piston +37,minecraft:yellow_flower,Dandelion +38,minecraft:red_flower,Poppy +39,minecraft:brown_mushroom,Brown Mushroom +40,minecraft:red_mushroom,Red Mushroom +41,minecraft:gold_block,Block of Gold +42,minecraft:iron_block,Block of Iron +43,minecraft:double_stone_slab,Double Stone Slab +44,minecraft:stone_slab,Stone Slab +45,minecraft:brick_block,Bricks +46,minecraft:tnt,TNT +47,minecraft:bookshelf,Bookshelf +48,minecraft:mossy_cobblestone,Moss Stone +49,minecraft:obsidian,Obsidian +50,minecraft:torch,Torch +51,minecraft:fire,Fire +52,minecraft:mob_spawner,Monster Spawner +53,minecraft:oak_stairs,Oak Wood Stairs +54,minecraft:chest,Chest +55,minecraft:redstone_wire,Redstone Wire +56,minecraft:diamond_ore,Diamond Ore +57,minecraft:diamond_block,Block of Diamond +58,minecraft:crafting_table,Crafting Table +59,minecraft:wheat,Wheat +60,minecraft:farmland,Farmland +61,minecraft:furnace,Furnace +62,minecraft:lit_furnace,Burning Furnace +63,minecraft:standing_sign,Sign Post +64,minecraft:wooden_door,Wooden Door +65,minecraft:ladder,Ladders +66,minecraft:rail,Rail +67,minecraft:stone_stairs,Cobblestone Stairs +68,minecraft:wall_sign,Wall Sign +69,minecraft:lever,Lever +70,minecraft:stone_pressure_plate,Stone Pressure Plate +71,minecraft:iron_door,Iron Door +72,minecraft:wooden_pressure_plate,Wooden Pressure Plate +73,minecraft:redstone_ore,Redstone Ore +74,minecraft:lit_redstone_ore,Glowing Redstone Ore +75,minecraft:unlit_redstone_torch,Redstone Torch (inactive) +76,minecraft:redstone_torch,Redstone Torch (active) +77,minecraft:stone_button,Stone Button +78,minecraft:snow_layer,Snow +79,minecraft:ice,Ice +80,minecraft:snow,Snow +81,minecraft:cactus,Cactus +82,minecraft:clay,Clay +83,minecraft:reeds,Sugar Cane +84,minecraft:jukebox,Jukebox +85,minecraft:fence,Fence +86,minecraft:pumpkin,Pumpkin +87,minecraft:netherrack,Netherrack +88,minecraft:soul_sand,Soul Sand +89,minecraft:glowstone,Glowstone +90,minecraft:portal,Nether Portal +91,minecraft:lit_pumpkin,Jack 'o' Lantern +92,minecraft:cake,Cake Block +93,minecraft:unpowered_repeater,Redstone Repeater (inactive) +94,minecraft:powered_repeater,Redstone Repeater (active) +95,minecraft:stained_glass,Stained Glass +96,minecraft:trapdoor,Trapdoor +97,minecraft:monster_egg,Monster Egg +98,minecraft:stonebrick,Stone Bricks +99,minecraft:brown_mushroom_block,Huge Brown Mushroom +100,minecraft:red_mushroom_block,Huge Red Mushroom +101,minecraft:iron_bars,Iron Bars +102,minecraft:glass_pane,Glass Pane +103,minecraft:melon_block,Melon +104,minecraft:pumpkin_stem,Pumpkin Stem +105,minecraft:melon_stem,Melon Stem +106,minecraft:vine,Vines +107,minecraft:fence_gate,Fence Gate +108,minecraft:brick_stairs,Brick Stairs +109,minecraft:stone_brick_stairs,Stone Brick Stairs +110,minecraft:mycelium,Mycelium +111,minecraft:waterlily,Lily Pad +112,minecraft:nether_brick,Nether Brick +113,minecraft:nether_brick_fence,Nether Brick Fence +114,minecraft:nether_brick_stairs,Nether Brick Stairs +115,minecraft:nether_wart,Nether Wart +116,minecraft:enchanting_table,Enchantment Table +117,minecraft:brewing_stand,Brewing Stand +118,minecraft:cauldron,Cauldron +119,minecraft:end_portal,End Portal +120,minecraft:end_portal_frame,End Portal Block +121,minecraft:end_stone,End Stone +122,minecraft:dragon_egg,Dragon Egg +123,minecraft:redstone_lamp,Redstone Lamp (inactive) +124,minecraft:lit_redstone_lamp,Redstone Lamp (active) +125,minecraft:double_wooden_slab,Wooden Double Slab +126,minecraft:wooden_slab,Wooden Slab +127,minecraft:cocoa,Cocoa +128,minecraft:sandstone_stairs,Sandstone Stairs +129,minecraft:emerald_ore,Emerald Ore +130,minecraft:ender_chest,Ender Chest +131,minecraft:tripwire_hook,Tripwire Hook +132,minecraft:tripwire,Tripwire +133,minecraft:emerald_block,Block of Emerald +134,minecraft:spruce_stairs,Spruce Wood Stairs +135,minecraft:birch_stairs,Birch Wood Stairs +136,minecraft:jungle_stairs,Jungle Wood Stairs +137,minecraft:command_block,Command Block +138,minecraft:beacon,Beacon +139,minecraft:cobblestone_wall,Cobblestone Wall +140,minecraft:flower_pot,Flower Pot +141,minecraft:carrots,Carrots +142,minecraft:potatoes,Potatoes +143,minecraft:wooden_button,Wooden Button +144,minecraft:skull,Mob Head +145,minecraft:anvil,Anvil +146,minecraft:trapped_chest,Trapped Chest +147,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light) +148,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy) +149,minecraft:unpowered_comparator,Redstone Comparator (inactive & active) +150,,(unused) +151,minecraft:daylight_detector,Daylight Sensor +152,minecraft:redstone_block,Block of Redstone +153,minecraft:quartz_ore,Nether Quartz Ore +154,minecraft:hopper,Hopper +155,minecraft:quartz_block,Block of Quartz +156,minecraft:quartz_stairs,Quartz Stairs +157,minecraft:activator_rail,Activator Rail +158,minecraft:dropper,Dropper +159,minecraft:stained_hardened_clay,Stained Clay +160,minecraft:stained_glass_pane,Stained Glass Pane +161,minecraft:leaves2,Leaves (Acacia/Dark Oak) +162,minecraft:log2,Wood (Acacia/Dark Oak) +163,minecraft:acacia_stairs,Acacia Wood Stairs +164,minecraft:dark_oak_stairs,Dark Oak Wood Stairs +170,minecraft:hay_block,Hay Block +171,minecraft:carpet,Carpet +172,minecraft:hardened_clay,Hardened Clay +173,minecraft:coal_block,Block of Coal +174,minecraft:packed_ice,Packed Ice +175,minecraft:double_plant,Large Flowers From cb3bb2c5b39d4dd6100e4008754cb9e873c8023c Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 24 Apr 2017 01:32:48 +0200 Subject: [PATCH 04/12] Extended the spreadsheet DEBUG ME!!! --- .../codemetropolis-toolchain-rendering.zip | Bin 0 -> 106034 bytes .../toolchain/rendering/model/BasicBlock.java | 33 +- .../rendering/model/building/Floor.java | 21 +- .../rendering/model/building/Ground.java | 4 +- .../toolchain/rendering/util/Block.java | 33 ++ .../toolchain/rendering/util/Character.java | 37 +- .../toolchain/rendering/util/Colour.java | 24 + .../src/main/resources/blocks.csv | 544 ++++++++++++------ 8 files changed, 498 insertions(+), 198 deletions(-) create mode 100644 sources/codemetropolis-toolchain-rendering.zip create mode 100644 sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java create mode 100644 sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Colour.java diff --git a/sources/codemetropolis-toolchain-rendering.zip b/sources/codemetropolis-toolchain-rendering.zip new file mode 100644 index 0000000000000000000000000000000000000000..400f1436aad037a75b55afd6dc156bd1c9202c06 GIT binary patch literal 106034 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
vz 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%0Awc-MLwJ-DY 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 literal 0 HcmV?d00001 diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java index 415f8fee..e1c77bef 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java @@ -7,7 +7,9 @@ import java.util.HashMap; import java.util.Map; +import codemetropolis.toolchain.rendering.util.Block; import codemetropolis.toolchain.rendering.util.Character; +import codemetropolis.toolchain.rendering.util.Colour; import codemetropolis.toolchain.rendering.RenderingExecutor; public class BasicBlock { @@ -17,6 +19,7 @@ public class BasicBlock { public static final Map idToHumanReadableName; public static final Map nameToId; public static final Map humanReadableNameToId; + public static final Map humanReadableNameToBlock; static { NonBlock = new BasicBlock((short)-1 ); @@ -24,18 +27,29 @@ public class BasicBlock { idToHumanReadableName = new HashMap(); nameToId = new HashMap(); humanReadableNameToId = new HashMap(); + humanReadableNameToBlock = new HashMap(); InputStream csvStream = RenderingExecutor.class.getClassLoader().getResourceAsStream("blocks.csv"); try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(csvStream, "UTF-8"))) { String line; while ((line = bufferedReader.readLine()) != null) { String[] blockInfo = line.split(","); - idToName.put(Short.parseShort(blockInfo[0]), blockInfo[1]); - idToHumanReadableName.put(Short.parseShort(blockInfo[0]), blockInfo[2]); - nameToId.put(blockInfo[1], Short.parseShort(blockInfo[0])); - humanReadableNameToId.put(blockInfo[2].toLowerCase(), Short.parseShort(blockInfo[0])); + if (!idToName.containsKey(Short.parseShort(blockInfo[0]))){ + idToName.put(Short.parseShort(blockInfo[0]), blockInfo[2]); + idToHumanReadableName.put(Short.parseShort(blockInfo[0]), blockInfo[3]); + nameToId.put(blockInfo[2], Short.parseShort(blockInfo[0])); + } + humanReadableNameToBlock.put(blockInfo[3].toLowerCase(), + new Block( + Short.parseShort(blockInfo[0]), + Short.parseShort(blockInfo[1]), + blockInfo[2], + blockInfo[3], + Short.parseShort(blockInfo[4]) + ) + ); } - Character.init(humanReadableNameToId); + Character.init(humanReadableNameToBlock); } catch (IOException e) { e.printStackTrace(); } @@ -53,6 +67,11 @@ public BasicBlock(short id, int data) { this.data = data; } + public BasicBlock(short id, Colour clr){ + this.id = id; + this.data = clr.getValue(); + } + public BasicBlock(String name) { this(nameToId.get(name), 0); } @@ -61,6 +80,10 @@ public BasicBlock(String name, int data) { this(nameToId.get(name), data); } + public BasicBlock(String name, Colour clr){ + this(nameToId.get(name), clr.getValue()); + } + public BasicBlock(BasicBlock original) { this.id = original.id; this.data = original.data; diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java index dfec74dd..320bdd36 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java @@ -13,6 +13,7 @@ import codemetropolis.toolchain.rendering.model.primitive.SolidBox; import codemetropolis.toolchain.rendering.model.primitive.WallSign; import codemetropolis.toolchain.rendering.util.Character; +import codemetropolis.toolchain.rendering.util.Colour; import codemetropolis.toolchain.rendering.util.Orientation; public class Floor extends Building { @@ -33,10 +34,10 @@ public Floor(Buildable innerBuildable) throws BuildingTypeMismatchException { protected void prepareDoor() { BasicBlock _red = new BasicBlock( "minecraft:redstone_block" ); BasicBlock _lgt = new BasicBlock( "minecraft:lit_redstone_lamp" ); - BasicBlock _rwl = new BasicBlock( "minecraft:wool", 14 ); - BasicBlock _gwl = new BasicBlock( "minecraft:wool", 5 ); - BasicBlock _bwl = new BasicBlock( "minecraft:wool", 3 ); - BasicBlock _ywl = new BasicBlock( "minecraft:wool", 4 ); + BasicBlock _rwl = new BasicBlock( "minecraft:wool", Colour.RED); + BasicBlock _gwl = new BasicBlock( "minecraft:wool", Colour.LIME); + BasicBlock _bwl = new BasicBlock( "minecraft:wool", Colour.LIGHT_BLUE); + BasicBlock _ywl = new BasicBlock( "minecraft:wool", Colour.YELLOW); primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, 0 ) ), new Point( 3, 4, 1 ), @@ -188,26 +189,26 @@ protected void prepareWalls() { BasicBlock _sideBlock; BasicBlock _strcBlock; - if(innerBuildable.hasAttribute( "character" ) && BasicBlock.humanReadableNameToId.containsKey(innerBuildable.getAttributeValue("character").toLowerCase())) + if(innerBuildable.hasAttribute( "character" ) && BasicBlock.humanReadableNameToBlock.containsKey(innerBuildable.getAttributeValue("character").toLowerCase())) { String str = innerBuildable.getAttributeValue("character").toLowerCase(); _sideBlock = Character.getBlock(str); _topFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getTopBlock(str) } } } ); } else { - _sideBlock = new BasicBlock( "minecraft:wool", 2 ); - _topFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", 2 ) } } } ); + _sideBlock = new BasicBlock( "minecraft:wool", Colour.MAGENTA); + _topFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.MAGENTA) } } } ); } - if(innerBuildable.hasAttribute( "external_character" ) && BasicBlock.humanReadableNameToId.containsKey(innerBuildable.getAttributeValue("external_character").toLowerCase())) + if(innerBuildable.hasAttribute( "external_character" ) && BasicBlock.humanReadableNameToBlock.containsKey(innerBuildable.getAttributeValue("external_character").toLowerCase())) { String str = innerBuildable.getAttributeValue("external_character").toLowerCase(); _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); _strcBlock = Character.getBlock(str); _stroke = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); } else { - _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", 2 ) } } } ); + _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.MAGENTA ) } } } ); _strcBlock = new BasicBlock( "minecraft:wool", 10 ); - _stroke = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", 15 ) } } } ); + _stroke = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.BLACK ) } } } ); } RandomPattern _fallbackPattern = new RandomPattern( new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.NonBlock } } } ) ); diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java index b7f24d6f..8090fccc 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java @@ -27,8 +27,8 @@ private void prepareBase( ) { new SolidBox( position, new Point( size.getX(), 1, size.getZ() ), - new RepeationPattern( new BasicBlock[][][]{ { { new BasicBlock( "minecraft:stone" ) } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:stonebrick" ) } } } ), + new RepeationPattern( new BasicBlock[][][]{ { { new BasicBlock("minecraft:stone") } } } ), + new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock("minecraft:stonebrick") } } } ), Orientation.NearX ) ); } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java new file mode 100644 index 00000000..f7d63d22 --- /dev/null +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java @@ -0,0 +1,33 @@ +package codemetropolis.toolchain.rendering.util; + +public class Block { + protected short id; + protected short data; + protected String ign; + protected String humanReadableName; + protected short hazardous; + + public short getId() { + return id; + } + public short getData() { + return data; + } + public String getIgn() { + return ign; + } + public String getHumanReadableName() { + return humanReadableName; + } + public short getHazardous() { + return hazardous; + } + + public Block(short id, short data, String ign, String human, short hazard){ + this.id = id; + this.data = data; + this.ign = ign; + this.humanReadableName = human; + this.hazardous = hazard; + } +} diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java index 9cd1d70a..9df862da 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java @@ -1,29 +1,46 @@ package codemetropolis.toolchain.rendering.util; import codemetropolis.toolchain.rendering.model.BasicBlock; +import codemetropolis.toolchain.rendering.util.Colour; import java.util.Map; public abstract class Character { - protected static Map ids; + protected static Map blocks; - public static void init(Map ids){ - Character.ids = ids; + public static void init(Map blocks){ + Character.blocks = blocks; } public static BasicBlock getBlock(String str){ - if (ids.containsKey(str)) - return new BasicBlock(ids.get(str)); - else - return new BasicBlock("minecraft:wool", 2); + Block block; + if (blocks.containsKey(str) && blocks.get(str).getHazardous() != 2){ + System.out.println("Using \"" + str + "\""); + block = blocks.get(str); + } + else{ + System.out.println("Couldn't find block \"" + str + "\", using magenta wool instead."); + block = blocks.get("wool"); + } + return new BasicBlock(block.getId(), Colour.MAGENTA); } - public static BasicBlock getTopBlock(String str) { - if (ids.containsKey(str)){ - switch (ids.get(str)){ + public static BasicBlock getTopBlock(String str){ + if (blocks.containsKey(str) && blocks.get(str).getHazardous() != 2){ + Block block = blocks.get(str); + switch (block.getId()){ + // TODO Add more fences in the .csv case 5: case 17: return new BasicBlock((short)85); + case 1: + case 43: + case 44: + return new BasicBlock((short)139); + case 48: + return new BasicBlock((short)139, (short)1); + case 112: + return new BasicBlock((short)113); } } return getBlock(str); diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Colour.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Colour.java new file mode 100644 index 00000000..6c218ab6 --- /dev/null +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Colour.java @@ -0,0 +1,24 @@ +package codemetropolis.toolchain.rendering.util; + +public enum Colour { + WHITE, + ORANGE, + MAGENTA, + LIGHT_BLUE, + YELLOW, + LIME, + PINK, + GRAY, + LIGHT_GRAY, + CYAN, + PURPLE, + BLUE, + BROWN, + GREEN, + RED, + BLACK; + + public int getValue(){ + return this.ordinal(); + } +} diff --git a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv index cc08a5dd..f014795c 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv +++ b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv @@ -1,171 +1,373 @@ -0,minecraft:air,Air -1,minecraft:stone,Stone -2,minecraft:grass,Grass Block -3,minecraft:dirt,Dirt -4,minecraft:cobblestone,Cobblestone -5,minecraft:planks,Wood Planks -6,minecraft:sapling,Saplings -7,minecraft:bedrock,Bedrock -8,minecraft:flowing_water,Water -9,minecraft:water,Stationary water -10,minecraft:flowing_lava,Lava -11,minecraft:lava,Stationary lava -12,minecraft:sand,Sand -13,minecraft:gravel,Gravel -14,minecraft:gold_ore,Gold Ore -15,minecraft:iron_ore,Iron Ore -16,minecraft:coal_ore,Coal Ore -17,minecraft:log,Wood -18,minecraft:leaves,Leaves -19,minecraft:sponge,Sponge -20,minecraft:glass,Glass -21,minecraft:lapis_ore,Lapis Lazuli Ore -22,minecraft:lapis_block,Lapis Lazuli Block -23,minecraft:dispenser,Dispenser -24,minecraft:sandstone,Sandstone -25,minecraft:noteblock,Note Block -26,minecraft:bed,Bed -27,minecraft:golden_rail,Powered Rail -28,minecraft:detector_rail,Detector Rail -29,minecraft:sticky_piston,Sticky Piston -30,minecraft:web,Cobweb -31,minecraft:tallgrass,Grass -32,minecraft:deadbush,Dead Bush -33,minecraft:piston,Piston -34,minecraft:piston_head,Piston Extension -35,minecraft:wool,Wool -36,minecraft:piston_extension,Block moved by Piston -37,minecraft:yellow_flower,Dandelion -38,minecraft:red_flower,Poppy -39,minecraft:brown_mushroom,Brown Mushroom -40,minecraft:red_mushroom,Red Mushroom -41,minecraft:gold_block,Block of Gold -42,minecraft:iron_block,Block of Iron -43,minecraft:double_stone_slab,Double Stone Slab -44,minecraft:stone_slab,Stone Slab -45,minecraft:brick_block,Bricks -46,minecraft:tnt,TNT -47,minecraft:bookshelf,Bookshelf -48,minecraft:mossy_cobblestone,Moss Stone -49,minecraft:obsidian,Obsidian -50,minecraft:torch,Torch -51,minecraft:fire,Fire -52,minecraft:mob_spawner,Monster Spawner -53,minecraft:oak_stairs,Oak Wood Stairs -54,minecraft:chest,Chest -55,minecraft:redstone_wire,Redstone Wire -56,minecraft:diamond_ore,Diamond Ore -57,minecraft:diamond_block,Block of Diamond -58,minecraft:crafting_table,Crafting Table -59,minecraft:wheat,Wheat -60,minecraft:farmland,Farmland -61,minecraft:furnace,Furnace -62,minecraft:lit_furnace,Burning Furnace -63,minecraft:standing_sign,Sign Post -64,minecraft:wooden_door,Wooden Door -65,minecraft:ladder,Ladders -66,minecraft:rail,Rail -67,minecraft:stone_stairs,Cobblestone Stairs -68,minecraft:wall_sign,Wall Sign -69,minecraft:lever,Lever -70,minecraft:stone_pressure_plate,Stone Pressure Plate -71,minecraft:iron_door,Iron Door -72,minecraft:wooden_pressure_plate,Wooden Pressure Plate -73,minecraft:redstone_ore,Redstone Ore -74,minecraft:lit_redstone_ore,Glowing Redstone Ore -75,minecraft:unlit_redstone_torch,Redstone Torch (inactive) -76,minecraft:redstone_torch,Redstone Torch (active) -77,minecraft:stone_button,Stone Button -78,minecraft:snow_layer,Snow -79,minecraft:ice,Ice -80,minecraft:snow,Snow -81,minecraft:cactus,Cactus -82,minecraft:clay,Clay -83,minecraft:reeds,Sugar Cane -84,minecraft:jukebox,Jukebox -85,minecraft:fence,Fence -86,minecraft:pumpkin,Pumpkin -87,minecraft:netherrack,Netherrack -88,minecraft:soul_sand,Soul Sand -89,minecraft:glowstone,Glowstone -90,minecraft:portal,Nether Portal -91,minecraft:lit_pumpkin,Jack 'o' Lantern -92,minecraft:cake,Cake Block -93,minecraft:unpowered_repeater,Redstone Repeater (inactive) -94,minecraft:powered_repeater,Redstone Repeater (active) -95,minecraft:stained_glass,Stained Glass -96,minecraft:trapdoor,Trapdoor -97,minecraft:monster_egg,Monster Egg -98,minecraft:stonebrick,Stone Bricks -99,minecraft:brown_mushroom_block,Huge Brown Mushroom -100,minecraft:red_mushroom_block,Huge Red Mushroom -101,minecraft:iron_bars,Iron Bars -102,minecraft:glass_pane,Glass Pane -103,minecraft:melon_block,Melon -104,minecraft:pumpkin_stem,Pumpkin Stem -105,minecraft:melon_stem,Melon Stem -106,minecraft:vine,Vines -107,minecraft:fence_gate,Fence Gate -108,minecraft:brick_stairs,Brick Stairs -109,minecraft:stone_brick_stairs,Stone Brick Stairs -110,minecraft:mycelium,Mycelium -111,minecraft:waterlily,Lily Pad -112,minecraft:nether_brick,Nether Brick -113,minecraft:nether_brick_fence,Nether Brick Fence -114,minecraft:nether_brick_stairs,Nether Brick Stairs -115,minecraft:nether_wart,Nether Wart -116,minecraft:enchanting_table,Enchantment Table -117,minecraft:brewing_stand,Brewing Stand -118,minecraft:cauldron,Cauldron -119,minecraft:end_portal,End Portal -120,minecraft:end_portal_frame,End Portal Block -121,minecraft:end_stone,End Stone -122,minecraft:dragon_egg,Dragon Egg -123,minecraft:redstone_lamp,Redstone Lamp (inactive) -124,minecraft:lit_redstone_lamp,Redstone Lamp (active) -125,minecraft:double_wooden_slab,Wooden Double Slab -126,minecraft:wooden_slab,Wooden Slab -127,minecraft:cocoa,Cocoa -128,minecraft:sandstone_stairs,Sandstone Stairs -129,minecraft:emerald_ore,Emerald Ore -130,minecraft:ender_chest,Ender Chest -131,minecraft:tripwire_hook,Tripwire Hook -132,minecraft:tripwire,Tripwire -133,minecraft:emerald_block,Block of Emerald -134,minecraft:spruce_stairs,Spruce Wood Stairs -135,minecraft:birch_stairs,Birch Wood Stairs -136,minecraft:jungle_stairs,Jungle Wood Stairs -137,minecraft:command_block,Command Block -138,minecraft:beacon,Beacon -139,minecraft:cobblestone_wall,Cobblestone Wall -140,minecraft:flower_pot,Flower Pot -141,minecraft:carrots,Carrots -142,minecraft:potatoes,Potatoes -143,minecraft:wooden_button,Wooden Button -144,minecraft:skull,Mob Head -145,minecraft:anvil,Anvil -146,minecraft:trapped_chest,Trapped Chest -147,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light) -148,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy) -149,minecraft:unpowered_comparator,Redstone Comparator (inactive & active) -150,,(unused) -151,minecraft:daylight_detector,Daylight Sensor -152,minecraft:redstone_block,Block of Redstone -153,minecraft:quartz_ore,Nether Quartz Ore -154,minecraft:hopper,Hopper -155,minecraft:quartz_block,Block of Quartz -156,minecraft:quartz_stairs,Quartz Stairs -157,minecraft:activator_rail,Activator Rail -158,minecraft:dropper,Dropper -159,minecraft:stained_hardened_clay,Stained Clay -160,minecraft:stained_glass_pane,Stained Glass Pane -161,minecraft:leaves2,Leaves (Acacia/Dark Oak) -162,minecraft:log2,Wood (Acacia/Dark Oak) -163,minecraft:acacia_stairs,Acacia Wood Stairs -164,minecraft:dark_oak_stairs,Dark Oak Wood Stairs -170,minecraft:hay_block,Hay Block -171,minecraft:carpet,Carpet -172,minecraft:hardened_clay,Hardened Clay -173,minecraft:coal_block,Block of Coal -174,minecraft:packed_ice,Packed Ice -175,minecraft:double_plant,Large Flowers +0,0,minecraft:air,Air,2 +1,0,minecraft:stone,Stone,0 +1,1,minecraft:stone,Granite,0 +1,2,minecraft:stone,Polished Granite,0 +1,3,minecraft:stone,Diorite,0 +1,4,minecraft:stone,Polished Diorite,0 +1,5,minecraft:stone,Andesite,0 +1,6,minecraft:stone,Polished Andesite,0 +2,0,minecraft:grass,Grass Block,0 +3,0,minecraft:dirt,Dirt,0 +3,1,minecraft:dirt,Coarse Dirt,0 +3,2,minecraft:dirt,Podzol,0 +4,0,minecraft:cobblestone,Cobblestone,0 +5,0,minecraft:planks,Planks,0 +5,0,minecraft:planks,Oak Planks,0 +5,1,minecraft:planks,Spruce Planks,0 +5,2,minecraft:planks,Birch Planks,0 +5,3,minecraft:planks,Jungle Planks,0 +5,4,minecraft:planks,Acacia Planks,0 +5,5,minecraft:planks,Dark Oak Planks,0 +6,0,minecraft:sapling,Saplings,0 +6,0,minecraft:sapling,Oak Sapling,0 +6,1,minecraft:sapling,Spruce Sapling,0 +6,2,minecraft:sapling,Birch Sapling,0 +6,3,minecraft:sapling,Jungle Sapling,0 +6,4,minecraft:sapling,Acacia Sapling,0 +6,5,minecraft:sapling,Dark Oak Sapling,0 +7,0,minecraft:bedrock,Bedrock,1 +8,0,minecraft:flowing_water,Flowing Water,2 +9,0,minecraft:water,Water,1 +10,0,minecraft:flowing_lava,Flowing Lava,2 +11,0,minecraft:lava,Lava,1 +12,0,minecraft:sand,Sand,0 +12,1,minecraft:sand,Red Sand,0 +13,0,minecraft:gravel,Gravel,0 +14,0,minecraft:gold_ore,Gold Ore,0 +15,0,minecraft:iron_ore,Iron Ore,0 +16,0,minecraft:coal_ore,Coal Ore,0 +17,0,minecraft:log,Wood,0 +17,1,minecraft:log,Oak Wood,0 +17,2,minecraft:log,Spruce Wood,0 +17,3,minecraft:log,Birch Wood,0 +17,4,minecraft:log,Jungle Wood,0 +18,0,minecraft:leaves,Leaves,0 +18,0,minecraft:leaves,Oak Leaves,0 +18,1,minecraft:leaves,Spruce Leaves,0 +18,2,minecraft:leaves,Birch Leaves,0 +18,3,minecraft:leaves,Jungle Leaves,0 +19,0,minecraft:sponge,Sponge,0 +19,1,minecraft:sponge,We Sponge,0 +20,0,minecraft:glass,Glass,0 +21,0,minecraft:lapis_ore,Lapis Lazuli Ore,0 +22,0,minecraft:lapis_block,Lapis Lazuli Block,0 +23,0,minecraft:dispenser,Dispenser,2 +24,0,minecraft:sandstone,Sandstone,0 +24,1,minecraft:sandstone,Chiseled Sandstone,0 +24,2,minecraft:sandstone,Smooth Sandstone,0 +25,0,minecraft:noteblock,Note Block,2 +26,0,minecraft:bed,Bed,2 +27,0,minecraft:golden_rail,Powered Rail,2 +28,0,minecraft:detector_rail,Detector Rail,2 +29,0,minecraft:sticky_piston,Sticky Piston,2 +30,0,minecraft:web,Cobweb,0 +31,0,minecraft:tallgrass,Grass,0 +31,0,minecraft:tallgrass,Shrub,0 +31,1,minecraft:tallgrass,Tall Grass,0 +31,2,minecraft:tallgrass,Fern,0 +32,0,minecraft:deadbush,Dead Bush,0 +33,0,minecraft:piston,Piston,2 +34,0,minecraft:piston_head,Piston Extension,2 +35,0,minecraft:wool,Wool,0 +35,0,minecraft:wool,White Wool,0 +35,1,minecraft:wool,Orange Wool,0 +35,2,minecraft:wool,Magenta Wool,0 +35,3,minecraft:wool,Light Blue Wool,0 +35,4,minecraft:wool,Yellow Wool,0 +35,5,minecraft:wool,Lime Wool,0 +35,6,minecraft:wool,Pink Wool,0 +35,7,minecraft:wool,Gray Wool,0 +35,8,minecraft:wool,Light Gray Wool,0 +35,9,minecraft:wool,Cyan Wool,0 +35,10,minecraft:wool,Purple Wool,0 +35,11,minecraft:wool,Blue Wool,0 +35,12,minecraft:wool,Brown Wool,0 +35,13,minecraft:wool,Green Wool,0 +35,14,minecraft:wool,Red Wool,0 +35,15,minecraft:wool,Black Wool,0 +36,0,minecraft:piston_extension,Block moved by Piston,2 +37,0,minecraft:yellow_flower,Dandelion,0 +38,0,minecraft:red_flower,Poppy,2 +38,1,minecraft:red_flower,Blue Orchid,2 +38,2,minecraft:red_flower,Allium,2 +38,3,minecraft:red_flower,Azure Bluet,2 +38,4,minecraft:red_flower,Red Tulip,2 +38,5,minecraft:red_flower,Orange Tulip,2 +38,6,minecraft:red_flower,White Tulip,2 +38,7,minecraft:red_flower,Pink Tulip,2 +38,8,minecraft:red_flower,Oxeye Daisy,0 +39,0,minecraft:brown_mushroom,Brown Mushroom,0 +40,0,minecraft:red_mushroom,Red Mushroom,0 +41,0,minecraft:gold_block,Block of Gold,0 +42,0,minecraft:iron_block,Block of Iron,0 +43,0,minecraft:double_stone_slab,Double Stone Slab,0 +43,1,minecraft:double_stone_slab,Double Sandstone Slab,0 +43,2,minecraft:double_stone_slab,Double Wooden Slab,0 +43,3,minecraft:double_stone_slab,Double Cobblestone Slab,0 +43,4,minecraft:double_stone_slab,Double Bricks Slab,0 +43,5,minecraft:double_stone_slab,Double Stone Brick Slab,0 +43,6,minecraft:double_stone_slab,Double Nether Brick Slab,0 +43,7,minecraft:double_stone_slab,Double Quartz Slab,0 +43,8,minecraft:double_stone_slab,Smooth Double Stone Slab,0 +43,9,minecraft:double_stone_slab,Smooth Double Sandstone Slab,0 +43,15,minecraft:double_stone_slab,Tile Double Quartz Slab,0 +44,0,minecraft:stone_slab,Stone Slab,0 +44,1,minecraft:stone_slab,Sandstone Slab,0 +44,2,minecraft:stone_slab,Wooden Slab,0 +44,3,minecraft:stone_slab,Cobblestone Slab,0 +44,4,minecraft:stone_slab,Bricks Slab,0 +44,5,minecraft:stone_slab,Stone Brick Slab,0 +44,6,minecraft:stone_slab,Nether Brick Slab,0 +44,7,minecraft:stone_slab,Quartz Slab,0 +44,8,minecraft:stone_slab,Upper Stone Slab,0 +44,9,minecraft:stone_slab,Upper Sandstone Slab,0 +44,10,minecraft:stone_slab,Upper Wooden Slab,0 +44,11,minecraft:stone_slab,Upper Cobblestone Slab,0 +44,12,minecraft:stone_slab,Upper Bricks Slab,0 +44,13,minecraft:stone_slab,Upper Stone Brick Slab,0 +44,14,minecraft:stone_slab,Upper Nether Brick Slab,0 +44,15,minecraft:stone_slab,Upper Quartz Slab,0 +45,0,minecraft:brick_block,Bricks,0 +46,0,minecraft:tnt,TNT,1 +47,0,minecraft:bookshelf,Bookshelf,0 +48,0,minecraft:mossy_cobblestone,Moss Stone,0 +49,0,minecraft:obsidian,Obsidian,0 +50,0,minecraft:torch,Torch,2 +51,0,minecraft:fire,Fire,2 +52,0,minecraft:mob_spawner,Monster Spawner,2 +53,0,minecraft:oak_stairs,Oak Wood Stairs,2 +54,0,minecraft:chest,Chest,2 +55,0,minecraft:redstone_wire,Redstone Wire,2 +56,0,minecraft:diamond_ore,Diamond Ore,0 +57,0,minecraft:diamond_block,Block of Diamond,0 +58,0,minecraft:crafting_table,Crafting Table,0 +59,0,minecraft:wheat,Wheat,2 +60,0,minecraft:farmland,Farmland,2 +60,7,minecraft:farmland,Wet Farmland,2 +61,0,minecraft:furnace,Furnace,1 +62,0,minecraft:lit_furnace,Burning Furnace,2 +63,0,minecraft:standing_sign,Sign Post,2 +64,0,minecraft:wooden_door,Wooden Door,2 +65,0,minecraft:ladder,Ladders,2 +66,0,minecraft:rail,Rail,2 +67,0,minecraft:stone_stairs,Cobblestone Stairs,2 +68,0,minecraft:wall_sign,Wall Sign,2 +69,0,minecraft:lever,Lever,2 +70,0,minecraft:stone_pressure_plate,Stone Pressure Plate,2 +71,0,minecraft:iron_door,Iron Door,2 +72,0,minecraft:wooden_pressure_plate,Wooden Pressure Plate,2 +73,0,minecraft:redstone_ore,Redstone Ore,0 +74,0,minecraft:lit_redstone_ore,Glowing Redstone Ore,0 +75,0,minecraft:unlit_redstone_torch,Redstone Torch (inactive),2 +76,0,minecraft:redstone_torch,Redstone Torch (active),2 +77,0,minecraft:stone_button,Stone Button,2 +78,0,minecraft:snow_layer,Snow,2 +79,0,minecraft:ice,Ice,1 +80,0,minecraft:snow,Snow,0 +81,0,minecraft:cactus,Cactus,2 +82,0,minecraft:clay,Clay,0 +83,0,minecraft:reeds,Sugar Cane,1 +84,0,minecraft:jukebox,Jukebox,2 +85,0,minecraft:fence,Fence,0 +86,0,minecraft:pumpkin,Pumpkin,0 +87,0,minecraft:netherrack,Netherrack,0 +88,0,minecraft:soul_sand,Soul Sand,0 +89,0,minecraft:glowstone,Glowstone,0 +90,0,minecraft:portal,Nether Portal,2 +91,0,minecraft:lit_pumpkin,Jack 'o' Lantern,0 +92,0,minecraft:cake,Cake Block,0 +93,0,minecraft:unpowered_repeater,Redstone Repeater (inactive),2 +94,0,minecraft:powered_repeater,Redstone Repeater (active),2 +95,0,minecraft:stained_glass,Stained Glass,0 +95,0,minecraft:stained_glass,White Stained Glass,0 +95,1,minecraft:stained_glass,Orange Stained Glass,0 +95,2,minecraft:stained_glass,Magenta Stained Glass,0 +95,3,minecraft:stained_glass,Light Blue Stained Glass,0 +95,4,minecraft:stained_glass,Yellow Stained Glass,0 +95,5,minecraft:stained_glass,Lime Stained Glass,0 +95,6,minecraft:stained_glass,Pink Stained Glass,0 +95,7,minecraft:stained_glass,Gray Stained Glass,0 +95,8,minecraft:stained_glass,Light Gray Stained Glass,0 +95,9,minecraft:stained_glass,Cyan Stained Glass,0 +95,10,minecraft:stained_glass,Purple Stained Glass,0 +95,11,minecraft:stained_glass,Blue Stained Glass,0 +95,12,minecraft:stained_glass,Brown Stained Glass,0 +95,13,minecraft:stained_glass,Green Stained Glass,0 +95,14,minecraft:stained_glass,Red Stained Glass,0 +95,15,minecraft:stained_glass,Black Stained Glass,0 +96,0,minecraft:trapdoor,Trapdoor,2 +97,0,minecraft:monster_egg,Monster Egg,1 +97,0,minecraft:monster_egg,Stone Monster Egg,1 +97,1,minecraft:monster_egg,Cobblestone Monster Egg,1 +97,2,minecraft:monster_egg,Stone Brick Monster Egg,1 +97,3,minecraft:monster_egg,Mossy Stone Brick Monster Egg,1 +97,4,minecraft:monster_egg,Cracked Stone Brick Monster Egg,1 +97,5,minecraft:monster_egg,Chiseled Stone Brick Monster Egg,1 +98,0,minecraft:stonebrick,Stone Bricks,0 +98,1,minecraft:stonebrick,Mossy Stone Brick,0 +98,2,minecraft:stonebrick,Cracked Stone Brick,0 +98,3,minecraft:stonebrick,Chiseled Stone Brick,0 +99,14,minecraft:brown_mushroom_block,Huge Brown Mushroom,0 +100,14,minecraft:red_mushroom_block,Huge Red Mushroom,0 +101,0,minecraft:iron_bars,Iron Bars,0 +102,0,minecraft:glass_pane,Glass Pane,0 +103,0,minecraft:melon_block,Melon,0 +104,0,minecraft:pumpkin_stem,Pumpkin Stem,2 +105,0,minecraft:melon_stem,Melon Stem,2 +106,0,minecraft:vine,Vines,2 +107,0,minecraft:fence_gate,Fence Gate,2 +108,0,minecraft:brick_stairs,Brick Stairs,2 +109,0,minecraft:stone_brick_stairs,Stone Brick Stairs,2 +110,0,minecraft:mycelium,Mycelium,0 +111,0,minecraft:waterlily,Lily Pad,2 +112,0,minecraft:nether_brick,Nether Brick,0 +113,0,minecraft:nether_brick_fence,Nether Brick Fence,0 +114,0,minecraft:nether_brick_stairs,Nether Brick Stairs,2 +115,0,minecraft:nether_wart,Nether Wart,2 +116,0,minecraft:enchanting_table,Enchantment Table,2 +117,0,minecraft:brewing_stand,Brewing Stand,2 +118,0,minecraft:cauldron,Cauldron,2 +119,0,minecraft:end_portal,End Portal,2 +120,0,minecraft:end_portal_frame,End Portal Block,1 +121,0,minecraft:end_stone,End Stone,0 +122,0,minecraft:dragon_egg,Dragon Egg,0 +123,0,minecraft:redstone_lamp,Redstone Lamp,0 +124,0,minecraft:lit_redstone_lamp,Redstone Lamp (active),2 +125,0,minecraft:double_wooden_slab,Wooden Double Slab,0 +125,0,minecraft:double_wooden_slab,Double Oak Wood Slab,0 +125,1,minecraft:double_wooden_slab,Double Spruce Wood Slab,0 +125,2,minecraft:double_wooden_slab,Double Birch Wood Slab,0 +125,3,minecraft:double_wooden_slab,Double Jungle Wood Slab,0 +125,4,minecraft:double_wooden_slab,Double Acacia Wood Slab,0 +125,5,minecraft:double_wooden_slab,Double Dark Oak Wood Slab,0 +126,0,minecraft:wooden_slab,Wooden Slab,0 +126,0,minecraft:wooden_slab,Oak Wood Slab,0 +126,1,minecraft:wooden_slab,Spruce Wood Slab,0 +126,2,minecraft:wooden_slab,Birch Wood Slab,0 +126,3,minecraft:wooden_slab,Jungle Wood Slab,0 +126,4,minecraft:wooden_slab,Acacia Wood Slab,0 +126,5,minecraft:wooden_slab,Dark Oak Wood Slab,0 +126,8,minecraft:wooden_slab,Upper Wooden Slab,0 +126,8,minecraft:wooden_slab,Upper Oak Wood Slab,0 +126,9,minecraft:wooden_slab,Upper Spruce Wood Slab,0 +126,10,minecraft:wooden_slab,Upper Birch Wood Slab,0 +126,11,minecraft:wooden_slab,Upper Jungle Wood Slab,0 +126,12,minecraft:wooden_slab,Upper Acacia Wood Slab,0 +126,13,minecraft:wooden_slab,Upper Dark Oak Wood Slab,0 +127,0,minecraft:cocoa,Cocoa,2 +128,0,minecraft:sandstone_stairs,Sandstone Stairs,2 +129,0,minecraft:emerald_ore,Emerald Ore,0 +130,0,minecraft:ender_chest,Ender Chest,2 +131,0,minecraft:tripwire_hook,Tripwire Hook,2 +132,0,minecraft:tripwire,Tripwire,2 +133,0,minecraft:emerald_block,Block of Emerald,0 +134,0,minecraft:spruce_stairs,Spruce Wood Stairs,2 +135,0,minecraft:birch_stairs,Birch Wood Stairs,2 +136,0,minecraft:jungle_stairs,Jungle Wood Stairs,2 +137,0,minecraft:command_block,Command Block,2 +138,0,minecraft:beacon,Beacon,2 +139,0,minecraft:cobblestone_wall,Cobblestone Wall,0 +139,1,minecraft:cobblestone_wall,Mossy Cobblestone Wall,0 +140,0,minecraft:flower_pot,Flower Pot,2 +141,0,minecraft:carrots,Carrots,2 +142,0,minecraft:potatoes,Potatoes,2 +143,0,minecraft:wooden_button,Wooden Button,2 +144,0,minecraft:skull,Mob Head,2 +145,0,minecraft:anvil,Anvil,2 +146,0,minecraft:trapped_chest,Trapped Chest,2 +147,0,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light),2 +148,0,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy),2 +149,0,minecraft:unpowered_comparator,Redstone Comparator (inactive & active),2 +150,0,,(unused),2 +151,0,minecraft:daylight_detector,Daylight Sensor,2 +152,0,minecraft:redstone_block,Block of Redstone,0 +153,0,minecraft:quartz_ore,Nether Quartz Ore,0 +154,0,minecraft:hopper,Hopper,2 +155,0,minecraft:quartz_block,Block of Quartz,0 +156,0,minecraft:quartz_stairs,Quartz Stairs,2 +157,0,minecraft:activator_rail,Activator Rail,2 +158,0,minecraft:dropper,Dropper,2 +159,0,minecraft:stained_hardened_clay,Stained Clay,0 +159,0,minecraft:stained_hardened_clay,White Hardened Clay,0 +159,1,minecraft:stained_hardened_clay,Orange Hardened Clay,0 +159,2,minecraft:stained_hardened_clay,Magenta Hardened Clay,0 +159,3,minecraft:stained_hardened_clay,Light Blue Hardened Clay,0 +159,4,minecraft:stained_hardened_clay,Yellow Hardened Clay,0 +159,5,minecraft:stained_hardened_clay,Lime Hardened Clay,0 +159,6,minecraft:stained_hardened_clay,Pink Hardened Clay,0 +159,7,minecraft:stained_hardened_clay,Gray Hardened Clay,0 +159,8,minecraft:stained_hardened_clay,Light Gray Hardened Clay,0 +159,9,minecraft:stained_hardened_clay,Cyan Hardened Clay,0 +159,10,minecraft:stained_hardened_clay,Purple Hardened Clay,0 +159,11,minecraft:stained_hardened_clay,Blue Hardened Clay,0 +159,12,minecraft:stained_hardened_clay,Brown Hardened Clay,0 +159,13,minecraft:stained_hardened_clay,Green Hardened Clay,0 +159,14,minecraft:stained_hardened_clay,Red Hardened Clay,0 +159,15,minecraft:stained_hardened_clay,Black Hardened Clay,0 +160,0,minecraft:stained_glass_pane,Stained Glass Pane,0 +160,0,minecraft:stained_glass_pane,White Stained Glass Pane,1 +160,1,minecraft:stained_glass_pane,Orange Stained Glass Pane,2 +160,2,minecraft:stained_glass_pane,Magenta Stained Glass Pane,3 +160,3,minecraft:stained_glass_pane,Light Blue Stained Glass Pane,4 +160,4,minecraft:stained_glass_pane,Yellow Stained Glass Pane,5 +160,5,minecraft:stained_glass_pane,Lime Stained Glass Pane,6 +160,6,minecraft:stained_glass_pane,Pink Stained Glass Pane,7 +160,7,minecraft:stained_glass_pane,Gray Stained Glass Pane,8 +160,8,minecraft:stained_glass_pane,Light Gray Stained Glass Pane,9 +160,9,minecraft:stained_glass_pane,Cyan Stained Glass Pane,10 +160,10,minecraft:stained_glass_pane,Purple Stained Glass Pane,11 +160,11,minecraft:stained_glass_pane,Blue Stained Glass Pane,12 +160,12,minecraft:stained_glass_pane,Brown Stained Glass Pane,13 +160,13,minecraft:stained_glass_pane,Green Stained Glass Pane,14 +160,14,minecraft:stained_glass_pane,Red Stained Glass Pane,15 +160,15,minecraft:stained_glass_pane,Black Stained Glass Pane,16 +161,0,minecraft:leaves2,Acacia Leaves,0 +161,1,minecraft:leaves3,Dark Oak Leaves,0 +162,0,minecraft:log2,Acacia Wood Slab,0 +162,1,minecraft:log2,Dark Oak Wood,0 +163,0,minecraft:acacia_stairs,Acacia Wood Stairs,2 +164,0,minecraft:dark_oak_stairs,Dark Oak Wood Stairs,2 +170,0,minecraft:hay_block,Hay Block,0 +171,0,minecraft:carpet,Carpet,0 +171,0,minecraft:carpet,White Carpet,0 +171,1,minecraft:carpet,Orange Carpet,0 +171,2,minecraft:carpet,Magenta Carpet,0 +171,3,minecraft:carpet,Light Blue Carpet,0 +171,4,minecraft:carpet,Yellow Carpet,0 +171,5,minecraft:carpet,Lime Carpet,0 +171,6,minecraft:carpet,Pink Carpet,0 +171,7,minecraft:carpet,Gray Carpet,0 +171,8,minecraft:carpet,Light Gray Carpet,0 +171,9,minecraft:carpet,Cyan Carpet,0 +171,10,minecraft:carpet,Purple Carpet,0 +171,11,minecraft:carpet,Blue Carpet,0 +171,12,minecraft:carpet,Brown Carpet,0 +171,13,minecraft:carpet,Green Carpet,0 +171,14,minecraft:carpet,Red Carpet,0 +171,15,minecraft:carpet,Black Carpet,0 +172,0,minecraft:hardened_clay,Hardened Clay,0 +172,0,minecraft:hardened_clay,White Hardened Clay,0 +172,1,minecraft:hardened_clay,Orange Hardened Clay,0 +172,2,minecraft:hardened_clay,Magenta Hardened Clay,0 +172,3,minecraft:hardened_clay,Light Blue Hardened Clay,0 +172,4,minecraft:hardened_clay,Yellow Hardened Clay,0 +172,5,minecraft:hardened_clay,Lime Hardened Clay,0 +172,6,minecraft:hardened_clay,Pink Hardened Clay,0 +172,7,minecraft:hardened_clay,Gray Hardened Clay,0 +172,8,minecraft:hardened_clay,Light Gray Hardened Clay,0 +172,9,minecraft:hardened_clay,Cyan Hardened Clay,0 +172,10,minecraft:hardened_clay,Purple Hardened Clay,0 +172,11,minecraft:hardened_clay,Blue Hardened Clay,0 +172,12,minecraft:hardened_clay,Brown Hardened Clay,0 +172,13,minecraft:hardened_clay,Green Hardened Clay,0 +172,14,minecraft:hardened_clay,Red Hardened Clay,0 +172,15,minecraft:hardened_clay,Black Hardened Clay,0 +173,0,minecraft:coal_block,Block of Coal,0 +174,0,minecraft:packed_ice,Packed Ice,0 +175,0,minecraft:double_plant,Large Flowers,0 +175,0,minecraft:double_plant,Sunflower,2 +175,1,minecraft:double_plant,Lilac,2 +175,2,minecraft:double_plant,Double Tallgrass,2 +175,3,minecraft:double_plant,Large Fern,2 +175,4,minecraft:double_plant,Rose Bush,2 +175,5,minecraft:double_plant,Peony,2 From 8bed78f218454afaa563abcac9904a6c82a18207 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 24 Apr 2017 09:31:46 +0200 Subject: [PATCH 05/12] Fixed missing and wrong blocks Whoops --- .../codemetropolis/toolchain/rendering/util/Character.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java index 9df862da..97cc2c28 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java @@ -20,9 +20,9 @@ public static BasicBlock getBlock(String str){ } else{ System.out.println("Couldn't find block \"" + str + "\", using magenta wool instead."); - block = blocks.get("wool"); + block = blocks.get("magenta wool"); } - return new BasicBlock(block.getId(), Colour.MAGENTA); + return new BasicBlock(block.getId(), block.getData()); } public static BasicBlock getTopBlock(String str){ From 8e2d36eb2fd777f9be195fdf271d97d47319799b Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 1 May 2017 21:11:35 +0200 Subject: [PATCH 06/12] Cleanup, preparing for handing code in Changes in program: - Character is no longer an enum, but a class - BasicBlock constructors are no longer public - To get a block, use the static get() or userBlock() methods of the BasicBlock class - blocks.csv is rather massively extended - Program is prepared to accept any new block without change in program code (you have to extend only the blocks.csv) Changes in output: - The "frame" of the stairs is now in same matterial as the topBlock (Floor.prepareStairs) - The ceiling of the floor uses the external_character instead of character (still uses Character.getTopBlock) - Borders of namespaces changed from stone bricks to stone brick slabs (signs moved accordingly) --- .../toolchain/rendering/model/BasicBlock.java | 210 +++-- .../rendering/model/building/Cellar.java | 8 +- .../rendering/model/building/Floor.java | 57 +- .../rendering/model/building/Garden.java | 32 +- .../rendering/model/building/Ground.java | 46 +- .../rendering/model/primitive/Banner.java | 2 +- .../rendering/model/primitive/Boxel.java | 4 +- .../rendering/model/primitive/Door.java | 4 +- .../rendering/model/primitive/SignPost.java | 2 +- .../rendering/model/primitive/WallSign.java | 2 +- .../toolchain/rendering/util/Block.java | 33 - .../toolchain/rendering/util/Character.java | 45 +- .../src/main/resources/blocks.csv | 802 ++++++++++-------- 13 files changed, 677 insertions(+), 570 deletions(-) delete mode 100644 sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java index e1c77bef..8ace62fc 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java @@ -5,117 +5,188 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; -import java.util.Map; -import codemetropolis.toolchain.rendering.util.Block; -import codemetropolis.toolchain.rendering.util.Character; import codemetropolis.toolchain.rendering.util.Colour; import codemetropolis.toolchain.rendering.RenderingExecutor; -public class BasicBlock { - - public static final BasicBlock NonBlock; - public static final Map idToName; - public static final Map idToHumanReadableName; - public static final Map nameToId; - public static final Map humanReadableNameToId; - public static final Map humanReadableNameToBlock; - - static { - NonBlock = new BasicBlock((short)-1 ); - idToName = new HashMap(); - idToHumanReadableName = new HashMap(); - nameToId = new HashMap(); - humanReadableNameToId = new HashMap(); - humanReadableNameToBlock = new HashMap(); +public class BasicBlock{ + + public static final BasicBlock NonBlock; + protected static final HashMap> idToBlock; + protected static final HashMap> nameToBlock; + protected static final HashMap humanReadableNameToBlock; + protected static final HashMap used; + + static{ + NonBlock = new BasicBlock((short)-1, 0, "NonBlock", "A non-existant block", (short)2); + idToBlock = new HashMap>(); + nameToBlock = new HashMap>(); + humanReadableNameToBlock = new HashMap(); + used = new HashMap(); InputStream csvStream = RenderingExecutor.class.getClassLoader().getResourceAsStream("blocks.csv"); - try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(csvStream, "UTF-8"))) { + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(csvStream, "UTF-8"))){ String line; - while ((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null){ String[] blockInfo = line.split(","); - if (!idToName.containsKey(Short.parseShort(blockInfo[0]))){ - idToName.put(Short.parseShort(blockInfo[0]), blockInfo[2]); - idToHumanReadableName.put(Short.parseShort(blockInfo[0]), blockInfo[3]); - nameToId.put(blockInfo[2], Short.parseShort(blockInfo[0])); - } - humanReadableNameToBlock.put(blockInfo[3].toLowerCase(), - new Block( - Short.parseShort(blockInfo[0]), - Short.parseShort(blockInfo[1]), - blockInfo[2], - blockInfo[3], - Short.parseShort(blockInfo[4]) - ) + BasicBlock block = new BasicBlock( + Short.parseShort(blockInfo[0]), + Short.parseShort(blockInfo[1]), + blockInfo[2], + blockInfo[3], + Short.parseShort(blockInfo[4]) ); + + /* + * In the next two cases, if the the id/name and the data combo + * is already present, it'll overwrite the previous data This is + * intended behaviour, because there are sometimes simplified + * human readable block names if there are too many variations, + * so user doesn't have to specify. + */ + + // Adding to idToBlock + HashMap idBlock = idToBlock.get(block.id); + if (idBlock == null){ + idBlock = new HashMap(); + idToBlock.put(block.id, idBlock); + } + idBlock.put(block.data, block); + + // Adding to nameToBlock + HashMap nameBlock = nameToBlock.get(block.name); + if (nameBlock == null){ + nameBlock = new HashMap(); + nameToBlock.put(block.name, nameBlock); + } + nameBlock.put(block.data, block); + + humanReadableNameToBlock.put(block.getHumanReadableName().toLowerCase(), block); + // System.out.println(block); } - Character.init(humanReadableNameToBlock); - } catch (IOException e) { + } + catch (IOException e){ e.printStackTrace(); } } - private short id; - private int data; + private short id; + private int data; + private String name; + private String humanReadableName; + private short hazardous; - public BasicBlock(short id) { - this(id, 0); + + public BasicBlock(BasicBlock original){ + this.id = original.id; + this.data = original.data; + this.name = original.name; + this.humanReadableName = original.humanReadableName; + this.hazardous = original.hazardous; } - - public BasicBlock(short id, int data) { + + protected BasicBlock(short id, int data, String name, String humanReadableName, short hazardous){ this.id = id; this.data = data; + this.name = name; + this.humanReadableName = humanReadableName; + this.hazardous = hazardous; } - public BasicBlock(short id, Colour clr){ - this.id = id; - this.data = clr.getValue(); + // Return block + // String is the human readable name + // This method is used on user-inputed strings and it checks if it's allowed + public static BasicBlock userBlock(String name, BasicBlock fallback){ + BasicBlock block = humanReadableNameToBlock.get(name); + if (!used.containsKey(name)){ + used.put(name, true); + if (block == null){ + System.out.println("ERROR\tBlock \"" + name + "\" was not found!"); + System.out.println("\tInstead, using \"" + fallback.getHumanReadableName() + "\"."); + } + else{ + switch (block.getHazardous()){ + case 2: + System.out.println("ILLEGAL\tUse of \"" + block.getHumanReadableName() + "\" is premitted!"); + System.out.println("\tFalling back to \"" + fallback.getHumanReadableName() + "\"."); + break; + case 1: + System.out.println("WARNING\tUsing \"" + block.getHumanReadableName() + "\" DANGEROUS block."); + break; + case 0: + System.out.println("SUCCESS\tUsing \"" + block.getHumanReadableName() + "\" block."); + break; + } + } + } + return (block != null && block.getHazardous() != 2) ? block : fallback; } - public BasicBlock(String name) { - this(nameToId.get(name), 0); + // Return block + // String is the in-game name + public static BasicBlock get(String name, int data){ + BasicBlock ret = nameToBlock.get(name).get(data); + if (ret == null) + System.out.println("NullPointerException incoming!\nBlock name: " + name + ", data: " + data); + return ret; } - public BasicBlock(String name, int data) { - this(nameToId.get(name), data); + public static BasicBlock get(String name, Colour clr){ + return get(name, clr.getValue()); } - public BasicBlock(String name, Colour clr){ - this(nameToId.get(name), clr.getValue()); + public static BasicBlock get(String name){ + return get(name, 0); } - public BasicBlock(BasicBlock original) { - this.id = original.id; - this.data = original.data; + // Return block + // Int is the ID + public static BasicBlock get(short id, int data){ + BasicBlock ret = idToBlock.get(id).get(data); + if (ret == null) + System.out.println("NullPointerException incoming!\nBlock id: " + id + ", data: " + data); + return ret; } - public String getName() { - return idToName.get(id); + public static BasicBlock get(short id, Colour clr){ + return get(id, clr.getValue()); } - public String getHumanReadableName() { - return idToHumanReadableName.get(id); + public static BasicBlock get(short id){ + return get(id, 0); } - - public short getId() { + + public short getId(){ return id; } - - public int getData() { + + public int getData(){ return data; } - + + public String getName(){ + return this.name; + } + + public String getHumanReadableName(){ + return this.humanReadableName; + } + + public short getHazardous(){ + return this.hazardous; + } + @Override - public int hashCode() { + public int hashCode(){ final int prime = 31; int result = 1; result = prime * result + data; result = prime * result + id; return result; } - + @Override - public boolean equals(Object obj) { + public boolean equals(Object obj){ if (this == obj) return true; if (obj == null) @@ -129,10 +200,11 @@ public boolean equals(Object obj) { return false; return true; } - + @Override - public String toString() { - return getHumanReadableName() + (data != 0 ? data : ""); + public String toString(){ + return "Block object: \"" + getHumanReadableName() + "\" (id: " + id + ", name: " + getName() + ", data: " + data + ")"; + // return getHumanReadableName() + (data != 0 ? data : ""); } } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Cellar.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Cellar.java index 1da38d20..cdfa7cf2 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Cellar.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Cellar.java @@ -22,16 +22,16 @@ public Cellar(Buildable innerBuildable) throws BuildingTypeMismatchException { new SolidBox( position.translate( new Point( 1, 1, 1 ) ), size.translate( new Point( -2, -2, -2 ) ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air" ) } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air" ) } } } ), Orientation.NearX ) ); primitives.add( new SolidBox( position.translate( new Point( center.getX() - 3, size.getY() + 1, center.getZ() - 3 ) ), new Point( 7, 1, 7 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air" ) } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air" ) } } } ), Orientation.NearX ) ); } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java index 320bdd36..d7e0e162 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java @@ -32,16 +32,16 @@ public Floor(Buildable innerBuildable) throws BuildingTypeMismatchException { } protected void prepareDoor() { - BasicBlock _red = new BasicBlock( "minecraft:redstone_block" ); - BasicBlock _lgt = new BasicBlock( "minecraft:lit_redstone_lamp" ); - BasicBlock _rwl = new BasicBlock( "minecraft:wool", Colour.RED); - BasicBlock _gwl = new BasicBlock( "minecraft:wool", Colour.LIME); - BasicBlock _bwl = new BasicBlock( "minecraft:wool", Colour.LIGHT_BLUE); - BasicBlock _ywl = new BasicBlock( "minecraft:wool", Colour.YELLOW); + BasicBlock _red = BasicBlock.get( "minecraft:redstone_block" ); + BasicBlock _lgt = BasicBlock.get( "minecraft:lit_redstone_lamp" ); + BasicBlock _rwl = BasicBlock.get( "minecraft:wool", Colour.RED); + BasicBlock _gwl = BasicBlock.get( "minecraft:wool", Colour.LIME); + BasicBlock _bwl = BasicBlock.get( "minecraft:wool", Colour.LIGHT_BLUE); + BasicBlock _ywl = BasicBlock.get( "minecraft:wool", Colour.YELLOW); primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, 0 ) ), new Point( 3, 4, 1 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -57,7 +57,7 @@ protected void prepareDoor() { primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, size.getZ() - 1 ) ), new Point( 3, 4, 1 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -73,7 +73,7 @@ protected void prepareDoor() { primitives.add( new SolidBox( position.translate( new Point( 0, 0, center.getZ()-1 ) ), new Point( 1, 4, 3 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -89,7 +89,7 @@ protected void prepareDoor() { primitives.add( new SolidBox( position.translate( new Point( size.getX()-1, 0, center.getZ() - 1 ) ), new Point( 1, 4, 3 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -110,9 +110,14 @@ protected void prepareDoor() { } protected void prepareStairs() { - BasicBlock _air = new BasicBlock( (short) 0 ); - BasicBlock _str = new BasicBlock( (short) 1 ); - BasicBlock _cre = new BasicBlock( (short) 85 ); + BasicBlock _air = BasicBlock.get( (short) 0); + BasicBlock _str = BasicBlock.get( (short) 1); + BasicBlock _cre = BasicBlock.get( (short) 85); + + // Use the topBlock, since that's (usually) a fence too + if(innerBuildable.hasAttribute("external_character")) + _cre = Character.getTopBlock(innerBuildable.getAttributeValue("external_character").toLowerCase(), _cre); + primitives.add( new SolidBox( position.translate( new Point( center.getX() - 2, 0, center.getZ() - 2 ) ), @@ -177,7 +182,7 @@ protected void prepareStairs() { { _air, _air, _air, _air, _air } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:fence" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { _cre } } } ), Orientation.NearY ) ); } @@ -189,30 +194,28 @@ protected void prepareWalls() { BasicBlock _sideBlock; BasicBlock _strcBlock; - if(innerBuildable.hasAttribute( "character" ) && BasicBlock.humanReadableNameToBlock.containsKey(innerBuildable.getAttributeValue("character").toLowerCase())) - { + if(innerBuildable.hasAttribute( "character" )){ String str = innerBuildable.getAttributeValue("character").toLowerCase(); _sideBlock = Character.getBlock(str); - _topFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getTopBlock(str) } } } ); } else { - _sideBlock = new BasicBlock( "minecraft:wool", Colour.MAGENTA); - _topFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.MAGENTA) } } } ); + _sideBlock = BasicBlock.get( "minecraft:wool", Colour.MAGENTA); } - if(innerBuildable.hasAttribute( "external_character" ) && BasicBlock.humanReadableNameToBlock.containsKey(innerBuildable.getAttributeValue("external_character").toLowerCase())) - { + if(innerBuildable.hasAttribute( "external_character" )){ String str = innerBuildable.getAttributeValue("external_character").toLowerCase(); - _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); _strcBlock = Character.getBlock(str); + _topFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getTopBlock(str) } } } ); + _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); _stroke = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); } else { - _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.MAGENTA ) } } } ); - _strcBlock = new BasicBlock( "minecraft:wool", 10 ); - _stroke = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.BLACK ) } } } ); + _strcBlock = BasicBlock.get( "minecraft:wool", 10 ); + _topFill = new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:wool", Colour.MAGENTA) } } } ); + _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:wool", Colour.MAGENTA ) } } } ); + _stroke = new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:wool", Colour.BLACK ) } } } ); } RandomPattern _fallbackPattern = new RandomPattern( new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.NonBlock } } } ) ); - _fallbackPattern.add( new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:fence" ) } } } ), .5 ); + _fallbackPattern.add( new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:fence" ) } } } ), .5 ); _sideFill = new RandomPattern( _fallbackPattern ); _sideFill.add( new RepeationPattern( @@ -318,7 +321,7 @@ private void prepareTorches( ) { private BasicBlock[] createTorchPattern(int number, int data) { BasicBlock[] pattern = null; - BasicBlock torch = new BasicBlock((short) 50, data); + BasicBlock torch = BasicBlock.get((short) 50, data); BasicBlock space = BasicBlock.NonBlock; switch(number) { diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Garden.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Garden.java index 88b163b9..c500b7c2 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Garden.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Garden.java @@ -26,24 +26,24 @@ public Garden(Buildable innerBuildable) throws BuildingTypeMismatchException { } private void prepareBase( ) { - BasicBlock _fnc = new BasicBlock( "minecraft:fence" ); - BasicBlock _sns = new BasicBlock( "minecraft:sandstone" ); + BasicBlock _fnc = BasicBlock.get( "minecraft:fence" ); + BasicBlock _sns = BasicBlock.get( "minecraft:sandstone" ); RandomPattern _flowers = new RandomPattern( new RepeationPattern( new BasicBlock[][][]{ { { BasicBlock.NonBlock } } } ) ); - RandomPattern _redOrYellow = new RandomPattern( new RepeationPattern( new BasicBlock[][][]{ { { new BasicBlock( "minecraft:yellow_flower" ) } } } ) ); - _redOrYellow.add(new RepeationPattern( new BasicBlock[][][]{ { { new BasicBlock( "minecraft:red_flower" ) } } } ), 0.5); + RandomPattern _redOrYellow = new RandomPattern( new RepeationPattern( new BasicBlock[][][]{ { { BasicBlock.get( "minecraft:yellow_flower" ) } } } ) ); + _redOrYellow.add(new RepeationPattern( new BasicBlock[][][]{ { { BasicBlock.get( "minecraft:red_flower" ) } } } ), 0.5); _flowers.add( _redOrYellow, innerBuildable.hasAttribute( "flower-ratio" ) ? Double.parseDouble( innerBuildable.getAttributeValue("flower-ratio") ) : 0 ); _flowers.add( - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:brown_mushroom" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:brown_mushroom" ) } } } ), innerBuildable.hasAttribute( "mushroom-ratio" ) ? Double.parseDouble( innerBuildable.getAttributeValue("mushroom-ratio") ) : 0 ); _flowers.add( - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:sapling" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:sapling" ) } } } ), innerBuildable.hasAttribute( "tree-ratio" ) ? Double.parseDouble( innerBuildable.getAttributeValue("tree-ratio") ) : 0 ); @@ -52,7 +52,7 @@ private void prepareBase( ) { position, new Point( size.getX(), 2, size.getZ() ), new YSplitPattern( 0, - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:grass" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:grass" ) } } } ), _flowers ), new RepeationPattern( new BasicBlock[][][] @@ -67,15 +67,15 @@ position, new Point( size.getX(), 2, size.getZ() ), protected void prepareDoor( ) { - BasicBlock _fnc = new BasicBlock( "minecraft:fence" ); - BasicBlock _rwl = new BasicBlock( "minecraft:wool", 14 ); - BasicBlock _gwl = new BasicBlock( "minecraft:wool", 5 ); - BasicBlock _bwl = new BasicBlock( "minecraft:wool", 3 ); - BasicBlock _ywl = new BasicBlock( "minecraft:wool", 4 ); + BasicBlock _fnc = BasicBlock.get( "minecraft:fence" ); + BasicBlock _rwl = BasicBlock.get( "minecraft:wool", 14 ); + BasicBlock _gwl = BasicBlock.get( "minecraft:wool", 5 ); + BasicBlock _bwl = BasicBlock.get( "minecraft:wool", 3 ); + BasicBlock _ywl = BasicBlock.get( "minecraft:wool", 4 ); primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, 0 ) ), new Point( 3, 4, 1 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -91,7 +91,7 @@ protected void prepareDoor( ) primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, size.getZ() - 1 ) ), new Point( 3, 4, 1 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -107,7 +107,7 @@ protected void prepareDoor( ) primitives.add( new SolidBox( position.translate( new Point( 0, 0, center.getZ()-1 ) ), new Point( 1, 4, 3 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -123,7 +123,7 @@ protected void prepareDoor( ) primitives.add( new SolidBox( position.translate( new Point( size.getX()-1, 0, center.getZ() - 1 ) ), new Point( 1, 4, 3 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java index 8090fccc..09be798b 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java @@ -10,33 +10,39 @@ import codemetropolis.toolchain.rendering.model.primitive.SolidBox; import codemetropolis.toolchain.rendering.util.Orientation; -public class Ground extends Building { - - public Ground(Buildable innerBuildable) throws BuildingTypeMismatchException { +public class Ground extends Building{ + + public Ground(Buildable innerBuildable) throws BuildingTypeMismatchException{ super(innerBuildable); - - if ( innerBuildable.getType() != Type.GROUND ) + + if (innerBuildable.getType() != Type.GROUND) throw new BuildingTypeMismatchException(innerBuildable.getType(), getClass()); - + prepareBase(); prepareSigns(); } - private void prepareBase( ) { - primitives.add( - new SolidBox( - position, - new Point( size.getX(), 1, size.getZ() ), - new RepeationPattern( new BasicBlock[][][]{ { { new BasicBlock("minecraft:stone") } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock("minecraft:stonebrick") } } } ), - Orientation.NearX ) ); + private void prepareBase(){ + primitives.add(new SolidBox(position, new Point(size.getX(), 1, size.getZ()), + new RepeationPattern(new BasicBlock[][][] { { { BasicBlock.get("minecraft:stone") } } }), + new RepeationPattern(new BasicBlock[][][] { { { BasicBlock.get("minecraft:stone_slab", 5) } } }), + Orientation.NearX) + ); } - private void prepareSigns( ) { - primitives.add(new SignPost(position.getX(), position.getY() + 1, position.getZ(), SignPost.Orientation.NORTHWEST, innerBuildable.getName())); - primitives.add(new SignPost(position.getX() + size.getX() - 1, position.getY() + 1, position.getZ(), SignPost.Orientation.NORTHEAST, innerBuildable.getName())); - primitives.add(new SignPost(position.getX(), position.getY() + 1, position.getZ() + size.getZ() - 1, SignPost.Orientation.SOUTHWEST, innerBuildable.getName())); - primitives.add(new SignPost(position.getX() + size.getX() - 1, position.getY() + 1, position.getZ() + size.getZ() - 1, SignPost.Orientation.SOUTHEAST, innerBuildable.getName())); + private void prepareSigns(){ + primitives.add(new SignPost(position.getX() + 1, position.getY() + 1, position.getZ() + 1, + SignPost.Orientation.NORTHWEST, innerBuildable.getName()) + ); + primitives.add(new SignPost(position.getX() + size.getX() - 2, position.getY() + 1, position.getZ() + 1, + SignPost.Orientation.NORTHEAST, innerBuildable.getName()) + ); + primitives.add(new SignPost(position.getX() + 1, position.getY() + 1, position.getZ() + size.getZ() - 2, + SignPost.Orientation.SOUTHWEST, innerBuildable.getName()) + ); + primitives.add(new SignPost(position.getX() + size.getX() - 2, position.getY() + 1, position.getZ() + size.getZ() - 2, + SignPost.Orientation.SOUTHEAST, innerBuildable.getName()) + ); } - + } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Banner.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Banner.java index f2a1dd13..aac50fc5 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Banner.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Banner.java @@ -41,7 +41,7 @@ public Banner(int x, int y, int z, Orientation orientation, String color) { @Override public int toCSVFile(File directory) { - new Boxel(new BasicBlock((short) 176, orientation.getValue()), position, color).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 176, orientation.getValue()), position, color).toCSVFile(directory); return 1; } @Override diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Boxel.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Boxel.java index 931fff2c..c7cb0842 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Boxel.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Boxel.java @@ -48,14 +48,14 @@ public void render(World world) { public String toCSV() { //if(block == BasicBlock.NonBlock) return null; - if(block.getId() == -1) return null; + if (block.getId() == -1) return null; return String.format("%d;%d;%d;%d;%d;%s", block.getId(), block.getData(), position.getX(), position.getY(), position.getZ(), (info == null || info.equals("") ? "NULL" : info)); } public static Boxel parseCSV(String csv) { String[] parts = csv.split(";"); return new Boxel( - new BasicBlock( + BasicBlock.get( Short.parseShort(parts[0]), Integer.parseInt(parts[1])), new Point( diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Door.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Door.java index ca210c5f..9a96ee9a 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Door.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Door.java @@ -35,8 +35,8 @@ public Door(int x, int y, int z, Orientation orientation) { @Override public int toCSVFile(File directory) { - new Boxel(new BasicBlock((short) 64, orientation.getValue()), position).toCSVFile(directory); - new Boxel(new BasicBlock((short) 64, 8), new Point(position.getX(), position.getY() + 1, position.getZ())).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 64, orientation.getValue()), position).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 64, 8), new Point(position.getX(), position.getY() + 1, position.getZ())).toCSVFile(directory); return 2; } @Override diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/SignPost.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/SignPost.java index ad90f5e1..a7644aa7 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/SignPost.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/SignPost.java @@ -41,7 +41,7 @@ public SignPost(int x, int y, int z, Orientation orientation, String text) { @Override public int toCSVFile(File directory) { - new Boxel(new BasicBlock((short) 63, orientation.getValue()), position, text).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 63, orientation.getValue()), position, text).toCSVFile(directory); return 1; } @Override diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/WallSign.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/WallSign.java index 4c9b8921..259478e2 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/WallSign.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/WallSign.java @@ -41,7 +41,7 @@ public WallSign(Point position, Orientation orientation, String text) { @Override public int toCSVFile(File directory) { - new Boxel(new BasicBlock((short) 68, orientation.getValue()), position, text).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 68, orientation.getValue()), position, text).toCSVFile(directory); return 1; } @Override diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java deleted file mode 100644 index f7d63d22..00000000 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java +++ /dev/null @@ -1,33 +0,0 @@ -package codemetropolis.toolchain.rendering.util; - -public class Block { - protected short id; - protected short data; - protected String ign; - protected String humanReadableName; - protected short hazardous; - - public short getId() { - return id; - } - public short getData() { - return data; - } - public String getIgn() { - return ign; - } - public String getHumanReadableName() { - return humanReadableName; - } - public short getHazardous() { - return hazardous; - } - - public Block(short id, short data, String ign, String human, short hazard){ - this.id = id; - this.data = data; - this.ign = ign; - this.humanReadableName = human; - this.hazardous = hazard; - } -} diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java index 97cc2c28..49c64e26 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java @@ -2,47 +2,50 @@ import codemetropolis.toolchain.rendering.model.BasicBlock; import codemetropolis.toolchain.rendering.util.Colour; -import java.util.Map; public abstract class Character { + protected static BasicBlock _fallback; + protected static BasicBlock _topFallback; - protected static Map blocks; + static{ + _fallback = new BasicBlock( (short)35, Colour.MAGENTA.getValue(), "minecraft:wool", "Magenta Wool", (short)0); + _topFallback = new BasicBlock( (short)85, 0, "minecraft:fence", "Fence", (short)0); + } - public static void init(Map blocks){ - Character.blocks = blocks; + public static BasicBlock getBlock(String str, BasicBlock fallback){ + return BasicBlock.userBlock(str, fallback); } public static BasicBlock getBlock(String str){ - Block block; - if (blocks.containsKey(str) && blocks.get(str).getHazardous() != 2){ - System.out.println("Using \"" + str + "\""); - block = blocks.get(str); - } - else{ - System.out.println("Couldn't find block \"" + str + "\", using magenta wool instead."); - block = blocks.get("magenta wool"); - } - return new BasicBlock(block.getId(), block.getData()); + return getBlock(str, _fallback); } public static BasicBlock getTopBlock(String str){ - if (blocks.containsKey(str) && blocks.get(str).getHazardous() != 2){ - Block block = blocks.get(str); + return getTopBlock(str, _topFallback); + } + + public static BasicBlock getTopBlock(String str, BasicBlock fallback){ + BasicBlock block = BasicBlock.userBlock(str, fallback); + if (block != null){ switch (block.getId()){ // TODO Add more fences in the .csv case 5: case 17: - return new BasicBlock((short)85); + return BasicBlock.userBlock("fence", fallback); case 1: case 43: case 44: - return new BasicBlock((short)139); + return BasicBlock.userBlock("cobblestone wall", fallback); case 48: - return new BasicBlock((short)139, (short)1); + return BasicBlock.userBlock("mossy cobblestone wall", fallback); case 112: - return new BasicBlock((short)113); + return BasicBlock.userBlock("nether brick fence", fallback); + case 98: + if (block.getData() == 1) + return BasicBlock.userBlock("mossy cobblestone wall", fallback); + return BasicBlock.userBlock("cobblestone wall", fallback); } } - return getBlock(str); + return fallback; } } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv index f014795c..3f7d6167 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv +++ b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv @@ -1,373 +1,429 @@ -0,0,minecraft:air,Air,2 -1,0,minecraft:stone,Stone,0 -1,1,minecraft:stone,Granite,0 -1,2,minecraft:stone,Polished Granite,0 -1,3,minecraft:stone,Diorite,0 -1,4,minecraft:stone,Polished Diorite,0 -1,5,minecraft:stone,Andesite,0 -1,6,minecraft:stone,Polished Andesite,0 -2,0,minecraft:grass,Grass Block,0 -3,0,minecraft:dirt,Dirt,0 -3,1,minecraft:dirt,Coarse Dirt,0 -3,2,minecraft:dirt,Podzol,0 -4,0,minecraft:cobblestone,Cobblestone,0 -5,0,minecraft:planks,Planks,0 -5,0,minecraft:planks,Oak Planks,0 -5,1,minecraft:planks,Spruce Planks,0 -5,2,minecraft:planks,Birch Planks,0 -5,3,minecraft:planks,Jungle Planks,0 -5,4,minecraft:planks,Acacia Planks,0 -5,5,minecraft:planks,Dark Oak Planks,0 -6,0,minecraft:sapling,Saplings,0 -6,0,minecraft:sapling,Oak Sapling,0 -6,1,minecraft:sapling,Spruce Sapling,0 -6,2,minecraft:sapling,Birch Sapling,0 -6,3,minecraft:sapling,Jungle Sapling,0 -6,4,minecraft:sapling,Acacia Sapling,0 -6,5,minecraft:sapling,Dark Oak Sapling,0 -7,0,minecraft:bedrock,Bedrock,1 -8,0,minecraft:flowing_water,Flowing Water,2 -9,0,minecraft:water,Water,1 -10,0,minecraft:flowing_lava,Flowing Lava,2 -11,0,minecraft:lava,Lava,1 -12,0,minecraft:sand,Sand,0 -12,1,minecraft:sand,Red Sand,0 -13,0,minecraft:gravel,Gravel,0 -14,0,minecraft:gold_ore,Gold Ore,0 -15,0,minecraft:iron_ore,Iron Ore,0 -16,0,minecraft:coal_ore,Coal Ore,0 -17,0,minecraft:log,Wood,0 -17,1,minecraft:log,Oak Wood,0 -17,2,minecraft:log,Spruce Wood,0 -17,3,minecraft:log,Birch Wood,0 -17,4,minecraft:log,Jungle Wood,0 -18,0,minecraft:leaves,Leaves,0 -18,0,minecraft:leaves,Oak Leaves,0 -18,1,minecraft:leaves,Spruce Leaves,0 -18,2,minecraft:leaves,Birch Leaves,0 -18,3,minecraft:leaves,Jungle Leaves,0 -19,0,minecraft:sponge,Sponge,0 -19,1,minecraft:sponge,We Sponge,0 -20,0,minecraft:glass,Glass,0 -21,0,minecraft:lapis_ore,Lapis Lazuli Ore,0 -22,0,minecraft:lapis_block,Lapis Lazuli Block,0 -23,0,minecraft:dispenser,Dispenser,2 -24,0,minecraft:sandstone,Sandstone,0 -24,1,minecraft:sandstone,Chiseled Sandstone,0 -24,2,minecraft:sandstone,Smooth Sandstone,0 -25,0,minecraft:noteblock,Note Block,2 -26,0,minecraft:bed,Bed,2 -27,0,minecraft:golden_rail,Powered Rail,2 -28,0,minecraft:detector_rail,Detector Rail,2 -29,0,minecraft:sticky_piston,Sticky Piston,2 -30,0,minecraft:web,Cobweb,0 -31,0,minecraft:tallgrass,Grass,0 -31,0,minecraft:tallgrass,Shrub,0 -31,1,minecraft:tallgrass,Tall Grass,0 -31,2,minecraft:tallgrass,Fern,0 -32,0,minecraft:deadbush,Dead Bush,0 -33,0,minecraft:piston,Piston,2 -34,0,minecraft:piston_head,Piston Extension,2 -35,0,minecraft:wool,Wool,0 -35,0,minecraft:wool,White Wool,0 -35,1,minecraft:wool,Orange Wool,0 -35,2,minecraft:wool,Magenta Wool,0 -35,3,minecraft:wool,Light Blue Wool,0 -35,4,minecraft:wool,Yellow Wool,0 -35,5,minecraft:wool,Lime Wool,0 -35,6,minecraft:wool,Pink Wool,0 -35,7,minecraft:wool,Gray Wool,0 -35,8,minecraft:wool,Light Gray Wool,0 -35,9,minecraft:wool,Cyan Wool,0 -35,10,minecraft:wool,Purple Wool,0 -35,11,minecraft:wool,Blue Wool,0 -35,12,minecraft:wool,Brown Wool,0 -35,13,minecraft:wool,Green Wool,0 -35,14,minecraft:wool,Red Wool,0 -35,15,minecraft:wool,Black Wool,0 -36,0,minecraft:piston_extension,Block moved by Piston,2 -37,0,minecraft:yellow_flower,Dandelion,0 -38,0,minecraft:red_flower,Poppy,2 -38,1,minecraft:red_flower,Blue Orchid,2 -38,2,minecraft:red_flower,Allium,2 -38,3,minecraft:red_flower,Azure Bluet,2 -38,4,minecraft:red_flower,Red Tulip,2 -38,5,minecraft:red_flower,Orange Tulip,2 -38,6,minecraft:red_flower,White Tulip,2 -38,7,minecraft:red_flower,Pink Tulip,2 -38,8,minecraft:red_flower,Oxeye Daisy,0 -39,0,minecraft:brown_mushroom,Brown Mushroom,0 -40,0,minecraft:red_mushroom,Red Mushroom,0 -41,0,minecraft:gold_block,Block of Gold,0 -42,0,minecraft:iron_block,Block of Iron,0 -43,0,minecraft:double_stone_slab,Double Stone Slab,0 -43,1,minecraft:double_stone_slab,Double Sandstone Slab,0 -43,2,minecraft:double_stone_slab,Double Wooden Slab,0 -43,3,minecraft:double_stone_slab,Double Cobblestone Slab,0 -43,4,minecraft:double_stone_slab,Double Bricks Slab,0 -43,5,minecraft:double_stone_slab,Double Stone Brick Slab,0 -43,6,minecraft:double_stone_slab,Double Nether Brick Slab,0 -43,7,minecraft:double_stone_slab,Double Quartz Slab,0 -43,8,minecraft:double_stone_slab,Smooth Double Stone Slab,0 -43,9,minecraft:double_stone_slab,Smooth Double Sandstone Slab,0 -43,15,minecraft:double_stone_slab,Tile Double Quartz Slab,0 -44,0,minecraft:stone_slab,Stone Slab,0 -44,1,minecraft:stone_slab,Sandstone Slab,0 -44,2,minecraft:stone_slab,Wooden Slab,0 -44,3,minecraft:stone_slab,Cobblestone Slab,0 -44,4,minecraft:stone_slab,Bricks Slab,0 -44,5,minecraft:stone_slab,Stone Brick Slab,0 -44,6,minecraft:stone_slab,Nether Brick Slab,0 -44,7,minecraft:stone_slab,Quartz Slab,0 -44,8,minecraft:stone_slab,Upper Stone Slab,0 -44,9,minecraft:stone_slab,Upper Sandstone Slab,0 -44,10,minecraft:stone_slab,Upper Wooden Slab,0 -44,11,minecraft:stone_slab,Upper Cobblestone Slab,0 -44,12,minecraft:stone_slab,Upper Bricks Slab,0 -44,13,minecraft:stone_slab,Upper Stone Brick Slab,0 -44,14,minecraft:stone_slab,Upper Nether Brick Slab,0 -44,15,minecraft:stone_slab,Upper Quartz Slab,0 -45,0,minecraft:brick_block,Bricks,0 -46,0,minecraft:tnt,TNT,1 -47,0,minecraft:bookshelf,Bookshelf,0 -48,0,minecraft:mossy_cobblestone,Moss Stone,0 -49,0,minecraft:obsidian,Obsidian,0 -50,0,minecraft:torch,Torch,2 -51,0,minecraft:fire,Fire,2 -52,0,minecraft:mob_spawner,Monster Spawner,2 -53,0,minecraft:oak_stairs,Oak Wood Stairs,2 -54,0,minecraft:chest,Chest,2 -55,0,minecraft:redstone_wire,Redstone Wire,2 -56,0,minecraft:diamond_ore,Diamond Ore,0 -57,0,minecraft:diamond_block,Block of Diamond,0 -58,0,minecraft:crafting_table,Crafting Table,0 -59,0,minecraft:wheat,Wheat,2 -60,0,minecraft:farmland,Farmland,2 -60,7,minecraft:farmland,Wet Farmland,2 -61,0,minecraft:furnace,Furnace,1 -62,0,minecraft:lit_furnace,Burning Furnace,2 -63,0,minecraft:standing_sign,Sign Post,2 -64,0,minecraft:wooden_door,Wooden Door,2 -65,0,minecraft:ladder,Ladders,2 -66,0,minecraft:rail,Rail,2 -67,0,minecraft:stone_stairs,Cobblestone Stairs,2 -68,0,minecraft:wall_sign,Wall Sign,2 -69,0,minecraft:lever,Lever,2 -70,0,minecraft:stone_pressure_plate,Stone Pressure Plate,2 -71,0,minecraft:iron_door,Iron Door,2 -72,0,minecraft:wooden_pressure_plate,Wooden Pressure Plate,2 -73,0,minecraft:redstone_ore,Redstone Ore,0 -74,0,minecraft:lit_redstone_ore,Glowing Redstone Ore,0 -75,0,minecraft:unlit_redstone_torch,Redstone Torch (inactive),2 -76,0,minecraft:redstone_torch,Redstone Torch (active),2 -77,0,minecraft:stone_button,Stone Button,2 -78,0,minecraft:snow_layer,Snow,2 -79,0,minecraft:ice,Ice,1 -80,0,minecraft:snow,Snow,0 -81,0,minecraft:cactus,Cactus,2 -82,0,minecraft:clay,Clay,0 -83,0,minecraft:reeds,Sugar Cane,1 -84,0,minecraft:jukebox,Jukebox,2 -85,0,minecraft:fence,Fence,0 -86,0,minecraft:pumpkin,Pumpkin,0 -87,0,minecraft:netherrack,Netherrack,0 -88,0,minecraft:soul_sand,Soul Sand,0 -89,0,minecraft:glowstone,Glowstone,0 -90,0,minecraft:portal,Nether Portal,2 -91,0,minecraft:lit_pumpkin,Jack 'o' Lantern,0 -92,0,minecraft:cake,Cake Block,0 -93,0,minecraft:unpowered_repeater,Redstone Repeater (inactive),2 -94,0,minecraft:powered_repeater,Redstone Repeater (active),2 -95,0,minecraft:stained_glass,Stained Glass,0 -95,0,minecraft:stained_glass,White Stained Glass,0 -95,1,minecraft:stained_glass,Orange Stained Glass,0 -95,2,minecraft:stained_glass,Magenta Stained Glass,0 -95,3,minecraft:stained_glass,Light Blue Stained Glass,0 -95,4,minecraft:stained_glass,Yellow Stained Glass,0 -95,5,minecraft:stained_glass,Lime Stained Glass,0 -95,6,minecraft:stained_glass,Pink Stained Glass,0 -95,7,minecraft:stained_glass,Gray Stained Glass,0 -95,8,minecraft:stained_glass,Light Gray Stained Glass,0 -95,9,minecraft:stained_glass,Cyan Stained Glass,0 -95,10,minecraft:stained_glass,Purple Stained Glass,0 -95,11,minecraft:stained_glass,Blue Stained Glass,0 -95,12,minecraft:stained_glass,Brown Stained Glass,0 -95,13,minecraft:stained_glass,Green Stained Glass,0 -95,14,minecraft:stained_glass,Red Stained Glass,0 -95,15,minecraft:stained_glass,Black Stained Glass,0 -96,0,minecraft:trapdoor,Trapdoor,2 -97,0,minecraft:monster_egg,Monster Egg,1 -97,0,minecraft:monster_egg,Stone Monster Egg,1 -97,1,minecraft:monster_egg,Cobblestone Monster Egg,1 -97,2,minecraft:monster_egg,Stone Brick Monster Egg,1 -97,3,minecraft:monster_egg,Mossy Stone Brick Monster Egg,1 -97,4,minecraft:monster_egg,Cracked Stone Brick Monster Egg,1 -97,5,minecraft:monster_egg,Chiseled Stone Brick Monster Egg,1 -98,0,minecraft:stonebrick,Stone Bricks,0 -98,1,minecraft:stonebrick,Mossy Stone Brick,0 -98,2,minecraft:stonebrick,Cracked Stone Brick,0 -98,3,minecraft:stonebrick,Chiseled Stone Brick,0 -99,14,minecraft:brown_mushroom_block,Huge Brown Mushroom,0 -100,14,minecraft:red_mushroom_block,Huge Red Mushroom,0 -101,0,minecraft:iron_bars,Iron Bars,0 -102,0,minecraft:glass_pane,Glass Pane,0 -103,0,minecraft:melon_block,Melon,0 -104,0,minecraft:pumpkin_stem,Pumpkin Stem,2 -105,0,minecraft:melon_stem,Melon Stem,2 -106,0,minecraft:vine,Vines,2 -107,0,minecraft:fence_gate,Fence Gate,2 -108,0,minecraft:brick_stairs,Brick Stairs,2 -109,0,minecraft:stone_brick_stairs,Stone Brick Stairs,2 -110,0,minecraft:mycelium,Mycelium,0 -111,0,minecraft:waterlily,Lily Pad,2 -112,0,minecraft:nether_brick,Nether Brick,0 -113,0,minecraft:nether_brick_fence,Nether Brick Fence,0 -114,0,minecraft:nether_brick_stairs,Nether Brick Stairs,2 -115,0,minecraft:nether_wart,Nether Wart,2 -116,0,minecraft:enchanting_table,Enchantment Table,2 -117,0,minecraft:brewing_stand,Brewing Stand,2 -118,0,minecraft:cauldron,Cauldron,2 -119,0,minecraft:end_portal,End Portal,2 -120,0,minecraft:end_portal_frame,End Portal Block,1 -121,0,minecraft:end_stone,End Stone,0 -122,0,minecraft:dragon_egg,Dragon Egg,0 -123,0,minecraft:redstone_lamp,Redstone Lamp,0 -124,0,minecraft:lit_redstone_lamp,Redstone Lamp (active),2 -125,0,minecraft:double_wooden_slab,Wooden Double Slab,0 -125,0,minecraft:double_wooden_slab,Double Oak Wood Slab,0 -125,1,minecraft:double_wooden_slab,Double Spruce Wood Slab,0 -125,2,minecraft:double_wooden_slab,Double Birch Wood Slab,0 -125,3,minecraft:double_wooden_slab,Double Jungle Wood Slab,0 -125,4,minecraft:double_wooden_slab,Double Acacia Wood Slab,0 -125,5,minecraft:double_wooden_slab,Double Dark Oak Wood Slab,0 -126,0,minecraft:wooden_slab,Wooden Slab,0 -126,0,minecraft:wooden_slab,Oak Wood Slab,0 -126,1,minecraft:wooden_slab,Spruce Wood Slab,0 -126,2,minecraft:wooden_slab,Birch Wood Slab,0 -126,3,minecraft:wooden_slab,Jungle Wood Slab,0 -126,4,minecraft:wooden_slab,Acacia Wood Slab,0 -126,5,minecraft:wooden_slab,Dark Oak Wood Slab,0 -126,8,minecraft:wooden_slab,Upper Wooden Slab,0 -126,8,minecraft:wooden_slab,Upper Oak Wood Slab,0 -126,9,minecraft:wooden_slab,Upper Spruce Wood Slab,0 -126,10,minecraft:wooden_slab,Upper Birch Wood Slab,0 -126,11,minecraft:wooden_slab,Upper Jungle Wood Slab,0 -126,12,minecraft:wooden_slab,Upper Acacia Wood Slab,0 -126,13,minecraft:wooden_slab,Upper Dark Oak Wood Slab,0 -127,0,minecraft:cocoa,Cocoa,2 -128,0,minecraft:sandstone_stairs,Sandstone Stairs,2 -129,0,minecraft:emerald_ore,Emerald Ore,0 -130,0,minecraft:ender_chest,Ender Chest,2 -131,0,minecraft:tripwire_hook,Tripwire Hook,2 -132,0,minecraft:tripwire,Tripwire,2 -133,0,minecraft:emerald_block,Block of Emerald,0 -134,0,minecraft:spruce_stairs,Spruce Wood Stairs,2 -135,0,minecraft:birch_stairs,Birch Wood Stairs,2 -136,0,minecraft:jungle_stairs,Jungle Wood Stairs,2 -137,0,minecraft:command_block,Command Block,2 -138,0,minecraft:beacon,Beacon,2 -139,0,minecraft:cobblestone_wall,Cobblestone Wall,0 -139,1,minecraft:cobblestone_wall,Mossy Cobblestone Wall,0 -140,0,minecraft:flower_pot,Flower Pot,2 -141,0,minecraft:carrots,Carrots,2 -142,0,minecraft:potatoes,Potatoes,2 -143,0,minecraft:wooden_button,Wooden Button,2 -144,0,minecraft:skull,Mob Head,2 -145,0,minecraft:anvil,Anvil,2 -146,0,minecraft:trapped_chest,Trapped Chest,2 -147,0,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light),2 -148,0,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy),2 -149,0,minecraft:unpowered_comparator,Redstone Comparator (inactive & active),2 -150,0,,(unused),2 -151,0,minecraft:daylight_detector,Daylight Sensor,2 -152,0,minecraft:redstone_block,Block of Redstone,0 -153,0,minecraft:quartz_ore,Nether Quartz Ore,0 -154,0,minecraft:hopper,Hopper,2 -155,0,minecraft:quartz_block,Block of Quartz,0 -156,0,minecraft:quartz_stairs,Quartz Stairs,2 -157,0,minecraft:activator_rail,Activator Rail,2 -158,0,minecraft:dropper,Dropper,2 -159,0,minecraft:stained_hardened_clay,Stained Clay,0 -159,0,minecraft:stained_hardened_clay,White Hardened Clay,0 -159,1,minecraft:stained_hardened_clay,Orange Hardened Clay,0 -159,2,minecraft:stained_hardened_clay,Magenta Hardened Clay,0 -159,3,minecraft:stained_hardened_clay,Light Blue Hardened Clay,0 -159,4,minecraft:stained_hardened_clay,Yellow Hardened Clay,0 -159,5,minecraft:stained_hardened_clay,Lime Hardened Clay,0 -159,6,minecraft:stained_hardened_clay,Pink Hardened Clay,0 -159,7,minecraft:stained_hardened_clay,Gray Hardened Clay,0 -159,8,minecraft:stained_hardened_clay,Light Gray Hardened Clay,0 -159,9,minecraft:stained_hardened_clay,Cyan Hardened Clay,0 -159,10,minecraft:stained_hardened_clay,Purple Hardened Clay,0 -159,11,minecraft:stained_hardened_clay,Blue Hardened Clay,0 -159,12,minecraft:stained_hardened_clay,Brown Hardened Clay,0 -159,13,minecraft:stained_hardened_clay,Green Hardened Clay,0 -159,14,minecraft:stained_hardened_clay,Red Hardened Clay,0 -159,15,minecraft:stained_hardened_clay,Black Hardened Clay,0 -160,0,minecraft:stained_glass_pane,Stained Glass Pane,0 -160,0,minecraft:stained_glass_pane,White Stained Glass Pane,1 -160,1,minecraft:stained_glass_pane,Orange Stained Glass Pane,2 -160,2,minecraft:stained_glass_pane,Magenta Stained Glass Pane,3 -160,3,minecraft:stained_glass_pane,Light Blue Stained Glass Pane,4 -160,4,minecraft:stained_glass_pane,Yellow Stained Glass Pane,5 -160,5,minecraft:stained_glass_pane,Lime Stained Glass Pane,6 -160,6,minecraft:stained_glass_pane,Pink Stained Glass Pane,7 -160,7,minecraft:stained_glass_pane,Gray Stained Glass Pane,8 -160,8,minecraft:stained_glass_pane,Light Gray Stained Glass Pane,9 -160,9,minecraft:stained_glass_pane,Cyan Stained Glass Pane,10 -160,10,minecraft:stained_glass_pane,Purple Stained Glass Pane,11 -160,11,minecraft:stained_glass_pane,Blue Stained Glass Pane,12 -160,12,minecraft:stained_glass_pane,Brown Stained Glass Pane,13 -160,13,minecraft:stained_glass_pane,Green Stained Glass Pane,14 -160,14,minecraft:stained_glass_pane,Red Stained Glass Pane,15 -160,15,minecraft:stained_glass_pane,Black Stained Glass Pane,16 -161,0,minecraft:leaves2,Acacia Leaves,0 -161,1,minecraft:leaves3,Dark Oak Leaves,0 -162,0,minecraft:log2,Acacia Wood Slab,0 -162,1,minecraft:log2,Dark Oak Wood,0 -163,0,minecraft:acacia_stairs,Acacia Wood Stairs,2 -164,0,minecraft:dark_oak_stairs,Dark Oak Wood Stairs,2 -170,0,minecraft:hay_block,Hay Block,0 -171,0,minecraft:carpet,Carpet,0 -171,0,minecraft:carpet,White Carpet,0 -171,1,minecraft:carpet,Orange Carpet,0 -171,2,minecraft:carpet,Magenta Carpet,0 -171,3,minecraft:carpet,Light Blue Carpet,0 -171,4,minecraft:carpet,Yellow Carpet,0 -171,5,minecraft:carpet,Lime Carpet,0 -171,6,minecraft:carpet,Pink Carpet,0 -171,7,minecraft:carpet,Gray Carpet,0 -171,8,minecraft:carpet,Light Gray Carpet,0 -171,9,minecraft:carpet,Cyan Carpet,0 -171,10,minecraft:carpet,Purple Carpet,0 -171,11,minecraft:carpet,Blue Carpet,0 -171,12,minecraft:carpet,Brown Carpet,0 -171,13,minecraft:carpet,Green Carpet,0 -171,14,minecraft:carpet,Red Carpet,0 -171,15,minecraft:carpet,Black Carpet,0 -172,0,minecraft:hardened_clay,Hardened Clay,0 -172,0,minecraft:hardened_clay,White Hardened Clay,0 -172,1,minecraft:hardened_clay,Orange Hardened Clay,0 -172,2,minecraft:hardened_clay,Magenta Hardened Clay,0 -172,3,minecraft:hardened_clay,Light Blue Hardened Clay,0 -172,4,minecraft:hardened_clay,Yellow Hardened Clay,0 -172,5,minecraft:hardened_clay,Lime Hardened Clay,0 -172,6,minecraft:hardened_clay,Pink Hardened Clay,0 -172,7,minecraft:hardened_clay,Gray Hardened Clay,0 -172,8,minecraft:hardened_clay,Light Gray Hardened Clay,0 -172,9,minecraft:hardened_clay,Cyan Hardened Clay,0 -172,10,minecraft:hardened_clay,Purple Hardened Clay,0 -172,11,minecraft:hardened_clay,Blue Hardened Clay,0 -172,12,minecraft:hardened_clay,Brown Hardened Clay,0 -172,13,minecraft:hardened_clay,Green Hardened Clay,0 -172,14,minecraft:hardened_clay,Red Hardened Clay,0 -172,15,minecraft:hardened_clay,Black Hardened Clay,0 -173,0,minecraft:coal_block,Block of Coal,0 -174,0,minecraft:packed_ice,Packed Ice,0 -175,0,minecraft:double_plant,Large Flowers,0 -175,0,minecraft:double_plant,Sunflower,2 -175,1,minecraft:double_plant,Lilac,2 -175,2,minecraft:double_plant,Double Tallgrass,2 -175,3,minecraft:double_plant,Large Fern,2 -175,4,minecraft:double_plant,Rose Bush,2 -175,5,minecraft:double_plant,Peony,2 +0,0,minecraft:air,Air,2 +1,0,minecraft:stone,Stone,0 +1,1,minecraft:stone,Granite,0 +1,2,minecraft:stone,Polished Granite,0 +1,3,minecraft:stone,Diorite,0 +1,4,minecraft:stone,Polished Diorite,0 +1,5,minecraft:stone,Andesite,0 +1,6,minecraft:stone,Polished Andesite,0 +2,0,minecraft:grass,Grass Block,0 +3,0,minecraft:dirt,Dirt,0 +3,1,minecraft:dirt,Coarse Dirt,0 +3,2,minecraft:dirt,Podzol,0 +4,0,minecraft:cobblestone,Cobblestone,0 +5,0,minecraft:planks,Planks,0 +5,0,minecraft:planks,Oak Planks,0 +5,1,minecraft:planks,Spruce Planks,0 +5,2,minecraft:planks,Birch Planks,0 +5,3,minecraft:planks,Jungle Planks,0 +5,4,minecraft:planks,Acacia Planks,0 +5,5,minecraft:planks,Dark Oak Planks,0 +6,0,minecraft:sapling,Saplings,0 +6,0,minecraft:sapling,Oak Sapling,0 +6,1,minecraft:sapling,Spruce Sapling,0 +6,2,minecraft:sapling,Birch Sapling,0 +6,3,minecraft:sapling,Jungle Sapling,0 +6,4,minecraft:sapling,Acacia Sapling,0 +6,5,minecraft:sapling,Dark Oak Sapling,0 +7,0,minecraft:bedrock,Bedrock,1 +8,0,minecraft:flowing_water,Flowing Water,2 +9,0,minecraft:water,Water,1 +10,0,minecraft:flowing_lava,Flowing Lava,2 +11,0,minecraft:lava,Lava,1 +12,0,minecraft:sand,Sand,0 +12,1,minecraft:sand,Red Sand,0 +13,0,minecraft:gravel,Gravel,0 +14,0,minecraft:gold_ore,Gold Ore,0 +15,0,minecraft:iron_ore,Iron Ore,0 +16,0,minecraft:coal_ore,Coal Ore,0 +17,0,minecraft:log,Wood,0 +17,0,minecraft:log,Oak Wood,0 +17,1,minecraft:log,Spruce Wood,0 +17,2,minecraft:log,Birch Wood,0 +17,3,minecraft:log,Jungle Wood,0 +18,0,minecraft:leaves,Leaves,0 +18,0,minecraft:leaves,Oak Leaves,0 +18,1,minecraft:leaves,Spruce Leaves,0 +18,2,minecraft:leaves,Birch Leaves,0 +18,3,minecraft:leaves,Jungle Leaves,0 +19,0,minecraft:sponge,Sponge,0 +19,1,minecraft:sponge,We Sponge,0 +20,0,minecraft:glass,Glass,0 +21,0,minecraft:lapis_ore,Lapis Lazuli Ore,0 +22,0,minecraft:lapis_block,Lapis Lazuli Block,0 +23,0,minecraft:dispenser,Dispenser,2 +24,0,minecraft:sandstone,Sandstone,0 +24,1,minecraft:sandstone,Chiseled Sandstone,0 +24,2,minecraft:sandstone,Smooth Sandstone,0 +25,0,minecraft:noteblock,Note Block,2 +26,0,minecraft:bed,Bed,2 +27,0,minecraft:golden_rail,Powered Rail,2 +28,0,minecraft:detector_rail,Detector Rail,2 +29,0,minecraft:sticky_piston,Sticky Piston,2 +30,0,minecraft:web,Cobweb,0 +31,0,minecraft:tallgrass,Grass,0 +31,0,minecraft:tallgrass,Shrub,0 +31,1,minecraft:tallgrass,Tall Grass,0 +31,2,minecraft:tallgrass,Fern,0 +32,0,minecraft:deadbush,Dead Bush,0 +33,0,minecraft:piston,Piston,2 +34,0,minecraft:piston_head,Piston Extension,2 +35,0,minecraft:wool,Wool,0 +35,0,minecraft:wool,White Wool,0 +35,1,minecraft:wool,Orange Wool,0 +35,2,minecraft:wool,Magenta Wool,0 +35,3,minecraft:wool,Light Blue Wool,0 +35,4,minecraft:wool,Yellow Wool,0 +35,5,minecraft:wool,Lime Wool,0 +35,6,minecraft:wool,Pink Wool,0 +35,7,minecraft:wool,Gray Wool,0 +35,8,minecraft:wool,Light Gray Wool,0 +35,9,minecraft:wool,Cyan Wool,0 +35,10,minecraft:wool,Purple Wool,0 +35,11,minecraft:wool,Blue Wool,0 +35,12,minecraft:wool,Brown Wool,0 +35,13,minecraft:wool,Green Wool,0 +35,14,minecraft:wool,Red Wool,0 +35,15,minecraft:wool,Black Wool,0 +36,0,minecraft:piston_extension,Block moved by Piston,2 +37,0,minecraft:yellow_flower,Dandelion,0 +38,0,minecraft:red_flower,Poppy,2 +38,1,minecraft:red_flower,Blue Orchid,2 +38,2,minecraft:red_flower,Allium,2 +38,3,minecraft:red_flower,Azure Bluet,2 +38,4,minecraft:red_flower,Red Tulip,2 +38,5,minecraft:red_flower,Orange Tulip,2 +38,6,minecraft:red_flower,White Tulip,2 +38,7,minecraft:red_flower,Pink Tulip,2 +38,8,minecraft:red_flower,Oxeye Daisy,0 +39,0,minecraft:brown_mushroom,Brown Mushroom,2 +40,0,minecraft:red_mushroom,Red Mushroom,2 +41,0,minecraft:gold_block,Block of Gold,0 +42,0,minecraft:iron_block,Block of Iron,0 +43,0,minecraft:double_stone_slab,Double Stone Slab,0 +43,1,minecraft:double_stone_slab,Double Sandstone Slab,0 +43,2,minecraft:double_stone_slab,Double Wooden Slab,0 +43,3,minecraft:double_stone_slab,Double Cobblestone Slab,0 +43,4,minecraft:double_stone_slab,Double Bricks Slab,0 +43,5,minecraft:double_stone_slab,Double Stone Brick Slab,0 +43,6,minecraft:double_stone_slab,Double Nether Brick Slab,0 +43,7,minecraft:double_stone_slab,Double Quartz Slab,0 +43,8,minecraft:double_stone_slab,Smooth Double Stone Slab,0 +43,9,minecraft:double_stone_slab,Smooth Double Sandstone Slab,0 +43,15,minecraft:double_stone_slab,Tile Double Quartz Slab,0 +44,0,minecraft:stone_slab,Stone Slab,0 +44,1,minecraft:stone_slab,Sandstone Slab,0 +44,2,minecraft:stone_slab,Wooden Slab,0 +44,3,minecraft:stone_slab,Cobblestone Slab,0 +44,4,minecraft:stone_slab,Bricks Slab,0 +44,5,minecraft:stone_slab,Stone Brick Slab,0 +44,6,minecraft:stone_slab,Nether Brick Slab,0 +44,7,minecraft:stone_slab,Quartz Slab,0 +44,8,minecraft:stone_slab,Upper Stone Slab,0 +44,9,minecraft:stone_slab,Upper Sandstone Slab,0 +44,10,minecraft:stone_slab,Upper Wooden Slab,0 +44,11,minecraft:stone_slab,Upper Cobblestone Slab,0 +44,12,minecraft:stone_slab,Upper Bricks Slab,0 +44,13,minecraft:stone_slab,Upper Stone Brick Slab,0 +44,14,minecraft:stone_slab,Upper Nether Brick Slab,0 +44,15,minecraft:stone_slab,Upper Quartz Slab,0 +45,0,minecraft:brick_block,Bricks,0 +46,0,minecraft:tnt,TNT,1 +47,0,minecraft:bookshelf,Bookshelf,0 +48,0,minecraft:mossy_cobblestone,Mossy Cobblestone,0 +49,0,minecraft:obsidian,Obsidian,0 +50,5,minecraft:torch,Torch,2 +50,1,minecraft:torch,Torch East,2 +50,2,minecraft:torch,Torch West,2 +50,3,minecraft:torch,Torch South,2 +50,4,minecraft:torch,Torch North,2 +51,0,minecraft:fire,Fire,2 +52,0,minecraft:mob_spawner,Monster Spawner,2 +53,0,minecraft:oak_stairs,Oak Wood Stairs,2 +54,0,minecraft:chest,Chest,2 +55,0,minecraft:redstone_wire,Redstone Wire,2 +56,0,minecraft:diamond_ore,Diamond Ore,0 +57,0,minecraft:diamond_block,Block of Diamond,0 +58,0,minecraft:crafting_table,Crafting Table,0 +59,0,minecraft:wheat,Wheat,2 +60,0,minecraft:farmland,Farmland,2 +60,7,minecraft:farmland,Wet Farmland,2 +61,0,minecraft:furnace,Furnace,1 +62,0,minecraft:lit_furnace,Burning Furnace,2 +63,0,minecraft:standing_sign,Sign Post,2 +63,0,minecraft:standing_sign,Sign Post (S),2 +63,1,minecraft:standing_sign,Sign Post (S-SW),2 +63,2,minecraft:standing_sign,Sign Post (SW),2 +63,3,minecraft:standing_sign,Sign Post (W-SW),2 +63,4,minecraft:standing_sign,Sign Post (W),2 +63,5,minecraft:standing_sign,Sign Post (W-NW),2 +63,6,minecraft:standing_sign,Sign Post (NW),2 +63,7,minecraft:standing_sign,Sign Post (N-NW),2 +63,8,minecraft:standing_sign,Sign Post (N),2 +63,9,minecraft:standing_sign,Sign Post (N-NE),2 +63,10,minecraft:standing_sign,Sign Post (NE),2 +63,11,minecraft:standing_sign,Sign Post (E-NE),2 +63,12,minecraft:standing_sign,Sign Post (E),2 +63,13,minecraft:standing_sign,Sign Post (E-SE),2 +63,14,minecraft:standing_sign,Sign Post (SE),2 +63,15,minecraft:standing_sign,Sign Post (S-SE),2 +64,0,minecraft:wooden_door,Wooden Door,2 +64,0,minecraft:wooden_door,Lower Wooden Door (Closed E),2 +64,1,minecraft:wooden_door,Lower Wooden Door (Closed S),2 +64,2,minecraft:wooden_door,Lower Wooden Door (Closed W),2 +64,3,minecraft:wooden_door,Lower Wooden Door (Closed N),2 +64,4,minecraft:wooden_door,Lower Wooden Door (Open E),2 +64,5,minecraft:wooden_door,Lower Wooden Door (Open S),2 +64,6,minecraft:wooden_door,Lower Wooden Door (Open W),2 +64,7,minecraft:wooden_door,Lower Wooden Door (Open N),2 +64,8,minecraft:wooden_door,Upper Wooden Door (Unpowered Left),2 +64,9,minecraft:wooden_door,Upper Wooden Door (Unpowered Right),2 +64,10,minecraft:wooden_door,Upper Wooden Door (Powered Left),2 +64,11,minecraft:wooden_door,Upper Wooden Door (Powered Right),2 +65,0,minecraft:ladder,Ladders,2 +66,0,minecraft:rail,Rail,2 +67,0,minecraft:stone_stairs,Cobblestone Stairs,2 +68,2,minecraft:wall_sign,Wall Sign,2 +68,2,minecraft:wall_sign,Wall Sign (N),2 +68,3,minecraft:wall_sign,Wall Sign (S),2 +68,4,minecraft:wall_sign,Wall Sign (W),2 +68,5,minecraft:wall_sign,Wall Sign (E),2 +69,0,minecraft:lever,Lever,2 +70,0,minecraft:stone_pressure_plate,Stone Pressure Plate,2 +71,0,minecraft:iron_door,Iron Door,2 +71,0,minecraft:iron_door,Lower Iron Door (Closed E),2 +71,1,minecraft:iron_door,Lower Iron Door (Closed S),2 +71,2,minecraft:iron_door,Lower Iron Door (Closed W),2 +71,3,minecraft:iron_door,Lower Iron Door (Closed N),2 +71,4,minecraft:iron_door,Lower Iron Door (Open E),2 +71,5,minecraft:iron_door,Lower Iron Door (Open S),2 +71,6,minecraft:iron_door,Lower Iron Door (Open W),2 +71,7,minecraft:iron_door,Lower Iron Door (Open N),2 +71,8,minecraft:iron_door,Upper Iron Door (Unpowered Left),2 +71,9,minecraft:iron_door,Upper Iron Door (Unpowered Right),2 +71,10,minecraft:iron_door,Upper Iron Door (Powered Left),2 +71,11,minecraft:iron_door,Upper Iron Door (Powered Right),2 +72,0,minecraft:wooden_pressure_plate,Wooden Pressure Plate,2 +73,0,minecraft:redstone_ore,Redstone Ore,0 +74,0,minecraft:lit_redstone_ore,Glowing Redstone Ore,0 +75,5,minecraft:unlit_redstone_torch,Redstone Torch (inactive),2 +75,1,minecraft:unlit_redstone_torch,Redstone Torch East (inactive),2 +75,2,minecraft:unlit_redstone_torch,Redstone Torch West (inactive),2 +75,3,minecraft:unlit_redstone_torch,Redstone Torch South (inactive),2 +75,4,minecraft:unlit_redstone_torch,Redstone Torch East (inactive),2 +76,5,minecraft:redstone_torch,Redstone Torch (active),2 +76,1,minecraft:unlit_redstone_torch,Redstone Torch East (active),2 +76,2,minecraft:unlit_redstone_torch,Redstone Torch West (active),2 +76,3,minecraft:unlit_redstone_torch,Redstone Torch South (active),2 +76,4,minecraft:unlit_redstone_torch,Redstone Torch East (active),2 +77,0,minecraft:stone_button,Stone Button,2 +78,0,minecraft:snow_layer,Snow,2 +79,0,minecraft:ice,Ice,1 +80,0,minecraft:snow,Snow,0 +81,0,minecraft:cactus,Cactus,2 +82,0,minecraft:clay,Clay,0 +83,0,minecraft:reeds,Sugar Cane,1 +84,0,minecraft:jukebox,Jukebox,2 +85,0,minecraft:fence,Fence,0 +86,0,minecraft:pumpkin,Pumpkin,0 +87,0,minecraft:netherrack,Netherrack,0 +88,0,minecraft:soul_sand,Soul Sand,0 +89,0,minecraft:glowstone,Glowstone,0 +90,0,minecraft:portal,Nether Portal,2 +91,0,minecraft:lit_pumpkin,Jack 'o' Lantern,0 +92,0,minecraft:cake,Cake Block,0 +93,0,minecraft:unpowered_repeater,Redstone Repeater (inactive),2 +94,0,minecraft:powered_repeater,Redstone Repeater (active),2 +95,0,minecraft:stained_glass,Stained Glass,0 +95,0,minecraft:stained_glass,White Stained Glass,0 +95,1,minecraft:stained_glass,Orange Stained Glass,0 +95,2,minecraft:stained_glass,Magenta Stained Glass,0 +95,3,minecraft:stained_glass,Light Blue Stained Glass,0 +95,4,minecraft:stained_glass,Yellow Stained Glass,0 +95,5,minecraft:stained_glass,Lime Stained Glass,0 +95,6,minecraft:stained_glass,Pink Stained Glass,0 +95,7,minecraft:stained_glass,Gray Stained Glass,0 +95,8,minecraft:stained_glass,Light Gray Stained Glass,0 +95,9,minecraft:stained_glass,Cyan Stained Glass,0 +95,10,minecraft:stained_glass,Purple Stained Glass,0 +95,11,minecraft:stained_glass,Blue Stained Glass,0 +95,12,minecraft:stained_glass,Brown Stained Glass,0 +95,13,minecraft:stained_glass,Green Stained Glass,0 +95,14,minecraft:stained_glass,Red Stained Glass,0 +95,15,minecraft:stained_glass,Black Stained Glass,0 +96,0,minecraft:trapdoor,Trapdoor,2 +97,0,minecraft:monster_egg,Monster Egg,1 +97,0,minecraft:monster_egg,Stone Monster Egg,1 +97,1,minecraft:monster_egg,Cobblestone Monster Egg,1 +97,2,minecraft:monster_egg,Stone Brick Monster Egg,1 +97,3,minecraft:monster_egg,Mossy Stone Brick Monster Egg,1 +97,4,minecraft:monster_egg,Cracked Stone Brick Monster Egg,1 +97,5,minecraft:monster_egg,Chiseled Stone Brick Monster Egg,1 +98,0,minecraft:stonebrick,Stone Bricks,0 +98,1,minecraft:stonebrick,Mossy Stone Brick,0 +98,2,minecraft:stonebrick,Cracked Stone Brick,0 +98,3,minecraft:stonebrick,Chiseled Stone Brick,0 +99,14,minecraft:brown_mushroom_block,Huge Brown Mushroom,0 +100,14,minecraft:red_mushroom_block,Huge Red Mushroom,0 +101,0,minecraft:iron_bars,Iron Bars,0 +102,0,minecraft:glass_pane,Glass Pane,0 +103,0,minecraft:melon_block,Melon,0 +104,0,minecraft:pumpkin_stem,Pumpkin Stem,2 +105,0,minecraft:melon_stem,Melon Stem,2 +106,0,minecraft:vine,Vines,2 +107,0,minecraft:fence_gate,Fence Gate,2 +108,0,minecraft:brick_stairs,Brick Stairs,2 +109,0,minecraft:stone_brick_stairs,Stone Brick Stairs,2 +110,0,minecraft:mycelium,Mycelium,0 +111,0,minecraft:waterlily,Lily Pad,2 +112,0,minecraft:nether_brick,Nether Brick,0 +113,0,minecraft:nether_brick_fence,Nether Brick Fence,0 +114,0,minecraft:nether_brick_stairs,Nether Brick Stairs,2 +115,0,minecraft:nether_wart,Nether Wart,2 +116,0,minecraft:enchanting_table,Enchantment Table,2 +117,0,minecraft:brewing_stand,Brewing Stand,2 +118,0,minecraft:cauldron,Cauldron,2 +119,0,minecraft:end_portal,End Portal,2 +120,0,minecraft:end_portal_frame,End Portal Block,1 +121,0,minecraft:end_stone,End Stone,0 +122,0,minecraft:dragon_egg,Dragon Egg,0 +123,0,minecraft:redstone_lamp,Redstone Lamp,0 +124,0,minecraft:lit_redstone_lamp,Redstone Lamp (active),2 +125,0,minecraft:double_wooden_slab,Wooden Double Slab,0 +125,0,minecraft:double_wooden_slab,Double Oak Wood Slab,0 +125,1,minecraft:double_wooden_slab,Double Spruce Wood Slab,0 +125,2,minecraft:double_wooden_slab,Double Birch Wood Slab,0 +125,3,minecraft:double_wooden_slab,Double Jungle Wood Slab,0 +125,4,minecraft:double_wooden_slab,Double Acacia Wood Slab,0 +125,5,minecraft:double_wooden_slab,Double Dark Oak Wood Slab,0 +126,0,minecraft:wooden_slab,Wooden Slab,0 +126,0,minecraft:wooden_slab,Oak Wood Slab,0 +126,1,minecraft:wooden_slab,Spruce Wood Slab,0 +126,2,minecraft:wooden_slab,Birch Wood Slab,0 +126,3,minecraft:wooden_slab,Jungle Wood Slab,0 +126,4,minecraft:wooden_slab,Acacia Wood Slab,0 +126,5,minecraft:wooden_slab,Dark Oak Wood Slab,0 +126,8,minecraft:wooden_slab,Upper Wooden Slab,0 +126,8,minecraft:wooden_slab,Upper Oak Wood Slab,0 +126,9,minecraft:wooden_slab,Upper Spruce Wood Slab,0 +126,10,minecraft:wooden_slab,Upper Birch Wood Slab,0 +126,11,minecraft:wooden_slab,Upper Jungle Wood Slab,0 +126,12,minecraft:wooden_slab,Upper Acacia Wood Slab,0 +126,13,minecraft:wooden_slab,Upper Dark Oak Wood Slab,0 +127,0,minecraft:cocoa,Cocoa,2 +128,0,minecraft:sandstone_stairs,Sandstone Stairs,2 +129,0,minecraft:emerald_ore,Emerald Ore,0 +130,0,minecraft:ender_chest,Ender Chest,2 +131,0,minecraft:tripwire_hook,Tripwire Hook,2 +132,0,minecraft:tripwire,Tripwire,2 +133,0,minecraft:emerald_block,Block of Emerald,0 +134,0,minecraft:spruce_stairs,Spruce Wood Stairs,2 +135,0,minecraft:birch_stairs,Birch Wood Stairs,2 +136,0,minecraft:jungle_stairs,Jungle Wood Stairs,2 +137,0,minecraft:command_block,Command Block,2 +138,0,minecraft:beacon,Beacon,2 +139,0,minecraft:cobblestone_wall,Cobblestone Wall,0 +139,1,minecraft:cobblestone_wall,Mossy Cobblestone Wall,0 +140,0,minecraft:flower_pot,Flower Pot,2 +141,0,minecraft:carrots,Carrots,2 +142,0,minecraft:potatoes,Potatoes,2 +143,0,minecraft:wooden_button,Wooden Button,2 +144,0,minecraft:skull,Mob Head,2 +145,0,minecraft:anvil,Anvil,2 +146,0,minecraft:trapped_chest,Trapped Chest,2 +147,0,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light),2 +148,0,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy),2 +149,0,minecraft:unpowered_comparator,Redstone Comparator (inactive & active),2 +150,0,,(unused),2 +151,0,minecraft:daylight_detector,Daylight Sensor,2 +152,0,minecraft:redstone_block,Block of Redstone,0 +153,0,minecraft:quartz_ore,Nether Quartz Ore,0 +154,0,minecraft:hopper,Hopper,2 +155,0,minecraft:quartz_block,Block of Quartz,0 +156,0,minecraft:quartz_stairs,Quartz Stairs,2 +157,0,minecraft:activator_rail,Activator Rail,2 +158,0,minecraft:dropper,Dropper,2 +159,0,minecraft:stained_hardened_clay,Stained Clay,0 +159,0,minecraft:stained_hardened_clay,White Hardened Clay,0 +159,1,minecraft:stained_hardened_clay,Orange Hardened Clay,0 +159,2,minecraft:stained_hardened_clay,Magenta Hardened Clay,0 +159,3,minecraft:stained_hardened_clay,Light Blue Hardened Clay,0 +159,4,minecraft:stained_hardened_clay,Yellow Hardened Clay,0 +159,5,minecraft:stained_hardened_clay,Lime Hardened Clay,0 +159,6,minecraft:stained_hardened_clay,Pink Hardened Clay,0 +159,7,minecraft:stained_hardened_clay,Gray Hardened Clay,0 +159,8,minecraft:stained_hardened_clay,Light Gray Hardened Clay,0 +159,9,minecraft:stained_hardened_clay,Cyan Hardened Clay,0 +159,10,minecraft:stained_hardened_clay,Purple Hardened Clay,0 +159,11,minecraft:stained_hardened_clay,Blue Hardened Clay,0 +159,12,minecraft:stained_hardened_clay,Brown Hardened Clay,0 +159,13,minecraft:stained_hardened_clay,Green Hardened Clay,0 +159,14,minecraft:stained_hardened_clay,Red Hardened Clay,0 +159,15,minecraft:stained_hardened_clay,Black Hardened Clay,0 +160,0,minecraft:stained_glass_pane,Stained Glass Pane,0 +160,0,minecraft:stained_glass_pane,White Stained Glass Pane,1 +160,1,minecraft:stained_glass_pane,Orange Stained Glass Pane,2 +160,2,minecraft:stained_glass_pane,Magenta Stained Glass Pane,3 +160,3,minecraft:stained_glass_pane,Light Blue Stained Glass Pane,4 +160,4,minecraft:stained_glass_pane,Yellow Stained Glass Pane,5 +160,5,minecraft:stained_glass_pane,Lime Stained Glass Pane,6 +160,6,minecraft:stained_glass_pane,Pink Stained Glass Pane,7 +160,7,minecraft:stained_glass_pane,Gray Stained Glass Pane,8 +160,8,minecraft:stained_glass_pane,Light Gray Stained Glass Pane,9 +160,9,minecraft:stained_glass_pane,Cyan Stained Glass Pane,10 +160,10,minecraft:stained_glass_pane,Purple Stained Glass Pane,11 +160,11,minecraft:stained_glass_pane,Blue Stained Glass Pane,12 +160,12,minecraft:stained_glass_pane,Brown Stained Glass Pane,13 +160,13,minecraft:stained_glass_pane,Green Stained Glass Pane,14 +160,14,minecraft:stained_glass_pane,Red Stained Glass Pane,15 +160,15,minecraft:stained_glass_pane,Black Stained Glass Pane,16 +161,0,minecraft:leaves2,Acacia Leaves,0 +161,1,minecraft:leaves3,Dark Oak Leaves,0 +162,0,minecraft:log2,Acacia Wood Slab,0 +162,1,minecraft:log2,Dark Oak Wood,0 +163,0,minecraft:acacia_stairs,Acacia Wood Stairs,2 +164,0,minecraft:dark_oak_stairs,Dark Oak Wood Stairs,2 +170,0,minecraft:hay_block,Hay Block,0 +171,0,minecraft:carpet,Carpet,0 +171,0,minecraft:carpet,White Carpet,0 +171,1,minecraft:carpet,Orange Carpet,0 +171,2,minecraft:carpet,Magenta Carpet,0 +171,3,minecraft:carpet,Light Blue Carpet,0 +171,4,minecraft:carpet,Yellow Carpet,0 +171,5,minecraft:carpet,Lime Carpet,0 +171,6,minecraft:carpet,Pink Carpet,0 +171,7,minecraft:carpet,Gray Carpet,0 +171,8,minecraft:carpet,Light Gray Carpet,0 +171,9,minecraft:carpet,Cyan Carpet,0 +171,10,minecraft:carpet,Purple Carpet,0 +171,11,minecraft:carpet,Blue Carpet,0 +171,12,minecraft:carpet,Brown Carpet,0 +171,13,minecraft:carpet,Green Carpet,0 +171,14,minecraft:carpet,Red Carpet,0 +171,15,minecraft:carpet,Black Carpet,0 +172,0,minecraft:hardened_clay,Hardened Clay,0 +172,0,minecraft:hardened_clay,White Hardened Clay,0 +172,1,minecraft:hardened_clay,Orange Hardened Clay,0 +172,2,minecraft:hardened_clay,Magenta Hardened Clay,0 +172,3,minecraft:hardened_clay,Light Blue Hardened Clay,0 +172,4,minecraft:hardened_clay,Yellow Hardened Clay,0 +172,5,minecraft:hardened_clay,Lime Hardened Clay,0 +172,6,minecraft:hardened_clay,Pink Hardened Clay,0 +172,7,minecraft:hardened_clay,Gray Hardened Clay,0 +172,8,minecraft:hardened_clay,Light Gray Hardened Clay,0 +172,9,minecraft:hardened_clay,Cyan Hardened Clay,0 +172,10,minecraft:hardened_clay,Purple Hardened Clay,0 +172,11,minecraft:hardened_clay,Blue Hardened Clay,0 +172,12,minecraft:hardened_clay,Brown Hardened Clay,0 +172,13,minecraft:hardened_clay,Green Hardened Clay,0 +172,14,minecraft:hardened_clay,Red Hardened Clay,0 +172,15,minecraft:hardened_clay,Black Hardened Clay,0 +173,0,minecraft:coal_block,Block of Coal,0 +174,0,minecraft:packed_ice,Packed Ice,0 +175,0,minecraft:double_plant,Large Flowers,0 +175,0,minecraft:double_plant,Sunflower,2 +175,1,minecraft:double_plant,Lilac,2 +175,2,minecraft:double_plant,Double Tallgrass,2 +175,3,minecraft:double_plant,Large Fern,2 +175,4,minecraft:double_plant,Rose Bush,2 +175,5,minecraft:double_plant,Peony,2 From 637e7fdbe8a4ba7fe15d722d858ef01baed00a55 Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 1 May 2017 21:11:35 +0200 Subject: [PATCH 07/12] Cleanup, preparing for handing code in Changes in program: - Character is no longer an enum, but a class - BasicBlock constructors are no longer public - To get a block, use the static get() or userBlock() methods of the BasicBlock class - blocks.csv is rather massively extended - Program is prepared to accept any new block without change in program code (you have to extend only the blocks.csv) Changes in output: - The "frame" of the stairs is now in same matterial as the topBlock (Floor.prepareStairs) - The ceiling of the floor uses the external_character instead of character (still uses Character.getTopBlock) - Borders of namespaces changed from stone bricks to stone brick slabs (signs moved accordingly) --- .../toolchain/rendering/model/BasicBlock.java | 210 +++-- .../rendering/model/building/Cellar.java | 8 +- .../rendering/model/building/Floor.java | 57 +- .../rendering/model/building/Garden.java | 32 +- .../rendering/model/building/Ground.java | 46 +- .../rendering/model/primitive/Banner.java | 2 +- .../rendering/model/primitive/Boxel.java | 4 +- .../rendering/model/primitive/Door.java | 4 +- .../rendering/model/primitive/SignPost.java | 2 +- .../rendering/model/primitive/WallSign.java | 2 +- .../toolchain/rendering/util/Block.java | 33 - .../toolchain/rendering/util/Character.java | 45 +- .../src/main/resources/blocks.csv | 802 ++++++++++-------- 13 files changed, 677 insertions(+), 570 deletions(-) delete mode 100644 sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java index e1c77bef..d8a7afac 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java @@ -5,117 +5,188 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; -import java.util.Map; -import codemetropolis.toolchain.rendering.util.Block; -import codemetropolis.toolchain.rendering.util.Character; import codemetropolis.toolchain.rendering.util.Colour; import codemetropolis.toolchain.rendering.RenderingExecutor; -public class BasicBlock { - - public static final BasicBlock NonBlock; - public static final Map idToName; - public static final Map idToHumanReadableName; - public static final Map nameToId; - public static final Map humanReadableNameToId; - public static final Map humanReadableNameToBlock; - - static { - NonBlock = new BasicBlock((short)-1 ); - idToName = new HashMap(); - idToHumanReadableName = new HashMap(); - nameToId = new HashMap(); - humanReadableNameToId = new HashMap(); - humanReadableNameToBlock = new HashMap(); +public class BasicBlock{ + + public static final BasicBlock NonBlock; + protected static final HashMap> idToBlock; + protected static final HashMap> nameToBlock; + protected static final HashMap humanReadableNameToBlock; + protected static final HashMap used; + + static{ + NonBlock = new BasicBlock((short)-1, 0, "NonBlock", "A non-existant block", (short)2); + idToBlock = new HashMap>(); + nameToBlock = new HashMap>(); + humanReadableNameToBlock = new HashMap(); + used = new HashMap(); InputStream csvStream = RenderingExecutor.class.getClassLoader().getResourceAsStream("blocks.csv"); - try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(csvStream, "UTF-8"))) { + try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(csvStream, "UTF-8"))){ String line; - while ((line = bufferedReader.readLine()) != null) { + while ((line = bufferedReader.readLine()) != null){ String[] blockInfo = line.split(","); - if (!idToName.containsKey(Short.parseShort(blockInfo[0]))){ - idToName.put(Short.parseShort(blockInfo[0]), blockInfo[2]); - idToHumanReadableName.put(Short.parseShort(blockInfo[0]), blockInfo[3]); - nameToId.put(blockInfo[2], Short.parseShort(blockInfo[0])); - } - humanReadableNameToBlock.put(blockInfo[3].toLowerCase(), - new Block( - Short.parseShort(blockInfo[0]), - Short.parseShort(blockInfo[1]), - blockInfo[2], - blockInfo[3], - Short.parseShort(blockInfo[4]) - ) + BasicBlock block = new BasicBlock( + Short.parseShort(blockInfo[0]), + Short.parseShort(blockInfo[1]), + blockInfo[2], + blockInfo[3], + Short.parseShort(blockInfo[4]) ); + + /* + * In the next two cases, if the the id/name and the data combo + * is already present, it'll overwrite the previous data This is + * intended behaviour, because there are sometimes simplified + * human readable block names if there are too many variations, + * so user doesn't have to specify. + */ + + // Adding to idToBlock + HashMap idBlock = idToBlock.get(block.id); + if (idBlock == null){ + idBlock = new HashMap(); + idToBlock.put(block.id, idBlock); + } + idBlock.put(block.data, block); + + // Adding to nameToBlock + HashMap nameBlock = nameToBlock.get(block.name); + if (nameBlock == null){ + nameBlock = new HashMap(); + nameToBlock.put(block.name, nameBlock); + } + nameBlock.put(block.data, block); + + humanReadableNameToBlock.put(block.getHumanReadableName().toLowerCase(), block); + // System.out.println(block); } - Character.init(humanReadableNameToBlock); - } catch (IOException e) { + } + catch (IOException e){ e.printStackTrace(); } } - private short id; - private int data; + private short id; + private int data; + private String name; + private String humanReadableName; + private short hazardous; - public BasicBlock(short id) { - this(id, 0); + + public BasicBlock(BasicBlock original){ + this.id = original.id; + this.data = original.data; + this.name = original.name; + this.humanReadableName = original.humanReadableName; + this.hazardous = original.hazardous; } - - public BasicBlock(short id, int data) { + + protected BasicBlock(short id, int data, String name, String humanReadableName, short hazardous){ this.id = id; this.data = data; + this.name = name; + this.humanReadableName = humanReadableName; + this.hazardous = hazardous; } - public BasicBlock(short id, Colour clr){ - this.id = id; - this.data = clr.getValue(); + // Return block + // String is the human readable name + // This method is used on user-inputed strings and it checks if it's allowed + public static BasicBlock userBlock(String name, BasicBlock fallback){ + BasicBlock block = humanReadableNameToBlock.get(name); + if (!used.containsKey(name)){ + used.put(name, true); + if (block == null){ + System.out.println("ERROR\tBlock \"" + name + "\" was not found!"); + System.out.println("\tInstead, using \"" + fallback.getHumanReadableName() + "\"."); + } + else{ + switch (block.getHazardous()){ + case 2: + System.out.println("ILLEGAL\tUse of \"" + block.getHumanReadableName() + "\" is restricted!"); + System.out.println("\tFalling back to \"" + fallback.getHumanReadableName() + "\"."); + break; + case 1: + System.out.println("WARNING\tUsing \"" + block.getHumanReadableName() + "\" DANGEROUS block."); + break; + case 0: + System.out.println("SUCCESS\tUsing \"" + block.getHumanReadableName() + "\" block."); + break; + } + } + } + return (block != null && block.getHazardous() != 2) ? block : fallback; } - public BasicBlock(String name) { - this(nameToId.get(name), 0); + // Return block + // String is the in-game name + public static BasicBlock get(String name, int data){ + BasicBlock ret = nameToBlock.get(name).get(data); + if (ret == null) + System.out.println("NullPointerException incoming!\nBlock name: " + name + ", data: " + data); + return ret; } - public BasicBlock(String name, int data) { - this(nameToId.get(name), data); + public static BasicBlock get(String name, Colour clr){ + return get(name, clr.getValue()); } - public BasicBlock(String name, Colour clr){ - this(nameToId.get(name), clr.getValue()); + public static BasicBlock get(String name){ + return get(name, 0); } - public BasicBlock(BasicBlock original) { - this.id = original.id; - this.data = original.data; + // Return block + // Int is the ID + public static BasicBlock get(short id, int data){ + BasicBlock ret = idToBlock.get(id).get(data); + if (ret == null) + System.out.println("NullPointerException incoming!\nBlock id: " + id + ", data: " + data); + return ret; } - public String getName() { - return idToName.get(id); + public static BasicBlock get(short id, Colour clr){ + return get(id, clr.getValue()); } - public String getHumanReadableName() { - return idToHumanReadableName.get(id); + public static BasicBlock get(short id){ + return get(id, 0); } - - public short getId() { + + public short getId(){ return id; } - - public int getData() { + + public int getData(){ return data; } - + + public String getName(){ + return this.name; + } + + public String getHumanReadableName(){ + return this.humanReadableName; + } + + public short getHazardous(){ + return this.hazardous; + } + @Override - public int hashCode() { + public int hashCode(){ final int prime = 31; int result = 1; result = prime * result + data; result = prime * result + id; return result; } - + @Override - public boolean equals(Object obj) { + public boolean equals(Object obj){ if (this == obj) return true; if (obj == null) @@ -129,10 +200,11 @@ public boolean equals(Object obj) { return false; return true; } - + @Override - public String toString() { - return getHumanReadableName() + (data != 0 ? data : ""); + public String toString(){ + return "Block object: \"" + getHumanReadableName() + "\" (id: " + id + ", name: " + getName() + ", data: " + data + ")"; + // return getHumanReadableName() + (data != 0 ? data : ""); } } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Cellar.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Cellar.java index 1da38d20..cdfa7cf2 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Cellar.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Cellar.java @@ -22,16 +22,16 @@ public Cellar(Buildable innerBuildable) throws BuildingTypeMismatchException { new SolidBox( position.translate( new Point( 1, 1, 1 ) ), size.translate( new Point( -2, -2, -2 ) ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air" ) } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air" ) } } } ), Orientation.NearX ) ); primitives.add( new SolidBox( position.translate( new Point( center.getX() - 3, size.getY() + 1, center.getZ() - 3 ) ), new Point( 7, 1, 7 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air" ) } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air" ) } } } ), Orientation.NearX ) ); } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java index 320bdd36..d7e0e162 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Floor.java @@ -32,16 +32,16 @@ public Floor(Buildable innerBuildable) throws BuildingTypeMismatchException { } protected void prepareDoor() { - BasicBlock _red = new BasicBlock( "minecraft:redstone_block" ); - BasicBlock _lgt = new BasicBlock( "minecraft:lit_redstone_lamp" ); - BasicBlock _rwl = new BasicBlock( "minecraft:wool", Colour.RED); - BasicBlock _gwl = new BasicBlock( "minecraft:wool", Colour.LIME); - BasicBlock _bwl = new BasicBlock( "minecraft:wool", Colour.LIGHT_BLUE); - BasicBlock _ywl = new BasicBlock( "minecraft:wool", Colour.YELLOW); + BasicBlock _red = BasicBlock.get( "minecraft:redstone_block" ); + BasicBlock _lgt = BasicBlock.get( "minecraft:lit_redstone_lamp" ); + BasicBlock _rwl = BasicBlock.get( "minecraft:wool", Colour.RED); + BasicBlock _gwl = BasicBlock.get( "minecraft:wool", Colour.LIME); + BasicBlock _bwl = BasicBlock.get( "minecraft:wool", Colour.LIGHT_BLUE); + BasicBlock _ywl = BasicBlock.get( "minecraft:wool", Colour.YELLOW); primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, 0 ) ), new Point( 3, 4, 1 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -57,7 +57,7 @@ protected void prepareDoor() { primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, size.getZ() - 1 ) ), new Point( 3, 4, 1 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -73,7 +73,7 @@ protected void prepareDoor() { primitives.add( new SolidBox( position.translate( new Point( 0, 0, center.getZ()-1 ) ), new Point( 1, 4, 3 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -89,7 +89,7 @@ protected void prepareDoor() { primitives.add( new SolidBox( position.translate( new Point( size.getX()-1, 0, center.getZ() - 1 ) ), new Point( 1, 4, 3 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -110,9 +110,14 @@ protected void prepareDoor() { } protected void prepareStairs() { - BasicBlock _air = new BasicBlock( (short) 0 ); - BasicBlock _str = new BasicBlock( (short) 1 ); - BasicBlock _cre = new BasicBlock( (short) 85 ); + BasicBlock _air = BasicBlock.get( (short) 0); + BasicBlock _str = BasicBlock.get( (short) 1); + BasicBlock _cre = BasicBlock.get( (short) 85); + + // Use the topBlock, since that's (usually) a fence too + if(innerBuildable.hasAttribute("external_character")) + _cre = Character.getTopBlock(innerBuildable.getAttributeValue("external_character").toLowerCase(), _cre); + primitives.add( new SolidBox( position.translate( new Point( center.getX() - 2, 0, center.getZ() - 2 ) ), @@ -177,7 +182,7 @@ protected void prepareStairs() { { _air, _air, _air, _air, _air } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:fence" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { _cre } } } ), Orientation.NearY ) ); } @@ -189,30 +194,28 @@ protected void prepareWalls() { BasicBlock _sideBlock; BasicBlock _strcBlock; - if(innerBuildable.hasAttribute( "character" ) && BasicBlock.humanReadableNameToBlock.containsKey(innerBuildable.getAttributeValue("character").toLowerCase())) - { + if(innerBuildable.hasAttribute( "character" )){ String str = innerBuildable.getAttributeValue("character").toLowerCase(); _sideBlock = Character.getBlock(str); - _topFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getTopBlock(str) } } } ); } else { - _sideBlock = new BasicBlock( "minecraft:wool", Colour.MAGENTA); - _topFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.MAGENTA) } } } ); + _sideBlock = BasicBlock.get( "minecraft:wool", Colour.MAGENTA); } - if(innerBuildable.hasAttribute( "external_character" ) && BasicBlock.humanReadableNameToBlock.containsKey(innerBuildable.getAttributeValue("external_character").toLowerCase())) - { + if(innerBuildable.hasAttribute( "external_character" )){ String str = innerBuildable.getAttributeValue("external_character").toLowerCase(); - _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); _strcBlock = Character.getBlock(str); + _topFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getTopBlock(str) } } } ); + _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); _stroke = new RepeationPattern( new BasicBlock[][][] { { { Character.getBlock(str) } } } ); } else { - _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.MAGENTA ) } } } ); - _strcBlock = new BasicBlock( "minecraft:wool", 10 ); - _stroke = new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:wool", Colour.BLACK ) } } } ); + _strcBlock = BasicBlock.get( "minecraft:wool", 10 ); + _topFill = new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:wool", Colour.MAGENTA) } } } ); + _bottomFill = new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:wool", Colour.MAGENTA ) } } } ); + _stroke = new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:wool", Colour.BLACK ) } } } ); } RandomPattern _fallbackPattern = new RandomPattern( new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.NonBlock } } } ) ); - _fallbackPattern.add( new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:fence" ) } } } ), .5 ); + _fallbackPattern.add( new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:fence" ) } } } ), .5 ); _sideFill = new RandomPattern( _fallbackPattern ); _sideFill.add( new RepeationPattern( @@ -318,7 +321,7 @@ private void prepareTorches( ) { private BasicBlock[] createTorchPattern(int number, int data) { BasicBlock[] pattern = null; - BasicBlock torch = new BasicBlock((short) 50, data); + BasicBlock torch = BasicBlock.get((short) 50, data); BasicBlock space = BasicBlock.NonBlock; switch(number) { diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Garden.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Garden.java index 88b163b9..c500b7c2 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Garden.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Garden.java @@ -26,24 +26,24 @@ public Garden(Buildable innerBuildable) throws BuildingTypeMismatchException { } private void prepareBase( ) { - BasicBlock _fnc = new BasicBlock( "minecraft:fence" ); - BasicBlock _sns = new BasicBlock( "minecraft:sandstone" ); + BasicBlock _fnc = BasicBlock.get( "minecraft:fence" ); + BasicBlock _sns = BasicBlock.get( "minecraft:sandstone" ); RandomPattern _flowers = new RandomPattern( new RepeationPattern( new BasicBlock[][][]{ { { BasicBlock.NonBlock } } } ) ); - RandomPattern _redOrYellow = new RandomPattern( new RepeationPattern( new BasicBlock[][][]{ { { new BasicBlock( "minecraft:yellow_flower" ) } } } ) ); - _redOrYellow.add(new RepeationPattern( new BasicBlock[][][]{ { { new BasicBlock( "minecraft:red_flower" ) } } } ), 0.5); + RandomPattern _redOrYellow = new RandomPattern( new RepeationPattern( new BasicBlock[][][]{ { { BasicBlock.get( "minecraft:yellow_flower" ) } } } ) ); + _redOrYellow.add(new RepeationPattern( new BasicBlock[][][]{ { { BasicBlock.get( "minecraft:red_flower" ) } } } ), 0.5); _flowers.add( _redOrYellow, innerBuildable.hasAttribute( "flower-ratio" ) ? Double.parseDouble( innerBuildable.getAttributeValue("flower-ratio") ) : 0 ); _flowers.add( - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:brown_mushroom" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:brown_mushroom" ) } } } ), innerBuildable.hasAttribute( "mushroom-ratio" ) ? Double.parseDouble( innerBuildable.getAttributeValue("mushroom-ratio") ) : 0 ); _flowers.add( - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:sapling" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:sapling" ) } } } ), innerBuildable.hasAttribute( "tree-ratio" ) ? Double.parseDouble( innerBuildable.getAttributeValue("tree-ratio") ) : 0 ); @@ -52,7 +52,7 @@ private void prepareBase( ) { position, new Point( size.getX(), 2, size.getZ() ), new YSplitPattern( 0, - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:grass" ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:grass" ) } } } ), _flowers ), new RepeationPattern( new BasicBlock[][][] @@ -67,15 +67,15 @@ position, new Point( size.getX(), 2, size.getZ() ), protected void prepareDoor( ) { - BasicBlock _fnc = new BasicBlock( "minecraft:fence" ); - BasicBlock _rwl = new BasicBlock( "minecraft:wool", 14 ); - BasicBlock _gwl = new BasicBlock( "minecraft:wool", 5 ); - BasicBlock _bwl = new BasicBlock( "minecraft:wool", 3 ); - BasicBlock _ywl = new BasicBlock( "minecraft:wool", 4 ); + BasicBlock _fnc = BasicBlock.get( "minecraft:fence" ); + BasicBlock _rwl = BasicBlock.get( "minecraft:wool", 14 ); + BasicBlock _gwl = BasicBlock.get( "minecraft:wool", 5 ); + BasicBlock _bwl = BasicBlock.get( "minecraft:wool", 3 ); + BasicBlock _ywl = BasicBlock.get( "minecraft:wool", 4 ); primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, 0 ) ), new Point( 3, 4, 1 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -91,7 +91,7 @@ protected void prepareDoor( ) primitives.add( new SolidBox( position.translate( new Point( center.getX() - 1, 0, size.getZ() - 1 ) ), new Point( 3, 4, 1 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -107,7 +107,7 @@ protected void prepareDoor( ) primitives.add( new SolidBox( position.translate( new Point( 0, 0, center.getZ()-1 ) ), new Point( 1, 4, 3 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { @@ -123,7 +123,7 @@ protected void prepareDoor( ) primitives.add( new SolidBox( position.translate( new Point( size.getX()-1, 0, center.getZ() - 1 ) ), new Point( 1, 4, 3 ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock( "minecraft:air", 2 ) } } } ), + new RepeationPattern( new BasicBlock[][][] { { { BasicBlock.get( "minecraft:air") } } } ), new RepeationPattern( new BasicBlock[][][] { diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java index 8090fccc..09be798b 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/building/Ground.java @@ -10,33 +10,39 @@ import codemetropolis.toolchain.rendering.model.primitive.SolidBox; import codemetropolis.toolchain.rendering.util.Orientation; -public class Ground extends Building { - - public Ground(Buildable innerBuildable) throws BuildingTypeMismatchException { +public class Ground extends Building{ + + public Ground(Buildable innerBuildable) throws BuildingTypeMismatchException{ super(innerBuildable); - - if ( innerBuildable.getType() != Type.GROUND ) + + if (innerBuildable.getType() != Type.GROUND) throw new BuildingTypeMismatchException(innerBuildable.getType(), getClass()); - + prepareBase(); prepareSigns(); } - private void prepareBase( ) { - primitives.add( - new SolidBox( - position, - new Point( size.getX(), 1, size.getZ() ), - new RepeationPattern( new BasicBlock[][][]{ { { new BasicBlock("minecraft:stone") } } } ), - new RepeationPattern( new BasicBlock[][][] { { { new BasicBlock("minecraft:stonebrick") } } } ), - Orientation.NearX ) ); + private void prepareBase(){ + primitives.add(new SolidBox(position, new Point(size.getX(), 1, size.getZ()), + new RepeationPattern(new BasicBlock[][][] { { { BasicBlock.get("minecraft:stone") } } }), + new RepeationPattern(new BasicBlock[][][] { { { BasicBlock.get("minecraft:stone_slab", 5) } } }), + Orientation.NearX) + ); } - private void prepareSigns( ) { - primitives.add(new SignPost(position.getX(), position.getY() + 1, position.getZ(), SignPost.Orientation.NORTHWEST, innerBuildable.getName())); - primitives.add(new SignPost(position.getX() + size.getX() - 1, position.getY() + 1, position.getZ(), SignPost.Orientation.NORTHEAST, innerBuildable.getName())); - primitives.add(new SignPost(position.getX(), position.getY() + 1, position.getZ() + size.getZ() - 1, SignPost.Orientation.SOUTHWEST, innerBuildable.getName())); - primitives.add(new SignPost(position.getX() + size.getX() - 1, position.getY() + 1, position.getZ() + size.getZ() - 1, SignPost.Orientation.SOUTHEAST, innerBuildable.getName())); + private void prepareSigns(){ + primitives.add(new SignPost(position.getX() + 1, position.getY() + 1, position.getZ() + 1, + SignPost.Orientation.NORTHWEST, innerBuildable.getName()) + ); + primitives.add(new SignPost(position.getX() + size.getX() - 2, position.getY() + 1, position.getZ() + 1, + SignPost.Orientation.NORTHEAST, innerBuildable.getName()) + ); + primitives.add(new SignPost(position.getX() + 1, position.getY() + 1, position.getZ() + size.getZ() - 2, + SignPost.Orientation.SOUTHWEST, innerBuildable.getName()) + ); + primitives.add(new SignPost(position.getX() + size.getX() - 2, position.getY() + 1, position.getZ() + size.getZ() - 2, + SignPost.Orientation.SOUTHEAST, innerBuildable.getName()) + ); } - + } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Banner.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Banner.java index f2a1dd13..aac50fc5 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Banner.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Banner.java @@ -41,7 +41,7 @@ public Banner(int x, int y, int z, Orientation orientation, String color) { @Override public int toCSVFile(File directory) { - new Boxel(new BasicBlock((short) 176, orientation.getValue()), position, color).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 176, orientation.getValue()), position, color).toCSVFile(directory); return 1; } @Override diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Boxel.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Boxel.java index 931fff2c..c7cb0842 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Boxel.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Boxel.java @@ -48,14 +48,14 @@ public void render(World world) { public String toCSV() { //if(block == BasicBlock.NonBlock) return null; - if(block.getId() == -1) return null; + if (block.getId() == -1) return null; return String.format("%d;%d;%d;%d;%d;%s", block.getId(), block.getData(), position.getX(), position.getY(), position.getZ(), (info == null || info.equals("") ? "NULL" : info)); } public static Boxel parseCSV(String csv) { String[] parts = csv.split(";"); return new Boxel( - new BasicBlock( + BasicBlock.get( Short.parseShort(parts[0]), Integer.parseInt(parts[1])), new Point( diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Door.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Door.java index ca210c5f..9a96ee9a 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Door.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/Door.java @@ -35,8 +35,8 @@ public Door(int x, int y, int z, Orientation orientation) { @Override public int toCSVFile(File directory) { - new Boxel(new BasicBlock((short) 64, orientation.getValue()), position).toCSVFile(directory); - new Boxel(new BasicBlock((short) 64, 8), new Point(position.getX(), position.getY() + 1, position.getZ())).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 64, orientation.getValue()), position).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 64, 8), new Point(position.getX(), position.getY() + 1, position.getZ())).toCSVFile(directory); return 2; } @Override diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/SignPost.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/SignPost.java index ad90f5e1..a7644aa7 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/SignPost.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/SignPost.java @@ -41,7 +41,7 @@ public SignPost(int x, int y, int z, Orientation orientation, String text) { @Override public int toCSVFile(File directory) { - new Boxel(new BasicBlock((short) 63, orientation.getValue()), position, text).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 63, orientation.getValue()), position, text).toCSVFile(directory); return 1; } @Override diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/WallSign.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/WallSign.java index 4c9b8921..259478e2 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/WallSign.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/primitive/WallSign.java @@ -41,7 +41,7 @@ public WallSign(Point position, Orientation orientation, String text) { @Override public int toCSVFile(File directory) { - new Boxel(new BasicBlock((short) 68, orientation.getValue()), position, text).toCSVFile(directory); + new Boxel(BasicBlock.get((short) 68, orientation.getValue()), position, text).toCSVFile(directory); return 1; } @Override diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java deleted file mode 100644 index f7d63d22..00000000 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Block.java +++ /dev/null @@ -1,33 +0,0 @@ -package codemetropolis.toolchain.rendering.util; - -public class Block { - protected short id; - protected short data; - protected String ign; - protected String humanReadableName; - protected short hazardous; - - public short getId() { - return id; - } - public short getData() { - return data; - } - public String getIgn() { - return ign; - } - public String getHumanReadableName() { - return humanReadableName; - } - public short getHazardous() { - return hazardous; - } - - public Block(short id, short data, String ign, String human, short hazard){ - this.id = id; - this.data = data; - this.ign = ign; - this.humanReadableName = human; - this.hazardous = hazard; - } -} diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java index 97cc2c28..49c64e26 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java @@ -2,47 +2,50 @@ import codemetropolis.toolchain.rendering.model.BasicBlock; import codemetropolis.toolchain.rendering.util.Colour; -import java.util.Map; public abstract class Character { + protected static BasicBlock _fallback; + protected static BasicBlock _topFallback; - protected static Map blocks; + static{ + _fallback = new BasicBlock( (short)35, Colour.MAGENTA.getValue(), "minecraft:wool", "Magenta Wool", (short)0); + _topFallback = new BasicBlock( (short)85, 0, "minecraft:fence", "Fence", (short)0); + } - public static void init(Map blocks){ - Character.blocks = blocks; + public static BasicBlock getBlock(String str, BasicBlock fallback){ + return BasicBlock.userBlock(str, fallback); } public static BasicBlock getBlock(String str){ - Block block; - if (blocks.containsKey(str) && blocks.get(str).getHazardous() != 2){ - System.out.println("Using \"" + str + "\""); - block = blocks.get(str); - } - else{ - System.out.println("Couldn't find block \"" + str + "\", using magenta wool instead."); - block = blocks.get("magenta wool"); - } - return new BasicBlock(block.getId(), block.getData()); + return getBlock(str, _fallback); } public static BasicBlock getTopBlock(String str){ - if (blocks.containsKey(str) && blocks.get(str).getHazardous() != 2){ - Block block = blocks.get(str); + return getTopBlock(str, _topFallback); + } + + public static BasicBlock getTopBlock(String str, BasicBlock fallback){ + BasicBlock block = BasicBlock.userBlock(str, fallback); + if (block != null){ switch (block.getId()){ // TODO Add more fences in the .csv case 5: case 17: - return new BasicBlock((short)85); + return BasicBlock.userBlock("fence", fallback); case 1: case 43: case 44: - return new BasicBlock((short)139); + return BasicBlock.userBlock("cobblestone wall", fallback); case 48: - return new BasicBlock((short)139, (short)1); + return BasicBlock.userBlock("mossy cobblestone wall", fallback); case 112: - return new BasicBlock((short)113); + return BasicBlock.userBlock("nether brick fence", fallback); + case 98: + if (block.getData() == 1) + return BasicBlock.userBlock("mossy cobblestone wall", fallback); + return BasicBlock.userBlock("cobblestone wall", fallback); } } - return getBlock(str); + return fallback; } } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv index f014795c..3f7d6167 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv +++ b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv @@ -1,373 +1,429 @@ -0,0,minecraft:air,Air,2 -1,0,minecraft:stone,Stone,0 -1,1,minecraft:stone,Granite,0 -1,2,minecraft:stone,Polished Granite,0 -1,3,minecraft:stone,Diorite,0 -1,4,minecraft:stone,Polished Diorite,0 -1,5,minecraft:stone,Andesite,0 -1,6,minecraft:stone,Polished Andesite,0 -2,0,minecraft:grass,Grass Block,0 -3,0,minecraft:dirt,Dirt,0 -3,1,minecraft:dirt,Coarse Dirt,0 -3,2,minecraft:dirt,Podzol,0 -4,0,minecraft:cobblestone,Cobblestone,0 -5,0,minecraft:planks,Planks,0 -5,0,minecraft:planks,Oak Planks,0 -5,1,minecraft:planks,Spruce Planks,0 -5,2,minecraft:planks,Birch Planks,0 -5,3,minecraft:planks,Jungle Planks,0 -5,4,minecraft:planks,Acacia Planks,0 -5,5,minecraft:planks,Dark Oak Planks,0 -6,0,minecraft:sapling,Saplings,0 -6,0,minecraft:sapling,Oak Sapling,0 -6,1,minecraft:sapling,Spruce Sapling,0 -6,2,minecraft:sapling,Birch Sapling,0 -6,3,minecraft:sapling,Jungle Sapling,0 -6,4,minecraft:sapling,Acacia Sapling,0 -6,5,minecraft:sapling,Dark Oak Sapling,0 -7,0,minecraft:bedrock,Bedrock,1 -8,0,minecraft:flowing_water,Flowing Water,2 -9,0,minecraft:water,Water,1 -10,0,minecraft:flowing_lava,Flowing Lava,2 -11,0,minecraft:lava,Lava,1 -12,0,minecraft:sand,Sand,0 -12,1,minecraft:sand,Red Sand,0 -13,0,minecraft:gravel,Gravel,0 -14,0,minecraft:gold_ore,Gold Ore,0 -15,0,minecraft:iron_ore,Iron Ore,0 -16,0,minecraft:coal_ore,Coal Ore,0 -17,0,minecraft:log,Wood,0 -17,1,minecraft:log,Oak Wood,0 -17,2,minecraft:log,Spruce Wood,0 -17,3,minecraft:log,Birch Wood,0 -17,4,minecraft:log,Jungle Wood,0 -18,0,minecraft:leaves,Leaves,0 -18,0,minecraft:leaves,Oak Leaves,0 -18,1,minecraft:leaves,Spruce Leaves,0 -18,2,minecraft:leaves,Birch Leaves,0 -18,3,minecraft:leaves,Jungle Leaves,0 -19,0,minecraft:sponge,Sponge,0 -19,1,minecraft:sponge,We Sponge,0 -20,0,minecraft:glass,Glass,0 -21,0,minecraft:lapis_ore,Lapis Lazuli Ore,0 -22,0,minecraft:lapis_block,Lapis Lazuli Block,0 -23,0,minecraft:dispenser,Dispenser,2 -24,0,minecraft:sandstone,Sandstone,0 -24,1,minecraft:sandstone,Chiseled Sandstone,0 -24,2,minecraft:sandstone,Smooth Sandstone,0 -25,0,minecraft:noteblock,Note Block,2 -26,0,minecraft:bed,Bed,2 -27,0,minecraft:golden_rail,Powered Rail,2 -28,0,minecraft:detector_rail,Detector Rail,2 -29,0,minecraft:sticky_piston,Sticky Piston,2 -30,0,minecraft:web,Cobweb,0 -31,0,minecraft:tallgrass,Grass,0 -31,0,minecraft:tallgrass,Shrub,0 -31,1,minecraft:tallgrass,Tall Grass,0 -31,2,minecraft:tallgrass,Fern,0 -32,0,minecraft:deadbush,Dead Bush,0 -33,0,minecraft:piston,Piston,2 -34,0,minecraft:piston_head,Piston Extension,2 -35,0,minecraft:wool,Wool,0 -35,0,minecraft:wool,White Wool,0 -35,1,minecraft:wool,Orange Wool,0 -35,2,minecraft:wool,Magenta Wool,0 -35,3,minecraft:wool,Light Blue Wool,0 -35,4,minecraft:wool,Yellow Wool,0 -35,5,minecraft:wool,Lime Wool,0 -35,6,minecraft:wool,Pink Wool,0 -35,7,minecraft:wool,Gray Wool,0 -35,8,minecraft:wool,Light Gray Wool,0 -35,9,minecraft:wool,Cyan Wool,0 -35,10,minecraft:wool,Purple Wool,0 -35,11,minecraft:wool,Blue Wool,0 -35,12,minecraft:wool,Brown Wool,0 -35,13,minecraft:wool,Green Wool,0 -35,14,minecraft:wool,Red Wool,0 -35,15,minecraft:wool,Black Wool,0 -36,0,minecraft:piston_extension,Block moved by Piston,2 -37,0,minecraft:yellow_flower,Dandelion,0 -38,0,minecraft:red_flower,Poppy,2 -38,1,minecraft:red_flower,Blue Orchid,2 -38,2,minecraft:red_flower,Allium,2 -38,3,minecraft:red_flower,Azure Bluet,2 -38,4,minecraft:red_flower,Red Tulip,2 -38,5,minecraft:red_flower,Orange Tulip,2 -38,6,minecraft:red_flower,White Tulip,2 -38,7,minecraft:red_flower,Pink Tulip,2 -38,8,minecraft:red_flower,Oxeye Daisy,0 -39,0,minecraft:brown_mushroom,Brown Mushroom,0 -40,0,minecraft:red_mushroom,Red Mushroom,0 -41,0,minecraft:gold_block,Block of Gold,0 -42,0,minecraft:iron_block,Block of Iron,0 -43,0,minecraft:double_stone_slab,Double Stone Slab,0 -43,1,minecraft:double_stone_slab,Double Sandstone Slab,0 -43,2,minecraft:double_stone_slab,Double Wooden Slab,0 -43,3,minecraft:double_stone_slab,Double Cobblestone Slab,0 -43,4,minecraft:double_stone_slab,Double Bricks Slab,0 -43,5,minecraft:double_stone_slab,Double Stone Brick Slab,0 -43,6,minecraft:double_stone_slab,Double Nether Brick Slab,0 -43,7,minecraft:double_stone_slab,Double Quartz Slab,0 -43,8,minecraft:double_stone_slab,Smooth Double Stone Slab,0 -43,9,minecraft:double_stone_slab,Smooth Double Sandstone Slab,0 -43,15,minecraft:double_stone_slab,Tile Double Quartz Slab,0 -44,0,minecraft:stone_slab,Stone Slab,0 -44,1,minecraft:stone_slab,Sandstone Slab,0 -44,2,minecraft:stone_slab,Wooden Slab,0 -44,3,minecraft:stone_slab,Cobblestone Slab,0 -44,4,minecraft:stone_slab,Bricks Slab,0 -44,5,minecraft:stone_slab,Stone Brick Slab,0 -44,6,minecraft:stone_slab,Nether Brick Slab,0 -44,7,minecraft:stone_slab,Quartz Slab,0 -44,8,minecraft:stone_slab,Upper Stone Slab,0 -44,9,minecraft:stone_slab,Upper Sandstone Slab,0 -44,10,minecraft:stone_slab,Upper Wooden Slab,0 -44,11,minecraft:stone_slab,Upper Cobblestone Slab,0 -44,12,minecraft:stone_slab,Upper Bricks Slab,0 -44,13,minecraft:stone_slab,Upper Stone Brick Slab,0 -44,14,minecraft:stone_slab,Upper Nether Brick Slab,0 -44,15,minecraft:stone_slab,Upper Quartz Slab,0 -45,0,minecraft:brick_block,Bricks,0 -46,0,minecraft:tnt,TNT,1 -47,0,minecraft:bookshelf,Bookshelf,0 -48,0,minecraft:mossy_cobblestone,Moss Stone,0 -49,0,minecraft:obsidian,Obsidian,0 -50,0,minecraft:torch,Torch,2 -51,0,minecraft:fire,Fire,2 -52,0,minecraft:mob_spawner,Monster Spawner,2 -53,0,minecraft:oak_stairs,Oak Wood Stairs,2 -54,0,minecraft:chest,Chest,2 -55,0,minecraft:redstone_wire,Redstone Wire,2 -56,0,minecraft:diamond_ore,Diamond Ore,0 -57,0,minecraft:diamond_block,Block of Diamond,0 -58,0,minecraft:crafting_table,Crafting Table,0 -59,0,minecraft:wheat,Wheat,2 -60,0,minecraft:farmland,Farmland,2 -60,7,minecraft:farmland,Wet Farmland,2 -61,0,minecraft:furnace,Furnace,1 -62,0,minecraft:lit_furnace,Burning Furnace,2 -63,0,minecraft:standing_sign,Sign Post,2 -64,0,minecraft:wooden_door,Wooden Door,2 -65,0,minecraft:ladder,Ladders,2 -66,0,minecraft:rail,Rail,2 -67,0,minecraft:stone_stairs,Cobblestone Stairs,2 -68,0,minecraft:wall_sign,Wall Sign,2 -69,0,minecraft:lever,Lever,2 -70,0,minecraft:stone_pressure_plate,Stone Pressure Plate,2 -71,0,minecraft:iron_door,Iron Door,2 -72,0,minecraft:wooden_pressure_plate,Wooden Pressure Plate,2 -73,0,minecraft:redstone_ore,Redstone Ore,0 -74,0,minecraft:lit_redstone_ore,Glowing Redstone Ore,0 -75,0,minecraft:unlit_redstone_torch,Redstone Torch (inactive),2 -76,0,minecraft:redstone_torch,Redstone Torch (active),2 -77,0,minecraft:stone_button,Stone Button,2 -78,0,minecraft:snow_layer,Snow,2 -79,0,minecraft:ice,Ice,1 -80,0,minecraft:snow,Snow,0 -81,0,minecraft:cactus,Cactus,2 -82,0,minecraft:clay,Clay,0 -83,0,minecraft:reeds,Sugar Cane,1 -84,0,minecraft:jukebox,Jukebox,2 -85,0,minecraft:fence,Fence,0 -86,0,minecraft:pumpkin,Pumpkin,0 -87,0,minecraft:netherrack,Netherrack,0 -88,0,minecraft:soul_sand,Soul Sand,0 -89,0,minecraft:glowstone,Glowstone,0 -90,0,minecraft:portal,Nether Portal,2 -91,0,minecraft:lit_pumpkin,Jack 'o' Lantern,0 -92,0,minecraft:cake,Cake Block,0 -93,0,minecraft:unpowered_repeater,Redstone Repeater (inactive),2 -94,0,minecraft:powered_repeater,Redstone Repeater (active),2 -95,0,minecraft:stained_glass,Stained Glass,0 -95,0,minecraft:stained_glass,White Stained Glass,0 -95,1,minecraft:stained_glass,Orange Stained Glass,0 -95,2,minecraft:stained_glass,Magenta Stained Glass,0 -95,3,minecraft:stained_glass,Light Blue Stained Glass,0 -95,4,minecraft:stained_glass,Yellow Stained Glass,0 -95,5,minecraft:stained_glass,Lime Stained Glass,0 -95,6,minecraft:stained_glass,Pink Stained Glass,0 -95,7,minecraft:stained_glass,Gray Stained Glass,0 -95,8,minecraft:stained_glass,Light Gray Stained Glass,0 -95,9,minecraft:stained_glass,Cyan Stained Glass,0 -95,10,minecraft:stained_glass,Purple Stained Glass,0 -95,11,minecraft:stained_glass,Blue Stained Glass,0 -95,12,minecraft:stained_glass,Brown Stained Glass,0 -95,13,minecraft:stained_glass,Green Stained Glass,0 -95,14,minecraft:stained_glass,Red Stained Glass,0 -95,15,minecraft:stained_glass,Black Stained Glass,0 -96,0,minecraft:trapdoor,Trapdoor,2 -97,0,minecraft:monster_egg,Monster Egg,1 -97,0,minecraft:monster_egg,Stone Monster Egg,1 -97,1,minecraft:monster_egg,Cobblestone Monster Egg,1 -97,2,minecraft:monster_egg,Stone Brick Monster Egg,1 -97,3,minecraft:monster_egg,Mossy Stone Brick Monster Egg,1 -97,4,minecraft:monster_egg,Cracked Stone Brick Monster Egg,1 -97,5,minecraft:monster_egg,Chiseled Stone Brick Monster Egg,1 -98,0,minecraft:stonebrick,Stone Bricks,0 -98,1,minecraft:stonebrick,Mossy Stone Brick,0 -98,2,minecraft:stonebrick,Cracked Stone Brick,0 -98,3,minecraft:stonebrick,Chiseled Stone Brick,0 -99,14,minecraft:brown_mushroom_block,Huge Brown Mushroom,0 -100,14,minecraft:red_mushroom_block,Huge Red Mushroom,0 -101,0,minecraft:iron_bars,Iron Bars,0 -102,0,minecraft:glass_pane,Glass Pane,0 -103,0,minecraft:melon_block,Melon,0 -104,0,minecraft:pumpkin_stem,Pumpkin Stem,2 -105,0,minecraft:melon_stem,Melon Stem,2 -106,0,minecraft:vine,Vines,2 -107,0,minecraft:fence_gate,Fence Gate,2 -108,0,minecraft:brick_stairs,Brick Stairs,2 -109,0,minecraft:stone_brick_stairs,Stone Brick Stairs,2 -110,0,minecraft:mycelium,Mycelium,0 -111,0,minecraft:waterlily,Lily Pad,2 -112,0,minecraft:nether_brick,Nether Brick,0 -113,0,minecraft:nether_brick_fence,Nether Brick Fence,0 -114,0,minecraft:nether_brick_stairs,Nether Brick Stairs,2 -115,0,minecraft:nether_wart,Nether Wart,2 -116,0,minecraft:enchanting_table,Enchantment Table,2 -117,0,minecraft:brewing_stand,Brewing Stand,2 -118,0,minecraft:cauldron,Cauldron,2 -119,0,minecraft:end_portal,End Portal,2 -120,0,minecraft:end_portal_frame,End Portal Block,1 -121,0,minecraft:end_stone,End Stone,0 -122,0,minecraft:dragon_egg,Dragon Egg,0 -123,0,minecraft:redstone_lamp,Redstone Lamp,0 -124,0,minecraft:lit_redstone_lamp,Redstone Lamp (active),2 -125,0,minecraft:double_wooden_slab,Wooden Double Slab,0 -125,0,minecraft:double_wooden_slab,Double Oak Wood Slab,0 -125,1,minecraft:double_wooden_slab,Double Spruce Wood Slab,0 -125,2,minecraft:double_wooden_slab,Double Birch Wood Slab,0 -125,3,minecraft:double_wooden_slab,Double Jungle Wood Slab,0 -125,4,minecraft:double_wooden_slab,Double Acacia Wood Slab,0 -125,5,minecraft:double_wooden_slab,Double Dark Oak Wood Slab,0 -126,0,minecraft:wooden_slab,Wooden Slab,0 -126,0,minecraft:wooden_slab,Oak Wood Slab,0 -126,1,minecraft:wooden_slab,Spruce Wood Slab,0 -126,2,minecraft:wooden_slab,Birch Wood Slab,0 -126,3,minecraft:wooden_slab,Jungle Wood Slab,0 -126,4,minecraft:wooden_slab,Acacia Wood Slab,0 -126,5,minecraft:wooden_slab,Dark Oak Wood Slab,0 -126,8,minecraft:wooden_slab,Upper Wooden Slab,0 -126,8,minecraft:wooden_slab,Upper Oak Wood Slab,0 -126,9,minecraft:wooden_slab,Upper Spruce Wood Slab,0 -126,10,minecraft:wooden_slab,Upper Birch Wood Slab,0 -126,11,minecraft:wooden_slab,Upper Jungle Wood Slab,0 -126,12,minecraft:wooden_slab,Upper Acacia Wood Slab,0 -126,13,minecraft:wooden_slab,Upper Dark Oak Wood Slab,0 -127,0,minecraft:cocoa,Cocoa,2 -128,0,minecraft:sandstone_stairs,Sandstone Stairs,2 -129,0,minecraft:emerald_ore,Emerald Ore,0 -130,0,minecraft:ender_chest,Ender Chest,2 -131,0,minecraft:tripwire_hook,Tripwire Hook,2 -132,0,minecraft:tripwire,Tripwire,2 -133,0,minecraft:emerald_block,Block of Emerald,0 -134,0,minecraft:spruce_stairs,Spruce Wood Stairs,2 -135,0,minecraft:birch_stairs,Birch Wood Stairs,2 -136,0,minecraft:jungle_stairs,Jungle Wood Stairs,2 -137,0,minecraft:command_block,Command Block,2 -138,0,minecraft:beacon,Beacon,2 -139,0,minecraft:cobblestone_wall,Cobblestone Wall,0 -139,1,minecraft:cobblestone_wall,Mossy Cobblestone Wall,0 -140,0,minecraft:flower_pot,Flower Pot,2 -141,0,minecraft:carrots,Carrots,2 -142,0,minecraft:potatoes,Potatoes,2 -143,0,minecraft:wooden_button,Wooden Button,2 -144,0,minecraft:skull,Mob Head,2 -145,0,minecraft:anvil,Anvil,2 -146,0,minecraft:trapped_chest,Trapped Chest,2 -147,0,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light),2 -148,0,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy),2 -149,0,minecraft:unpowered_comparator,Redstone Comparator (inactive & active),2 -150,0,,(unused),2 -151,0,minecraft:daylight_detector,Daylight Sensor,2 -152,0,minecraft:redstone_block,Block of Redstone,0 -153,0,minecraft:quartz_ore,Nether Quartz Ore,0 -154,0,minecraft:hopper,Hopper,2 -155,0,minecraft:quartz_block,Block of Quartz,0 -156,0,minecraft:quartz_stairs,Quartz Stairs,2 -157,0,minecraft:activator_rail,Activator Rail,2 -158,0,minecraft:dropper,Dropper,2 -159,0,minecraft:stained_hardened_clay,Stained Clay,0 -159,0,minecraft:stained_hardened_clay,White Hardened Clay,0 -159,1,minecraft:stained_hardened_clay,Orange Hardened Clay,0 -159,2,minecraft:stained_hardened_clay,Magenta Hardened Clay,0 -159,3,minecraft:stained_hardened_clay,Light Blue Hardened Clay,0 -159,4,minecraft:stained_hardened_clay,Yellow Hardened Clay,0 -159,5,minecraft:stained_hardened_clay,Lime Hardened Clay,0 -159,6,minecraft:stained_hardened_clay,Pink Hardened Clay,0 -159,7,minecraft:stained_hardened_clay,Gray Hardened Clay,0 -159,8,minecraft:stained_hardened_clay,Light Gray Hardened Clay,0 -159,9,minecraft:stained_hardened_clay,Cyan Hardened Clay,0 -159,10,minecraft:stained_hardened_clay,Purple Hardened Clay,0 -159,11,minecraft:stained_hardened_clay,Blue Hardened Clay,0 -159,12,minecraft:stained_hardened_clay,Brown Hardened Clay,0 -159,13,minecraft:stained_hardened_clay,Green Hardened Clay,0 -159,14,minecraft:stained_hardened_clay,Red Hardened Clay,0 -159,15,minecraft:stained_hardened_clay,Black Hardened Clay,0 -160,0,minecraft:stained_glass_pane,Stained Glass Pane,0 -160,0,minecraft:stained_glass_pane,White Stained Glass Pane,1 -160,1,minecraft:stained_glass_pane,Orange Stained Glass Pane,2 -160,2,minecraft:stained_glass_pane,Magenta Stained Glass Pane,3 -160,3,minecraft:stained_glass_pane,Light Blue Stained Glass Pane,4 -160,4,minecraft:stained_glass_pane,Yellow Stained Glass Pane,5 -160,5,minecraft:stained_glass_pane,Lime Stained Glass Pane,6 -160,6,minecraft:stained_glass_pane,Pink Stained Glass Pane,7 -160,7,minecraft:stained_glass_pane,Gray Stained Glass Pane,8 -160,8,minecraft:stained_glass_pane,Light Gray Stained Glass Pane,9 -160,9,minecraft:stained_glass_pane,Cyan Stained Glass Pane,10 -160,10,minecraft:stained_glass_pane,Purple Stained Glass Pane,11 -160,11,minecraft:stained_glass_pane,Blue Stained Glass Pane,12 -160,12,minecraft:stained_glass_pane,Brown Stained Glass Pane,13 -160,13,minecraft:stained_glass_pane,Green Stained Glass Pane,14 -160,14,minecraft:stained_glass_pane,Red Stained Glass Pane,15 -160,15,minecraft:stained_glass_pane,Black Stained Glass Pane,16 -161,0,minecraft:leaves2,Acacia Leaves,0 -161,1,minecraft:leaves3,Dark Oak Leaves,0 -162,0,minecraft:log2,Acacia Wood Slab,0 -162,1,minecraft:log2,Dark Oak Wood,0 -163,0,minecraft:acacia_stairs,Acacia Wood Stairs,2 -164,0,minecraft:dark_oak_stairs,Dark Oak Wood Stairs,2 -170,0,minecraft:hay_block,Hay Block,0 -171,0,minecraft:carpet,Carpet,0 -171,0,minecraft:carpet,White Carpet,0 -171,1,minecraft:carpet,Orange Carpet,0 -171,2,minecraft:carpet,Magenta Carpet,0 -171,3,minecraft:carpet,Light Blue Carpet,0 -171,4,minecraft:carpet,Yellow Carpet,0 -171,5,minecraft:carpet,Lime Carpet,0 -171,6,minecraft:carpet,Pink Carpet,0 -171,7,minecraft:carpet,Gray Carpet,0 -171,8,minecraft:carpet,Light Gray Carpet,0 -171,9,minecraft:carpet,Cyan Carpet,0 -171,10,minecraft:carpet,Purple Carpet,0 -171,11,minecraft:carpet,Blue Carpet,0 -171,12,minecraft:carpet,Brown Carpet,0 -171,13,minecraft:carpet,Green Carpet,0 -171,14,minecraft:carpet,Red Carpet,0 -171,15,minecraft:carpet,Black Carpet,0 -172,0,minecraft:hardened_clay,Hardened Clay,0 -172,0,minecraft:hardened_clay,White Hardened Clay,0 -172,1,minecraft:hardened_clay,Orange Hardened Clay,0 -172,2,minecraft:hardened_clay,Magenta Hardened Clay,0 -172,3,minecraft:hardened_clay,Light Blue Hardened Clay,0 -172,4,minecraft:hardened_clay,Yellow Hardened Clay,0 -172,5,minecraft:hardened_clay,Lime Hardened Clay,0 -172,6,minecraft:hardened_clay,Pink Hardened Clay,0 -172,7,minecraft:hardened_clay,Gray Hardened Clay,0 -172,8,minecraft:hardened_clay,Light Gray Hardened Clay,0 -172,9,minecraft:hardened_clay,Cyan Hardened Clay,0 -172,10,minecraft:hardened_clay,Purple Hardened Clay,0 -172,11,minecraft:hardened_clay,Blue Hardened Clay,0 -172,12,minecraft:hardened_clay,Brown Hardened Clay,0 -172,13,minecraft:hardened_clay,Green Hardened Clay,0 -172,14,minecraft:hardened_clay,Red Hardened Clay,0 -172,15,minecraft:hardened_clay,Black Hardened Clay,0 -173,0,minecraft:coal_block,Block of Coal,0 -174,0,minecraft:packed_ice,Packed Ice,0 -175,0,minecraft:double_plant,Large Flowers,0 -175,0,minecraft:double_plant,Sunflower,2 -175,1,minecraft:double_plant,Lilac,2 -175,2,minecraft:double_plant,Double Tallgrass,2 -175,3,minecraft:double_plant,Large Fern,2 -175,4,minecraft:double_plant,Rose Bush,2 -175,5,minecraft:double_plant,Peony,2 +0,0,minecraft:air,Air,2 +1,0,minecraft:stone,Stone,0 +1,1,minecraft:stone,Granite,0 +1,2,minecraft:stone,Polished Granite,0 +1,3,minecraft:stone,Diorite,0 +1,4,minecraft:stone,Polished Diorite,0 +1,5,minecraft:stone,Andesite,0 +1,6,minecraft:stone,Polished Andesite,0 +2,0,minecraft:grass,Grass Block,0 +3,0,minecraft:dirt,Dirt,0 +3,1,minecraft:dirt,Coarse Dirt,0 +3,2,minecraft:dirt,Podzol,0 +4,0,minecraft:cobblestone,Cobblestone,0 +5,0,minecraft:planks,Planks,0 +5,0,minecraft:planks,Oak Planks,0 +5,1,minecraft:planks,Spruce Planks,0 +5,2,minecraft:planks,Birch Planks,0 +5,3,minecraft:planks,Jungle Planks,0 +5,4,minecraft:planks,Acacia Planks,0 +5,5,minecraft:planks,Dark Oak Planks,0 +6,0,minecraft:sapling,Saplings,0 +6,0,minecraft:sapling,Oak Sapling,0 +6,1,minecraft:sapling,Spruce Sapling,0 +6,2,minecraft:sapling,Birch Sapling,0 +6,3,minecraft:sapling,Jungle Sapling,0 +6,4,minecraft:sapling,Acacia Sapling,0 +6,5,minecraft:sapling,Dark Oak Sapling,0 +7,0,minecraft:bedrock,Bedrock,1 +8,0,minecraft:flowing_water,Flowing Water,2 +9,0,minecraft:water,Water,1 +10,0,minecraft:flowing_lava,Flowing Lava,2 +11,0,minecraft:lava,Lava,1 +12,0,minecraft:sand,Sand,0 +12,1,minecraft:sand,Red Sand,0 +13,0,minecraft:gravel,Gravel,0 +14,0,minecraft:gold_ore,Gold Ore,0 +15,0,minecraft:iron_ore,Iron Ore,0 +16,0,minecraft:coal_ore,Coal Ore,0 +17,0,minecraft:log,Wood,0 +17,0,minecraft:log,Oak Wood,0 +17,1,minecraft:log,Spruce Wood,0 +17,2,minecraft:log,Birch Wood,0 +17,3,minecraft:log,Jungle Wood,0 +18,0,minecraft:leaves,Leaves,0 +18,0,minecraft:leaves,Oak Leaves,0 +18,1,minecraft:leaves,Spruce Leaves,0 +18,2,minecraft:leaves,Birch Leaves,0 +18,3,minecraft:leaves,Jungle Leaves,0 +19,0,minecraft:sponge,Sponge,0 +19,1,minecraft:sponge,We Sponge,0 +20,0,minecraft:glass,Glass,0 +21,0,minecraft:lapis_ore,Lapis Lazuli Ore,0 +22,0,minecraft:lapis_block,Lapis Lazuli Block,0 +23,0,minecraft:dispenser,Dispenser,2 +24,0,minecraft:sandstone,Sandstone,0 +24,1,minecraft:sandstone,Chiseled Sandstone,0 +24,2,minecraft:sandstone,Smooth Sandstone,0 +25,0,minecraft:noteblock,Note Block,2 +26,0,minecraft:bed,Bed,2 +27,0,minecraft:golden_rail,Powered Rail,2 +28,0,minecraft:detector_rail,Detector Rail,2 +29,0,minecraft:sticky_piston,Sticky Piston,2 +30,0,minecraft:web,Cobweb,0 +31,0,minecraft:tallgrass,Grass,0 +31,0,minecraft:tallgrass,Shrub,0 +31,1,minecraft:tallgrass,Tall Grass,0 +31,2,minecraft:tallgrass,Fern,0 +32,0,minecraft:deadbush,Dead Bush,0 +33,0,minecraft:piston,Piston,2 +34,0,minecraft:piston_head,Piston Extension,2 +35,0,minecraft:wool,Wool,0 +35,0,minecraft:wool,White Wool,0 +35,1,minecraft:wool,Orange Wool,0 +35,2,minecraft:wool,Magenta Wool,0 +35,3,minecraft:wool,Light Blue Wool,0 +35,4,minecraft:wool,Yellow Wool,0 +35,5,minecraft:wool,Lime Wool,0 +35,6,minecraft:wool,Pink Wool,0 +35,7,minecraft:wool,Gray Wool,0 +35,8,minecraft:wool,Light Gray Wool,0 +35,9,minecraft:wool,Cyan Wool,0 +35,10,minecraft:wool,Purple Wool,0 +35,11,minecraft:wool,Blue Wool,0 +35,12,minecraft:wool,Brown Wool,0 +35,13,minecraft:wool,Green Wool,0 +35,14,minecraft:wool,Red Wool,0 +35,15,minecraft:wool,Black Wool,0 +36,0,minecraft:piston_extension,Block moved by Piston,2 +37,0,minecraft:yellow_flower,Dandelion,0 +38,0,minecraft:red_flower,Poppy,2 +38,1,minecraft:red_flower,Blue Orchid,2 +38,2,minecraft:red_flower,Allium,2 +38,3,minecraft:red_flower,Azure Bluet,2 +38,4,minecraft:red_flower,Red Tulip,2 +38,5,minecraft:red_flower,Orange Tulip,2 +38,6,minecraft:red_flower,White Tulip,2 +38,7,minecraft:red_flower,Pink Tulip,2 +38,8,minecraft:red_flower,Oxeye Daisy,0 +39,0,minecraft:brown_mushroom,Brown Mushroom,2 +40,0,minecraft:red_mushroom,Red Mushroom,2 +41,0,minecraft:gold_block,Block of Gold,0 +42,0,minecraft:iron_block,Block of Iron,0 +43,0,minecraft:double_stone_slab,Double Stone Slab,0 +43,1,minecraft:double_stone_slab,Double Sandstone Slab,0 +43,2,minecraft:double_stone_slab,Double Wooden Slab,0 +43,3,minecraft:double_stone_slab,Double Cobblestone Slab,0 +43,4,minecraft:double_stone_slab,Double Bricks Slab,0 +43,5,minecraft:double_stone_slab,Double Stone Brick Slab,0 +43,6,minecraft:double_stone_slab,Double Nether Brick Slab,0 +43,7,minecraft:double_stone_slab,Double Quartz Slab,0 +43,8,minecraft:double_stone_slab,Smooth Double Stone Slab,0 +43,9,minecraft:double_stone_slab,Smooth Double Sandstone Slab,0 +43,15,minecraft:double_stone_slab,Tile Double Quartz Slab,0 +44,0,minecraft:stone_slab,Stone Slab,0 +44,1,minecraft:stone_slab,Sandstone Slab,0 +44,2,minecraft:stone_slab,Wooden Slab,0 +44,3,minecraft:stone_slab,Cobblestone Slab,0 +44,4,minecraft:stone_slab,Bricks Slab,0 +44,5,minecraft:stone_slab,Stone Brick Slab,0 +44,6,minecraft:stone_slab,Nether Brick Slab,0 +44,7,minecraft:stone_slab,Quartz Slab,0 +44,8,minecraft:stone_slab,Upper Stone Slab,0 +44,9,minecraft:stone_slab,Upper Sandstone Slab,0 +44,10,minecraft:stone_slab,Upper Wooden Slab,0 +44,11,minecraft:stone_slab,Upper Cobblestone Slab,0 +44,12,minecraft:stone_slab,Upper Bricks Slab,0 +44,13,minecraft:stone_slab,Upper Stone Brick Slab,0 +44,14,minecraft:stone_slab,Upper Nether Brick Slab,0 +44,15,minecraft:stone_slab,Upper Quartz Slab,0 +45,0,minecraft:brick_block,Bricks,0 +46,0,minecraft:tnt,TNT,1 +47,0,minecraft:bookshelf,Bookshelf,0 +48,0,minecraft:mossy_cobblestone,Mossy Cobblestone,0 +49,0,minecraft:obsidian,Obsidian,0 +50,5,minecraft:torch,Torch,2 +50,1,minecraft:torch,Torch East,2 +50,2,minecraft:torch,Torch West,2 +50,3,minecraft:torch,Torch South,2 +50,4,minecraft:torch,Torch North,2 +51,0,minecraft:fire,Fire,2 +52,0,minecraft:mob_spawner,Monster Spawner,2 +53,0,minecraft:oak_stairs,Oak Wood Stairs,2 +54,0,minecraft:chest,Chest,2 +55,0,minecraft:redstone_wire,Redstone Wire,2 +56,0,minecraft:diamond_ore,Diamond Ore,0 +57,0,minecraft:diamond_block,Block of Diamond,0 +58,0,minecraft:crafting_table,Crafting Table,0 +59,0,minecraft:wheat,Wheat,2 +60,0,minecraft:farmland,Farmland,2 +60,7,minecraft:farmland,Wet Farmland,2 +61,0,minecraft:furnace,Furnace,1 +62,0,minecraft:lit_furnace,Burning Furnace,2 +63,0,minecraft:standing_sign,Sign Post,2 +63,0,minecraft:standing_sign,Sign Post (S),2 +63,1,minecraft:standing_sign,Sign Post (S-SW),2 +63,2,minecraft:standing_sign,Sign Post (SW),2 +63,3,minecraft:standing_sign,Sign Post (W-SW),2 +63,4,minecraft:standing_sign,Sign Post (W),2 +63,5,minecraft:standing_sign,Sign Post (W-NW),2 +63,6,minecraft:standing_sign,Sign Post (NW),2 +63,7,minecraft:standing_sign,Sign Post (N-NW),2 +63,8,minecraft:standing_sign,Sign Post (N),2 +63,9,minecraft:standing_sign,Sign Post (N-NE),2 +63,10,minecraft:standing_sign,Sign Post (NE),2 +63,11,minecraft:standing_sign,Sign Post (E-NE),2 +63,12,minecraft:standing_sign,Sign Post (E),2 +63,13,minecraft:standing_sign,Sign Post (E-SE),2 +63,14,minecraft:standing_sign,Sign Post (SE),2 +63,15,minecraft:standing_sign,Sign Post (S-SE),2 +64,0,minecraft:wooden_door,Wooden Door,2 +64,0,minecraft:wooden_door,Lower Wooden Door (Closed E),2 +64,1,minecraft:wooden_door,Lower Wooden Door (Closed S),2 +64,2,minecraft:wooden_door,Lower Wooden Door (Closed W),2 +64,3,minecraft:wooden_door,Lower Wooden Door (Closed N),2 +64,4,minecraft:wooden_door,Lower Wooden Door (Open E),2 +64,5,minecraft:wooden_door,Lower Wooden Door (Open S),2 +64,6,minecraft:wooden_door,Lower Wooden Door (Open W),2 +64,7,minecraft:wooden_door,Lower Wooden Door (Open N),2 +64,8,minecraft:wooden_door,Upper Wooden Door (Unpowered Left),2 +64,9,minecraft:wooden_door,Upper Wooden Door (Unpowered Right),2 +64,10,minecraft:wooden_door,Upper Wooden Door (Powered Left),2 +64,11,minecraft:wooden_door,Upper Wooden Door (Powered Right),2 +65,0,minecraft:ladder,Ladders,2 +66,0,minecraft:rail,Rail,2 +67,0,minecraft:stone_stairs,Cobblestone Stairs,2 +68,2,minecraft:wall_sign,Wall Sign,2 +68,2,minecraft:wall_sign,Wall Sign (N),2 +68,3,minecraft:wall_sign,Wall Sign (S),2 +68,4,minecraft:wall_sign,Wall Sign (W),2 +68,5,minecraft:wall_sign,Wall Sign (E),2 +69,0,minecraft:lever,Lever,2 +70,0,minecraft:stone_pressure_plate,Stone Pressure Plate,2 +71,0,minecraft:iron_door,Iron Door,2 +71,0,minecraft:iron_door,Lower Iron Door (Closed E),2 +71,1,minecraft:iron_door,Lower Iron Door (Closed S),2 +71,2,minecraft:iron_door,Lower Iron Door (Closed W),2 +71,3,minecraft:iron_door,Lower Iron Door (Closed N),2 +71,4,minecraft:iron_door,Lower Iron Door (Open E),2 +71,5,minecraft:iron_door,Lower Iron Door (Open S),2 +71,6,minecraft:iron_door,Lower Iron Door (Open W),2 +71,7,minecraft:iron_door,Lower Iron Door (Open N),2 +71,8,minecraft:iron_door,Upper Iron Door (Unpowered Left),2 +71,9,minecraft:iron_door,Upper Iron Door (Unpowered Right),2 +71,10,minecraft:iron_door,Upper Iron Door (Powered Left),2 +71,11,minecraft:iron_door,Upper Iron Door (Powered Right),2 +72,0,minecraft:wooden_pressure_plate,Wooden Pressure Plate,2 +73,0,minecraft:redstone_ore,Redstone Ore,0 +74,0,minecraft:lit_redstone_ore,Glowing Redstone Ore,0 +75,5,minecraft:unlit_redstone_torch,Redstone Torch (inactive),2 +75,1,minecraft:unlit_redstone_torch,Redstone Torch East (inactive),2 +75,2,minecraft:unlit_redstone_torch,Redstone Torch West (inactive),2 +75,3,minecraft:unlit_redstone_torch,Redstone Torch South (inactive),2 +75,4,minecraft:unlit_redstone_torch,Redstone Torch East (inactive),2 +76,5,minecraft:redstone_torch,Redstone Torch (active),2 +76,1,minecraft:unlit_redstone_torch,Redstone Torch East (active),2 +76,2,minecraft:unlit_redstone_torch,Redstone Torch West (active),2 +76,3,minecraft:unlit_redstone_torch,Redstone Torch South (active),2 +76,4,minecraft:unlit_redstone_torch,Redstone Torch East (active),2 +77,0,minecraft:stone_button,Stone Button,2 +78,0,minecraft:snow_layer,Snow,2 +79,0,minecraft:ice,Ice,1 +80,0,minecraft:snow,Snow,0 +81,0,minecraft:cactus,Cactus,2 +82,0,minecraft:clay,Clay,0 +83,0,minecraft:reeds,Sugar Cane,1 +84,0,minecraft:jukebox,Jukebox,2 +85,0,minecraft:fence,Fence,0 +86,0,minecraft:pumpkin,Pumpkin,0 +87,0,minecraft:netherrack,Netherrack,0 +88,0,minecraft:soul_sand,Soul Sand,0 +89,0,minecraft:glowstone,Glowstone,0 +90,0,minecraft:portal,Nether Portal,2 +91,0,minecraft:lit_pumpkin,Jack 'o' Lantern,0 +92,0,minecraft:cake,Cake Block,0 +93,0,minecraft:unpowered_repeater,Redstone Repeater (inactive),2 +94,0,minecraft:powered_repeater,Redstone Repeater (active),2 +95,0,minecraft:stained_glass,Stained Glass,0 +95,0,minecraft:stained_glass,White Stained Glass,0 +95,1,minecraft:stained_glass,Orange Stained Glass,0 +95,2,minecraft:stained_glass,Magenta Stained Glass,0 +95,3,minecraft:stained_glass,Light Blue Stained Glass,0 +95,4,minecraft:stained_glass,Yellow Stained Glass,0 +95,5,minecraft:stained_glass,Lime Stained Glass,0 +95,6,minecraft:stained_glass,Pink Stained Glass,0 +95,7,minecraft:stained_glass,Gray Stained Glass,0 +95,8,minecraft:stained_glass,Light Gray Stained Glass,0 +95,9,minecraft:stained_glass,Cyan Stained Glass,0 +95,10,minecraft:stained_glass,Purple Stained Glass,0 +95,11,minecraft:stained_glass,Blue Stained Glass,0 +95,12,minecraft:stained_glass,Brown Stained Glass,0 +95,13,minecraft:stained_glass,Green Stained Glass,0 +95,14,minecraft:stained_glass,Red Stained Glass,0 +95,15,minecraft:stained_glass,Black Stained Glass,0 +96,0,minecraft:trapdoor,Trapdoor,2 +97,0,minecraft:monster_egg,Monster Egg,1 +97,0,minecraft:monster_egg,Stone Monster Egg,1 +97,1,minecraft:monster_egg,Cobblestone Monster Egg,1 +97,2,minecraft:monster_egg,Stone Brick Monster Egg,1 +97,3,minecraft:monster_egg,Mossy Stone Brick Monster Egg,1 +97,4,minecraft:monster_egg,Cracked Stone Brick Monster Egg,1 +97,5,minecraft:monster_egg,Chiseled Stone Brick Monster Egg,1 +98,0,minecraft:stonebrick,Stone Bricks,0 +98,1,minecraft:stonebrick,Mossy Stone Brick,0 +98,2,minecraft:stonebrick,Cracked Stone Brick,0 +98,3,minecraft:stonebrick,Chiseled Stone Brick,0 +99,14,minecraft:brown_mushroom_block,Huge Brown Mushroom,0 +100,14,minecraft:red_mushroom_block,Huge Red Mushroom,0 +101,0,minecraft:iron_bars,Iron Bars,0 +102,0,minecraft:glass_pane,Glass Pane,0 +103,0,minecraft:melon_block,Melon,0 +104,0,minecraft:pumpkin_stem,Pumpkin Stem,2 +105,0,minecraft:melon_stem,Melon Stem,2 +106,0,minecraft:vine,Vines,2 +107,0,minecraft:fence_gate,Fence Gate,2 +108,0,minecraft:brick_stairs,Brick Stairs,2 +109,0,minecraft:stone_brick_stairs,Stone Brick Stairs,2 +110,0,minecraft:mycelium,Mycelium,0 +111,0,minecraft:waterlily,Lily Pad,2 +112,0,minecraft:nether_brick,Nether Brick,0 +113,0,minecraft:nether_brick_fence,Nether Brick Fence,0 +114,0,minecraft:nether_brick_stairs,Nether Brick Stairs,2 +115,0,minecraft:nether_wart,Nether Wart,2 +116,0,minecraft:enchanting_table,Enchantment Table,2 +117,0,minecraft:brewing_stand,Brewing Stand,2 +118,0,minecraft:cauldron,Cauldron,2 +119,0,minecraft:end_portal,End Portal,2 +120,0,minecraft:end_portal_frame,End Portal Block,1 +121,0,minecraft:end_stone,End Stone,0 +122,0,minecraft:dragon_egg,Dragon Egg,0 +123,0,minecraft:redstone_lamp,Redstone Lamp,0 +124,0,minecraft:lit_redstone_lamp,Redstone Lamp (active),2 +125,0,minecraft:double_wooden_slab,Wooden Double Slab,0 +125,0,minecraft:double_wooden_slab,Double Oak Wood Slab,0 +125,1,minecraft:double_wooden_slab,Double Spruce Wood Slab,0 +125,2,minecraft:double_wooden_slab,Double Birch Wood Slab,0 +125,3,minecraft:double_wooden_slab,Double Jungle Wood Slab,0 +125,4,minecraft:double_wooden_slab,Double Acacia Wood Slab,0 +125,5,minecraft:double_wooden_slab,Double Dark Oak Wood Slab,0 +126,0,minecraft:wooden_slab,Wooden Slab,0 +126,0,minecraft:wooden_slab,Oak Wood Slab,0 +126,1,minecraft:wooden_slab,Spruce Wood Slab,0 +126,2,minecraft:wooden_slab,Birch Wood Slab,0 +126,3,minecraft:wooden_slab,Jungle Wood Slab,0 +126,4,minecraft:wooden_slab,Acacia Wood Slab,0 +126,5,minecraft:wooden_slab,Dark Oak Wood Slab,0 +126,8,minecraft:wooden_slab,Upper Wooden Slab,0 +126,8,minecraft:wooden_slab,Upper Oak Wood Slab,0 +126,9,minecraft:wooden_slab,Upper Spruce Wood Slab,0 +126,10,minecraft:wooden_slab,Upper Birch Wood Slab,0 +126,11,minecraft:wooden_slab,Upper Jungle Wood Slab,0 +126,12,minecraft:wooden_slab,Upper Acacia Wood Slab,0 +126,13,minecraft:wooden_slab,Upper Dark Oak Wood Slab,0 +127,0,minecraft:cocoa,Cocoa,2 +128,0,minecraft:sandstone_stairs,Sandstone Stairs,2 +129,0,minecraft:emerald_ore,Emerald Ore,0 +130,0,minecraft:ender_chest,Ender Chest,2 +131,0,minecraft:tripwire_hook,Tripwire Hook,2 +132,0,minecraft:tripwire,Tripwire,2 +133,0,minecraft:emerald_block,Block of Emerald,0 +134,0,minecraft:spruce_stairs,Spruce Wood Stairs,2 +135,0,minecraft:birch_stairs,Birch Wood Stairs,2 +136,0,minecraft:jungle_stairs,Jungle Wood Stairs,2 +137,0,minecraft:command_block,Command Block,2 +138,0,minecraft:beacon,Beacon,2 +139,0,minecraft:cobblestone_wall,Cobblestone Wall,0 +139,1,minecraft:cobblestone_wall,Mossy Cobblestone Wall,0 +140,0,minecraft:flower_pot,Flower Pot,2 +141,0,minecraft:carrots,Carrots,2 +142,0,minecraft:potatoes,Potatoes,2 +143,0,minecraft:wooden_button,Wooden Button,2 +144,0,minecraft:skull,Mob Head,2 +145,0,minecraft:anvil,Anvil,2 +146,0,minecraft:trapped_chest,Trapped Chest,2 +147,0,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light),2 +148,0,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy),2 +149,0,minecraft:unpowered_comparator,Redstone Comparator (inactive & active),2 +150,0,,(unused),2 +151,0,minecraft:daylight_detector,Daylight Sensor,2 +152,0,minecraft:redstone_block,Block of Redstone,0 +153,0,minecraft:quartz_ore,Nether Quartz Ore,0 +154,0,minecraft:hopper,Hopper,2 +155,0,minecraft:quartz_block,Block of Quartz,0 +156,0,minecraft:quartz_stairs,Quartz Stairs,2 +157,0,minecraft:activator_rail,Activator Rail,2 +158,0,minecraft:dropper,Dropper,2 +159,0,minecraft:stained_hardened_clay,Stained Clay,0 +159,0,minecraft:stained_hardened_clay,White Hardened Clay,0 +159,1,minecraft:stained_hardened_clay,Orange Hardened Clay,0 +159,2,minecraft:stained_hardened_clay,Magenta Hardened Clay,0 +159,3,minecraft:stained_hardened_clay,Light Blue Hardened Clay,0 +159,4,minecraft:stained_hardened_clay,Yellow Hardened Clay,0 +159,5,minecraft:stained_hardened_clay,Lime Hardened Clay,0 +159,6,minecraft:stained_hardened_clay,Pink Hardened Clay,0 +159,7,minecraft:stained_hardened_clay,Gray Hardened Clay,0 +159,8,minecraft:stained_hardened_clay,Light Gray Hardened Clay,0 +159,9,minecraft:stained_hardened_clay,Cyan Hardened Clay,0 +159,10,minecraft:stained_hardened_clay,Purple Hardened Clay,0 +159,11,minecraft:stained_hardened_clay,Blue Hardened Clay,0 +159,12,minecraft:stained_hardened_clay,Brown Hardened Clay,0 +159,13,minecraft:stained_hardened_clay,Green Hardened Clay,0 +159,14,minecraft:stained_hardened_clay,Red Hardened Clay,0 +159,15,minecraft:stained_hardened_clay,Black Hardened Clay,0 +160,0,minecraft:stained_glass_pane,Stained Glass Pane,0 +160,0,minecraft:stained_glass_pane,White Stained Glass Pane,1 +160,1,minecraft:stained_glass_pane,Orange Stained Glass Pane,2 +160,2,minecraft:stained_glass_pane,Magenta Stained Glass Pane,3 +160,3,minecraft:stained_glass_pane,Light Blue Stained Glass Pane,4 +160,4,minecraft:stained_glass_pane,Yellow Stained Glass Pane,5 +160,5,minecraft:stained_glass_pane,Lime Stained Glass Pane,6 +160,6,minecraft:stained_glass_pane,Pink Stained Glass Pane,7 +160,7,minecraft:stained_glass_pane,Gray Stained Glass Pane,8 +160,8,minecraft:stained_glass_pane,Light Gray Stained Glass Pane,9 +160,9,minecraft:stained_glass_pane,Cyan Stained Glass Pane,10 +160,10,minecraft:stained_glass_pane,Purple Stained Glass Pane,11 +160,11,minecraft:stained_glass_pane,Blue Stained Glass Pane,12 +160,12,minecraft:stained_glass_pane,Brown Stained Glass Pane,13 +160,13,minecraft:stained_glass_pane,Green Stained Glass Pane,14 +160,14,minecraft:stained_glass_pane,Red Stained Glass Pane,15 +160,15,minecraft:stained_glass_pane,Black Stained Glass Pane,16 +161,0,minecraft:leaves2,Acacia Leaves,0 +161,1,minecraft:leaves3,Dark Oak Leaves,0 +162,0,minecraft:log2,Acacia Wood Slab,0 +162,1,minecraft:log2,Dark Oak Wood,0 +163,0,minecraft:acacia_stairs,Acacia Wood Stairs,2 +164,0,minecraft:dark_oak_stairs,Dark Oak Wood Stairs,2 +170,0,minecraft:hay_block,Hay Block,0 +171,0,minecraft:carpet,Carpet,0 +171,0,minecraft:carpet,White Carpet,0 +171,1,minecraft:carpet,Orange Carpet,0 +171,2,minecraft:carpet,Magenta Carpet,0 +171,3,minecraft:carpet,Light Blue Carpet,0 +171,4,minecraft:carpet,Yellow Carpet,0 +171,5,minecraft:carpet,Lime Carpet,0 +171,6,minecraft:carpet,Pink Carpet,0 +171,7,minecraft:carpet,Gray Carpet,0 +171,8,minecraft:carpet,Light Gray Carpet,0 +171,9,minecraft:carpet,Cyan Carpet,0 +171,10,minecraft:carpet,Purple Carpet,0 +171,11,minecraft:carpet,Blue Carpet,0 +171,12,minecraft:carpet,Brown Carpet,0 +171,13,minecraft:carpet,Green Carpet,0 +171,14,minecraft:carpet,Red Carpet,0 +171,15,minecraft:carpet,Black Carpet,0 +172,0,minecraft:hardened_clay,Hardened Clay,0 +172,0,minecraft:hardened_clay,White Hardened Clay,0 +172,1,minecraft:hardened_clay,Orange Hardened Clay,0 +172,2,minecraft:hardened_clay,Magenta Hardened Clay,0 +172,3,minecraft:hardened_clay,Light Blue Hardened Clay,0 +172,4,minecraft:hardened_clay,Yellow Hardened Clay,0 +172,5,minecraft:hardened_clay,Lime Hardened Clay,0 +172,6,minecraft:hardened_clay,Pink Hardened Clay,0 +172,7,minecraft:hardened_clay,Gray Hardened Clay,0 +172,8,minecraft:hardened_clay,Light Gray Hardened Clay,0 +172,9,minecraft:hardened_clay,Cyan Hardened Clay,0 +172,10,minecraft:hardened_clay,Purple Hardened Clay,0 +172,11,minecraft:hardened_clay,Blue Hardened Clay,0 +172,12,minecraft:hardened_clay,Brown Hardened Clay,0 +172,13,minecraft:hardened_clay,Green Hardened Clay,0 +172,14,minecraft:hardened_clay,Red Hardened Clay,0 +172,15,minecraft:hardened_clay,Black Hardened Clay,0 +173,0,minecraft:coal_block,Block of Coal,0 +174,0,minecraft:packed_ice,Packed Ice,0 +175,0,minecraft:double_plant,Large Flowers,0 +175,0,minecraft:double_plant,Sunflower,2 +175,1,minecraft:double_plant,Lilac,2 +175,2,minecraft:double_plant,Double Tallgrass,2 +175,3,minecraft:double_plant,Large Fern,2 +175,4,minecraft:double_plant,Rose Bush,2 +175,5,minecraft:double_plant,Peony,2 From ebe94fd930bac93eb406de73e507f0a97bb9aae0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Tue, 2 May 2017 01:28:17 +0200 Subject: [PATCH 08/12] Removing forgotten zip file Whoops --- sources/codemetropolis-toolchain-rendering.zip | Bin 106034 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 sources/codemetropolis-toolchain-rendering.zip diff --git a/sources/codemetropolis-toolchain-rendering.zip b/sources/codemetropolis-toolchain-rendering.zip deleted file mode 100644 index 400f1436aad037a75b55afd6dc156bd1c9202c06..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106034 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
vz zFJRc3S_2DY*LI@4)M}=xYoWP5{hWsJP4!UE>TgQh!2xJD4Qn0Ttr8Mz_mmYi&5@xU zk-TOSBk20RT&~0A&6*jFL>sPF?B9u<6Ehu(b|Jepr7Jrnf@?zC$>gvPR^m!-0?A;A z(T$u?b=!IG(N%aMhy}v=rL-OM=ZPZ+MhwnLEh@$flrK9~y+|rrXi!FLSE%OtkX^7* z%jw0ZM&2fGhfbUCH+tasgz-a-Db-~ZYE(D<9|*ZQMD|E~n>ZFP!7a2wEX2mvQ*?{Kl-0OHXlADkud^vZM+e-xi7W!D__7l#ML&5jiK1ygbO6niSO2m z{ca(IcA8St{lJcP5WQs1O2#2I6^zeS(7sGyFNSJTAfnWBNoc%{XGdIeYj^ zW12z{I45BUwEf1^=`^D&m;!*$w(X=#htmk-%xLOMUk-x17ZPRe zI)@FbraC39Q=C%d#0g>YHhVkEL=LB^C>jAA;?NqBM9Cz|6poT8aI%UCJcMZZ>Fjul z%0hD3r_EM_w8AG~hhD`>f81CDl||1~vB=B9$Cm6y(5$SXqYWmQnCKr<8NcU#;o8PZ zLrMblpdh(Ak19l&m=E+f>;?(sS7zrB!SJ-Ggcuqd3Hl^T_8GXAVi`~x>5)J?dYOPT z_*|p{(u%-aK4m-Ztly=$uVi+UOrgR7WI~1$VNKYm?=}rX3(^tQ&J3DWDqKM1G=t*U zjg9d~5jZ%kH6Hc*_WhGk!{WDt)ge8@lT2Q%5_W+B-Fe(kxS{&!t5sM@%=t;CR#x9- zA!IT7m(lTrI7#9!9U*X_Z@I;C#S|+Pp*A)MHAjgupmMQL@~@LDxjrWcKhfaDku*n2 zI#8fA2x`q=z+Ma>T+bK0By62Uzr%a#Mm)vT{WPgXSgrp4xWRL6z=OWd`(-zLl(Agz z%q3ALqvqLwkSkF5G}>gx5?LOb7@XC{`s@1l-jm+%e6qcX^q|}!k}`TceE^x10|$v~&!_vG zYga}@Fc-Sh=S@iS#4Slta#mfqp;ic1+^~Z7p&SQozGJ+)e$f=fq9)~TaA7lquBHCIs`g1kZUdYK~9a#oR_2|^3CUKci>i~VZ zP7AA`I*T;Mo+-aKf3!17nNcHB6fW;GqF$H)+)_UG#&V|YN0uW!uB^_tNnm`8>?8Z! zz6C0c(w)s+D@I7~Nrv>@F=+BFf6veoM3K1CxNis+h=y-DqX{A{&?vf02U#tGn^L5+ z=*zcLp{(VWg4wLR_|nG7bU%ymhOP$-Os;!AoQGZwP@C#C6HyC!SdHi_jhyorA-GvI zqv4zxJ2mGQjz_5fwaYR5TTS2Kx6aF7=YM|dNxEl@$f$l~lNz4@0POym1N>1S{&GRd zO7gZDA1)|F*Pb?ULL<*+4u>V3r*XAVOdE}Su5sU(V7t(!SEPBgUis;Q6N?V8KS3Cw zzx(3l{3a`wK&JUBM1VjcU6EQCpP^WQS}28UI4U&ZI!R)PRX-+AF*P7@R7%hXXNaAJ2kxK?18M$aH9~_)w@kqH z(3<&@oSWloMyYK>BY%N;p?T!hh)s?h*X?TxBfIAxOi>`SVM=@Vu*lu)@%XtlJMBTu z?8!FaxrV7{5Xb^~2z>?mWO-VO?9jP6yvb_H!m7Ls>6k!Uo_E}`yoMDXd80GMp}vWQ z9FED!k2r6;w?#@GG4ylB!B`e8zHxZ1-O%l=pWB5>g~6ISime1g1^v~dg)Ns%@gi^H zh>tnS+L>0FHvp!;YxXx+E&E%RIJ}q zL?Y&tS|%+DAhPvFlGLT23>QGjAIIm5#-SkOF0zihk83{iFDALiTj!gLUh93wQMd*Jme2!+ zAmb-Eq~70S!?zto=3hl+7O~AzMs{md8BN0*;7&*7P9tA}$bU4FDVLs?S5I(R9M&&y z)X+p~{RUO#mKbi3Z|6i6|NeLgYoe>caAiJspV}ICL|`0j;=FkJ5*&akKQ*;&D3wp4JYTWqgUur$U`VDfIDPxd7@);M%!7~_JW&u&h<>xq zUhF?0PDh*x#yI>5aXO8vlr?zXzDM>o&VF{{gkj5+f4}vu?SlO!0YR3FK__{Zy$xK` zvB#7NUX{_8YhYHUrZiwYb0sPSOZG`qP}n z4JyT2;3w?U-%|}$<5WbHGD9;H`1G)&U+w6xN+Y%4L=il8{8i!E(RvZ`h~j2*e0oZb znSzsPXoLd&E^nRuzGgNs>S;HF0n{u-qT=tUgnL7yZA;6>D+{=o2#L{I+8sh9e42`6 z4Gk4NI^PfxNRs2>bh|OR0EYo+E7=zWWY?t0UjVTnWb-14HiqHT@`GlFpeLP+r(>BC zi2*I{WFrdfro+?LC1TfK&qCsMS-H5=&x8Pq$@v45lV1TZQBV@6gFFi8bdvSbp>G`0KP74OwR#in15fNpNct9f(F$=9AI2E zWYP3;-ET{ZDfg|2#=4y1VPH3TvxJ0 zPSwNt=7?dBmH`Jl$DyKbaX7aE+n~GfaRP9xg*pjzZacJ?`uiD=}x}d?t=k z&;2%XbADM`#1+zTND^CAE#p(`>NRI^4#GT+gDr7$%qKo?Sq;$;(4c|RZzpYUDD2p3 zjh=gE!HgVk3_U;*I6jIPBHEErkuKu=60;66caU>+UOdWmGh}nP2BNlR^Ekm08byZ~ z5_GMoz8W=yUU!>zrh5N8MofW;xG8dgh*Cq;*)@g%AK+l3LMPH`|M7}B+;6Qk<%Y6F zbD(kF!z$1whE8D`rS_suuFWdnl#|d)tZ6^HsrK0yFkmP}ZP8z{Jg45yF6V2I-W$}3 z``+r0fZ)+VftJrv(j|rAvTXscM1vk;H>CsVV-mQ_a6gHHPjvkaLXybj;#;NYhxfr;>jFKpmDGh|4$p2*XME6C(zk ziS^SfTS}}yaC&b$i59RuRUgARfZFOn3L6K59;$RI8_0-;s3zb;P%ya@qLD>}q)=yA zF0XK1RJ$KxV|ScL1M)s|6uJY=;m~F*OsEWp>;t_Mb0dRqXQ}EPAMwv}`Z-0YMKYZ` zky?EA1hq51AB*-S)_UD+A!}yViRcscn%dY4T`$NE{UA6h!@zZ9pad0NPHn-rF`y@S z2*OZ`*{Yl8)pW8MmEoC>B%G6~cVj8Sl=R0~H$!VXMXm$B5)WV7n9R^(8vN?9%yNZ} zKNA<(xOYORtBB6xT~k&JSC`_Y;(CDK94C+kgvn>h<_$K+HOjFG3*l;lVL1X?!UuAT z3>3X$-<5XHZOwj%w{+U9505@mKo!*6o`i(qP;Sze|j7nEEotpC3vAxjQJL-mN z;3XpTRdF@9D19qMMfVylv#yY6_7~@<&Gh-TJkIf(962tAI~aIUgTBE1O-^_+wMV3W zI9Wrz(lnjE#2}0v4#xiQzK>CqKo*y77J)0-!vs?gbBq&*(#l2-aeHM%P@DvoCs>~r z6O{S21xjEM3vTvu?Oyw5D*X|&88kkiL-vEO(%KZmil9yS9LR5P--CFUE5LgaT5#S7 zZIvJDU7ojy4y!68Rl7e|AB^YaH78>uiHt$|S}U=Q%WinsIv-!OB5!9*-h+Fei$Pu*YY0AJb0=_$l z5oQt`>3tOrYvIfuE>JUnp<|MhFD%UCcfx{Lb>(A$uWg`;%ibKUniY+Zd|@kmZ0R8V}P+w z@M6!0yuVn{$8{kg&^dR@AQyPkiGwA&FMvBymp zs`wCE5yo?HqPi&^P6TyE9#VIS=3A2!u@g@`H?xCd-3@f%QiF8a%H|m5h@vfjD|FVLo*tApnhF%R)zMP3UDRKLqb`a ztNrCS#%Wo6(_Zm0JJk@K1fy%VU8I3`l1-mBX_pGs^_-UtqMoQSm)2sZEEv|#T}(LU z^Q(Cj8fWK_Puj(brcctMcAnF|4UtZfIk%94?as3GFQ+Zw1r99pzz}H_v1!7*w}N0%gKSvyT%iQEsAtE&S&&5QwJw%x zW9Q1`HguExFhY88`pMB{vC$K)Q>P@et?bIMhv~RFrup>5`Ct#+ER(V6a&M|qxNNPk zM!97A81QVx#?6q-AiS92VMXF$)q}_lMq4UsPs52#v6@tI&{W~rlF2dI(t8qVaE-Z~ zG((*DPQ86Nh7v2SJb+kY{!?;pg??~deRqL2jbgE!gu zr~&?=l2X*c*4f7B7i%)9C~b>L56|7uV~{>yEkS*t@lDWN-h&(u&q87$@JdGS>$6}p zej~zr*S(DzI5~O7z1)+*^hAdHjfqvO+BJK?472+|XY=e+< z!J4{rQ-=i4x}&poX$O@#=QhGw>P9t|Va#)GjX@E!xZ&%8xl16_p#&mXOC!VdiaeL- zZ|(_%Lf^H!%o7X`%JhIGOSx*2q$Vs>;sE6B4!6fnlE(m9dH6n`76Uwp&y@q=3e0&h z`y~lz@-kjRRa^kww?TviRi$WRG#(>#CW63i2zVrYnVcO~G6$>K3@R}^1^ug1*>Ggq;vLxpKUXCZCn^c4J@MM=F@m<&Q$)h4QDIkp22tiEEz zO*`zCT@r6;)P|+Q6ohw1HfI^CdO-Uw0~zC!LS#!YFz)i24Te$geS2k5T!i>i^nTBs z?FoK3lGqSdJ~Qi?f^Lyr|jlGA-Vlz4A@-!N^woLtL02_F3X$uWf0?&$&9 z^WvR+@CF>4iJ=OUo!_3T_03kvO5_<@yG6WS+UH+pntx+GDD2z|8a~*Ls1N4D>~Cc~ z+#M5(8wng45y0Vd%b0Rl zsdnKIZp->cq%t64;ZMUw!3gC)Bz)iClVyGpxY3)F`t@I?b^iUHhQZ$|xQ|PePR0)Z zeR<}0-;%;^j+*hYFXjhuf3I)(bN}DZ@yoXa$4o*3(L)DK-;;YN#dY^?c0zexf*P=N zgji?Hh{%0)ZF%#{4Qs(qOS46`3kl~M;|s40li0_UBH9IH3l(tB?RSSPQ#X*KD@fox zWGh2{$r2J5cYsNiArH}E(|lmP4PWCkUKi?XL%3^=jp{~`#{e9Cn5KW*MYS#XwBWWm zdhLHpksM82>iQ>4zl#ZG{jePWFUYh%nV7mtja~m?)x_paw(OcMuEDC>wr9 zY+_ElWHU;%v{^a zv?3Lg-4;RyV#-MOqa`~^+iiFswmRMQJdd*>wue@rqd(kM34jrQ|@Q zH-zbV)Y&>*=gH88N@AjH)5^Z1zQgIBTv$H+TO}puvL7S*ps=`3?bLx_0&g)LA6$a|V z2CgEb*NOLd^on$mr&%C)1Kn$LxXW$vU7_-*0Yz{Xl-Le1FSF2yye$7L<^jG)6-ruw zH&9?>S_?sbRHe-(p$rLEXfxWwuRcnBt~BD^it7x1R7g5a-+IU~h2iE$@u^%m$Th|`=sy!JfyA{eAaYYWTAX@u@SdT#8ldHcRq1C!C~h3%~LJ})2=rj zNL`8@~qaQ8IR{^utptcL@uF8tfh=PynjHdRRJ zO~j5#(L0SzW=WeQF{@z_3*==Fdhx7T)Wpv!N!+B))~`v%2n6)#AtK>W#aM(9A$ zJ9(fAb@O@&La+0$c-l!HC`*Rz^YN8)equr)!zXOod^rimT+f@errzt34v$A`MD*M~ zWD#93j_xfva%{W-INxXvTKa6$j~UuM?mZR<@o`vqRZ>b-BG)ytr2Y`+r70N&3 z`PKdhf?0CozgZ@irf!|+rwE^3If?Tk|NFQKikc1L1Qjs{aq_nZ3YE{p-f|<>X;~|2 z>NU6gci`!ojj2GMEXc+NEYH&MiGbRX{#vxw#puV%66jilAnMcjuT|fys5{7-xHSk} zrD&MnBf8hDm5I8TE8$jV;c7yd%nA&GUK?1GT!>+}>5YwpP#(#Jl$k7DvI_k0C68fE zss&NTI`uZ7+oZddmF+LlPY60uwUDsnqgU>Cj$;65$ndg z50B$DPsA$bGnaUK9Y3Gsc2^q5n(NwbcOwT1lmQj%F9=P2kG!ZswX;x&_9NMKu<-a+ z)lxhiwfkqg|98VGFc(?|7~=D_mJGA|HG3$e1t;Vf9M1P`Zj-DX9-qVlUb*O_txFPDZwH^1 zkS}tfEayS^R&=}KHd)>GWyGZ)Xm<-kH-Rb_B_TPAd)PE)T59-_dku2pOvDT!^QsDtd!hKYA?Ao(*`Hoe>VFKj_rzVxYUms72&p2TCOM%hPC{#1~nf_bM78#%* zP;+T1n#Hr83f_H5<=CtDn>!SC@fYOm;>-M3O$F1NY_E*Ho18dJlkCqqQJIF#Ql9s(L1WqXCOKGr5iY9 zUwOGtEDCYwScJ=H0|XM_X+Dag5Y(+U1HKGozy5T0DAomjYBZWJR0r(E(i=N8<15^z z7^z$BIXzSqg^CL;a`-IQm!L=ND5u~ry3;3u5KiaP%Cad-2eVGqEGPl4(%4!eRl`X@ zH^McxL6)|OV7P1VJ2W2rHGeJ1mgu995QPH)E?`Wona(dF*e+ z*!ml!BE)EXMBX|)Wa(!GVxjm}elI(u63fN9z%!@uy7w#$PVqG=Pb=h9~mQ#iL z4eew>C{LD@UA5+0Kh-F%21ZMUcv+gJaIG2S-OX>|x?pps&_V~Y`8T_xEu&tOX_7}{ z^v&zz`syd@)K(Y`s`-dYyn3YdYw|@5XzzwOUGT_+C+T_ob~6Z<@O7_TkYXU_^Z(G=hJIDorV0faZvesCzZ-Etl{y?aXo)E7DgfS)| zb&Jid&!tAygm_OO*@tZt>h>mlJ?>C+cv@`&iSx2%zRo8joii1sr*z6ZWD4&MjN;_4 z)@_TP4(uJtyqrFe;ANb;sO!!fb<3&Yy@Dm>NC{ncObuHt^w%>7<&|maWcBQd)BGhz_w)+1*~(MnX2j zIuah5i|*%Z1p!Ly9R3N+&&D>`gOPg=xHG_0W8@mC6-hzK#RW#9VAL|{j-M)G3#z`c zfvSnx1vT)Y;F$M%`5p^0z}~mr8xULF`tcj)c!~Am8w?>uy-mDc({5M)?DuIZvK(6C zX)FihE~qcHu$1X-Lwa~Kpsq}AJ8}x~GUVL#OxcazpNp8ldSSPS!ogxVa|LYk{IV{A z_3|bAbt4A58a6(8`0{j@vyj{bFf;uN5S~XDCgyD24ZDtt7Fut^6VT0er#<%fs(yZ#Hse=%BrdIzCD zhKiyUv~Ab$kiBDkL1Wb#W>%%=i7e+*s^+s#ERNe_StZQ+A+?}tGn!9)FF;S(%u$*U z>uXv=9jCZw9PB4m6TsCZ2m=FA8?UJV%<8_6F_4}qa2Tsj;C)OylNSV>7;7VsHEshv zO?yru*Ir1-c7$Spq6057>a&P6Fv_ufqs8&CFr4Z_bcET(L|HpmpyUtwzL{tX5QCQ` zLV(4^js=tWVxTesR@s<^AFT+!!|xwGxnh2E^Yaro1!X1LByHtZ(euOTZf3Xi!6+J4 z>^P>R7P`oEAd%{rgR~v|oa4r5UWcHpVvQ6HOK@dhOQNd|L zg2b`h9wSk@M7JR}p^mab#$Z@T^sKTF_) zYEhQOZal*iVR43xrDr8D2|?AS)>7lskZK(~5lY`s%|eo-LqPHX$~iEPxeCVM1klrA z+zw3ygg5vCB|U15;1|q5g&1vApmu8Iv?9>Gs-jcB)?GwzE4Hd@g2!_hssBuYuPJN0 z3k=6n#}PXJ2>_bNBP**fZ4ztjej=We&yts(0;`lbl@(Lt|Bedkf)Bn`ju?HWU%oPU z&{m!pi^A>5)T4acMnDM~y6RD!Q&C@gf4))4Eq<_EcL1c_E#rEPQ*WC4oS63G`DvG0 zi$`B}R(-kSC!Z&$35_Jo=!Bph%ABeoKOQg}~-n zw4UH_?yZq@6zO2Fmu7Luh9Vzmni^<&MH=%%vzUYd$dvF52vN%yqI2V1wr}69qei|7 zwy`pZZ6Lg0B^B=1PD*HhR2R(0Id>G7BmGRC!l@ z@9h%22)d`)j2cu?G!nE>E{7;(keuK(fG68H@iSBG_%;9D$wv1^jY)x?k z6EtjcdI)wyfRc2a00v)MBUG+tgqJmI)=gLiQ!BxWxWdxf1~++XlR$@^CYOs?4&ol6 z+|N#*pOschO*Uf!W|&1&jaaUy(Ns?}h^wigtzoPhzR~6L?JYF(g!CGkljJ^_7eR}) z$kL(8tSa8wJ_D4(SNti;iW2Yl#Cx#kg`2rQCCnpWOF!GV>#81}>P(Y@ynRJoeiy=M zVWcgRqBpqLdkVo>&?*7R#Nhv)=(-?jmq~g5CR;KINNlO!Gfze`9D~b5zzrmu#cPgS z)Rd2EmEl6x>0J|WN9(7o`jfd4DdFPo^W^00d-2`$yqy}YpZ*Rl@N{2@>X*LfcQDRv zVBbR<&hRPW#JKfXQ42m)#gx&e^kMkE|LtFHZ&G*9>9{Rsp%oNN_tYvK+ z{w6(w`Ngv^@eYWJtgnR>DwbC)krG-!#B?I#!W<$5U8}3@kN~*ZLSK6WA?2@i9?Cpo zvDs|i+0DEn{9c_P35@*S z+m(Lk%ekm-gyn^eEY{>+J5q{oKmmS|2$&i3jkXUBy+$W~)WllmST#Tij0E7bi_* zozEdHapQ4&bG{CunN%vSK2Tg2uF?C-YLyVLeC(APD<&q8W}{SbU;FRqtNgG(_TTJb z)fv!B-}&6XP?FOZO2V{5Hn?E~pY>6xnKhSew*$9-hm{LrMMu~NBw<_TfW;5tju)FZ z_|26tq&mi?rhK_3%%0i~>F$B#FKD?j8dRQ!&tuOcRh(G|Ht9@&uiULDzu|t9cbe~D zP7&4;2k5o1bYnO7jHmGjZo;W+FV=$rD=`Z%bP+4r^6$f$>`J_QwZs^&#rmLj=(8+k zO6uA;XW;JRSSM`e#Qh)r>1?_tpcE*?%4NrZ^LzS0^=B-)|xt{K-= zD{HdZs#K8|x@A(6j}K#`Dvr%XNM9&H@H?XD9aWsQmnNb}G6RIqRE|ZKtbxHEqN5euYD{Y50;hWMN+x?62_S@yv>{#xl7}GYE%;7H1)w_ZBQc6Q!a?DcLqk zHL>O_9g_Qu5|04dTZ4KDIoRE4M55aZZ5aYFC4#X`ODx?&z{311E7JA8IU*&6^l+fQ zwHmxW2yyXs6fEPJ)mAZ>?znF4AAjNLnr$-B%ev=L6zy zEj11J=nT~845Vlfpjs&MZSJ0QYSBI=w9cKvBG}fF4ef=G(*CKXt=Id3SKmX)Sxtx* z3rr_G!d}p(fQuU|=sy2Xqi$OlleAS|7tpU?IzqInwmzGfjL>jiqq^7A-!%X*3@W}& zAK%q^Vmi-VPyx807;Oe-arzb{qV`z}XAGiq7O}%$&HO*|r8o_`z#a0m0nQTQS-Y}DBXzk-&P6i= zqP1sIBV8_pFSTja@jlgqnRyH*k%LsIa2_Nf)fy#6wvAth!cdFkHAlM1amEzb$=Gw? za^+6hc)T=axd0pLsKYj!4xoviU=1EzQ>5jKi>}1?*~o3Ry8I7Y0#ino&0sZh%AC3b zjcp3J!LsY__G1a=x+dWA@hwUEqy(qGUm6~#kBq+vY7S^}wuq{q;VG9M_KUeQ4^6>K1vkdxg0%;Zq>T(v z{v?en7TClYb0|NcQ&Yxy+%AdnuH|Qs54yF}%ETHyCU?58{cUDaMRw7q%pTgW29m}) z{XmxPKrolAy@?{YKcKiyT%vQT%?_rahNYuby_K5wOfmh8t6?h-dZIe6ez#j8lJLfXH@FeCNRrk1Sd87FL zPaL0`1r_~_FJ~Ho2LLetH^J1u6QVIPaB}>Q8mk5stEyRAq~Fk8xv{2!cnV$5J!OL| zjKt(Dn`MJC5-YH>8>=hMwlmjTTo>lrCGj}1c={esY6xwz ztdzH3S_9}qqEGI~~3H@_v} zoR8{TXG$x-W~GVOK>Qq=_46!Fm!%w=(4lM?Ia(ZtOKCkkU>3Z=>zc0RnMs7T68FY3 zu1FEP>a=3dujdP+x-W7zRc;Azs%75nlqu&85p7tsK@7f`Q^NJ0v_x-nSu7@aWh11O zz~BeJmHeQSTaMj{sUob6a$#xHxh*&kB=qG)EEEJyiJ$Jhlc56_`=_3wu_ZSSM#H3B zlCML1os2_kK9JP7sap0Px5YTIjXKIUE`%=3L~3g}*aM|lq%EimZ;XYgaHrunh}P(I zReTJ(ODsF8%~Hg9i1OSv1W*dE% zdsc4dj#zzz5T1=jKjC0PW)oZpjEan9Lr=OQc}Vnnp;Wp8+RkBm)SNc(adC|mXDthn zjGTx2iDs(#mCmt=wQ~VOh0kjfafjbiL9;*vYZhXJ4>VDwDhIV@KcUQG&(T5oOu{f# zNcYG?;(%BzlL_+l2j=@ms<4H^C77NAi+`6lhxSwwuf}z^_yhI7{!*FYN8+RlvaAy|UI@ZZ^G~Nb6;JRPqO}qx{^dr#dv%Hhd*0ifafvvq zzsuFpVyqSxH2KCagMTfKPymk5!a#3Fn;8t@YYa>hOh@X9G^YuOV_89uac9Q%R!Te4 zkteQGS$qYAMxdr=_(<)`Ge~%?`y_h3{rlr>pW028TN0_?GhAzswXqj=Y>i3+Y;lk+ zNTRGr0mDvm7cyzSNbQ#$G3DPttK%%%7l&#h$K2CkU6a-E)B zcN>J*9p7(q&D*JogzK`r!~El_yQ}aJEC03X;(Z0mf7hYXe+iO&_9lN3`tFF4`lIDU zz|sU+yJP_=YO$)LT)wy>?&ub5%Ve}VYa>%;y-=~skePlFo}wju+st^o+g2SF>Qy^1 zu_PceJcdQQBO7{Nf1*SN!7-5RseK}0Z7t}@Z6&ReQT^BsKrXTWOD@HsDtlGagRof7 zuieR-H``~AkRD%;ts1^Nh7>}?F#92hvpS|5zIIU&Bn%H z%_3sekMdHdd0RImAxiJpxMhdMS6Q~+pi*51h6GP$eOx&ej%Hm8Q4EiR3H~Kb?7w|A zoY{7(a0!G46H~K+$5rlJ-VT7JC)jHOno*h-*enQ zY7*{f-q3r_sANBYyAdcyFh!@GMM3v9pO3lBy<`J`b>w>DMg1Ywnt0FbL&La5N(w46 zSOYqgYGMtp{I!HI=3jWdC42lQm*>Bpfvf$SmOv**v%eRm8Tl%34q}jtr2cZMyszz& z$-i@00aHDDJ%cYA^q&AOBD&{`_w^K_$@AK)wBpomq3zc1J}m$b#{4@QDV60HZ)i!m0P>s1ky_@O;ZfPEI_ZqC>+*!jdnwxusvJi0ocrclU(m ze(B|S{{APhBrD^2TFs@QY6S^WhE)$$Gw#5$=jj|E z37w$44G=_35^THAL`*l@R(N2Ww%RZ~4SW!({~GTA03iOU=@IjP(>1@OWo?}74UGO? z;THVMCbvYmkTy5~KoU9t0Pp|Urv4w&N)FTp4$cW`YqN8>@SQG$F59Dh&T+C5)x}UBsj&x zf?kv_CItwM%=a4{3OdAchGv~dm~S91hjvZ$Gw?xM+ZO$)?&CBmtwKr9%8K%LQ=~PU z0bsPyfSpy0=1)Vzl!TCr(Ig)JKo@zk6vht!jCq%0 z>$8dll{+aH;>-X26+-M0j0-5rJX9! z9a+?Uu$1R!J(JIhoK~k|n(#<6UAd!RXFW%CKqyJI1=|QZG5{muMh_!(G&cQsQ$9Fv z0Zvn&6yUSK?@V=wT0q-2VhJkmduvgqFj%GXL$|nfH1CBuKGzSP@Eq>Jah|>L0mvU0U8J&L{I*V^&%_XN>L!G9A8=Q*S9jT1xxhU4!>#d-_e5UGXq61GXsr z8wSWJS8q^`X>R!dDQ!)!upDh2zdW>8O*~vBQFTo~)sgp!`w1IF2g)&FW6#;(VltFI zYL8Kgkly5_h=|YC)#%8kP|f<)n)}I#7ueI#KcK%wYj%$1=4+D3keZ45$R;oq-Di-YVo!NlFoHuH3h4(60; zRV8C9{})EYf0Vf(+=?vx>o)e;_)cIkQJospiuG`T?US zqPQnuf>qNKW_SZ>brdn!kyCq}GMQ(3=V@-9m#QP<0%+NIX(p&7P& zIzpv^OhLKoZcC7dFm)xmHi;CPHKQpbov(tp@4g zm(TeDJwE#Y2YNd)JpwWL39DpNg#zSN8h&U_L5LmWQc*Z|w3V;UzxVrJ^MxkjgPU)_ zE43b*!AtMIm1BP-lsMh&z-CD2PB14nE~Y+_UI)palajFf(5J5K+8sb*0h?h8m^y|x zoMA>E0xWxG5ZE8S@IcxPoR66W_rzw}SYF_AovV5;7^fMrwy9<2vkY}=4630SQK1VTFg;y}ibu8981||6v^hxU-}z| zc-L}igVXUQ!9ov{^Nv&sJD1|J$~_aq4*bgIwh7~DOy)V@QQ6%_J@sh1ri!us1NYHg zkGntp9`sc543yx!KFDe^Wk54hHF_G8DdaKWDx`#2#sfGL4E0xnZGpyjR2BUh|LG7y zzuHJ<;)azWTlVJJJ%sFrYh2khSof>8824=>xJ=v|v4OmVX^}ve*q~ogy(YWESXF1! zF;y^qHb^Ej*kH)*poD0okC|qvz8s!@`)|0DQl=D>6%1)koDz69*#_MG_eqH6PXQ%b z^BkB?IMZz?0yZbVpzt*exzVC$CmQh3Yo&p-T0&1uL;{jvBC6M)h1GZdlcNd%py%?B z&9=z@HSFT3XK!NU_;+?3tN+o?m#ophQc(9FcK+-L`45=t4||$NHt2t5GEY$eHsHuska#0_IqFz}INnid2=LN``C91q`#CKXM{NqkTZrh1(#lc|+*K)LJR zi9A7aFzAXo5_$i)G&iBlpyv2?{CC5Tl{nF1Wfky2a=R3wJPgN-y zZ)pugg~H(Mq>~=(a(Dy<0n|K@3*rzrri*Ec^%znny+;78soJ~3H=uDuh7Pn&8g~v+ z^y>il-l>9*){G&UFz)n30bl5TZUr>u_=NTAB(qt6jEihboYBc0SdeT5Q!C{%r7e;F z&|NjG((ky2!nW`tU=;V(Nin|wFEx$p*ha1y3T%@j#_YgKMJ)u zWN)Rv>9SmV!)59$MX09GVJ(93q)Ya=Cgb!n3llv9Z5L#&m`R*qCTXUzB^eDr;Qe=) zWL`$60px^bWqI`d-bRe#q8;)LoGP)H*mlbTjUD+WfC#M!o&G>+v{GDWWbGSD3z@2w z0oL38owkV<&T5e0Ygk42w$+BXraD;nj1jW(zYDg*!FXJ1sL^N*py}b$X zB+eoe*A-TveM7%>sjdkOE%f{&iO|*>pkj3R*;{&OPt#YaLt$-c@541RcbE{>c}Bx+ zmifIQM#S>^QTLoStn8+>mWMUipi5DFkLl4`*W?e7HM%sw1f~|m-6-Mk-+C|2$Mefb zr}wO{xMoma6$#gj(2pTW!PM!TuD3hN6N8(t!wrKIuB>$uYmy(xv1V?Xu#F%Ne6VIq zpAGdaM1aC_SHV;%3b!siO2qXkx~dy}K_O>pSnOTCTQWslD;l`pF+D zP`+SmKp=K(qq*yvP4h!*Bb{Pixx=NEue$_l+|JkVU3}+<=xJt)dJt3BYN+mOb6?&} z&-_LXl_6VSpksh70vZZy~WWhN|Um+wcWRO&u{~q#H1rG)^=NwBhHWDqAAdUXGt!T zhMiKz$x~P)csUjxQOHWEpx#*`QC)o%D0~Z`{3gLX?`4*2;8QjxfP}{>~Nl z?1WNLiui<9|54?eG^juOZ7M_eDCNZ#!Odtl!xknnq=|sP=$w69*QF3dO!9ZfqJktB zoWrCutr~OFFJyzmkQ#|{9rr-JaD}{-ydf635!3;h-k!xxC@g8>=Wu5G#w>YzP`lcWc*r{}SU78AkEKA%%I&C&uEK%`<0s1Fh76hkY zd7Rx%yEi1#$bADxLmOCJK`u%B26EYFb+=iahqY7D>txYnV%Ce=dgS-i~5p3au3iP<0 zo+VM^9-P=#$Kl0fQKhrI-0KCQ;;PbHY+)OnZ}I_+*7d5U@jCKIDr@IK>L zW)RGh8swZi?A;N0|MEt~?(CF@*MI{fuvFxB1;+uM$Vwyhu&qT*GsbgmflYB|;l3fm zZe0xTsyLevGe36VY1NglTw#s7H+ko^6n$LqgO)~9*g0T_v_Q+8UeFk7JOVT0_pqX? zxE%O>1kD23z~5m)gMY%7eE%Z|^pCO(|3Bs>{x{73zk09!^L;4&?+)}gwTQo_DZv5$ z7_!?*$C>*pd#?0#Eb}k2`Tq${|I?%U+r9m5$p1(8)jz>_My!?vA|F!V)`-bm<;QR9 zhKhz&!KO0V8+?3GJ|sU70-wCuTnfv4clLPVYW1K9<|OjqU*@5rrOLL2ZCaJ7$R+)5 zQ{okpIOu@`uwA=+!y&9yE`ojZ!sX&4NVt{?;Bw~UAHWbFw=uio`RHv4ps+Qyo$a6;Zd_&t73^Gg1~KiUp{!eO zJ+?W0?>Ktcsc`fUV!{zajfzEIOPrst8};T=XS0sW9I$|RGp6re*wdc{HwkVUt0DJhqki>z)!sz94Our5OTEs7swKuT8+m{Pu(5p%0w#9zRjZ=J!Ii#>Ay~YdA6&A+|afq^7ulcix z2qHedl!fU#emjTTC& z4+3LbdqI&xF2(M|E~V>DAh0ZP(X`S({Se#u5GGsZ>P>IBcwu~ax|Xx^zNd5F2n4+MIi-)5i8l{gc$vSyzr^q$gpGzxxd z7&?j9gYYU}E;m>2&E+Eh0^89e-RI#imR9vBu+eRpFLn&6fszc|b|wTqfnSdZ)Fpq+ zh@KzJmkXx`y6LNTVf z$(Dd80CV(1swou53B@S(6LDRK@D{ko=iC^Sv{D$=S_YXzTJ*cd{{&vn|x1$Pq#Hszu`Gw^l*Nub~$O|U8uRePC|8mLk|9rarLo?z( zy}m*XOqD_i{x@o@rhU5B%rX>tc5p{_ZhZC(I3&0}PcPt1bl+IcvO7&y$5UVj6#3(( z`&Gx&=FL_|G_YXA@tgMLp|eTR)cN`C^;Oe4tgcf{L?FIz!>)4_lWt2SmnjM2iTP4v z+>IAQOsR9ZV$=blyyt=)$H0rBQ_%&X`)Lq@Sfs@@#CS(sOPN{*W60cWM;x*XNO*+0 zMx&+mIv&bNa6ho1qHZK8M}qT2{F)wdP`N(6j!bt~8X>VPN*Xb*%WUKor|uKsPsGH% z8ch}4d8!rpWX6_3q%}O2nDR)X*~)ZliTeUcm*E=V)FP=WR0`e!z+A#Ik`%=y6CWoF zqMLdPIOkOBcAac|V-C-S!))}cCetKez|unKYW0RRwCd6|V!4*dA5B5>)LWGosbaHu z4ol){uuiHwGW>^~1a0bMEQviz2#oO!PQq)L%$qqKmE0&~X{9o1%2~DHyhb;^JHCb~ z^1bKM>P8oBaI>^RYt!hy4+tf{G$^Wh-6+qvLN7$EDA<8LVDc;T(8ADE;lm)2l2jZ` zRW)@x(}SHN4KAsL=4;SUAoz62z7f$fQW8{q_!7_7)HgY^eRI&WhDg9n1_Ojp!bo27 zS7xNm%5RVDp8dq4U@xt%jrTzIokdp+S9TQ5Ekg(ALrtbg6jhrL__mQaM=eD}Ycn31 zHUc{*HheXnJ#`^7ZE=Q#AkJVE7LJd6ot9?Jg;`_P4-{E!w(7!^w&WI)GkUK8vwk7?S?FZq&h z^~lKf$g6-qvI5RLJ54yPh3 zd8GC&V>whWwl*;3`Yx{bezdtVumVJxdYV|x%5m_t5fr7{IbU15MoLix)tR=MKoT(G zr+Y~UEZc95*;4ZIG6GnMZxlBeb@;m3sGdjz&S>Vw@(E$Zfr5G*WA(Lb@%2_BB0SEC z=#u&t@t+nAs{Q$O=q${jWRWX#1YsLl*zz?E`+`da1wePxiQ3qvClyIX0c0$M)sI~& zxjo{QUeH}Hr zQml=~$(yXGE}W}<1#C&5AXY1=#ZZ5Z-PPvwNE25yOG>2D{OYsI4@2P5>8`T#anHEN&M;`DrE2-bgHYQo-Ow5m4yD&a2LyD+cljRHZnz2 zBaOp3%b;M+-o2prENLosfH=((|7k=PpNVz<=Y!_eWEr=`@3ZIxr36eLU3?qO<6ZCK zR6^9_gcU*G`sQ#^kcX0F`RGtc{#*^+1^yOep~Q=bT%GMgR)t&%^aN8vc?Kwa@);y# znTi#;n^{Tu8%cTza&xMZcxkI2&Og#E@t8k;tje1)R}qANz|F^h{N}OG#QWs2AI%M2 z$1-2r8pl#BoVQha+>f!yUJi8qh$G)Dg}DADy1YT+^w=HLZE)>7zvs#RjDi?CV`kpIA~ z)5)Ip%nEyI7x`P&Xa<8W3`6xCJ%BdLbs)448%xvz(|$Wm%@+MN^X3TFM?R$)nbrWa z!a-c}6}sz>AFi2Z%wUuYLcd><;rm5^!d%MGwwwz}VH(w1%rh>?9j3)^?km|V`$<5# z2TTZyTD@vBUfP=)0%=t1hzm-7oL)3wl?|;)GI|U!jwa1xF5M7y#>CwEMNZvh{Q45i zp*3-Yi!e^QVgQS!Ka`P&rmiR2JQwM#=Gw1g)GOpPDs4sg4h zlp?b8VQNSQwKCEIeZDe^Y06HyVlamH0=b30k}t^T?oSECGAK(~fQK#y`4Cm9a%LWp8+ zYGz#(RtpuIM<-xOEb<{$lZe7Js~K;6yohw69ZFL8wwo6HrO;5^G3b%RqHkm{QEv%+H8Le`RzRv!>lcasN;SS9PJGcl|6P=T*4;XT@#} zdzJ*junD?{YPvlYA64S6gIQ#HxH)CmLk-py`t^!g4HrvJMNR7*!L&3+Zl4&%}VAgz&0%NHb|Q=p$ev z*OIKR46DFvGnE(@#FmJQ!ZjbHttzeInl`&K*GETJuD@g7sRnf7(lJH6Ra7ziq?vL` zZI6wik#g#4&p;J_3FIvsiL9Ce3+&k<&sH-1Tt;2ItGSmuKh$doH&E5PkW)Z-43fC5 z5f`p03R0qr>_A%NW)fzFXTGfompebxLzeJ-L}c~M&AkPsM2B4u_YW@A^~O0L>rq0# zX2&W#yW2~q!*ZwkMSr&*JbhnQwyhdC1sPe{eS?gys|1~!aNMqRys1>fsoXc(uNh=* znMc6!ycVS+G8;lN8*nt|i8|A;r2B2%59S8<^cvj8AWMW`lQ3z@Y`)6X?v*0d;OsWspQ27WJ5Yb2?Tf?(a-+>FMSHj9-BiO!K2I{XBe# zfwcx0sdb-ZG90wN4Mh`2zg@_}YmJgJx@)~9eu1{8k{{fjs;8*rqVgqFnb5;l!YR?0 z!ot!afKzgW%3V3tL8H<*c@P8#d8W*_G^hpc+$xRtub~Hyxi7m^9nd`d;B$Quuo9Eu z=L)*?7;k?fS(-JH<~MNNh84qlIo7$X$-atKs@)4%S~yP~|Fh9%zjPh>pbN=vTmBsJzg}&=D;+ZQzQ<&nIJB z8LX;750FWig;tZ*JLjlPW3kAPz7T)6C~yPJb*aMarEI7v;5dP~bEO>l@(U}&1p~*8 zD+=|t{4=-SYX+p=6M`fu2SSG%yVJrfa>-s>*2$%mBKX-@CF1ju$#bBApqb)a$8upp zb!9W-sZY+s10xcV2~aLCV(+ff&SRxv7p)VguZgM0))t9p{+F;U3hc(OEVV>O1WhMJ z-j->SjierkAe>}ZDy;S&-(kVoJw8%>-l0pUY_}sZsIXiCeyWy1gzMrg5?C2o0!m2aE?O*Dy4;i7i!DorspR1k^Tra0xu0}DLdwcXXbnW8Gh5H9Y3M{w(DD^8%&^&In#8wv` zr|}Q<5FP;f6*^2rF0MA^x37eUqMra6v(}4GiDIne7T%@Mj}IO_=AkdgnNfl;)D13e zTL$g=z5h`hF>EAT9i)|||I=I+k?-Y47Q=}z5sB(Ezqc=7&(joX$&p1Q8!@S-E_tC~ za+4uYn9R}G6TSe zEy^1S>RkVm5lWS~B^&B^|3Jdr;*YE*?qs#Dcv8eM<3$#PHc@@s4@e4E4YNvznT2(; z@!`2UcBH;M0=$}ZRqfvpYVn`QLUMH92I@p_&btbl>)Su4WIcS##GflMQ7N32Dyt1k zs^VMf<)vipuS=`B{e*g3RRRXc>5ZPe!InQHTMGil`QI$Hl;`KeWd6QNlWulfTI83HO# zG*DJHV0wo;O9qkRC$eo%i~ntvKRVG5ftuYJw~XS8)*qb~>^2CPn_gv|W(Q8WF`mhb z^guc!Jj{n8wzmcfUckgWsV_TO@5_EaxUcfge#*JSAZMn9qaa_XhJP4?Y$aGKE$+Kh zm2P&s5HR;0dY~Q+$f%|YmX^npiHr=U9w+N!QavB~AE*6(=|Rp#ylqK1me)poH!w*huBSc8<;fuBdmr(v)rvm6;j;EtKq%9(D+ zzj*#07Sh#U91UyaqBq$kd^>fO>ebQ~xVX9@z+v5dP7f=S_SYMTXgWcx3 z+aXGG?Y5!Y$;x4?8f#)tI>SA&uIR?#61Y?Oah)sb%}d)7F_=Ca3vDQH5t>pXjz^*m zY#kcy)l;1D9OKDj%&8Ib47z-Hy6%wOOP7^zqB@N;aIz0g|3HNzfiq-=CTGwQ`*v;B ze6IHFz_ag&O<$G5%1U`eSz-Y>15b&{a^L0lRlFruXN%18(h|wBLsl=CrwNNf)tJ=C zv1F4uxQ>AHDeE9?K)-PiUMugM5Fbr`I!Moa3WTV(p$yjzGWHn7RMOY4nb!=23!AYd z8`Un5d&B!0GoCeT1*`8jJf`vKCa^nTMXoqhb(sIp2r@R*ae z2)NpTmsn;?(XLr3aLk zj6YR-FSE;T9Ze+2Zc-e}%Oa+fB-lhsjz43?PZx3tFD|>UWyo(d^-I3?34m3xubsHsAN6Uz8cKlV6c8J(THXbF}w|Sr>9G#%_;QOGT9c_c#ua} z4)p;=z10H)PWtvtkOLNj32VGUq!4<;J>oy6-Xe3@1^A%Ko6=DXgY$Yz!&EHB##)aHh+DN|1|*W{@VhetAUa2A9C#f90Zxd z)gYX{BqOZ9s9XO32c!RaZt&GwRng7XNXpE?O3%^2ROqi4_m?+X5wE6z$Ok|4X@HRf~6w}Q#tQK{}z#3JPFJa&OppT437+rv#jVQ%>Nic5yl?g)= z+OlV$)?7Sp3(41iVe`*(O(c&r0EH3^N<7g8I_`if!Y{E4M_SjV=qEP zoSMk})U=&|1!P8=M1A6*Jy}rW>}O!naT1vqdr}F==);X9s$Mv>ZCMWz3dCtDRa3N} z-=9i-cGuTUg%UQ3MmL9aoAIGv{K#F9eVfU`mIUk{o%~|DG+al?mn<55cz@PfM(SRD z(=d=+KK_xQ=sqXY6tY#9^lHE zAFrcu$6t3oyVKoH+Q6c6t_ssfs|B>6j5!aY*vasC!oG zTDvghkEiu`=1X+B9Lm#vSU_LdU*d~Ch3K1zn&XQeIER@5f(=mMlgGFY%sb^TniIAO z>S@*IY*Z!@pNX!{CSoIerC8~!mE|;y^Rw^-22xypTDz8B4!(6JFZ-0;0!Vw-T-<2? z)1oY<`so@1~U~YO8K0#>XYfTpGC`LCRc1EEe99~WZUu~?qRdETk0L}q}XoYXz zh5TD_n>Lk^uwG64cM0^E_`y`Eb3)Iu_e#x9-@J?Y55-5H!bcG~x(13|^TitJ^1X|4 zfqsnhad{^uHIfmQT!y+-HG-;B6WS$))YriGJ3%jqqS2{10|{1@-+p5-lH>*bkOc(! zMwQ6}y7~DPXUX{3MjPEyp_$4WSXJw@*z1e0F19L&=o`{cw%(`Rf7h|+4``Ik{osrK z1&z$VpponUK~(s=ipl?oQ-28s1u<*Z2y#e)pIV^8F`31@4Y~6_v+HA^+=EJl=kq~3 z;P?F~T#7i19Fy@JsyltB_K-tDxP5H$;B+-DrW|Jhn5BN!J+Z%^y)B);JUqS00Js;Y zslvM&yNQ_R^KW6gM`AMyOgWV2)Nd44trHxqUD_#l*37fkbFr9qew7w+R;17ZuYMM& zZkh`Eo1k0Gc8WESiRu#J);oUrBdNFdH9v1VimK(DBI!moO@^pZMb$x3-VYMPJ&Ju7UM`PKhaGt=y(|%4Ka47Z^{x>n^coHE3tX1FcyGf(0 zT%u}?E06drqq!Ku%fNN(jFS7nPM6-wiXPpzskTJdB_=?Jd_P{CyGRD$U1KVAka@}p ze>rcZ7A&W{n`M${FKIg5#Kq~-h?4XsMfj&2$U|f z5&8_b))z+6W_~$56g_02z}qwuA2`K{+QynX4Jvd*&8$Mo9daYdm9PXlArT|R;Jz7l z>;5lZ87Mt_t58hNMrp_zpi{F+>>6-WQAOx|fyHVm%9uO_Lj%15MMMSBvgfE9_tJ8T zu0yJNVFN{~dZZE=6RHA}g$2&pCX&QwM8pf_rbHdiaZ1qV-*J!sa96ehp5%fr7=rn= zkp22Ua92ee8%Y~$lfQVapp*Td)qVfGiph?Mf8&Gq#I7@?$A}p890)ty#=8G%UJ4X* z%xA#M*$_wEI4(IRDf0gPvo|ao9A6v6#>>|mU)d!*I2f0;Z(gyZ^vV27qR$(+`qv3G z0yMJBf)K7_{$xCjfeOWeJBenXHDPaSu;H@pKmf^Py`tW^azbfwb&ZJw=0q^2YhA_^ z?nw0`%RmS7b4l+sCSvbLYOsDN+$birWm=AV26$>v>)=PBs8%O8RVNk~r5u01I;dvY zPbE;l&@t!~AD#N#`%vftZ6nc%gt0rOzh%pgYQZ&H8SP_p|_@tIAUL06){hIgTM{%jzfCvT)g|krH%9QdaXnRjth{w zw^DRBeTh^#V{cR~)`KG~23$O!PPzQ(LQ(-app5$&kZ_yFCggDIc>!jb8N8jqB$|z! zCPwG5-?PtDp-YLhf{i|eD_Ck^T7jZhw0Lt=7{bLlZnupv44GE(xZcovKddxg(=I zlKSfZL`e4^NJm-aOIj7_H#M0P!Z^8m6@VGKURA9)I6QbxG<`2~PkmrNY-8WonK2n5 zjw|18NP&C}4&N>f9^jS}KLxJncl_9@s~fJT^ec|NO^=tyM*<%+*W&CrUaP^?k|W2Z z##`k@Tl`8RBL=EeJz>j@^^&!~uV*Gk$Ee1az#Fx(%1sr!@a(h@x$$#QNtUWQ8;IbQ zd&4n9G|!4@t#z+IKbaOwg~dq&7el-vibW{N%EDYVJ~+Uu0oAm!03ceXN}>ld@J zvYgA-%3CC5=X=@`Xx4lO;<2;p1f(Rl3fUV}`Tz0uPGOpLO}1#ID{b4h?X0wI^G(~8 zwr$&XR@%00Tb0=P^}oAM@3YU%x%hist-Cp&xz-aiV#F9DsDOV$ImuxZXVV;=%5SW zKPb(p=^yc9Da_)7fO7p(tCC@Z3_TS538R>&&u|)K#XeXRlSdV7z_Eyx!dhtfpbB}U zctecaTLW)MA_OG{Dg8wbLM3Jt`P*=n8&+xD<22$gBHBq#o%7^jwKaFWs%cCEt)3yK z2<{Ly206lOh7{d_L-MHzRCQcbG6`dD~2@Oh;xJ#P9 z@-RY5ms0#CWqR~ssZVH^l(JGT?CHMiP*wPq>)J|F&8J>s$jkN1fNPaKYfaTGyq_mrAR{I#chX_*OvI?X1iL{DYm!T? zPjE)HU1XSYp~8<#ZzNoYs8y@wM>x{}VzJ@$Xu6rq^7Qioc6i;wiN@nf!;oy!y;s8` z6-=$9mj?jm3Fh&kVYlEaP`s#%TrY5xEU{aB$9ivet4c53|M%5ifPnG+>!V!~Ekqe7 z8Fh6PWW0W=4zkJA{rnx0tB3fgl_&S(j)k{u4@EYiWEt|}FDFj}wZ$t_iR165sd5f- zxwmX7qtTW0;9@t2(`L~ym048EHV?r;(YCcJ##w|9=hOOdYKJmYnM#8??QnAJWj1Rq zB)Qt48c3K6g7`+oAn9==;pwZ$)n=0fDCCSg*-g^mPBoCb`b-Mf8>;BEw8}$-d&y1f zIv1)|Vuohm;JM&%&(`S(n&Gy}8ks{)U4f{K_YlNM%jg1bjH#c0Uz~zZ5EK1O_bOg) za)AE0>;kB^{jaB-ZF9SK3X$9GVe*lO8Im9~n43xi@lHnBjRJH@LF7t_ol~Mcqqh9G zW9n*QK{)Z}!V!^kP_3+?@XPl1=X0h{+SBW-OL3pU<4R5x)R>!eZn|PE@dD%U)@}#5 z{I1CD(0XB{`vB0ov563zd5_;fss-J5qm#S`4kR=gOQ=&9t=Y3ScM8oR0HjlZ2=%9~CRu zp`P*cpre*9YzKScu#6CP)a5Mbgi=GoQspdwlI^skgVZCy0fGw!Or4>X;)5Buy$bYq zTD*!`l7$0mfYaTSFMwnrotKYsj&8q3z$#M;Ek z!Pf5En9lM4b4=R*e@x?_8{l8@KT1U-0b1cZ{^uo_YgHO;n=q^~E!D;J#$pO%bj-$6 z&pW+|xej;R#^|ET@s#fMf)owqhO?KylaIM_hmwjHAJH9WU-~?Am+*VL-@^$oUtwSn zFtC^0)l&%TB_*DNs+J~ZoHyZ4-xZ~#bnl~9!r8zMfQn@{POl_eDK+1}NTfl7f!Emc zkZY4OFl?^SB3Ko5kbn~z7$Sf}!%TBzU(le(NcqNiZzKViMUJi7v|Ms~e92%ydu9pb zGAfyI(XvoFpkZY2C6*N@!8S=s8M)#RW1fX5#8g1>lH;VbMfG8T6o8?9vMS4>MvOsM zI-Inssso*wX`L0|~e?ogu&d5Z@w zm}mVl{{}6iuE{U^;XUShui3gXfJ9ToaH3+?BGH0^c$MpC0?b@)v!&NCf`$+kUXGLe`xL0k9qJOgsxsnBq*wU)3s=UQC^)M75Hu8n2G3u&;_VOn>RIg;FUrp*!Imb+#MO$m`G{t=)PC1aXK2T==$Kf@{+4f5wo9jU74heh66> z{2nRwrw`ac$5$xf5ISC@PVsW@<18V5PUR>@lm=zG2rsn9A&(i58ZqMC#QxL9hV zLMF{5qc%o~2wI7sdQW+}(=uF|#%w-$Gn&tSeTKUWIJ+=@3lyoEtxAguZ*=R<&qn`f z$eA71-*ji8HZ}fSo-3twyJu_)S2R;f1d0&$t*|7;{t5;crmZ1g-_B7B!B2<1+$e+V zK=J;9*&twAl;`hFo)D`lo?}LCXF;>%t*_lA_SMqi{%PC;KJgax3A+=nryC9Kie}d9 zKGUfd${!P*fCKSM2wC_+U15hO(Gj?xq0^8iTizDIq(+JOE$(dir6tv22esH_%ka(b zwT7X=sJD}EB5gZl2wvR5@-5U#sZyEfVaTknBQ3n+ z^%A{VNi63Kqo&_>BDgD8Y+e zv0C}OnI>(-Y(1e{ILS}#=<~PL{xi1z-#Dk%zbm``mt+5bF8uSyV|B7*B4WiZ?l-&% zgZSfz)xURPAp=JXBccD$;rcVo}z2ym-3$`^fLZ0V7^3#f$mD*q+s?>(9 z8HN}uyws!8UMM1{DG)E?+g4E{KdPgw81D>?Rp?s~5G(K1&ZT9IqvFnIKITMgEO7(J zV#pQ{nB4o-V=ecSmuCZ`bZUVF1$qrDJ{ixNMk{dBUvgbM>vur5X(o#JOX%WX{3q!9zs(Tl30La~T<{XLBlb^SHb>b^D zK!OTXks@79S>p=K_mFPk`esJf@W-2No|~?gz*q3sBgj!v-sI*+ zQXxqi!(0@kBVwHjnTnu;>Re`JCXX$S4UCvn0zqrJJsv=jJIY3xWB5E866K2g567$r|6dvPz$}a$&4&Cj-YQD|G<$^A8jYGIOR!;2CjpJ(+ zWG7t8LLUv~yy1DyCvPb9gYTME6U%WbG7&&|5cbtH7%FHV{C(8^+BkS8 zBB2i!z!>NkS^=rl;EM5EyR;v4hykphQOKW1D~ha1P>D3rG~N_d)F84C1G9h><+Ugm zC3291%!fyU*4oE>^datPmHV-wCD4bvMk5C&91#%KV1Kr z?BpyL&!{(uQ3c#2{Zp85<;gXs6q40AOgc08=eSZ#7((L1*BZ+PgPa-zND*e4`~pLn z4H*n3V=%AL_KkR7Dlu2EKZoh8nk5Gh4Q34aH>Gcda}1d?V|9o4Ua|0(y1_gW^iqjX29@WLCwUW znC;waj6O(ME1*p(yc2BYIYNVTNI(((2VA^`zq>@M+ z&QsJ;hq&B^wtp9YY5A&MRfOGpB*rqI-bPs-W)Q4NLl83YT^KSF#l1_W*X2SVNp2qF zcl)QW^eWIwkv{uV?SixdF|jDnDzm^uNGk95RVZ(%wLbKv$E*_S5f#WM6H}&uMoa4= zrfZ?dNtPF~?%fY(1TRao&coP1gu{xXfKDl`W43XLcWp067Et69}Y6MeV+g#O$sUmKJ*Jm{K;hc;;LfC5B3r>uZr zd(K_k12rM^H_Y3>sa94LBiqaq{a)3i$L25%k)${SLu)U`1=WGwe`q#+8YT^PjfF4T(39^Ft1= zkXzMWs6^;mENuh*?;;zX&Gp1D=2344Qn%bm)zs9?wYu(rRKor(8FT<`e9j|{l1u#V;WvoREUco-K%@q91 z;zxHn#F@c`+@v(}Wowi%x!As@!t8Cb4!4r< zUQa`qsf;0G3FBx-b8fOB7gv2yJ~Ca3XO_$HPT|}a^&pYyu(;*2*bIM=6j7bz5IbotntGO&GnzO|U-Wp_}Qk1n8r;rA*t9Lve@wdi6(QBH105It2|? z(0y6-#ZMWYd8%-=`(U$y%y`ZVb=&N{WWGuCitQ^v$<}G2of;tfR06zLqf%$`91V0{ zG?Me(*%R)Am8rQ<==%Ow>G^-BN5=o&EXB~-0$}{zgZ(dk>A#9!aty9;if{On>>K`c z_#fKAf3}1F6AvA=`R@FBU#>91^}_+-JS`6WUTq1i4V=`M?$M90mA&wTsWXe@HPwUv z*-Bu4I1&UcPEbcoIQ0&K#Qq8Fw#f`PgfS|vUf)sCey*}uaVE*<>-&Y+gS7$IM_x;5 zbsXuxn|P6*#XfF7+wTwWwppo&`GQ)JGBh&JV$Kq1$mm z@m^PKf=Mcx&X;ONR`Cg!)&vb!k2;M;hkAF5h@BrvwPxbKp4@Y1dg*CBAJ5Wk3Omjy z3H({_KA5{tEk_mLRNZBgEwbZsyLCiXd9F1Rrhn( z>M$ zDl^z%^bNHB%E4=A;;AzWmu_4f8jEHHxR?&`)35Qd)M-B;y=oe)5OuZ=5NeU12Xar8YhLV@0lL@cqLoLe4Uo; zmhhM>5Js!8h9~r+8oL+yFKY|qh*B@}4R+EGoRV&*Kzv2s09BuBvL*Oy)Yt?CwB!<+Ickaj6?Ih-I@&1e;FJa(atW#Wj;!Kfh6b*f2FaF zs<%E%(c6?;stvdg?d(S(S$j98|7OD3dn_yU=1)~7_=zYY`m|w@8vu@OKMJeEREPw_ zaN|DxD}1p$ag!AWRJ&$FZzu_Ti2E$6g`K5)ZRSP4>$W<0Xc-I3wvv5oeMB8jaQcPN zR*J}oR!6r@QEsNYQnT^{S89{UnfBiDp=w_(YE7j`DUd^;R(E0-Yf$jeA^I#Q^?2^r zhcoJ&vdaRj>R?GZlY*)V%zI_HT6|ciqmstP+kczf^iTJ53*FkA<{Pvm`i|Rn|3h(G z*aQGD_}>hyCRGjFe~R2@R%a}jMBu~jnnIkT?!HwAu(^QZ#Nwd7C5<&}Z_r`UAb$VA zzyT2PPJekK1)%Fr!t7V-p2|%$WdR2w@xmrop8LrQ_J)SPr|TW?KcahihShFq-6fq_aQ!dx%&_>riO9k{NMIS=B+tXUB45!USFoInpGTJNIzMSmq;> z%;)RE#VeqDdMqmm&$#Ii9njw>Je`N)2Dkt-b=i3){`?2UlVR)GvycX0;B1D-!v3o3 z7WWQm24J+$C8`u8zd@TR3|kbpET?@@25n1E{Y)7E?6n}=Wqgv|PR0cIP*C}_irG+w z)<=chl;NBja7RFU2= zo>q(!hV;^+J3x|VR2h@S5Q!(Te*GMMGdM3BwCg;%4%lInwkXmUdyxyMAj2>?YB1&| zuj(fpqjrRRB|JX^uhYHrNm>nS*pW^~cwzr?AzkvpT)7s6F(bi}$Kv!ZMcqpDVfce`jf!yRabxWnO>*%Nk8RHy9fDvv-kzo`1jt|CjS4%+vxrF&Gwhxe3bs4RuM@5 zZ)9Nq3ljXVoL3C+&k)c5K<5rM&Gb=3Q9ie}wk}C&5PKW%m7uONB~$_QM1OSr#v+(14JorkSF-?F3*>q%(h#d?$)OF z2WK5uV6_b}?75J^p2U29s6LS_6#n_&HN z<+@~H#E29?+H+e!vWCfi_*oef;Dp8?UBv4x5#igCpo9k+iEhoj%g}l_WsB8|ZSTj0X0`X*1~unh!*-1~>^u`&Ikn zu2ENp*^HoKIKJDnChIT1`@2lL{XWx-55haK&}XKq5{8j}=sN;F9;h!=ep(t_T|{A$f5M?-ch0iLU( zF_vK4IH^(Q{Y|~<6HyDc{@Y5>nGJM3Z3XWYxPkAi=2_%po~M^!(C%RUz>f@^(%~4i zjp+(f#3-C;WdK3+G%+`_WItN=<784CE(Ey01<8hhY~l4PX@^s3 zQnzE-+XXFu%#|p|arNT5Z1o;)HjLXTXCv3%Bf_ao?8k{{^j{y{>O4qK)0HXk{GCWw~a|04eD5 zhE~-CnM4DqeQ|FV1gHTJhzjR33wGO32!B!S`Zgau4FWWJMg|r6_&Q)koCvDbId(QC zJ=oTkFev3YyPfiN^vdncgSj&fxA^Sd9cBsV}seT{k zwoYT-v~mk;NU8Y zzJu_`p}Rl^C&6j{6g=8Wt}8iOkjjeEhCG#nakPpIntWdwq~zz2bL`=7XPR@COxf}B z%yzj&lHNe+g%zUd#v412~3>Y&ZW*p3WP0bUL2dxw5n z*t$JLMGBW3KsuANu9@)4mJmd4I$u4CEWP%7jt7=dwq4M+kqYEtHo|#^B7TrIwMD%# zg+joFi6Q9~no~ht5qQ}XC^pBO%Vbm|P&nXf@B{oxYBA9wJq+T8;Jn_gkcMd*ANM#c z&N}AZG}WoE-)*6XICA9tr^O!QVSH9+oLy!Fdd7ubY!vxTq8~XJw`uJVT7kVpSGpV4 z^onS8)1Lp_5!ou?zJdd<*`7PA0C`hH=mL3o1-gdV+i^wDA>@>FRh?f7SOF6rWfDKH zfgVZX&p^vnJ=R++y4}Jt;@vuzt|z1|d9t@+{g(HM<9eT1+ESOxPrk|=!`Eu4m}`ZD zD1A=d*KvqO3$pmPT>dNgzebfK{C(eAY2D%9L%*;pWmZdGq*0%;%_nU0H1B@jf_I;& zU$PS_2rn>ocH21rKb|~yeV%5ynKt%r-Y#a6(ySLF1 z;3~wbZBq($%GYUPXR%w;I;i0WT@~|1t9Dq-PNSup1HA$axBN%?eu*MVK+sRTMmbYu zrtzWcz1$qAm}VZ_D)w~TsSNjCxLX zDa>bS>Ixzzda34EzTk&qa;M1N-?x6H+g8}4M5ojk8Lv2+`pWUNU4=RIfmNW(EzE|l zBbH0J-9{Di@>Nc4u#>;usLX$44FxwBq)|>f!D>OsE18u<7ZoO|CWlhf2$;mCI}u8a zzmF-R{?t*0S5bN6v4_7+7QMr)cy?3iDT`zg>7q(3LqGp%8Op@>rdq}oTra!3Akgmp zuxdeDqmLskgQ*q32z6$Lu;)k3g5fp)dL+h{R}{#~_X`$hAy75|Yt|jJonBB6drZs! zih8$N!4?F2wghs0WB9na6Uq%04j_bBlh*=-V}`!fB8+yOVPB~`(tkwJgN6~g#j|oQ z?4h?brDe$e(9h6(W)Ty)i_uF?sG^}%kJP6_XtknIumRpq5x1B|7>2U8iq5;hf|F7; zFp|EZAOrJ^#u7b)0-YW^Uj*ryxL%u~UuV-#2gYr^B42B@gS+BLI%f5U({JdKn=nB|O`U-t-NLkF$=X_9FV@m4 zuiQD-v3t&-G`I39^BpaC#&>jBJRi79K@hk1Dx&k(24Zi_i( z)9nbYGXlVzvU28eu&%lf3Y(&$GN+;%NnQ!KVRPF0blL=ZcdDa>!lV|vf$no_e}|#!xYzasa!KlE5Q-ik;YZ*rKJ*;|pzhyiH~ zN-e{U&{#{mF-I>@?Eu%kWShI{0aShaWE=kRM4a*I@rx!*J-;D1X+bRk^Y86>_h{Tl8_t7l(P)SSHa-5tPbIfUz6zRj-vi6V)gPy&V(4*~g2Q~=K^CWMf-#-zxuz$SgBUAiV@8!kcv zR+r0gr)s?@49vv!q>a%enD=Szji!v zg7oYgo%$ISLyb(}eMCzKZ|f1rnaVOrQg)5opi3C?GO4!rStbWCHR+}n!1rmak*1b9 zIYLJFw5<`Rmg$DU)+Dt{yTT(Rwo340v7blSM|9(~oY5O*e?r+Te+}TiQ4M4X zOqA`*Qt!evA`27k8lU>^drYBdAHn@b&Z)xuT-9AJ*$y45wjswfSZU7}{xqx4@O=_KjUI*Yf6 zKh%SJ_Qsp(DrTcE#hE2XNsZ0d6U403j03`Stl4OmQVdm14Uwo^-}u?MjGTR*UC7OX4PF5P)swK*o-gde`dYOPggX6P(<*`Ts^qQOz&WR_?R zc2_q`T9iWSmG8uE^=}0cc5V-AJ_0Re!_V>J^*Q<6tl-BG^l&{$^YqH`%Ei60#PsF# zrnsqc?Q^Q;PLJDl670W%5eBLq@N`na@3FdL)r>Q{1)v^j-C=DdyWT`s_H}6Lb(UNP zKR12c`nh0i%|!PMuTj1P3hpYY#?)A)>@iU-(jT^{&6zbDV#eU3i#$2A;gpK65 zj_fNc6V}Simqgpw;ET2LL}z0I`4q&KxOaY%cuAihV*sh_X33~fRJ)(yyqR+8D@Bo| zZw4@cRd3rC*DuDwagLkNE4>b4BNVIB-1fe;H#L^DaaxMIm@~G8RaY#*V#0;_EORxM z9M+%$SN4%qk@k^-MMd^84f$bDcp46F+DWYryiL*8D%!s9vX^em zyg|)-Tl&zK^Zt7`k;neNcH;m&9_Lh8T8}b;)+GHQ;q)EB?uUI-eH3Wn9~=@8<2nHK z@|cT50D!&)!L8& zX0Qdsh}|UsGmkb|r)j)My(7KV%B1kHRcm!B&2EEl%>qZN&BpiAjZ)xuwYK4@aJzs~ zjtihB8DTy*A}~qO1~&`la-IYv!Z}%QaB6G0|Bcq~!|`tHxJX%Zl6vf%L>IjzntD8i zD7n=BK{;w)dWpj&0IHx3oXtAbiZ?y#>R7tKTKafl*ZOrwOX-{k?c4qODs#uY`Vqq^ z#hwR0qvyUZj0ZVmfd7tq(2pr?J%h={YU~x(oCbiPo|U7duh44cPN1$VDjfudt}Z0T6B#oJ+`P>&0=6*4C4 zWz({iovD_rC!f|3I?v52pBJ-yBl3?+Ho&Q;_U0 z0|#T1|4l3%RJU+K`SzvrcuJjQ0uKH?^w%W;0ZmjHDUt-#kOiWivE6@Y^ok^nfxBT! z7HKak6oP_+>gN`PTRs9~gh;1C=grddd)}w=*I(gnrOIzrWkT%0q{r=DvsHUVc}2ya zxAqM9&y{kyPzJ*@Z`6s;Cu#16-@iD^xN2F9aq_eTc+pOi#k}Nt$_zIfon?iWAXTm|oCn zVkqpTitG_NVbDzwqL}oV5F~_MwaZkH8CSy_Vcm@Frpax6S_vd>dd`PMq|q3|4369a zlI%DfFb7lz_Z%4~AWpDo>h#YtI?GjagdL5ymLSe zhjOGFICN}KLa?SeXl-v)i_kz0?{R?RSGjbPkt4wImuIm=_tOcK(qULcC5<{2**nDcK=k zENxd@Mzm6$08dZDIb6a()UZmFN%Ae>+EmSuTq9-0)VCY(pfX7~yvvSJJ=Dg~R zP3ad(#?erv9=;qA$sA;$-p{2_`Btwn6ODUuWT4>}4E~aC8>F&Oc=(yrPm?+BY7N)F z(3ATRLUR>(cMTH6Kx&;F`)Jq&5;mS(lgXfV~IHhZG2V8-%(b$=BYPrC*pD4fhxn?p00WFi_yC^m5`p-oN9I<^!XiM z|7$-^nr4YCWxHgv z{6+Pwf7yedoue_=H}*YS#6HM{WL<19;1!CP@!-pO{@9z_3W08_O{~YKEdxcOJSdeRHcB7mL!bcOMfqO_KX1&XWH1OK1F_! zYzJFilpcx=xyb2lW-RF)0i$wkpgqmt%|qt3g-yCKaO_OJU=_Mv-9L$>x`%d_`_VPQ z$5ihAT!mzFe%+nvy3u=X!kSg!cXoE>FNWx9+Hbv!VC|RGR{?Joa${W~0g;YxWyhX# zju(9BcXkm$=qaTu`n>0Z_-x`5z4D`sT}8A7FqKpbgpJAL91hS;CR~Pn78IQili`8S zz`Qr{(z46Fm9xnB(hO&=!^uX_$OP;Gj>i8{#OG3X{tS-8`SHo&4eh5Hm@FbVO|2dJfEc@#hd4V*2fr<6im5_T6{# zbs>t9FL&PQ#@-OQFdV2CSCX@&-9IMni--)R*#6oK!E0A3LMNyoo6cA*x-DL`NY5(n zkV3BGmJ%z3J|-eIxHY+on^~Ub*u}XRJSWmMDt*JYk;7C>wB3=BG}QUn3x=lCL9o=v zfNzUD?MTE=w3Tv$_?yWtmxWUxGX@>$hCz0VH{9z3p4R%118rE?K{>q-fy5_G?=9$F z>i6tJv-^7!yZlce`M~Lia-Z2pS2SH#7-2zwBn7mJ58Jm7&=vEGcHo<(k9P|`(R+^* zw`~_>Kz?5ss3rOfKfA<3dEgJm$HRb}!VYn?(kxx|#DTzkU7V!=N-f4B_-=+TstZw{ zZ`qG->VO1Ej+k|??3}9s*9V@N=Q!!Kdum`AM|QR+`M!8&v=_>3LRG3*3Fjvxh@hp! z-ZOFfmvlV2A1(>8ASg0p92e+ke7+$6$1SYHNFYh=RBH= ztq6Am^bge=JuH{UTqYDKQhPxp^u?%Z(~fdtHIOmVE3apa_6TsN``T7?*umGUKAl#Y z=Q~}R&A<(x*YeF!KCowzYR2G}Cm`GAJhqXr@dL((wynv(&Xi@7CxR z_6NhDVGA`iNK=DgoN zF-5d|aPEz-MS+T_j4kk|g0FZP|0K(ANUY;vaXX7eDpI&%EzO5Q(Q66{9Nt=G($<16i{FF3sJY{V!Z>KDS`VM=euo{xzFFJbt4_-IDVLL%I- zD}GWlztmQ}S(@<;yu{xiMy?!bdY9G1ZSBGCcO+E<$?|d2CdHVkMFT0w$LNBENM`yp z&810&W@-~LANYYFJ$PLOjh5%QUlC74=)u?J;CDe7R#U`luMO&QPQl)xxlSutK+)U5 z=vfFM#smB9s_Zzbk&E{{4Df6aH0=szqEUr#*rBu3DJy$u`?AzY0RvTiXjtpv+<_$$ zU!3)xh*khBYR9v-oS{H#N~{brz>pMMR2D^LKV7^w1)A!fN&H4Cu~S|O349d#V*|)+ zRSd}vIRt_PHUcPUiTj{q5^?2OZ^b*o*`St0=Xi@*st**uT3bPgW;cKFq1}h_X?zKu zmvZW6W`MU>{1YRn>XdWf4`$@^ndpvhD4{n--L^#CA-+!uaPDjK<>Nxb)%Y8PZht(PoLoV*nLz` z;m_Wrx1rC1Jc0uhNF`&a#WEYLb_G%+Ri@Zhj^8`6yF zEy$w_7PzmSVvf#r2UCIh6%iVIEOQsz|20|AZn8rMn^cGv{)vgP9 zl>m5CRdO|^PCD(ubL-6U1LT~IIW5t$j|RI!@M#}Q+oj=crVSk?zk6D;9gFu)YO+0X z1(9)vGGGX;JR*{It`AW-lc?%h9Lp&XkuVg5XOXI2R=Jlg*nF1Y4v!dePMTG--=PYHH1-fVxsTd|8wvu{Kq`KqRpl(|=J$1EW7@Pi|a1e76Aks}r*9s#= zFL}}Xz?Vjp#*s*F=~w*7LBl*cuwNK(D02Qs92;!JxIF!=kS&|Y6y~IK?Hv)*kYnO` z>{!Ws0x*q?0Q%+TECVUbWFIH_p%Th{XRVGC7GvCT5~BT+M9?h#RNPEuEy!P7_7T*< z35o$6(cm59A~)6I_iy7N|!eg5(vkepNe2!sB|aIjuljC&gT>NDdrY-%MlbJWy-S_ft z(t;M{jZayjdq0tq#4Q#3=_Il}auU|;2fy$TWJS3Yx|~2(^Yi!ESahu>*JJBgtJx^* zgy(EerSXi>W8UC$a?v0Y5k=CIU$hC+bjkvG^!VPdh`F;M->xM1Fg25T9+wowQMp&7 zXG1%3V>LGvM~Afs-W(x^4|*SCkEr=Be8q~~0i8?v;Lhs)tLlCpm3iz6sitSVf7BzK z7v{yUP^+->>|s~bm`de)P^8HPgS-r93Smw`c*igvQ~GP_>|wML7Hsi_11?-+40EQ> zGaNWrg4O4q(S9W)E#Nt>yVW~HrmyXDlANRnFXJc1yB8rk9p^?7Io~D042xp8^ry+e z&=NGG3Godk8!>89IDtqR#BCJ664E##R_LxE)twV_0EJZ%cyd0k1}t0)5mD%xz0kP@ z6eFs$VBriN;#807Lp=;*w(dxM0Nn3ml7rs%apFr5Hy~45j*Ri2|NMQ48}N`sn7Ohc zVS1~>qNfn#BjgCHop$fTYr8b!$?HxQYoK7yzRC%K(coL>zsCMQgKeq9j=aOSV*}H- zV}s?tm$M}QEw^+sFa((VE6ipoj?4B5pzwku-BA<~b+fkzSON^yDeaB+!b>582TUl5 zVUm**1%0KE!@{8Xdt#Wj;F5ys323;U-KVlVx%9U2bAFtyEXNsgJoeGyJ75MC%%B_n z3eLNJ)IsDxgm33T5}d|VjJV!VRBXr1IiJC(^!t0j)h%_HG4Nk{wm5lonbZHzZ%vN2sYRjPK zGm8AX=x3Bhe`M@?R*?QVeQP~JXGQyy&woK9|2NOs=->P0?F^j0N2S~Rzi7@XNAn=V z-wP{z|9<~wZ05f<@UM;h>jzAVVUz`7L=gP~9RbeY!I;?z2Da!xQ5F>OhfdW1K?Y2Z zS>+$datemy5QK#9smzH<7N>qi)YN>jtuJErFxybU{G_jpf~F(4UX(JcFF)3!o+UxY zP9gbBl_%P2WHU?2PrGR9BmFMQ&6eD>gs%0JhSTI%n;#?ONNMngevNAg&#Yj=-S13_ zkREw>eWF~FL=3T8A84&Sb^GvinHh8M#;JW)K(^q&<*amty9RcE94f(ckRZ^_;G>>U z!$eRQ9>Uvo{kL)I|0GWwn_HFtn88VWAFB8N&{wr}wD`x-OvcvO!qmd(UlZ2RAXmeX&v8o zZURN#>g9^2Vo_GLP)d?UTP2BPu3EuSt;w&A7?gO4WtKZhvVk|nrz1QEC3PTF2fPmB5pPMACf%A{-?_qB+~M-R!;w2JJ46mmt!M~+ zWzCe@pCbI^HxFLZ0M8=J8|eu8gZ_U;$1oEZHM{Rr)DG&$510R$(^NFDF}Agq|L;F) zk?QJqLW;sG16(j#8Y&h=eFa%+-^&_`eT9g~5dPPgi4Y_qjU!F{hCKPOgPyO|sBr9V z_O4)IKEYf(mqtL*sr|3badvkLH@}b1D^xCo2^cM~cY6XWRPZsE=rEHMthn*kVSSz3?+iBV?v}<8iv2 zAKP*a;Y{3}P73dQ`JfC`pwywXOcP11W%3womH6wOf#bwdXT8-=9zfz#aWWKDS~>aZ zbs}?e+=UdAhipS-WU<`)ppWG#A!zdBS+YfjZjJx}njADJy}VK{R{X|<$WPqRQuPoQ zq@{B$+K?V_RH$SLUFmfU3UsDm?tH{*lKELy>Z-P4?PWF)O}25WP+DAPUmn_h8m#W_*$X83Yzx)Z)->eMfwz4}4Ok<1L#QXHN^=e_RC^~x+q#RoX2Y_h zbg8M$u<1>r0^Kd+)l40)K9#lekfH_9%8~qY_<=+7grEotb|U)D zSpn3VlyZ1N9Fd{l!%xFe)g>@A>&#`MIDl)u5S3k_z=r8aANq`YC1JRVFG*8=%u=Rh zpRTZHR;DpKM>+24wC3DvjxJ1VMf1fe+ezxn@OC*?SI87i#FInkstsB^)K!y5mKpRD z!`Ho3${wjQ1txG%kAGzfu&_zF_14h{lh;!vpxY?`$&oPSh)E2RYLkT&d2yyBeAJpY zQ$vQx_O*t8Bkz!vfW$KKUGR=263+DFR^W3iJKd_whEm(TWPd@nUG1`PLYM{yYoqwI z>ZnPj=K5vZ3i17D0r4}HjKM#oZ=?nVR9Cxv%SQ24ymer#0f40tDm;mr-O6i5+6?AM zRUUv%22l_n5dt3#I7t*#Kqno;e?c{ z`3hx6yZz{cUP$oyqES8UrI+qOHloen!%v29x&qhs40+qQYLzxTZ7 z-u>S5>#I7uDyvfYms&N)#CXOWbDkr_(K;Wcq-}ZwL_Pgii|IEJaY3IZH}9^b^F=f3 za(%ZiZpZUP8>Vz;BptzW;01ib=Q~XqXB326lL&-@Huww(^RF94jrGyavO5Y3a0sZn zlj7D#$L}HecZ7I+A$PbdSmt28qHmwJcLTlwqOYeA{HIBl(8xKeI3`9c-#DpfOMX)D zN3wvu@bA37!&Y6Y3!Tv1ifGdSkRE~a%H3`nA21|J+}IVHwqM=2`M0`nk~NUwT`$Tv z9lqEV_>o_3FSt?TztzzUKM2|d^*DSLv?lu{C$#D}x)`LLu^~Ptp958iqQwT{Yf5-f z$2K6JbyT^}W@Ly9VtG0Mt~T>qv_-12tU@4lJTub#Np!&mHV{<2TR8}`u!pAC?DuZ` z(HrF7bKvF{|Eb5P1sx6KmoGp5p&V#pZ}NZ2$luanrOJuiXBvDj($&yP3Ws)7RB01v z(ou^A7)^^nr;srb2*1r>g%y%crM&W(9dN2wdhsYFQ=#rB3|J~Wd!7_)>_X#m0Fg##noy1C9$KiDeL zb>r++kmPFAZV=Ah#wZcx&Kv%<+z}J+A=hx^iqve!PS*RfIvf~v%X7p*H|TlRq9zK< zPwm{{Ey^CW{1$5+g4q+Ah&FcrnHU3r=SMO;~+Z3F!7wnd>{s&MmFJr^jXwzhLpR@y9JIerKM)8QdJh0h_1~q^6c9l~(aLQTFtW;MnZ92)}5D2`sIbqs|;!c+0A1Mv>_j zQXDfTnWVOq#A&<0b+Qcp=}7w8y9>bDh;L7qpVmw`o$v(Tz^GH*jh+KhcqADBD|GIR6a{naXRHe}RE~iPWan!beM)&9ag|2HeH24M`iF8V$AvL(7qW zNoJ+Aj@!VE`YzKWS0AbE62y!0YRoo-NW|Qc>EOfbz>kwnx)tvx% zkBCP}Vgzq~!}VkfT)RXd81nGt*jGxCAHuc~Awn1KB?X*PiJ-W^V~CG2-hQfUqYt6S zqMtmy1Ny5Me4bo;3IGZpor+29#NHM0;)~l;hgK^7-!ToKdqzPq+zB zNAy_HKSANx!i|5XI^%oz};2dw;W$d zXn9*ZkF`W#t<$X=)Nc4H(_C&Tcyms}EmVF4JaIug13Z1~(J3z^MyF_5aPg!`Tpk4x zcS~>Xv{epf=|m^~!-oXP8|TxsZu zbu1>kzBU|Db^IdeTY_X0Vi2FJc`4L8Ts$LhOSr^+(oG1hiY;xsBOa82U7=3S-8 z+yZGFz;o}jajv?-yE~B__A*?Rk!rRO(DL66Ud)PbyK*6K;pBLlUfmtAzMfy*9h97l z@BDi(S`ht!ME%Up9H0B5|4@gj@jpeQw%sfvfYFi@UayO6@vtg{|NF**>_MdOFvU&8fr+el0Et4#dmPgx#9bT zr#CDJw>PaANQ}g#7JI!n^hfGxoi8~TC)}RW5bL}JB7*oZu0;RkD6&vX4FMT-8xm)34wzEX{sR$(ho_DqKh*eD%(_h7GH))HXEX-D7!yGF>x`5l#Ft zE5PJcswZW+~%Q2^LE)|WlY9TXGHz7Ww{gCK3RpWr# zL^}sq){Jwt$8jqW@)WXT**%H0g@JR!8_P4C@`iFMNva76#z+EW$!Dx^rsL@hwi$Ts zZZeg@?I~n9wgU>)kaWiPxq7{vCk7G@)^_>6t0AJK99f;?SznraWuJ9$Mets!k#oF{ z;px70@jKE^bKWq@MJmitjR%iYJfBp>UTXhWs;~1D-bQqn1Cc<`{MF`}Z)#VWG4}`)9*c^ZzbPXYkwS zR>tDKN%6A2BS!Q53>3KRLfjN5;-koPjb&$(MtfO&_nJ7k;q?7@dk5RZQls4k%=56J z`AyY?B`}Crsf|3`x4^Aw1PUXM+E2n$_PLQ%HG~Me{U&%)vMVC_3ISA4<&;xql<7>! zowI@yzq4gvSx6~zy335D1NPu()y9esccT?yQS)MjJp^}0g+O@?V!}D`?m75|56(mk z#zV9-h{ILam1keo^fK;^3RptUoBR^)-f<4y5_LUCRr5>^iHdA=M|;YK4BL`^GgOj? z@Piev!o-E>_+4sTQf*j;ElH=^oC|bR_gLMOGjhyw;fq^ut!@j5icD`d$sL%Qh^r4+ zX%k-o>qvv#?A0WQ-V*T*P;54*}x#i02{O}m+J=Q36 zA~pDjW8k5B?tI?#7YGkOL#N#KYt()_$w2t2 z@FLcN-iQXHpp*fzA1!xa9BCUhmsse>=MBr9mxR&PfyvQKL3^lIn#Z!*(WyxqzuOeIl}WK%Ntb=b0vaZdFg|3RNbLafaE!*Qzhe;22So;ON%EYjPQcTCe-Z>eW;id4F3-^_o*KQ}aAr>)yuLlWApSJdsEIMsxS3M`7aF8i>cDN$ zqS{zFV0Jb_Mi8a#<>kmh+K6nPCq`I1^VyYdPmQ8Q1AN{K`zG7X_@)F@s%FCd^Sgaa z$0%*$j~ja<0M^cYSPY*GN;$=}|Ie`o{r zYM-X_+o}rCRDo-~&`0>gjBz#9gVK8w>cnkU7jTlo5fP2cBbJzp8>U=^nLh{XU%sSc zmJ&U&lycpczB)L1EC|ZtJ>DJwj~{tax27IkL$N-xJCNOyUrz8S9!17whQB|IoTnG0 z6)pybb_fwR9&|qf$iH;=e#?lah9rc&~I!SbUgfTsiHJKq3Wl6;?8DThresilYoiiV8E3^>XyxV&Uv z4i|QU0L#*(CF_#Z#PmDjzw_z;pS(5sU+zI2Eo?sdJy(4EFCgHce(w8Dk6-%QQ88hu87O1pxDPzeTOM#HcUPjL^}b~IR~jS= zwBztzd3;9^zfs(Ls3Z;ZKWAA$tX%w>?OsDLp~<_9qH$BRaf9mHU02m=aM=H{Tyqf= zn*OL*LPVqBaZcZ?wy7k_i+c<1==!o10PGr{*GN-=fDOA+T=OA}!3*k{Z$`&(yXL@S`A11MPnv>*apoQrAK}X%yJGS`_y=xiIV_)S+-$`)(y7)N4W^X4?OGuJQQrO%x+tlOhLbHzEDuG zfNnvU0Kr&6(Yzr6=5NGASQV!BGKOr|ZJ!Ew!^*C-BmxhXfb|MYetR=8M~ggkm$jUo z0Y0Nd)|hUrBzrY|$DrZa?n&u{U%&*4$ydImc7dv~ACkdq>Q$`6Ab0eKN0p`5&0`$) z5DTn2=#0scjf?VaS$!^ZN36{br}VD*Poj=yEkEy1ovPDS(rF6PUQyWCY+p*dcF>)Z z2gwNoiu&MJQNFdeO*V9$J(Sb1z2BTqKe3#eBe}KX@OAcXmkcYe_q%mxe_b<1nngXR z9$8Ky)yYFPj-RzOt*+j}&kXq>r+^kFfC!k6v-S} z&S~gBNvUtUbtC@`D%0^K#FsbsBJhdj6?{v^ddPU)=o-F}vYswo+5EQRr^lUV_19zdnpchh*4O4=9?mw$6r0-vg5Q=)~U~CBgVi*L+&M_#uYi+5Z%Uj z0>kPvb79GJcLpZ;*p}vvcM4aXyGKsDyW9N*$3Z>gFz4tQ-m+n55*iG;QvlM z|MI3eUevVd`fTL5KG`6Le=70(3-$kcwW(A&lbieN+3>eE<(_uzp786JBl@rCf)JR< zM3(GJ(8FnLuf&BBjEk-k+C#@QkJRr|B8ws@1YN<*>lTWPB49YPW4B|OEeBaG4~?Ja zn%*GwG341;nZ~#s!##Omce9*D%|(@3C!*-QXg1$55Cc1HemM6v+=Fg~O5oaCE!}(L zn@cb`pDjZ*?kzi8x;Q0s#{%Jcg}@4|I+27&v*2K)vJJ{!)v3ijvTlV(uPn2yDkZnX zMS<*C(C6Z=+wXa+KjU^i^2>`w`qEtsXuyD3*GG{wvDd}pWB!+-^+Uf5lB5bh&~ChP zbP|aggtEBOrfqUQNuqJns1Yds~ac@BE3P%q@N zKBIF|(4^kEXF89&iCwGCp3q-p5?Jm$#ehmZi4f3mM>8j|7CRCp(v5YUrC!XjP|2HK z<)T&62#}?__@al-VUIaG z_qM`QwtUVPZKXXEI~Y+mN6VJ0nJaX}cqO2T&pbC4e(t$QVv@fJ50t z67=D0GKgyV&g8a2%ORKKLPbYtfU?sedJDlfo>DXIxKOISLH&d|!~TZenBe*!JC6aIcFFuZS;SI#-_n zUpimk)IrK7*SNRDEKeBPz?5*)$>6so*@zeyrraKQ6o0^4j}2_W6lHD^AQIV9jS?eC zi83jvC_bSQ)c~ija3Y$ZSBGEBryVEzT945_Pzdh<`fe6bw)5VHy#KwJ?;WFL&=vxg z1uOhm+8jlZ$s>>$A~&0{NZucPPKzmHYq&4zD5Y1z6RHuiS@tG)UGZXFe?D?_G_dfYsUD?2QzpZf0-6s z3e3X(ufLkM&k=k<=rcAaK-^hi&T$t_Z=GcCyMKRG|1#I*gnooJ7plc%RIs%;Pf24- zPQ#sq9*r#mh z8(ET1oRjnET6=o!P~62&YAY&ES+cYh{lq#OZ(5&9SYA!|ZA2@pZ_3k3K2YUgCrW)gsCN6ps%F!y%Bc2NZrR@Q76@Mr}Wv^@Uq^tj6W^jSm5;M89^f8nl1qfM$Ab@2jj=fmxME{ymp8n3g)k)U#*6qBMlr(s43qvzca^{gru5c zyY78Y!i$zjXg>9o+Z;<)^{R(CLR>c3bqS?gCJow(ZOM{nh;4q^oM>Lgy@&jt=l5F<5 zXFdv>E4R)cuKrIDRS8}DP1CB*hRdHRc;tK1Zg~ZJnxzKxyE6icA+&@?uzlJ#8D#P3 zsKb)z>#(H@jd2p*0DUe~8m#h>%@zm$dILK%;)a1R5 z4w6aCPf0I@S+3VzM&CUyf18|+>WxJ5t)mkaIlaJuxrh>4Qq)AI;G@F~2{|{d$bie# ztG?W3n_|eeJdI52!1`E~d}jX4->H9`hfBAhU_}ozr2N%de0oYm?AxMWergg?(^t8#Xf9j{ldCNcE|dCFQwE6o6>Ci>Tzm$uLFN;{$f zjw|feZ|HY1cfGAjxiJE3ZhlgUGi#O@kkia!Pr&ruyRJK zqYs~4_J%aw@tl2AI?kAvA;&$TGmNas2c{1ZY0e~qv#~T)o*p@5@{t)1FnI8UF}EIZ zz8Yfa8Gljti4Ilu%CuK)*}?pJK+AI{$W?HVR=BEZOsD=1=a^7#57{F31$=ia1CMW_ z<=X*yJ`d^GD1kyBnK0m~*^#23%8&x0DBkee)9@Kp`*M0DvDzL3VnmfEKq%Y97^5u& zM*xIcQ{kH7VB2@Q+IzdY<+Wcfg;b`HT~t?6irW$SSMr`5i8^dQJ5hPlDDZ)Mle=3v z3T*_Jc)}EcsD(*fF$x3M=3A7L#-47i6n?{R6_-*gd#VJXGw+mVDDzKE`2s->8)vW@ zmGfe-W2X@P&UC@lUZ4tpw6mH7kdz@T7eK*OF@DxM zO>o2LY?qT-E~c!c}FTH!>oS3u3`!aLpC6TEdde%tJpjX`_k=r4*bEjs2Cpo zYiWXdr@%P(qxBo&%zA4WFToNol>}AASKcE&&{sWBck$~&jeYbv8gLU=-5bzUw%$JA z_uXb26~3Uo_S)*ZQCdnuqa&Ij(Y}hT3u3ifDuVmW{$~%L!tVm5#oznLpKZSmHu4$p z6LC)%K4_knW6~z~ynA5vV4V}9Apltl>=|*}0$jKBVZ|SEHQRrFgWO}nZPt>9hdM`5 zuEbmnw%!uZSnEYiMw3I5ITe64dm!39r+-3Vc?`gsv#2jbPr8O`y@B>U*!93jZnvKk zHl3)%3S)P+;|AvPuC4oNWJ)ZB>Tr?3>kgIEMCIa8k$jtkZS~J$Cbg*QTn$Y4U5=ag zk=5<8D!}E)8dpczCeS7In}14dp(B zCoFTu+*VACr4rjmgC-~2Qud81TUG$dcKw>Jn@pJ;`L=7JWZORK<5mY_?+v=JJ)ycw zH9?hYV=LNb+3L$%2W6{sk5~&|(hVxl9(4zk7E5L}8_a($;z?Qc$)9}A4Jw~=gXcdr zH;8;X4E;}Bfv!BNA`Cf(wYXtuF2L- zvX4;j0D^jRLhR7VcgmerX|TjO%vtiYRTj7Xv5cjq_vg1Wv@TR*6CHygwG6y`OZO_L zO$}4JBhDz*rCC|-BkcRAPfd+&trU^kbr)NCkr{i$F3q3=MR=9PV%B+T6kYG&)bDDJ z+k!%6uZb#ktk;u%4xDnh79mWjf)IHcTSvYPHMteScgaMK97^=T56(D}hC?w+QRkPC!Czk%x8PH3<<1!6LZw(2{f=MhX1 znmkEYA-SEEHN9zOD(G4RoWPj#)@Or$&TqyFD=Q4P7dYq)i5HtAH-kjsrr{S@BX}wl zt#ciL#jyKV5e8N5Qu8xb4JyU8zMY8m;s)cTztN5QcPAP8q{l7+Tvq#4m7XriuiDAi zGrAVOp(8XuR@il>s}NcL;~x;K}g~ zv|}^iUwg=lzJ7u6CLH6p>kLRFSs>kDA{GyUb?(JPGS|pa>?Bo?$w>$46xg{&^jAVv ztUR^)ysZ0@9%8X4fV#7cOwNb;fWDf$QBpD|+<@L!f|@87KDR;|y{Y#u*VL*-X2Vw- z#)Zy3pzCrUCr}!)M zK}?R~1gI7((U`)F<~7d`vhO9Kq1RTDymZAa*K8KI;E2Wix`svvwL%FkQ`-u|y>`9G zMOpe+6pQ>fC2CR`Gw$@KDBmw-h=>A`Q@8m4K5P&s_IX{K_;3Y6Hi3E#p;tSE57w_Y$2%kA#aeSDN zlO(ngFU7GYZBjR(KFLw1iyt2A=T4KHXVn}0KAfkmo%5vgnDELAkJT-{jiy^sA|422;9OLV-C?63AI%AO(h*Gv(^x}{V?!ul z`*)t4LNgp{qLXrJk3*pLg6u(8&7EquZf92v8h(?`26S&SH63GYGR}8SSz%2hr`5f8 zp5Abo7M*tn$vRb_L};5zeZI0V3Kj5Prm-w1oya%Us{F8rEp>~FDG|Kx4>-WqTmdPW zvXTfSF}JQq_hc`t&h|%jgiE^Anl5sYfjWHj=mV-r-^RWRa7pb#62b_oex#mn`gtto zQq-cdb2o8GyU(s&g1oN27yUP}>IqtRaxIQ&%{Gm?uVypfT=WXMoPFe=x1 z>+puVj40Xxd!25y8v8yA-MOy95WMwt+#6_a8mX0U2tX_}jWb|zy28%Brq?;ohmQ6t z*g`lTQB0j@BuNzuInpk5&&!=snJd^X1wIvR8lSR?M-O}#dNR$jha?HIUz9LJSOsRJQ^bM=!D4Su(%KlykDtDM8OwgK+lzbf9(N3 z9Q+~~Y8#9Bb&4>z@e4e%Win+BG7)#;Wndp>A6PZVAfO7*s31ve$XomZnHgRN>DXek zdl9*4Vo}+FS+aG;D{wG3C9(~%8&@|M3+?Us0TvG=2sw`}Y+(re*0U#H_!-0l2*K!) zW%L@T|Gi_B*37XVRF-cjH%Kj&B&J`V!63Fks*$#`FzA-x@0h~nXp|cJe0#q@`0~Z+ zpQ>x3HulaxgzVh^g{wU^aqCYhhZBrwJ$sOklGU_G$f&gOb7B3(zdnocCO1%m{738v^7BtX|QVrQH{*~Sq(i){*e$Hf|T z<=JpJxrr6fS(aCsavD1ly-ceZ+n)cJyJ1hS(HM(N%c+jkjn&b&}R)A)27FFMmkBgcQx)VG9+@(fa zlityr9sYpV_L78Jguc{<77>+vTyK?I0X;uQU&5-KY=La0;9uBmhsqFsAk=6oQWiO3 z^a_Qn8lnqrtSX{SZLB(?ZY8i{?@Qyf8F~=;5JH`GzbzyD^+dl2+SbZ8EpTavOSwph zdJAU8g#8M0favEcO(6_miVa>Oh!g|6qLvv@flvk~fA7K1h@q>42*%} ziLuV-!Stk#Aj~9QfK7rF`<)G1@kwvJ!cGV!WOVkMazE{usbhnRR8DngOS6|a=!x-r zn#x$B#U-siMuA~R7)18GSxmE!B9Y_i?7h)(XTU2lBHDlp?h-1J-m)9V#dGwdFq(EDa<%%qvLfMB806_%A&l zVm?G9>Nc$~63dDvdDXYf#uiWLQ~5(i8`%rTjXmYWY_r2YuMDYbcvP{-3b>4&*2j6Q zk5>iNv8lC28|Z&~a(|+U|C8y6F3^&OXw^pI<}zq|zNi~jU-bKM*o`5l4bwp+OuC!< z5U(vdtq31B>7r*#EQ9&G91Fy(zYbJlS#lGRgJ);9By()^~7KTXS7YZ^c zB#W7YzcA->6$6=+Sq+jx>fkH7abpGI7X{u-Cn%WY>kT^02SFXczxF%OqEH~C7uRTH z6u$EuFw_oJZ&q>aPSUCo4=_kgU|}jb%Kb=9Xg>Kv=~nQKESjV;ch{w$A%VJJcNJ4q z>Uv=4H>s7zyU!*qRvYfgD2~aqt7EnTG2A9DNc-f};6 zXiB#@m7Sl-oK!c{cLum8NKWj?f#N6!99t4+5>89ZTE;PZhxshzTtf{3H{Oc(elNGz zpftZU6g5ny!@uBURy7$!`R6Bh%zuAzR-wk-!!}c8vy0J7yq<{L6zt!0A?yAvx%gK@Wqk2Dh#ROKVm5l~2kFYe?WnKzeRc_@T1i(BzEPdVae$_VL~7sd~)GoZlTJfb2K3tvFLfZ1YD5F&+stSrrjD|5F>j+fj<|JzW2MGm=oTTu<~9_cTM~JhoFO#j3s{Pv*&&K ztkM5#2ekjQ=T)+EBNef5G%@;XE#|+P-vk@w&jZ?nAL{t7eyT9xLb9W*AhNY{_=I4I z#^)A4XBm{b|Jk*Gypa0Q-nU7UxIk?;T((Euw0_s7 zMHD~z={cKRR=(4qQyL|13GE2&;9f!q&d=YE zPI+i@$bg;n-I9aDxj4@zg-f`=oP)Klh!fJx0V@y+jC5swQS!w{c16 z$<%qb6U2>sH=}RIr?+l{*3qctd;3N`p5Px_Zuqyz?qCMxcdTvLB(D{#UNIb!6RS*$q+Ju zZ~V}_cp`sVn*vg_9$XkJ=HKul%3MkVm>THa7<2LUuW1r51pTu}=3pgk86@!v4oG1# zNlH26wDMfzR^vY&J6l(}Xn82WB<0`<43BA3vvH^3l^#>$QM z7E3T>I7MV&(UWVOHS@ewZY7IyZ#tk;K(Q==`bCM-F5!B2*iK<@Euc1YHZzb)g^9)G zLeufwZPMfAtjUZ4qyk9aO)*uagr%`F{52V((qY@g8ua_1jVl+@m=fOi;2y2RzKYzaKcYtxi zwkdPCnB{j>K7Q=cK3o{Q($VFQisaEE9g^Dsd}QL8U}hm+uS9;(f}4)SAQ{>wMbtpE zaEK3l8yXu=WWq-UC*OBbKH*fwn>&qTHdnZinb0mXOhDH*YpH_!ChQ@rzt;JilUS*2 zNn`MsKB?&_f}JYM?f3VlnTo}jp`hWyer9q*m^E~HTtZP$8@X0uio}|#+{MW-1p2ShsyxY~ zWFsi8l#%(+R7RP9A{e=9LP0pb;)Z{CGWi^(epsD}q*jj&nTtkPYB)GqE**fAN6-@S zVp7v(u4f5$6ffktV(B@f-R;_%G_Q-sQ&N4eMvrP)pKC^Ub6C@E-u!KHnG%s3T`|~QygAyG?6w(hQ_Q^ZY=v@ zghb4t>?I&Dky>Qxh9gxu;1F%Y6%CO<#9vAH_Trv*^m}LLhv~@dSb`Z=g0LLvFi357 z;BdV>(GlnyJ}DQ?6S#7`O*A73=K(VDut_u{Hx>+!&}~*YQ?v~u@E)3IERWk1^%%D& zB+it6{|0kXn7A4Pg>2$Zg7M&a*J$EyWD@tKf8GAYeLZB-Svcm9+&9^GM>ZA(&#zb` z!7F4b8d-kLQIUU|SY{!atlo8|Y^GJ{1f=p|G8Q|BgazNIMO;lZ+C%0Awc-MLwJ-DY zMu%9M&ih({EfTL5$MlD-Qfa#NOMk&uUs)_>!@H%@Q^2s3^Yz6vCk=@o#p2>UK>L~D zsSkI)9Zsc+Ta+@n3Z*w* zQ-TuVZuINqHK>7JLC#aUAe_a5_6;KK!>mY((Hio-;miLc9_*x{b}_=LSmiJkS+w-i zNXKO0PT(Gn2T@Dt)un{sUBKfMQ&)z#mX`YXODAc`4WB>W7{h|NX z0sc#lqoTmNtotd#GyD|c`TkQ0SlPnNR>986`G26+6RhG#6##=D;_2j(b?D(Pog0lV zp)ZyFtqJfAq9wxshCIXmf>6m>wvKpAv|h%D1->XmeV)lB+R+O2<F@?i*q_8ipNu-Jop#%f2*nQFdtPy5s_%@-ZW)_QI>+I=& zt=Y48q~6x)p0UDhk4^TF&MTso@Z24EabHsvVIg{ermb{%nrU@eM3%_t=2SSYTeZ4@ zhuswM%yzVI&dhmqFSO+})@X)g=vg`WutI|elKg7pbb1)5nh2U-E26PKdxuVE!(O9| z=snF4FsNP5RijtT0T~bM(h7CaU{J8!)t;AY^r1O4)hRju_D3$2-7aBDfjNi8I(7;R z4tRzFDV%DMERx!7yhvlfOlwvmNoy7Z2SrNS3+N>ZWlC^&5$WlX@Am|uB*wP<;JqND4^}UWOFa^QSE*SP8a1B znb+l2rd64z=i!l+7uXl~thJg@uIAg%{E`V$4SK1FBSXJX_nMli3^QC|=8G?8?1NmO zL8w`}t0!t~`EC)CSyhZ!Gk6z4R90mcYsHUsy>yO)>m#en(5v{oCM@-{sCsHQ-TWB4 zQf_u^mi3A^?MKqSw;VOz4)ptVrwZQ(YpD(?jnxZ#`{32`zT3AuZYR<90GJsEx;?#O zW*K{gGH2i))pD*s)CwJt6Z@Jrwf+rN?fs?6oim9EPWe(K2OML?xgZl;Uie=AZDprO z!R;qO%b3;OpHXD}`m^+{`hA4lCsMUY+l6gXkpz*SZBX>c+0$Ws^*FWAnZ(ArEq> zx2;-#QYU#YWiYGoU{t$ZdX?;p8i#AM@H}nrD!TcC98zzCE*44xU$60Aw8~%mlEFng ze|Q&k;(MY;;OLlh1g!Upl26W zVP$g#@vqLn`>@NWQC_RF1GMxPfG$o z8cB;%B`@ZPXmMmg1K4NJCMiuLveD}cfyLZ2C zNL$>TrWARCoa&TGT>VWa8T;^OeB%-VF>I2S! z0<{=PU>aIjP$7C)p@}&~|B1#T&bHEvc(i^6L2mPUjmE2ghj0S6yFf|uvH%$3AR^NX z*V|DtA03}6u`g;(QC1+?G+KT!Wjvxs1e42YdBJ|z7MwhLqf9@pM{U`+ZHMo7&MTsO z(evabbaZ?FDaK1qeD8e}HVPHJU1x}EwoNEe ztj5k0`~571F-ne;{^#@H4LpN8v(eb$8o&q$)f;dnetC)FFGuU%_Y8))}`W& zpRRk7psr)j7o~j%1jMK>#7DKZ=29ESl^$yXJ3@(RwM@#ij2#6d5+W(3C&J_jIBmCX zkrP9wO*Uw#%GH$ADhncLsM250ma6LHbgrykwf~^L>x`&oozy(MtDEE?3H}Qm4 zZZ7DD7VYC^Y;F3|btqVz`h?l1g2U(z9q60eu14EJhe9*oQuW-Wk&zKaoWteW7W}D@ z0l9?~c0lF@j7T$$Mmvg--tM*r7KUl|`>mrqH+NYh+$K&0D0e3_#qD#I5= zWy)*5T$)LA{4T3%>0t>`{Sb@7mD3(L4d~sBcjC0c>pfSZ-;2J(r50SKGvckjj*y$1 zJw{ozBFH8g82_ zQh=6{7~`N8VtE6ES?EZ{84PbwQPCOS$Fh*Z4Iq6tt0S!!_N2*ggBgouOx7y`I;Wn} zbN>i+k;yuj(qcFqt5J0bFI*<9$DdP6 z4--)oM^gtaag74wZW15#MCE7$JbfN4kwd2d-s>=oZ>VV43l8J zByQfiaPD2OSCV`X;ygRJ6;xPA{!uZ6w=_`ylKH6njW(Briw(&k z{hC;g(V1$*2Duop{Fap%Hf36bdSoNn3+0z}iv>QVGnn;6frNB<16$-`BXpb(!V6Zv zEa})_Zi{?At<)S2+&XWXCe`u58SkOh+p2Er|D9kGAB&3bX zH8=0aZZ6GIEaHPuOiRO)u}v2sx1$1;2QH`C_+*}KXsX@UI+fQIbC%!nC2b0GG70Y9&;>;+F{>QI!#1M^Ln_IR6KO|Cv>AG+Al!i@iU z+$TssH>396^Uq?m){COt)tkSMYvk#bmg0%=UJjXuQig}J^FYjj)6mM@VT9A}AeeI< z@nZM=QdEv8yd&}BP!!=qB4rJQ)oQc%%YD6Q`yxVWG1e;&r*)p&5E;e|LVKV8x=#<; zeDk;___6|0y5_`pf%rxv=&?eD-4k&jAjKsARH{~r; zwxGc`6^-t=Z0M#Es*J}}#*Z}nK$_5%V-h*Xj0ifX>*iA_cyDDL?;szvl5t-}TEd~^Ir$rPy@R!0wz@pZe5QY+3K2W(x$ zIUEYZ70lz#2vZNF7w~rp73Cl(s%2Z4i!M0|Vkl_t5Rz|UMuC^fe;hLUEb3oj|K1Q+ zyp91bJ{w}^&xZIP8->*ktgZiQivNdESmpl^{ytS-X*Zuyu=ll1HM=e25={kxoC#`MpH`(;Eon?xoR%wKKFVLoEX|kZ;w3=A# zNAbqG$@bnmPdZy;@d3|y+lwe@GaZ>-8^$*E#yh`jn-1+Slg5+E(REI6dgEZ(L<*V4 zLix%zl|h1yGCP~9EvS>jhPT{B3|ukQYGXkE`Zg-f4 z3I8-RBaLRdiQF_RFsDai3gxgs_<;MzZ~~MFosf3*RRm)Kkf0XO0+BY$PhioUnQnJK zg=UpWO>l0q8?{4Dqz4Jk2TyBZRWn=)qMkV1lDS@Lv(IaX>&lBSpqutgy#Pdnh6ds@#`z3)9p6hM|>)n z8y82e#fiiHZ!Q4qjrRC<`4BMCXk%MUz1DRzafRyC!)i0Wodm4%pF*=%vYnRUY@-E& zR12SIuC9evb(bUS8zI{=8+MEmI5MjhAk8s5H8TcQ+=rmNoqoK42PCW1Z8E9^;&m(( z&-rn29u-YH35-hNQr>D7l z>?O|Y=*Eqh>gevcxS}G3c$B>|-kbj-r*e}$K9QSu-vR?5FC!pD^<1-p{78nlgKE{{ z7da*KI>;T1A;H8UsG*a<6lF0cHY<^g@{Gkb?%C%#ny9O78cANNqUIZPi${Q4G2eH6 zBeO=Kgr{HKxibj-@Zu>R5l^4C@na;F1sa8yB7G1%d#OD_*po8>ogjb5Vyiddz~d(t z`9Hhqe{4AYHx~ajoHl&!iT!1oru++_b!mk>{o)sq@ruM4#DSY6x7vUeLt(RCODlTQd_h-z-J;FJ?QZDk6?T7IY`8Fi*@ zZR%*BwBZL*_HMJS+GY>|2f#GRDRqHIuXegiwJLG8OZC!;aYnWhThCZP(<7MkXEpt- zQN4g+P5=B87xi7v)0?o#snqIXoy$Zpu5fx-^~X^-HR9wKH$euV6h^2-lC{yHzJ#7= z#<%5ZlN^Y(KJ{rCj2-<$MeTOD3sm*^XMT#MBusi=2aVkZMo^|K#yu0 z;2W=^sm3!7y9&QrZfyQl(!lR;*o+m%Eu&L05*YtaZ|4D5rsH8+u=a>-m1auW{ek`@XJJ_1vSB;!;9VZZ~K>&oQq_vED7UC}AdWVB^IjYTFys)b(BM zVk_9&80fo(%7ldbFIcBo&$PWMFgn&<5cA+|jd)m)c(cU5ClBVY3!|*o&CdDEcs)5G zciucQF4C56eZ0wfj_nuD%-qu0r?>YKhtP#46_U==slKNQF8yUnljnPJ(^!VX?2SxO2UBfftu?$85Brp zF}%vNO!9&Uxia2WQv|oJSI!!rw$v6 z$EWP8Qx^)3D(>hI=l{SE$dnNf?-p~V%rjHr&>(Y)j!@C>r@3Z3Ur9OL^893UB|+-e z_L7FXOq~v+dCC3qwH-!3Oh0U_J8Wg-dA((A^aUX{e%;GG45z-UL`xN4ZTk|mde@hu*f0V6{H&pMLWN}1nN z?)D3<3ZKfiR4+X%sOBvS>DQhV94Kx+B#D27|RBlmbrwU%L;NrKTxj|kG&$0 zm#Q%%wbY&xSL_|yx$}w)$G1TVHQl|f`wV8i@65T|WHUNEJg8z3Tz1+|ONc|6I`?M2 z@{vO&)!S?5B}KHhT$u_pS=%ne!=yJHcKn9CQ}+DTs|MHId>n%{(&Fe=D1M!##*NZD@s@A5 zRttF>8EcuHAG6T;`i8cUFCfw;HP2LVaf?A=47ZQQq{cvNU%Tk@aNY!S{aVwAwIbHt zX;kWaKcc;z8zeZZc8F5Od(7T2wkgcAv1t6zb)LiB?C|ZoHk5LPsBSZk#BF&Bs;j#% ztFF@svo&pNE2&X;ajC64VbsFMwAgj9qET9_>}3>dmn&{VuUQ8<+JY6F|Orpgw3I{zrCFv|#A=fK^gM=syVNoMQ2p%flS zqnhs~#3mytPtASI&!AP5aW;3}dgtjhYGqxfs&2!lV$_Q&dkv<;2juR4N^6bvbw1Vm zU`|xp>~|{5G^5q}?XTivmker92Np*(+TT!K?o1PoWgo~jGqP`K-Po4#vn@mW$HRvb zKiO;2)rGnXrbVt?c*0B59Lv(i;4D^8PurNUUC3;#&K@STu&qG1E34vJ$(5tk4ep=s zwvFB#HjucNv;6T*tg2#`6e~JgmlEx@@!=Wk&=`q~x#98ylkC^nFA41|eUopNiHh1* z!<0*1bhmm$@OkO`req$`2+yNYgEFG;mwp;@o~EQe<0e+t;25e?U!OtIZEo+eS~giC z`hoMH-Br4EtldRX{F`Okvv=~k8TW6u<&)#8;V~(uQyUVXR-+S<@@&%cl#0nPV;oN$ zpE(s-9L*MBIy?K)Pa4uEuH@B7j;i2N?F(;~PSBd6DP&@L_@$?`QodBV^ia4Nc}B)_WiRh>EpJkPuXnrf z;$nGpFwduTN!J&pZeDos!l^uLolUZhMqI<p&0@ePwDwsN*^wqX{57c?*8>e&Qm1qq3W9XJXD6V?-OiyGV*K;Xx)G?8Lz6=kuHPO>I z>i1VAZM&4nY0>ZrJ(b*e{GNjP?&rRK0;?xyXmh3P$5Q4$xh-CL#C51MW8}>t+dX3S z$MrwTw^=kQ(y!AE7WeAueX-%F+xQ0e@l!QFCVYo1&-Q;!YVD2*-7?hJGhUt$AAeGH{G zk}vd@uP>zONkk-_WD$3!H#gq!0>rImzV*Wc0^ERu-~WPWpE z?)KH%UbH6@*VM~e_1m9ZraO;p02dT)3HbDEE}gFNVSodhnOOCn{W2Lo2YOSNGmh!J z*hlsJm&n7E_#)u;Q*fJ$j&6Kv=OE>Nb&-D6_`Xj@K9+QRUv@B5hMWf>S{ zL$C86uG=ij=sdDLB)Xhx>a%&dSdM#yS@DLMA&0OZ7rs)w+jm~)W~+DQ*_WSr_SDyR zGb>mLAB|?)FpdUq_PXkPZEP*e^LT}NTljlh#e7xHd+gTYj1u$Y^kvzZWo90oR#P&$ zq3nine=YsjtZu`TO-+3Q3!lGd1l($wIL7Sxx~*luuyv^e<6O|5y3=`Ef*wi--hD85 zAALu4ptZn1+VI1y_lQsB(+_vPxP-}kVf*7{nvV=gRWRR3h%UFXi}UDrqH1#BK_{fy0uE0$6_ z?&(c0R@?PGJnNCiy3yIKLXHEp-_x^hJmQw6 zjx=5?x9GK2xIs(r@hLYIg+M#C_?#z8AHUazrCqF&oNQa*&wE#ASIp@y#y>NOUS4&m zM&UP`r#D>;s~;=^-x%^q=xEeG5=v z&K|N(n8k@zX0h;aa>O0#_l)AIQ5VFMn}^iSHlKZTFRfbKLhIqW&zh$$Z%Qe@>^}^? zN4oGyF0ZfIXroQyeDLe{vp%mL{apGvy7RP-OESBye@8@WWoThu}$ zmd~o`q(@A)oa&k?eeItWSJ!xdtjP75mH&5LUtYJ8k^GOdQ6s-!qLP_gJ$DB4D84$< zyU28nDun%Vr<+i4=~|D?JFRD3FK-iP8QqwEjeq;QN6HaxpLr?!9Cn*M?MXl3Y1+xo zpB|x}t;;cEtVXTo*DoLT<=TjuRk_=9)hii+f*&4_9sU#%@nq(~I{$l{I499H(cFbJ z7cNh^w5wmDO8fTZ)$hSsqv7`2+H(vQ+)82+P#z~$Uh3)PZlxrjwK}t9eOGnzK8k~#9fsjahN^i^%x!gsftFdFS~lu~ z*=41cvh{N^=R{iDGwGgPJ^Sd;z`Z)_HTMl}>L1Ydec`D6o=tKH&WI||O z){IT!wQ+Ta^zZazRq9-7sO}EUpA3f;!rEUCO)}im_j7FdVc6f)_T6AdNdJ$RuU+Y$ z{CY|%@)t{4;Q=k$8l#1tT%G;J+8pAYY-n<`rHmi%)%$WX;rNc43f8>wd_%8nNmQtMXv*kX+v z$o=Tvpp&G`tMWS5?buRGhysJEL2X9O;>f9Q*Cwn*L#yB0GCCd7dVhZ|L9m{CxBZRv z6O%!#pE@rYd~@$}dO2Tc5jsDoG1UCTTOW17`A%cFE%lK_Dlu!Ji%qM+jWdkqPYpxQ zzUyS+*{nOgKeUy%_f`4qRpX=0pT%Auyi=jS=FaFEniu0#_PV^X92ZCU9fGH~k0z_s z9b_w`8e!Zjs8!}j^GNTa?PkBZ*fH5^Z$bT;dW%rIgejZFuO+4-T2&7x)5TIISPoYV z`|Ka_P+Gk9t5L+gC_B5PscA2#$(jAG{_{7wWOpvNRI6wov1oK&O8nW~s?xaN_D;&q zF8rMJ={?;vO9F2dC)LhAsd)E*R#iLj(A%W_r@x2`XtaGjXhq`~ZL}(Uw>H=FwXg2q zqW0sV2ZO>Nx%ICi^Gc!KeFv$nUdR*lOkWfJpyk@@ zC$D^bGSgz8>SE|({EVg6gyd5Plc3wSljn@$e_o_<6}7w65_9F$wf;DhT7#r?MYZ)) ziu6mmm7LWRzY(($YWgBW0_ZEcpszTSw672yUY8d47EDAe^-q%AoV!?)mGYLESPqqj zYLA_t_$uEa?T%Kv#7C1}n)S7M|)&v#yJb1bL9I$f!JPCd?aCv~2u#&V3C138uoN}W4< zUs^Psa-WfBQ_B4yt)1t#w8x?Nrs6Y-oUNSQqA%vUy?fb26VZz^rkNvhmJP|a>VENo zZFGgX;Q=DM`E=gO=x!ctrB%wf&(rtlyb-T}p@+S!k+NRBH zUoMW{*7q3@H@n@Y)3vN{M~d>+Ov%si631D#yuBR`6~e5AeLwDSJP4K#2@ynVpkt4rXWy_pg=shcP_c-WdG*=tRuXC7H3ZHzd{7msx#3o$6g8>3y(ZbM zfv3(#iB|mPb(;@cEZ&Cgt5V~MqzbzEfJZa%qJLu!f~MR|L@0@weXAZ)(t zB(6EAS;!)r&#K=dH4Yk*#H>O$Cd^idmZ+mHsx;@hUc`W-N@{IzqXZA`Ff!S3q6 zXdCTi3k!ILKdxcOLP7`|76k!cX%+lI1lI83f8VexNIY2UR^8E9Y{>qtbxgVuwk{59 zJ^4Ru-O1Y58YTe(M_NJ$ASE1xNtpO=B)~)UzgDCPQ=|fR_uviuwc}%Q0UHvmQ{ex> zu9cDEKh}m!7Xz5K+yAH9{yvIb?2p8z6=b2<;$w;%#nyl1UA-L)7|%g(c3x4*4YG|3 z9Q_A($p6NJc$G@-uCCx7DQ!nLl&%NnBSf?q#`%Opf#PpltawN?WbxvOhXV5z@tC3D z1ubdB+q%1fiNpn#5OL4!uxcR-smH6ux%$AHa23q)LKnaf+||lp7$t?PA+?G=jxKgb zPFSN+M6N!QiW9HT54TA1?<|FSwt!yV2WDN@6<2cu6m@#iiZ^!maYCc9z7|bPZoi> z6z*#WQ2k3nu}8ez9lTIzv>9=W;Y1%KsT4BXwd-Q65;ILba=*rVzH-?2F;>>N^V?{JHdJ?&vS-=CU7*Y;dB*CC$ZEignC^f(m%?(DtzmqHkN+=f>YvRe) zy#}Wr;(#onekHIQz`~b!R|I(fg9LKP6Cg+y{i-gQvjCCH%QcoiqjEsjLl}@Hl#dx) z7B=stuflX#urh$Vf44YU#^8L|)qUNdgEOq6qEO9cuy18>8#rIRe0 zq01(bKEL@A=W|FmWRdzA`#DuH4=ByxCuqgz+~Bumd2;w1oKHY}DLE2m+R+yq392D?N9+4E#AbVzG z5S9kAND5Zv6wAL;sHu>H0)7P`k^*{?foLF$ry!o@>{hx3W}17eN>U2wz(Ck@fq7v# z*5{CgDDbLr6P?0@p#3w@559rU?7pHJGf`Npkw^8P+oh0hr>_dZ0zkqciv;KrkJ=au z#Or})bofkNq(LSC?0r5+{ew!UvHBqn$RhP`-TC}mIS9aKzyN;}`bvj9`mslZBjrn; z48_WaFd&PR|CNe1I|PiOO~C!0u>9F@ggo+BPGd$Qge#oEB0wmRMIz+T+P;Vc3I7oM zc)<|1>5~Tmf95BWp=EU#mLbU=#{yX-gI}*%$rca>5Abm80%MRfAP)oPSU{wDo;sX* zhyt=m^|S+)>X<=j9`pft5)B%WNBzplI!J_)9p|tCfKVWdL~!6sT-yo);7HUDb{!)V z0(6oI5&@b5YPE4FkVPV_pJKAXM1dD9v*A&=WKJH0l}|{K2%qUAuu*_eAd5sO?liVZ z1M(ZewCe=x21AylK_Ga8{^#R6r1p1)7qQwQ2FN0{kLb_G>H+uj0R8ZZjM|P&+Ofsi zNd3_EI>Z54ynf>K&#@KXW7a>TDAMT1mfR9P-Sh0j6`DX6l8%?UmI70ldtUNrj2Lir z7U-}JD^j_ER8xBrO2t>{B7H1TZ?!!ayo7@ULzYlD<|UkJK#H6-kQoSm;BU7Z%}QNXrm#pjsxnEwx@gY8>)A1_-JeCPS6;p)76;6lhky6`&I zQmh3!4roQGSgxg@NCLZ3_zE9xphLs)KXV~ohYe;w0eseg_9e{5kQB=tjH1=gL|>*8 zSiB;z$o7MmJ>e_OFrK0I`d5m)t-Tyj-mv9A#pLHbCqSE!{aKCsov>~1B6!;pu&C(# zM{V1>SfkO1i11N-kH`WVAPZ^1YgkKx(O^E|&T$;j+JYbD6%E|rx3vFCgIEZ5dj}sB zUc#u{-w0O)sUuXyP?)Istz@C#CdiZhn<*&v!Bkm-BNhI|hRL6(K%T+NAylKNnIUu? z_$XoW2F&8sfVL1ha%e>jCP%DK{x@pi`eCVa{auGFCUqbi^BDL0KS|PpNvi(8ko5P; zw3`f_SaFbrME;XFLzp_Lbgg0 zmn3+(IB)ObvY&AT-X0Pgv@BqZ=0vDMu3$nH6oDl z@9;=K5y68H=ZzI?Fi%P*6$n(<1z%)dIrSc!JCOa9|M%RHjygu`172phfdxd^iehdM z4A!fpR}7U}{Jl_(C=B6}lUS%R>02R|u zc=JgpnOLwt?GRRQr5R2*WbuN59K<>tUSxghHi-li*Vy?4O<~1CHe!@`6q*M$cJUhu zhPQ$dhym1p!>jSXlU6K2ksVPs%k@$@W2)>*U*fVFvj601_;y-)DM>xOQn5yu&{m9J zur7z}Rk}CW-|?z(W8_YD`HKRe5AuUP2;WQKE+da>Xz(Y_@f_BVSk0URxb%T6l3{R@ zYp@9Dl-mIVyi~Bek~|E5D(#4JCrf??OHjHGM*>+wf~Vm9-WlzId2R3*a&{MT=@$Ex zJOsE}J0gIL_}}c9_k0I^a3GK+1i%b4>*wsb_`#US23}IZL*U#-9)Lg9c0>f)beb9>Cl?!t&9;OZw60j}PTh~PapyemUp8cC4vHFU%aED|KZA_2aa5H(Cv z0(`|Ck#_o0_{a~<0C?>{8Dg4(mnesil2rTOYVJIlzhhGdvU%cvA3F`l+bQe8)PEE> z9iH?wV`LEx72OfJy=U83EWx50E_EP_cROzMmmL@^#5{3fzL^e&t-#FRk%!=KWp_k4 zHpa799QR{5EXX2pE}$5UJwPA!0DGG7Pg8D|^Xjox7 z5IndDgU#^(SXk~%k%t3WdPjsJAu^9e*+C7rNR%6`iA~76!0@iE<5s?8)C3t3Oe<2G7y!?)cqwC%RHXPO&I1b1nIkrd&xUl?{ zV|JD-9Pk1>B988^Z&(iBk2oI4A~~X|``Z4_k-9(@4tNP35yu%h_!I(7C3p^?5;5BZt{af$US0zt4Pr+bG%1z%oM*e47BDH|oeG8&`!#e2zZh zL(p2UMQk=DTH&GrS$q_5)8L2hW3JVpSIC3$7G6kF`IAgh_)}C!lt@=@EnyMz3vnor zMIyx0aBngLkIn<&(HXuLp`G{|I@DF}RcnyS0`%}ithSgDgF>J%SWQDBFuz7iY^WRVc? z`_TEosEYZE8~g}vA`=9@Qj&;b-4PtcHvzasQoyeyC!}y;ClkeAE+{7)XJc=##>RvD z+A5eulEANjCM0>Wg?uE$or2#7r`y^O7YWEB^}}yZCDgCQLni%D-RD0KQwiUwuz`5L zNC~q@Ao!(_gg`1g$P7dr75XPQ@q-<>?1C&30)7o2Aw;qOxgelYR-#URfOZWw0%8)> zFpGqM-$q0TVFW&1g3rc(J@W@qy#xO*2#!s{*MA`AZ>X5{pHpjIcr6wLS|UOg2?W2= zg%D^&lFUHFsdaKQZk?N}go_Sjkr43fFbE->Wk>`;ux&_qIR@cy>#L6|*12ko+XI3u zQa${@WJ2{cisVv{KR%g|K%jRNy9$BIjUbCBAbvc89}w|HnM4FcHM%=9a0w4tgE-=6 zBI3hy3BB#8LQ1XpB3+`vXKK?WY?W?|Jq`h~csJvof8b}C5=u`{C#7`4GF>9^dmG?> chx~s;iyADdF{@HEg`*w?#eFUCdWqtH02>c-;s5{u From 75598878e87551f6952e312fa2c0d32c0693a371 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 13 May 2017 12:17:31 +0200 Subject: [PATCH 09/12] Fixing illegal constructor usage Now it uses the right method --- .../codemetropolis/toolchain/rendering/util/Character.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java index 49c64e26..cdbcadd2 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java @@ -8,8 +8,8 @@ public abstract class Character { protected static BasicBlock _topFallback; static{ - _fallback = new BasicBlock( (short)35, Colour.MAGENTA.getValue(), "minecraft:wool", "Magenta Wool", (short)0); - _topFallback = new BasicBlock( (short)85, 0, "minecraft:fence", "Fence", (short)0); + _fallback = BasicBlock.get((short)35, Colour.MAGENTA.getValue()); + _topFallback = BasicBlock.get((short)85, 0); } public static BasicBlock getBlock(String str, BasicBlock fallback){ From 28f2ba09095e2c69bdb62938b44b0b01e312600d Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 13 May 2017 14:42:38 +0200 Subject: [PATCH 10/12] Final cleanup Final cleanup and preparing for merge --- .../toolchain/rendering/model/BasicBlock.java | 69 ++++++++++--------- .../toolchain/rendering/util/Character.java | 41 +++++------ 2 files changed, 58 insertions(+), 52 deletions(-) diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java index d8a7afac..69da4404 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/model/BasicBlock.java @@ -18,7 +18,7 @@ public class BasicBlock{ protected static final HashMap used; static{ - NonBlock = new BasicBlock((short)-1, 0, "NonBlock", "A non-existant block", (short)2); + NonBlock = new BasicBlock((short) -1, 0, "NonBlock", "A non-existant block", (short) 2); idToBlock = new HashMap>(); nameToBlock = new HashMap>(); humanReadableNameToBlock = new HashMap(); @@ -37,29 +37,8 @@ public class BasicBlock{ Short.parseShort(blockInfo[4]) ); - /* - * In the next two cases, if the the id/name and the data combo - * is already present, it'll overwrite the previous data This is - * intended behaviour, because there are sometimes simplified - * human readable block names if there are too many variations, - * so user doesn't have to specify. - */ - - // Adding to idToBlock - HashMap idBlock = idToBlock.get(block.id); - if (idBlock == null){ - idBlock = new HashMap(); - idToBlock.put(block.id, idBlock); - } - idBlock.put(block.data, block); - - // Adding to nameToBlock - HashMap nameBlock = nameToBlock.get(block.name); - if (nameBlock == null){ - nameBlock = new HashMap(); - nameToBlock.put(block.name, nameBlock); - } - nameBlock.put(block.data, block); + add(idToBlock, block.id, block); + add(nameToBlock, block.name, block); humanReadableNameToBlock.put(block.getHumanReadableName().toLowerCase(), block); // System.out.println(block); @@ -76,7 +55,6 @@ public class BasicBlock{ private String humanReadableName; private short hazardous; - public BasicBlock(BasicBlock original){ this.id = original.id; this.data = original.data; @@ -93,6 +71,20 @@ protected BasicBlock(short id, int data, String name, String humanReadableName, this.hazardous = hazardous; } + protected static void add(HashMap> map, K key, BasicBlock block){ + /* + * This method overwrites previous key-BasicBlock pairs in the HashMap + * This is intentional behaviour, since .csv may contain + * "simplifications" + */ + HashMap blocks = map.get(key); + if (blocks == null){ + blocks = new HashMap(); + map.put(key, blocks); + } + blocks.put(block.data, block); + } + // Return block // String is the human readable name // This method is used on user-inputed strings and it checks if it's allowed @@ -106,15 +98,15 @@ public static BasicBlock userBlock(String name, BasicBlock fallback){ } else{ switch (block.getHazardous()){ - case 2: - System.out.println("ILLEGAL\tUse of \"" + block.getHumanReadableName() + "\" is restricted!"); - System.out.println("\tFalling back to \"" + fallback.getHumanReadableName() + "\"."); + case 0: + System.out.println("SUCCESS\tUsing \"" + block.getHumanReadableName() + "\" block."); break; case 1: System.out.println("WARNING\tUsing \"" + block.getHumanReadableName() + "\" DANGEROUS block."); break; - case 0: - System.out.println("SUCCESS\tUsing \"" + block.getHumanReadableName() + "\" block."); + default: + System.out.println("ILLEGAL\tUse of \"" + block.getHumanReadableName() + "\" is restricted!"); + System.out.println("\tFalling back to \"" + fallback.getHumanReadableName() + "\"."); break; } } @@ -203,8 +195,21 @@ public boolean equals(Object obj){ @Override public String toString(){ - return "Block object: \"" + getHumanReadableName() + "\" (id: " + id + ", name: " + getName() + ", data: " + data + ")"; - // return getHumanReadableName() + (data != 0 ? data : ""); + String str = "Block object: \"" + getHumanReadableName() + "\""; + str += " (id: " + id + ", name: " + name + ", data: " + data + ", hazard: "; + switch (hazardous){ + case 0: + str += "safe"; + break; + case 1: + str += "warn"; + break; + default: + str += "forbidden"; + break; + } + str += ")"; + return str; } } diff --git a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java index cdbcadd2..7a097e87 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java +++ b/sources/codemetropolis-toolchain-rendering/src/main/java/codemetropolis/toolchain/rendering/util/Character.java @@ -3,13 +3,13 @@ import codemetropolis.toolchain.rendering.model.BasicBlock; import codemetropolis.toolchain.rendering.util.Colour; -public abstract class Character { - protected static BasicBlock _fallback; - protected static BasicBlock _topFallback; +public abstract class Character{ + protected static BasicBlock _fallback; + protected static BasicBlock _topFallback; static{ - _fallback = BasicBlock.get((short)35, Colour.MAGENTA.getValue()); - _topFallback = BasicBlock.get((short)85, 0); + _fallback = BasicBlock.get("minecraft:wool", Colour.MAGENTA.getValue()); + _topFallback = BasicBlock.get("minecraft:fence", 0); } public static BasicBlock getBlock(String str, BasicBlock fallback){ @@ -27,23 +27,24 @@ public static BasicBlock getTopBlock(String str){ public static BasicBlock getTopBlock(String str, BasicBlock fallback){ BasicBlock block = BasicBlock.userBlock(str, fallback); if (block != null){ - switch (block.getId()){ + switch (block.getName()){ // TODO Add more fences in the .csv - case 5: - case 17: - return BasicBlock.userBlock("fence", fallback); - case 1: - case 43: - case 44: - return BasicBlock.userBlock("cobblestone wall", fallback); - case 48: - return BasicBlock.userBlock("mossy cobblestone wall", fallback); - case 112: - return BasicBlock.userBlock("nether brick fence", fallback); - case 98: + case "minecraft:planks": // 5 + case "minecraft:log": // 17 + case "minecraft:log2": // 162 + return BasicBlock.get("minecraft:fence"); + case "minecraft:stone": // 1 + case "minecraft:double_stone_slab": // 43 + case "minecraft:stone_slab": // 44 + return BasicBlock.get("minecraft:cobblestone_wall", 0); // Regular cobblestone wall + case "minecraft:mossy_cobblestone": // 48 + return BasicBlock.get("minecraft:cobblestone_wall", 1); // Mossy cobblestone wall + case "minecraft:nether_brick": // 112 + return BasicBlock.get("minecraft:nether_brick_fence"); + case "minecraft:stonebrick": // 98 if (block.getData() == 1) - return BasicBlock.userBlock("mossy cobblestone wall", fallback); - return BasicBlock.userBlock("cobblestone wall", fallback); + return BasicBlock.get("minecraft:cobblestone_wall", 1); // Mossy cobblestone wall + return BasicBlock.get("minecraft:cobblestone_wall", 0); // Regular cobblestone wall } } return fallback; From cea7cf4c221916c1c452a4ba7c889d2ddecdc832 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 13 May 2017 15:12:02 +0200 Subject: [PATCH 11/12] PMD converter --- .../converter/control/ConverterLoader.java | 3 + .../converter/control/ConverterType.java | 3 +- .../toolchain/converter/pmd/PmdConverter.java | 143 ++++++++++++++++++ .../converter/test/addPropertiesTest.java | 46 ++++++ .../converter/test/cdfConvertTest.java | 40 +++++ .../converter/test/cdfConvertTest2.java | 42 +++++ .../converter/test/convertTypeTest.java | 40 +++++ .../test/createElementsRecursivelyTest.java | 38 +++++ .../converter/test/createElementsTest.java | 39 +++++ .../converter/test/isNumericTest.java | 30 ++++ .../toolchain/converter/test/loadXmlTest.java | 33 ++++ .../converter/test/parseXmlTest.java | 45 ++++++ .../converter/test/wrongSourceTest.java | 39 +++++ 13 files changed, 540 insertions(+), 1 deletion(-) create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/pmd/PmdConverter.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/addPropertiesTest.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/cdfConvertTest.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/cdfConvertTest2.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/convertTypeTest.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/createElementsRecursivelyTest.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/createElementsTest.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/isNumericTest.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/loadXmlTest.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/parseXmlTest.java create mode 100644 sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/wrongSourceTest.java diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterLoader.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterLoader.java index 39579620..47cd9b4b 100644 --- a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterLoader.java +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterLoader.java @@ -5,6 +5,7 @@ import codemetropolis.toolchain.commons.cdf.converter.CdfConverter; import codemetropolis.toolchain.converter.sonarqube.SonarQubeConverter; import codemetropolis.toolchain.converter.sourcemeter.GraphConverter; +import codemetropolis.toolchain.converter.pmd.PmdConverter; public class ConverterLoader { @@ -16,6 +17,8 @@ public static CdfConverter load(ConverterType converterType, Map return new GraphConverter(params); case SONARQUBE: return new SonarQubeConverter(params); + case PMD: + return new PmdConverter(params); default: return null; } diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterType.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterType.java index da4a69ad..c23dface 100644 --- a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterType.java +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/control/ConverterType.java @@ -2,5 +2,6 @@ public enum ConverterType { SOURCEMETER, - SONARQUBE + SONARQUBE, + PMD } diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/pmd/PmdConverter.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/pmd/PmdConverter.java new file mode 100644 index 00000000..d07e4679 --- /dev/null +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/pmd/PmdConverter.java @@ -0,0 +1,143 @@ +package codemetropolis.toolchain.converter.pmd; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; + +import org.w3c.dom.Document; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import codemetropolis.toolchain.commons.cdf.CdfElement; +import codemetropolis.toolchain.commons.cdf.CdfTree; +import codemetropolis.toolchain.commons.cdf.converter.CdfConverter; +import codemetropolis.toolchain.commons.exceptions.CodeMetropolisException; +import graphlib.AttributeString; +import graphlib.Edge.EdgeIterator; +import graphlib.Edge.EdgeType; +import graphlib.Edge.eDirectionType; +import codemetropolis.toolchain.commons.cdf.CdfProperty; + +public class PmdConverter extends CdfConverter { + + int vCounter = 0; + + public PmdConverter(Map params) { + super(params); + } + + @Override + public CdfTree createElements(String source) throws CodeMetropolisException { + + vCounter = 0; + Document doc = loadXml(source); + CdfElement root = createElementsRecursively(doc); + CdfTree tree = new CdfTree(); + tree.setRoot(root); + return tree; + } + + public CdfElement createElementsRecursively(Node root) { + CdfElement element = null; + element = cdfConvert(root); + if (element != null) { + addProperties(element, root); + NodeList children = root.getChildNodes(); + for (int i = 0; i < children.getLength(); i++) { + CdfElement e = createElementsRecursively(children.item(i)); + if (e != null) { + element.addChildElement(e); + } + } + } + return element; + + } + + public void addProperties(CdfElement elem, Node n) { + if (n.hasAttributes()) { + NamedNodeMap map = n.getAttributes(); + for (int i = 0; i < map.getLength(); i++) { + + elem.addProperty(map.item(i).getNodeName(), map.item(i).getNodeValue(), + convertType(map.item(i).getNodeValue())); + } + } + } + + public CdfElement cdfConvert(Node n) { + CdfElement elem = null; + switch (n.getNodeName()) { + case "violation": + elem = new CdfElement(("violation" + vCounter), "violation"); + vCounter++; + break; + case "file": + elem = new CdfElement(n.getAttributes().getNamedItem("name").getNodeValue(), "file"); + break; + case "#document": + case "pmd": + elem = new CdfElement(n.getNodeName(), "other"); + break; + default: + + break; + } + + return elem; + + } + + public CdfProperty.Type convertType(String str) { + + if (isNumeric(str)) + return CdfProperty.Type.INT; + else + return CdfProperty.Type.STRING; + + } + + public boolean isNumeric(String str) { + if (str.chars().allMatch(Character::isDigit)) + return true; + else + return false; + + } + + public Document parseXml(String source, DocumentBuilder dBuilder) { + File xmlFile = new File(source); + Document doc = null; + try { + doc = dBuilder.parse(xmlFile); + } catch (SAXException e) { + System.out.println("Parsing xml input has failed"); + } catch (IOException e) { + + System.out.println("Reading xml input has failed"); + } + return doc; + } + + public Document loadXml(String source) { + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + ; + DocumentBuilder dBuilder = null; + + try { + dBuilder = dbFactory.newDocumentBuilder(); + } catch (ParserConfigurationException e) { + System.out.println("Parse Configuration has failed"); + } + Document doc = parseXml(source, dBuilder); + return doc; + } +} diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/addPropertiesTest.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/addPropertiesTest.java new file mode 100644 index 00000000..19915492 --- /dev/null +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/addPropertiesTest.java @@ -0,0 +1,46 @@ +package codemetropolis.toolchain.converter.test; + +import static org.junit.Assert.*; + +import java.io.File; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +import codemetropolis.toolchain.commons.cdf.CdfElement; +import codemetropolis.toolchain.converter.pmd.PmdConverter; + +public class addPropertiesTest { + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + String filePath = new File("").getAbsolutePath(); + PmdConverter c=new PmdConverter(null); + Document doc=c.loadXml(filePath+"//pom.xml"); + boolean good=true; + Node n=doc; + CdfElement elem=new CdfElement(); + c.addProperties(elem, n); + if(!n.hasAttributes()){ + if(!elem.getProperties().isEmpty()) + good=false; + } + else + { + int n1=elem.getProperties().size(); + int n2=n.getAttributes().getLength(); + if(n1!=n2) good=false; + } + Assert.assertTrue(good); + + + } + +} diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/cdfConvertTest.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/cdfConvertTest.java new file mode 100644 index 00000000..1985b76f --- /dev/null +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/cdfConvertTest.java @@ -0,0 +1,40 @@ +package codemetropolis.toolchain.converter.test; + +import static org.junit.Assert.*; + +import java.io.File; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Node; + +import codemetropolis.toolchain.commons.cdf.CdfElement; +import codemetropolis.toolchain.converter.pmd.PmdConverter; + +public class cdfConvertTest { + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + String filePath = new File("").getAbsolutePath(); + PmdConverter c=new PmdConverter(null); + Document doc=c.loadXml(filePath+"//pom.xml"); + boolean good=true; + Node n=doc; + CdfElement elem=c.cdfConvert(n); + + if(doc.getNodeName()=="#document"&&!elem.getName().equals("#document")) good=false; + if(doc.getNodeName()=="pmd"&&!elem.getName().equals("pmd")) good=false; + if(doc.getNodeName()=="violation"&&!elem.getType().equals("violation")) good=false; + Assert.assertTrue(good); + + } + + + +} diff --git a/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/cdfConvertTest2.java b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/cdfConvertTest2.java new file mode 100644 index 00000000..10cecc11 --- /dev/null +++ b/sources/codemetropolis-toolchain-converter/src/main/java/codemetropolis/toolchain/converter/test/cdfConvertTest2.java @@ -0,0 +1,42 @@ +package codemetropolis.toolchain.converter.test; + +import static org.junit.Assert.*; + +import java.io.File; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; + +import codemetropolis.toolchain.commons.cdf.CdfElement; +import codemetropolis.toolchain.converter.pmd.PmdConverter; + +public class cdfConvertTest2 { + + @After + public void tearDown() throws Exception { + } + + @Test + public void test() { + String filePath = new File("").getAbsolutePath(); + PmdConverter c=new PmdConverter(null); + Document doc=c.loadXml(filePath+"//pom.xml"); + boolean good=true; + Node n=doc; + NodeList nl=n.getChildNodes(); + for(int i=0;i Date: Sat, 13 May 2017 17:17:19 +0200 Subject: [PATCH 12/12] Fixed stained glass panes being illegal Damn auto increment --- .../src/main/resources/blocks.csv | 858 +++++++++--------- 1 file changed, 429 insertions(+), 429 deletions(-) diff --git a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv index 3f7d6167..06ec4867 100644 --- a/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv +++ b/sources/codemetropolis-toolchain-rendering/src/main/resources/blocks.csv @@ -1,429 +1,429 @@ -0,0,minecraft:air,Air,2 -1,0,minecraft:stone,Stone,0 -1,1,minecraft:stone,Granite,0 -1,2,minecraft:stone,Polished Granite,0 -1,3,minecraft:stone,Diorite,0 -1,4,minecraft:stone,Polished Diorite,0 -1,5,minecraft:stone,Andesite,0 -1,6,minecraft:stone,Polished Andesite,0 -2,0,minecraft:grass,Grass Block,0 -3,0,minecraft:dirt,Dirt,0 -3,1,minecraft:dirt,Coarse Dirt,0 -3,2,minecraft:dirt,Podzol,0 -4,0,minecraft:cobblestone,Cobblestone,0 -5,0,minecraft:planks,Planks,0 -5,0,minecraft:planks,Oak Planks,0 -5,1,minecraft:planks,Spruce Planks,0 -5,2,minecraft:planks,Birch Planks,0 -5,3,minecraft:planks,Jungle Planks,0 -5,4,minecraft:planks,Acacia Planks,0 -5,5,minecraft:planks,Dark Oak Planks,0 -6,0,minecraft:sapling,Saplings,0 -6,0,minecraft:sapling,Oak Sapling,0 -6,1,minecraft:sapling,Spruce Sapling,0 -6,2,minecraft:sapling,Birch Sapling,0 -6,3,minecraft:sapling,Jungle Sapling,0 -6,4,minecraft:sapling,Acacia Sapling,0 -6,5,minecraft:sapling,Dark Oak Sapling,0 -7,0,minecraft:bedrock,Bedrock,1 -8,0,minecraft:flowing_water,Flowing Water,2 -9,0,minecraft:water,Water,1 -10,0,minecraft:flowing_lava,Flowing Lava,2 -11,0,minecraft:lava,Lava,1 -12,0,minecraft:sand,Sand,0 -12,1,minecraft:sand,Red Sand,0 -13,0,minecraft:gravel,Gravel,0 -14,0,minecraft:gold_ore,Gold Ore,0 -15,0,minecraft:iron_ore,Iron Ore,0 -16,0,minecraft:coal_ore,Coal Ore,0 -17,0,minecraft:log,Wood,0 -17,0,minecraft:log,Oak Wood,0 -17,1,minecraft:log,Spruce Wood,0 -17,2,minecraft:log,Birch Wood,0 -17,3,minecraft:log,Jungle Wood,0 -18,0,minecraft:leaves,Leaves,0 -18,0,minecraft:leaves,Oak Leaves,0 -18,1,minecraft:leaves,Spruce Leaves,0 -18,2,minecraft:leaves,Birch Leaves,0 -18,3,minecraft:leaves,Jungle Leaves,0 -19,0,minecraft:sponge,Sponge,0 -19,1,minecraft:sponge,We Sponge,0 -20,0,minecraft:glass,Glass,0 -21,0,minecraft:lapis_ore,Lapis Lazuli Ore,0 -22,0,minecraft:lapis_block,Lapis Lazuli Block,0 -23,0,minecraft:dispenser,Dispenser,2 -24,0,minecraft:sandstone,Sandstone,0 -24,1,minecraft:sandstone,Chiseled Sandstone,0 -24,2,minecraft:sandstone,Smooth Sandstone,0 -25,0,minecraft:noteblock,Note Block,2 -26,0,minecraft:bed,Bed,2 -27,0,minecraft:golden_rail,Powered Rail,2 -28,0,minecraft:detector_rail,Detector Rail,2 -29,0,minecraft:sticky_piston,Sticky Piston,2 -30,0,minecraft:web,Cobweb,0 -31,0,minecraft:tallgrass,Grass,0 -31,0,minecraft:tallgrass,Shrub,0 -31,1,minecraft:tallgrass,Tall Grass,0 -31,2,minecraft:tallgrass,Fern,0 -32,0,minecraft:deadbush,Dead Bush,0 -33,0,minecraft:piston,Piston,2 -34,0,minecraft:piston_head,Piston Extension,2 -35,0,minecraft:wool,Wool,0 -35,0,minecraft:wool,White Wool,0 -35,1,minecraft:wool,Orange Wool,0 -35,2,minecraft:wool,Magenta Wool,0 -35,3,minecraft:wool,Light Blue Wool,0 -35,4,minecraft:wool,Yellow Wool,0 -35,5,minecraft:wool,Lime Wool,0 -35,6,minecraft:wool,Pink Wool,0 -35,7,minecraft:wool,Gray Wool,0 -35,8,minecraft:wool,Light Gray Wool,0 -35,9,minecraft:wool,Cyan Wool,0 -35,10,minecraft:wool,Purple Wool,0 -35,11,minecraft:wool,Blue Wool,0 -35,12,minecraft:wool,Brown Wool,0 -35,13,minecraft:wool,Green Wool,0 -35,14,minecraft:wool,Red Wool,0 -35,15,minecraft:wool,Black Wool,0 -36,0,minecraft:piston_extension,Block moved by Piston,2 -37,0,minecraft:yellow_flower,Dandelion,0 -38,0,minecraft:red_flower,Poppy,2 -38,1,minecraft:red_flower,Blue Orchid,2 -38,2,minecraft:red_flower,Allium,2 -38,3,minecraft:red_flower,Azure Bluet,2 -38,4,minecraft:red_flower,Red Tulip,2 -38,5,minecraft:red_flower,Orange Tulip,2 -38,6,minecraft:red_flower,White Tulip,2 -38,7,minecraft:red_flower,Pink Tulip,2 -38,8,minecraft:red_flower,Oxeye Daisy,0 -39,0,minecraft:brown_mushroom,Brown Mushroom,2 -40,0,minecraft:red_mushroom,Red Mushroom,2 -41,0,minecraft:gold_block,Block of Gold,0 -42,0,minecraft:iron_block,Block of Iron,0 -43,0,minecraft:double_stone_slab,Double Stone Slab,0 -43,1,minecraft:double_stone_slab,Double Sandstone Slab,0 -43,2,minecraft:double_stone_slab,Double Wooden Slab,0 -43,3,minecraft:double_stone_slab,Double Cobblestone Slab,0 -43,4,minecraft:double_stone_slab,Double Bricks Slab,0 -43,5,minecraft:double_stone_slab,Double Stone Brick Slab,0 -43,6,minecraft:double_stone_slab,Double Nether Brick Slab,0 -43,7,minecraft:double_stone_slab,Double Quartz Slab,0 -43,8,minecraft:double_stone_slab,Smooth Double Stone Slab,0 -43,9,minecraft:double_stone_slab,Smooth Double Sandstone Slab,0 -43,15,minecraft:double_stone_slab,Tile Double Quartz Slab,0 -44,0,minecraft:stone_slab,Stone Slab,0 -44,1,minecraft:stone_slab,Sandstone Slab,0 -44,2,minecraft:stone_slab,Wooden Slab,0 -44,3,minecraft:stone_slab,Cobblestone Slab,0 -44,4,minecraft:stone_slab,Bricks Slab,0 -44,5,minecraft:stone_slab,Stone Brick Slab,0 -44,6,minecraft:stone_slab,Nether Brick Slab,0 -44,7,minecraft:stone_slab,Quartz Slab,0 -44,8,minecraft:stone_slab,Upper Stone Slab,0 -44,9,minecraft:stone_slab,Upper Sandstone Slab,0 -44,10,minecraft:stone_slab,Upper Wooden Slab,0 -44,11,minecraft:stone_slab,Upper Cobblestone Slab,0 -44,12,minecraft:stone_slab,Upper Bricks Slab,0 -44,13,minecraft:stone_slab,Upper Stone Brick Slab,0 -44,14,minecraft:stone_slab,Upper Nether Brick Slab,0 -44,15,minecraft:stone_slab,Upper Quartz Slab,0 -45,0,minecraft:brick_block,Bricks,0 -46,0,minecraft:tnt,TNT,1 -47,0,minecraft:bookshelf,Bookshelf,0 -48,0,minecraft:mossy_cobblestone,Mossy Cobblestone,0 -49,0,minecraft:obsidian,Obsidian,0 -50,5,minecraft:torch,Torch,2 -50,1,minecraft:torch,Torch East,2 -50,2,minecraft:torch,Torch West,2 -50,3,minecraft:torch,Torch South,2 -50,4,minecraft:torch,Torch North,2 -51,0,minecraft:fire,Fire,2 -52,0,minecraft:mob_spawner,Monster Spawner,2 -53,0,minecraft:oak_stairs,Oak Wood Stairs,2 -54,0,minecraft:chest,Chest,2 -55,0,minecraft:redstone_wire,Redstone Wire,2 -56,0,minecraft:diamond_ore,Diamond Ore,0 -57,0,minecraft:diamond_block,Block of Diamond,0 -58,0,minecraft:crafting_table,Crafting Table,0 -59,0,minecraft:wheat,Wheat,2 -60,0,minecraft:farmland,Farmland,2 -60,7,minecraft:farmland,Wet Farmland,2 -61,0,minecraft:furnace,Furnace,1 -62,0,minecraft:lit_furnace,Burning Furnace,2 -63,0,minecraft:standing_sign,Sign Post,2 -63,0,minecraft:standing_sign,Sign Post (S),2 -63,1,minecraft:standing_sign,Sign Post (S-SW),2 -63,2,minecraft:standing_sign,Sign Post (SW),2 -63,3,minecraft:standing_sign,Sign Post (W-SW),2 -63,4,minecraft:standing_sign,Sign Post (W),2 -63,5,minecraft:standing_sign,Sign Post (W-NW),2 -63,6,minecraft:standing_sign,Sign Post (NW),2 -63,7,minecraft:standing_sign,Sign Post (N-NW),2 -63,8,minecraft:standing_sign,Sign Post (N),2 -63,9,minecraft:standing_sign,Sign Post (N-NE),2 -63,10,minecraft:standing_sign,Sign Post (NE),2 -63,11,minecraft:standing_sign,Sign Post (E-NE),2 -63,12,minecraft:standing_sign,Sign Post (E),2 -63,13,minecraft:standing_sign,Sign Post (E-SE),2 -63,14,minecraft:standing_sign,Sign Post (SE),2 -63,15,minecraft:standing_sign,Sign Post (S-SE),2 -64,0,minecraft:wooden_door,Wooden Door,2 -64,0,minecraft:wooden_door,Lower Wooden Door (Closed E),2 -64,1,minecraft:wooden_door,Lower Wooden Door (Closed S),2 -64,2,minecraft:wooden_door,Lower Wooden Door (Closed W),2 -64,3,minecraft:wooden_door,Lower Wooden Door (Closed N),2 -64,4,minecraft:wooden_door,Lower Wooden Door (Open E),2 -64,5,minecraft:wooden_door,Lower Wooden Door (Open S),2 -64,6,minecraft:wooden_door,Lower Wooden Door (Open W),2 -64,7,minecraft:wooden_door,Lower Wooden Door (Open N),2 -64,8,minecraft:wooden_door,Upper Wooden Door (Unpowered Left),2 -64,9,minecraft:wooden_door,Upper Wooden Door (Unpowered Right),2 -64,10,minecraft:wooden_door,Upper Wooden Door (Powered Left),2 -64,11,minecraft:wooden_door,Upper Wooden Door (Powered Right),2 -65,0,minecraft:ladder,Ladders,2 -66,0,minecraft:rail,Rail,2 -67,0,minecraft:stone_stairs,Cobblestone Stairs,2 -68,2,minecraft:wall_sign,Wall Sign,2 -68,2,minecraft:wall_sign,Wall Sign (N),2 -68,3,minecraft:wall_sign,Wall Sign (S),2 -68,4,minecraft:wall_sign,Wall Sign (W),2 -68,5,minecraft:wall_sign,Wall Sign (E),2 -69,0,minecraft:lever,Lever,2 -70,0,minecraft:stone_pressure_plate,Stone Pressure Plate,2 -71,0,minecraft:iron_door,Iron Door,2 -71,0,minecraft:iron_door,Lower Iron Door (Closed E),2 -71,1,minecraft:iron_door,Lower Iron Door (Closed S),2 -71,2,minecraft:iron_door,Lower Iron Door (Closed W),2 -71,3,minecraft:iron_door,Lower Iron Door (Closed N),2 -71,4,minecraft:iron_door,Lower Iron Door (Open E),2 -71,5,minecraft:iron_door,Lower Iron Door (Open S),2 -71,6,minecraft:iron_door,Lower Iron Door (Open W),2 -71,7,minecraft:iron_door,Lower Iron Door (Open N),2 -71,8,minecraft:iron_door,Upper Iron Door (Unpowered Left),2 -71,9,minecraft:iron_door,Upper Iron Door (Unpowered Right),2 -71,10,minecraft:iron_door,Upper Iron Door (Powered Left),2 -71,11,minecraft:iron_door,Upper Iron Door (Powered Right),2 -72,0,minecraft:wooden_pressure_plate,Wooden Pressure Plate,2 -73,0,minecraft:redstone_ore,Redstone Ore,0 -74,0,minecraft:lit_redstone_ore,Glowing Redstone Ore,0 -75,5,minecraft:unlit_redstone_torch,Redstone Torch (inactive),2 -75,1,minecraft:unlit_redstone_torch,Redstone Torch East (inactive),2 -75,2,minecraft:unlit_redstone_torch,Redstone Torch West (inactive),2 -75,3,minecraft:unlit_redstone_torch,Redstone Torch South (inactive),2 -75,4,minecraft:unlit_redstone_torch,Redstone Torch East (inactive),2 -76,5,minecraft:redstone_torch,Redstone Torch (active),2 -76,1,minecraft:unlit_redstone_torch,Redstone Torch East (active),2 -76,2,minecraft:unlit_redstone_torch,Redstone Torch West (active),2 -76,3,minecraft:unlit_redstone_torch,Redstone Torch South (active),2 -76,4,minecraft:unlit_redstone_torch,Redstone Torch East (active),2 -77,0,minecraft:stone_button,Stone Button,2 -78,0,minecraft:snow_layer,Snow,2 -79,0,minecraft:ice,Ice,1 -80,0,minecraft:snow,Snow,0 -81,0,minecraft:cactus,Cactus,2 -82,0,minecraft:clay,Clay,0 -83,0,minecraft:reeds,Sugar Cane,1 -84,0,minecraft:jukebox,Jukebox,2 -85,0,minecraft:fence,Fence,0 -86,0,minecraft:pumpkin,Pumpkin,0 -87,0,minecraft:netherrack,Netherrack,0 -88,0,minecraft:soul_sand,Soul Sand,0 -89,0,minecraft:glowstone,Glowstone,0 -90,0,minecraft:portal,Nether Portal,2 -91,0,minecraft:lit_pumpkin,Jack 'o' Lantern,0 -92,0,minecraft:cake,Cake Block,0 -93,0,minecraft:unpowered_repeater,Redstone Repeater (inactive),2 -94,0,minecraft:powered_repeater,Redstone Repeater (active),2 -95,0,minecraft:stained_glass,Stained Glass,0 -95,0,minecraft:stained_glass,White Stained Glass,0 -95,1,minecraft:stained_glass,Orange Stained Glass,0 -95,2,minecraft:stained_glass,Magenta Stained Glass,0 -95,3,minecraft:stained_glass,Light Blue Stained Glass,0 -95,4,minecraft:stained_glass,Yellow Stained Glass,0 -95,5,minecraft:stained_glass,Lime Stained Glass,0 -95,6,minecraft:stained_glass,Pink Stained Glass,0 -95,7,minecraft:stained_glass,Gray Stained Glass,0 -95,8,minecraft:stained_glass,Light Gray Stained Glass,0 -95,9,minecraft:stained_glass,Cyan Stained Glass,0 -95,10,minecraft:stained_glass,Purple Stained Glass,0 -95,11,minecraft:stained_glass,Blue Stained Glass,0 -95,12,minecraft:stained_glass,Brown Stained Glass,0 -95,13,minecraft:stained_glass,Green Stained Glass,0 -95,14,minecraft:stained_glass,Red Stained Glass,0 -95,15,minecraft:stained_glass,Black Stained Glass,0 -96,0,minecraft:trapdoor,Trapdoor,2 -97,0,minecraft:monster_egg,Monster Egg,1 -97,0,minecraft:monster_egg,Stone Monster Egg,1 -97,1,minecraft:monster_egg,Cobblestone Monster Egg,1 -97,2,minecraft:monster_egg,Stone Brick Monster Egg,1 -97,3,minecraft:monster_egg,Mossy Stone Brick Monster Egg,1 -97,4,minecraft:monster_egg,Cracked Stone Brick Monster Egg,1 -97,5,minecraft:monster_egg,Chiseled Stone Brick Monster Egg,1 -98,0,minecraft:stonebrick,Stone Bricks,0 -98,1,minecraft:stonebrick,Mossy Stone Brick,0 -98,2,minecraft:stonebrick,Cracked Stone Brick,0 -98,3,minecraft:stonebrick,Chiseled Stone Brick,0 -99,14,minecraft:brown_mushroom_block,Huge Brown Mushroom,0 -100,14,minecraft:red_mushroom_block,Huge Red Mushroom,0 -101,0,minecraft:iron_bars,Iron Bars,0 -102,0,minecraft:glass_pane,Glass Pane,0 -103,0,minecraft:melon_block,Melon,0 -104,0,minecraft:pumpkin_stem,Pumpkin Stem,2 -105,0,minecraft:melon_stem,Melon Stem,2 -106,0,minecraft:vine,Vines,2 -107,0,minecraft:fence_gate,Fence Gate,2 -108,0,minecraft:brick_stairs,Brick Stairs,2 -109,0,minecraft:stone_brick_stairs,Stone Brick Stairs,2 -110,0,minecraft:mycelium,Mycelium,0 -111,0,minecraft:waterlily,Lily Pad,2 -112,0,minecraft:nether_brick,Nether Brick,0 -113,0,minecraft:nether_brick_fence,Nether Brick Fence,0 -114,0,minecraft:nether_brick_stairs,Nether Brick Stairs,2 -115,0,minecraft:nether_wart,Nether Wart,2 -116,0,minecraft:enchanting_table,Enchantment Table,2 -117,0,minecraft:brewing_stand,Brewing Stand,2 -118,0,minecraft:cauldron,Cauldron,2 -119,0,minecraft:end_portal,End Portal,2 -120,0,minecraft:end_portal_frame,End Portal Block,1 -121,0,minecraft:end_stone,End Stone,0 -122,0,minecraft:dragon_egg,Dragon Egg,0 -123,0,minecraft:redstone_lamp,Redstone Lamp,0 -124,0,minecraft:lit_redstone_lamp,Redstone Lamp (active),2 -125,0,minecraft:double_wooden_slab,Wooden Double Slab,0 -125,0,minecraft:double_wooden_slab,Double Oak Wood Slab,0 -125,1,minecraft:double_wooden_slab,Double Spruce Wood Slab,0 -125,2,minecraft:double_wooden_slab,Double Birch Wood Slab,0 -125,3,minecraft:double_wooden_slab,Double Jungle Wood Slab,0 -125,4,minecraft:double_wooden_slab,Double Acacia Wood Slab,0 -125,5,minecraft:double_wooden_slab,Double Dark Oak Wood Slab,0 -126,0,minecraft:wooden_slab,Wooden Slab,0 -126,0,minecraft:wooden_slab,Oak Wood Slab,0 -126,1,minecraft:wooden_slab,Spruce Wood Slab,0 -126,2,minecraft:wooden_slab,Birch Wood Slab,0 -126,3,minecraft:wooden_slab,Jungle Wood Slab,0 -126,4,minecraft:wooden_slab,Acacia Wood Slab,0 -126,5,minecraft:wooden_slab,Dark Oak Wood Slab,0 -126,8,minecraft:wooden_slab,Upper Wooden Slab,0 -126,8,minecraft:wooden_slab,Upper Oak Wood Slab,0 -126,9,minecraft:wooden_slab,Upper Spruce Wood Slab,0 -126,10,minecraft:wooden_slab,Upper Birch Wood Slab,0 -126,11,minecraft:wooden_slab,Upper Jungle Wood Slab,0 -126,12,minecraft:wooden_slab,Upper Acacia Wood Slab,0 -126,13,minecraft:wooden_slab,Upper Dark Oak Wood Slab,0 -127,0,minecraft:cocoa,Cocoa,2 -128,0,minecraft:sandstone_stairs,Sandstone Stairs,2 -129,0,minecraft:emerald_ore,Emerald Ore,0 -130,0,minecraft:ender_chest,Ender Chest,2 -131,0,minecraft:tripwire_hook,Tripwire Hook,2 -132,0,minecraft:tripwire,Tripwire,2 -133,0,minecraft:emerald_block,Block of Emerald,0 -134,0,minecraft:spruce_stairs,Spruce Wood Stairs,2 -135,0,minecraft:birch_stairs,Birch Wood Stairs,2 -136,0,minecraft:jungle_stairs,Jungle Wood Stairs,2 -137,0,minecraft:command_block,Command Block,2 -138,0,minecraft:beacon,Beacon,2 -139,0,minecraft:cobblestone_wall,Cobblestone Wall,0 -139,1,minecraft:cobblestone_wall,Mossy Cobblestone Wall,0 -140,0,minecraft:flower_pot,Flower Pot,2 -141,0,minecraft:carrots,Carrots,2 -142,0,minecraft:potatoes,Potatoes,2 -143,0,minecraft:wooden_button,Wooden Button,2 -144,0,minecraft:skull,Mob Head,2 -145,0,minecraft:anvil,Anvil,2 -146,0,minecraft:trapped_chest,Trapped Chest,2 -147,0,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light),2 -148,0,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy),2 -149,0,minecraft:unpowered_comparator,Redstone Comparator (inactive & active),2 -150,0,,(unused),2 -151,0,minecraft:daylight_detector,Daylight Sensor,2 -152,0,minecraft:redstone_block,Block of Redstone,0 -153,0,minecraft:quartz_ore,Nether Quartz Ore,0 -154,0,minecraft:hopper,Hopper,2 -155,0,minecraft:quartz_block,Block of Quartz,0 -156,0,minecraft:quartz_stairs,Quartz Stairs,2 -157,0,minecraft:activator_rail,Activator Rail,2 -158,0,minecraft:dropper,Dropper,2 -159,0,minecraft:stained_hardened_clay,Stained Clay,0 -159,0,minecraft:stained_hardened_clay,White Hardened Clay,0 -159,1,minecraft:stained_hardened_clay,Orange Hardened Clay,0 -159,2,minecraft:stained_hardened_clay,Magenta Hardened Clay,0 -159,3,minecraft:stained_hardened_clay,Light Blue Hardened Clay,0 -159,4,minecraft:stained_hardened_clay,Yellow Hardened Clay,0 -159,5,minecraft:stained_hardened_clay,Lime Hardened Clay,0 -159,6,minecraft:stained_hardened_clay,Pink Hardened Clay,0 -159,7,minecraft:stained_hardened_clay,Gray Hardened Clay,0 -159,8,minecraft:stained_hardened_clay,Light Gray Hardened Clay,0 -159,9,minecraft:stained_hardened_clay,Cyan Hardened Clay,0 -159,10,minecraft:stained_hardened_clay,Purple Hardened Clay,0 -159,11,minecraft:stained_hardened_clay,Blue Hardened Clay,0 -159,12,minecraft:stained_hardened_clay,Brown Hardened Clay,0 -159,13,minecraft:stained_hardened_clay,Green Hardened Clay,0 -159,14,minecraft:stained_hardened_clay,Red Hardened Clay,0 -159,15,minecraft:stained_hardened_clay,Black Hardened Clay,0 -160,0,minecraft:stained_glass_pane,Stained Glass Pane,0 -160,0,minecraft:stained_glass_pane,White Stained Glass Pane,1 -160,1,minecraft:stained_glass_pane,Orange Stained Glass Pane,2 -160,2,minecraft:stained_glass_pane,Magenta Stained Glass Pane,3 -160,3,minecraft:stained_glass_pane,Light Blue Stained Glass Pane,4 -160,4,minecraft:stained_glass_pane,Yellow Stained Glass Pane,5 -160,5,minecraft:stained_glass_pane,Lime Stained Glass Pane,6 -160,6,minecraft:stained_glass_pane,Pink Stained Glass Pane,7 -160,7,minecraft:stained_glass_pane,Gray Stained Glass Pane,8 -160,8,minecraft:stained_glass_pane,Light Gray Stained Glass Pane,9 -160,9,minecraft:stained_glass_pane,Cyan Stained Glass Pane,10 -160,10,minecraft:stained_glass_pane,Purple Stained Glass Pane,11 -160,11,minecraft:stained_glass_pane,Blue Stained Glass Pane,12 -160,12,minecraft:stained_glass_pane,Brown Stained Glass Pane,13 -160,13,minecraft:stained_glass_pane,Green Stained Glass Pane,14 -160,14,minecraft:stained_glass_pane,Red Stained Glass Pane,15 -160,15,minecraft:stained_glass_pane,Black Stained Glass Pane,16 -161,0,minecraft:leaves2,Acacia Leaves,0 -161,1,minecraft:leaves3,Dark Oak Leaves,0 -162,0,minecraft:log2,Acacia Wood Slab,0 -162,1,minecraft:log2,Dark Oak Wood,0 -163,0,minecraft:acacia_stairs,Acacia Wood Stairs,2 -164,0,minecraft:dark_oak_stairs,Dark Oak Wood Stairs,2 -170,0,minecraft:hay_block,Hay Block,0 -171,0,minecraft:carpet,Carpet,0 -171,0,minecraft:carpet,White Carpet,0 -171,1,minecraft:carpet,Orange Carpet,0 -171,2,minecraft:carpet,Magenta Carpet,0 -171,3,minecraft:carpet,Light Blue Carpet,0 -171,4,minecraft:carpet,Yellow Carpet,0 -171,5,minecraft:carpet,Lime Carpet,0 -171,6,minecraft:carpet,Pink Carpet,0 -171,7,minecraft:carpet,Gray Carpet,0 -171,8,minecraft:carpet,Light Gray Carpet,0 -171,9,minecraft:carpet,Cyan Carpet,0 -171,10,minecraft:carpet,Purple Carpet,0 -171,11,minecraft:carpet,Blue Carpet,0 -171,12,minecraft:carpet,Brown Carpet,0 -171,13,minecraft:carpet,Green Carpet,0 -171,14,minecraft:carpet,Red Carpet,0 -171,15,minecraft:carpet,Black Carpet,0 -172,0,minecraft:hardened_clay,Hardened Clay,0 -172,0,minecraft:hardened_clay,White Hardened Clay,0 -172,1,minecraft:hardened_clay,Orange Hardened Clay,0 -172,2,minecraft:hardened_clay,Magenta Hardened Clay,0 -172,3,minecraft:hardened_clay,Light Blue Hardened Clay,0 -172,4,minecraft:hardened_clay,Yellow Hardened Clay,0 -172,5,minecraft:hardened_clay,Lime Hardened Clay,0 -172,6,minecraft:hardened_clay,Pink Hardened Clay,0 -172,7,minecraft:hardened_clay,Gray Hardened Clay,0 -172,8,minecraft:hardened_clay,Light Gray Hardened Clay,0 -172,9,minecraft:hardened_clay,Cyan Hardened Clay,0 -172,10,minecraft:hardened_clay,Purple Hardened Clay,0 -172,11,minecraft:hardened_clay,Blue Hardened Clay,0 -172,12,minecraft:hardened_clay,Brown Hardened Clay,0 -172,13,minecraft:hardened_clay,Green Hardened Clay,0 -172,14,minecraft:hardened_clay,Red Hardened Clay,0 -172,15,minecraft:hardened_clay,Black Hardened Clay,0 -173,0,minecraft:coal_block,Block of Coal,0 -174,0,minecraft:packed_ice,Packed Ice,0 -175,0,minecraft:double_plant,Large Flowers,0 -175,0,minecraft:double_plant,Sunflower,2 -175,1,minecraft:double_plant,Lilac,2 -175,2,minecraft:double_plant,Double Tallgrass,2 -175,3,minecraft:double_plant,Large Fern,2 -175,4,minecraft:double_plant,Rose Bush,2 -175,5,minecraft:double_plant,Peony,2 +0,0,minecraft:air,Air,2 +1,0,minecraft:stone,Stone,0 +1,1,minecraft:stone,Granite,0 +1,2,minecraft:stone,Polished Granite,0 +1,3,minecraft:stone,Diorite,0 +1,4,minecraft:stone,Polished Diorite,0 +1,5,minecraft:stone,Andesite,0 +1,6,minecraft:stone,Polished Andesite,0 +2,0,minecraft:grass,Grass Block,0 +3,0,minecraft:dirt,Dirt,0 +3,1,minecraft:dirt,Coarse Dirt,0 +3,2,minecraft:dirt,Podzol,0 +4,0,minecraft:cobblestone,Cobblestone,0 +5,0,minecraft:planks,Planks,0 +5,0,minecraft:planks,Oak Planks,0 +5,1,minecraft:planks,Spruce Planks,0 +5,2,minecraft:planks,Birch Planks,0 +5,3,minecraft:planks,Jungle Planks,0 +5,4,minecraft:planks,Acacia Planks,0 +5,5,minecraft:planks,Dark Oak Planks,0 +6,0,minecraft:sapling,Saplings,0 +6,0,minecraft:sapling,Oak Sapling,0 +6,1,minecraft:sapling,Spruce Sapling,0 +6,2,minecraft:sapling,Birch Sapling,0 +6,3,minecraft:sapling,Jungle Sapling,0 +6,4,minecraft:sapling,Acacia Sapling,0 +6,5,minecraft:sapling,Dark Oak Sapling,0 +7,0,minecraft:bedrock,Bedrock,1 +8,0,minecraft:flowing_water,Flowing Water,2 +9,0,minecraft:water,Water,1 +10,0,minecraft:flowing_lava,Flowing Lava,2 +11,0,minecraft:lava,Lava,1 +12,0,minecraft:sand,Sand,0 +12,1,minecraft:sand,Red Sand,0 +13,0,minecraft:gravel,Gravel,0 +14,0,minecraft:gold_ore,Gold Ore,0 +15,0,minecraft:iron_ore,Iron Ore,0 +16,0,minecraft:coal_ore,Coal Ore,0 +17,0,minecraft:log,Wood,0 +17,0,minecraft:log,Oak Wood,0 +17,1,minecraft:log,Spruce Wood,0 +17,2,minecraft:log,Birch Wood,0 +17,3,minecraft:log,Jungle Wood,0 +18,0,minecraft:leaves,Leaves,0 +18,0,minecraft:leaves,Oak Leaves,0 +18,1,minecraft:leaves,Spruce Leaves,0 +18,2,minecraft:leaves,Birch Leaves,0 +18,3,minecraft:leaves,Jungle Leaves,0 +19,0,minecraft:sponge,Sponge,0 +19,1,minecraft:sponge,We Sponge,0 +20,0,minecraft:glass,Glass,0 +21,0,minecraft:lapis_ore,Lapis Lazuli Ore,0 +22,0,minecraft:lapis_block,Lapis Lazuli Block,0 +23,0,minecraft:dispenser,Dispenser,2 +24,0,minecraft:sandstone,Sandstone,0 +24,1,minecraft:sandstone,Chiseled Sandstone,0 +24,2,minecraft:sandstone,Smooth Sandstone,0 +25,0,minecraft:noteblock,Note Block,2 +26,0,minecraft:bed,Bed,2 +27,0,minecraft:golden_rail,Powered Rail,2 +28,0,minecraft:detector_rail,Detector Rail,2 +29,0,minecraft:sticky_piston,Sticky Piston,2 +30,0,minecraft:web,Cobweb,0 +31,0,minecraft:tallgrass,Grass,0 +31,0,minecraft:tallgrass,Shrub,0 +31,1,minecraft:tallgrass,Tall Grass,0 +31,2,minecraft:tallgrass,Fern,0 +32,0,minecraft:deadbush,Dead Bush,0 +33,0,minecraft:piston,Piston,2 +34,0,minecraft:piston_head,Piston Extension,2 +35,0,minecraft:wool,Wool,0 +35,0,minecraft:wool,White Wool,0 +35,1,minecraft:wool,Orange Wool,0 +35,2,minecraft:wool,Magenta Wool,0 +35,3,minecraft:wool,Light Blue Wool,0 +35,4,minecraft:wool,Yellow Wool,0 +35,5,minecraft:wool,Lime Wool,0 +35,6,minecraft:wool,Pink Wool,0 +35,7,minecraft:wool,Gray Wool,0 +35,8,minecraft:wool,Light Gray Wool,0 +35,9,minecraft:wool,Cyan Wool,0 +35,10,minecraft:wool,Purple Wool,0 +35,11,minecraft:wool,Blue Wool,0 +35,12,minecraft:wool,Brown Wool,0 +35,13,minecraft:wool,Green Wool,0 +35,14,minecraft:wool,Red Wool,0 +35,15,minecraft:wool,Black Wool,0 +36,0,minecraft:piston_extension,Block moved by Piston,2 +37,0,minecraft:yellow_flower,Dandelion,0 +38,0,minecraft:red_flower,Poppy,2 +38,1,minecraft:red_flower,Blue Orchid,2 +38,2,minecraft:red_flower,Allium,2 +38,3,minecraft:red_flower,Azure Bluet,2 +38,4,minecraft:red_flower,Red Tulip,2 +38,5,minecraft:red_flower,Orange Tulip,2 +38,6,minecraft:red_flower,White Tulip,2 +38,7,minecraft:red_flower,Pink Tulip,2 +38,8,minecraft:red_flower,Oxeye Daisy,0 +39,0,minecraft:brown_mushroom,Brown Mushroom,2 +40,0,minecraft:red_mushroom,Red Mushroom,2 +41,0,minecraft:gold_block,Block of Gold,0 +42,0,minecraft:iron_block,Block of Iron,0 +43,0,minecraft:double_stone_slab,Double Stone Slab,0 +43,1,minecraft:double_stone_slab,Double Sandstone Slab,0 +43,2,minecraft:double_stone_slab,Double Wooden Slab,0 +43,3,minecraft:double_stone_slab,Double Cobblestone Slab,0 +43,4,minecraft:double_stone_slab,Double Bricks Slab,0 +43,5,minecraft:double_stone_slab,Double Stone Brick Slab,0 +43,6,minecraft:double_stone_slab,Double Nether Brick Slab,0 +43,7,minecraft:double_stone_slab,Double Quartz Slab,0 +43,8,minecraft:double_stone_slab,Smooth Double Stone Slab,0 +43,9,minecraft:double_stone_slab,Smooth Double Sandstone Slab,0 +43,15,minecraft:double_stone_slab,Tile Double Quartz Slab,0 +44,0,minecraft:stone_slab,Stone Slab,0 +44,1,minecraft:stone_slab,Sandstone Slab,0 +44,2,minecraft:stone_slab,Wooden Slab,0 +44,3,minecraft:stone_slab,Cobblestone Slab,0 +44,4,minecraft:stone_slab,Bricks Slab,0 +44,5,minecraft:stone_slab,Stone Brick Slab,0 +44,6,minecraft:stone_slab,Nether Brick Slab,0 +44,7,minecraft:stone_slab,Quartz Slab,0 +44,8,minecraft:stone_slab,Upper Stone Slab,0 +44,9,minecraft:stone_slab,Upper Sandstone Slab,0 +44,10,minecraft:stone_slab,Upper Wooden Slab,0 +44,11,minecraft:stone_slab,Upper Cobblestone Slab,0 +44,12,minecraft:stone_slab,Upper Bricks Slab,0 +44,13,minecraft:stone_slab,Upper Stone Brick Slab,0 +44,14,minecraft:stone_slab,Upper Nether Brick Slab,0 +44,15,minecraft:stone_slab,Upper Quartz Slab,0 +45,0,minecraft:brick_block,Bricks,0 +46,0,minecraft:tnt,TNT,1 +47,0,minecraft:bookshelf,Bookshelf,0 +48,0,minecraft:mossy_cobblestone,Mossy Cobblestone,0 +49,0,minecraft:obsidian,Obsidian,0 +50,5,minecraft:torch,Torch,2 +50,1,minecraft:torch,Torch East,2 +50,2,minecraft:torch,Torch West,2 +50,3,minecraft:torch,Torch South,2 +50,4,minecraft:torch,Torch North,2 +51,0,minecraft:fire,Fire,2 +52,0,minecraft:mob_spawner,Monster Spawner,2 +53,0,minecraft:oak_stairs,Oak Wood Stairs,2 +54,0,minecraft:chest,Chest,2 +55,0,minecraft:redstone_wire,Redstone Wire,2 +56,0,minecraft:diamond_ore,Diamond Ore,0 +57,0,minecraft:diamond_block,Block of Diamond,0 +58,0,minecraft:crafting_table,Crafting Table,0 +59,0,minecraft:wheat,Wheat,2 +60,0,minecraft:farmland,Farmland,2 +60,7,minecraft:farmland,Wet Farmland,2 +61,0,minecraft:furnace,Furnace,1 +62,0,minecraft:lit_furnace,Burning Furnace,2 +63,0,minecraft:standing_sign,Sign Post,2 +63,0,minecraft:standing_sign,Sign Post (S),2 +63,1,minecraft:standing_sign,Sign Post (S-SW),2 +63,2,minecraft:standing_sign,Sign Post (SW),2 +63,3,minecraft:standing_sign,Sign Post (W-SW),2 +63,4,minecraft:standing_sign,Sign Post (W),2 +63,5,minecraft:standing_sign,Sign Post (W-NW),2 +63,6,minecraft:standing_sign,Sign Post (NW),2 +63,7,minecraft:standing_sign,Sign Post (N-NW),2 +63,8,minecraft:standing_sign,Sign Post (N),2 +63,9,minecraft:standing_sign,Sign Post (N-NE),2 +63,10,minecraft:standing_sign,Sign Post (NE),2 +63,11,minecraft:standing_sign,Sign Post (E-NE),2 +63,12,minecraft:standing_sign,Sign Post (E),2 +63,13,minecraft:standing_sign,Sign Post (E-SE),2 +63,14,minecraft:standing_sign,Sign Post (SE),2 +63,15,minecraft:standing_sign,Sign Post (S-SE),2 +64,0,minecraft:wooden_door,Wooden Door,2 +64,0,minecraft:wooden_door,Lower Wooden Door (Closed E),2 +64,1,minecraft:wooden_door,Lower Wooden Door (Closed S),2 +64,2,minecraft:wooden_door,Lower Wooden Door (Closed W),2 +64,3,minecraft:wooden_door,Lower Wooden Door (Closed N),2 +64,4,minecraft:wooden_door,Lower Wooden Door (Open E),2 +64,5,minecraft:wooden_door,Lower Wooden Door (Open S),2 +64,6,minecraft:wooden_door,Lower Wooden Door (Open W),2 +64,7,minecraft:wooden_door,Lower Wooden Door (Open N),2 +64,8,minecraft:wooden_door,Upper Wooden Door (Unpowered Left),2 +64,9,minecraft:wooden_door,Upper Wooden Door (Unpowered Right),2 +64,10,minecraft:wooden_door,Upper Wooden Door (Powered Left),2 +64,11,minecraft:wooden_door,Upper Wooden Door (Powered Right),2 +65,0,minecraft:ladder,Ladders,2 +66,0,minecraft:rail,Rail,2 +67,0,minecraft:stone_stairs,Cobblestone Stairs,2 +68,2,minecraft:wall_sign,Wall Sign,2 +68,2,minecraft:wall_sign,Wall Sign (N),2 +68,3,minecraft:wall_sign,Wall Sign (S),2 +68,4,minecraft:wall_sign,Wall Sign (W),2 +68,5,minecraft:wall_sign,Wall Sign (E),2 +69,0,minecraft:lever,Lever,2 +70,0,minecraft:stone_pressure_plate,Stone Pressure Plate,2 +71,0,minecraft:iron_door,Iron Door,2 +71,0,minecraft:iron_door,Lower Iron Door (Closed E),2 +71,1,minecraft:iron_door,Lower Iron Door (Closed S),2 +71,2,minecraft:iron_door,Lower Iron Door (Closed W),2 +71,3,minecraft:iron_door,Lower Iron Door (Closed N),2 +71,4,minecraft:iron_door,Lower Iron Door (Open E),2 +71,5,minecraft:iron_door,Lower Iron Door (Open S),2 +71,6,minecraft:iron_door,Lower Iron Door (Open W),2 +71,7,minecraft:iron_door,Lower Iron Door (Open N),2 +71,8,minecraft:iron_door,Upper Iron Door (Unpowered Left),2 +71,9,minecraft:iron_door,Upper Iron Door (Unpowered Right),2 +71,10,minecraft:iron_door,Upper Iron Door (Powered Left),2 +71,11,minecraft:iron_door,Upper Iron Door (Powered Right),2 +72,0,minecraft:wooden_pressure_plate,Wooden Pressure Plate,2 +73,0,minecraft:redstone_ore,Redstone Ore,0 +74,0,minecraft:lit_redstone_ore,Glowing Redstone Ore,0 +75,5,minecraft:unlit_redstone_torch,Redstone Torch (inactive),2 +75,1,minecraft:unlit_redstone_torch,Redstone Torch East (inactive),2 +75,2,minecraft:unlit_redstone_torch,Redstone Torch West (inactive),2 +75,3,minecraft:unlit_redstone_torch,Redstone Torch South (inactive),2 +75,4,minecraft:unlit_redstone_torch,Redstone Torch East (inactive),2 +76,5,minecraft:redstone_torch,Redstone Torch (active),2 +76,1,minecraft:unlit_redstone_torch,Redstone Torch East (active),2 +76,2,minecraft:unlit_redstone_torch,Redstone Torch West (active),2 +76,3,minecraft:unlit_redstone_torch,Redstone Torch South (active),2 +76,4,minecraft:unlit_redstone_torch,Redstone Torch East (active),2 +77,0,minecraft:stone_button,Stone Button,2 +78,0,minecraft:snow_layer,Snow,2 +79,0,minecraft:ice,Ice,1 +80,0,minecraft:snow,Snow,0 +81,0,minecraft:cactus,Cactus,2 +82,0,minecraft:clay,Clay,0 +83,0,minecraft:reeds,Sugar Cane,1 +84,0,minecraft:jukebox,Jukebox,2 +85,0,minecraft:fence,Fence,0 +86,0,minecraft:pumpkin,Pumpkin,0 +87,0,minecraft:netherrack,Netherrack,0 +88,0,minecraft:soul_sand,Soul Sand,0 +89,0,minecraft:glowstone,Glowstone,0 +90,0,minecraft:portal,Nether Portal,2 +91,0,minecraft:lit_pumpkin,Jack 'o' Lantern,0 +92,0,minecraft:cake,Cake Block,0 +93,0,minecraft:unpowered_repeater,Redstone Repeater (inactive),2 +94,0,minecraft:powered_repeater,Redstone Repeater (active),2 +95,0,minecraft:stained_glass,Stained Glass,0 +95,0,minecraft:stained_glass,White Stained Glass,0 +95,1,minecraft:stained_glass,Orange Stained Glass,0 +95,2,minecraft:stained_glass,Magenta Stained Glass,0 +95,3,minecraft:stained_glass,Light Blue Stained Glass,0 +95,4,minecraft:stained_glass,Yellow Stained Glass,0 +95,5,minecraft:stained_glass,Lime Stained Glass,0 +95,6,minecraft:stained_glass,Pink Stained Glass,0 +95,7,minecraft:stained_glass,Gray Stained Glass,0 +95,8,minecraft:stained_glass,Light Gray Stained Glass,0 +95,9,minecraft:stained_glass,Cyan Stained Glass,0 +95,10,minecraft:stained_glass,Purple Stained Glass,0 +95,11,minecraft:stained_glass,Blue Stained Glass,0 +95,12,minecraft:stained_glass,Brown Stained Glass,0 +95,13,minecraft:stained_glass,Green Stained Glass,0 +95,14,minecraft:stained_glass,Red Stained Glass,0 +95,15,minecraft:stained_glass,Black Stained Glass,0 +96,0,minecraft:trapdoor,Trapdoor,2 +97,0,minecraft:monster_egg,Monster Egg,1 +97,0,minecraft:monster_egg,Stone Monster Egg,1 +97,1,minecraft:monster_egg,Cobblestone Monster Egg,1 +97,2,minecraft:monster_egg,Stone Brick Monster Egg,1 +97,3,minecraft:monster_egg,Mossy Stone Brick Monster Egg,1 +97,4,minecraft:monster_egg,Cracked Stone Brick Monster Egg,1 +97,5,minecraft:monster_egg,Chiseled Stone Brick Monster Egg,1 +98,0,minecraft:stonebrick,Stone Bricks,0 +98,1,minecraft:stonebrick,Mossy Stone Brick,0 +98,2,minecraft:stonebrick,Cracked Stone Brick,0 +98,3,minecraft:stonebrick,Chiseled Stone Brick,0 +99,14,minecraft:brown_mushroom_block,Huge Brown Mushroom,0 +100,14,minecraft:red_mushroom_block,Huge Red Mushroom,0 +101,0,minecraft:iron_bars,Iron Bars,0 +102,0,minecraft:glass_pane,Glass Pane,0 +103,0,minecraft:melon_block,Melon,0 +104,0,minecraft:pumpkin_stem,Pumpkin Stem,2 +105,0,minecraft:melon_stem,Melon Stem,2 +106,0,minecraft:vine,Vines,2 +107,0,minecraft:fence_gate,Fence Gate,2 +108,0,minecraft:brick_stairs,Brick Stairs,2 +109,0,minecraft:stone_brick_stairs,Stone Brick Stairs,2 +110,0,minecraft:mycelium,Mycelium,0 +111,0,minecraft:waterlily,Lily Pad,2 +112,0,minecraft:nether_brick,Nether Brick,0 +113,0,minecraft:nether_brick_fence,Nether Brick Fence,0 +114,0,minecraft:nether_brick_stairs,Nether Brick Stairs,2 +115,0,minecraft:nether_wart,Nether Wart,2 +116,0,minecraft:enchanting_table,Enchantment Table,2 +117,0,minecraft:brewing_stand,Brewing Stand,2 +118,0,minecraft:cauldron,Cauldron,2 +119,0,minecraft:end_portal,End Portal,2 +120,0,minecraft:end_portal_frame,End Portal Block,1 +121,0,minecraft:end_stone,End Stone,0 +122,0,minecraft:dragon_egg,Dragon Egg,0 +123,0,minecraft:redstone_lamp,Redstone Lamp,0 +124,0,minecraft:lit_redstone_lamp,Redstone Lamp (active),2 +125,0,minecraft:double_wooden_slab,Wooden Double Slab,0 +125,0,minecraft:double_wooden_slab,Double Oak Wood Slab,0 +125,1,minecraft:double_wooden_slab,Double Spruce Wood Slab,0 +125,2,minecraft:double_wooden_slab,Double Birch Wood Slab,0 +125,3,minecraft:double_wooden_slab,Double Jungle Wood Slab,0 +125,4,minecraft:double_wooden_slab,Double Acacia Wood Slab,0 +125,5,minecraft:double_wooden_slab,Double Dark Oak Wood Slab,0 +126,0,minecraft:wooden_slab,Wooden Slab,0 +126,0,minecraft:wooden_slab,Oak Wood Slab,0 +126,1,minecraft:wooden_slab,Spruce Wood Slab,0 +126,2,minecraft:wooden_slab,Birch Wood Slab,0 +126,3,minecraft:wooden_slab,Jungle Wood Slab,0 +126,4,minecraft:wooden_slab,Acacia Wood Slab,0 +126,5,minecraft:wooden_slab,Dark Oak Wood Slab,0 +126,8,minecraft:wooden_slab,Upper Wooden Slab,0 +126,8,minecraft:wooden_slab,Upper Oak Wood Slab,0 +126,9,minecraft:wooden_slab,Upper Spruce Wood Slab,0 +126,10,minecraft:wooden_slab,Upper Birch Wood Slab,0 +126,11,minecraft:wooden_slab,Upper Jungle Wood Slab,0 +126,12,minecraft:wooden_slab,Upper Acacia Wood Slab,0 +126,13,minecraft:wooden_slab,Upper Dark Oak Wood Slab,0 +127,0,minecraft:cocoa,Cocoa,2 +128,0,minecraft:sandstone_stairs,Sandstone Stairs,2 +129,0,minecraft:emerald_ore,Emerald Ore,0 +130,0,minecraft:ender_chest,Ender Chest,2 +131,0,minecraft:tripwire_hook,Tripwire Hook,2 +132,0,minecraft:tripwire,Tripwire,2 +133,0,minecraft:emerald_block,Block of Emerald,0 +134,0,minecraft:spruce_stairs,Spruce Wood Stairs,2 +135,0,minecraft:birch_stairs,Birch Wood Stairs,2 +136,0,minecraft:jungle_stairs,Jungle Wood Stairs,2 +137,0,minecraft:command_block,Command Block,2 +138,0,minecraft:beacon,Beacon,2 +139,0,minecraft:cobblestone_wall,Cobblestone Wall,0 +139,1,minecraft:cobblestone_wall,Mossy Cobblestone Wall,0 +140,0,minecraft:flower_pot,Flower Pot,2 +141,0,minecraft:carrots,Carrots,2 +142,0,minecraft:potatoes,Potatoes,2 +143,0,minecraft:wooden_button,Wooden Button,2 +144,0,minecraft:skull,Mob Head,2 +145,0,minecraft:anvil,Anvil,2 +146,0,minecraft:trapped_chest,Trapped Chest,2 +147,0,minecraft:light_weighted_pressure_plate,Weighted Pressure Plate (Light),2 +148,0,minecraft:heavy_weighted_pressure_plate,Weighted Pressure Plate (Heavy),2 +149,0,minecraft:unpowered_comparator,Redstone Comparator (inactive & active),2 +150,0,,(unused),2 +151,0,minecraft:daylight_detector,Daylight Sensor,2 +152,0,minecraft:redstone_block,Block of Redstone,0 +153,0,minecraft:quartz_ore,Nether Quartz Ore,0 +154,0,minecraft:hopper,Hopper,2 +155,0,minecraft:quartz_block,Block of Quartz,0 +156,0,minecraft:quartz_stairs,Quartz Stairs,2 +157,0,minecraft:activator_rail,Activator Rail,2 +158,0,minecraft:dropper,Dropper,2 +159,0,minecraft:stained_hardened_clay,Stained Clay,0 +159,0,minecraft:stained_hardened_clay,White Hardened Clay,0 +159,1,minecraft:stained_hardened_clay,Orange Hardened Clay,0 +159,2,minecraft:stained_hardened_clay,Magenta Hardened Clay,0 +159,3,minecraft:stained_hardened_clay,Light Blue Hardened Clay,0 +159,4,minecraft:stained_hardened_clay,Yellow Hardened Clay,0 +159,5,minecraft:stained_hardened_clay,Lime Hardened Clay,0 +159,6,minecraft:stained_hardened_clay,Pink Hardened Clay,0 +159,7,minecraft:stained_hardened_clay,Gray Hardened Clay,0 +159,8,minecraft:stained_hardened_clay,Light Gray Hardened Clay,0 +159,9,minecraft:stained_hardened_clay,Cyan Hardened Clay,0 +159,10,minecraft:stained_hardened_clay,Purple Hardened Clay,0 +159,11,minecraft:stained_hardened_clay,Blue Hardened Clay,0 +159,12,minecraft:stained_hardened_clay,Brown Hardened Clay,0 +159,13,minecraft:stained_hardened_clay,Green Hardened Clay,0 +159,14,minecraft:stained_hardened_clay,Red Hardened Clay,0 +159,15,minecraft:stained_hardened_clay,Black Hardened Clay,0 +160,0,minecraft:stained_glass_pane,Stained Glass Pane,0 +160,0,minecraft:stained_glass_pane,White Stained Glass Pane,0 +160,1,minecraft:stained_glass_pane,Orange Stained Glass Pane,0 +160,2,minecraft:stained_glass_pane,Magenta Stained Glass Pane,0 +160,3,minecraft:stained_glass_pane,Light Blue Stained Glass Pane,0 +160,4,minecraft:stained_glass_pane,Yellow Stained Glass Pane,0 +160,5,minecraft:stained_glass_pane,Lime Stained Glass Pane,0 +160,6,minecraft:stained_glass_pane,Pink Stained Glass Pane,0 +160,7,minecraft:stained_glass_pane,Gray Stained Glass Pane,0 +160,8,minecraft:stained_glass_pane,Light Gray Stained Glass Pane,0 +160,9,minecraft:stained_glass_pane,Cyan Stained Glass Pane,0 +160,10,minecraft:stained_glass_pane,Purple Stained Glass Pane,0 +160,11,minecraft:stained_glass_pane,Blue Stained Glass Pane,0 +160,12,minecraft:stained_glass_pane,Brown Stained Glass Pane,0 +160,13,minecraft:stained_glass_pane,Green Stained Glass Pane,0 +160,14,minecraft:stained_glass_pane,Red Stained Glass Pane,0 +160,15,minecraft:stained_glass_pane,Black Stained Glass Pane,0 +161,0,minecraft:leaves2,Acacia Leaves,0 +161,1,minecraft:leaves3,Dark Oak Leaves,0 +162,0,minecraft:log2,Acacia Wood Slab,0 +162,1,minecraft:log2,Dark Oak Wood,0 +163,0,minecraft:acacia_stairs,Acacia Wood Stairs,2 +164,0,minecraft:dark_oak_stairs,Dark Oak Wood Stairs,2 +170,0,minecraft:hay_block,Hay Block,0 +171,0,minecraft:carpet,Carpet,0 +171,0,minecraft:carpet,White Carpet,0 +171,1,minecraft:carpet,Orange Carpet,0 +171,2,minecraft:carpet,Magenta Carpet,0 +171,3,minecraft:carpet,Light Blue Carpet,0 +171,4,minecraft:carpet,Yellow Carpet,0 +171,5,minecraft:carpet,Lime Carpet,0 +171,6,minecraft:carpet,Pink Carpet,0 +171,7,minecraft:carpet,Gray Carpet,0 +171,8,minecraft:carpet,Light Gray Carpet,0 +171,9,minecraft:carpet,Cyan Carpet,0 +171,10,minecraft:carpet,Purple Carpet,0 +171,11,minecraft:carpet,Blue Carpet,0 +171,12,minecraft:carpet,Brown Carpet,0 +171,13,minecraft:carpet,Green Carpet,0 +171,14,minecraft:carpet,Red Carpet,0 +171,15,minecraft:carpet,Black Carpet,0 +172,0,minecraft:hardened_clay,Hardened Clay,0 +172,0,minecraft:hardened_clay,White Hardened Clay,0 +172,1,minecraft:hardened_clay,Orange Hardened Clay,0 +172,2,minecraft:hardened_clay,Magenta Hardened Clay,0 +172,3,minecraft:hardened_clay,Light Blue Hardened Clay,0 +172,4,minecraft:hardened_clay,Yellow Hardened Clay,0 +172,5,minecraft:hardened_clay,Lime Hardened Clay,0 +172,6,minecraft:hardened_clay,Pink Hardened Clay,0 +172,7,minecraft:hardened_clay,Gray Hardened Clay,0 +172,8,minecraft:hardened_clay,Light Gray Hardened Clay,0 +172,9,minecraft:hardened_clay,Cyan Hardened Clay,0 +172,10,minecraft:hardened_clay,Purple Hardened Clay,0 +172,11,minecraft:hardened_clay,Blue Hardened Clay,0 +172,12,minecraft:hardened_clay,Brown Hardened Clay,0 +172,13,minecraft:hardened_clay,Green Hardened Clay,0 +172,14,minecraft:hardened_clay,Red Hardened Clay,0 +172,15,minecraft:hardened_clay,Black Hardened Clay,0 +173,0,minecraft:coal_block,Block of Coal,0 +174,0,minecraft:packed_ice,Packed Ice,0 +175,0,minecraft:double_plant,Large Flowers,0 +175,0,minecraft:double_plant,Sunflower,2 +175,1,minecraft:double_plant,Lilac,2 +175,2,minecraft:double_plant,Double Tallgrass,2 +175,3,minecraft:double_plant,Large Fern,2 +175,4,minecraft:double_plant,Rose Bush,2 +175,5,minecraft:double_plant,Peony,2