From 80c094b5d69ddbd4fb3f1844ea745ff1e0f3ab7c Mon Sep 17 00:00:00 2001 From: hrmorley34 Date: Sun, 4 Jul 2021 22:31:53 +0100 Subject: [PATCH] Squashed commit of textures-1.17 Includes up to 393b4ac07cc88d8e7989bd825ec250ff49ce5aee - Initial texture updates - ~~(remove before symlink)~~ - ~~(symlink textures folder)~~ - Initial updates stuff - ~~(un-symlink things)~~ - Some more fixes - fix lantern+pickle - ~~(shuddup)~~ - ~~(Merge bennydiamond/cave_part_1)~~ - Fix itemframe by renaming RenderGlowItemFrame - Fix buttons and fence gates - Separate out pressure plate render - Overload Render... methods for either argument order - Fix cobblestone_wall types - Woods, fences, and walls - More technically correct fence gates - (Fix item frame for button) - Button improvements - Fix slabs and purpur pillars - Add hay/bone rotation - Move all pillar-type blocks into one method - WET SPONGE - Fix rails / revamp RenderRail (and fix sponges) - Fix leaves and cake slices - Various fixes - Move "rotation" to method + anvil fixes - Remove all LegacyGetOldDataValue references, coral, & more - Merge #81 - Two forgotten pillars - Stone brick, bed, and stair fixes - One bed fix and rotation catch-all - Quartz fixes - Add dead chorus flowers - Centre lightning rod rod and correct rotation - Fix end rods --- .../textures/blocks/amethyst_block.png | Bin 0 -> 284 bytes .../textures/blocks/amethyst_cluster.png | Bin 0 -> 249 bytes .../textures/blocks/azalea_leaves.png | Bin 0 -> 265 bytes .../textures/blocks/azalea_leaves_flowers.png | Bin 0 -> 297 bytes .../blocks/azalea_leaves_flowers_opaque.png | Bin 0 -> 311 bytes .../textures/blocks/azalea_leaves_opaque.png | Bin 0 -> 277 bytes .../textures/blocks/azalea_plant.png | Bin 0 -> 287 bytes .../textures/blocks/azalea_side.png | Bin 0 -> 235 bytes .../textures/blocks/azalea_top.png | Bin 0 -> 251 bytes .../textures/blocks/big_dripleaf_side1.png | Bin 0 -> 84 bytes .../textures/blocks/big_dripleaf_side2.png | Bin 0 -> 133 bytes .../textures/blocks/big_dripleaf_stem.png | Bin 0 -> 195 bytes .../textures/blocks/big_dripleaf_top.png | Bin 0 -> 245 bytes .../textures/blocks/blackstone.png | Bin 484 -> 290 bytes .../textures/blocks/budding_amethyst.png | Bin 0 -> 325 bytes .../textures/blocks/calcite.png | Bin 0 -> 257 bytes .../textures/blocks/cave_vines_body.png | Bin 0 -> 540 bytes .../blocks/cave_vines_body_berries.png | Bin 0 -> 607 bytes .../textures/blocks/cave_vines_head.png | Bin 0 -> 563 bytes .../blocks/cave_vines_head_berries.png | Bin 0 -> 594 bytes .../textures/blocks/coal_ore.png | Bin 289 -> 301 bytes .../textures/blocks/copper_block.png | Bin 0 -> 268 bytes .../textures/blocks/copper_ore.png | Bin 0 -> 321 bytes .../textures/blocks/cut_copper.png | Bin 0 -> 269 bytes .../blocks/deepslate/chiseled_deepslate.png | Bin 0 -> 223 bytes .../blocks/deepslate/cobbled_deepslate.png | Bin 0 -> 273 bytes .../deepslate/cracked_deepslate_bricks.png | Bin 0 -> 277 bytes .../deepslate/cracked_deepslate_tiles.png | Bin 0 -> 251 bytes .../textures/blocks/deepslate/deepslate.png | Bin 0 -> 240 bytes .../blocks/deepslate/deepslate_bricks.png | Bin 0 -> 245 bytes .../blocks/deepslate/deepslate_coal_ore.png | Bin 0 -> 289 bytes .../blocks/deepslate/deepslate_copper_ore.png | Bin 0 -> 319 bytes .../deepslate/deepslate_diamond_ore.png | Bin 0 -> 329 bytes .../deepslate/deepslate_emerald_ore.png | Bin 0 -> 313 bytes .../blocks/deepslate/deepslate_gold_ore.png | Bin 0 -> 298 bytes .../blocks/deepslate/deepslate_iron_ore.png | Bin 0 -> 307 bytes .../blocks/deepslate/deepslate_lapis_ore.png | Bin 0 -> 332 bytes .../deepslate/deepslate_redstone_ore.png | Bin 0 -> 327 bytes .../blocks/deepslate/deepslate_tiles.png | Bin 0 -> 233 bytes .../blocks/deepslate/deepslate_top.png | Bin 0 -> 254 bytes .../blocks/deepslate/polished_deepslate.png | Bin 0 -> 250 bytes .../textures/blocks/diamond_ore.png | Bin 303 -> 301 bytes .../textures/blocks/dirt_with_roots.png | Bin 0 -> 307 bytes .../textures/blocks/dripstone_block.png | Bin 0 -> 258 bytes .../textures/blocks/emerald_ore.png | Bin 292 -> 310 bytes .../textures/blocks/exposed_copper.png | Bin 0 -> 281 bytes .../textures/blocks/exposed_cut_copper.png | Bin 0 -> 296 bytes .../textures/blocks/flowering_azalea_side.png | Bin 0 -> 268 bytes .../textures/blocks/flowering_azalea_top.png | Bin 0 -> 286 bytes .../textures/blocks/gilded_blackstone.png | Bin 635 -> 320 bytes .../textures/blocks/glow_item_frame.png | Bin 0 -> 299 bytes .../textures/blocks/glow_lichen.png | Bin 0 -> 241 bytes .../textures/blocks/gold_ore.png | Bin 300 -> 305 bytes .../textures/blocks/grass_block_snow.png | Bin 0 -> 307 bytes .../textures/blocks/hanging_roots.png | Bin 0 -> 213 bytes .../textures/blocks/iron_ore.png | Bin 308 -> 292 bytes .../textures/blocks/lapis_ore.png | Bin 340 -> 339 bytes .../textures/blocks/large_amethyst_bud.png | Bin 0 -> 204 bytes .../textures/blocks/lightning_rod.png | Bin 0 -> 146 bytes .../textures/blocks/medium_amethyst_bud.png | Bin 0 -> 146 bytes .../textures/blocks/moss_block.png | Bin 0 -> 268 bytes .../textures/blocks/oxidized_copper.png | Bin 0 -> 281 bytes .../textures/blocks/oxidized_cut_copper.png | Bin 0 -> 290 bytes .../blocks/pointed_dripstone_down_base.png | Bin 0 -> 222 bytes .../blocks/pointed_dripstone_down_frustum.png | Bin 0 -> 214 bytes .../blocks/pointed_dripstone_down_merge.png | Bin 0 -> 175 bytes .../blocks/pointed_dripstone_down_middle.png | Bin 0 -> 220 bytes .../blocks/pointed_dripstone_down_tip.png | Bin 0 -> 150 bytes .../blocks/pointed_dripstone_up_base.png | Bin 0 -> 226 bytes .../blocks/pointed_dripstone_up_frustum.png | Bin 0 -> 217 bytes .../blocks/pointed_dripstone_up_merge.png | Bin 0 -> 179 bytes .../blocks/pointed_dripstone_up_middle.png | Bin 0 -> 210 bytes .../blocks/pointed_dripstone_up_tip.png | Bin 0 -> 149 bytes .../textures/blocks/powder_snow.png | Bin 0 -> 205 bytes .../textures/blocks/raw_copper_block.png | Bin 0 -> 797 bytes .../textures/blocks/raw_gold_block.png | Bin 0 -> 570 bytes .../textures/blocks/raw_iron_block.png | Bin 0 -> 558 bytes .../textures/blocks/redstone_ore.png | Bin 304 -> 305 bytes .../textures/blocks/small_amethyst_bud.png | Bin 0 -> 125 bytes .../textures/blocks/small_dripleaf_side.png | Bin 0 -> 81 bytes .../blocks/small_dripleaf_stem_bottom.png | Bin 0 -> 159 bytes .../blocks/small_dripleaf_stem_top.png | Bin 0 -> 140 bytes .../textures/blocks/small_dripleaf_top.png | Bin 0 -> 146 bytes .../textures/blocks/smoker_top.png | Bin 514 -> 276 bytes .../textures/blocks/smooth_basalt.png | Bin 0 -> 256 bytes .../textures/blocks/spore_blossom.png | Bin 0 -> 234 bytes .../textures/blocks/spore_blossom_base.png | Bin 0 -> 232 bytes .../textures/blocks/tinted_glass.png | Bin 0 -> 190 bytes MapLoader.NUnitTests/textures/blocks/tuff.png | Bin 0 -> 253 bytes .../textures/blocks/weathered_copper.png | Bin 0 -> 281 bytes .../textures/blocks/weathered_cut_copper.png | Bin 0 -> 284 bytes .../textures/terrain_texture.json | 258 +++- Maploader/Renderer/Texture/TextureFinder.cs | 1222 +++++++++++------ Maploader/World/World.cs | 18 +- PapyrusCs/PapyrusCs.csproj | 349 ++++- textures/blocks/amethyst_block.png | Bin 0 -> 284 bytes textures/blocks/amethyst_cluster.png | Bin 0 -> 249 bytes textures/blocks/azalea_leaves.png | Bin 0 -> 265 bytes textures/blocks/azalea_leaves_flowers.png | Bin 0 -> 297 bytes .../blocks/azalea_leaves_flowers_opaque.png | Bin 0 -> 311 bytes textures/blocks/azalea_leaves_opaque.png | Bin 0 -> 277 bytes textures/blocks/azalea_plant.png | Bin 0 -> 287 bytes textures/blocks/azalea_side.png | Bin 0 -> 235 bytes textures/blocks/azalea_top.png | Bin 0 -> 251 bytes textures/blocks/big_dripleaf_side1.png | Bin 0 -> 84 bytes textures/blocks/big_dripleaf_side2.png | Bin 0 -> 133 bytes textures/blocks/big_dripleaf_stem.png | Bin 0 -> 195 bytes textures/blocks/big_dripleaf_top.png | Bin 0 -> 245 bytes textures/blocks/blackstone.png | Bin 484 -> 290 bytes textures/blocks/budding_amethyst.png | Bin 0 -> 325 bytes textures/blocks/calcite.png | Bin 0 -> 257 bytes textures/blocks/cave_vines_body.png | Bin 0 -> 540 bytes textures/blocks/cave_vines_body_berries.png | Bin 0 -> 607 bytes textures/blocks/cave_vines_head.png | Bin 0 -> 563 bytes textures/blocks/cave_vines_head_berries.png | Bin 0 -> 594 bytes textures/blocks/coal_ore.png | Bin 289 -> 301 bytes textures/blocks/copper_block.png | Bin 0 -> 268 bytes textures/blocks/copper_ore.png | Bin 0 -> 321 bytes textures/blocks/cut_copper.png | Bin 0 -> 269 bytes .../blocks/deepslate/chiseled_deepslate.png | Bin 0 -> 223 bytes .../blocks/deepslate/cobbled_deepslate.png | Bin 0 -> 273 bytes .../deepslate/cracked_deepslate_bricks.png | Bin 0 -> 277 bytes .../deepslate/cracked_deepslate_tiles.png | Bin 0 -> 251 bytes textures/blocks/deepslate/deepslate.png | Bin 0 -> 240 bytes .../blocks/deepslate/deepslate_bricks.png | Bin 0 -> 245 bytes .../blocks/deepslate/deepslate_coal_ore.png | Bin 0 -> 289 bytes .../blocks/deepslate/deepslate_copper_ore.png | Bin 0 -> 319 bytes .../deepslate/deepslate_diamond_ore.png | Bin 0 -> 329 bytes .../deepslate/deepslate_emerald_ore.png | Bin 0 -> 313 bytes .../blocks/deepslate/deepslate_gold_ore.png | Bin 0 -> 298 bytes .../blocks/deepslate/deepslate_iron_ore.png | Bin 0 -> 307 bytes .../blocks/deepslate/deepslate_lapis_ore.png | Bin 0 -> 332 bytes .../deepslate/deepslate_redstone_ore.png | Bin 0 -> 327 bytes textures/blocks/deepslate/deepslate_tiles.png | Bin 0 -> 233 bytes textures/blocks/deepslate/deepslate_top.png | Bin 0 -> 254 bytes .../blocks/deepslate/polished_deepslate.png | Bin 0 -> 250 bytes textures/blocks/diamond_ore.png | Bin 303 -> 301 bytes textures/blocks/dirt_with_roots.png | Bin 0 -> 307 bytes textures/blocks/dripstone_block.png | Bin 0 -> 258 bytes textures/blocks/emerald_ore.png | Bin 292 -> 310 bytes textures/blocks/exposed_copper.png | Bin 0 -> 281 bytes textures/blocks/exposed_cut_copper.png | Bin 0 -> 296 bytes textures/blocks/flowering_azalea_side.png | Bin 0 -> 268 bytes textures/blocks/flowering_azalea_top.png | Bin 0 -> 286 bytes textures/blocks/gilded_blackstone.png | Bin 635 -> 320 bytes textures/blocks/glow_item_frame.png | Bin 0 -> 299 bytes textures/blocks/glow_lichen.png | Bin 0 -> 241 bytes textures/blocks/gold_ore.png | Bin 300 -> 305 bytes textures/blocks/grass_block_snow.png | Bin 0 -> 307 bytes textures/blocks/hanging_roots.png | Bin 0 -> 213 bytes textures/blocks/iron_ore.png | Bin 308 -> 292 bytes textures/blocks/lapis_ore.png | Bin 340 -> 339 bytes textures/blocks/large_amethyst_bud.png | Bin 0 -> 204 bytes textures/blocks/lightning_rod.png | Bin 0 -> 146 bytes textures/blocks/medium_amethyst_bud.png | Bin 0 -> 146 bytes textures/blocks/moss_block.png | Bin 0 -> 268 bytes textures/blocks/oxidized_copper.png | Bin 0 -> 281 bytes textures/blocks/oxidized_cut_copper.png | Bin 0 -> 290 bytes .../blocks/pointed_dripstone_down_base.png | Bin 0 -> 222 bytes .../blocks/pointed_dripstone_down_frustum.png | Bin 0 -> 214 bytes .../blocks/pointed_dripstone_down_merge.png | Bin 0 -> 175 bytes .../blocks/pointed_dripstone_down_middle.png | Bin 0 -> 220 bytes .../blocks/pointed_dripstone_down_tip.png | Bin 0 -> 150 bytes textures/blocks/pointed_dripstone_up_base.png | Bin 0 -> 226 bytes .../blocks/pointed_dripstone_up_frustum.png | Bin 0 -> 217 bytes .../blocks/pointed_dripstone_up_merge.png | Bin 0 -> 179 bytes .../blocks/pointed_dripstone_up_middle.png | Bin 0 -> 210 bytes textures/blocks/pointed_dripstone_up_tip.png | Bin 0 -> 149 bytes textures/blocks/powder_snow.png | Bin 0 -> 205 bytes textures/blocks/raw_copper_block.png | Bin 0 -> 797 bytes textures/blocks/raw_gold_block.png | Bin 0 -> 570 bytes textures/blocks/raw_iron_block.png | Bin 0 -> 558 bytes textures/blocks/redstone_ore.png | Bin 304 -> 305 bytes textures/blocks/small_amethyst_bud.png | Bin 0 -> 125 bytes textures/blocks/small_dripleaf_side.png | Bin 0 -> 81 bytes .../blocks/small_dripleaf_stem_bottom.png | Bin 0 -> 159 bytes textures/blocks/small_dripleaf_stem_top.png | Bin 0 -> 140 bytes textures/blocks/small_dripleaf_top.png | Bin 0 -> 146 bytes textures/blocks/smoker_top.png | Bin 514 -> 276 bytes textures/blocks/smooth_basalt.png | Bin 0 -> 256 bytes textures/blocks/spore_blossom.png | Bin 0 -> 234 bytes textures/blocks/spore_blossom_base.png | Bin 0 -> 232 bytes textures/blocks/tinted_glass.png | Bin 0 -> 190 bytes textures/blocks/tuff.png | Bin 0 -> 253 bytes textures/blocks/weathered_copper.png | Bin 0 -> 281 bytes textures/blocks/weathered_cut_copper.png | Bin 0 -> 284 bytes textures/terrain_texture.json | 258 +++- 187 files changed, 1626 insertions(+), 479 deletions(-) create mode 100644 MapLoader.NUnitTests/textures/blocks/amethyst_block.png create mode 100644 MapLoader.NUnitTests/textures/blocks/amethyst_cluster.png create mode 100644 MapLoader.NUnitTests/textures/blocks/azalea_leaves.png create mode 100644 MapLoader.NUnitTests/textures/blocks/azalea_leaves_flowers.png create mode 100644 MapLoader.NUnitTests/textures/blocks/azalea_leaves_flowers_opaque.png create mode 100644 MapLoader.NUnitTests/textures/blocks/azalea_leaves_opaque.png create mode 100644 MapLoader.NUnitTests/textures/blocks/azalea_plant.png create mode 100644 MapLoader.NUnitTests/textures/blocks/azalea_side.png create mode 100644 MapLoader.NUnitTests/textures/blocks/azalea_top.png create mode 100644 MapLoader.NUnitTests/textures/blocks/big_dripleaf_side1.png create mode 100644 MapLoader.NUnitTests/textures/blocks/big_dripleaf_side2.png create mode 100644 MapLoader.NUnitTests/textures/blocks/big_dripleaf_stem.png create mode 100644 MapLoader.NUnitTests/textures/blocks/big_dripleaf_top.png create mode 100644 MapLoader.NUnitTests/textures/blocks/budding_amethyst.png create mode 100644 MapLoader.NUnitTests/textures/blocks/calcite.png create mode 100644 MapLoader.NUnitTests/textures/blocks/cave_vines_body.png create mode 100644 MapLoader.NUnitTests/textures/blocks/cave_vines_body_berries.png create mode 100644 MapLoader.NUnitTests/textures/blocks/cave_vines_head.png create mode 100644 MapLoader.NUnitTests/textures/blocks/cave_vines_head_berries.png create mode 100644 MapLoader.NUnitTests/textures/blocks/copper_block.png create mode 100644 MapLoader.NUnitTests/textures/blocks/copper_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/cut_copper.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/chiseled_deepslate.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/cobbled_deepslate.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/cracked_deepslate_bricks.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/cracked_deepslate_tiles.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_bricks.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_coal_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_copper_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_diamond_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_emerald_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_gold_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_iron_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_lapis_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_redstone_ore.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_tiles.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_top.png create mode 100644 MapLoader.NUnitTests/textures/blocks/deepslate/polished_deepslate.png create mode 100644 MapLoader.NUnitTests/textures/blocks/dirt_with_roots.png create mode 100644 MapLoader.NUnitTests/textures/blocks/dripstone_block.png create mode 100644 MapLoader.NUnitTests/textures/blocks/exposed_copper.png create mode 100644 MapLoader.NUnitTests/textures/blocks/exposed_cut_copper.png create mode 100644 MapLoader.NUnitTests/textures/blocks/flowering_azalea_side.png create mode 100644 MapLoader.NUnitTests/textures/blocks/flowering_azalea_top.png create mode 100644 MapLoader.NUnitTests/textures/blocks/glow_item_frame.png create mode 100644 MapLoader.NUnitTests/textures/blocks/glow_lichen.png create mode 100644 MapLoader.NUnitTests/textures/blocks/grass_block_snow.png create mode 100644 MapLoader.NUnitTests/textures/blocks/hanging_roots.png create mode 100644 MapLoader.NUnitTests/textures/blocks/large_amethyst_bud.png create mode 100644 MapLoader.NUnitTests/textures/blocks/lightning_rod.png create mode 100644 MapLoader.NUnitTests/textures/blocks/medium_amethyst_bud.png create mode 100644 MapLoader.NUnitTests/textures/blocks/moss_block.png create mode 100644 MapLoader.NUnitTests/textures/blocks/oxidized_copper.png create mode 100644 MapLoader.NUnitTests/textures/blocks/oxidized_cut_copper.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_base.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_frustum.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_merge.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_middle.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_tip.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_base.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_frustum.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_merge.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_middle.png create mode 100644 MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_tip.png create mode 100644 MapLoader.NUnitTests/textures/blocks/powder_snow.png create mode 100644 MapLoader.NUnitTests/textures/blocks/raw_copper_block.png create mode 100644 MapLoader.NUnitTests/textures/blocks/raw_gold_block.png create mode 100644 MapLoader.NUnitTests/textures/blocks/raw_iron_block.png create mode 100644 MapLoader.NUnitTests/textures/blocks/small_amethyst_bud.png create mode 100644 MapLoader.NUnitTests/textures/blocks/small_dripleaf_side.png create mode 100644 MapLoader.NUnitTests/textures/blocks/small_dripleaf_stem_bottom.png create mode 100644 MapLoader.NUnitTests/textures/blocks/small_dripleaf_stem_top.png create mode 100644 MapLoader.NUnitTests/textures/blocks/small_dripleaf_top.png create mode 100644 MapLoader.NUnitTests/textures/blocks/smooth_basalt.png create mode 100644 MapLoader.NUnitTests/textures/blocks/spore_blossom.png create mode 100644 MapLoader.NUnitTests/textures/blocks/spore_blossom_base.png create mode 100644 MapLoader.NUnitTests/textures/blocks/tinted_glass.png create mode 100644 MapLoader.NUnitTests/textures/blocks/tuff.png create mode 100644 MapLoader.NUnitTests/textures/blocks/weathered_copper.png create mode 100644 MapLoader.NUnitTests/textures/blocks/weathered_cut_copper.png create mode 100644 textures/blocks/amethyst_block.png create mode 100644 textures/blocks/amethyst_cluster.png create mode 100644 textures/blocks/azalea_leaves.png create mode 100644 textures/blocks/azalea_leaves_flowers.png create mode 100644 textures/blocks/azalea_leaves_flowers_opaque.png create mode 100644 textures/blocks/azalea_leaves_opaque.png create mode 100644 textures/blocks/azalea_plant.png create mode 100644 textures/blocks/azalea_side.png create mode 100644 textures/blocks/azalea_top.png create mode 100644 textures/blocks/big_dripleaf_side1.png create mode 100644 textures/blocks/big_dripleaf_side2.png create mode 100644 textures/blocks/big_dripleaf_stem.png create mode 100644 textures/blocks/big_dripleaf_top.png create mode 100644 textures/blocks/budding_amethyst.png create mode 100644 textures/blocks/calcite.png create mode 100644 textures/blocks/cave_vines_body.png create mode 100644 textures/blocks/cave_vines_body_berries.png create mode 100644 textures/blocks/cave_vines_head.png create mode 100644 textures/blocks/cave_vines_head_berries.png create mode 100644 textures/blocks/copper_block.png create mode 100644 textures/blocks/copper_ore.png create mode 100644 textures/blocks/cut_copper.png create mode 100644 textures/blocks/deepslate/chiseled_deepslate.png create mode 100644 textures/blocks/deepslate/cobbled_deepslate.png create mode 100644 textures/blocks/deepslate/cracked_deepslate_bricks.png create mode 100644 textures/blocks/deepslate/cracked_deepslate_tiles.png create mode 100644 textures/blocks/deepslate/deepslate.png create mode 100644 textures/blocks/deepslate/deepslate_bricks.png create mode 100644 textures/blocks/deepslate/deepslate_coal_ore.png create mode 100644 textures/blocks/deepslate/deepslate_copper_ore.png create mode 100644 textures/blocks/deepslate/deepslate_diamond_ore.png create mode 100644 textures/blocks/deepslate/deepslate_emerald_ore.png create mode 100644 textures/blocks/deepslate/deepslate_gold_ore.png create mode 100644 textures/blocks/deepslate/deepslate_iron_ore.png create mode 100644 textures/blocks/deepslate/deepslate_lapis_ore.png create mode 100644 textures/blocks/deepslate/deepslate_redstone_ore.png create mode 100644 textures/blocks/deepslate/deepslate_tiles.png create mode 100644 textures/blocks/deepslate/deepslate_top.png create mode 100644 textures/blocks/deepslate/polished_deepslate.png create mode 100644 textures/blocks/dirt_with_roots.png create mode 100644 textures/blocks/dripstone_block.png create mode 100644 textures/blocks/exposed_copper.png create mode 100644 textures/blocks/exposed_cut_copper.png create mode 100644 textures/blocks/flowering_azalea_side.png create mode 100644 textures/blocks/flowering_azalea_top.png create mode 100644 textures/blocks/glow_item_frame.png create mode 100644 textures/blocks/glow_lichen.png create mode 100644 textures/blocks/grass_block_snow.png create mode 100644 textures/blocks/hanging_roots.png create mode 100644 textures/blocks/large_amethyst_bud.png create mode 100644 textures/blocks/lightning_rod.png create mode 100644 textures/blocks/medium_amethyst_bud.png create mode 100644 textures/blocks/moss_block.png create mode 100644 textures/blocks/oxidized_copper.png create mode 100644 textures/blocks/oxidized_cut_copper.png create mode 100644 textures/blocks/pointed_dripstone_down_base.png create mode 100644 textures/blocks/pointed_dripstone_down_frustum.png create mode 100644 textures/blocks/pointed_dripstone_down_merge.png create mode 100644 textures/blocks/pointed_dripstone_down_middle.png create mode 100644 textures/blocks/pointed_dripstone_down_tip.png create mode 100644 textures/blocks/pointed_dripstone_up_base.png create mode 100644 textures/blocks/pointed_dripstone_up_frustum.png create mode 100644 textures/blocks/pointed_dripstone_up_merge.png create mode 100644 textures/blocks/pointed_dripstone_up_middle.png create mode 100644 textures/blocks/pointed_dripstone_up_tip.png create mode 100644 textures/blocks/powder_snow.png create mode 100644 textures/blocks/raw_copper_block.png create mode 100644 textures/blocks/raw_gold_block.png create mode 100644 textures/blocks/raw_iron_block.png create mode 100644 textures/blocks/small_amethyst_bud.png create mode 100644 textures/blocks/small_dripleaf_side.png create mode 100644 textures/blocks/small_dripleaf_stem_bottom.png create mode 100644 textures/blocks/small_dripleaf_stem_top.png create mode 100644 textures/blocks/small_dripleaf_top.png create mode 100644 textures/blocks/smooth_basalt.png create mode 100644 textures/blocks/spore_blossom.png create mode 100644 textures/blocks/spore_blossom_base.png create mode 100644 textures/blocks/tinted_glass.png create mode 100644 textures/blocks/tuff.png create mode 100644 textures/blocks/weathered_copper.png create mode 100644 textures/blocks/weathered_cut_copper.png diff --git a/MapLoader.NUnitTests/textures/blocks/amethyst_block.png b/MapLoader.NUnitTests/textures/blocks/amethyst_block.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3e8b16dbb206ab7dac8604bf44e3ebc83d13eb GIT binary patch literal 284 zcmV+%0ptFOP)NDJ(1o%s zxBF`$18IZg$F((pdI9LBP;Lc;8LB~|DqVZ549qV5!xT)LLPj>jVG2C(1Wdb%X~3Ym znf#jy1q~4Ov5^tWaWB}90YM7Pwz9@(C%hoDX;fkBMh=_ELV3>gUq?G=P^nsRlItC& iVKghvA=$#>Px}imL8c`)`v;`}0000^EOP5DQo@Po>F;;si876qZ{*1SK>9R`bIkA`meL!1yr$K@C{Uw$lLY5@}J9 z03rdFNxV#iD8fYz80GU~HyUR5NzPKN-~Z%38!Lc->TcEJXkA2L-RZ*bZ0hJ( zvte1c05=dYc_JpcBctxp(c3#fqM_AXt1r|87G9g#B9ZoE00000NkvXXu0mjfV5Vfc literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/azalea_leaves.png b/MapLoader.NUnitTests/textures/blocks/azalea_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..7eff9b1dc08bab2347e48f8f6b0c7506aff009d0 GIT binary patch literal 265 zcmV+k0rvihP)>N z_N%V5_UXFq=ldq#`OnrnxE7E90wCu~ARNTt!`B&o1Cj&I&%>*~FQ2dkOn{vH46&<` zv%bp?1jyp-xq59-@R)9?a99A{*~vTzX*J|Ihynqw7&?#yOVX%`M??)uBXx=*DW11`N5a7Iuk(NoZOS6HVr9leDPqW`rF%7tLd&_<4Bs_vO<;>rDc}j3tocP)AH& zBrXF8TqG+NoyrLw!|gYLBv4}Jrm;L6i@!#kL_e_kMn-JpX!nGp6~1a`dlhc zTpm&0f}8+3;%NX+WBJs}!s$l)7^Rq6jJPBq%v=&Zp2kG6Hh@4OISJ&7$>$k;!X!=; zYlnDNoiNwRNeYrf{$r2?w^2+);1+Os^baRUbV3rrsHe%21OQ25nwjSZ>=Q^dQJiME zIyevfVBlIt3^lf=$YIv~4HB3+W=@~RW#BrH%$mNxd+c%ax=%Qb?{;XpMiC#qRzfQV6-hb!q)5kf@>QC1zIJOSg>AfJf3 za_SI;1KE}6&At|3^#p|)z$8AAe_Vv3-tChzYdUFOVYO>Z0;_5$`b6})$jbz-;3SI5 z{aq9SnLi-KZZ=9av1%}`0BbNX+%W(n6P!o9HO)?2N=b!Do lZ3@X?Fa+}W*QEZ9;0eE%a&FDXgXRDL002ovPDHLkV1j<|{Lo80eooLO+WXR)ED=oFn z;Z8$eU)!`UwoazEoEFUDabJ|;Ok8eFy?$r~mG3E#8$o{do2(!}2HB zEAJQcZM<>Ht>H=4fg@&GX>)^D9#M^R+S8&HJbi`l1B>Kfzm&OmcDYRLeYeWLU|p*5 zj7$PlX+utSKRUctbWzP j*01s&(aitfvVUVsx@zM2HD9^`=z0cES3j3^P6$@ zJqiL*41{wV8!g0B*m(l0Z5AxV6L^L_vGbV6$CzCRA&|*T{_3%w-`ho|VENo$->YH; zdoO^jTwth-8oU9{%E}0NI1+7T0HeVD812|;WD&PoHDagDY7e8c1r7x$+(vF<&Hz&m z(ZI62>r}$Gy8v0=d4l)#2;^8(kWzqt~l=&Tb@3|#bL_aCwOH(-% z^6a@yjzh7ji?j1KtudZbc7L9VB_4h?+%lmR{{T<^5-z*gD@XtU002ovPDHLkV1oUQ BV=Vvx literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/big_dripleaf_side1.png b/MapLoader.NUnitTests/textures/blocks/big_dripleaf_side1.png new file mode 100644 index 0000000000000000000000000000000000000000..f596e32913425f8c439f9905f155247d91012f00 GIT binary patch literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(w;7kAr}7094D^)NbT%Bqb&FZKQQV$0S5B?c>24M&!M z&+AzZeB+tmzB#7Ak~v5G_C;r3wwr;HMtvb#NA@#tyuHcUJyX!wi?b<0J@H)Gk!|xB tpSnJBeWP=%SDD$Gy-Aw!DQgjf{ExZIT76!{HUeG6;OXk;vd$@?2>@mZN8bPd literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/big_dripleaf_top.png b/MapLoader.NUnitTests/textures/blocks/big_dripleaf_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f6974840737a82b13423a18deca24a8c5f2eedb7 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`dpunnLo7~D4cf`uV8C<6A>cx= zg4%*a4izr91qn=AZV3Y4m|~Z7_auLg*rXu-yJn|KiF2V}cBNkR+@}`d@8k-;u=#F~ z_4RrbGn*wh{#dK46Kj~U(B6p$CUf1H+`reOVL{h=xg{@o{998C%wn}Js3=T0KEc$S z>AlwcK7srLll`yT&*V_k{rXm{VYB{*pX)nScFH!!n|Y=lNzFByH2F*Sl~pOeMuE~R tyLD`;*;OXiJ&>Q#&aQpqK+R!6@oPtaZ{qa)5driEgQu&X%Q~loCIF{gUFiS- literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/blackstone.png b/MapLoader.NUnitTests/textures/blocks/blackstone.png index bbfdb4d2fb948e316b67d1f31d1a1ce49fb846d7..5f94c21e3799d5fb4be2ba1291b7a07c583e0eeb 100644 GIT binary patch delta 247 zcmV^Twb%NvKyf^>=002ovPDHLkV1j}Rb@c!M delta 443 zcmV;s0Yv_y0^|dbGk*b_Nklkfqp{IcSK|E+n*)$xOy4!s zx&%NaDZUU1Wsw80-ADk2ThFtQVGIfG5%0_AXtKZ{@&FjyiGShNlV*oI=zsKGgE89G z_!hXND#Usm8%l)~r{ld@EAh7*>A=fQ#%Om}Dg@y4``3p@{p|J471edOqS%Z1d^tar zgin3f0Ia~4Vy#PrNLJ(7+}KXDh%YLgtavt>>Iy)b9UL2#q;50|R!KUGIJVPD$fn9k zvxC!MY)i@_=YP>H0N=h0v$w;ocZHYpyR&P%kt-GeWs&1A?NUjKF`A~jxtBFV`LaJwnv6rPrTnTwi9DpBE#6(3G+g2Hxlp1+t0~@m&sa}E47y_ zWf)VOjs%g1|7=+-_|YL_w9_hJH@je?`199w3?h%=)-*Fz_fH0_{z$D$e7iiCGau*z l#QU8)3z0YnjL`&<$3L4x?66(dQ#$|v002ovPDHLkV1kYu)ieMA diff --git a/MapLoader.NUnitTests/textures/blocks/budding_amethyst.png b/MapLoader.NUnitTests/textures/blocks/budding_amethyst.png new file mode 100644 index 0000000000000000000000000000000000000000..edde8057eb6fdea72eb8b45215005a7fb82f44ac GIT binary patch literal 325 zcmV-L0lNN)P)Hbm z^t-w>Ic%Tp)OJ66$1A)UN&wU5!jTdnS3h8Ix&P zIiC*h1d=E!J4>GSPGYW5UB)RiCL3QSB)lXHvK+xgN$(@%tIK3zyFPsCeT0#N>?Ul3 zU8hYu2a+cHBVqcnJEGg_B<6$4Rrz2XGuPQU7@w=Ur)cv3P%k>z%_8Gwe5L3j!p{94 XuqK{=LC<+Z00000NkvXXu0mjfQjd=Z literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/calcite.png b/MapLoader.NUnitTests/textures/blocks/calcite.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2b0dd9cf1dc14c34dfe3dc8adf0bcc3b90d031 GIT binary patch literal 257 zcmV+c0sj7pP)_2H`l;uB4S+@9$@OJs;ccejWR|UjE;` z_qna(di9RKtq8nfdFuuDPx$)=5M`R5*=wlFw=yQ5eO4S7aFRUo&wEMS~8^BAXPdtL~&LcZ!geoB9GJ_yl=^ zP)hc$vQKv|=LO;{x^W@Q1PWcGnP7})LhyE>_jYvJyZbKRIh=F8BiMVLK|`({W|#*> z0Hk+|^Z6YBU%&hiy{0Aa9gEfc1v77u+9v>Zz@k}Y;x7R>`*tD$M#HHv^9BGS4(v58 zdF4g=@2qgiYe=8vklzDh^hSyz(N^88oE2g0ce1Hi|d_z+n)vs5__&90t)&6MIcd{<6y$ exh13FRQv(MGTW=LfA-D*0000Px%8A(JzR5*=old(%%Q5431H-^UxH7}Z)LW#vjp5T%~U#4!Mi)K=y4#f<$WG><# zAYHnONJqiN;8IGQv|A?Wq8YjfO_K;M4(dx26OxATZinyw zs~YBvpI?o>e}Gqsgbcl?|34k9Sq5vCAv61B;SuQBex?lv72fhzLIOOxsBlLZJ*bfx zb6D9<(L6fiFgq*7@CHlPlsvw;6$&VT`TAb~ZtNB*bApArzP+zM>Z2B5l*XG%g-AL| zgb7Z*{C4{?`(-ggq6$Y1=XcIU%Zj-)M$%DEN`J`gmj&=J%Cc}pe&<}QHfk zqMk=U5jk!+9A;;w0&BHV19*@|-{5fPzKb^ACReb){R#L2&>8002ovPDHLkV1fmU4u=2$ literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/cave_vines_head.png b/MapLoader.NUnitTests/textures/blocks/cave_vines_head.png new file mode 100644 index 0000000000000000000000000000000000000000..7120939583c1508f747b428479f5212000ace570 GIT binary patch literal 563 zcmV-30?hr1P)Px$?MXyIR5*>5lCf&rP!xv$>xzp)Bqb5?P%L8yJOmrJIDP@sDO*jTQ-(2pa3v9#gJ20Dv&$a#YigQ}l;jF)LSaVRr<%T1JL2qdU0v z1_P=KyCY`h3i`vY7~4Lp*ArZSdgP(%ya05o0mY@5Bqkn>nqJsK`GoaqwiMZjHqtUO ze0wlhkH3{*ba}%RGnGteBNa16v$f^*f3-P(s(*}h*}#Cfd#L~b002ovPDHLkV1m75 B_nQC! literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/cave_vines_head_berries.png b/MapLoader.NUnitTests/textures/blocks/cave_vines_head_berries.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8de2a9ea805108fe10df5c58e03c5c0a865f8b GIT binary patch literal 594 zcmV-Y0Px%3`s;mR5*>5lFe%xQ5400&kTc7zao)RV$c)|A;A{oCQIq2&8pImRa~@?WeMUR zQ2YyugzPG~31nB=ZfbTypsTimfg(i0h=D9x{Ad!iGMU$fc~eJMJ-fMc&$;KG`vg<-r%nN*~^S6A`~fJnBRBRLV`ER*@mu`388B&o#zArCSZE>B&ZJUq3f((E3z@90 g&CL2gOy6JOFFD8ALuWysng9R*07*qoM6N<$f~y7@`v3p{ literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/coal_ore.png b/MapLoader.NUnitTests/textures/blocks/coal_ore.png index c5250f0e5f7eda348a2ba6ea1d83f7a1ce691077..2a21d2bd0f7b56361e1a3072dbf4f637c539d727 100644 GIT binary patch delta 274 zcmV+t0qy>w0<8j&B!BctL_t(I%Wad(jf6l9M4b#*jz}wwH0RZ(KmY{5oe&6_)oZEH z!{Sgww_W~Kd+I#T%Q%kX+V_1R=WW{_HluQI0N-_8Z-hf45F6Zbl~jT-P1E)BS*~SS z#yyGWc^==!PvM01E&B07*qoM6N<$g2Katl>h($ delta 261 zcmV+g0s8)}0-*wsB!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0002XNkl$xH)x z4t0cRHi|&xLvA}pS+YF>Cy&KxjrllPd+v6umMp6OMBXv7L02~{xB;)LP1ue%Ry~wH zg+?oy6s-170Zpsz{C;J#tyYycXW$@T3RWTc&b8DpGoa8U|8n{QJ+oWWMd@8F00000 LNkvXXu0mjfpoVf2 diff --git a/MapLoader.NUnitTests/textures/blocks/copper_block.png b/MapLoader.NUnitTests/textures/blocks/copper_block.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ce8b42b38dc32055c1bc519a119ed169f53347 GIT binary patch literal 268 zcmV+n0rUQeP)r^kQ8`FL4lgfW?D{*@gSh6WQ$Cl6R?Vr%sX~gJkCag zfb9(8YT8*4S??C?hvXSkQ5LyNZi^q zO>+w{Ie574s+#r?ELjXNOG(873H-UmqUPf#gF3gayv{Mi~Lkt9C&9UbvJa?=^J>Sn<_?9!~NFO2BcG TDCHp{00000NkvXXu0mjf(YAuz literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/cut_copper.png b/MapLoader.NUnitTests/textures/blocks/cut_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb7f238899168366605c1036c0a06990954e177 GIT binary patch literal 269 zcmV+o0rLKdP)@QGc(Ju0duRc0voW9@9fPyX73LeFvkaW4;JEkzl_iAH1u^} z-{*0gepRD<=|;g-w1-{ z7Ag%O=)g(Pff2C+=OtFB>;?0PzUq|*fL#YaA#6$vme6hIdi5l_@xYi&aRy=ofsxbmf%#}n%r(~kVwZ7f^h z6-Jw}1;7(l2O(OmzN6^q04?&d*nxS+ggMO_MAyj4*2;FuQ378h-ew2ZC;LW>zZVOC Z@Bq^vqL7!jb}aw^002ovPDHLkV1fq1T#o<% literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/deepslate/cobbled_deepslate.png b/MapLoader.NUnitTests/textures/blocks/deepslate/cobbled_deepslate.png new file mode 100644 index 0000000000000000000000000000000000000000..50fe34e4d2190f13667bed958d82179f5827f466 GIT binary patch literal 273 zcmV+s0q*{ZP)kfv$F}WrpXYh+`**%`=6zk) zwD`st^Nc_DSP`581n^E`g7LX9v6Vn9A4!Ih3mS;nqB3YuGi4|HJ`2#JX*tP>pj($B z5xS-f3u{3#ZIqE$8h8Q-XrR{=dVj07`un8;f_4${TNi-J$`eSkeJe5NBDp6JjLN-> z2}t$rTP;=$F#+OUohF6+AHbj&cs9}0DafpQi+#b$OJhWju&=b)%og|nDoDL8l=tZW XHR0+wcfQsC00000NkvXXu0mjf*HCr3 literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/deepslate/cracked_deepslate_bricks.png b/MapLoader.NUnitTests/textures/blocks/deepslate/cracked_deepslate_bricks.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8f8332cc5d42e5da7a288ca6c1441286ec3ca6 GIT binary patch literal 277 zcmV+w0qXvVP)O&|k+-V+2NVCfG65^;JGVE+}OMc}^z_5^&V zzGvX&!p@Z4f7-mE0Bog{hwgIbK^neeu`(02r9|5Edtl(w!}qQJ{8%XUT(u81n6%3A zJ78ED*zHw;z}fML0H1Pvy_W73W@LA b#bYi%h_%8o^S1xe00000NkvXXu0mjfX3}|aaeU*QTrl7nMV1jLuzYgFgDNXQl6gAWldJ?eGkrcfP_3se4P2amgv>Zn zG_|f4y?S*=&g&xiNZyslAYzgeT*bErncXd8sTaJ0e`RXJ?pz~v3yI>{9rSaNsuruI z$$bzWrya=oPdfr_U9PLD!3`2dRE@#!%oPaxU2~OWpkSx8r&{;%$0*)Pw#u!)c{c5e<;yk}ID(7I%b9v)9 zJ~MpLQTe>={TgL-GvQ%_COGGMtHN9rU=g2}(cUiaSWX5;P8J1BfXsWXop!PyGxlRj zARWeza!MB8HTBaYt3neXsinp=Ps-4$!av<+SE1C%H}~tLM9O>&pt+m&NdRQr?r#H$}R(oQR-m3FVX8IQCt}=Om%6kJS#82S&=bn9RCMwm@`=1Y1qEC{3mJ&S7Ddsr9Orpn$8lV9&ISAaNhk(9 z#(%J}ZLb80tc9A4fWCn`P9V3|t}#Z!#e46$hftvARUir9-#gb5^dj&>%2dM^1QJQE zF4MtNK;Z1e*%RO>9yQsU=iQb=j^?p&I|9cM85eNq367R)^v;Wf2+8$0w*$X-8mD9@ zdqSO=@Cy3YDmB4xO}u-Mo~F-lG9}NVb4IFsP-^?;d{F9)D nx@CIf?US literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_copper_ore.png b/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_copper_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc547de0460c7480a061b5c551b1d47faa6251e GIT binary patch literal 319 zcmV-F0l@x=P)zvU?-AJZ4H=S5Yid%Ab1u#Z{i(1z{*?r!rLLm;5u*Ko8P2y9CP3I zx$C;h+ICY+80Hx7gk!Z@7lViihwL%%l0Z3|+qsx3S`yUzd)?*FWjn_d0nZ{pZ^R;o zc}vMlf;`<1b2hypL~^MBRXG$alE}ZuP!VEVRFqk^WKl8$rb9BfM+@buuU@9+=`-v$r_6AW&ooiS2*zNWK-2uPjI}sR$ZD2EwjZ9)sCayD~j+6EE(UK)5ATGlEyw%nDQuFcj5$LOM z(I=}w6j{Cl-~5DfZ&C1McL_NhpzJR0^%d2L3B(R%Zp9Q2fk;{^k)%EdvJZiO<+$zZ-;rK14(vWfzupo}+vpYkLBx?*ZaG4OhCO`E8LP zFfN}CMD_xKn1Yi@^m&W)Z#p4BLlp4Mb7zW)=u?8%7KvRDxTI0^f!-h_MJKWf8wpk{+go|8p^TObxz1re=?rt)PxG%F%SWRGDmQ5@Dn}9f1 z3abe)sNVLp`;k?|P0k4n(2M>1nzg#EJ3=*E|3OvVDx&t)xDxOrUWsPr3L+Y?fXR#d zF?$@DhNgg;bXX*jxiiPlGcYu2gPxdFGeGg6!!>2qRITH5niKU|2MjY2;>dW>Qm(300000 LNkvXXu0mjfv^0$a literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_gold_ore.png b/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_gold_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..be52acbe4ce0de45ecbd3207373e25edda17bc61 GIT binary patch literal 298 zcmV+_0oDGAP)nvfA8P^?%lb}^SqAZ zxDLaxi@rbB2u2uVUHH&-hZ-aj!IL~)PV4P@u8}o)1@-{TeX4I0LK>x<$(jpF9suv< zQNdO!mjuHymWppMGsKXi&dF5)iQHs0iO=g<-$>6n&g6V)B|&Hst8-nd1JCegLwrf?|w%9uf$i<57{S?vD*80bq zXJR*rmTF}r#~S2V+y<%rN!&7zvB`HeXnURrf&T?#?7x7!EI$F2OHcp+002ovPDHLk FV1jcEh%*2H literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_lapis_ore.png b/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_lapis_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9c8cceb7fcca9067604dccfeced8e0825f5cc2 GIT binary patch literal 332 zcmV-S0ki&zP)| zp%KDB5Jk6yC-=C<7nnFT9(dL+o7kcK6@^|1L32 z(>#vjJPgAkx^ADL8sRm*gN?S`m6dNAeV7_^0s8vzoHxfyuB-mKXm-$M`>l(40)U1T zMbkerS7U#Em6}!pR^gPO1-duaQ6$jh#z}@)_<-bzz8kIm-~{xE^6B=@6)zO*dw)tm zvl?ohPT%vtYXse8=o=Z_j6%8l7H$?^piclA)&WRjACQ0^&Z-EA_T3i_P%cxImxm{#}n8uTZuC%L}Tti6Upv6P-e*(km0XG=$qSoto e?$YXCn*0Md2puFAyoOu=0000jo8WkJNy=ax6P)RNVvc+ zp{jsQKhLhKAo&te-qTbb>vg%WRzFoX2{2QI00Nimwff8X+yL?-e{Hud9+_39Lo7Fs zI8{e(nvd^aV_kA3P*5dFFHIu>0{Vhit}vBA$vQxnFH@esfa(poZ4X?pm*;b*baH8a zcmq|w_k-#9=4E-|V5BfA{rk*`Bd-$p-m5fp=7m8*UhBv!>T@PBzgT}iUj(`HB5=L` ZNIv7;`{&4wltBOh002ovPDHLkV1oRjjjjLy literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_tiles.png b/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..7eebeb66d456e4ae6eb1e7ce0bddbdd73416758a GIT binary patch literal 233 zcmVJNvnr#FM?Xcea?P#q9{@xn1F~;rKw=Dv5&cJbA z@10|wi_=NW3msrYB7g=At}$FP0`8WP1ObXcpatlbAv|Dn*r3WtHPqBJ)$d8HnI{Md zm0m64$v9?}S*xy}J;*d_Qs&F+0e9e^s1{0P8cbS!<#Lg-5vzjCi{Cv^?fQ;Yu13v% jfF}$OR->xHOn~?UK9Qr@!QS;W00000NkvXXu0mjfd$nQ6 literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_top.png b/MapLoader.NUnitTests/textures/blocks/deepslate/deepslate_top.png new file mode 100644 index 0000000000000000000000000000000000000000..2569e5077b0efceb42e276e7f24bc22ca29853c5 GIT binary patch literal 254 zcmV)vnW zOAjTSWFr;1SfMli)>>yOr+SmkJT;psiqqZ1xqoyH0zxA{>(UJ{|E&QVI6OJUWfLPQ zPBE;!kwn71qA=!9@sc|c?*>#qH#=WYz~ciKvnV}5D$G~sw9XSom2{4gEK+yh*@O-) z-f=44sZM&^iCz$PCsyW<25FAGk^E26c$Lr+KKD8rKeEgQ^meaS;s5{u07*qoM6N<$ Ef=D`O%>V!Z literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/deepslate/polished_deepslate.png b/MapLoader.NUnitTests/textures/blocks/deepslate/polished_deepslate.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcf750149416d7cb3b92afd19a0f06aaca45b75 GIT binary patch literal 250 zcmVf3jTkiGSx$uD<~Z-?3_8DjdQftx?8Pv8{@~BbM6NL_I$m2 zDWyNobNGsZV?P934hxV(Cn0wd#06!B1SMgS%!!{;`VwfByQ=u890ba&)mInDiE}6b zM6R}@L~c`o4{#?xFpp;oyJ|`v>U>Vi8PJBdwZi5M^ci>3eW_4zA@Cl3u~r1L1(oMZ z!y;*0v~+oee=2WR*^>b8{)f3pB*zE!F^wJj05ERZK1Hv8AOHXW07*qoM6N<$f+sCz Ad;kCd literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/diamond_ore.png b/MapLoader.NUnitTests/textures/blocks/diamond_ore.png index bd8b4bcfcc21d64622abafcea46b185681c91180..5182e1cdc2b88516e135ee56075ee537fc171ad6 100644 GIT binary patch delta 274 zcmV+t0qy>;0<8j&B!BctL_t(I%XO1G4#GeTME4{#9BwZVi83cZ=@4~#3T^@gT!9O{}G`vhi=mv);BW%Qnw*80Tr4!Z`QdcRuA|jbegI_5=r@84cxYHE?*mv&fUl zIenhn@p8?kts8jHH$2Iw(@7ceX6(DtkK zy+{Vt>L%7D^1aDTbOfJKMWfqE4d^DCAo#9pR{0Rwh2Alc5v-4>Zlu4=p$0zIzc?U2 Y92t^Hhrq)N01E&B07*qoM6N<$f*E{$(*OVf delta 276 zcmV+v0qg#)0|ES@ zD5&h&c;CNmx{0}Ss4YaZ0ZNZqDIaqFgFO^jvOQ8x9*f-?^T)~BbG2i&WD)fddB<#l zs_L2rH{f-&3ET0;qJ~nZ&}c=Sg3sQX(akReInAee_BQU`k+wo6zq)c^>)a{wXhPU4h`6r|SL zUl$3AEJI->PVBq$CGp%YB!B%$L_t(IPjync4FWL`+%ArQ2B?4x35fy_DH)L^(#r^(kUOOz ziXfl@LJBZ9D~&a`XM&Yi`^?PFot09mM$Wm83k5?2uK!T^@H=iRKPp*zL_9e><^?;h*N#=*$O`}tzF zDL@gdSj4@M3jiunRyEvc5@iE`%fs{FHB}J}wOGIsmi6A~6Af*jQ5|NefhrrP>Ws0V zENr5Om!{$z{VSV-UNnYDSu|E>96%A(VP}|@;ENiopVIW6XedD;y=Uw~K@Nt}hn}&F hg$I!(E|8G(KNNetXKtjMrk4N!002ovPDHLkV1mTAgYy6Y delta 265 zcmV+k0rvj30;B?vB!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0002aNklg!M@fC za76H!j{qL|%FFYXn!t%_jZ?;odK~xbKJy41q@i*u0QfyhP=5w#sPx(^fJ{n)vaLYP zs{jBIBoIPW=VhXs=b4mTv0DMPc-zzyZ{+bCybw{0)*kQ7e&q6g+-LB*^$|H| z@FqM@-CRUY{jOph4i%i0VuW8}IK+98jlr6j&U}$n zZ$=Q|o2CNDdm%3jyghFbvETKMCJc1&A4Xy}Ld<*Y0FjIHyuKp|o3G3~B3$f|g^~*j f+jMw^{FeC-WR`{2nJ$R-U<-N>f9AEJ2T&L3m+9vUrX#?ylRlUR&9JW zSjwp#q==rG;2M|SNqa~HQY2%kQT}K)!V=kc(39QPtb?BH=|hu5EXOFW#JTZJ=+`LO uyxIZnr9l0hiYZw=+7@#E&b_qv9>>0XHh9hRXn4W^000012PFF2e}{6g)#0T3=doH7Er%&EHS6^@T(P zT-(HC_EdINFhtxJdg6j$@ zu?<2&3_~*oE6_lJn1b$ibQFjNi2~8mP*O7hgD?bQ2NuC6pPsDGm!c^DpD(eUtKqmf zKb8s=hs*kOTd7v@p9N5qFBq!e4%q;oD#{4u*Z%#vexJjguKM(31B@*5QKjSUFw-@L zsAi_4QG%R$3!w}L_jX5!l+Thn%}gVm=o;t*SEHTH4S8Kd+JcF&PkC*E-AHKeM1j0M z!EP`r`J^`gDf32d8j?rcEH*#6yHWe*5*AsE#f^;Ce>hjJJ;kvQPsaV?fM>&|M~_mm k+06?RCttOp#t5zY2XTEWKuY3ST>t<807*qoM6N<$g15JN&Hw-a literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/gilded_blackstone.png b/MapLoader.NUnitTests/textures/blocks/gilded_blackstone.png index 676442566ea47008f701941949227953a5b53008..db5c616314dac30b22e037882c102a9ecc46047a 100644 GIT binary patch delta 294 zcmV+>0onfh1i%82BYy!0Nkl3@^>Y1wfWxqQN+s&%R`sW>s*?b`Ho*LhOzo)t$my;Uoi^a!% zHr$TWR*;On0YQ>bFHE4>Q{+jK{PjFH0x|R!rV2C!8MCh6 z>v;;^M6_U$DNN%ky_Fean~hl@hvz=&v@$UaY8v$H6!RLrRzARwcaSy`g49GoKYphE s4QQoy`XPx%HAzH4R5*=wlg~;UQ51*2iIX;&$xSn( z6rD6Fn39w#)S?sw3#DMYXkEK$m%czBz-r&1k5Jl8wrzLa3U(7v5Nm8L)R2r~%!rf8 zA5f-?c(0Do0|RsJxo774{qDJ1Y5Y!T7!ClPP6HXuX_afYZ)L)@_aXDEDH0hCfZj<+_dFn*D*{kn zsxtm&j;Alr2z-xDr=j*}%k$~5yqAukN;z`P6c*1?>nxX_P`I}NKq8~jI|+$>tcb`) z`CQFyTd;BCIe!x~n|yzFDX*A3K+lyX0kCaBtK~-!17q-hba+Yj`CAwvjRn335NVc( zBVGl=a3b>7w*!U0+Z{!_YiC1go{W6oW%hx|SNFc6v7M~)rgt)+u$?SJnPht9tOt5R z!!R7;alx-<8#h)OcoD|w`aWOYy7b*9{y~c%CD0QZ@qf5Ldo=l2iE1_Kbk75lLngM9 zRevic57_OFMkpkyes%h6C(FXv4zFLenP06dFPg?Q52y09T7E?8Y~gg^f&8*OzFKvQ zz28$z%xo&XxzZ%IEh2`Om#XO3nd1H5*O-iOJ$1y#S=JJ2S_FtsejY002ovPDHLkV1iU?bCm!9 literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/glow_lichen.png b/MapLoader.NUnitTests/textures/blocks/glow_lichen.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fd87021c755b9fe4d559d2dad2b201a12801a8 GIT binary patch literal 241 zcmV~Jk&M5*3gcmcLH2KWwd(2bmXJn|1;8GlM?#ZtI(?%8W*_iw?P4RcVce6kP++K`fCF;bMsLZz7m?qk zeaqZ3;v@=k#_gRgID@aX4;6de${3Q@EIxJMGh!oWfqjwO_x)e- cKUeqzX@!8U;t$ip5dZ)H07*qoM6N<$f>pJDkpKVy delta 273 zcmV+s0q*{>0;~d%B!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0002iNklr(A`Ou&_b3rmX%zC|EUu@fUtn1o?^Rg^GIJee@ zT;hnJn4bwYzzy;rK~1h9u$KZ$_Kbv`XT)KR`LeT~xsGGCcoFpydB<#lsOtI% zE@0N#COnQe7S)v6g+ePD6wLMyfTG!UuB&V|-#n|a2R8DiU}lnY#)6-E0MI1=eEI>L X%9zXPB)$Rw015yANkvXXu0mjfGR}Xh diff --git a/MapLoader.NUnitTests/textures/blocks/grass_block_snow.png b/MapLoader.NUnitTests/textures/blocks/grass_block_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe3e029c7eed8e18bc4b6d530761e9639086a43 GIT binary patch literal 307 zcmV-30nGl1P)N3pTO?i!bM{ z&G>)0XwSdJ-OWcFicTaY9BV0H-@)Re=)rT0eI;XO;DaWcY$V>yyT>`5A#ny< zO87w@hl@Oq8dx0J8Vr1dj<}U^cJObOO_OBa6+A&Tf$h+h1*Z)cFwgLw@bknrrPGR= zA2OZbn)tW#4cDBu2a_DWv0Y<0!nT1`>fVdPtQY=zZgHz=>tT{&U{FroR<~VAG6LvM N22WQ%mvv4FO#rn|Qyc&Q literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/iron_ore.png b/MapLoader.NUnitTests/textures/blocks/iron_ore.png index 648417773f629c0e8aa57e7cbf247171bb8358ba..8fa68577423a7b730acef8866daf8d74dc484bc8 100644 GIT binary patch delta 265 zcmV+k0rvj10;B?vB!BBkL_t(I%XO2n4Z|=D1i4|V%n%PCz@^$$agi<3c!i9SI*T}X z0w=r)r65F!M=mzJKpmu26Tm*+i%2OdP~z z)#ipb$>}-RzgJ2ClF+Q1t4^L!G5J0tqX!DmtV-P_Rb~Mt4rv^$X1Y($SjX5C>zE_O z<5B0`pGbSxk2IgyY$6Fx7hu;fX@HL&P{1egxtPsIl@&AX^-Is1$oUUzwS$KjsKK}Z P0000+ct}H zYc1UgM+IbF3hV%Hpm!9U@Gh#y?VQAF_t$=%7(}CX@{R)Umw(gGz0QaR%AVaj`&^uS zIH>9(zMuEm-Gz0BsEa2D5S39S`-t-l_Hf{qJtO6lCt_Noetfc?xyEs~%p&Ta$al;Z zsOoM;Z~|FZoA5Zkv8Y3-T_C!nLc=Ju;7<7 f0O%tB=JW;ZjuMA#!J{db00000NkvXXu0mjf#=(UY diff --git a/MapLoader.NUnitTests/textures/blocks/lapis_ore.png b/MapLoader.NUnitTests/textures/blocks/lapis_ore.png index 24ffcba612b7f71ff42da1ccb85436ea0a1520fb..7c212c3ed9ef2befc8ae2727dcf17e1737f3f1e9 100644 GIT binary patch delta 313 zcmV-90mlB+0@DJJBYy!JNklSVE9fl#oec$&H?z^sA+<`NS$$;9njW9vb8b$KfO@C1Hj0Awq<-JfLMt{;`U%B^O*<|lbo)u*C zlua9`$i34Z^0TR7qHH7rK=S$iiIo;4_r5kZ2&e{t{tQ4)gs}g5I$@&hCMp|ZTSATQ zXOD`^go&AeWD3}l_bMwn!AGYN=j4kM;EbvB6bRTihet&Iw6iDPY4S_}YX(B1B0naA zGZPx#{z*hZR5;6Z zlfe~&Knz4v0wh-F#Ud7jho zr)f&VAIGu!rZ_ABD+u!dPv9|-2hREWUN5(MzE8uW0LV=Cu7CgD%c5;T)(x)&D^R{y zf)8oH?7dT_e1Lv-Ot^Re)rK;A?>ehR7d1tMEra?U2!UFFoHL}Q0ugZO%wB3c%4&>y zq*z<_b{7zn$@p|23|E#*Cvc-m^vD(fz^Y511iA=J3odBc#J!DYn)m6ON41JA75Mzi zB5fqUD&QM>6f+Sk;f^X0ED4S?lW|P6e;@3=18owIk9ILyz&|7A1CYE{T9R--i~s-t M07*qoM6N<$f~?nthyVZp diff --git a/MapLoader.NUnitTests/textures/blocks/large_amethyst_bud.png b/MapLoader.NUnitTests/textures/blocks/large_amethyst_bud.png new file mode 100644 index 0000000000000000000000000000000000000000..337f13d5815b6a140115b52af044ed2cb82d0c6d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Lo80eop6w|)q#ig?K!1A zRhw9FVdQ&MBb@ E0N>+LLjV8( literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/lightning_rod.png b/MapLoader.NUnitTests/textures/blocks/lightning_rod.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9a13d7145babeeaa9eda2db750781e7b0f6932 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar_~TEACABEZ??1)ct?D zg6IL0c^aI`_ZcQUdm701M3UiBOOK}+L(1~69hU@A!9y)os9U!+7p t3d7O31r}ls=j3mcIBev0*cP0`z`(+q@|r#J_%om-44$rjF6*2UngD2NFLeL_ literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/medium_amethyst_bud.png b/MapLoader.NUnitTests/textures/blocks/medium_amethyst_bud.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f84f0d177153d087c7c2286fe58a21483246ad GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar_~T6C_v{H^@Es({%p7 z=A}RHzij^RBHgr3;x2>4d=2T~JJ0{F@4Cm8b~vMHU8Cl^vsTQ@9NP}uFpyf$sNkyL uYtU;De!##-W;vsQs{zku$ylC9euiHYCe>cOT(cTz34^DrpUXO@geCyo{4}Qk literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/moss_block.png b/MapLoader.NUnitTests/textures/blocks/moss_block.png new file mode 100644 index 0000000000000000000000000000000000000000..c949c37c8904986fcf0e90ccfa82385869846023 GIT binary patch literal 268 zcmV+n0rUQeP)Gy zF$zLK3`BDq8-F3*z|PLb*2+e(kbeTt;EA2^AD1fFONO= zz8=K^Ij_%BROgM-fMipVBq3Ai&nadnl|UY6=aw_C&A_A_VmfJ(OX>?lzZ&yXkM zltL&BWM`>5N%juY7PquHnDMA+NkNzZiG!6#h|XS`(s^U?lm~#S=4MJ#jDoql0oUlB zyUy82{W0kG#-)w9er5Sb?urtt=hI)({5YSdW7<{H;je@M>s+iH=34g5Q1UOzb@Vkd S*EW6t00007i&B3;JLoc%KOgFev6RgXEI4P*=~5>3(~)? zO*=80=cQ~P$Fe#dO2;EYaD6+E(uxsZ4E>Klngju5OXEu`5!{SG4{C{O0{^Qlob2U( z_a$&ZRwYJP;3fo~?3GjH{m`9gg+AGg|+U%tAdk1egkLb!n{iQ;3@&%z}EvIZ~kNXmg)#H fT*Qoa$++YLUt4(w$<=#ARA6Er`HH@_zM#@K(G)ppO!X(SCHEdj7l5;G;RI zB2pGQP$C*QPCLOy9l8rn;3DJJAA$QzAYwacVGgj-{T&hbKxqvcxX0|7M0(}{AN7RK ot;f9JbKsXN0iF^)|3|pu2ZtbLV&7i;8_sYd5N)Ohoj_^1Zy!pLL(Rz*z+*dB%>*;Usd(QkRMEihB z>*?mw1AY~vqI~%cB5uc5-#f7OK~P5cg<02E)E(O|6Vfd5)ZyR}@yOU0x_9as?(uGY W$d>)l(w!UVU-*<)`-Kx)f+v3X3_xHZfSl*VzJzM0` z3567UrjP|%C9_sJsIFtWmhw<&!^@tYbq9Jr{FG literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_merge.png b/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..38620f5002904439cef907f57e868e10b0620407 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr_~T6C9W)YX$#rE+{UN z;L_vcWJqRnVn}1yq-bzf!7PwX=Y{T{{v3ge+mxjl4jW7t$Yt;_+-2@j#JG#mK;K{j z(}lf`n;2gtI!xofaJV5ye?lrlk;5br<`Zlarm`h4ENOfrabViY6J`uz9VwCyYs482 Xl%IUfIK}c8&;<;hu6{1-oD!M(%hcdLI`Hnl^uKmD>8H@}zS`*e}Y^E=Oew3^mp>tpyO_K+3d`PokI53#q4 zdYw@5_@;P)u`E%=DxpADg7MZC>(#qi*7T%!DD8Y)dO#(zv?L+WpnU6rNz5U~obC!q z?)P#Lmsq*OV-Nct=1}&yo@c&Wly0`(bpN_c|DkJvY(eIpTYvm_yt0{bx}U|oVC#|} U@iROsfzD;{boFyt=akR{05Att+W-In literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_tip.png b/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_down_tip.png new file mode 100644 index 0000000000000000000000000000000000000000..91f73b3780c172caf07cf921d7a357d32ebbb71a GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr_~T6C9Y&o=p6&9=hxw z`^6JGEL0eJBs&-tm?!WyX0mPcG-7D;+$75)_C@Spd*Tdl4^E zh7PSx;sV`~Hmv?hP7(|L-PE zA{-J;nX}(t<+1r6H{+yKDRUTK)Et?hm5W7_*ft&uUorJKyMy@ouJXNkl3{h@X-ew6*IvHoD01IC1EU%Sx%zy#<&AmuqQBk1nDjcAQOCiQiB TKg8A800000NkvXXu0mjf6*yYy literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_merge.png b/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb03adf87fe093b87ec21c1b6582efd2b8d8228 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar_~T6AmzneG&V|{_xR+ zhW|WI8a$`2Okkch`S1yIhL)2?3{P^p_AqP`T_X96X%a7EW>Y2Ol9?&Y35*=vE}M89 z_*^FOHr(XnX7AeLP~@Y)u2AGKDVITqr^Afp?oSnVl`{+_`V&$ZHhrGB*CAw|!}Xp# cj$Ks@M>mdKI;Vst0H?$}?EnA( literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_middle.png b/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_middle.png new file mode 100644 index 0000000000000000000000000000000000000000..eb66e9b7f9caca06a20a92fd4022e85eaf61fa93 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Lo9ly23c}7IPl!L&lx86 zh+RxxA?(^Uvwa8VYemXPI6q2b4nAk#9#r+-YFczbUh%+&6XVq8s8|oUndCD(*>C{Px+%ET$afRrTA2uwmYk`hr@O1Ta JS?83{1OPauOTPdB literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_tip.png b/MapLoader.NUnitTests/textures/blocks/pointed_dripstone_up_tip.png new file mode 100644 index 0000000000000000000000000000000000000000..9c702a73fcfc7b6bb64b55de9d24459d534dbb10 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr_~T6C_x-uuj$r{%@|{ z{#V`G*hATst-&NXpF literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/powder_snow.png b/MapLoader.NUnitTests/textures/blocks/powder_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c2279311d77b7c9d4e6e46ed0f6ac758a6aa56 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q#@T9Lo81B2A}3SV8HX~|NheB zccX5cIH+{4Mbzt{%@)(6d%r(kZSW{~kJ-Gm&<|1CkE)Wi)&$R9()J^G#f*5)dviT! zortL7&)8&?VRY59OzOw$Re#R$nzg7e+r2C)&*z%&rJ3ydAtz5=(QILl$x8a`lVrZ` z)U-7{i`V$=SX;=q%YO;;)HODGDh8tE`OQa+YE#uK7^`=D;&}DeUKi*-22WQ%mvv4F FO#p4(Rqg-) literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/raw_copper_block.png b/MapLoader.NUnitTests/textures/blocks/raw_copper_block.png new file mode 100644 index 0000000000000000000000000000000000000000..204a82299b13b3978aa53b8b2cfa99afcfff1314 GIT binary patch literal 797 zcmV+&1LFLNP)Px%*GWV{R5*=Ql1+2kRuqOGql<+V#D}n)ArT~YvGY+%@ObKur;F5W7tNxZW|1G! zMb_DQ*I&^;(U~^8X6f3CxRc_h4l=Hd3Qch&gg_vWAq%iOIh(tA-*caH&O7(xlZO+4 zoTgH@y$@bHvBaxonS2+HswSC+&v&KUEXH+y`1_Dd!$&mzkgOu8+a3UQ+oS1+d|NJ% zUM|4FOZM7zG7X5RZShmZqX#o)RLyC&H5?z|p z%LRTt=rGBEzg?n#U{Y)kk?v&mopCr7Uz)n3F`Gu3n~4Pu|2d~W?D5j+(Dja~mF@%Z zk*e|9cM$-U)I2pW;L{n_rje$cFU$z0*p+d>!uoxpZ)`d}n0x)+=E*?qomA+qEOBk zxOwLR`IyX$zm9lQZQ=|srXTo2a$17xgOD$VJz`FuV|PFV;88@z(2@XGfx29*^7&V+ zs4`7I#IjusEy?q7z)#YIU+&#Stf*77WxFiK^$!-;GFH)7ud^T(c!$Zp<*;u#)KrO< bu?oO@Pe)ojw{2}}00000NkvXXu0mjf-^6+6 literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/raw_gold_block.png b/MapLoader.NUnitTests/textures/blocks/raw_gold_block.png new file mode 100644 index 0000000000000000000000000000000000000000..57472f755fbe17645976c089b5c41172dfad8f9e GIT binary patch literal 570 zcmV-A0>%A_P)Px$^hrcPR5*=YlQC=CKp2J}pJa#?duXw+zy*7eMnNdl8a){TT|$R!{R0hn^yHy* z3tbHT1=%`eE_mwDL74&?t;HGyQf=BHstgU1JIHsIt4XI%&wJm!?{|&AKixgR`ZCweq8LOYM2OI&*bd&4FJzi3jm6h z#%`SwCPEz(;PUz$T`pwNwo>2=0Gd<5fxiK&`qk|WfZz9X0zXHu7o`x%2G=udFvO9; z<@NbVXSP)$Y^wy|?fi_Z+ZnEB5=VvtC0un>@cgu(SZT@|Jxl}_?_VO*kZ1e$6=0*_ z@hIc*u8LQh9wwslpjc_(EKXVmgE%ti5AuVtGwl00VIr`tlEAOT^*Az!qd)4$`g4SD zj!|=(hF;GYj)uvh+O1PGXK|3!ln7Le7>_bs&r}Xe*tSYs&m>F)*>bD8s?S4zkfTdC zHK)MER9(pLwpCW=K8Q%u-IYe*=ZL`Hpg9H2&XnCcRdfIUZt_CC`S4LC=6Yr|%7I@E zjs)u2OOGU6AEaWX(Rld$YG1#`b-2DBk1|@r9-31q;cU6(ALCOBh{8QIBme*a07*qo IM6N<$f?FjB(EtDd literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/raw_iron_block.png b/MapLoader.NUnitTests/textures/blocks/raw_iron_block.png new file mode 100644 index 0000000000000000000000000000000000000000..e99a2b3a6e6e5dcda7b28ad6f27d18c2c154631a GIT binary patch literal 558 zcmV+}0@3}6P)Px$=t)FDR5*=Yl22SN#rWsZNIK3F6lrQK?-LW}F2UsfCG3f%WHIIrrH(#cI48yZ?b_yQ1w>Pv~9p1zT zJb&?$zpH<_UL~k9nM`=>Z8-V$6VEXMv|AmbD8dhRG3f%QE}7N1yq*vg3!-+EObIIu zJSTU5uLi(!K9;ZB+gii^UX5Ni7DJscUb@Y#EXnp^e;^U2t98z} zEUPPLV6Pi<*dN?^(Cfy)v79iNd!SD4VOVMK_T76-x)1{I^kOK3?N%puY1z2kjkpVS w{cWXu8H}QcQn@a}ZXIiln5?yym8>=V2Z;A$q{-gW*8l(j07*qoM6N<$g5a6@g#Z8m literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/redstone_ore.png b/MapLoader.NUnitTests/textures/blocks/redstone_ore.png index c68c77c2b7415780c8764a1376bb249107a55025..b708697055fd99ccb8e13646bfbdfbb172ac6d82 100644 GIT binary patch delta 278 zcmV+x0qOp*0a$y`KLL0>5UOGU# zagpL)(68FmZ)|N^Yu4Bq&!$y53cm_>C7~aQ?9L)1=hQFM?^EAj2f7FP8&~31f)-kp c^^NBr7tLnElMg|h{r~^~07*qoM6N<$f_BM(hX4Qo delta 277 zcmV+w0qXv-0?o)LWP4xOOerI68QJPYnYK|T~El1{YNp8LLgaerM`FYeFtoZcml z3Yz(tU;{iLzftsrr)0ghZ6d4FpNNiuH0mTzOmO>wt5iq>W`Aq}# z_lcNyHnp2*w$E{NP-@J|^&#gO?AX97TO(!XkvPSe7dvasRgSmCi>Qal8E0cdiUv5f za06ObNmz~(i)u=pLL*6F?ATzHKLBLlgVPyD*=#;}(>A4Pin0EEtDnfvV8Jgv0BDkb bK79fFgj^QHs1Ef500000NkvXXu0mjf*Dro? diff --git a/MapLoader.NUnitTests/textures/blocks/small_amethyst_bud.png b/MapLoader.NUnitTests/textures/blocks/small_amethyst_bud.png new file mode 100644 index 0000000000000000000000000000000000000000..443c2d22dd1fd9e29754e0243dc2facab01969d8 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr_~T6C_v{C!{poTVwoR z^U|K3??3-v^v#F>B&a1G7zX Z49ZhN&Zy7X%?mV-!PC{xWt~$(69BDmEXDu; literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/small_dripleaf_side.png b/MapLoader.NUnitTests/textures/blocks/small_dripleaf_side.png new file mode 100644 index 0000000000000000000000000000000000000000..28b09da6b060d4b6921c70ad1adf714cdb1ce686 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5}q!OAr}702@Fkh*be{y@gmTG e%k5wX1H(FDj>5`w+jj%iFnGH9xvXFlJI0}a5$(Ulyf}QII?X)w$e#~31>y58`g0?)7=#78053SdbZBl z6YCUCGt8K;+2_>7qhPIga1Q@z7ZquS%`gE{ONha`%9Xk$jbFxIaliq ozc3M{%PP_gnIbFniVTjegXdCJaRK;s!aUHx3vIVCg!02R|MKmY&$ literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/small_dripleaf_top.png b/MapLoader.NUnitTests/textures/blocks/small_dripleaf_top.png new file mode 100644 index 0000000000000000000000000000000000000000..34efa1fc4db58b0684b534357f47853c1ac07fcf GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar_~THD)aNEid`pL}Jke zo)(5pNt<{X9ya*MZcvkG``Bs5u;hlONTNUoTVfO2g4RJIOQ3@W&^Z@!PC{xWt~$(69AtLE3W_m literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/smoker_top.png b/MapLoader.NUnitTests/textures/blocks/smoker_top.png index 439b8c51340c1a28318aa1e6a058885b5ecc4f9c..4b5e2807d828f05ba5a1ee24bc8a1f6a8b20d416 100644 GIT binary patch delta 249 zcmVIbAm>i? zEj{!>RaFKfF#g~88>jbnzhv9GhCSxF?m1(A2A8xvms?!E_WdfQT<3X)9mi39+RNlu ztS~`9CS7_U=iUc7xF8_Nvn#U$c##uU0tZv)G);}60mO=zFLG(&sW^MElb{QUQZF9C zIp@akD~4oIg0qeg2vbYIIYNM5QNjoT0yb^*F8nKE(*;^XZ-2E>K;jz_x$pr0M0}*L z8h9Ci`x)rJch$g$2>{vrkN69lVHz1{zXSIHw^;dH5+l#r00000NkvXXu0mjfoY-!y delta 489 zcmV< z?OX6Q_xfS;R5R%ar*< z@*sNk?$hwmn1kt*+ol1)^E~Rh##+n6{e7pPu4|N1JPSkYkDqLs$E|{K5MXU9sjt3H z5`r*9O360TG({=J!F0;SYSj`brLfi#MG=cQrZ9$^qJZ;rcX8zV_*x@`aOVqS*ei@- zY%QCrB2ClZmw)e|-xETRXBkyh0Wk2jW>ZxRg&>L|cd#tWKSob-IGZu-%=WcrP#8lH zhC3Di1*H^)F${nmqwWJKWvgI2H2;G|90OgD`hSGh?VFELT;N?Tni)v|{n7ps-a2;k;ddCvE5pP5f2-ut)DoB2fE f>p5?G)EE8*H?*P5umHrETbb&08{RhaQfQnFka1TQgTasnBxXx>Qwqvx`X7J45dlky7 z9xCP~i}Wty^}Ww<0SLfEo(0y~b9#dcluTts?|rfR}osHW}&IaqZDS9EVVmjv@paU?hueD@B%Ex51j!iSo}RUTD~T$_sW z>q{H=8hz*0XX_Ro1l7uX@4qZgg7jN~{eQ?i{@J^$r=2gU`rbVW(nuHp0000+S` literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/spore_blossom.png b/MapLoader.NUnitTests/textures/blocks/spore_blossom.png new file mode 100644 index 0000000000000000000000000000000000000000..164bd293fdbe437b09691f2a2217166cce12c3e0 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8$DedLo7}wCrI3T;P++Ke+8dy z&-7JF|FXH*XNV-8zPrf*_;f#PlTV{i%lbK9QVp2phQzUc8zH3i;j-5!dFjYRz;q&?S h-pfi@Lo80OowS>`!GXtFl7p+N zErC~s%WXjd)3OBbfC+L&KTSF&`+YB#nLl~i&+IeV^?KFiMcek?4YfFG$A8=K&gJ=2 z=j?Vkp!}dPOI{(%qPdz?>qh#vs~l5RQrK2Vnn)CN#Bu$p=S(<%W&MNDfQhU^OGG(X zv?Mo7U+;Oz&Vb=vwfq;o*Zl#!Q&%5*86DYq#^r6}2i|<4wLT4kD-MP1dcR>+%+i|s g^QK0oitg*zopr0N-0%Bme*a literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/tinted_glass.png b/MapLoader.NUnitTests/textures/blocks/tinted_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1dd46e4400286c03e96a33741862c5d15dfec0 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar_~T4X$pmYwX!7%Jaa4 zC)?viqv0kQA6w>*fbgp)oR7`Ri%aOy>+9Pn<*+7g4cml8k}ZyLjnWRQ(gfIAxtULh z6qzjE(I9hHLr=lo_ztUxG(*v`h8+wdc@Ih)`WQDvD4*s&5$Lyx`@&`Jb7x$7(nOdO mB1NX9PTZ_-lka>vt?$<} z?>61#_dOiMWSRVa6PS!K1_~c4kgGVk>*5cf&-eG)fiRerSv@Hb?T9n!*spW2Wwts2 zbGWkLL#;L?b3VaDI=4eP^(BKD>bUnO`OSGC>9JO*9Gb}u~R7~ zsi=3iNV$oXca@VJb~J;07*GdSJIWzW+ea$=8|!>FzX(3`4l4Zu00000NkvXXu0mjf DDEnxs literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/weathered_copper.png b/MapLoader.NUnitTests/textures/blocks/weathered_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..10d24e1144dd2b454e6aa9ca38a14e8363a4d981 GIT binary patch literal 281 zcmV+!0p|XRP)K^{B2$llstr}o8SmlzD+z)ObccVL2`!6H86DzWE;L;G?VSULyP#<8M0llEC fkTR=Bf3J7}bSHAi%WlvD00000NkvXXu0mjfhW~c? literal 0 HcmV?d00001 diff --git a/MapLoader.NUnitTests/textures/blocks/weathered_cut_copper.png b/MapLoader.NUnitTests/textures/blocks/weathered_cut_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9ed405289bff1e7b6b212c7232805e5e15e5a0 GIT binary patch literal 284 zcmV+%0ptFOP)B3Q04hUk6gA%T1URM7 where TImage : class {"minecraft:sapling", true}, {"minecraft:bamboo_sapling", true}, {"minecraft:double_plant", true }, - {"minecraft:double_plant_grass", true }, - {"minecraft:double_plant_bottom", true }, - {"minecraft:double_plant_top", true }, {"minecraft:hopper", true }, {"minecraft:vine", true }, {"minecraft:yellow_flower", true }, @@ -163,9 +160,39 @@ public class TextureFinder where TImage : class {"minecraft:crimson_door", true}, {"minecraft:warped_wall_sign", true}, {"minecraft:crimson_wall_sign", true}, + {"minecraft:chain", true}, + {"minecraft:crimson_button", true}, + {"minecraft:crimson_fence", true}, + {"minecraft:crimson_fence_gate", true}, + {"minecraft:crimson_pressure_plate", true}, + {"minecraft:crimson_standing_sign", true}, + {"minecraft:warped_button", true}, + {"minecraft:warped_fence", true}, + {"minecraft:warped_fence_gate", true}, + {"minecraft:warped_pressure_plate", true}, + {"minecraft:warped_standing_sign", true}, + {"minecraft:weeping_vines", true}, + {"minecraft:warped_trapdoor", true}, + {"minecraft:crimson_trapdoor", true}, + + // Fixes + {"minecraft:chorus_plant", true}, + {"minecraft:cocoa", true}, + {"minecraft:polished_blackstone_button", true}, + {"minecraft:blackstone_wall", true}, + {"minecraft:polished_blackstone_wall", true}, + {"minecraft:polished_blackstone_brick_wall", true}, + {"minecraft:nether_brick_fence", true}, + {"minecraft:coral", true}, + {"minecraft:coral_fan", true}, + {"minecraft:coral_fan_dead", true}, + {"minecraft:coral_fan_hang", true}, + {"minecraft:coral_fan_hang2", true}, + {"minecraft:coral_fan_hang3", true}, + {"minecraft:sea_pickle", true}, + {"minecraft:wither_rose", true}, // Caves & Cliffs Update: Part 1 - {"minecraft:glow_item_frame", true}, {"minecraft:lightning_rod", true}, {"minecraft:small_dripleaf_block", true}, {"minecraft:big_dripleaf", true}, @@ -182,13 +209,12 @@ public class TextureFinder where TImage : class {"minecraft:deepslate_brick_wall", true}, {"minecraft:azalea_leaves", true}, {"minecraft:azalea_leaves_flowered", true}, - {"minecraft:tinted_glass", true}, + // {"minecraft:tinted_glass", true}, // better effect without {"minecraft:glow_lichen", true}, {"minecraft:glow_frame", true}, {"minecraft:cave_vines", true}, {"minecraft:cave_vines_head_with_berries", true}, - {"minecraft:cave_vines_body_with_berries", true} - + {"minecraft:cave_vines_body_with_berries", true}, }; private readonly Dictionary texturesJson; @@ -228,7 +254,8 @@ private TextureStack GetSubstitution(string name, Dictionary dat if (Debug) { - Console.WriteLine($"{x} {z} {y}: {name},{data}"); + String datastring = string.Join(", ", data.Select(kvp => kvp.Key + ": " + kvp.Value.ToString())); + Console.WriteLine($"{x} {z} {y}: {name}, {datastring}"); } @@ -236,13 +263,14 @@ private TextureStack GetSubstitution(string name, Dictionary dat switch (name) { case "cobblestone_wall": - return GetTexture("cobblestone_wall", data).Translate(5, 5, 6, 6); + return RenderWall(data, "cobblestone_wall"); case "bubble_column": - return "textures/blocks/water_placeholder"; case "water": + case "flowing_water": return "textures/blocks/water_placeholder"; case "lava": + case "flowing_lava": return "textures/blocks/lava_placeholder"; case "fire": return "textures/blocks/fire_0_placeholder"; @@ -251,47 +279,34 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "lectern": return "textures/blocks/lectern_top"; case "cake": - return GetTexture("cake_top",0); + { + int bites = (int)data.GetValueOrDefault("bite_counter", 0); + return GetTexture("cake_top", 0).Translate(1 + 2*bites, 1, 14 - 2*bites, 14); + } case "bed": { - int legacyData = LegacyGetOldDataValue(data); - switch (legacyData & 0xF7) - { - case 0: - return CreateTexture((legacyData & 8) == 8 - ? "textures/blocks/bed_head_top" - : "textures/blocks/bed_feet_top") - .Rotate(RotateFlip.Rotate90FlipNone); - case 1: - return CreateTexture((legacyData & 8) == 8 - ? "textures/blocks/bed_head_top" - : "textures/blocks/bed_feet_top") - .Rotate(RotateFlip.Rotate180FlipNone); - case 2: - return CreateTexture((legacyData & 8) == 8 + // TODO: fix bed colours + int headBit = (int)data.GetValueOrDefault("head_piece_bit", 0); + RotateFlip rot = RotateFromDirection(((int)data["direction"] + 3) % 4); + return CreateTexture(headBit != 0 ? "textures/blocks/bed_head_top" : "textures/blocks/bed_feet_top") - .Rotate(RotateFlip.Rotate270FlipNone); - case 3: - return CreateTexture((legacyData & 8) == 8 - ? "textures/blocks/bed_head_top" - : "textures/blocks/bed_feet_top") - .Rotate(RotateFlip.RotateNoneFlipNone); - } - - return null; + .Rotate(rot); } + case "planks": case "wooden_slab": - return GetTexture("planks", data); case "double_wooden_slab": - return GetTexture("planks", data); + { + int plankIndex = WoodIndexes[(string)data.GetValueOrDefault("wood_type")]; + return GetTexture("planks", plankIndex); + } case "prismarine_bricks_stairs": return GetTexture("prismarine_bricks"); case "oak_stairs": - return GetTexture("planks"); // data = direction + return GetTexture("planks", 0); // data = direction case "brick_stairs": return GetTexture("brick"); case "dark_prismarine_stairs": @@ -299,21 +314,21 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "prismarine_stairs": return GetTexture("prismarine"); // data = direction case "spruce_stairs": - return GetTexture("spruce_planks", data); + return GetTexture("spruce_planks"); case "birch_stairs": - return GetTexture("birch_planks", data); + return GetTexture("birch_planks"); case "acacia_stairs": - return GetTexture("acacia_planks", data); + return GetTexture("acacia_planks"); case "dark_oak_stairs": - return GetTexture("dark_oak_planks", data); + return GetTexture("dark_oak_planks"); case "nether_brick_stairs": - return GetTexture("nether_brick", data); + return GetTexture("nether_brick"); case "sandstone_stairs": - return GetTexture("sandstone_top", data); + return GetTexture("sandstone_top"); case "normal_stone_stairs": - return GetTexture("stone", data); + return GetTexture("stone", 0); case "jungle_stairs": - return GetTexture("planks", data); + return GetTexture("jungle_planks"); case "stone_brick_stairs": return GetTexture("stonebrick"); case "stone_stairs": @@ -338,7 +353,7 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "end_brick_stairs": return GetTexture("end_bricks", data); case "smooth_quartz_stairs": - return GetTexture("stair_quartz_block_top", data); + return GetTexture("stair_smooth_quartz_block", data); case "cauldron": return GetTexture("cauldron_inner", data) @@ -346,86 +361,52 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "carpet": return GetTexture("wool", data); case "hay_block": - return GetTexture("hayblock_top", data); + return RenderPillar("hayblock_top", "hayblock_side", data); case "hopper": return GetTexture("hopper_inside", data) + GetTexture("hopper_top", data); + + case "red_flower": + return GetTexture("red_flower", RedFlowerIndexes[(string)data.GetValueOrDefault("flower_type", "poppy")]); case "double_plant": { - int legacyData = LegacyGetOldDataValue(data); - switch (legacyData & 0x8) - { - case 8: + int legacyData = DoublePlantIndexes[(string)data.GetValueOrDefault("double_plant_type", "sunflower")]; + if ((int)data.GetValueOrDefault("upper_block_bit", 0) == 0) + return GetTexture("double_plant_bottom", legacyData & 0xF7); + else return GetTexture("double_plant_carried", legacyData & 0xF7); - case 0: - return GetTexture("double_plant_bottom", legacyData & 0xF7); } + case "waterlily": + return GetTexture("waterlily_carried"); - return null; - } case "tnt": return GetTexture("tnt_top"); case "rail": { - int legacyData = LegacyGetOldDataValue(data); - switch (legacyData) + switch ((int)data.GetValueOrDefault("rail_direction", 0)) { - case 0: - return GetTexture("rail_normal", legacyData); - case 1: - return GetTexture("rail_normal", legacyData).Rotate(RotateFlip.Rotate90FlipNone); - case 2: - return GetTexture("rail_normal", legacyData).Rotate(RotateFlip.Rotate90FlipNone); - case 3: - return GetTexture("rail_normal", legacyData).Rotate(RotateFlip.Rotate90FlipNone); - case 4: - return GetTexture("rail_normal", legacyData); - case 5: - return GetTexture("rail_normal", legacyData); case 6: - return GetTexture("rail_normal_turned", legacyData); + return GetTexture("rail_normal_turned"); case 7: - return GetTexture("rail_normal_turned", legacyData).Rotate(RotateFlip.Rotate90FlipNone); + return GetTexture("rail_normal_turned").Rotate(RotateFlip.Rotate90FlipNone); case 8: - return GetTexture("rail_normal_turned", legacyData).Rotate(RotateFlip.Rotate180FlipNone); + return GetTexture("rail_normal_turned").Rotate(RotateFlip.Rotate180FlipNone); case 9: - return GetTexture("rail_normal_turned", legacyData).Rotate(RotateFlip.Rotate270FlipNone); + return GetTexture("rail_normal_turned").Rotate(RotateFlip.Rotate270FlipNone); } - - return null; + return RenderRail("rail_normal", data); } case "golden_rail": - { - int legacyData = LegacyGetOldDataValue(data); - if ((legacyData & 8) == 8) - return RenderRail(legacyData & 0xF7, "rail_golden_powered"); - else - return RenderRail(legacyData, "rail_golden"); - } + return RenderRail("rail_golden", "rail_golden_powered", data); case "activator_rail": - { - int legacyData = LegacyGetOldDataValue(data); - if ((legacyData & 8) == 8) - return RenderRail(legacyData & 0xF7, "rail_activator"); - else - return RenderRail(legacyData, "rail_activator"); - } - - + return RenderRail("rail_activator", "rail_activator_powered", data); case "detector_rail": - { - int legacyData = LegacyGetOldDataValue(data); - if ((legacyData & 8) == 8) - return RenderRail(legacyData & 0xF7, "rail_detector_powered"); - else - return RenderRail(legacyData, "rail_detector"); - } + return RenderRail("rail_detector", "rail_detector_powered", data); + case "stonebrick": + return GetTexture("stonebrick", StoneBrickIndexes[(string)data["stone_brick_type"]]); case "monster_egg": - { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture("monster_egg", Math.Max(0, legacyData - 1)); - } + return GetTexture("monster_egg", MonsterEggIndexes[(string)data["monster_egg_stone_type"]]); case "red_mushroom_block": return GetTexture("mushroom_red_top", data); @@ -451,75 +432,80 @@ private TextureStack GetSubstitution(string name, Dictionary dat return GetTexture("stained_glass_pane_top", data); case "redstone_torch": return GetTexture("redstone_torch_on", data); + case "unlit_redstone_torch": + return GetTexture("redstone_torch_off", data); case "redstone_wire": return GetTexture("redstone_dust_cross", data); case "lit_redstone_ore": return GetTexture("redstone_ore", data); case "unpowered_repeater": - return GetTexture("repeater_up", data); + { + int dir = ((int)data.GetValueOrDefault("direction") + 2) % 4; + return GetTexture("repeater_up", 0, null, RotateFromDirection(dir)); + } + case "powered_repeater": + { + int dir = ((int)data.GetValueOrDefault("direction") + 2) % 4; + return GetTexture("repeater_up", 1, null, RotateFromDirection(dir)); + } case "daylight_detector": - return GetTexture("daylight_detector_top", data); + return GetTexture("daylight_detector_top", 0); case "daylight_detector_inverted": - return GetTexture("daylight_detector_top", data); + return GetTexture("daylight_detector_top", 1); case "dispenser": { - int legacyData = LegacyGetOldDataValue(data); - switch ((BlockFace) legacyData) + switch ((BlockFace) data["facing_direction"]) { case BlockFace.Up: return GetTexture("dispenser_front_vertical"); default: - return GetTexture("dispenser_top", legacyData); + return GetTexture("dispenser_top"); } } - case "observer": { - int legacyData = LegacyGetOldDataValue(data); - switch ((BlockFace) legacyData) + int powered = (int)data.GetValueOrDefault("powered_bit", 0); + switch ((BlockFace) data["facing_direction"]) { case BlockFace.Down: - return GetTexture("observer_south"); + return GetTexture("observer_south", powered); case BlockFace.Up: - return GetTexture("observer_north"); + return GetTexture("observer_north", powered); case BlockFace.North: - return GetTexture("observer_top", 0, null, RotateFlip.Rotate180FlipNone); + return GetTexture("observer_top", powered, null, RotateFlip.Rotate180FlipNone); case BlockFace.South: - return GetTexture("observer_top"); + return GetTexture("observer_top", powered); case BlockFace.West: - return GetTexture("observer_top", 0, null, RotateFlip.Rotate90FlipNone); + return GetTexture("observer_top", powered, null, RotateFlip.Rotate90FlipNone); case BlockFace.East: - return GetTexture("observer_top", 0, null, RotateFlip.Rotate270FlipNone); + return GetTexture("observer_top", powered, null, RotateFlip.Rotate270FlipNone); } - - return GetTexture("observer_top", legacyData); + return GetTexture("observer_top"); } - case "dropper": { - int legacyData = LegacyGetOldDataValue(data); - switch ((BlockFace) legacyData) + switch ((BlockFace) data["facing_direction"]) { case BlockFace.Up: return GetTexture("dropper_front_vertical"); default: - return GetTexture("dropper_top", legacyData); + return GetTexture("dropper_top"); } } case "smoker": + case "lit_smoker": return GetTexture("smoker_top"); case "barrel": { - int legacyData = LegacyGetOldDataValue(data); - switch ((BlockFace)legacyData) + switch ((BlockFace)data["facing_direction"]) { case BlockFace.Up: return GetTexture("barrel_top"); case BlockFace.Down: return GetTexture("barrel_bottom"); default: - return GetTexture("barrel_side", legacyData); + return GetTexture("barrel_side", data); } } case "bell": @@ -533,45 +519,54 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "ender_chest": return GetTexture("ender_chest_inventory_top", data); case "anvil": - return GetTexture("anvil_top_damaged_x", data); + { + int damage = 0; + switch ((string)data["damage"]) + { + case "slightly_damaged": + damage = 1; break; + case "very_damaged": + damage = 2; break; + } + return GetTexture("anvil_top_damaged_x", damage, null, RotateFromDirection(data)); + } case "cactus": return GetTexture("cactus_top", data).Translate(1, 1, 14, 14); case "dark_oak_pressure_plate": - return GetTexture("dark_oak_planks", 0).Translate(1, 1, 14, 14); + return RenderPressurePlate("dark_oak_planks", data); case "birch_pressure_plate": - return GetTexture("birch_planks", 0).Translate(1, 1, 14, 14); + return RenderPressurePlate("birch_planks", data); case "jungle_pressure_plate": - return GetTexture("jungle_planks", 0).Translate(1, 1, 14, 14); + return RenderPressurePlate("jungle_planks", data); case "acacia_pressure_plate": - return GetTexture("acacia_planks", 0).Translate(1, 1, 14, 14); + return RenderPressurePlate("acacia_planks", data); case "wooden_pressure_plate": - return GetTexture("planks", data).Translate(1, 1, 14, 14); + return RenderPressurePlate("planks", data); case "spruce_pressure_plate": - return GetTexture("spruce_planks", data).Translate(1, 1, 14, 14); + return RenderPressurePlate("spruce_planks", data); case "light_weighted_pressure_plate": - return GetTexture("gold_block", data).Translate(1, 1, 14, 14); + return RenderPressurePlate("gold_block", data); case "heavy_weighted_pressure_plate": - return GetTexture("iron_block", data).Translate(1, 1, 14, 14); + return RenderPressurePlate("iron_block", data); case "stone_pressure_plate": - return GetTexture("stone", data).Translate(1, 1, 14, 14); - ; + return RenderPressurePlate("stone", data); case "frame": - return RenderFrame(data, "sign"); + return RenderItemFrame(data, "itemframe_background"); case "standing_sign": - return RenderSign("sign"); + return RenderSign(data, "sign"); case "spruce_standing_sign": - return RenderSign("spruce_sign"); + return RenderSign(data, "spruce_sign"); case "birch_standing_sign": - return RenderSign("birch_sign"); + return RenderSign(data, "birch_sign"); case "jungle_standing_sign": - return RenderSign("acacia_sign"); + return RenderSign(data, "jungle_sign"); case "acacia_standing_sign": - return RenderSign("jungle_sign"); + return RenderSign(data, "acacia_sign"); case "darkoak_standing_sign": - return RenderSign("darkoak_sign"); + return RenderSign(data, "darkoak_sign"); case "fence_gate": return RenderFenceGate(data, "planks"); @@ -587,13 +582,10 @@ private TextureStack GetSubstitution(string name, Dictionary dat return RenderFenceGate(data, "dark_oak_planks"); case "nether_brick_fence": - return GetTexture("nether_brick", 0, new TextureTranslation( - new Rect(5, 5, 6, 6), - new Rect(0, 0, 16, 16))); + return RenderFence("nether_brick", data); case "fence": - return GetTexture("planks", data, new TextureTranslation( - new Rect(5, 5, 6, 6), - new Rect(0, 0, 16, 16))); + data["val"] = WoodIndexes[(string)data.GetValueOrDefault("wood_type")]; + return RenderFence("planks", data); case "podzol": return GetTexture("dirt_podzol_top", data); case "grass": @@ -648,11 +640,14 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "stained_hardened_clay": return GetTexture("stained_clay", data); - - - case "end_portal_frame": - return GetTexture("endframe_top"); + { + RotateFlip rot = RotateFromDirection(data); + TextureStack t = GetTexture("endframe_top", 0, null, rot); + if ((int)data.GetValueOrDefault("end_portal_eye_bit", 0) != 0) + t += GetTexture("endframe_eye", 0).Translate(4, 4, 8, 8).Rotate(rot); + return t; + } case "wooden_door": return GetTexture("door_upper"); @@ -685,7 +680,7 @@ private TextureStack GetSubstitution(string name, Dictionary dat return RenderButton(data, "jungle_planks"); case "wall_banner": case "standing_banner": - return RenderSign("sign"); + return RenderSign(data, "sign"); case "tripWire": return GetTexture("trip_wire", data); case "tripwire_hook": @@ -700,19 +695,39 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "birch_wall_sign": case "jungle_wall_sign": case "acacia_wall_sign": + case "warped_wall_sign": + case "crimson_wall_sign": return RenderWallSign(data, name.Replace("wall_", "")); case "melon_block": return GetTexture("melon_top", data); case "quartz_block": - return GetTexture("quartz_block_top", data); + { + switch ((string)data.GetValueOrDefault("chisel_type", "default")) + { + case "chiseled": + data["val"] = 1; break; + case "lines": + data["val"] = 2; break; + case "smooth": + data["val"] = 3; break; + } + return RenderPillar("quartz_block_top", "quartz_block_side", data); + } case "seaLantern": return GetTexture("sea_lantern", data); case "purpur_block": - return GetTexture("purpur_block_side", data); + { + switch ((string)data.GetValueOrDefault("chisel_type", "default")) + { + case "lines": + data["val"] = 2; break; + } + return RenderPillar("purpur_block_top", "purpur_block_side", data); + } case "turtle_egg": return GetTexture("turtle_egg", 0).Translate( @@ -735,9 +750,10 @@ private TextureStack GetSubstitution(string name, Dictionary dat return RenderPiston(data, "sticky"); case "jukebox": return GetTexture("jukebox_top", data); - case "stonecutter_block": case "stonecutter": return GetTexture("stonecutter_top", data); + case "stonecutter_block": + return GetTexture("stonecutter2_top", data); case "loom": return GetTexture("loom_top", data); case "smithing_table": @@ -755,36 +771,27 @@ private TextureStack GetSubstitution(string name, Dictionary dat return GetTexture("undyed_shulker_box_top", data); case "red_sandstone": + // sand_stone_type makes no difference to top return GetTexture("redsandstone_top", data); case "sandstone": + // sand_stone_type makes no difference to top return GetTexture("sandstone_top", data); case "stone_slab": - return GetTexture("stone_slab_top", data); - + case "double_stone_slab": + return GetTexture("stone_slab_top", StoneSlabIndexes[1][(string)data["stone_slab_type"]]); case "stone_slab2": - return GetTexture("stone_slab_top_2", data); case "double_stone_slab2": - return GetTexture("stone_slab_top_2", data); + return GetTexture("stone_slab_top_2", StoneSlabIndexes[2][(string)data["stone_slab_type_2"]]); case "stone_slab3": - - return GetTexture("stone_slab_top_3", data); case "double_stone_slab3": - return GetTexture("stone_slab_top_3", data); - + return GetTexture("stone_slab_top_3", StoneSlabIndexes[3][(string)data["stone_slab_type_3"]]); case "stone_slab4": - return GetTexture("stone_slab_top_4", data); case "double_stone_slab4": - return GetTexture("stone_slab_top_4", data); - - - case "double_stone_slab": - return GetTexture("stone_slab_top", data); - + return GetTexture("stone_slab_top_4", StoneSlabIndexes[4][(string)data["stone_slab_type_4"]]); case "bone_block": - return GetTexture("bone_block_top", data); - + return RenderPillar("bone_block_top", "bone_block_side", data); case "mycelium": return GetTexture("mycelium_top", data); @@ -800,12 +807,6 @@ private TextureStack GetSubstitution(string name, Dictionary dat new Rect(0, 0, 4, 16) )); - case "powered_repeater": - return GetTexture("repeater_up", data); - - case "unlit_redstone_torch": - return GetTexture("redstone_torch_off", data); - case "lit_furnace": return GetTexture("redstone_torch_off", data); @@ -830,84 +831,144 @@ private TextureStack GetSubstitution(string name, Dictionary dat /* LEAVES */ case "leaves": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture("leaves_carried", legacyData & 0xF7); + int val = WoodIndexes[(string)data.GetValueOrDefault("old_leaf_type", "oak")]; + return GetTexture("leaves_carried", val); } case "leaves2": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture("leaves_carried2", legacyData & 0xF7); + int val = WoodIndexes[(string)data.GetValueOrDefault("new_leaf_type", "acacia")] - 4; + return GetTexture("leaves_carried2", val); } /* WOOD */ case "wood": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture("wood", (legacyData & 0xFFF7) * 2 + ((legacyData & 0x8) / 8)); + int plankIndex = WoodIndexes[(string)data.GetValueOrDefault("wood_type", "oak")]; + int strippedBit = (int)data.GetValueOrDefault("stripped_bit", 0); + data["val"] = plankIndex * 2 + strippedBit; + return RenderPillar("wood", data); } case "stripped_jungle_log": - { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture((legacyData & 2) == 0 ? "stripped_jungle_log_top" : "stripped_jungle_log_side", legacyData); - } + return RenderPillar("stripped_jungle_log_top", "stripped_jungle_log_side", data); case "stripped_spruce_log": - { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture((legacyData & 2) == 0 ? "stripped_spruce_log_top" : "stripped_spruce_log_side", legacyData); - } + return RenderPillar("stripped_spruce_log_top", "stripped_spruce_log_side", data); case "stripped_birch_log": - { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture((legacyData & 2) == 0 ? "stripped_birch_log_top" : "stripped_birch_log_side", legacyData); - } + return RenderPillar("stripped_birch_log_top", "stripped_birch_log_side", data); case "stripped_dark_oak_log": + return RenderPillar("stripped_dark_oak_log_top", "stripped_dark_oak_log_side", data); + case "stripped_oak_log": + return RenderPillar("stripped_oak_log_top", "stripped_oak_log_side", data); + case "stripped_acacia_log": + return RenderPillar("stripped_acacia_log_top", "stripped_acacia_log_side", data); + + case "log": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture((legacyData & 2) == 0 ? "stripped_dark_oak_log_top" : "stripped_dark_oak_log_side", - legacyData); + data["val"] = WoodIndexes[(string)data.GetValueOrDefault("old_log_type", "oak")]; + return RenderPillar("log_top", "log_side", data); } - case "stripped_oak_log": + case "log2": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture((legacyData & 2) == 0 ? "stripped_oak_log_top" : "stripped_oak_log_side", legacyData); + data["val"] = WoodIndexes[(string)data.GetValueOrDefault("new_log_type", "acacia")] - 4; + return RenderPillar("log_top2", "log_side2", data); } - case "stripped_acacia_log": + + case "sapling": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture((legacyData & 2) == 0 ? "stripped_acacia_log_top" : "stripped_acacia_log_side", legacyData); + int val = WoodIndexes[(string)data.GetValueOrDefault("sapling_type")]; + return GetTexture("sapling", val); } case "enchanting_table": return GetTexture("enchanting_table_top", data); - case "log": + + case "coral_block": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture((legacyData & 8) == 0 ? "log_top" : "log_side", legacyData & 3); + int dead = (int)data.GetValueOrDefault("dead_bit", 0); + int coralIndex = CoralIndexes[(string)data["coral_color"]]; + return GetTexture("coral_block", coralIndex + dead * 5); } - case "log2": + case "coral": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture((legacyData & 8) == 0 ? "log_top2" : "log_side2", legacyData & 3); + int dead = (int)data.GetValueOrDefault("dead_bit", 0); + int coralIndex = CoralIndexes[(string)data["coral_color"]]; + return GetTexture("coral", coralIndex + dead * 5); + } + case "coral_fan": + { + int coralIndex = CoralIndexes[(string)data["coral_color"]]; + Rect srcRect = new Rect(0, 6, 16, 8); + Rect destRect = new Rect(0, 0, 16, 8); + return GetTexture("coral_fan", coralIndex).Translate(srcRect, destRect) + + GetTexture("coral_fan", coralIndex).Translate(srcRect, destRect).Rotate(RotateFlip.Rotate90FlipNone) + + GetTexture("coral_fan", coralIndex).Translate(srcRect, destRect).Rotate(RotateFlip.Rotate180FlipNone) + + GetTexture("coral_fan", coralIndex).Translate(srcRect, destRect).Rotate(RotateFlip.Rotate270FlipNone); + } + case "coral_fan_dead": + { + int coralIndex = CoralIndexes[(string)data["coral_color"]]; + Rect srcRect = new Rect(0, 6, 16, 8); + Rect destRect = new Rect(0, 0, 16, 8); + return GetTexture("coral_fan_dead", coralIndex).Translate(srcRect, destRect) + + GetTexture("coral_fan_dead", coralIndex).Translate(srcRect, destRect).Rotate(RotateFlip.Rotate90FlipNone) + + GetTexture("coral_fan_dead", coralIndex).Translate(srcRect, destRect).Rotate(RotateFlip.Rotate180FlipNone) + + GetTexture("coral_fan_dead", coralIndex).Translate(srcRect, destRect).Rotate(RotateFlip.Rotate270FlipNone); } - case "coral_fan_hang": - return GetTexture("coral_fan_hang_a", data); + { + int dead = (int)data.GetValueOrDefault("dead_bit", 0); + int coralType = (int)data.GetValueOrDefault("coral_hang_type_bit", 0); + RotateFlip rot = CoralRotations[(int)data.GetValueOrDefault("coral_direction", 0)]; + return GetTexture("coral_fan_hang_a", coralType + dead * 2, null, rot); + } case "coral_fan_hang2": - return GetTexture("coral_fan_hang_b", data); + { + int dead = (int)data.GetValueOrDefault("dead_bit", 0); + int coralType = (int)data.GetValueOrDefault("coral_hang_type_bit", 0); + RotateFlip rot = CoralRotations[(int)data.GetValueOrDefault("coral_direction", 0)]; + return GetTexture("coral_fan_hang_b", coralType + dead * 2, null, rot); + } case "coral_fan_hang3": - return GetTexture("coral_fan_hang_c", data); + { + int dead = (int)data.GetValueOrDefault("dead_bit", 0); + int coralType = (int)data.GetValueOrDefault("coral_hang_type_bit", 0); + RotateFlip rot = CoralRotations[(int)data.GetValueOrDefault("coral_direction", 0)]; + return GetTexture("coral_fan_hang_c", coralType + dead * 2, null, rot); + } case "scaffolding": return GetTexture("scaffolding_top", data); case "grindstone": return GetTexture("grindstone_pivot", data); + + case "beetroot": + { + int growth = (int)data.GetValueOrDefault("growth", 0) % 8; + return GetTexture("beetroot", GrowthEightToFour[growth]); + } + case "carrots": + { + int growth = (int)data.GetValueOrDefault("growth", 0) % 8; + return GetTexture("carrots", GrowthEightToFour[growth]); + } + case "potatoes": + { + int growth = (int)data.GetValueOrDefault("growth", 0) % 8; + return GetTexture("potatoes", GrowthEightToFour[growth]); + } case "sweet_berry_bush": { - int legacyData = LegacyGetOldDataValue(data); - return GetTexture($"sweet_berry_bush_{legacyData%4}"); + int growth = (int)data.GetValueOrDefault("growth", 0); + if (growth > 3) growth = 3; + return GetTexture($"sweet_berry_bush_{growth}"); + } + case "wheat": + { + int growth = (int)data.GetValueOrDefault("growth", 0); + return GetTexture("wheat", growth); } + case "bee_nest": return GetTexture("bee_nest_top", data); case "beehive": @@ -929,9 +990,13 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "warped_nylium": return GetTexture("warped_nylium_top", data); case "crimson_stem": - return GetTexture("stripped_crimson_stem_top", data); + return RenderPillar("crimson_log_top", "crimson_log_side", data); + case "stripped_crimson_stem": + return RenderPillar("stripped_crimson_stem_top", "stripped_crimson_stem_side", data); case "warped_stem": - return GetTexture("stripped_warped_stem_top", data); + return RenderPillar("warped_stem_top", "warped_stem_side", data); + case "stripped_warped_stem": + return RenderPillar("stripped_warped_stem_top", "stripped_warped_stem_side", data); case "warped_fungus": return GetTexture("nether_shroom_blue", data); case "crimson_fungus": @@ -942,9 +1007,9 @@ private TextureStack GetSubstitution(string name, Dictionary dat return GetTexture("soul_fire_0", data); case "basalt": - return GetTexture("basalt_top", data); + return RenderPillar("basalt_top", "basalt_side", data); case "polished_basalt": - return GetTexture("polished_basalt_top", data); + return RenderPillar("polished_basalt_top", "polished_basalt_side", data); case "blackstone": return GetTexture("blackstone_top", data); @@ -953,31 +1018,131 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "blackstone_stairs": return GetTexture("blackstone_top", data); case "blackstone_wall": - return GetTexture("blackstone_top", data); + return RenderWall(data, "blackstone_top"); case "polished_blackstone_slab": return GetTexture("polished_blackstone", data); case "polished_blackstone_stairs": return GetTexture("polished_blackstone", data); case "polished_blackstone_wall": - return GetTexture("polished_blackstone", data); + return RenderWall(data, "polished_blackstone"); case "polished_blackstone_brick_slab": return GetTexture("polished_blackstone_bricks", data); case "polished_blackstone_brick_stairs": return GetTexture("polished_blackstone_bricks", data); case "polished_blackstone_brick_wall": - return GetTexture("polished_blackstone_bricks", data); + return RenderWall(data, "polished_blackstone_bricks"); case "warped_door": return GetTexture("warped_door_top", data); case "crimson_door": return GetTexture("crimson_door_top", data); - case "warped_wall_sign": - return RenderWallSign(data, name.Replace("wall_", "")); - case "crimson_wall_sign": - return RenderWallSign(data, name.Replace("wall_", "")); + // some fixes + case "ancient_debris": + return GetTexture("ancient_debris_top"); + case "beacon": + // TODO: add shell + base + return GetTexture("beacon"); + case "blackstone_double_slab": + return GetTexture("blackstone"); + case "blast_furnace": + case "lit_blast_furnace": + return GetTexture("blast_furnace_top"); + case "bookshelf": + return GetTexture("planks"); + case "calcite": + return GetTexture("calcite"); + case "chorus_flower": + return GetTexture("chorus_flower", (int)data["age"] > 4 ? 1 : 0); + case "crimson_button": + return RenderButton(data, "crimson_planks"); + case "crimson_double_slab": + case "crimson_slab": + case "crimson_stairs": + return GetTexture("crimson_planks"); + case "crimson_fence": + return RenderFence("crimson_planks", data); + case "crimson_fence_gate": + return RenderFenceGate(data, "crimson_planks"); + case "crimson_hyphae": + return RenderPillar("crimson_log_side", data); + case "crimson_pressure_plate": + return RenderPressurePlate("crimson_planks", data); + case "crimson_standing_sign": + return RenderSign(data, "crimson_sign"); + case "lava_cauldron": + // TODO: add lava + return GetTexture("cauldron_top"); + case "lodestone": + return GetTexture("lodestone_top"); + case "polished_blackstone_button": + return RenderButton(data, "polished_blackstone"); + case "polished_blackstone_double_slab": + return GetTexture("polished_blackstone"); + case "polished_blackstone_pressure_plate": + return RenderPressurePlate("polished_blackstone", data); + case "polished_blackstone_brick_double_slab": + return GetTexture("polished_blackstone_bricks"); + case "respawn_anchor": + return GetTexture("respawn_anchor_top", (int)data["respawn_anchor_charge"]).Translate(0, 0, 16, 16); + case "soul_campfire": + return GetTexture("soul_campfire_log_lit", 0).Translate(0, 0, 16, 16); + case "stripped_crimson_hyphae": + return RenderPillar("stripped_crimson_stem_side", data); + case "stripped_warped_hyphae": + return RenderPillar("stripped_warped_stem_side", data); + case "target": + return GetTexture("target_top"); + case "warped_button": + return RenderButton(data, "warped_planks"); + case "warped_double_slab": + case "warped_slab": + case "warped_stairs": + return GetTexture("warped_planks"); + case "warped_fence": + return RenderFence("warped_planks", data); + case "warped_fence_gate": + return RenderFenceGate(data, "warped_planks"); + case "warped_hyphae": + return RenderPillar("warped_stem_side", data); + case "warped_pressure_plate": + return RenderPressurePlate("warped_planks", data); + case "warped_standing_sign": + return RenderSign(data, "warped_sign"); + case "weeping_vines": + return GetTexture("weeping_vines_base"); + case "lantern": + // TODO: support ceiling + return RenderLantern(data, "lantern"); + case "soul_lantern": + return RenderLantern(data, "soul_lantern"); + case "sea_pickle": + // TODO: number of pickles + return GetTexture("sea_pickle", data).Translate( + new Rect(0, 0, 4, 11), // 11 might not be the right number + new Rect(6, 5, 4, 11)); + case "sponge": + return GetTexture("sponge", (string)data["sponge_type"] == "wet" ? 1 : 0); + case "stone": + { + int index = StoneIndexes[(string)data.GetValueOrDefault("stone_type", "stone")]; + return GetTexture("stone", index); + } + case "sand": + { + string sand_type = (string)data.GetValueOrDefault("sand_type", "normal"); + return GetTexture("sand", sand_type == "red" ? 1 : 0); + } + case "vine": + return GetTexture("vine_carried"); + // TODO: fix string textures + + case "chain": + return RenderChain(data); + case "end_rod": + return RenderEndRod(data); // Caves & Cliffs Update: Part 1 (1.17) case "waxed_oxidized_cut_copper_stairs": @@ -1022,13 +1187,13 @@ private TextureStack GetSubstitution(string name, Dictionary dat return GetTexture("copper_block", data); case "cobbled_deepslate_wall": - return GetTexture("cobbled_deepslate", data).Translate(5, 5, 6, 6); + return RenderWall(data, "cobbled_deepslate"); case "deepslate_tile_wall": - return GetTexture("deepslate_tiles", data).Translate(5, 5, 6, 6); + return RenderWall(data, "deepslate_tiles"); case "polished_deepslate_wall": - return GetTexture("polished_deepslate", data).Translate(5, 5, 6, 6); + return RenderWall(data, "polished_deepslate"); case "deepslate_brick_wall": - return GetTexture("deepslate_bricks", data).Translate(5, 5, 6, 6); + return RenderWall(data, "deepslate_bricks"); case "cobbled_deepslate_stairs": case "cobbled_deepslate_slab": case "cobbled_deepslate_double_slab": @@ -1045,15 +1210,16 @@ private TextureStack GetSubstitution(string name, Dictionary dat case "deepslate_brick_stairs": case "deepslate_brick_double_slab": return GetTexture("deepslate_bricks", data); + case "deepslate": case "infested_deepslate": - return GetTexture("deepslate", data); + return RenderPillar("deepslate_top", "deepslate", data); case "lit_deepslate_redstone_ore": return GetTexture("deepslate_redstone_ore", data); case "glow_frame": - return RenderGlowItemFrame(data); + return RenderItemFrame(data, "glow_item_frame"); case "small_dripleaf_block": return RenderSmallDripleaf(data); case "moss_carpet": @@ -1089,35 +1255,49 @@ private TextureStack GetSubstitution(string name, Dictionary dat return null; } - private TextureStack RenderWallSign(Dictionary data, string texture) + private TextureStack RenderWallSign (Dictionary data, string texture) + { + return RenderWallSign(texture, data); + } + private TextureStack RenderWallSign (string texture, Dictionary data) { - var t = GetTexture(texture, 0).Translate( + return GetTexture(texture, data).Translate( new Rect(0, 7, 14, 2), new Rect(1, 0, 14, 2) ); - switch (LegacyGetOldDataValue(data)) + } + + private TextureStack RenderChain(Dictionary data) + { + var t = GetTexture("chain1", 0).Translate(new Rect(0, 0, 3, 16), new Rect(6, 0, 4, 16)); + + try { - case 0: - return t.Rotate(RotateFlip.Rotate270FlipNone); - case 1: - return t.Rotate(RotateFlip.Rotate90FlipNone); - case 2: - return t.Rotate(RotateFlip.Rotate180FlipNone); - case 3: - return t.Rotate(RotateFlip.RotateNoneFlipNone); - case 4: - return t.Rotate(RotateFlip.Rotate90FlipNone); - case 5: - return t.Rotate(RotateFlip.Rotate270FlipNone); + string dir = (string)data["pillar_axis"]; + switch (dir) + { + case "x": + return t.Rotate(RotateFlip.Rotate90FlipNone); + case "y": + return GetTexture("chain2", data).Translate(new Rect(0, 6, 4, 3), new Rect(7, 7, 4, 3)); + } + } + catch + { + Console.WriteLine("Invalid parameters for chain1"); } - return null; + return t; } - - private TextureStack RenderRail(int data, string texture) + private TextureStack RenderRail (string texture_off, string texture_on, Dictionary data) + { + string texture = (int)data.GetValueOrDefault("rail_data_bit", 0) == 0 ? texture_off : texture_on; + return RenderRail(texture, data); + } + private TextureStack RenderRail (string texture, Dictionary data) { - switch (data) + switch ((int)data.GetValueOrDefault("rail_direction", 0)) { case 0: return GetTexture(texture, data); @@ -1136,133 +1316,103 @@ private TextureStack RenderRail(int data, string texture) return null; } - private TextureStack RenderSign(string texture) + private TextureStack RenderSign (Dictionary data, string texture) + { + return RenderSign(texture, data); + } + private TextureStack RenderSign(string texture, Dictionary data) { + // TODO: rotation return GetTexture(texture, 0).Translate( new Rect(0, 7, 14, 2), new Rect(1, 7, 14, 2) ); } - private TextureStack RenderFrame(Dictionary data, string texture) + private TextureStack RenderButton (Dictionary data, string texture) { - var t = GetTexture(texture, 0).Translate( - new Rect(0, 7, 14, 2), - new Rect(1, 0, 14, 2) - ); - switch (LegacyGetOldDataValue(data)) - { - case 0: - return t.Rotate(RotateFlip.Rotate270FlipNone); - case 1: - return t.Rotate(RotateFlip.Rotate90FlipNone); - case 3: - return t.Rotate(RotateFlip.Rotate180FlipNone); - case 2: - return t.Rotate(RotateFlip.RotateNoneFlipNone); - } - - return t; + return RenderButton(texture, data); } - - private TextureStack RenderButton(Dictionary data, string texture) + private TextureStack RenderButton(string texture, Dictionary data) { - int legacyData = LegacyGetOldDataValue(data); - var t = GetTexture(texture, 0).Translate( - new Rect(6, 6, 4, 3), - new Rect(6, 0, 4, 3) - ); - if ((legacyData & 8) == 8) + int direction = (int)data["facing_direction"]; + var t = GetTexture(texture, 0); + int thickness = (int)data.GetValueOrDefault("button_pressed_bit", 0) == 0 ? 2 : 1; + switch (direction) { - // Per https://minecraft.gamepedia.com/Button : 0x8 If this bit is set, the button is currently active - // Active/Unactive, on the scale rendering, doesn't matter, so remove that bit - legacyData = legacyData ^ 8; - } - switch (legacyData) - { - - case 1: - return t.Translate( - new Rect(6, 6, 4, 4), - new Rect(6, 6, 4, 4)); - case 2: - return t.Rotate(RotateFlip.Rotate180FlipNone); - - case 3: - return t.Rotate(RotateFlip.RotateNoneFlipNone); - case 4: - return t.Rotate(RotateFlip.Rotate90FlipNone); case 0: // 0: Button on block bottom facing down. Assuming bottom = top - case 5: // 5: Button on block top facing up - return t.Rotate(RotateFlip.Rotate270FlipNone); + case 1: // 1: Button on block top facing up + return t.Translate(new Rect(5, 6, 6, 4)); + case 2: // north + return t.Translate(new Rect(5, 16 - thickness, 6, thickness)); + case 3: // south + return t.Translate(new Rect(5, 0, 6, thickness)); + case 4: // east + return t.Translate(new Rect(16 - thickness, 5, thickness, 6)); + case 5: // west + return t.Translate(new Rect(0, 5, thickness, 6)); default: return null; } } - private TextureStack RenderFenceGate(Dictionary data, string texture) + private TextureStack RenderFence (Dictionary data, string texture) + { + return RenderFence(texture, data); + } + private TextureStack RenderFence (string texture, Dictionary data) + { + TextureStack full = GetTexture(texture, data).Translate(6, 6, 4, 4); + // TODO: sides? 2px + return full; + } + + private TextureStack RenderFenceGate (Dictionary data, string texture) { - int legacyData = LegacyGetOldDataValue(data); - if ((legacyData & 8) == 8) + return RenderFenceGate(texture, data); + } + private TextureStack RenderFenceGate (string texture, Dictionary data) + { + int direction = (int)data["direction"]; + int open_bit = (int)data["open_bit"]; + + if (open_bit != 0) { - // Per https://minecraft.gamepedia.com/Fence_Gate : 0x8 If 1, the gate is lowered by three pixels, to accommodate attaching more cleanly with normal and mossy Cobblestone Walls - // 3 pixels, on the scale rendering, doesn't matter, so remove that bit - legacyData = legacyData ^ 8; - } - switch (legacyData) + switch (direction) { case 0: - case 2: - return GetTexture(texture, 0).Translate(new Rect(0, 6, 16, 4)); - case 1: - case 3: - return GetTexture(texture, 0).Translate(new Rect(0, 6, 16, 4)).Rotate(RotateFlip.Rotate90FlipNone); - - case 4: return GetTexture(texture, 0) .Translate( - new Rect(0, 6, 10, 4), - new Rect(6, 0, 10, 4)) - .Rotate(RotateFlip.Rotate90FlipNone) - + new Rect(0, 7, 2, 9)) + GetTexture(texture, 0) .Translate( - new Rect(0, 6, 10, 4), - new Rect(6, 12, 10, 4)) - .Rotate(RotateFlip.Rotate90FlipNone); - case 6: + new Rect(14, 7, 2, 9)); + case 2: return GetTexture(texture, 0) .Translate( - new Rect(0, 6, 10, 4), - new Rect(6, 0, 10, 4)) - .Rotate(RotateFlip.Rotate270FlipNone) - + new Rect(0, 0, 2, 9)) + GetTexture(texture, 0) .Translate( - new Rect(0, 6, 10, 4), - new Rect(6, 12, 10, 4)) - .Rotate(RotateFlip.Rotate270FlipNone); - case 5: - return GetTexture(texture, 0) - .Translate( - new Rect(0, 6, 10, 4), - new Rect(6, 0, 10, 4)) - .Rotate(RotateFlip.Rotate180FlipNone) - - + GetTexture(texture, 0) - .Translate( - new Rect(0, 6, 10, 4), - new Rect(6, 12, 10, 4)) - .Rotate(RotateFlip.Rotate180FlipNone); - - case 7: - return GetTexture(texture, 0).Translate( - new Rect(0, 6, 10, 4), - new Rect(6, 0, 10, 4)) - + GetTexture(texture, 0).Translate( - new Rect(0, 6, 10, 4), - new Rect(6, 12, 10, 4)); - + new Rect(14, 0, 2, 9)); + case 1: + return GetTexture(texture, 0).Translate(new Rect(0, 0, 9, 2)) + + GetTexture(texture, 0).Translate(new Rect(0, 14, 9, 2)); + case 3: + return GetTexture(texture, 0).Translate(new Rect(7, 0, 9, 2)) + + GetTexture(texture, 0).Translate(new Rect(7, 14, 9, 2)); + } + } + else + { + switch (direction) + { + case 0: + case 2: + return GetTexture(texture, 0).Translate(new Rect(0, 7, 16, 2)); + case 1: + case 3: + return GetTexture(texture, 0).Translate(new Rect(7, 0, 2, 16)); + } } return null; @@ -1309,22 +1459,16 @@ private TextureStack RenderTripwireHook(Dictionary data, string Console.WriteLine("Invalid " + texture +" direction"); } - switch (dir) - { - case 0: - return t.Rotate(RotateFlip.Rotate180FlipNone); - case 1: - return t.Rotate(RotateFlip.Rotate270FlipNone); - case 2: - return t.Rotate(RotateFlip.RotateNoneFlipNone); - case 3: - return t.Rotate(RotateFlip.Rotate90FlipNone); - } + t.Rotate(RotateFromDirection(dir)); return t; } private TextureStack RenderPiston (Dictionary data, string prefix) + { + return RenderPiston(prefix, data); + } + private TextureStack RenderPiston (string prefix, Dictionary data) { try { @@ -1341,6 +1485,7 @@ private TextureStack RenderPiston (Dictionary data, string prefi return GetTexture("piston_side", data); } + private TextureStack RenderLever (Dictionary data) { RotateFlip rot = RotateFlip.RotateNoneFlipNone; @@ -1395,6 +1540,48 @@ private TextureStack RenderLever (Dictionary data) return GetTexture("lever", data, trans, rot); } + private TextureStack RenderWall (Dictionary data, string texture) + { + return RenderWall(texture, data); + } + private TextureStack RenderWall (string texture, Dictionary data) + { + TextureStack full = + (int)data.GetValueOrDefault("wall_post_bit", 1) != 0 + ? GetTexture(texture, data).Translate(4, 4, 8, 8) + : GetTexture(texture, data).Translate(5, 5, 6, 6); + + if ((string)data.GetValueOrDefault("wall_connection_type_north", "none") != "none") + { + full = full + GetTexture(texture, data).Translate(5, 0, 6, 6); + } + if ((string)data.GetValueOrDefault("wall_connection_type_east", "none") != "none") + { + full = full + GetTexture(texture, data).Translate(10, 5, 6, 6); + } + if ((string)data.GetValueOrDefault("wall_connection_type_south", "none") != "none") + { + full = full + GetTexture(texture, data).Translate(5, 10, 6, 6); + } + if ((string)data.GetValueOrDefault("wall_connection_type_west", "none") != "none") + { + full = full + GetTexture(texture, data).Translate(0, 5, 6, 6); + } + + return full; + } + + private TextureStack RenderLantern (Dictionary data, string texture) + { + return RenderLantern(texture, data); + } + private TextureStack RenderLantern (string texture, Dictionary data) + { + return GetTexture(texture, data).Translate( + new Rect(0, 0, 6, 9), + new Rect(5, 7, 6, 9)); + } + private TextureStack RenderDripstone (Dictionary data) { string filename = "pointed_dripstone_tip"; @@ -1461,7 +1648,7 @@ private TextureStack RenderGlowLichen (Dictionary data) } catch { - Console.WriteLine("Invalid " + filename +" direction"); + Console.WriteLine("Invalid " + filename + " direction"); } return GetTexture(filename, 0); @@ -1473,42 +1660,94 @@ private TextureStack RenderLightningRod (Dictionary data) try { int dir = (int)data["facing_direction"]; + TextureStack head = GetTexture(filename, 0); switch(dir) { case 0: // intentional fall-through case 1: - return GetTexture(filename, data).Translate(new Rect(0,0,4,4), new Rect(6,6,4,4)); + return head.Translate(new Rect(0,0,4,4), new Rect(6,6,4,4)).Rotate(RotateFlip.Rotate180FlipNone); + } + + head = head.Translate(new Rect(0,0,4,4), new Rect(6,12,4,4)); + TextureStack body = GetTexture(filename, 0).Translate(new Rect(0,4,2,12), new Rect(7,4,2,12)); + switch(dir) + { case 2: - return GetTexture(filename, 0).Translate(new Rect(0,0,4,16), new Rect(6,1,4,15)).Rotate(RotateFlip.RotateNoneFlipNone); + // head rotation is opposite to body + return body.Rotate(RotateFlip.RotateNoneFlipNone) + head.Rotate(RotateFlip.Rotate180FlipNone); case 3: - return GetTexture(filename, 0).Translate(new Rect(0,0,4,16), new Rect(6,1,4,15)).Rotate(RotateFlip.Rotate180FlipNone); + return body.Rotate(RotateFlip.Rotate180FlipNone) + head.Rotate(RotateFlip.RotateNoneFlipNone); case 4: - return GetTexture(filename, 0).Translate(new Rect(0,0,4,16), new Rect(6,1,4,15)).Rotate(RotateFlip.Rotate270FlipNone); + return body.Rotate(RotateFlip.Rotate270FlipNone) + head.Rotate(RotateFlip.Rotate90FlipNone); case 5: - return GetTexture(filename, 0).Translate(new Rect(0,0,4,16), new Rect(6,1,4,15)).Rotate(RotateFlip.Rotate90FlipNone); + return body.Rotate(RotateFlip.Rotate90FlipNone) + head.Rotate(RotateFlip.Rotate270FlipNone); } } catch { - Console.WriteLine("Invalid " + filename +" direction"); + Console.WriteLine("Invalid " + filename + " direction"); } - return GetTexture(filename, data).Translate(new Rect(0,0,4,16), new Rect(6,1,4,15)); + return GetTexture(filename, data).Translate(new Rect(0,0,4,4), new Rect(6,6,4,4)); } - private TextureStack RenderGlowItemFrame (Dictionary data) + private TextureStack RenderEndRod (Dictionary data) { - string filename = "glow_item_frame"; + string filename = "end_rod"; + try + { + int dir = (int)data["facing_direction"]; + switch(dir) + { + case 0: + // down -> base + return GetTexture(filename).Translate(new Rect(2,2,4,4), new Rect(6,6,4,4)); + case 1: + // up -> base + tip + return GetTexture(filename).Translate(new Rect(2,2,4,4), new Rect(6,6,4,4)) + + GetTexture(filename).Translate(new Rect(2,0,2,2), new Rect(7,7,2,2)); + } + + TextureStack head = GetTexture(filename).Translate(new Rect(2,6,4,1), new Rect(6,0,4,1)); + TextureStack body = GetTexture(filename).Translate(new Rect(0,0,2,15), new Rect(7,1,2,15)); + RotateFlip rot = RotateFlip.RotateNoneFlipNone; + switch(dir) + { + case 2: + rot = RotateFlip.RotateNoneFlipNone; break; + case 3: + rot = RotateFlip.Rotate180FlipNone; break; + case 4: + rot = RotateFlip.Rotate270FlipNone; break; + case 5: + rot = RotateFlip.Rotate90FlipNone; break; + } + return body.Rotate(rot) + head.Rotate(rot); + } + catch + { + Console.WriteLine("Invalid " + filename + " direction"); + } + + return GetTexture(filename).Translate(new Rect(2,2,4,4), new Rect(6,6,4,4)); + } + + private TextureStack RenderItemFrame (Dictionary data, string texture) + { + return RenderItemFrame(texture, data); + } + private TextureStack RenderItemFrame (string texture, Dictionary data) + { try { int dir = (int)data["facing_direction"]; if((dir != 0) && (dir != 1)) { - var t = GetTexture(filename, 0).Translate( + var t = GetTexture(texture, 0).Translate( new Rect(0, 7, 14, 2), new Rect(1, 0, 14, 2) ); @@ -1527,15 +1766,19 @@ private TextureStack RenderGlowItemFrame (Dictionary data) } catch { - Console.WriteLine("Invalid " + filename +" direction"); + Console.WriteLine("Invalid " + texture + " direction"); } - return GetTexture(filename, data); + return GetTexture(texture, data); } - private TextureStack RenderAmethystCluster (string filename, Dictionary data) + private TextureStack RenderAmethystCluster (Dictionary data, string texture) + { + return RenderAmethystCluster(texture, data); + } + private TextureStack RenderAmethystCluster (string texture, Dictionary data) { - TextureStack t = GetTexture(filename, data); + TextureStack t = GetTexture(texture, data); try { int dir = (int)data["facing_direction"]; @@ -1546,7 +1789,7 @@ private TextureStack RenderAmethystCluster (string filename, Dictionary data) { - int dir = (int)data["direction"]; - TextureStack t = GetTexture("small_dripleaf_top", data); + t.Rotate(RotateFromDirection(data)); + return t; + } + + private TextureStack RenderPressurePlate (Dictionary data, string texture) + { + return RenderPressurePlate(texture, data); + } + private TextureStack RenderPressurePlate (string texture, Dictionary data) + { + return GetTexture(texture).Translate(1, 1, 14, 14); + } - switch (dir) + private TextureStack RenderPillar (string texture_both, Dictionary data) + { + return RenderPillar(texture_both, texture_both, data); + } + private TextureStack RenderPillar (string texture_top, string texture_side, Dictionary data) + { + string axis = (string)data.GetValueOrDefault("pillar_axis", "y"); + RotateFlip rotation = + axis == "x" ? RotateFlip.Rotate90FlipNone : RotateFlip.RotateNoneFlipNone; + return GetTexture(axis == "y" ? texture_top : texture_side, data, null, rotation); + } + + private RotateFlip RotateFromDirection (Dictionary data) + { + return RotateFromDirection((int)data["direction"]); + } + private RotateFlip RotateFromDirection (int direction) + { + switch (Math.Abs(direction % 4)) { case 0: - return t.Rotate(RotateFlip.Rotate180FlipNone); + return RotateFlip.Rotate180FlipNone; case 1: - return t.Rotate(RotateFlip.Rotate270FlipNone); + return RotateFlip.Rotate270FlipNone; case 2: - return t.Rotate(RotateFlip.RotateNoneFlipNone); + return RotateFlip.RotateNoneFlipNone; case 3: - return t.Rotate(RotateFlip.Rotate90FlipNone); + return RotateFlip.Rotate90FlipNone; } - - return t; + return RotateFlip.RotateNoneFlipNone; } public Dictionary Cache { get; } = new Dictionary(); @@ -1689,6 +1959,158 @@ private TextureStack CreateTexture(string texturePath) {"undyed", 16}, }; + static private readonly Dictionary CobblestoneWallIndexes = new Dictionary() + { + {"cobblestone", 0}, + {"mossy_cobblestone", 1}, + {"granite", 2}, + {"diorite", 3}, + {"andesite", 4}, + {"sandstone", 5}, + {"brick", 6}, + {"stone_brick", 7}, + {"mossy_stone_brick", 8}, + {"nether_brick", 9}, + {"end_brick", 10}, + {"prismarine", 11}, + {"red_sandstone", 12}, + {"red_nether_brick", 13}, + }; + + static private readonly Dictionary WoodIndexes = new Dictionary() + { + {"oak", 0}, + {"spruce", 1}, + {"birch", 2}, + {"jungle", 3}, + {"acacia", 4}, + {"dark_oak", 5}, + }; + + static private readonly Dictionary> StoneSlabIndexes = new Dictionary>() + { + {1, new Dictionary() { + {"smooth_stone", 0}, + {"sandstone", 1}, + // {"planks"?, 2}, + {"cobblestone", 3}, + {"brick", 4}, + {"stone_brick", 5}, + {"quartz", 6}, + {"nether_brick", 7}, + }}, + {2, new Dictionary() { + {"red_sandstone", 0}, + {"purpur", 1}, + {"prismarine_rough", 2}, + {"prismarine_dark", 3}, + {"prismarine_brick", 4}, + {"mossy_cobblestone", 5}, + {"smooth_sandstone", 6}, + {"red_nether_brick", 7}, + }}, + {3, new Dictionary() { + {"end_stone_brick", 0}, + {"smooth_red_sandstone", 1}, + {"polished_andesite", 2}, + {"andesite", 3}, + {"diorite", 4}, + {"polished_diorite", 5}, + {"granite", 6}, + {"polished_granite", 7}, + }}, + {4, new Dictionary() { + {"mossy_stone_brick", 0}, + {"smooth_quartz", 1}, + {"stone", 2}, + {"cut_sandstone", 3}, + {"cut_red_sandstone", 4}, + }}, + }; + + static private readonly Dictionary StoneIndexes = new Dictionary() + { + {"stone", 0}, + {"granite", 1}, + {"granite_smooth", 2}, + {"diorite", 3}, + {"diorite_smooth", 4}, + {"andesite", 5}, + {"andesite_smooth", 6}, + }; + + static private readonly Dictionary MonsterEggIndexes = new Dictionary() + { + {"cobblestone", 0}, + {"stone_brick", 1}, + {"mossy_stone_brick", 2}, + {"cracked_stone_brick", 3}, + {"chiseled_stone_brick", 4}, + {"stone", 5}, + }; + + static private readonly Dictionary StoneBrickIndexes = new Dictionary() + { + {"default", 0}, + {"mossy", 1}, + {"cracked", 2}, + {"chiseled", 3}, + }; + + static private readonly Dictionary GrowthEightToFour = new Dictionary() + { + {0, 0}, + {1, 0}, + {2, 1}, + {3, 1}, + {4, 2}, + {5, 2}, + {6, 2}, + {7, 3}, + }; + + static private readonly Dictionary RedFlowerIndexes = new Dictionary() + { + {"poppy", 0}, + {"orchid", 1}, + {"allium", 2}, + {"houstonia", 3}, + {"tulip_red", 4}, + {"tulip_orange", 5}, + {"tulip_white", 6}, + {"tulip_pink", 7}, + {"oxeye", 8}, + {"cornflower", 9}, + {"lily_of_the_valley", 10}, + }; + + static private readonly Dictionary DoublePlantIndexes = new Dictionary() + { + {"sunflower", 0}, + {"syringa", 1}, + {"grass", 2}, + {"fern", 3}, + {"rose", 4}, + {"paeonia", 5}, + }; + + static private readonly Dictionary CoralIndexes = new Dictionary() + { + {"blue", 0}, + {"pink", 1}, + {"purple", 2}, + {"red", 3}, + {"yellow", 4}, + }; + + static private readonly Dictionary CoralRotations = new Dictionary() + { + {0, RotateFlip.Rotate270FlipNone}, + {1, RotateFlip.Rotate90FlipNone}, + {2, RotateFlip.RotateNoneFlipNone}, + {3, RotateFlip.Rotate180FlipNone}, + }; + private TextureStack GetTexture(string name, int data = 0, TextureTranslation translation = null, RotateFlip rot = RotateFlip.RotateNoneFlipNone) { var dictData = new Dictionary(); @@ -1728,6 +2150,20 @@ private TextureStack GetTexture(string name, Dictionary data, Te Console.WriteLine("Cannot find color for " + name); } } + if(blockProperties.Key == "wall_block_type") + { + int wallBlockIndex = CobblestoneWallIndexes.First().Value; + try + { + string wallBlock = (string)data["wall_block_type"]; + wallBlockIndex = CobblestoneWallIndexes[wallBlock]; + texturePath = texture.Subtextures[wallBlockIndex].Path; + } + catch + { + Console.WriteLine("Cannot find wall type for " + name); + } + } if(blockProperties.Key == "facing_direction") { int direction = (int)data["facing_direction"]; diff --git a/Maploader/World/World.cs b/Maploader/World/World.cs index c8a913c..9a9ea0b 100644 --- a/Maploader/World/World.cs +++ b/Maploader/World/World.cs @@ -430,26 +430,14 @@ private static (string, Dictionary) GetNbtVal(MemoryStream ms) IEnumerable enumTag = (IEnumerable)tag; foreach(var subtag in enumTag) { - if((subtag.Name == "direction") || (subtag.Name == "facing_direction") || (subtag.Name == "open_bit") || (subtag.Name == "multi_face_direction_bits")) + if((subtag.Name == "direction") || (subtag.Name == "facing_direction") || (subtag.Name == "open_bit") || (subtag.Name == "multi_face_direction_bits") || (subtag.Name == "stripped_bit") || (subtag.Name == "wall_post_bit") || (subtag.Name == "button_pressed_bit") || (subtag.Name == "rail_direction") || (subtag.Name == "rail_data_bit") || (subtag.Name == "bite_counter") || (subtag.Name == "respawn_anchor_charge") || (subtag.Name == "growth") || (subtag.Name == "powered_bit") || (subtag.Name == "upper_block_bit") || (subtag.Name == "hanging") || (subtag.Name == "coral_direction") || (subtag.Name == "coral_hang_type_bit") || (subtag.Name == "dead_bit") || (subtag.Name == "end_portal_eye_bit") || (subtag.Name == "head_piece_bit") || (subtag.Name == "age")) { int subtagvalue = GetTagValue(subtag); dictParams.Add(subtag.Name, subtagvalue); } - if((subtag.Name == "color") || (subtag.Name == "lever_direction")) + if((subtag.Name == "color") || (subtag.Name == "lever_direction") || (subtag.Name == "wall_block_type") || (subtag.Name == "pillar_axis") || (subtag.Name == "wood_type") || (subtag.Name == "old_log_type") || (subtag.Name == "new_log_type") || (subtag.Name == "old_leaf_type") || (subtag.Name == "new_leaf_type") || (subtag.Name == "sapling_type") || subtag.Name.StartsWith("wall_connection_type_") || (subtag.Name == "chisel_type") || subtag.Name.StartsWith("stone_slab_type") || (subtag.Name == "sponge_type") || (subtag.Name == "double_plant_type") || (subtag.Name == "flower_type") || (subtag.Name == "sand_type") || (subtag.Name == "stone_type") || (subtag.Name == "damage") || (subtag.Name == "dripstone_thickness") || (subtag.Name == "coral_color") || (subtag.Name == "monster_egg_stone_type") || (subtag.Name == "stone_brick_type")) { - if(subtag.TagType == NbtTagType.String) - { - dictParams.Add(subtag.Name, subtag.StringValue); - } - } - if(subtag.Name == "dripstone_thickness") - { - dictParams.Add(subtag.Name, subtag.StringValue); - } - if(subtag.Name == "hanging") - { - int subtagvalue = GetTagValue(subtag); - dictParams.Add(subtag.Name, subtagvalue); + dictParams.Add(subtag.Name, subtag.StringValue); } } break; diff --git a/PapyrusCs/PapyrusCs.csproj b/PapyrusCs/PapyrusCs.csproj index fba45ce..8110cf5 100644 --- a/PapyrusCs/PapyrusCs.csproj +++ b/PapyrusCs/PapyrusCs.csproj @@ -60,9 +60,18 @@ PreserveNewest + + PreserveNewest + PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -81,6 +90,27 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -189,6 +219,18 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -288,6 +330,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -315,6 +360,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -381,6 +429,18 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -624,6 +684,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -747,6 +813,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -777,6 +846,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -885,6 +957,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -939,6 +1014,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -972,6 +1053,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -1203,12 +1290,21 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest PreserveNewest + + PreserveNewest + PreserveNewest @@ -1245,6 +1341,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1323,54 +1422,6 @@ PreserveNewest - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - - - PreserveNewest - PreserveNewest @@ -1443,6 +1494,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1521,6 +1575,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1578,6 +1635,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1596,6 +1656,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1620,6 +1683,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1644,9 +1710,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -1668,6 +1731,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -1701,6 +1770,36 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -1731,6 +1830,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -1788,7 +1890,7 @@ PreserveNewest - + PreserveNewest @@ -1818,6 +1920,15 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -2055,6 +2166,21 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -2082,6 +2208,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -2115,6 +2244,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -2268,6 +2403,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -2292,6 +2430,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest @@ -2349,6 +2490,12 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + PreserveNewest @@ -2430,7 +2577,103 @@ PreserveNewest - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + PreserveNewest diff --git a/textures/blocks/amethyst_block.png b/textures/blocks/amethyst_block.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3e8b16dbb206ab7dac8604bf44e3ebc83d13eb GIT binary patch literal 284 zcmV+%0ptFOP)NDJ(1o%s zxBF`$18IZg$F((pdI9LBP;Lc;8LB~|DqVZ549qV5!xT)LLPj>jVG2C(1Wdb%X~3Ym znf#jy1q~4Ov5^tWaWB}90YM7Pwz9@(C%hoDX;fkBMh=_ELV3>gUq?G=P^nsRlItC& iVKghvA=$#>Px}imL8c`)`v;`}0000^EOP5DQo@Po>F;;si876qZ{*1SK>9R`bIkA`meL!1yr$K@C{Uw$lLY5@}J9 z03rdFNxV#iD8fYz80GU~HyUR5NzPKN-~Z%38!Lc->TcEJXkA2L-RZ*bZ0hJ( zvte1c05=dYc_JpcBctxp(c3#fqM_AXt1r|87G9g#B9ZoE00000NkvXXu0mjfV5Vfc literal 0 HcmV?d00001 diff --git a/textures/blocks/azalea_leaves.png b/textures/blocks/azalea_leaves.png new file mode 100644 index 0000000000000000000000000000000000000000..7eff9b1dc08bab2347e48f8f6b0c7506aff009d0 GIT binary patch literal 265 zcmV+k0rvihP)>N z_N%V5_UXFq=ldq#`OnrnxE7E90wCu~ARNTt!`B&o1Cj&I&%>*~FQ2dkOn{vH46&<` zv%bp?1jyp-xq59-@R)9?a99A{*~vTzX*J|Ihynqw7&?#yOVX%`M??)uBXx=*DW11`N5a7Iuk(NoZOS6HVr9leDPqW`rF%7tLd&_<4Bs_vO<;>rDc}j3tocP)AH& zBrXF8TqG+NoyrLw!|gYLBv4}Jrm;L6i@!#kL_e_kMn-JpX!nGp6~1a`dlhc zTpm&0f}8+3;%NX+WBJs}!s$l)7^Rq6jJPBq%v=&Zp2kG6Hh@4OISJ&7$>$k;!X!=; zYlnDNoiNwRNeYrf{$r2?w^2+);1+Os^baRUbV3rrsHe%21OQ25nwjSZ>=Q^dQJiME zIyevfVBlIt3^lf=$YIv~4HB3+W=@~RW#BrH%$mNxd+c%ax=%Qb?{;XpMiC#qRzfQV6-hb!q)5kf@>QC1zIJOSg>AfJf3 za_SI;1KE}6&At|3^#p|)z$8AAe_Vv3-tChzYdUFOVYO>Z0;_5$`b6})$jbz-;3SI5 z{aq9SnLi-KZZ=9av1%}`0BbNX+%W(n6P!o9HO)?2N=b!Do lZ3@X?Fa+}W*QEZ9;0eE%a&FDXgXRDL002ovPDHLkV1j<|{Lo80eooLO+WXR)ED=oFn z;Z8$eU)!`UwoazEoEFUDabJ|;Ok8eFy?$r~mG3E#8$o{do2(!}2HB zEAJQcZM<>Ht>H=4fg@&GX>)^D9#M^R+S8&HJbi`l1B>Kfzm&OmcDYRLeYeWLU|p*5 zj7$PlX+utSKRUctbWzP j*01s&(aitfvVUVsx@zM2HD9^`=z0cES3j3^P6$@ zJqiL*41{wV8!g0B*m(l0Z5AxV6L^L_vGbV6$CzCRA&|*T{_3%w-`ho|VENo$->YH; zdoO^jTwth-8oU9{%E}0NI1+7T0HeVD812|;WD&PoHDagDY7e8c1r7x$+(vF<&Hz&m z(ZI62>r}$Gy8v0=d4l)#2;^8(kWzqt~l=&Tb@3|#bL_aCwOH(-% z^6a@yjzh7ji?j1KtudZbc7L9VB_4h?+%lmR{{T<^5-z*gD@XtU002ovPDHLkV1oUQ BV=Vvx literal 0 HcmV?d00001 diff --git a/textures/blocks/big_dripleaf_side1.png b/textures/blocks/big_dripleaf_side1.png new file mode 100644 index 0000000000000000000000000000000000000000..f596e32913425f8c439f9905f155247d91012f00 GIT binary patch literal 84 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`(w;7kAr}7094D^)NbT%Bqb&FZKQQV$0S5B?c>24M&!M z&+AzZeB+tmzB#7Ak~v5G_C;r3wwr;HMtvb#NA@#tyuHcUJyX!wi?b<0J@H)Gk!|xB tpSnJBeWP=%SDD$Gy-Aw!DQgjf{ExZIT76!{HUeG6;OXk;vd$@?2>@mZN8bPd literal 0 HcmV?d00001 diff --git a/textures/blocks/big_dripleaf_top.png b/textures/blocks/big_dripleaf_top.png new file mode 100644 index 0000000000000000000000000000000000000000..f6974840737a82b13423a18deca24a8c5f2eedb7 GIT binary patch literal 245 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`dpunnLo7~D4cf`uV8C<6A>cx= zg4%*a4izr91qn=AZV3Y4m|~Z7_auLg*rXu-yJn|KiF2V}cBNkR+@}`d@8k-;u=#F~ z_4RrbGn*wh{#dK46Kj~U(B6p$CUf1H+`reOVL{h=xg{@o{998C%wn}Js3=T0KEc$S z>AlwcK7srLll`yT&*V_k{rXm{VYB{*pX)nScFH!!n|Y=lNzFByH2F*Sl~pOeMuE~R tyLD`;*;OXiJ&>Q#&aQpqK+R!6@oPtaZ{qa)5driEgQu&X%Q~loCIF{gUFiS- literal 0 HcmV?d00001 diff --git a/textures/blocks/blackstone.png b/textures/blocks/blackstone.png index bbfdb4d2fb948e316b67d1f31d1a1ce49fb846d7..5f94c21e3799d5fb4be2ba1291b7a07c583e0eeb 100644 GIT binary patch delta 247 zcmV^Twb%NvKyf^>=002ovPDHLkV1j}Rb@c!M delta 443 zcmV;s0Yv_y0^|dbGk*b_Nklkfqp{IcSK|E+n*)$xOy4!s zx&%NaDZUU1Wsw80-ADk2ThFtQVGIfG5%0_AXtKZ{@&FjyiGShNlV*oI=zsKGgE89G z_!hXND#Usm8%l)~r{ld@EAh7*>A=fQ#%Om}Dg@y4``3p@{p|J471edOqS%Z1d^tar zgin3f0Ia~4Vy#PrNLJ(7+}KXDh%YLgtavt>>Iy)b9UL2#q;50|R!KUGIJVPD$fn9k zvxC!MY)i@_=YP>H0N=h0v$w;ocZHYpyR&P%kt-GeWs&1A?NUjKF`A~jxtBFV`LaJwnv6rPrTnTwi9DpBE#6(3G+g2Hxlp1+t0~@m&sa}E47y_ zWf)VOjs%g1|7=+-_|YL_w9_hJH@je?`199w3?h%=)-*Fz_fH0_{z$D$e7iiCGau*z l#QU8)3z0YnjL`&<$3L4x?66(dQ#$|v002ovPDHLkV1kYu)ieMA diff --git a/textures/blocks/budding_amethyst.png b/textures/blocks/budding_amethyst.png new file mode 100644 index 0000000000000000000000000000000000000000..edde8057eb6fdea72eb8b45215005a7fb82f44ac GIT binary patch literal 325 zcmV-L0lNN)P)Hbm z^t-w>Ic%Tp)OJ66$1A)UN&wU5!jTdnS3h8Ix&P zIiC*h1d=E!J4>GSPGYW5UB)RiCL3QSB)lXHvK+xgN$(@%tIK3zyFPsCeT0#N>?Ul3 zU8hYu2a+cHBVqcnJEGg_B<6$4Rrz2XGuPQU7@w=Ur)cv3P%k>z%_8Gwe5L3j!p{94 XuqK{=LC<+Z00000NkvXXu0mjfQjd=Z literal 0 HcmV?d00001 diff --git a/textures/blocks/calcite.png b/textures/blocks/calcite.png new file mode 100644 index 0000000000000000000000000000000000000000..4c2b0dd9cf1dc14c34dfe3dc8adf0bcc3b90d031 GIT binary patch literal 257 zcmV+c0sj7pP)_2H`l;uB4S+@9$@OJs;ccejWR|UjE;` z_qna(di9RKtq8nfdFuuDPx$)=5M`R5*=wlFw=yQ5eO4S7aFRUo&wEMS~8^BAXPdtL~&LcZ!geoB9GJ_yl=^ zP)hc$vQKv|=LO;{x^W@Q1PWcGnP7})LhyE>_jYvJyZbKRIh=F8BiMVLK|`({W|#*> z0Hk+|^Z6YBU%&hiy{0Aa9gEfc1v77u+9v>Zz@k}Y;x7R>`*tD$M#HHv^9BGS4(v58 zdF4g=@2qgiYe=8vklzDh^hSyz(N^88oE2g0ce1Hi|d_z+n)vs5__&90t)&6MIcd{<6y$ exh13FRQv(MGTW=LfA-D*0000Px%8A(JzR5*=old(%%Q5431H-^UxH7}Z)LW#vjp5T%~U#4!Mi)K=y4#f<$WG><# zAYHnONJqiN;8IGQv|A?Wq8YjfO_K;M4(dx26OxATZinyw zs~YBvpI?o>e}Gqsgbcl?|34k9Sq5vCAv61B;SuQBex?lv72fhzLIOOxsBlLZJ*bfx zb6D9<(L6fiFgq*7@CHlPlsvw;6$&VT`TAb~ZtNB*bApArzP+zM>Z2B5l*XG%g-AL| zgb7Z*{C4{?`(-ggq6$Y1=XcIU%Zj-)M$%DEN`J`gmj&=J%Cc}pe&<}QHfk zqMk=U5jk!+9A;;w0&BHV19*@|-{5fPzKb^ACReb){R#L2&>8002ovPDHLkV1fmU4u=2$ literal 0 HcmV?d00001 diff --git a/textures/blocks/cave_vines_head.png b/textures/blocks/cave_vines_head.png new file mode 100644 index 0000000000000000000000000000000000000000..7120939583c1508f747b428479f5212000ace570 GIT binary patch literal 563 zcmV-30?hr1P)Px$?MXyIR5*>5lCf&rP!xv$>xzp)Bqb5?P%L8yJOmrJIDP@sDO*jTQ-(2pa3v9#gJ20Dv&$a#YigQ}l;jF)LSaVRr<%T1JL2qdU0v z1_P=KyCY`h3i`vY7~4Lp*ArZSdgP(%ya05o0mY@5Bqkn>nqJsK`GoaqwiMZjHqtUO ze0wlhkH3{*ba}%RGnGteBNa16v$f^*f3-P(s(*}h*}#Cfd#L~b002ovPDHLkV1m75 B_nQC! literal 0 HcmV?d00001 diff --git a/textures/blocks/cave_vines_head_berries.png b/textures/blocks/cave_vines_head_berries.png new file mode 100644 index 0000000000000000000000000000000000000000..1c8de2a9ea805108fe10df5c58e03c5c0a865f8b GIT binary patch literal 594 zcmV-Y0Px%3`s;mR5*>5lFe%xQ5400&kTc7zao)RV$c)|A;A{oCQIq2&8pImRa~@?WeMUR zQ2YyugzPG~31nB=ZfbTypsTimfg(i0h=D9x{Ad!iGMU$fc~eJMJ-fMc&$;KG`vg<-r%nN*~^S6A`~fJnBRBRLV`ER*@mu`388B&o#zArCSZE>B&ZJUq3f((E3z@90 g&CL2gOy6JOFFD8ALuWysng9R*07*qoM6N<$f~y7@`v3p{ literal 0 HcmV?d00001 diff --git a/textures/blocks/coal_ore.png b/textures/blocks/coal_ore.png index c5250f0e5f7eda348a2ba6ea1d83f7a1ce691077..2a21d2bd0f7b56361e1a3072dbf4f637c539d727 100644 GIT binary patch delta 274 zcmV+t0qy>w0<8j&B!BctL_t(I%Wad(jf6l9M4b#*jz}wwH0RZ(KmY{5oe&6_)oZEH z!{Sgww_W~Kd+I#T%Q%kX+V_1R=WW{_HluQI0N-_8Z-hf45F6Zbl~jT-P1E)BS*~SS z#yyGWc^==!PvM01E&B07*qoM6N<$g2Katl>h($ delta 261 zcmV+g0s8)}0-*wsB!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0002XNkl$xH)x z4t0cRHi|&xLvA}pS+YF>Cy&KxjrllPd+v6umMp6OMBXv7L02~{xB;)LP1ue%Ry~wH zg+?oy6s-170Zpsz{C;J#tyYycXW$@T3RWTc&b8DpGoa8U|8n{QJ+oWWMd@8F00000 LNkvXXu0mjfpoVf2 diff --git a/textures/blocks/copper_block.png b/textures/blocks/copper_block.png new file mode 100644 index 0000000000000000000000000000000000000000..f7ce8b42b38dc32055c1bc519a119ed169f53347 GIT binary patch literal 268 zcmV+n0rUQeP)r^kQ8`FL4lgfW?D{*@gSh6WQ$Cl6R?Vr%sX~gJkCag zfb9(8YT8*4S??C?hvXSkQ5LyNZi^q zO>+w{Ie574s+#r?ELjXNOG(873H-UmqUPf#gF3gayv{Mi~Lkt9C&9UbvJa?=^J>Sn<_?9!~NFO2BcG TDCHp{00000NkvXXu0mjf(YAuz literal 0 HcmV?d00001 diff --git a/textures/blocks/cut_copper.png b/textures/blocks/cut_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..cdb7f238899168366605c1036c0a06990954e177 GIT binary patch literal 269 zcmV+o0rLKdP)@QGc(Ju0duRc0voW9@9fPyX73LeFvkaW4;JEkzl_iAH1u^} z-{*0gepRD<=|;g-w1-{ z7Ag%O=)g(Pff2C+=OtFB>;?0PzUq|*fL#YaA#6$vme6hIdi5l_@xYi&aRy=ofsxbmf%#}n%r(~kVwZ7f^h z6-Jw}1;7(l2O(OmzN6^q04?&d*nxS+ggMO_MAyj4*2;FuQ378h-ew2ZC;LW>zZVOC Z@Bq^vqL7!jb}aw^002ovPDHLkV1fq1T#o<% literal 0 HcmV?d00001 diff --git a/textures/blocks/deepslate/cobbled_deepslate.png b/textures/blocks/deepslate/cobbled_deepslate.png new file mode 100644 index 0000000000000000000000000000000000000000..50fe34e4d2190f13667bed958d82179f5827f466 GIT binary patch literal 273 zcmV+s0q*{ZP)kfv$F}WrpXYh+`**%`=6zk) zwD`st^Nc_DSP`581n^E`g7LX9v6Vn9A4!Ih3mS;nqB3YuGi4|HJ`2#JX*tP>pj($B z5xS-f3u{3#ZIqE$8h8Q-XrR{=dVj07`un8;f_4${TNi-J$`eSkeJe5NBDp6JjLN-> z2}t$rTP;=$F#+OUohF6+AHbj&cs9}0DafpQi+#b$OJhWju&=b)%og|nDoDL8l=tZW XHR0+wcfQsC00000NkvXXu0mjf*HCr3 literal 0 HcmV?d00001 diff --git a/textures/blocks/deepslate/cracked_deepslate_bricks.png b/textures/blocks/deepslate/cracked_deepslate_bricks.png new file mode 100644 index 0000000000000000000000000000000000000000..7f8f8332cc5d42e5da7a288ca6c1441286ec3ca6 GIT binary patch literal 277 zcmV+w0qXvVP)O&|k+-V+2NVCfG65^;JGVE+}OMc}^z_5^&V zzGvX&!p@Z4f7-mE0Bog{hwgIbK^neeu`(02r9|5Edtl(w!}qQJ{8%XUT(u81n6%3A zJ78ED*zHw;z}fML0H1Pvy_W73W@LA b#bYi%h_%8o^S1xe00000NkvXXu0mjfX3}|aaeU*QTrl7nMV1jLuzYgFgDNXQl6gAWldJ?eGkrcfP_3se4P2amgv>Zn zG_|f4y?S*=&g&xiNZyslAYzgeT*bErncXd8sTaJ0e`RXJ?pz~v3yI>{9rSaNsuruI z$$bzWrya=oPdfr_U9PLD!3`2dRE@#!%oPaxU2~OWpkSx8r&{;%$0*)Pw#u!)c{c5e<;yk}ID(7I%b9v)9 zJ~MpLQTe>={TgL-GvQ%_COGGMtHN9rU=g2}(cUiaSWX5;P8J1BfXsWXop!PyGxlRj zARWeza!MB8HTBaYt3neXsinp=Ps-4$!av<+SE1C%H}~tLM9O>&pt+m&NdRQr?r#H$}R(oQR-m3FVX8IQCt}=Om%6kJS#82S&=bn9RCMwm@`=1Y1qEC{3mJ&S7Ddsr9Orpn$8lV9&ISAaNhk(9 z#(%J}ZLb80tc9A4fWCn`P9V3|t}#Z!#e46$hftvARUir9-#gb5^dj&>%2dM^1QJQE zF4MtNK;Z1e*%RO>9yQsU=iQb=j^?p&I|9cM85eNq367R)^v;Wf2+8$0w*$X-8mD9@ zdqSO=@Cy3YDmB4xO}u-Mo~F-lG9}NVb4IFsP-^?;d{F9)D nx@CIf?US literal 0 HcmV?d00001 diff --git a/textures/blocks/deepslate/deepslate_copper_ore.png b/textures/blocks/deepslate/deepslate_copper_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..6dc547de0460c7480a061b5c551b1d47faa6251e GIT binary patch literal 319 zcmV-F0l@x=P)zvU?-AJZ4H=S5Yid%Ab1u#Z{i(1z{*?r!rLLm;5u*Ko8P2y9CP3I zx$C;h+ICY+80Hx7gk!Z@7lViihwL%%l0Z3|+qsx3S`yUzd)?*FWjn_d0nZ{pZ^R;o zc}vMlf;`<1b2hypL~^MBRXG$alE}ZuP!VEVRFqk^WKl8$rb9BfM+@buuU@9+=`-v$r_6AW&ooiS2*zNWK-2uPjI}sR$ZD2EwjZ9)sCayD~j+6EE(UK)5ATGlEyw%nDQuFcj5$LOM z(I=}w6j{Cl-~5DfZ&C1McL_NhpzJR0^%d2L3B(R%Zp9Q2fk;{^k)%EdvJZiO<+$zZ-;rK14(vWfzupo}+vpYkLBx?*ZaG4OhCO`E8LP zFfN}CMD_xKn1Yi@^m&W)Z#p4BLlp4Mb7zW)=u?8%7KvRDxTI0^f!-h_MJKWf8wpk{+go|8p^TObxz1re=?rt)PxG%F%SWRGDmQ5@Dn}9f1 z3abe)sNVLp`;k?|P0k4n(2M>1nzg#EJ3=*E|3OvVDx&t)xDxOrUWsPr3L+Y?fXR#d zF?$@DhNgg;bXX*jxiiPlGcYu2gPxdFGeGg6!!>2qRITH5niKU|2MjY2;>dW>Qm(300000 LNkvXXu0mjfv^0$a literal 0 HcmV?d00001 diff --git a/textures/blocks/deepslate/deepslate_gold_ore.png b/textures/blocks/deepslate/deepslate_gold_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..be52acbe4ce0de45ecbd3207373e25edda17bc61 GIT binary patch literal 298 zcmV+_0oDGAP)nvfA8P^?%lb}^SqAZ zxDLaxi@rbB2u2uVUHH&-hZ-aj!IL~)PV4P@u8}o)1@-{TeX4I0LK>x<$(jpF9suv< zQNdO!mjuHymWppMGsKXi&dF5)iQHs0iO=g<-$>6n&g6V)B|&Hst8-nd1JCegLwrf?|w%9uf$i<57{S?vD*80bq zXJR*rmTF}r#~S2V+y<%rN!&7zvB`HeXnURrf&T?#?7x7!EI$F2OHcp+002ovPDHLk FV1jcEh%*2H literal 0 HcmV?d00001 diff --git a/textures/blocks/deepslate/deepslate_lapis_ore.png b/textures/blocks/deepslate/deepslate_lapis_ore.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9c8cceb7fcca9067604dccfeced8e0825f5cc2 GIT binary patch literal 332 zcmV-S0ki&zP)| zp%KDB5Jk6yC-=C<7nnFT9(dL+o7kcK6@^|1L32 z(>#vjJPgAkx^ADL8sRm*gN?S`m6dNAeV7_^0s8vzoHxfyuB-mKXm-$M`>l(40)U1T zMbkerS7U#Em6}!pR^gPO1-duaQ6$jh#z}@)_<-bzz8kIm-~{xE^6B=@6)zO*dw)tm zvl?ohPT%vtYXse8=o=Z_j6%8l7H$?^piclA)&WRjACQ0^&Z-EA_T3i_P%cxImxm{#}n8uTZuC%L}Tti6Upv6P-e*(km0XG=$qSoto e?$YXCn*0Md2puFAyoOu=0000jo8WkJNy=ax6P)RNVvc+ zp{jsQKhLhKAo&te-qTbb>vg%WRzFoX2{2QI00Nimwff8X+yL?-e{Hud9+_39Lo7Fs zI8{e(nvd^aV_kA3P*5dFFHIu>0{Vhit}vBA$vQxnFH@esfa(poZ4X?pm*;b*baH8a zcmq|w_k-#9=4E-|V5BfA{rk*`Bd-$p-m5fp=7m8*UhBv!>T@PBzgT}iUj(`HB5=L` ZNIv7;`{&4wltBOh002ovPDHLkV1oRjjjjLy literal 0 HcmV?d00001 diff --git a/textures/blocks/deepslate/deepslate_tiles.png b/textures/blocks/deepslate/deepslate_tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..7eebeb66d456e4ae6eb1e7ce0bddbdd73416758a GIT binary patch literal 233 zcmVJNvnr#FM?Xcea?P#q9{@xn1F~;rKw=Dv5&cJbA z@10|wi_=NW3msrYB7g=At}$FP0`8WP1ObXcpatlbAv|Dn*r3WtHPqBJ)$d8HnI{Md zm0m64$v9?}S*xy}J;*d_Qs&F+0e9e^s1{0P8cbS!<#Lg-5vzjCi{Cv^?fQ;Yu13v% jfF}$OR->xHOn~?UK9Qr@!QS;W00000NkvXXu0mjfd$nQ6 literal 0 HcmV?d00001 diff --git a/textures/blocks/deepslate/deepslate_top.png b/textures/blocks/deepslate/deepslate_top.png new file mode 100644 index 0000000000000000000000000000000000000000..2569e5077b0efceb42e276e7f24bc22ca29853c5 GIT binary patch literal 254 zcmV)vnW zOAjTSWFr;1SfMli)>>yOr+SmkJT;psiqqZ1xqoyH0zxA{>(UJ{|E&QVI6OJUWfLPQ zPBE;!kwn71qA=!9@sc|c?*>#qH#=WYz~ciKvnV}5D$G~sw9XSom2{4gEK+yh*@O-) z-f=44sZM&^iCz$PCsyW<25FAGk^E26c$Lr+KKD8rKeEgQ^meaS;s5{u07*qoM6N<$ Ef=D`O%>V!Z literal 0 HcmV?d00001 diff --git a/textures/blocks/deepslate/polished_deepslate.png b/textures/blocks/deepslate/polished_deepslate.png new file mode 100644 index 0000000000000000000000000000000000000000..dfcf750149416d7cb3b92afd19a0f06aaca45b75 GIT binary patch literal 250 zcmVf3jTkiGSx$uD<~Z-?3_8DjdQftx?8Pv8{@~BbM6NL_I$m2 zDWyNobNGsZV?P934hxV(Cn0wd#06!B1SMgS%!!{;`VwfByQ=u890ba&)mInDiE}6b zM6R}@L~c`o4{#?xFpp;oyJ|`v>U>Vi8PJBdwZi5M^ci>3eW_4zA@Cl3u~r1L1(oMZ z!y;*0v~+oee=2WR*^>b8{)f3pB*zE!F^wJj05ERZK1Hv8AOHXW07*qoM6N<$f+sCz Ad;kCd literal 0 HcmV?d00001 diff --git a/textures/blocks/diamond_ore.png b/textures/blocks/diamond_ore.png index bd8b4bcfcc21d64622abafcea46b185681c91180..5182e1cdc2b88516e135ee56075ee537fc171ad6 100644 GIT binary patch delta 274 zcmV+t0qy>;0<8j&B!BctL_t(I%XO1G4#GeTME4{#9BwZVi83cZ=@4~#3T^@gT!9O{}G`vhi=mv);BW%Qnw*80Tr4!Z`QdcRuA|jbegI_5=r@84cxYHE?*mv&fUl zIenhn@p8?kts8jHH$2Iw(@7ceX6(DtkK zy+{Vt>L%7D^1aDTbOfJKMWfqE4d^DCAo#9pR{0Rwh2Alc5v-4>Zlu4=p$0zIzc?U2 Y92t^Hhrq)N01E&B07*qoM6N<$f*E{$(*OVf delta 276 zcmV+v0qg#)0|ES@ zD5&h&c;CNmx{0}Ss4YaZ0ZNZqDIaqFgFO^jvOQ8x9*f-?^T)~BbG2i&WD)fddB<#l zs_L2rH{f-&3ET0;qJ~nZ&}c=Sg3sQX(akReInAee_BQU`k+wo6zq)c^>)a{wXhPU4h`6r|SL zUl$3AEJI->PVBq$CGp%YB!B%$L_t(IPjync4FWL`+%ArQ2B?4x35fy_DH)L^(#r^(kUOOz ziXfl@LJBZ9D~&a`XM&Yi`^?PFot09mM$Wm83k5?2uK!T^@H=iRKPp*zL_9e><^?;h*N#=*$O`}tzF zDL@gdSj4@M3jiunRyEvc5@iE`%fs{FHB}J}wOGIsmi6A~6Af*jQ5|NefhrrP>Ws0V zENr5Om!{$z{VSV-UNnYDSu|E>96%A(VP}|@;ENiopVIW6XedD;y=Uw~K@Nt}hn}&F hg$I!(E|8G(KNNetXKtjMrk4N!002ovPDHLkV1mTAgYy6Y delta 265 zcmV+k0rvj30;B?vB!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0002aNklg!M@fC za76H!j{qL|%FFYXn!t%_jZ?;odK~xbKJy41q@i*u0QfyhP=5w#sPx(^fJ{n)vaLYP zs{jBIBoIPW=VhXs=b4mTv0DMPc-zzyZ{+bCybw{0)*kQ7e&q6g+-LB*^$|H| z@FqM@-CRUY{jOph4i%i0VuW8}IK+98jlr6j&U}$n zZ$=Q|o2CNDdm%3jyghFbvETKMCJc1&A4Xy}Ld<*Y0FjIHyuKp|o3G3~B3$f|g^~*j f+jMw^{FeC-WR`{2nJ$R-U<-N>f9AEJ2T&L3m+9vUrX#?ylRlUR&9JW zSjwp#q==rG;2M|SNqa~HQY2%kQT}K)!V=kc(39QPtb?BH=|hu5EXOFW#JTZJ=+`LO uyxIZnr9l0hiYZw=+7@#E&b_qv9>>0XHh9hRXn4W^000012PFF2e}{6g)#0T3=doH7Er%&EHS6^@T(P zT-(HC_EdINFhtxJdg6j$@ zu?<2&3_~*oE6_lJn1b$ibQFjNi2~8mP*O7hgD?bQ2NuC6pPsDGm!c^DpD(eUtKqmf zKb8s=hs*kOTd7v@p9N5qFBq!e4%q;oD#{4u*Z%#vexJjguKM(31B@*5QKjSUFw-@L zsAi_4QG%R$3!w}L_jX5!l+Thn%}gVm=o;t*SEHTH4S8Kd+JcF&PkC*E-AHKeM1j0M z!EP`r`J^`gDf32d8j?rcEH*#6yHWe*5*AsE#f^;Ce>hjJJ;kvQPsaV?fM>&|M~_mm k+06?RCttOp#t5zY2XTEWKuY3ST>t<807*qoM6N<$g15JN&Hw-a literal 0 HcmV?d00001 diff --git a/textures/blocks/gilded_blackstone.png b/textures/blocks/gilded_blackstone.png index 676442566ea47008f701941949227953a5b53008..db5c616314dac30b22e037882c102a9ecc46047a 100644 GIT binary patch delta 294 zcmV+>0onfh1i%82BYy!0Nkl3@^>Y1wfWxqQN+s&%R`sW>s*?b`Ho*LhOzo)t$my;Uoi^a!% zHr$TWR*;On0YQ>bFHE4>Q{+jK{PjFH0x|R!rV2C!8MCh6 z>v;;^M6_U$DNN%ky_Fean~hl@hvz=&v@$UaY8v$H6!RLrRzARwcaSy`g49GoKYphE s4QQoy`XPx%HAzH4R5*=wlg~;UQ51*2iIX;&$xSn( z6rD6Fn39w#)S?sw3#DMYXkEK$m%czBz-r&1k5Jl8wrzLa3U(7v5Nm8L)R2r~%!rf8 zA5f-?c(0Do0|RsJxo774{qDJ1Y5Y!T7!ClPP6HXuX_afYZ)L)@_aXDEDH0hCfZj<+_dFn*D*{kn zsxtm&j;Alr2z-xDr=j*}%k$~5yqAukN;z`P6c*1?>nxX_P`I}NKq8~jI|+$>tcb`) z`CQFyTd;BCIe!x~n|yzFDX*A3K+lyX0kCaBtK~-!17q-hba+Yj`CAwvjRn335NVc( zBVGl=a3b>7w*!U0+Z{!_YiC1go{W6oW%hx|SNFc6v7M~)rgt)+u$?SJnPht9tOt5R z!!R7;alx-<8#h)OcoD|w`aWOYy7b*9{y~c%CD0QZ@qf5Ldo=l2iE1_Kbk75lLngM9 zRevic57_OFMkpkyes%h6C(FXv4zFLenP06dFPg?Q52y09T7E?8Y~gg^f&8*OzFKvQ zz28$z%xo&XxzZ%IEh2`Om#XO3nd1H5*O-iOJ$1y#S=JJ2S_FtsejY002ovPDHLkV1iU?bCm!9 literal 0 HcmV?d00001 diff --git a/textures/blocks/glow_lichen.png b/textures/blocks/glow_lichen.png new file mode 100644 index 0000000000000000000000000000000000000000..d6fd87021c755b9fe4d559d2dad2b201a12801a8 GIT binary patch literal 241 zcmV~Jk&M5*3gcmcLH2KWwd(2bmXJn|1;8GlM?#ZtI(?%8W*_iw?P4RcVce6kP++K`fCF;bMsLZz7m?qk zeaqZ3;v@=k#_gRgID@aX4;6de${3Q@EIxJMGh!oWfqjwO_x)e- cKUeqzX@!8U;t$ip5dZ)H07*qoM6N<$f>pJDkpKVy delta 273 zcmV+s0q*{>0;~d%B!2{FK}|sb0I`n?{9y$E0004VQb$4nuFf3k0002iNklr(A`Ou&_b3rmX%zC|EUu@fUtn1o?^Rg^GIJee@ zT;hnJn4bwYzzy;rK~1h9u$KZ$_Kbv`XT)KR`LeT~xsGGCcoFpydB<#lsOtI% zE@0N#COnQe7S)v6g+ePD6wLMyfTG!UuB&V|-#n|a2R8DiU}lnY#)6-E0MI1=eEI>L X%9zXPB)$Rw015yANkvXXu0mjfGR}Xh diff --git a/textures/blocks/grass_block_snow.png b/textures/blocks/grass_block_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe3e029c7eed8e18bc4b6d530761e9639086a43 GIT binary patch literal 307 zcmV-30nGl1P)N3pTO?i!bM{ z&G>)0XwSdJ-OWcFicTaY9BV0H-@)Re=)rT0eI;XO;DaWcY$V>yyT>`5A#ny< zO87w@hl@Oq8dx0J8Vr1dj<}U^cJObOO_OBa6+A&Tf$h+h1*Z)cFwgLw@bknrrPGR= zA2OZbn)tW#4cDBu2a_DWv0Y<0!nT1`>fVdPtQY=zZgHz=>tT{&U{FroR<~VAG6LvM N22WQ%mvv4FO#rn|Qyc&Q literal 0 HcmV?d00001 diff --git a/textures/blocks/iron_ore.png b/textures/blocks/iron_ore.png index 648417773f629c0e8aa57e7cbf247171bb8358ba..8fa68577423a7b730acef8866daf8d74dc484bc8 100644 GIT binary patch delta 265 zcmV+k0rvj10;B?vB!BBkL_t(I%XO2n4Z|=D1i4|V%n%PCz@^$$agi<3c!i9SI*T}X z0w=r)r65F!M=mzJKpmu26Tm*+i%2OdP~z z)#ipb$>}-RzgJ2ClF+Q1t4^L!G5J0tqX!DmtV-P_Rb~Mt4rv^$X1Y($SjX5C>zE_O z<5B0`pGbSxk2IgyY$6Fx7hu;fX@HL&P{1egxtPsIl@&AX^-Is1$oUUzwS$KjsKK}Z P0000+ct}H zYc1UgM+IbF3hV%Hpm!9U@Gh#y?VQAF_t$=%7(}CX@{R)Umw(gGz0QaR%AVaj`&^uS zIH>9(zMuEm-Gz0BsEa2D5S39S`-t-l_Hf{qJtO6lCt_Noetfc?xyEs~%p&Ta$al;Z zsOoM;Z~|FZoA5Zkv8Y3-T_C!nLc=Ju;7<7 f0O%tB=JW;ZjuMA#!J{db00000NkvXXu0mjf#=(UY diff --git a/textures/blocks/lapis_ore.png b/textures/blocks/lapis_ore.png index 24ffcba612b7f71ff42da1ccb85436ea0a1520fb..7c212c3ed9ef2befc8ae2727dcf17e1737f3f1e9 100644 GIT binary patch delta 313 zcmV-90mlB+0@DJJBYy!JNklSVE9fl#oec$&H?z^sA+<`NS$$;9njW9vb8b$KfO@C1Hj0Awq<-JfLMt{;`U%B^O*<|lbo)u*C zlua9`$i34Z^0TR7qHH7rK=S$iiIo;4_r5kZ2&e{t{tQ4)gs}g5I$@&hCMp|ZTSATQ zXOD`^go&AeWD3}l_bMwn!AGYN=j4kM;EbvB6bRTihet&Iw6iDPY4S_}YX(B1B0naA zGZPx#{z*hZR5;6Z zlfe~&Knz4v0wh-F#Ud7jho zr)f&VAIGu!rZ_ABD+u!dPv9|-2hREWUN5(MzE8uW0LV=Cu7CgD%c5;T)(x)&D^R{y zf)8oH?7dT_e1Lv-Ot^Re)rK;A?>ehR7d1tMEra?U2!UFFoHL}Q0ugZO%wB3c%4&>y zq*z<_b{7zn$@p|23|E#*Cvc-m^vD(fz^Y511iA=J3odBc#J!DYn)m6ON41JA75Mzi zB5fqUD&QM>6f+Sk;f^X0ED4S?lW|P6e;@3=18owIk9ILyz&|7A1CYE{T9R--i~s-t M07*qoM6N<$f~?nthyVZp diff --git a/textures/blocks/large_amethyst_bud.png b/textures/blocks/large_amethyst_bud.png new file mode 100644 index 0000000000000000000000000000000000000000..337f13d5815b6a140115b52af044ed2cb82d0c6d GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`lRaG=Lo80eop6w|)q#ig?K!1A zRhw9FVdQ&MBb@ E0N>+LLjV8( literal 0 HcmV?d00001 diff --git a/textures/blocks/lightning_rod.png b/textures/blocks/lightning_rod.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9a13d7145babeeaa9eda2db750781e7b0f6932 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar_~TEACABEZ??1)ct?D zg6IL0c^aI`_ZcQUdm701M3UiBOOK}+L(1~69hU@A!9y)os9U!+7p t3d7O31r}ls=j3mcIBev0*cP0`z`(+q@|r#J_%om-44$rjF6*2UngD2NFLeL_ literal 0 HcmV?d00001 diff --git a/textures/blocks/medium_amethyst_bud.png b/textures/blocks/medium_amethyst_bud.png new file mode 100644 index 0000000000000000000000000000000000000000..a0f84f0d177153d087c7c2286fe58a21483246ad GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar_~T6C_v{H^@Es({%p7 z=A}RHzij^RBHgr3;x2>4d=2T~JJ0{F@4Cm8b~vMHU8Cl^vsTQ@9NP}uFpyf$sNkyL uYtU;De!##-W;vsQs{zku$ylC9euiHYCe>cOT(cTz34^DrpUXO@geCyo{4}Qk literal 0 HcmV?d00001 diff --git a/textures/blocks/moss_block.png b/textures/blocks/moss_block.png new file mode 100644 index 0000000000000000000000000000000000000000..c949c37c8904986fcf0e90ccfa82385869846023 GIT binary patch literal 268 zcmV+n0rUQeP)Gy zF$zLK3`BDq8-F3*z|PLb*2+e(kbeTt;EA2^AD1fFONO= zz8=K^Ij_%BROgM-fMipVBq3Ai&nadnl|UY6=aw_C&A_A_VmfJ(OX>?lzZ&yXkM zltL&BWM`>5N%juY7PquHnDMA+NkNzZiG!6#h|XS`(s^U?lm~#S=4MJ#jDoql0oUlB zyUy82{W0kG#-)w9er5Sb?urtt=hI)({5YSdW7<{H;je@M>s+iH=34g5Q1UOzb@Vkd S*EW6t00007i&B3;JLoc%KOgFev6RgXEI4P*=~5>3(~)? zO*=80=cQ~P$Fe#dO2;EYaD6+E(uxsZ4E>Klngju5OXEu`5!{SG4{C{O0{^Qlob2U( z_a$&ZRwYJP;3fo~?3GjH{m`9gg+AGg|+U%tAdk1egkLb!n{iQ;3@&%z}EvIZ~kNXmg)#H fT*Qoa$++YLUt4(w$<=#ARA6Er`HH@_zM#@K(G)ppO!X(SCHEdj7l5;G;RI zB2pGQP$C*QPCLOy9l8rn;3DJJAA$QzAYwacVGgj-{T&hbKxqvcxX0|7M0(}{AN7RK ot;f9JbKsXN0iF^)|3|pu2ZtbLV&7i;8_sYd5N)Ohoj_^1Zy!pLL(Rz*z+*dB%>*;Usd(QkRMEihB z>*?mw1AY~vqI~%cB5uc5-#f7OK~P5cg<02E)E(O|6Vfd5)ZyR}@yOU0x_9as?(uGY W$d>)l(w!UVU-*<)`-Kx)f+v3X3_xHZfSl*VzJzM0` z3567UrjP|%C9_sJsIFtWmhw<&!^@tYbq9Jr{FG literal 0 HcmV?d00001 diff --git a/textures/blocks/pointed_dripstone_down_merge.png b/textures/blocks/pointed_dripstone_down_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..38620f5002904439cef907f57e868e10b0620407 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Wu7jMAr_~T6C9W)YX$#rE+{UN z;L_vcWJqRnVn}1yq-bzf!7PwX=Y{T{{v3ge+mxjl4jW7t$Yt;_+-2@j#JG#mK;K{j z(}lf`n;2gtI!xofaJV5ye?lrlk;5br<`Zlarm`h4ENOfrabViY6J`uz9VwCyYs482 Xl%IUfIK}c8&;<;hu6{1-oD!M(%hcdLI`Hnl^uKmD>8H@}zS`*e}Y^E=Oew3^mp>tpyO_K+3d`PokI53#q4 zdYw@5_@;P)u`E%=DxpADg7MZC>(#qi*7T%!DD8Y)dO#(zv?L+WpnU6rNz5U~obC!q z?)P#Lmsq*OV-Nct=1}&yo@c&Wly0`(bpN_c|DkJvY(eIpTYvm_yt0{bx}U|oVC#|} U@iROsfzD;{boFyt=akR{05Att+W-In literal 0 HcmV?d00001 diff --git a/textures/blocks/pointed_dripstone_down_tip.png b/textures/blocks/pointed_dripstone_down_tip.png new file mode 100644 index 0000000000000000000000000000000000000000..91f73b3780c172caf07cf921d7a357d32ebbb71a GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr_~T6C9Y&o=p6&9=hxw z`^6JGEL0eJBs&-tm?!WyX0mPcG-7D;+$75)_C@Spd*Tdl4^E zh7PSx;sV`~Hmv?hP7(|L-PE zA{-J;nX}(t<+1r6H{+yKDRUTK)Et?hm5W7_*ft&uUorJKyMy@ouJXNkl3{h@X-ew6*IvHoD01IC1EU%Sx%zy#<&AmuqQBk1nDjcAQOCiQiB TKg8A800000NkvXXu0mjf6*yYy literal 0 HcmV?d00001 diff --git a/textures/blocks/pointed_dripstone_up_merge.png b/textures/blocks/pointed_dripstone_up_merge.png new file mode 100644 index 0000000000000000000000000000000000000000..0cb03adf87fe093b87ec21c1b6582efd2b8d8228 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Rh}-6Ar_~T6AmzneG&V|{_xR+ zhW|WI8a$`2Okkch`S1yIhL)2?3{P^p_AqP`T_X96X%a7EW>Y2Ol9?&Y35*=vE}M89 z_*^FOHr(XnX7AeLP~@Y)u2AGKDVITqr^Afp?oSnVl`{+_`V&$ZHhrGB*CAw|!}Xp# cj$Ks@M>mdKI;Vst0H?$}?EnA( literal 0 HcmV?d00001 diff --git a/textures/blocks/pointed_dripstone_up_middle.png b/textures/blocks/pointed_dripstone_up_middle.png new file mode 100644 index 0000000000000000000000000000000000000000..eb66e9b7f9caca06a20a92fd4022e85eaf61fa93 GIT binary patch literal 210 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Gd*1#Lo9ly23c}7IPl!L&lx86 zh+RxxA?(^Uvwa8VYemXPI6q2b4nAk#9#r+-YFczbUh%+&6XVq8s8|oUndCD(*>C{Px+%ET$afRrTA2uwmYk`hr@O1Ta JS?83{1OPauOTPdB literal 0 HcmV?d00001 diff --git a/textures/blocks/pointed_dripstone_up_tip.png b/textures/blocks/pointed_dripstone_up_tip.png new file mode 100644 index 0000000000000000000000000000000000000000..9c702a73fcfc7b6bb64b55de9d24459d534dbb10 GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`F`h1tAr_~T6C_x-uuj$r{%@|{ z{#V`G*hATst-&NXpF literal 0 HcmV?d00001 diff --git a/textures/blocks/powder_snow.png b/textures/blocks/powder_snow.png new file mode 100644 index 0000000000000000000000000000000000000000..f6c2279311d77b7c9d4e6e46ed0f6ac758a6aa56 GIT binary patch literal 205 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Q#@T9Lo81B2A}3SV8HX~|NheB zccX5cIH+{4Mbzt{%@)(6d%r(kZSW{~kJ-Gm&<|1CkE)Wi)&$R9()J^G#f*5)dviT! zortL7&)8&?VRY59OzOw$Re#R$nzg7e+r2C)&*z%&rJ3ydAtz5=(QILl$x8a`lVrZ` z)U-7{i`V$=SX;=q%YO;;)HODGDh8tE`OQa+YE#uK7^`=D;&}DeUKi*-22WQ%mvv4F FO#p4(Rqg-) literal 0 HcmV?d00001 diff --git a/textures/blocks/raw_copper_block.png b/textures/blocks/raw_copper_block.png new file mode 100644 index 0000000000000000000000000000000000000000..204a82299b13b3978aa53b8b2cfa99afcfff1314 GIT binary patch literal 797 zcmV+&1LFLNP)Px%*GWV{R5*=Ql1+2kRuqOGql<+V#D}n)ArT~YvGY+%@ObKur;F5W7tNxZW|1G! zMb_DQ*I&^;(U~^8X6f3CxRc_h4l=Hd3Qch&gg_vWAq%iOIh(tA-*caH&O7(xlZO+4 zoTgH@y$@bHvBaxonS2+HswSC+&v&KUEXH+y`1_Dd!$&mzkgOu8+a3UQ+oS1+d|NJ% zUM|4FOZM7zG7X5RZShmZqX#o)RLyC&H5?z|p z%LRTt=rGBEzg?n#U{Y)kk?v&mopCr7Uz)n3F`Gu3n~4Pu|2d~W?D5j+(Dja~mF@%Z zk*e|9cM$-U)I2pW;L{n_rje$cFU$z0*p+d>!uoxpZ)`d}n0x)+=E*?qomA+qEOBk zxOwLR`IyX$zm9lQZQ=|srXTo2a$17xgOD$VJz`FuV|PFV;88@z(2@XGfx29*^7&V+ zs4`7I#IjusEy?q7z)#YIU+&#Stf*77WxFiK^$!-;GFH)7ud^T(c!$Zp<*;u#)KrO< bu?oO@Pe)ojw{2}}00000NkvXXu0mjf-^6+6 literal 0 HcmV?d00001 diff --git a/textures/blocks/raw_gold_block.png b/textures/blocks/raw_gold_block.png new file mode 100644 index 0000000000000000000000000000000000000000..57472f755fbe17645976c089b5c41172dfad8f9e GIT binary patch literal 570 zcmV-A0>%A_P)Px$^hrcPR5*=YlQC=CKp2J}pJa#?duXw+zy*7eMnNdl8a){TT|$R!{R0hn^yHy* z3tbHT1=%`eE_mwDL74&?t;HGyQf=BHstgU1JIHsIt4XI%&wJm!?{|&AKixgR`ZCweq8LOYM2OI&*bd&4FJzi3jm6h z#%`SwCPEz(;PUz$T`pwNwo>2=0Gd<5fxiK&`qk|WfZz9X0zXHu7o`x%2G=udFvO9; z<@NbVXSP)$Y^wy|?fi_Z+ZnEB5=VvtC0un>@cgu(SZT@|Jxl}_?_VO*kZ1e$6=0*_ z@hIc*u8LQh9wwslpjc_(EKXVmgE%ti5AuVtGwl00VIr`tlEAOT^*Az!qd)4$`g4SD zj!|=(hF;GYj)uvh+O1PGXK|3!ln7Le7>_bs&r}Xe*tSYs&m>F)*>bD8s?S4zkfTdC zHK)MER9(pLwpCW=K8Q%u-IYe*=ZL`Hpg9H2&XnCcRdfIUZt_CC`S4LC=6Yr|%7I@E zjs)u2OOGU6AEaWX(Rld$YG1#`b-2DBk1|@r9-31q;cU6(ALCOBh{8QIBme*a07*qo IM6N<$f?FjB(EtDd literal 0 HcmV?d00001 diff --git a/textures/blocks/raw_iron_block.png b/textures/blocks/raw_iron_block.png new file mode 100644 index 0000000000000000000000000000000000000000..e99a2b3a6e6e5dcda7b28ad6f27d18c2c154631a GIT binary patch literal 558 zcmV+}0@3}6P)Px$=t)FDR5*=Yl22SN#rWsZNIK3F6lrQK?-LW}F2UsfCG3f%WHIIrrH(#cI48yZ?b_yQ1w>Pv~9p1zT zJb&?$zpH<_UL~k9nM`=>Z8-V$6VEXMv|AmbD8dhRG3f%QE}7N1yq*vg3!-+EObIIu zJSTU5uLi(!K9;ZB+gii^UX5Ni7DJscUb@Y#EXnp^e;^U2t98z} zEUPPLV6Pi<*dN?^(Cfy)v79iNd!SD4VOVMK_T76-x)1{I^kOK3?N%puY1z2kjkpVS w{cWXu8H}QcQn@a}ZXIiln5?yym8>=V2Z;A$q{-gW*8l(j07*qoM6N<$g5a6@g#Z8m literal 0 HcmV?d00001 diff --git a/textures/blocks/redstone_ore.png b/textures/blocks/redstone_ore.png index c68c77c2b7415780c8764a1376bb249107a55025..b708697055fd99ccb8e13646bfbdfbb172ac6d82 100644 GIT binary patch delta 278 zcmV+x0qOp*0a$y`KLL0>5UOGU# zagpL)(68FmZ)|N^Yu4Bq&!$y53cm_>C7~aQ?9L)1=hQFM?^EAj2f7FP8&~31f)-kp c^^NBr7tLnElMg|h{r~^~07*qoM6N<$f_BM(hX4Qo delta 277 zcmV+w0qXv-0?o)LWP4xOOerI68QJPYnYK|T~El1{YNp8LLgaerM`FYeFtoZcml z3Yz(tU;{iLzftsrr)0ghZ6d4FpNNiuH0mTzOmO>wt5iq>W`Aq}# z_lcNyHnp2*w$E{NP-@J|^&#gO?AX97TO(!XkvPSe7dvasRgSmCi>Qal8E0cdiUv5f za06ObNmz~(i)u=pLL*6F?ATzHKLBLlgVPyD*=#;}(>A4Pin0EEtDnfvV8Jgv0BDkb bK79fFgj^QHs1Ef500000NkvXXu0mjf*Dro? diff --git a/textures/blocks/small_amethyst_bud.png b/textures/blocks/small_amethyst_bud.png new file mode 100644 index 0000000000000000000000000000000000000000..443c2d22dd1fd9e29754e0243dc2facab01969d8 GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`E}kxqAr_~T6C_v{C!{poTVwoR z^U|K3??3-v^v#F>B&a1G7zX Z49ZhN&Zy7X%?mV-!PC{xWt~$(69BDmEXDu; literal 0 HcmV?d00001 diff --git a/textures/blocks/small_dripleaf_side.png b/textures/blocks/small_dripleaf_side.png new file mode 100644 index 0000000000000000000000000000000000000000..28b09da6b060d4b6921c70ad1adf714cdb1ce686 GIT binary patch literal 81 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`5}q!OAr}702@Fkh*be{y@gmTG e%k5wX1H(FDj>5`w+jj%iFnGH9xvXFlJI0}a5$(Ulyf}QII?X)w$e#~31>y58`g0?)7=#78053SdbZBl z6YCUCGt8K;+2_>7qhPIga1Q@z7ZquS%`gE{ONha`%9Xk$jbFxIaliq ozc3M{%PP_gnIbFniVTjegXdCJaRK;s!aUHx3vIVCg!02R|MKmY&$ literal 0 HcmV?d00001 diff --git a/textures/blocks/small_dripleaf_top.png b/textures/blocks/small_dripleaf_top.png new file mode 100644 index 0000000000000000000000000000000000000000..34efa1fc4db58b0684b534357f47853c1ac07fcf GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`k)AG&Ar_~THD)aNEid`pL}Jke zo)(5pNt<{X9ya*MZcvkG``Bs5u;hlONTNUoTVfO2g4RJIOQ3@W&^Z@!PC{xWt~$(69AtLE3W_m literal 0 HcmV?d00001 diff --git a/textures/blocks/smoker_top.png b/textures/blocks/smoker_top.png index 439b8c51340c1a28318aa1e6a058885b5ecc4f9c..4b5e2807d828f05ba5a1ee24bc8a1f6a8b20d416 100644 GIT binary patch delta 249 zcmVIbAm>i? zEj{!>RaFKfF#g~88>jbnzhv9GhCSxF?m1(A2A8xvms?!E_WdfQT<3X)9mi39+RNlu ztS~`9CS7_U=iUc7xF8_Nvn#U$c##uU0tZv)G);}60mO=zFLG(&sW^MElb{QUQZF9C zIp@akD~4oIg0qeg2vbYIIYNM5QNjoT0yb^*F8nKE(*;^XZ-2E>K;jz_x$pr0M0}*L z8h9Ci`x)rJch$g$2>{vrkN69lVHz1{zXSIHw^;dH5+l#r00000NkvXXu0mjfoY-!y delta 489 zcmV< z?OX6Q_xfS;R5R%ar*< z@*sNk?$hwmn1kt*+ol1)^E~Rh##+n6{e7pPu4|N1JPSkYkDqLs$E|{K5MXU9sjt3H z5`r*9O360TG({=J!F0;SYSj`brLfi#MG=cQrZ9$^qJZ;rcX8zV_*x@`aOVqS*ei@- zY%QCrB2ClZmw)e|-xETRXBkyh0Wk2jW>ZxRg&>L|cd#tWKSob-IGZu-%=WcrP#8lH zhC3Di1*H^)F${nmqwWJKWvgI2H2;G|90OgD`hSGh?VFELT;N?Tni)v|{n7ps-a2;k;ddCvE5pP5f2-ut)DoB2fE f>p5?G)EE8*H?*P5umHrETbb&08{RhaQfQnFka1TQgTasnBxXx>Qwqvx`X7J45dlky7 z9xCP~i}Wty^}Ww<0SLfEo(0y~b9#dcluTts?|rfR}osHW}&IaqZDS9EVVmjv@paU?hueD@B%Ex51j!iSo}RUTD~T$_sW z>q{H=8hz*0XX_Ro1l7uX@4qZgg7jN~{eQ?i{@J^$r=2gU`rbVW(nuHp0000+S` literal 0 HcmV?d00001 diff --git a/textures/blocks/spore_blossom.png b/textures/blocks/spore_blossom.png new file mode 100644 index 0000000000000000000000000000000000000000..164bd293fdbe437b09691f2a2217166cce12c3e0 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`8$DedLo7}wCrI3T;P++Ke+8dy z&-7JF|FXH*XNV-8zPrf*_;f#PlTV{i%lbK9QVp2phQzUc8zH3i;j-5!dFjYRz;q&?S h-pfi@Lo80OowS>`!GXtFl7p+N zErC~s%WXjd)3OBbfC+L&KTSF&`+YB#nLl~i&+IeV^?KFiMcek?4YfFG$A8=K&gJ=2 z=j?Vkp!}dPOI{(%qPdz?>qh#vs~l5RQrK2Vnn)CN#Bu$p=S(<%W&MNDfQhU^OGG(X zv?Mo7U+;Oz&Vb=vwfq;o*Zl#!Q&%5*86DYq#^r6}2i|<4wLT4kD-MP1dcR>+%+i|s g^QK0oitg*zopr0N-0%Bme*a literal 0 HcmV?d00001 diff --git a/textures/blocks/tinted_glass.png b/textures/blocks/tinted_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..cd1dd46e4400286c03e96a33741862c5d15dfec0 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`t)4E9Ar_~T4X$pmYwX!7%Jaa4 zC)?viqv0kQA6w>*fbgp)oR7`Ri%aOy>+9Pn<*+7g4cml8k}ZyLjnWRQ(gfIAxtULh z6qzjE(I9hHLr=lo_ztUxG(*v`h8+wdc@Ih)`WQDvD4*s&5$Lyx`@&`Jb7x$7(nOdO mB1NX9PTZ_-lka>vt?$<} z?>61#_dOiMWSRVa6PS!K1_~c4kgGVk>*5cf&-eG)fiRerSv@Hb?T9n!*spW2Wwts2 zbGWkLL#;L?b3VaDI=4eP^(BKD>bUnO`OSGC>9JO*9Gb}u~R7~ zsi=3iNV$oXca@VJb~J;07*GdSJIWzW+ea$=8|!>FzX(3`4l4Zu00000NkvXXu0mjf DDEnxs literal 0 HcmV?d00001 diff --git a/textures/blocks/weathered_copper.png b/textures/blocks/weathered_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..10d24e1144dd2b454e6aa9ca38a14e8363a4d981 GIT binary patch literal 281 zcmV+!0p|XRP)K^{B2$llstr}o8SmlzD+z)ObccVL2`!6H86DzWE;L;G?VSULyP#<8M0llEC fkTR=Bf3J7}bSHAi%WlvD00000NkvXXu0mjfhW~c? literal 0 HcmV?d00001 diff --git a/textures/blocks/weathered_cut_copper.png b/textures/blocks/weathered_cut_copper.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9ed405289bff1e7b6b212c7232805e5e15e5a0 GIT binary patch literal 284 zcmV+%0ptFOP)B3Q04hUk6gA%T1URM7