0999312 1 year ago
parent
commit
1f08d250aa
86 changed files with 2431 additions and 170 deletions
  1. 5 2
      build.gradle
  2. BIN
      libs/DynamicTrees-1.12.2-0.9.5-deobf.jar
  3. 9 1
      src/main/java/cn/mcmod/sakura/CommonProxy.java
  4. 1 1
      src/main/java/cn/mcmod/sakura/SakuraOreDictLoader.java
  5. 2 1
      src/main/java/cn/mcmod/sakura/block/BlockBambooBlock.java
  6. 18 19
      src/main/java/cn/mcmod/sakura/block/BlockCampfire.java
  7. 11 11
      src/main/java/cn/mcmod/sakura/block/BlockCampfirePot.java
  8. 19 1
      src/main/java/cn/mcmod/sakura/block/BlockLoader.java
  9. 33 0
      src/main/java/cn/mcmod/sakura/block/BlockTaiko.java
  10. 0 3
      src/main/java/cn/mcmod/sakura/block/crop/BlockEggplantCrop.java
  11. 33 0
      src/main/java/cn/mcmod/sakura/block/crop/BlockFallenLeavesMushroom.java
  12. 1 1
      src/main/java/cn/mcmod/sakura/block/crop/BlockPepperCrop.java
  13. 1 1
      src/main/java/cn/mcmod/sakura/block/crop/BlockVanillaCrop.java
  14. 79 0
      src/main/java/cn/mcmod/sakura/block/slab/BlockFallenLeaves.java
  15. 1 1
      src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSaplingGreen.java
  16. 24 5
      src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSaplingOrange.java
  17. 24 5
      src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSaplingRed.java
  18. 24 5
      src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSaplingYellow.java
  19. 2 2
      src/main/java/cn/mcmod/sakura/entity/villager/VillagerLoader.java
  20. 7 6
      src/main/java/cn/mcmod/sakura/entity/villager/WAVillagerHouse.java
  21. 29 28
      src/main/java/cn/mcmod/sakura/item/ItemLoader.java
  22. 0 3
      src/main/java/cn/mcmod/sakura/tileentity/TileEntityCampfire.java
  23. 10 6
      src/main/java/cn/mcmod/sakura/util/WorldUtil.java
  24. 66 11
      src/main/java/cn/mcmod/sakura/world/biome/BiomeMapleForest.java
  25. 444 0
      src/main/java/cn/mcmod/sakura/world/gen/WorldGenBigMaple.java
  26. 54 15
      src/main/java/cn/mcmod/sakura/world/gen/WorldGenMapleTree.java
  27. 56 15
      src/main/java/cn/mcmod/sakura/world/gen/WorldGenMapleTreeGreen.java
  28. 18 0
      src/main/resources/assets/sakura/blockstates/fallen_leaves_green.json
  29. 18 0
      src/main/resources/assets/sakura/blockstates/fallen_leaves_orange.json
  30. 18 0
      src/main/resources/assets/sakura/blockstates/fallen_leaves_red.json
  31. 18 0
      src/main/resources/assets/sakura/blockstates/fallen_leaves_yellow.json
  32. 17 0
      src/main/resources/assets/sakura/blockstates/taiko.json
  33. 55 0
      src/main/resources/assets/sakura/models/block/fallen_leaves.json
  34. 870 0
      src/main/resources/assets/sakura/models/block/taiko.json
  35. 6 0
      src/main/resources/assets/sakura/models/item/coin.json
  36. 7 0
      src/main/resources/assets/sakura/recipes/_constants.json
  37. 13 0
      src/main/resources/assets/sakura/recipes/bamboo.json
  38. 16 0
      src/main/resources/assets/sakura/recipes/bamboo_block_sunburnt.json
  39. 3 2
      src/main/resources/assets/sakura/recipes/bamboo_fence.json
  40. 20 0
      src/main/resources/assets/sakura/recipes/bamboo_fence_sunburnt.json
  41. 15 0
      src/main/resources/assets/sakura/recipes/bamboo_plank_slab.json
  42. 15 0
      src/main/resources/assets/sakura/recipes/bamboo_slab_sunburnt.json
  43. 17 0
      src/main/resources/assets/sakura/recipes/bamboo_stair_0.json
  44. 17 0
      src/main/resources/assets/sakura/recipes/bamboo_stair_1.json
  45. 17 0
      src/main/resources/assets/sakura/recipes/bamboo_stair_sunburnt_0.json
  46. 17 0
      src/main/resources/assets/sakura/recipes/bamboo_stair_sunburnt_1.json
  47. 14 0
      src/main/resources/assets/sakura/recipes/bamboo_sunburnt.json
  48. 15 0
      src/main/resources/assets/sakura/recipes/maple_cauldron.json
  49. 6 3
      src/main/resources/assets/sakura/recipes/maple_cookie.json
  50. 15 0
      src/main/resources/assets/sakura/recipes/maple_plank_slab.json
  51. 15 0
      src/main/resources/assets/sakura/recipes/maple_spile.json
  52. 3 3
      src/main/resources/assets/sakura/recipes/materials_24.json
  53. 0 13
      src/main/resources/assets/sakura/recipes/materials_24_alt.json
  54. 2 2
      src/main/resources/assets/sakura/recipes/paper.json
  55. 15 0
      src/main/resources/assets/sakura/recipes/sakura_plank_slab.json
  56. 17 0
      src/main/resources/assets/sakura/recipes/stairs_plank_bamboo_0.json
  57. 17 0
      src/main/resources/assets/sakura/recipes/stairs_plank_bamboo_1.json
  58. 17 0
      src/main/resources/assets/sakura/recipes/stairs_plank_maple_0.json
  59. 17 0
      src/main/resources/assets/sakura/recipes/stairs_plank_maple_1.json
  60. 17 0
      src/main/resources/assets/sakura/recipes/stairs_plank_sakura_0.json
  61. 17 0
      src/main/resources/assets/sakura/recipes/stairs_plank_sakura_1.json
  62. 13 0
      src/main/resources/assets/sakura/recipes/straw.json
  63. 17 0
      src/main/resources/assets/sakura/recipes/straw_block.json
  64. 15 0
      src/main/resources/assets/sakura/recipes/straw_slab.json
  65. 17 0
      src/main/resources/assets/sakura/recipes/straw_stair_0.json
  66. 17 0
      src/main/resources/assets/sakura/recipes/straw_stair_1.json
  67. 15 0
      src/main/resources/assets/sakura/recipes/taiko.json
  68. 7 3
      src/main/resources/assets/sakura/recipes/tatami.json
  69. 1 1
      src/main/resources/assets/sakura/shaders/block.properties
  70. 12 0
      src/main/resources/assets/sakura/sounds.json
  71. BIN
      src/main/resources/assets/sakura/sounds/taiko_1.ogg
  72. BIN
      src/main/resources/assets/sakura/sounds/taiko_2.ogg
  73. BIN
      src/main/resources/assets/sakura/sounds/taiko_3.ogg
  74. BIN
      src/main/resources/assets/sakura/sounds/taiko_4.ogg
  75. BIN
      src/main/resources/assets/sakura/textures/blocks/mapleleaves_green.png
  76. BIN
      src/main/resources/assets/sakura/textures/blocks/mapleleaves_orange.png
  77. BIN
      src/main/resources/assets/sakura/textures/blocks/mapleleaves_red.png
  78. BIN
      src/main/resources/assets/sakura/textures/blocks/mapleleaves_yellow.png
  79. BIN
      src/main/resources/assets/sakura/textures/blocks/osu_0.png
  80. BIN
      src/main/resources/assets/sakura/textures/blocks/osu_1.png
  81. BIN
      src/main/resources/assets/sakura/textures/blocks/osu_2.png
  82. BIN
      src/main/resources/assets/sakura/textures/blocks/osu_3.png
  83. BIN
      src/main/resources/assets/sakura/textures/blocks/sakura_diamond_ore.png
  84. BIN
      src/main/resources/assets/sakura/textures/items/coin.png
  85. BIN
      src/main/resources/assets/sakura/textures/items/sakura_diamond.png
  86. BIN
      src/main/resources/assets/sakura/textures/items/samurai_boots.png

+ 5 - 2
build.gradle

@@ -10,7 +10,7 @@ buildscript {
 apply plugin: 'net.minecraftforge.gradle.forge'
 //Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
 
-version = "V0.0.7.3-MC1.12.2"
+version = "V0.0.8-MC1.12.2"
 group = "cn.mcmod.sakura" // http://maven.apache.org/guides/mini/guide-naming-conventions.html
 archivesBaseName = "Sakura"
 
@@ -55,7 +55,9 @@ repositories {
         name = "CurseForge"
         url = "https://minecraft.curseforge.com/api/maven/"
     }
-
+	maven {
+		url = "http://tehnut.info/maven"
+	}
 }
 
 dependencies {
@@ -76,6 +78,7 @@ dependencies {
     }
     deobfCompile "CraftTweaker2:CraftTweaker2-API:4.1.19.547"
     deobfCompile "CraftTweaker2:ZenScript:4.1.19.547"
+	deobfCompile "mcp.mobius.waila:Hwyla:1.8.26-B41_1.12.2"
 }
 
 

BIN
libs/DynamicTrees-1.12.2-0.9.5-deobf.jar


+ 9 - 1
src/main/java/cn/mcmod/sakura/CommonProxy.java

@@ -16,11 +16,15 @@ import cn.mcmod.sakura.util.SakuraRecipeRegister;
 import cn.mcmod.sakura.world.gen.WorldGenLoader;
 import net.minecraft.block.Block;
 import net.minecraft.creativetab.CreativeTabs;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.SoundEvent;
 import net.minecraftforge.common.MinecraftForge;
+import net.minecraftforge.event.RegistryEvent;
 import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
 import net.minecraftforge.fml.common.event.FMLInitializationEvent;
 import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
 import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
+import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
 import net.minecraftforge.fml.common.network.NetworkRegistry;
 import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper;
 import net.minecraftforge.fml.common.registry.VillagerRegistry;
@@ -28,6 +32,7 @@ import net.minecraftforge.fml.relauncher.Side;
 
 @EventBusSubscriber
 public class CommonProxy {
+	public static final SoundEvent TAIKO = new SoundEvent(new ResourceLocation(SakuraMain.MODID, "taiko"));
     public static CreativeTabs tab;
     private static SimpleNetworkWrapper network;
     public static SimpleNetworkWrapper getNetwork() {
@@ -69,5 +74,8 @@ public class CommonProxy {
     public void spawnParticle(SakuraParticleType particleType, double x, double y, double z, double velX, double velY, double velZ) {
 
     }
-
+    @SubscribeEvent
+    public static void onSoundEvenrRegistration(RegistryEvent.Register<SoundEvent> event) {
+        event.getRegistry().register(TAIKO.setRegistryName(new ResourceLocation(SakuraMain.MODID, "taiko")));
+    }
 }

+ 1 - 1
src/main/java/cn/mcmod/sakura/SakuraOreDictLoader.java

@@ -25,7 +25,7 @@ public class SakuraOreDictLoader {
 		registerOre("cropSeaweed", new ItemStack(ItemLoader.MATERIAL, 1, 34));
 		registerOre("cropBambooshoot", new ItemStack(BlockLoader.BAMBOOSHOOT));
 		registerOre("bamboo", new ItemStack(BlockLoader.BAMBOO));
-
+		registerOre("bamboo", new ItemStack(ItemLoader.MATERIAL,1,48));
 		registerOre("listAlltofu", new ItemStack(ItemLoader.FOODSET,1,81));
 
 		registerOre("logWood", new ItemStack(Item.getItemFromBlock(BlockLoader.MAPLE_LOG), 1));

+ 2 - 1
src/main/java/cn/mcmod/sakura/block/BlockBambooBlock.java

@@ -22,12 +22,13 @@ public class BlockBambooBlock extends BlockRotatedPillar {
     public BlockBambooBlock(Material material,boolean sunburnt) {
         super(material);
         isSunburnt=sunburnt;
+        this.setTickRandomly(true);
         this.setCreativeTab(CommonProxy.tab);
     }
 
 	@Override
 	public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) {
-		if(!isSunburnt&&worldIn.canBlockSeeSky(pos)&&worldIn.isDaytime()){
+		if(!isSunburnt&&(worldIn.canBlockSeeSky(pos)||worldIn.getBlockState(pos.up()).getBlock() instanceof BlockBambooBlock)&&worldIn.isDaytime()){
 				worldIn.setBlockState(pos, (BlockLoader.BAMBOO_BLOCK_SUNBURNT).getDefaultState().withProperty(LOG_AXIS, state.getValue(LOG_AXIS)));
 		}
 		super.updateTick(worldIn, pos, state, rand);

+ 18 - 19
src/main/java/cn/mcmod/sakura/block/BlockCampfire.java

@@ -3,6 +3,7 @@ package cn.mcmod.sakura.block;
 import cn.mcmod.sakura.CommonProxy;
 import cn.mcmod.sakura.item.ItemLoader;
 import cn.mcmod.sakura.tileentity.TileEntityCampfire;
+import cn.mcmod.sakura.util.WorldUtil;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockContainer;
 import net.minecraft.block.ITileEntityProvider;
@@ -13,9 +14,9 @@ import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.init.Items;
-import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityFurnace;
 import net.minecraft.util.*;
 import net.minecraft.util.math.AxisAlignedBB;
 import net.minecraft.util.math.BlockPos;
@@ -102,9 +103,8 @@ public class BlockCampfire extends BlockContainer implements ITileEntityProvider
     @Override
     public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
         if (worldIn.isRemote)
-        {
             return true;
-        }
+        
 		ItemStack stack = playerIn.getHeldItem(hand);
 		TileEntity tile = worldIn.getTileEntity(pos);
 		if (hand == EnumHand.MAIN_HAND) {
@@ -118,26 +118,25 @@ public class BlockCampfire extends BlockContainer implements ITileEntityProvider
 		            return true;
 		        }
 		        if(stack.getItem()==ItemLoader.POT){
-				worldIn.setBlockToAir(pos);
-				worldIn.removeTileEntity(pos);
-				worldIn.setBlockState(pos, BlockLoader.CAMPFIRE_POT_IDLE.getDefaultState());
-				stack.shrink(1);
-		        return true;
+					worldIn.setBlockToAir(pos);
+					worldIn.removeTileEntity(pos);
+					worldIn.setBlockState(pos, BlockLoader.CAMPFIRE_POT_IDLE.getDefaultState());
+					stack.shrink(1);
+			        return true;
 		        }
-		        if (stack.getItem() == Items.STICK || stack.getItem() == Item.getItemFromBlock(BlockLoader.BAMBOO)) {
-		            if (!playerIn.isCreative()) {
-		                stack.shrink(1);
-		            }
-		            if (worldIn.rand.nextInt(8) == 0) {
-		                tileEntityCampfire.setBurningTime(tileEntityCampfire.getBurningTime() + 2000 + worldIn.rand.nextInt(400));
-		                
-		            }
+		        
+		        if (WorldUtil.isItemFuel(stack)) {
+		            tileEntityCampfire.setBurningTime(tileEntityCampfire.getBurningTime() + TileEntityFurnace.getItemBurnTime(stack));
+		            setState(true, worldIn, pos);
+					if(stack.getItem().hasContainerItem(stack)) stack = stack.getItem().getContainerItem(stack);
+						else stack.shrink(1);
 		            return true;
 		        }
 
-		        if (stack.getItem() == Items.FLINT_AND_STEEL && !isBurning) {
-		            tileEntityCampfire.setBurningTime(tileEntityCampfire.getBurningTime() + 10000 + worldIn.rand.nextInt(800));
-
+		        if (stack.getItem() == Items.FLINT_AND_STEEL) {
+		            tileEntityCampfire.setBurningTime(tileEntityCampfire.getBurningTime() + 10000);
+		            setState(true, worldIn, pos);
+		            stack.damageItem(1, playerIn);
 		            return true;
 		        }
 

+ 11 - 11
src/main/java/cn/mcmod/sakura/block/BlockCampfirePot.java

@@ -5,6 +5,7 @@ import cn.mcmod.sakura.SakuraMain;
 import cn.mcmod.sakura.gui.SakuraGuiHandler;
 import cn.mcmod.sakura.item.ItemLoader;
 import cn.mcmod.sakura.tileentity.TileEntityCampfirePot;
+import cn.mcmod.sakura.util.WorldUtil;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockContainer;
 import net.minecraft.block.ITileEntityProvider;
@@ -20,6 +21,7 @@ import net.minecraft.inventory.InventoryHelper;
 import net.minecraft.item.Item;
 import net.minecraft.item.ItemStack;
 import net.minecraft.tileentity.TileEntity;
+import net.minecraft.tileentity.TileEntityFurnace;
 import net.minecraft.util.*;
 import net.minecraft.util.math.AxisAlignedBB;
 import net.minecraft.util.math.BlockPos;
@@ -117,21 +119,19 @@ public class BlockCampfirePot extends BlockContainer implements ITileEntityProvi
 		            FluidUtil.interactWithFluidHandler(playerIn, hand, tile.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY, facing));
 		            return true;
 		        }
-
-		        if (stack.getItem() == Items.STICK || stack.getItem() == Item.getItemFromBlock(BlockLoader.BAMBOO) && !isBurning) {
-		            if (!playerIn.isCreative()) {
-		                stack.shrink(1);
-		            }
-		            if (worldIn.rand.nextInt(8) == 0){
-		                tileEntityCampfire.setBurningTime(tileEntityCampfire.getBurningTime() + 0 + worldIn.rand.nextInt(100));
-		                setState(true, worldIn, pos);
-		            }
+		        
+		        if (WorldUtil.isItemFuel(stack)) {
+		            tileEntityCampfire.setBurningTime(tileEntityCampfire.getBurningTime() + TileEntityFurnace.getItemBurnTime(stack));
+		            setState(true, worldIn, pos);
+					if(stack.getItem().hasContainerItem(stack)) stack = stack.getItem().getContainerItem(stack);
+						else stack.shrink(1);
 		            return true;
 		        }
 
-		        if (stack.getItem() == Items.FLINT_AND_STEEL && !isBurning) {
-		            tileEntityCampfire.setBurningTime(tileEntityCampfire.getBurningTime() + 12000 + worldIn.rand.nextInt(800));
+		        if (stack.getItem() == Items.FLINT_AND_STEEL) {
+		            tileEntityCampfire.setBurningTime(tileEntityCampfire.getBurningTime() + 10000);
 		            setState(true, worldIn, pos);
+		            stack.damageItem(1, playerIn);
 		            return true;
 		        }
 

+ 19 - 1
src/main/java/cn/mcmod/sakura/block/BlockLoader.java

@@ -169,7 +169,13 @@ public class BlockLoader {
 	public static Block BAMBOO_PLANK_SLAB = new BlockBambooSlab(Material.WOOD);
 	public static Block MAPLE_PLANK_SLAB = new BlockBambooSlab(Material.WOOD);
 	
+	public static Block FALLEN_LEAVES_MAPLE_RED =new BlockFallenLeaves(Material.LEAVES).setSoundType(SoundType.PLANT).setHardness(0.15F).setResistance(0.2F);
+	public static Block FALLEN_LEAVES_MAPLE_GREEN =new BlockFallenLeaves(Material.LEAVES).setSoundType(SoundType.PLANT).setHardness(0.15F).setResistance(0.2F);
+	public static Block FALLEN_LEAVES_MAPLE_YELLOW =new BlockFallenLeaves(Material.LEAVES).setSoundType(SoundType.PLANT).setHardness(0.15F).setResistance(0.2F);
+	public static Block FALLEN_LEAVES_MAPLE_ORANGE =new BlockFallenLeaves(Material.LEAVES).setSoundType(SoundType.PLANT).setHardness(0.15F).setResistance(0.2F);
+	
 	public static Block MAPLE_SPILE = new BlockMapleSpile();
+	public static Block TAIKO = new BlockTaiko();
 	public BlockLoader(FMLPreInitializationEvent event) {
 //		register blocks
 //		DON'T REGISTER RENDERS IN THIS VOID,PLEASE!!!
@@ -219,6 +225,7 @@ public class BlockLoader {
         register(UDON_UNFINISHED, new ItemBlock(UDON_UNFINISHED), "udon_unfinished_block");
         registerNoItem(UDON_BLOCK, "udon_block");
         register(SOBA_BLOCK, new ItemBlock(SOBA_BLOCK), "soba_block");
+
         register(BAMBOOSHOOT, new ItemBlock(BAMBOOSHOOT), "bamboo_shoot");
         register(BAMBOO_PLANK, new ItemBlock(BAMBOO_PLANK), "plank_bamboo");
         register(BAMBOO_PLANK_STAIR, new ItemBlock(BAMBOO_PLANK_STAIR), "stairs_plank_bamboo");
@@ -254,15 +261,19 @@ public class BlockLoader {
         register(TATAMI_NS_CARPET, new ItemBlock(TATAMI_NS_CARPET), "tatami_ns_carpet");
         
 		registerNoItem(BAMBOODOOR, "bamboo_door");
-		register(MAPLE_SAPLING_RED, new ItemBlock(MAPLE_SAPLING_RED), "maple_sapling_red");
 		register(MAPLE_CAULDRON, new ItemBlock(MAPLE_CAULDRON), "maple_cauldron");
+		register(MAPLE_SAPLING_RED, new ItemBlock(MAPLE_SAPLING_RED), "maple_sapling_red");
 		register(MAPLE_LEAVE_RED, new ItemBlock(MAPLE_LEAVE_RED), "maple_leaves_red");
+		register(FALLEN_LEAVES_MAPLE_RED, new ItemBlock(FALLEN_LEAVES_MAPLE_RED), "fallen_leaves_red");
 		register(MAPLE_SAPLING_YELLOW, new ItemBlock(MAPLE_SAPLING_YELLOW), "maple_sapling_yellow");
 		register(MAPLE_LEAVE_YELLOW, new ItemBlock(MAPLE_LEAVE_YELLOW), "maple_leaves_yellow");
+		register(FALLEN_LEAVES_MAPLE_YELLOW, new ItemBlock(FALLEN_LEAVES_MAPLE_YELLOW), "fallen_leaves_yellow");
 		register(MAPLE_SAPLING_ORANGE, new ItemBlock(MAPLE_SAPLING_ORANGE), "maple_sapling_orange");
 		register(MAPLE_LEAVE_ORANGE, new ItemBlock(MAPLE_LEAVE_ORANGE), "maple_leaves_orange");
+		register(FALLEN_LEAVES_MAPLE_ORANGE, new ItemBlock(FALLEN_LEAVES_MAPLE_ORANGE), "fallen_leaves_orange");
 		register(MAPLE_SAPLING_GREEN, new ItemBlock(MAPLE_SAPLING_GREEN), "maple_sapling_green");
 		register(MAPLE_LEAVE_GREEN, new ItemBlock(MAPLE_LEAVE_GREEN), "maple_leaves_green");
+		register(FALLEN_LEAVES_MAPLE_GREEN, new ItemBlock(FALLEN_LEAVES_MAPLE_GREEN), "fallen_leaves_green");
 		register(MAPLE_LOG, new ItemBlock(MAPLE_LOG), "maple_log");
 		register(MAPLE_LOG_SAP, new ItemBlock(MAPLE_LOG_SAP), "maple_log_sap");
         register(MAPLE_PLANK, new ItemBlock(MAPLE_PLANK), "plank_maple");
@@ -288,6 +299,7 @@ public class BlockLoader {
 		register(KITUNEBI, new ItemBlock(KITUNEBI), "kitunebi");
 		register(SHOJI, new ItemBlock(SHOJI), "shoji");
 		register(ANDON, new ItemBlock(ANDON), "andon");
+        register(TAIKO, new ItemBlock(TAIKO), "taiko");
 		register(SAKURA_DIAMOND_ORE, new ItemBlock(SAKURA_DIAMOND_ORE), "sakura_diamond_ore");
 		registerNoItem(CAMPFIRE_LIT,"campfire_lit");
 		registerNoItem(CAMPFIRE_POT_IDLE, "campfire_pot_idle");
@@ -338,6 +350,12 @@ public class BlockLoader {
 	@SideOnly(Side.CLIENT)
 	public static void registerRenders() {
 //		please register blocks' renders in THIS void!
+		registerRender(TAIKO);
+		registerRender(FALLEN_LEAVES_MAPLE_GREEN);
+		registerRender(FALLEN_LEAVES_MAPLE_ORANGE);
+		registerRender(FALLEN_LEAVES_MAPLE_RED);
+		registerRender(FALLEN_LEAVES_MAPLE_YELLOW);
+		
 		registerRender(MAPLE_SPILE);
 		registerRender(STRAW_BLOCK);
 		registerRender(STRAW_BLOCK_STAIR);

+ 33 - 0
src/main/java/cn/mcmod/sakura/block/BlockTaiko.java

@@ -0,0 +1,33 @@
+package cn.mcmod.sakura.block;
+
+import cn.mcmod.sakura.CommonProxy;
+import cn.mcmod.sakura.util.RecipesUtil;
+import net.minecraft.block.SoundType;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.EnumHand;
+import net.minecraft.util.SoundCategory;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+import net.minecraftforge.oredict.OreDictionary;
+
+public class BlockTaiko extends BlockFacing {
+
+	public BlockTaiko() {
+		super(Material.WOOD, false);
+        this.setSoundType(SoundType.WOOD);
+        this.setHardness(1.2F);
+        this.setResistance(4.0F);
+	}
+	@Override
+	public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn,
+			EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
+		if(RecipesUtil.containsMatch(false, OreDictionary.getOres("stickWood"), playerIn.getHeldItem(hand))){
+			worldIn.playSound(playerIn, pos, CommonProxy.TAIKO, SoundCategory.BLOCKS, 1.2F, 1.2F);
+			playerIn.swingArm(hand);
+			}
+		return super.onBlockActivated(worldIn, pos, state, playerIn, hand, facing, hitX, hitY, hitZ);
+	}
+}

+ 0 - 3
src/main/java/cn/mcmod/sakura/block/crop/BlockEggplantCrop.java

@@ -7,16 +7,13 @@ public class BlockEggplantCrop extends BlockHighCrop {
 
 	public BlockEggplantCrop() {
 		super();
-		// TODO Auto-generated constructor stub
 	}
 	@Override
 	protected Item getCrop() {
-		// TODO Auto-generated method stub
 		return ItemLoader.EGGPLANT;
 	}
 	@Override
 	protected Item getSeed() {
-		// TODO Auto-generated method stub
 		return ItemLoader.EGGPLANT_SEEDS;
 	}
 }

+ 33 - 0
src/main/java/cn/mcmod/sakura/block/crop/BlockFallenLeavesMushroom.java

@@ -0,0 +1,33 @@
+package cn.mcmod.sakura.block.crop;
+
+import net.minecraft.block.BlockCrops;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+
+public class BlockFallenLeavesMushroom extends BlockCrops {
+	public static enum EnumMushroom{
+		brown_mushroom("brown_mushroom",new ItemStack(Blocks.BROWN_MUSHROOM)),
+		red_mushroom("red_mushroom",new ItemStack(Blocks.RED_MUSHROOM)),
+		shiitake("shiitake",new ItemStack(Blocks.RED_MUSHROOM)),
+		white_mushroom("white_mushroom",new ItemStack(Blocks.RED_MUSHROOM)),
+		shimeji("shimeji",new ItemStack(Blocks.RED_MUSHROOM));
+		private String unlocalizedName;
+		private ItemStack item_result;
+		private EnumMushroom(String name,ItemStack item){
+			setUnlocalizedName(name);
+			setResult(item);
+		}
+		public String getUnlocalizedName() {
+			return unlocalizedName;
+		}
+		public void setUnlocalizedName(String unlocalizedName) {
+			this.unlocalizedName = unlocalizedName;
+		}
+		public ItemStack getResult() {
+			return item_result;
+		}
+		public void setResult(ItemStack item_result) {
+			this.item_result = item_result;
+		}
+	}
+}

+ 1 - 1
src/main/java/cn/mcmod/sakura/block/crop/BlockPepperCrop.java

@@ -121,7 +121,7 @@ public class BlockPepperCrop extends BlockCrops implements IShearable {
 	@Override
 	public boolean canSustainPlant(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing direction,IPlantable plantable) {
         return state.getMaterial()==Material.GROUND||state.getMaterial()==Material.GRASS||
-        	(this.getAge(state)>=2&&state.getBlock() instanceof BlockPepperCrop)||(this.getAge(state)>=2&&state.getBlock() instanceof BlockPepperSplint);
+        	(state.getBlock() instanceof BlockPepperCrop&&this.getAge(state)>=2)||(state.getBlock() instanceof BlockPepperSplint);
 	}
 	
     public void grow(World worldIn, BlockPos pos, IBlockState state)

+ 1 - 1
src/main/java/cn/mcmod/sakura/block/crop/BlockVanillaCrop.java

@@ -129,7 +129,7 @@ public class BlockVanillaCrop extends BlockCrops implements IShearable {
 	public boolean canSustainPlant(IBlockState state, IBlockAccess world, BlockPos pos, EnumFacing direction,
 			IPlantable plantable) {
         return state.getMaterial()==Material.GROUND||state.getMaterial()==Material.GRASS||
-        	(this.getAge(state)>=2&&state.getBlock() instanceof BlockVanillaCrop)||(this.getAge(state)>=2&&state.getBlock() instanceof BlockVanillaSplint);
+        	(state.getBlock() instanceof BlockVanillaCrop&&this.getAge(state)>=2)||(state.getBlock() instanceof BlockVanillaSplint);
 	}
 	
     public void grow(World worldIn, BlockPos pos, IBlockState state)

+ 79 - 0
src/main/java/cn/mcmod/sakura/block/slab/BlockFallenLeaves.java

@@ -0,0 +1,79 @@
+package cn.mcmod.sakura.block.slab;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cn.mcmod.sakura.block.BlockBase;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.state.BlockFaceShape;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.util.BlockRenderLayer;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.NonNullList;
+import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.IBlockAccess;
+import net.minecraft.world.World;
+import net.minecraftforge.common.IShearable;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+public class BlockFallenLeaves extends BlockBase implements IShearable{
+	protected static final AxisAlignedBB CARPET_AABB = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.0625D, 1.0D);
+	public BlockFallenLeaves(Material material) {
+		super(material);
+	}
+	@Override
+	public AxisAlignedBB getCollisionBoundingBox(IBlockState blockState, IBlockAccess worldIn, BlockPos pos) {
+		return NULL_AABB;
+	}
+	@Override
+	public AxisAlignedBB getSelectedBoundingBox(IBlockState state, World worldIn, BlockPos pos) {
+		return CARPET_AABB;
+	}
+	@Override
+	public boolean isOpaqueCube(IBlockState state) {
+		return false;
+	}
+	@Override
+	public boolean isFullBlock(IBlockState state) {
+		return false;
+	}
+	@Override
+	public boolean isFullCube(IBlockState state) {
+		return false;
+	}
+
+	@Override
+    public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) {
+        return face == EnumFacing.DOWN ? BlockFaceShape.SOLID : BlockFaceShape.UNDEFINED;
+    }
+    @SideOnly(Side.CLIENT)
+    public boolean shouldSideBeRendered(IBlockState blockState, IBlockAccess blockAccess, BlockPos pos, EnumFacing side){
+        if (side == EnumFacing.UP) {
+            return true;
+        }
+		return blockAccess.getBlockState(pos.offset(side)).getBlock() == this ? true : super.shouldSideBeRendered(blockState, blockAccess, pos, side);
+    }
+    @Override
+    @SideOnly(Side.CLIENT)
+    public BlockRenderLayer getBlockLayer(){
+        return Blocks.LEAVES.getBlockLayer();
+    }
+    @Override
+    public void getDrops(NonNullList<ItemStack> drops, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
+    	drops.clear();
+    }
+	@Override
+	public boolean isShearable(ItemStack item, IBlockAccess world, BlockPos pos) {
+		return true;
+	}
+	@Override
+	public List<ItemStack> onSheared(ItemStack item, IBlockAccess world, BlockPos pos, int fortune) {
+		List<ItemStack> list = new ArrayList<ItemStack>();
+		list.add(new ItemStack(this));
+		return list;
+	}
+}

+ 1 - 1
src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSaplingGreen.java

@@ -32,7 +32,7 @@ public class BlockMapleSaplingGreen extends BlockBush implements IGrowable {
 
     @Override
     public void grow(World world, Random rand, BlockPos pos, IBlockState state) {
-        WorldGenerator treeGenerator = rand.nextInt(8) == 0 ? new WorldGenMapleTreeGreen(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState(),true) : new WorldGenMapleTreeGreen(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState(),false);
+        WorldGenerator treeGenerator = rand.nextInt(8) == 0 ? new WorldGenMapleTreeGreen(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_GREEN.getDefaultState(),true) : new WorldGenMapleTreeGreen(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_GREEN.getDefaultState(),false);
 
         world.setBlockState(pos, Blocks.AIR.getDefaultState(), 4);
 

+ 24 - 5
src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSaplingOrange.java

@@ -2,6 +2,7 @@ package cn.mcmod.sakura.block.tree;
 
 import cn.mcmod.sakura.CommonProxy;
 import cn.mcmod.sakura.block.BlockLoader;
+import cn.mcmod.sakura.world.gen.WorldGenBigMaple;
 import cn.mcmod.sakura.world.gen.WorldGenMapleTree;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockBush;
@@ -32,14 +33,32 @@ public class BlockMapleSaplingOrange extends BlockBush implements IGrowable {
 
     @Override
     public void grow(World world, Random rand, BlockPos pos, IBlockState state) {
-        WorldGenerator treeGenerator = rand.nextInt(8) == 0 ? new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(),true) : new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(),false);
-
+    	WorldGenerator treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(),false);
+    	switch (rand.nextInt(16)) {
+		case 0:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_ORANGE.getDefaultState(), BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(), true);
+			break;
+		case 1:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_ORANGE.getDefaultState(), BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(), false);
+			break;
+		case 2:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_ORANGE.getDefaultState(), BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(), false);
+			break;
+		case 3:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(),true);
+			break;
+		case 4:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(),true);
+			break;
+		case 5:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(),true);
+			break;
+		default:
+			break;
+		}
         world.setBlockState(pos, Blocks.AIR.getDefaultState(), 4);
-
         if (!treeGenerator.generate(world, rand, pos)) {
-
             world.setBlockState(pos, state, 4);
-
         }
     }
     @Override

+ 24 - 5
src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSaplingRed.java

@@ -2,6 +2,7 @@ package cn.mcmod.sakura.block.tree;
 
 import cn.mcmod.sakura.CommonProxy;
 import cn.mcmod.sakura.block.BlockLoader;
+import cn.mcmod.sakura.world.gen.WorldGenBigMaple;
 import cn.mcmod.sakura.world.gen.WorldGenMapleTree;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockBush;
@@ -32,14 +33,32 @@ public class BlockMapleSaplingRed extends BlockBush implements IGrowable {
 
     @Override
     public void grow(World world, Random rand, BlockPos pos, IBlockState state) {
-        WorldGenerator treeGenerator = rand.nextInt(8) == 0 ? new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(),true) : new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(),false);
-
+    	WorldGenerator treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(),false);
+    	switch (rand.nextInt(16)) {
+		case 0:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_RED.getDefaultState(), BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(), true);
+			break;
+		case 1:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_RED.getDefaultState(), BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(), false);
+			break;
+		case 2:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_RED.getDefaultState(), BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(), false);
+			break;
+		case 3:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(),true);
+			break;
+		case 4:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(),true);
+			break;
+		case 5:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(),true);
+			break;
+		default:
+			break;
+		}
         world.setBlockState(pos, Blocks.AIR.getDefaultState(), 4);
-
         if (!treeGenerator.generate(world, rand, pos)) {
-
             world.setBlockState(pos, state, 4);
-
         }
     }
     @Override

+ 24 - 5
src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSaplingYellow.java

@@ -2,6 +2,7 @@ package cn.mcmod.sakura.block.tree;
 
 import cn.mcmod.sakura.CommonProxy;
 import cn.mcmod.sakura.block.BlockLoader;
+import cn.mcmod.sakura.world.gen.WorldGenBigMaple;
 import cn.mcmod.sakura.world.gen.WorldGenMapleTree;
 import net.minecraft.block.Block;
 import net.minecraft.block.BlockBush;
@@ -32,14 +33,32 @@ public class BlockMapleSaplingYellow extends BlockBush implements IGrowable {
 
     @Override
     public void grow(World world, Random rand, BlockPos pos, IBlockState state) {
-        WorldGenerator treeGenerator = rand.nextInt(8) == 0 ? new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(),true) : new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(),false);
-
+    	WorldGenerator treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(),false);
+    	switch (rand.nextInt(16)) {
+		case 0:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_YELLOW.getDefaultState(), BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(), true);
+			break;
+		case 1:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_YELLOW.getDefaultState(), BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(), false);
+			break;
+		case 2:
+			treeGenerator = new WorldGenBigMaple(true, BlockLoader.MAPLE_LOG.getDefaultState(), BlockLoader.MAPLE_SAPLING_YELLOW.getDefaultState(), BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(), false);
+			break;
+		case 3:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(),true);
+			break;
+		case 4:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(),true);
+			break;
+		case 5:
+			treeGenerator = new WorldGenMapleTree(true,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(),true);
+			break;
+		default:
+			break;
+		}
         world.setBlockState(pos, Blocks.AIR.getDefaultState(), 4);
-
         if (!treeGenerator.generate(world, rand, pos)) {
-
             world.setBlockState(pos, state, 4);
-
         }
     }
     @Override

+ 2 - 2
src/main/java/cn/mcmod/sakura/entity/villager/VillagerLoader.java

@@ -112,7 +112,7 @@ public class VillagerLoader {
 		public void addMerchantRecipe(IMerchant merchant, MerchantRecipeList recipeList, Random random)
 		{
 			int i = price != null ? price.getPrice(random) : 1;
-			recipeList.add(new MerchantRecipe(new ItemStack(Items.EMERALD, i, 0),item.copy()));
+			recipeList.add(new MerchantRecipe(new ItemStack(ItemLoader.MATERIAL, i, 50),item.copy()));
         }
 	}
     private static class SimpleSell implements ITradeList{
@@ -127,7 +127,7 @@ public class VillagerLoader {
 		public void addMerchantRecipe(IMerchant merchant, MerchantRecipeList recipeList, Random random)
 		{
 			int i = price != null ? price.getPrice(random) : 1;
-			recipeList.add(new MerchantRecipe(item.copy(),new ItemStack(Items.EMERALD, i, 0)));
+			recipeList.add(new MerchantRecipe(item.copy(),new ItemStack(ItemLoader.MATERIAL, i, 50)));
         }
 	}
 }

+ 7 - 6
src/main/java/cn/mcmod/sakura/entity/villager/WAVillagerHouse.java

@@ -58,8 +58,9 @@ public class WAVillagerHouse extends StructureVillagePieces.Village {
         }
 
         IBlockState iblockstate = Blocks.STONE.getDefaultState();
-        IBlockState iblockstate1 = BlockLoader.BAMBOO_PLANK_STAIR.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.NORTH);
-        IBlockState iblockstate2 = BlockLoader.BAMBOO_PLANK_STAIR.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.SOUTH);
+        IBlockState iblockstate1 = BlockLoader.STRAW_BLOCK_STAIR.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.NORTH);
+        IBlockState iblockstate2 = BlockLoader.STRAW_BLOCK_STAIR.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.SOUTH);
+        IBlockState iblockstate000 = BlockLoader.BAMBOO_PLANK_STAIR.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.NORTH);
         IBlockState iblockstate3 = BlockLoader.BAMBOO_PLANK_STAIR.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.EAST);
         IBlockState iblockstate4 = BlockLoader.BAMBOO_PLANK.getDefaultState();
         IBlockState iblockstate5 = BlockLoader.MAPLE_PLANK_STAIR.getDefaultState().withProperty(BlockFacing.FACING, EnumFacing.NORTH);
@@ -111,10 +112,10 @@ public class WAVillagerHouse extends StructureVillagePieces.Village {
         this.fillWithBlocks(worldIn, structureBoundingBoxIn, 1, 4, 4, 7, 4, 4, iblockstate4, iblockstate4, false);
         this.setBlockState(worldIn, iblockstate4, 7, 1, 4, structureBoundingBoxIn);
         this.setBlockState(worldIn, iblockstate3, 7, 1, 3, structureBoundingBoxIn);
-        this.setBlockState(worldIn, iblockstate1, 6, 1, 4, structureBoundingBoxIn);
-        this.setBlockState(worldIn, iblockstate1, 5, 1, 4, structureBoundingBoxIn);
-        this.setBlockState(worldIn, iblockstate1, 4, 1, 4, structureBoundingBoxIn);
-        this.setBlockState(worldIn, iblockstate1, 3, 1, 4, structureBoundingBoxIn);
+        this.setBlockState(worldIn, iblockstate000, 6, 1, 4, structureBoundingBoxIn);
+        this.setBlockState(worldIn, iblockstate000, 5, 1, 4, structureBoundingBoxIn);
+        this.setBlockState(worldIn, iblockstate000, 4, 1, 4, structureBoundingBoxIn);
+        this.setBlockState(worldIn, iblockstate000, 3, 1, 4, structureBoundingBoxIn);
         this.setBlockState(worldIn, iblockstate6, 6, 1, 3, structureBoundingBoxIn);
         this.setBlockState(worldIn, Blocks.WOODEN_PRESSURE_PLATE.getDefaultState(), 6, 2, 3, structureBoundingBoxIn);
         this.setBlockState(worldIn, iblockstate6, 4, 1, 3, structureBoundingBoxIn);

+ 29 - 28
src/main/java/cn/mcmod/sakura/item/ItemLoader.java

@@ -112,46 +112,46 @@ public class ItemLoader {
             new float[]{
                     1F * 0.25F, 3F * 0.25F, 5F * 0.25F,
                     4F * 0.25F, 5F * 0.25F, 2F * 0.25F,
-                    9F * 0.25F, 4F * 0.25F, 5F * 0.25F,
-                    7F * 0.25F, 9F * 0.25F, 7F * 0.25F,
-                    6F * 0.25F, 5F * 0.25F, 10F * 0.25F,
-                    9F * 0.25F, 10F * 0.25F, 9F * 0.25F,
-                    9F * 0.25F, 4F * 0.25F, 9F * 0.25F,
-                    6F * 0.25F, 9F * 0.25F, 10F * 0.25F,
-                    10F * 0.25F, 14F * 0.25F, 4F * 0.25F,
-                    9F * 0.25F, 6F * 0.25F, 9F * 0.25F,
-                    10F * 0.25F, 10F * 0.25F, 14F * 0.25F,
-                    8F * 0.25F, 4F * 0.25F, 9F * 0.25F,
-                    6F * 0.25F, 9F * 0.25F, 10F * 0.25F,
-                    10F * 0.25F, 14F * 0.25F, 8F * 0.25F,
-                    5F * 0.25F, 6F * 0.25F, 8F * 0.25F,
-                    7F * 0.25F, 6F * 0.25F, 10F * 0.25F,
-                    2F * 0.25F, 8F * 0.25F, 10F * 0.25F,
-                    7F * 0.25F, 12F * 0.25F, 12F * 0.25F,
-                    9F * 0.25F, 14F * 0.25F, 14F * 0.25F,
+                    9F * 0.1F, 4F * 0.25F, 5F * 0.25F,
+                    7F * 0.15F, 9F * 0.1F, 7F * 0.15F,
+                    6F * 0.25F, 5F * 0.25F, 10F * 0.05F,
+                    9F * 0.1F, 10F * 0.05F, 9F * 0.1F,
+                    9F * 0.1F, 4F * 0.25F, 9F * 0.1F,
+                    6F * 0.25F, 9F * 0.1F, 10F * 0.05F,
+                    10F * 0.05F, 14F * 0.05F, 4F * 0.25F,
+                    9F * 0.1F, 6F * 0.25F, 9F * 0.1F,
+                    10F * 0.05F, 10F * 0.05F, 14F * 0.05F,
+                    8F * 0.15F, 4F * 0.25F, 9F * 0.1F,
+                    6F * 0.25F, 9F * 0.1F, 10F * 0.05F,
+                    10F * 0.05F, 14F * 0.05F, 8F * 0.15F,
+                    5F * 0.25F, 6F * 0.25F, 8F * 0.15F,
+                    7F * 0.2F, 6F * 0.25F, 10F * 0.05F,
+                    2F * 0.25F, 8F * 0.15F, 10F * 0.05F,
+                    7F * 0.2F, 12F * 0.05F, 12F * 0.05F,
+                    9F * 0.1F, 14F * 0.05F, 14F * 0.05F,
                     5F * 0.25F, 4F * 0.25F, 6F * 0.25F,
-                    7F * 0.25F, 8F * 0.25F, 8F * 0.25F,
-                    2F * 0.25F, 7F * 0.25F, 9F * 0.25F,
-                    12F * 0.25F, 12F * 0.25F, 8F * 0.25F,
-                    7F * 0.25F, 8F * 0.25F, 10F * 0.25F,
-                    10F * 0.25F, 3F * 0.25F, 6F * 0.25F,
-                    6F * 0.25F, 5F * 0.25F, 8F * 0.25F,
+                    7F * 0.15F, 8F * 0.15F, 8F * 0.15F,
+                    2F * 0.25F, 7F * 0.15F, 9F * 0.1F,
+                    12F * 0.01F, 12F * 0.01F, 8F * 0.15F,
+                    7F * 0.15F, 8F * 0.15F, 10F * 0.05F,
+                    10F * 0.05F, 3F * 0.25F, 6F * 0.25F,
+                    6F * 0.25F, 5F * 0.25F, 8F * 0.15F,
                     1F * 0.25F, 5F * 0.25F, 4F * 0.25F,
                     2F * 0.25F, 5F * 0.25F, 6F * 0.25F,
                     5F * 0.25F, 5F * 0.25F, 5F * 0.25F,
                     4F * 0.25F, 6F * 0.25F, 6F * 0.25F,
                     0.8F, 0.6F, 0.8F,
-                    8F * 0.25F, 8F * 0.25F, 8F * 0.25F,
-                    8F * 0.25F, 8F * 0.25F, 8F * 0.25F,
+                    8F * 0.15F, 8F * 0.15F, 8F * 0.15F,
+                    8F * 0.15F, 8F * 0.15F, 8F * 0.15F,
                     4F * 0.25F, 6F * 0.25F, 6F * 0.25F,
-                    7F * 0.25F, 5F * 0.25F, 6F * 0.25F,
+                    7F * 0.15F, 5F * 0.25F, 6F * 0.25F,
                     6F * 0.25F, 6F * 0.25F, 4F * 0.25F,//107
                     2F * 0.25F, 5F * 0.25F, 4F * 0.25F,//110
                     5F * 0.25F, 2F * 0.01F, 6F * 0.25F,
                     0.2F      , 0.2F      , 0.2F,
                     0.2F      , 0.2F      , 0.2F,
                     0.1F, 0.5F, 0.2F,
-                    8F * 0.25F, 8F * 0.25F, 8F * 0.25F,
+                    8F * 0.15F, 8F * 0.15F, 8F * 0.15F,
             },
             new String[]{
                     SakuraMain.MODID + "." + "grape",
@@ -376,7 +376,8 @@ public class ItemLoader {
             SakuraMain.MODID + "." + "bamboo_sunburnt",//48
            
             SakuraMain.MODID + "." + "maple_syrup",//49
-    });
+            SakuraMain.MODID + "." + "coin",//50
+            });
     public static Item POT = new ItemPot();
     public static Item KNIFE_NOODLE = new ItemKnifeNoodle();
     public static Item SAKURA_DIAMOND = new ItemSakuraDiamond();

+ 0 - 3
src/main/java/cn/mcmod/sakura/tileentity/TileEntityCampfire.java

@@ -84,12 +84,9 @@ public class TileEntityCampfire extends TileEntity implements ITickable {
             //check can cook
             if (this.isBurning() & this.isFinishedCook()) {
                 cookstack = getItemBurning();
-
                 ItemStack itemstack1 = FurnaceRecipes.instance().getSmeltingResult(cookstack);
-
                 if (!cookstack.isEmpty()) {
                     if (!itemstack1.isEmpty()) {
-
                         if (this.isBurning() && this.cookTime >= 0) {
                             this.isFinishedCook = false;
                             flag1 = true;

+ 10 - 6
src/main/java/cn/mcmod/sakura/util/WorldUtil.java

@@ -5,22 +5,26 @@ import net.minecraft.block.Block;
 import net.minecraft.block.BlockFire;
 import net.minecraft.block.BlockMagma;
 import net.minecraft.init.Blocks;
+import net.minecraft.item.ItemStack;
+import net.minecraft.tileentity.TileEntityFurnace;
 import net.minecraft.util.math.BlockPos;
 import net.minecraft.world.World;
 
 public class WorldUtil {
     
-    public static int getHeatStrength(World par1World, BlockPos pos)
-    {
-        for (int i = 1; i < 5; i++)
-        {
+    public static int getHeatStrength(World par1World, BlockPos pos) {
+        for (int i = 1; i < 5; i++) {
             Block block = par1World.getBlockState(pos.down(i)).getBlock();
-            if (block instanceof BlockCampfire||block instanceof BlockMagma||block instanceof BlockFire || block == Blocks.LAVA || block == Blocks.FLOWING_LAVA)
-            {
+            if (block instanceof BlockCampfire||block instanceof BlockMagma||block instanceof BlockFire || block == Blocks.LAVA || block == Blocks.FLOWING_LAVA) {
                 return i <= 3 ? 2 : 1;
             }
         }
         return 0;
     }
+    public static boolean isItemFuel(ItemStack stack){
+        return TileEntityFurnace.getItemBurnTime(stack) > 0;
+    }
+    
+
     
 }

+ 66 - 11
src/main/java/cn/mcmod/sakura/world/biome/BiomeMapleForest.java

@@ -2,6 +2,7 @@ package cn.mcmod.sakura.world.biome;
 
 import cn.mcmod.sakura.block.BlockLoader;
 import cn.mcmod.sakura.entity.EntityDeer;
+import cn.mcmod.sakura.world.gen.WorldGenBigMaple;
 import cn.mcmod.sakura.world.gen.WorldGenMapleTree;
 import cn.mcmod.sakura.world.gen.WorldGenMapleTreeGreen;
 import net.minecraft.world.biome.Biome;
@@ -11,14 +12,21 @@ import net.minecraft.world.gen.feature.WorldGenerator;
 import java.util.Random;
 
 public class BiomeMapleForest extends Biome {
-    protected static final WorldGenerator RED_MAPLETREE = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(),false);
-    protected static final WorldGenerator RED_MAPLETREE_SAP = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(),true);
-    protected static final WorldGenerator YELLOW_MAPLETREE = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(),false);
-    protected static final WorldGenerator YELLOW_MAPLETREE_SAP = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(),true);
-    protected static final WorldGenerator ORANGE_MAPLETREE = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(),false);
-    protected static final WorldGenerator ORANGE_MAPLETREE_SAP = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(),true);
-    protected static final WorldGenerator GREEN_MAPLETREE = new WorldGenMapleTreeGreen(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState(),false);
-    protected static final WorldGenerator GREEN_MAPLETREE_SAP = new WorldGenMapleTreeGreen(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState(),true);
+    public static final WorldGenerator RED_MAPLETREE = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(),false);
+    public static final WorldGenerator RED_MAPLETREE_SAP = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(),true);
+    public static final WorldGenerator YELLOW_MAPLETREE = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(),false);
+    public static final WorldGenerator YELLOW_MAPLETREE_SAP = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(),true);
+    public static final WorldGenerator ORANGE_MAPLETREE = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(),false);
+    public static final WorldGenerator ORANGE_MAPLETREE_SAP = new WorldGenMapleTree(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(),true);
+    public static final WorldGenerator GREEN_MAPLETREE = new WorldGenMapleTreeGreen(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_GREEN.getDefaultState(),false);
+    public static final WorldGenerator GREEN_MAPLETREE_SAP = new WorldGenMapleTreeGreen(false,5, BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_GREEN.getDefaultState(),true);
+    
+    public static final WorldGenerator BIG_RED_MAPLETREE = new WorldGenBigMaple(false,BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_SAPLING_RED.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(),false);
+    public static final WorldGenerator BIG_RED_MAPLETREE_SAP = new WorldGenBigMaple(false,BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_SAPLING_RED.getDefaultState(),BlockLoader.MAPLE_LEAVE_RED.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState(),true);
+    public static final WorldGenerator BIG_YELLOW_MAPLETREE = new WorldGenBigMaple(false,BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_SAPLING_YELLOW.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(),false);
+    public static final WorldGenerator BIG_YELLOW_MAPLETREE_SAP = new WorldGenBigMaple(false,BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_SAPLING_YELLOW.getDefaultState(),BlockLoader.MAPLE_LEAVE_YELLOW.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_YELLOW.getDefaultState(),true);
+    public static final WorldGenerator BIG_ORANGE_MAPLETREE = new WorldGenBigMaple(false,BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_SAPLING_ORANGE.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(),false);
+    public static final WorldGenerator BIG_ORANGE_MAPLETREE_SAP = new WorldGenBigMaple(false,BlockLoader.MAPLE_LOG.getDefaultState(),BlockLoader.MAPLE_SAPLING_ORANGE.getDefaultState(),BlockLoader.MAPLE_LEAVE_ORANGE.getDefaultState(), BlockLoader.FALLEN_LEAVES_MAPLE_ORANGE.getDefaultState(),true);
     
     public BiomeMapleForest(BiomeProperties mapleForest) {
         super(mapleForest);
@@ -30,7 +38,7 @@ public class BiomeMapleForest extends Biome {
 
     public WorldGenAbstractTree getRandomTreeFeature(Random rand)
     {
-    	switch (rand.nextInt(8)) {
+    	switch (rand.nextInt(32)) {
 		case 0:
 			return (WorldGenAbstractTree)RED_MAPLETREE_SAP;
 		case 1:
@@ -47,9 +55,56 @@ public class BiomeMapleForest extends Biome {
 			return (WorldGenAbstractTree)GREEN_MAPLETREE_SAP;
 		case 7:
 			return (WorldGenAbstractTree)GREEN_MAPLETREE;	
-
+		case 8:
+			return (WorldGenAbstractTree)RED_MAPLETREE_SAP;
+		case 9:
+			return (WorldGenAbstractTree)RED_MAPLETREE;	
+		case 10:
+			return (WorldGenAbstractTree)YELLOW_MAPLETREE_SAP;
+		case 11:
+			return (WorldGenAbstractTree)YELLOW_MAPLETREE;	
+		case 12:
+			return (WorldGenAbstractTree)ORANGE_MAPLETREE_SAP;
+		case 13:
+			return (WorldGenAbstractTree)ORANGE_MAPLETREE;	
+		case 14:
+			return (WorldGenAbstractTree)GREEN_MAPLETREE_SAP;
+		case 15:
+			return (WorldGenAbstractTree)GREEN_MAPLETREE;
+		case 16:
+			return (WorldGenAbstractTree)BIG_RED_MAPLETREE_SAP;
+		case 17:
+			return (WorldGenAbstractTree)RED_MAPLETREE;	
+		case 18:
+			return (WorldGenAbstractTree)BIG_YELLOW_MAPLETREE_SAP;
+		case 19:
+			return (WorldGenAbstractTree)BIG_YELLOW_MAPLETREE;	
+		case 20:
+			return (WorldGenAbstractTree)BIG_ORANGE_MAPLETREE_SAP;
+		case 21:
+			return (WorldGenAbstractTree)BIG_ORANGE_MAPLETREE;	
+		case 22:
+			return (WorldGenAbstractTree)GREEN_MAPLETREE_SAP;
+		case 23:
+			return (WorldGenAbstractTree)GREEN_MAPLETREE;	
+		case 24:
+			return (WorldGenAbstractTree)RED_MAPLETREE_SAP;
+		case 25:
+			return (WorldGenAbstractTree)RED_MAPLETREE;	
+		case 26:
+			return (WorldGenAbstractTree)YELLOW_MAPLETREE_SAP;
+		case 27:
+			return (WorldGenAbstractTree)YELLOW_MAPLETREE;	
+		case 28:
+			return (WorldGenAbstractTree)ORANGE_MAPLETREE_SAP;
+		case 29:
+			return (WorldGenAbstractTree)ORANGE_MAPLETREE;	
+		case 30:
+			return (WorldGenAbstractTree)GREEN_MAPLETREE_SAP;
+		case 31:
+			return (WorldGenAbstractTree)GREEN_MAPLETREE;	
 		default:
-			return (WorldGenAbstractTree) RED_MAPLETREE;
+			return (WorldGenAbstractTree)RED_MAPLETREE;
 		}
     }
 }

+ 444 - 0
src/main/java/cn/mcmod/sakura/world/gen/WorldGenBigMaple.java

@@ -0,0 +1,444 @@
+package cn.mcmod.sakura.world.gen;
+
+import com.google.common.collect.Lists;
+
+import cn.mcmod.sakura.block.BlockLoader;
+
+import java.util.List;
+import java.util.Random;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockLeaves;
+import net.minecraft.block.BlockLog;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.init.Blocks;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.MathHelper;
+import net.minecraft.world.World;
+import net.minecraft.world.gen.feature.WorldGenAbstractTree;
+import net.minecraftforge.common.IPlantable;
+
+public class WorldGenBigMaple extends WorldGenAbstractTree{
+    private Random rand;
+    private World world;
+    private BlockPos basePos = BlockPos.ORIGIN;
+    int heightLimit;
+    int height;
+    double heightAttenuation = 0.618D;
+    double branchSlope = 0.381D;
+    double scaleWidth = 1.0D;
+    double leafDensity = 1.0D;
+    int trunkSize = 1;
+    int heightLimitLimit = 12;
+    /** Sets the distance limit for how far away the generator will populate leaves from the base leaf node. */
+    int leafDistanceLimit = 4;
+    List<WorldGenBigMaple.FoliageCoordinates> foliageCoords;
+
+    private final boolean generateSap;
+    private final IBlockState metaWood;
+    private final IBlockState metaSapling;
+    private final IBlockState metaLeaves;
+    private final IBlockState metaFallenLeaves;
+    
+    public WorldGenBigMaple(boolean notify,IBlockState woodMeta,IBlockState saplingMeta, IBlockState leafMeta,IBlockState fallenMeta, boolean sap) {
+        super(notify);
+        this.metaWood = woodMeta;
+        this.metaSapling = saplingMeta;
+        this.metaLeaves = leafMeta;
+        this.metaFallenLeaves = fallenMeta;
+        this.generateSap = sap;
+    }
+
+    /**
+     * Generates a list of leaf nodes for the tree, to be populated by generateLeaves.
+     */
+    void generateLeafNodeList()
+    {
+        this.height = (int)(this.heightLimit * this.heightAttenuation);
+
+        if (this.height >= this.heightLimit)
+        {
+            this.height = this.heightLimit - 1;
+        }
+
+        int i = (int)(1.382D + Math.pow(this.leafDensity * this.heightLimit / 13.0D, 2.0D));
+
+        if (i < 1)
+        {
+            i = 1;
+        }
+
+        int j = this.basePos.getY() + this.height;
+        int k = this.heightLimit - this.leafDistanceLimit;
+        this.foliageCoords = Lists.<WorldGenBigMaple.FoliageCoordinates>newArrayList();
+        this.foliageCoords.add(new WorldGenBigMaple.FoliageCoordinates(this.basePos.up(k), j));
+
+        for (; k >= 0; --k)
+        {
+            float f = this.layerSize(k);
+
+            if (f >= 0.0F)
+            {
+                for (int l = 0; l < i; ++l)
+                {
+                    double d0 = this.scaleWidth * f * (this.rand.nextFloat() + 0.328D);
+                    double d1 = this.rand.nextFloat() * 2.0F * Math.PI;
+                    double d2 = d0 * Math.sin(d1) + 0.5D;
+                    double d3 = d0 * Math.cos(d1) + 0.5D;
+                    BlockPos blockpos = this.basePos.add(d2, k - 1, d3);
+                    BlockPos blockpos1 = blockpos.up(this.leafDistanceLimit);
+
+                    if (this.checkBlockLine(blockpos, blockpos1) == -1)
+                    {
+                        int i1 = this.basePos.getX() - blockpos.getX();
+                        int j1 = this.basePos.getZ() - blockpos.getZ();
+                        double d4 = blockpos.getY() - Math.sqrt(i1 * i1 + j1 * j1) * this.branchSlope;
+                        int k1 = d4 > j ? j : (int)d4;
+                        BlockPos blockpos2 = new BlockPos(this.basePos.getX(), k1, this.basePos.getZ());
+
+                        if (this.checkBlockLine(blockpos2, blockpos) == -1)
+                        {
+                            this.foliageCoords.add(new WorldGenBigMaple.FoliageCoordinates(blockpos, blockpos2.getY()));
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    void crosSection(BlockPos pos, float p_181631_2_, IBlockState p_181631_3_)
+    {
+        int i = (int)(p_181631_2_ + 0.618D);
+
+        for (int j = -i; j <= i; ++j)
+        {
+            for (int k = -i; k <= i; ++k)
+            {
+                if (Math.pow(Math.abs(j) + 0.5D, 2.0D) + Math.pow(Math.abs(k) + 0.5D, 2.0D) <= p_181631_2_ * p_181631_2_)
+                {
+                    BlockPos blockpos = pos.add(j, 0, k);
+                    IBlockState state = this.world.getBlockState(blockpos);
+
+                    if (state.getBlock().isAir(state, world, blockpos) || state.getBlock().isLeaves(state, world, blockpos))
+                    {
+                        this.setBlockAndNotifyAdequately(this.world, blockpos, p_181631_3_);
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Gets the rough size of a layer of the tree.
+     */
+    float layerSize(int y)
+    {
+        if (y < this.heightLimit * 0.3F)
+        {
+            return -1.0F;
+        }
+		float f = this.heightLimit / 2.0F;
+		float f1 = f - y;
+		float f2 = MathHelper.sqrt(f * f - f1 * f1);
+
+		if (f1 == 0.0F)
+		{
+		    f2 = f;
+		}
+		else if (Math.abs(f1) >= f)
+		{
+		    return 0.0F;
+		}
+
+		return f2 * 0.5F;
+    }
+
+    float leafSize(int y)
+    {
+        if (y >= 0 && y < this.leafDistanceLimit)
+        {
+            return y != 0 && y != this.leafDistanceLimit - 1 ? 3.0F : 2.0F;
+        }
+		return -1.0F;
+    }
+
+    /**
+     * Generates the leaves surrounding an individual entry in the leafNodes list.
+     */
+    void generateLeafNode(BlockPos pos)
+    {
+        for (int i = 0; i < this.leafDistanceLimit; ++i)
+        {
+            this.crosSection(pos.up(i), this.leafSize(i), metaLeaves.withProperty(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false)));
+        }
+    }
+
+    void limb(BlockPos p_175937_1_, BlockPos p_175937_2_, Block p_175937_3_)
+    {
+        BlockPos blockpos = p_175937_2_.add(-p_175937_1_.getX(), -p_175937_1_.getY(), -p_175937_1_.getZ());
+        int i = this.getGreatestDistance(blockpos);
+        float f = (float)blockpos.getX() / (float)i;
+        float f1 = (float)blockpos.getY() / (float)i;
+        float f2 = (float)blockpos.getZ() / (float)i;
+
+        for (int j = 0; j <= i; ++j)
+        {
+            BlockPos blockpos1 = p_175937_1_.add(0.5F + j * f, 0.5F + j * f1, 0.5F + j * f2);
+            BlockLog.EnumAxis blocklog$enumaxis = this.getLogAxis(p_175937_1_, blockpos1);
+            this.setBlockAndNotifyAdequately(this.world, blockpos1, p_175937_3_.getDefaultState().withProperty(BlockLog.LOG_AXIS, blocklog$enumaxis));
+            if (this.generateSap && j == 1) {
+                if (this.world.getBlockState(blockpos1.add(0, j, 0))==this.metaWood) {
+                    this.addSapLog(this.world, blockpos1.add(0, j, 0));
+                }
+
+            }
+        }
+    }
+
+    /**
+     * Returns the absolute greatest distance in the BlockPos object.
+     */
+    private int getGreatestDistance(BlockPos posIn)
+    {
+        int i = MathHelper.abs(posIn.getX());
+        int j = MathHelper.abs(posIn.getY());
+        int k = MathHelper.abs(posIn.getZ());
+
+        if (k > i && k > j)
+        {
+            return k;
+        }
+		return j > i ? j : i;
+    }
+
+    private BlockLog.EnumAxis getLogAxis(BlockPos p_175938_1_, BlockPos p_175938_2_)
+    {
+        BlockLog.EnumAxis blocklog$enumaxis = BlockLog.EnumAxis.Y;
+        int i = Math.abs(p_175938_2_.getX() - p_175938_1_.getX());
+        int j = Math.abs(p_175938_2_.getZ() - p_175938_1_.getZ());
+        int k = Math.max(i, j);
+
+        if (k > 0)
+        {
+            if (i == k)
+            {
+                blocklog$enumaxis = BlockLog.EnumAxis.X;
+            }
+            else if (j == k)
+            {
+                blocklog$enumaxis = BlockLog.EnumAxis.Z;
+            }
+        }
+
+        return blocklog$enumaxis;
+    }
+
+    /**
+     * Generates the leaf portion of the tree as specified by the leafNodes list.
+     */
+    void generateLeaves()
+    {
+        for (WorldGenBigMaple.FoliageCoordinates worldgenbigtree$foliagecoordinates : this.foliageCoords)
+        {
+            this.generateLeafNode(worldgenbigtree$foliagecoordinates);
+        }
+    }
+
+    /**
+     * Indicates whether or not a leaf node requires additional wood to be added to preserve integrity.
+     */
+    boolean leafNodeNeedsBase(int p_76493_1_)
+    {
+        return p_76493_1_ >= this.heightLimit * 0.2D;
+    }
+
+    /**
+     * Places the trunk for the big tree that is being generated. Able to generate double-sized trunks by changing a
+     * field that is always 1 to 2.
+     */
+    void generateTrunk()
+    {
+        BlockPos blockpos = this.basePos;
+        BlockPos blockpos1 = this.basePos.up(this.height);
+        Block block = metaWood.getBlock();
+        this.limb(blockpos, blockpos1, block);
+
+        if (this.trunkSize == 2)
+        {
+            this.limb(blockpos.east(), blockpos1.east(), block);
+            this.limb(blockpos.east().south(), blockpos1.east().south(), block);
+            this.limb(blockpos.south(), blockpos1.south(), block);
+        }
+    }
+
+    /**
+     * Generates additional wood blocks to fill out the bases of different leaf nodes that would otherwise degrade.
+     */
+    void generateLeafNodeBases()
+    {
+        for (WorldGenBigMaple.FoliageCoordinates worldgenbigtree$foliagecoordinates : this.foliageCoords)
+        {
+            int i = worldgenbigtree$foliagecoordinates.getBranchBase();
+            BlockPos blockpos = new BlockPos(this.basePos.getX(), i, this.basePos.getZ());
+
+            if (!blockpos.equals(worldgenbigtree$foliagecoordinates) && this.leafNodeNeedsBase(i - this.basePos.getY()))
+            {
+                this.limb(blockpos, worldgenbigtree$foliagecoordinates,metaWood.getBlock());
+            }
+        }
+    }
+
+    /**
+     * Checks a line of blocks in the world from the first coordinate to triplet to the second, returning the distance
+     * (in blocks) before a non-air, non-leaf block is encountered and/or the end is encountered.
+     */
+    int checkBlockLine(BlockPos posOne, BlockPos posTwo)
+    {
+        BlockPos blockpos = posTwo.add(-posOne.getX(), -posOne.getY(), -posOne.getZ());
+        int i = this.getGreatestDistance(blockpos);
+        float f = (float)blockpos.getX() / (float)i;
+        float f1 = (float)blockpos.getY() / (float)i;
+        float f2 = (float)blockpos.getZ() / (float)i;
+
+        if (i == 0)
+        {
+            return -1;
+        }
+		for (int j = 0; j <= i; ++j)
+		{
+		    BlockPos blockpos1 = posOne.add(0.5F + j * f, 0.5F + j * f1, 0.5F + j * f2);
+
+		    if (!this.isReplaceable(world, blockpos1))
+		    {
+		        return j;
+		    }
+		}
+
+		return -1;
+    }
+
+    public void setDecorationDefaults()
+    {
+        this.leafDistanceLimit = 5;
+    }
+
+    public boolean generate(World worldIn, Random rand, BlockPos position)
+    {
+        this.world = worldIn;
+        this.basePos = position;
+        this.rand = new Random(rand.nextLong());
+
+        if (this.heightLimit == 0)
+        {
+            this.heightLimit = 5 + this.rand.nextInt(this.heightLimitLimit);
+        }
+
+        if (!this.validTreeLocation())
+        {
+            this.world = null; //Fix vanilla Mem leak, holds latest world
+            return false;
+        }
+		this.generateLeafNodeList();
+		this.generateLeaves();
+		this.generateTrunk();
+		this.generateLeafNodeBases();
+		this.fallenLeaves(worldIn, position, 6, 3, 6, this.metaFallenLeaves);
+		
+		this.world = null; //Fix vanilla Mem leak, holds latest world
+		
+		return true;
+    }
+
+    /**
+     * Returns a boolean indicating whether or not the current location for the tree, spanning basePos to to the height
+     * limit, is valid.
+     */
+    private boolean validTreeLocation()
+    {
+        BlockPos down = this.basePos.down();
+        net.minecraft.block.state.IBlockState state = this.world.getBlockState(down);
+        boolean isSoil = state.getBlock().canSustainPlant(state, this.world, down, net.minecraft.util.EnumFacing.UP, ((IPlantable)metaSapling.getBlock()));
+
+        if (!isSoil)
+        {
+            return false;
+        }
+		int i = this.checkBlockLine(this.basePos, this.basePos.up(this.heightLimit - 1));
+
+		if (i == -1)
+		{
+		    return true;
+		}
+		else if (i < 6)
+		{
+		    return false;
+		}
+		else
+		{
+		    this.heightLimit = i;
+		    return true;
+		}
+    }
+
+    static class FoliageCoordinates extends BlockPos
+        {
+            private final int branchBase;
+
+            public FoliageCoordinates(BlockPos pos, int p_i45635_2_)
+            {
+                super(pos.getX(), pos.getY(), pos.getZ());
+                this.branchBase = p_i45635_2_;
+            }
+
+            public int getBranchBase()
+            {
+                return this.branchBase;
+            }
+        }
+    /**
+     * Fill the given area with the selected blocks
+     */
+    private void fallenLeaves(World worldIn,BlockPos pos, int xADD, int yADD, int zADD, IBlockState insideBlockState){
+    	int xx = pos.getX();
+        int yy = pos.getY();
+        int zz = pos.getZ();
+        
+        boolean setFlg = false;
+        int YEND = 4;
+        for (int xx1 = xx - xADD; xx1 <= xx + xADD; xx1++) {
+          for (int zz1 = zz - zADD; zz1 <= zz + zADD; zz1++) {
+            if (((xx1 != xx - xADD) || (zz1 != zz - zADD)) && ((xx1 != xx + xADD) || (zz1 != zz - zADD)) && ((xx1 != xx - xADD) || (zz1 != zz + zADD)) && ((xx1 != xx + xADD) || (zz1 != zz + zADD)) && (((xx1 >= xx - xADD + 1) && (xx1 <= xx + xADD - 1) && (zz1 >= zz - zADD + 1) && (zz1 <= zz + zADD - 1)) || (worldIn.rand.nextInt(2) != 0)))
+            {
+              setFlg = false;
+              int yy1 = yy + yADD;
+              Block cBl = worldIn.getBlockState(new BlockPos(xx1, yy + yADD, zz1)).getBlock();
+              
+              if ((cBl == Blocks.AIR) || (cBl instanceof BlockLeaves) || (cBl == BlockLoader.CHESTNUTBURR)) {
+                for (yy1 = yy + yADD; yy1 >= yy - YEND; yy1--)
+                {
+                  boolean cAir = worldIn.isAirBlock(new BlockPos(xx1, yy1, zz1));
+                  cBl = worldIn.getBlockState(new BlockPos(xx1, yy1 - 1, zz1)).getBlock();
+                  if ((cBl == Blocks.AIR) || ((cBl != Blocks.GRASS) && !(cBl instanceof BlockLeaves) && (!worldIn.getBlockState(new BlockPos(xx1, yy1 - 1, zz1)).isOpaqueCube())))
+                  {
+                    if (cBl != Blocks.AIR) {
+                      break;
+                    }
+                  }
+                  else if (cAir)
+                  {
+                    setFlg = true;
+                    break;
+                  }
+                }
+              }
+              if (setFlg) {
+                setBlockAndNotifyAdequately(worldIn, new BlockPos(xx1, yy1, zz1), insideBlockState);
+              }
+            }
+          }
+        }
+    }
+    
+    private void addSapLog(World worldIn, BlockPos pos) {
+        this.setBlockAndNotifyAdequately(worldIn, pos, BlockLoader.MAPLE_LOG_SAP.getDefaultState());
+    }
+}

+ 54 - 15
src/main/java/cn/mcmod/sakura/world/gen/WorldGenMapleTree.java

@@ -1,6 +1,7 @@
 package cn.mcmod.sakura.world.gen;
 
 import cn.mcmod.sakura.block.BlockLoader;
+import net.minecraft.block.Block;
 import net.minecraft.block.BlockLeaves;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -14,32 +15,25 @@ import java.util.Random;
 public class WorldGenMapleTree extends WorldGenAbstractTree {
     private static final IBlockState DEFAULT_TRUNK = BlockLoader.MAPLE_LOG.getDefaultState();
     private static final IBlockState DEFAULT_LEAF = BlockLoader.MAPLE_LEAVE_RED.getDefaultState().withProperty(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false));
-    /**
-     * The minimum height of a generated tree.
-     */
+    private static final IBlockState DEFAULT_FALLEN_LEAF = BlockLoader.FALLEN_LEAVES_MAPLE_RED.getDefaultState();
+
     private final int minTreeHeight;
-    /**
-     * True if this tree should grow Vines.
-     */
+
     private final boolean generateSap;
-    /**
-     * The metadata value of the wood to use in tree generation.
-     */
     private final IBlockState metaWood;
-    /**
-     * The metadata value of the leaves to use in tree generation.
-     */
     private final IBlockState metaLeaves;
+    private final IBlockState metaFallenLeaves;
 
     public WorldGenMapleTree(boolean p_i2027_1_, boolean sap) {
-        this(p_i2027_1_, 4, DEFAULT_TRUNK, DEFAULT_LEAF, sap);
+        this(p_i2027_1_, 4, DEFAULT_TRUNK, DEFAULT_LEAF,DEFAULT_FALLEN_LEAF, sap);
     }
 
-    public WorldGenMapleTree(boolean notify, int minTreeHeightIn, IBlockState woodMeta, IBlockState p_i46446_4_, boolean sap) {
+    public WorldGenMapleTree(boolean notify, int minTreeHeightIn, IBlockState woodMeta, IBlockState p_i46446_4_,IBlockState fallenMeta, boolean sap) {
         super(notify);
         this.minTreeHeight = minTreeHeightIn;
         this.metaWood = woodMeta;
         this.metaLeaves = p_i46446_4_;
+        this.metaFallenLeaves = fallenMeta;
         this.generateSap = sap;
     }
 
@@ -119,7 +113,8 @@ public class WorldGenMapleTree extends WorldGenAbstractTree {
 			            }
 			        }
 			    }
-
+			    fallenLeaves(worldIn, position,4,2,4, this.metaFallenLeaves);
+			    
 			    return true;
 			}
 			return false;
@@ -127,6 +122,50 @@ public class WorldGenMapleTree extends WorldGenAbstractTree {
 		return false;
     }
 
+    /**
+     * Fill the given area with the selected blocks
+     */
+    private void fallenLeaves(World worldIn,BlockPos pos, int xADD, int yADD, int zADD, IBlockState insideBlockState){
+    	int xx = pos.getX();
+        int yy = pos.getY();
+        int zz = pos.getZ();
+        
+        boolean setFlg = false;
+        int YEND = 4;
+        for (int xx1 = xx - xADD; xx1 <= xx + xADD; xx1++) {
+          for (int zz1 = zz - zADD; zz1 <= zz + zADD; zz1++) {
+            if (((xx1 != xx - xADD) || (zz1 != zz - zADD)) && ((xx1 != xx + xADD) || (zz1 != zz - zADD)) && ((xx1 != xx - xADD) || (zz1 != zz + zADD)) && ((xx1 != xx + xADD) || (zz1 != zz + zADD)) && (((xx1 >= xx - xADD + 1) && (xx1 <= xx + xADD - 1) && (zz1 >= zz - zADD + 1) && (zz1 <= zz + zADD - 1)) || (worldIn.rand.nextInt(2) != 0)))
+            {
+              setFlg = false;
+              int yy1 = yy + yADD;
+              Block cBl = worldIn.getBlockState(new BlockPos(xx1, yy + yADD, zz1)).getBlock();
+              
+              if ((cBl == Blocks.AIR) || (cBl instanceof BlockLeaves) || (cBl == BlockLoader.CHESTNUTBURR)) {
+                for (yy1 = yy + yADD; yy1 >= yy - YEND; yy1--)
+                {
+                  boolean cAir = worldIn.isAirBlock(new BlockPos(xx1, yy1, zz1));
+                  cBl = worldIn.getBlockState(new BlockPos(xx1, yy1 - 1, zz1)).getBlock();
+                  if ((cBl == Blocks.AIR) || ((cBl != Blocks.GRASS) && !(cBl instanceof BlockLeaves) && (!worldIn.getBlockState(new BlockPos(xx1, yy1 - 1, zz1)).isOpaqueCube())))
+                  {
+                    if (cBl != Blocks.AIR) {
+                      break;
+                    }
+                  }
+                  else if (cAir)
+                  {
+                    setFlg = true;
+                    break;
+                  }
+                }
+              }
+              if (setFlg) {
+                setBlockAndNotifyAdequately(worldIn, new BlockPos(xx1, yy1, zz1), insideBlockState);
+              }
+            }
+          }
+        }
+    }
+    
     private void addSapLog(World worldIn, BlockPos pos) {
         this.setBlockAndNotifyAdequately(worldIn, pos, BlockLoader.MAPLE_LOG_SAP.getDefaultState());
     }

+ 56 - 15
src/main/java/cn/mcmod/sakura/world/gen/WorldGenMapleTreeGreen.java

@@ -1,6 +1,7 @@
 package cn.mcmod.sakura.world.gen;
 
 import cn.mcmod.sakura.block.BlockLoader;
+import net.minecraft.block.Block;
 import net.minecraft.block.BlockLeaves;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.state.IBlockState;
@@ -15,32 +16,27 @@ import java.util.Random;
 public class WorldGenMapleTreeGreen extends WorldGenAbstractTree {
     private static final IBlockState DEFAULT_TRUNK = BlockLoader.MAPLE_LOG.getDefaultState();
     private static final IBlockState DEFAULT_LEAF = BlockLoader.MAPLE_LEAVE_GREEN.getDefaultState().withProperty(BlockLeaves.CHECK_DECAY, Boolean.valueOf(false));
-    /**
-     * The minimum height of a generated tree.
-     */
+    private static final IBlockState DEFAULT_FALLEN_LEAF = BlockLoader.FALLEN_LEAVES_MAPLE_GREEN.getDefaultState();
+
     private final int minTreeHeight;
-    /**
-     * True if this tree should grow Vines.
-     */
+
     private final boolean generateSap;
-    /**
-     * The metadata value of the wood to use in tree generation.
-     */
+
     private final IBlockState metaWood;
-    /**
-     * The metadata value of the leaves to use in tree generation.
-     */
+
     private final IBlockState metaLeaves;
+    private final IBlockState metaFallenLeaves;
 
     public WorldGenMapleTreeGreen(boolean p_i2027_1_, boolean sap) {
-        this(p_i2027_1_, 4, DEFAULT_TRUNK, DEFAULT_LEAF, sap);
+        this(p_i2027_1_, 4, DEFAULT_TRUNK, DEFAULT_LEAF,DEFAULT_FALLEN_LEAF, sap);
     }
 
-    public WorldGenMapleTreeGreen(boolean notify, int minTreeHeightIn, IBlockState woodMeta, IBlockState p_i46446_4_, boolean sap) {
+    public WorldGenMapleTreeGreen(boolean notify, int minTreeHeightIn, IBlockState woodMeta, IBlockState p_i46446_4_,IBlockState fallenMeta, boolean sap) {
         super(notify);
         this.minTreeHeight = minTreeHeightIn;
         this.metaWood = woodMeta;
         this.metaLeaves = p_i46446_4_;
+        this.metaFallenLeaves = fallenMeta;
         this.generateSap = sap;
     }
 
@@ -126,7 +122,8 @@ public class WorldGenMapleTreeGreen extends WorldGenAbstractTree {
 			            }
 			        }
 			    }
-
+			    fallenLeaves(worldIn, position,4,2,4, this.metaFallenLeaves);
+			    
 			    return true;
 			}
 			return false;
@@ -134,6 +131,50 @@ public class WorldGenMapleTreeGreen extends WorldGenAbstractTree {
 		return false;
     }
 
+    /**
+     * Fill the given area with the selected blocks
+     */
+    private void fallenLeaves(World worldIn,BlockPos pos, int xADD, int yADD, int zADD, IBlockState insideBlockState){
+    	int xx = pos.getX();
+        int yy = pos.getY();
+        int zz = pos.getZ();
+        
+        boolean setFlg = false;
+        int YEND = 4;
+        for (int xx1 = xx - xADD; xx1 <= xx + xADD; xx1++) {
+          for (int zz1 = zz - zADD; zz1 <= zz + zADD; zz1++) {
+            if (((xx1 != xx - xADD) || (zz1 != zz - zADD)) && ((xx1 != xx + xADD) || (zz1 != zz - zADD)) && ((xx1 != xx - xADD) || (zz1 != zz + zADD)) && ((xx1 != xx + xADD) || (zz1 != zz + zADD)) && (((xx1 >= xx - xADD + 1) && (xx1 <= xx + xADD - 1) && (zz1 >= zz - zADD + 1) && (zz1 <= zz + zADD - 1)) || (worldIn.rand.nextInt(2) != 0)))
+            {
+              setFlg = false;
+              int yy1 = yy + yADD;
+              Block cBl = worldIn.getBlockState(new BlockPos(xx1, yy + yADD, zz1)).getBlock();
+              
+              if ((cBl == Blocks.AIR) || (cBl instanceof BlockLeaves) || (cBl == BlockLoader.CHESTNUTBURR)) {
+                for (yy1 = yy + yADD; yy1 >= yy - YEND; yy1--)
+                {
+                  boolean cAir = worldIn.isAirBlock(new BlockPos(xx1, yy1, zz1));
+                  cBl = worldIn.getBlockState(new BlockPos(xx1, yy1 - 1, zz1)).getBlock();
+                  if ((cBl == Blocks.AIR) || ((cBl != Blocks.GRASS) && !(cBl instanceof BlockLeaves) && (!worldIn.getBlockState(new BlockPos(xx1, yy1 - 1, zz1)).isOpaqueCube())))
+                  {
+                    if (cBl != Blocks.AIR) {
+                      break;
+                    }
+                  }
+                  else if (cAir)
+                  {
+                    setFlg = true;
+                    break;
+                  }
+                }
+              }
+              if (setFlg) {
+                setBlockAndNotifyAdequately(worldIn, new BlockPos(xx1, yy1, zz1), insideBlockState);
+              }
+            }
+          }
+        }
+    }
+    
     public boolean isBurr(IBlockState state, IBlockAccess world, BlockPos pos) {
         return state.getBlock() == BlockLoader.CHESTNUTBURR;
     }

+ 18 - 0
src/main/resources/assets/sakura/blockstates/fallen_leaves_green.json

@@ -0,0 +1,18 @@
+{
+   "forge_marker" : 1,
+   "defaults" : {
+      "model" : "sakura:fallen_leaves",
+      "textures" : {
+         "0" : "sakura:blocks/mapleleaves_green",
+         "particle" : "#0"
+      }
+   },
+   "variants" : {
+      "inventory" : {
+         "model" : "sakura:fallen_leaves"
+      },
+      "normal" : {
+         "model" : "sakura:fallen_leaves"
+      }
+   }
+}

+ 18 - 0
src/main/resources/assets/sakura/blockstates/fallen_leaves_orange.json

@@ -0,0 +1,18 @@
+{
+   "forge_marker" : 1,
+   "defaults" : {
+      "model" : "sakura:fallen_leaves",
+      "textures" : {
+         "0" : "sakura:blocks/mapleleaves_orange",
+         "particle" : "#0"
+      }
+   },
+   "variants" : {
+      "inventory" : {
+         "model" : "sakura:fallen_leaves"
+      },
+      "normal" : {
+         "model" : "sakura:fallen_leaves"
+      }
+   }
+}

+ 18 - 0
src/main/resources/assets/sakura/blockstates/fallen_leaves_red.json

@@ -0,0 +1,18 @@
+{
+   "forge_marker" : 1,
+   "defaults" : {
+      "model" : "sakura:fallen_leaves",
+      "textures" : {
+         "0" : "sakura:blocks/mapleleaves_red",
+         "particle" : "#0"
+      }
+   },
+   "variants" : {
+      "inventory" : {
+         "model" : "sakura:fallen_leaves"
+      },
+      "normal" : {
+         "model" : "sakura:fallen_leaves"
+      }
+   }
+}

+ 18 - 0
src/main/resources/assets/sakura/blockstates/fallen_leaves_yellow.json

@@ -0,0 +1,18 @@
+{
+   "forge_marker" : 1,
+   "defaults" : {
+      "model" : "sakura:fallen_leaves",
+      "textures" : {
+         "0" : "sakura:blocks/mapleleaves_yellow",
+         "particle" : "#0"
+      }
+   },
+   "variants" : {
+      "inventory" : {
+         "model" : "sakura:fallen_leaves"
+      },
+      "normal" : {
+         "model" : "sakura:fallen_leaves"
+      }
+   }
+}

+ 17 - 0
src/main/resources/assets/sakura/blockstates/taiko.json

@@ -0,0 +1,17 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "model": "sakura:taiko"
+  },
+  "variants": {
+      "inventory" : {
+        "model": "sakura:taiko"
+      },
+        "facing": {
+            "north": { "y": 0 },
+            "south": { "y": 180 },
+            "west": { "y": 270 },
+            "east": { "y": 90 }
+        }
+  }
+}

+ 55 - 0
src/main/resources/assets/sakura/models/block/fallen_leaves.json

@@ -0,0 +1,55 @@
+{
+	"credit": "Made with Blockbench",
+	"textures": {
+		"0": "sakura:blocks/mapleleaves_red",
+		"particle": "#0"
+	},
+	"elements": [
+		{
+			"from": [0, 0, 0],
+			"to": [16, 2, 16],
+			"faces": {
+				"north": {"uv": [0, 10, 16, 12], "texture": "#0"},
+				"east": {"uv": [0, 13, 16, 15], "texture": "#0"},
+				"south": {"uv": [0, 14, 16, 16], "texture": "#0"},
+				"west": {"uv": [0, 3, 16, 4.999], "texture": "#0"},
+				"up": {"uv": [0, 0, 16, 16], "texture": "#0"},
+				"down": {"uv": [0, 0, 16, 16], "texture": "#0"}
+			}
+		}
+	],
+	"display": {
+		"thirdperson_righthand": {
+			"rotation": [87, 0, 0],
+			"translation": [0, 0.75, 4.75],
+			"scale": [0.6, 0.6, 0.6]
+		},
+		"thirdperson_lefthand": {
+			"rotation": [87, 0, 0],
+			"translation": [0, 0.75, 4.75],
+			"scale": [0.6, 0.6, 0.6]
+		},
+		"firstperson_righthand": {
+			"rotation": [12, 24, 0],
+			"translation": [2, 6, 1.75],
+			"scale": [0.55, 0.55, 0.55]
+		},
+		"firstperson_lefthand": {
+			"rotation": [12, 24, 0],
+			"translation": [2, 6, 1.75],
+			"scale": [0.55, 0.55, 0.55]
+		},
+		"ground": {
+			"translation": [0, -0.5, 0],
+			"scale": [0.55, 0.55, 0.55]
+		},
+		"gui": {
+			"rotation": [30, 45, 0],
+			"translation": [0, 0.75, 0],
+			"scale": [0.61, 0.61, 0.61]
+		},
+		"fixed": {
+			"scale": [0.7, 0.7, 0.7]
+		}
+	}
+}

+ 870 - 0
src/main/resources/assets/sakura/models/block/taiko.json

@@ -0,0 +1,870 @@
+{
+	"credit": "Made with Blockbench",
+	"textures": {
+		"0": "sakura:blocks/osu_0",
+		"1": "sakura:blocks/osu_1",
+		"2": "sakura:blocks/osu_2",
+		"3": "sakura:blocks/osu_3",
+		"particle": "sakura:blocks/osu_0"
+	},
+	"elements": [
+		{
+			"from": [0, 3, 2],
+			"to": [1, 13, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 10], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 10], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 10], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 10], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [15, 3, 2],
+			"to": [16, 13, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 10], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 10], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 10], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 10], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [3, 0, 2],
+			"to": [13, 1, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 10, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 10, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 10, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 10, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [3, 15, 2],
+			"to": [13, 16, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 10, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 10, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 10, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 10, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [2, 1, 2],
+			"to": [3, 2, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [13, 1, 2],
+			"to": [14, 2, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [1, 2, 2],
+			"to": [2, 3, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [1, 13, 2],
+			"to": [2, 14, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [2, 14, 2],
+			"to": [3, 15, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [14, 2, 2],
+			"to": [15, 3, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [14, 13, 2],
+			"to": [15, 14, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [13, 14, 2],
+			"to": [14, 15, 14],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"east": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#2"},
+				"west": {"uv": [0, 0, 12, 1], "texture": "#2"},
+				"up": {"uv": [0, 0, 1, 12], "texture": "#2"},
+				"down": {"uv": [0, 0, 1, 12], "texture": "#2"}
+			}
+		},
+		{
+			"from": [1, 3, 0],
+			"to": [2, 8, 2],
+			"faces": {
+				"north": {"uv": [15, 9, 16, 14], "texture": "#1"},
+				"east": {"uv": [0, 0, 4, 10], "texture": "#1"},
+				"south": {"uv": [0, 8, 1, 14], "texture": "#1"},
+				"west": {"uv": [0, 6, 4, 16], "texture": "#0"},
+				"up": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [14, 3, 0],
+			"to": [15, 8, 2],
+			"faces": {
+				"north": {"uv": [16, 9, 15, 14], "texture": "#1"},
+				"east": {"uv": [4, 6, 0, 16], "texture": "#0"},
+				"south": {"uv": [1, 8, 0, 14], "texture": "#1"},
+				"west": {"uv": [4, 0, 0, 10], "texture": "#1"},
+				"up": {"uv": [0, 2, 4, 0], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [0, 2, 4, 0], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [1, 8, 0],
+			"to": [2, 13, 2],
+			"faces": {
+				"north": {"uv": [15, 14, 16, 9], "texture": "#1"},
+				"east": {"uv": [0, 10, 4, 0], "texture": "#1"},
+				"south": {"uv": [0, 14, 1, 8], "texture": "#1"},
+				"west": {"uv": [0, 16, 4, 6], "texture": "#0"},
+				"up": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [14, 8, 0],
+			"to": [15, 13, 2],
+			"faces": {
+				"north": {"uv": [16, 14, 15, 9], "texture": "#1"},
+				"east": {"uv": [4, 16, 0, 6], "texture": "#0"},
+				"south": {"uv": [1, 14, 0, 8], "texture": "#1"},
+				"west": {"uv": [4, 10, 0, 0], "texture": "#1"},
+				"up": {"uv": [4, 2, 0, 0], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [4, 2, 0, 0], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [2, 2, 0],
+			"to": [3, 3, 2],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#1"},
+				"east": {"uv": [0, 0, 2, 1], "texture": "#1"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#1"},
+				"west": {"uv": [0, 2, 4, 4], "texture": "#0"},
+				"up": {"uv": [0, 0, 1, 2], "texture": "#1"},
+				"down": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [13, 2, 0],
+			"to": [14, 3, 2],
+			"faces": {
+				"north": {"uv": [1, 0, 0, 1], "texture": "#1"},
+				"east": {"uv": [4, 2, 0, 4], "texture": "#0"},
+				"south": {"uv": [1, 0, 0, 1], "texture": "#1"},
+				"west": {"uv": [2, 0, 0, 1], "texture": "#1"},
+				"up": {"uv": [1, 0, 0, 2], "texture": "#1"},
+				"down": {"uv": [0, 2, 4, 0], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [2, 13, 0],
+			"to": [3, 14, 2],
+			"faces": {
+				"north": {"uv": [0, 1, 1, 0], "texture": "#1"},
+				"east": {"uv": [0, 1, 2, 0], "texture": "#1"},
+				"south": {"uv": [0, 1, 1, 0], "texture": "#1"},
+				"west": {"uv": [0, 4, 4, 2], "texture": "#0"},
+				"up": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [0, 2, 1, 0], "texture": "#1"}
+			}
+		},
+		{
+			"from": [13, 13, 0],
+			"to": [14, 14, 2],
+			"faces": {
+				"north": {"uv": [1, 1, 0, 0], "texture": "#1"},
+				"east": {"uv": [4, 4, 0, 2], "texture": "#0"},
+				"south": {"uv": [1, 1, 0, 0], "texture": "#1"},
+				"west": {"uv": [2, 1, 0, 0], "texture": "#1"},
+				"up": {"uv": [4, 2, 0, 0], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [1, 2, 0, 0], "texture": "#1"}
+			}
+		},
+		{
+			"from": [3, 2, 0],
+			"to": [13, 14, 1],
+			"faces": {
+				"north": {"uv": [1, 0, 11, 12], "texture": "#1"},
+				"east": {"uv": [0, 0, 1, 12], "texture": "#1"},
+				"south": {"uv": [1, 0, 11, 12], "texture": "#1"},
+				"west": {"uv": [0, 0, 1, 12], "texture": "#1"},
+				"up": {"uv": [0, 0, 10, 1], "texture": "#1"},
+				"down": {"uv": [0, 0, 10, 1], "texture": "#1"}
+			}
+		},
+		{
+			"from": [2, 3, 0],
+			"to": [3, 13, 1],
+			"faces": {
+				"north": {"uv": [11, 1, 12, 11], "texture": "#1"},
+				"east": {"uv": [0, 0, 1, 10], "texture": "#1"},
+				"south": {"uv": [0, 0, 1, 10], "texture": "#1"},
+				"west": {"uv": [0, 0, 1, 10], "texture": "#1"},
+				"up": {"uv": [0, 0, 1, 1], "texture": "#1"},
+				"down": {"uv": [0, 0, 1, 1], "texture": "#1"}
+			}
+		},
+		{
+			"from": [13, 3, 0],
+			"to": [14, 13, 1],
+			"faces": {
+				"north": {"uv": [0, 1, 1, 11], "texture": "#1"},
+				"east": {"uv": [0, 0, 1, 10], "texture": "#1"},
+				"south": {"uv": [11, 1, 12, 11], "texture": "#1"},
+				"west": {"uv": [0, 0, 1, 10], "texture": "#1"},
+				"up": {"uv": [0, 0, 1, 1], "texture": "#1"},
+				"down": {"uv": [0, 0, 1, 1], "texture": "#1"}
+			}
+		},
+		{
+			"from": [3, 1, 0],
+			"to": [8, 2, 2],
+			"faces": {
+				"north": {"uv": [0, 0, 5, 1], "texture": "#1"},
+				"east": {"uv": [0, 2, 4, 4], "texture": "#0"},
+				"south": {"uv": [0, 0, 5, 1], "texture": "#1"},
+				"west": {"uv": [0, 2, 4, 4], "texture": "#0"},
+				"up": {"uv": [0, 0, 5, 2], "texture": "#1"},
+				"down": {"uv": [0, 0, 4, 10], "rotation": 90, "texture": "#0"}
+			}
+		},
+		{
+			"from": [3, 14, 0],
+			"to": [8, 15, 2],
+			"faces": {
+				"north": {"uv": [0, 1, 5, 0], "texture": "#1"},
+				"east": {"uv": [0, 4, 4, 2], "texture": "#0"},
+				"south": {"uv": [0, 1, 5, 0], "texture": "#1"},
+				"west": {"uv": [0, 4, 4, 2], "texture": "#0"},
+				"up": {"uv": [4, 0, 0, 10], "rotation": 90, "texture": "#0"},
+				"down": {"uv": [0, 2, 5, 0], "texture": "#1"}
+			}
+		},
+		{
+			"from": [8, 14, 0],
+			"to": [13, 15, 2],
+			"faces": {
+				"north": {"uv": [5, 1, 0, 0], "texture": "#1"},
+				"east": {"uv": [4, 4, 0, 2], "texture": "#0"},
+				"south": {"uv": [5, 1, 0, 0], "texture": "#1"},
+				"west": {"uv": [4, 4, 0, 2], "texture": "#0"},
+				"up": {"uv": [4, 10, 0, 0], "rotation": 90, "texture": "#0"},
+				"down": {"uv": [5, 2, 0, 0], "texture": "#1"}
+			}
+		},
+		{
+			"from": [8, 1, 0],
+			"to": [13, 2, 2],
+			"faces": {
+				"north": {"uv": [5, 0, 0, 1], "texture": "#1"},
+				"east": {"uv": [4, 2, 0, 4], "texture": "#0"},
+				"south": {"uv": [5, 0, 0, 1], "texture": "#1"},
+				"west": {"uv": [4, 2, 0, 4], "texture": "#0"},
+				"up": {"uv": [5, 0, 0, 2], "texture": "#1"},
+				"down": {"uv": [0, 10, 4, 0], "rotation": 90, "texture": "#0"}
+			}
+		},
+		{
+			"from": [1, 3, 14],
+			"to": [2, 8, 16],
+			"faces": {
+				"north": {"uv": [1, 8, 0, 14], "texture": "#1"},
+				"east": {"uv": [4, 0, 0, 10], "texture": "#1"},
+				"south": {"uv": [16, 9, 15, 14], "texture": "#1"},
+				"west": {"uv": [4, 6, 0, 16], "texture": "#0"},
+				"up": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [14, 3, 14],
+			"to": [15, 8, 16],
+			"faces": {
+				"north": {"uv": [0, 8, 1, 14], "texture": "#1"},
+				"east": {"uv": [0, 6, 4, 16], "texture": "#0"},
+				"south": {"uv": [15, 9, 16, 14], "texture": "#1"},
+				"west": {"uv": [0, 0, 4, 10], "texture": "#1"},
+				"up": {"uv": [4, 2, 0, 0], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [4, 2, 0, 0], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [1, 8, 14],
+			"to": [2, 13, 16],
+			"faces": {
+				"north": {"uv": [1, 14, 0, 8], "texture": "#1"},
+				"east": {"uv": [4, 10, 0, 0], "texture": "#1"},
+				"south": {"uv": [16, 14, 15, 9], "texture": "#1"},
+				"west": {"uv": [4, 16, 0, 6], "texture": "#0"},
+				"up": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [14, 8, 14],
+			"to": [15, 13, 16],
+			"faces": {
+				"north": {"uv": [0, 14, 1, 8], "texture": "#1"},
+				"east": {"uv": [0, 16, 4, 6], "texture": "#0"},
+				"south": {"uv": [15, 14, 16, 9], "texture": "#1"},
+				"west": {"uv": [0, 10, 4, 0], "texture": "#1"},
+				"up": {"uv": [0, 2, 4, 0], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [0, 2, 4, 0], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [2, 2, 14],
+			"to": [3, 3, 16],
+			"faces": {
+				"north": {"uv": [1, 0, 0, 1], "texture": "#1"},
+				"east": {"uv": [2, 0, 0, 1], "texture": "#1"},
+				"south": {"uv": [1, 0, 0, 1], "texture": "#1"},
+				"west": {"uv": [4, 2, 0, 4], "texture": "#0"},
+				"up": {"uv": [0, 2, 1, 0], "texture": "#1"},
+				"down": {"uv": [4, 0, 0, 2], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [13, 2, 14],
+			"to": [14, 3, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 1, 1], "texture": "#1"},
+				"east": {"uv": [0, 2, 4, 4], "texture": "#0"},
+				"south": {"uv": [0, 0, 1, 1], "texture": "#1"},
+				"west": {"uv": [0, 0, 2, 1], "texture": "#1"},
+				"up": {"uv": [1, 2, 0, 0], "texture": "#1"},
+				"down": {"uv": [4, 2, 0, 0], "rotation": 270, "texture": "#0"}
+			}
+		},
+		{
+			"from": [2, 13, 14],
+			"to": [3, 14, 16],
+			"faces": {
+				"north": {"uv": [1, 1, 0, 0], "texture": "#1"},
+				"east": {"uv": [2, 1, 0, 0], "texture": "#1"},
+				"south": {"uv": [1, 1, 0, 0], "texture": "#1"},
+				"west": {"uv": [4, 4, 0, 2], "texture": "#0"},
+				"up": {"uv": [0, 0, 4, 2], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [0, 0, 1, 2], "texture": "#1"}
+			}
+		},
+		{
+			"from": [13, 13, 14],
+			"to": [14, 14, 16],
+			"faces": {
+				"north": {"uv": [0, 1, 1, 0], "texture": "#1"},
+				"east": {"uv": [0, 4, 4, 2], "texture": "#0"},
+				"south": {"uv": [0, 1, 1, 0], "texture": "#1"},
+				"west": {"uv": [0, 1, 2, 0], "texture": "#1"},
+				"up": {"uv": [0, 2, 4, 0], "rotation": 270, "texture": "#0"},
+				"down": {"uv": [1, 0, 0, 2], "texture": "#1"}
+			}
+		},
+		{
+			"from": [3, 2, 15],
+			"to": [13, 14, 16],
+			"faces": {
+				"north": {"uv": [11, 0, 1, 12], "texture": "#1"},
+				"east": {"uv": [1, 0, 0, 12], "texture": "#1"},
+				"south": {"uv": [11, 0, 1, 12], "texture": "#1"},
+				"west": {"uv": [1, 0, 0, 12], "texture": "#1"},
+				"up": {"uv": [0, 1, 10, 0], "texture": "#1"},
+				"down": {"uv": [0, 1, 10, 0], "texture": "#1"}
+			}
+		},
+		{
+			"from": [2, 3, 15],
+			"to": [3, 13, 16],
+			"faces": {
+				"north": {"uv": [1, 0, 0, 10], "texture": "#1"},
+				"east": {"uv": [1, 0, 0, 10], "texture": "#1"},
+				"south": {"uv": [12, 1, 11, 11], "texture": "#1"},
+				"west": {"uv": [1, 0, 0, 10], "texture": "#1"},
+				"up": {"uv": [0, 1, 1, 0], "texture": "#1"},
+				"down": {"uv": [0, 1, 1, 0], "texture": "#1"}
+			}
+		},
+		{
+			"from": [13, 3, 15],
+			"to": [14, 13, 16],
+			"faces": {
+				"north": {"uv": [12, 1, 11, 11], "texture": "#1"},
+				"east": {"uv": [1, 0, 0, 10], "texture": "#1"},
+				"south": {"uv": [1, 1, 0, 11], "texture": "#1"},
+				"west": {"uv": [1, 0, 0, 10], "texture": "#1"},
+				"up": {"uv": [0, 1, 1, 0], "texture": "#1"},
+				"down": {"uv": [0, 1, 1, 0], "texture": "#1"}
+			}
+		},
+		{
+			"from": [3, 1, 14],
+			"to": [8, 2, 16],
+			"faces": {
+				"north": {"uv": [5, 0, 0, 1], "texture": "#1"},
+				"east": {"uv": [4, 2, 0, 4], "texture": "#0"},
+				"south": {"uv": [5, 0, 0, 1], "texture": "#1"},
+				"west": {"uv": [4, 2, 0, 4], "texture": "#0"},
+				"up": {"uv": [0, 2, 5, 0], "texture": "#1"},
+				"down": {"uv": [4, 0, 0, 10], "rotation": 90, "texture": "#0"}
+			}
+		},
+		{
+			"from": [3, 14, 14],
+			"to": [8, 15, 16],
+			"faces": {
+				"north": {"uv": [5, 1, 0, 0], "texture": "#1"},
+				"east": {"uv": [4, 4, 0, 2], "texture": "#0"},
+				"south": {"uv": [5, 1, 0, 0], "texture": "#1"},
+				"west": {"uv": [4, 4, 0, 2], "texture": "#0"},
+				"up": {"uv": [0, 0, 4, 10], "rotation": 90, "texture": "#0"},
+				"down": {"uv": [0, 0, 5, 2], "texture": "#1"}
+			}
+		},
+		{
+			"from": [8, 14, 14],
+			"to": [13, 15, 16],
+			"faces": {
+				"north": {"uv": [0, 1, 5, 0], "texture": "#1"},
+				"east": {"uv": [0, 4, 4, 2], "texture": "#0"},
+				"south": {"uv": [0, 1, 5, 0], "texture": "#1"},
+				"west": {"uv": [0, 4, 4, 2], "texture": "#0"},
+				"up": {"uv": [0, 10, 4, 0], "rotation": 90, "texture": "#0"},
+				"down": {"uv": [5, 0, 0, 2], "texture": "#1"}
+			}
+		},
+		{
+			"from": [8, 1, 14],
+			"to": [13, 2, 16],
+			"faces": {
+				"north": {"uv": [0, 0, 5, 1], "texture": "#1"},
+				"east": {"uv": [0, 2, 4, 4], "texture": "#0"},
+				"south": {"uv": [0, 0, 5, 1], "texture": "#1"},
+				"west": {"uv": [0, 2, 4, 4], "texture": "#0"},
+				"up": {"uv": [5, 2, 0, 0], "texture": "#1"},
+				"down": {"uv": [4, 10, 0, 0], "rotation": 90, "texture": "#0"}
+			}
+		},
+		{
+			"from": [2, 2, -0.05],
+			"to": [14, 14, -0.05],
+			"faces": {
+				"north": {"uv": [1, 1, 15, 15], "texture": "#3"},
+				"east": {"uv": [0, 0, 0, 12], "texture": "#missing"},
+				"south": {"uv": [0, 0, 4, 4], "texture": "#3"},
+				"west": {"uv": [0, 0, 0, 12], "texture": "#missing"},
+				"up": {"uv": [0, 0, 12, 0], "texture": "#missing"},
+				"down": {"uv": [0, 0, 12, 0], "texture": "#missing"}
+			}
+		},
+		{
+			"from": [2, 2, 16.05],
+			"to": [14, 14, 16.05],
+			"faces": {
+				"north": {"uv": [0, 0, 4, 4], "texture": "#3"},
+				"east": {"uv": [0, 0, 0, 12], "texture": "#missing"},
+				"south": {"uv": [1, 1, 15, 15], "texture": "#3"},
+				"west": {"uv": [0, 0, 0, 12], "texture": "#missing"},
+				"up": {"uv": [0, 0, 12, 0], "rotation": 180, "texture": "#missing"},
+				"down": {"uv": [0, 0, 12, 0], "rotation": 180, "texture": "#missing"}
+			}
+		},
+		{
+			"from": [-0.5, 7, 7],
+			"to": [0.5, 9, 9],
+			"rotation": {"angle": 0, "axis": "y", "origin": [8.75, 8, 8]},
+			"faces": {
+				"north": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"east": {"uv": [8, 8, 10, 10], "texture": "#0"},
+				"south": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"west": {"uv": [8, 8, 10, 10], "texture": "#0"},
+				"up": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"down": {"uv": [8, 8, 9, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-0.25, 7.5, 6],
+			"to": [0.75, 8.5, 7],
+			"rotation": {"angle": 0, "axis": "y", "origin": [8.75, 8, 8]},
+			"faces": {
+				"north": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"east": {"uv": [8, 8, 10, 10], "texture": "#0"},
+				"south": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"west": {"uv": [13, 13, 16, 16], "texture": "#0"},
+				"up": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"down": {"uv": [8, 8, 9, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-0.25, 7.5, 9],
+			"to": [0.75, 8.5, 10],
+			"rotation": {"angle": 0, "axis": "y", "origin": [8.75, 8, 8]},
+			"faces": {
+				"north": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"east": {"uv": [8, 8, 10, 10], "texture": "#0"},
+				"south": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"west": {"uv": [13, 13, 16, 16], "texture": "#0"},
+				"up": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"down": {"uv": [8, 8, 9, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-0.25, 9, 7.5],
+			"to": [0.75, 10, 8.5],
+			"rotation": {"angle": 0, "axis": "y", "origin": [8.75, 8, 8]},
+			"faces": {
+				"north": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"east": {"uv": [8, 8, 10, 10], "texture": "#0"},
+				"south": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"west": {"uv": [13, 13, 16, 16], "texture": "#0"},
+				"up": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"down": {"uv": [8, 8, 9, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-0.25, 6, 7.5],
+			"to": [0.75, 7, 8.5],
+			"rotation": {"angle": 0, "axis": "y", "origin": [8.75, 8, 8]},
+			"faces": {
+				"north": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"east": {"uv": [8, 8, 10, 10], "texture": "#0"},
+				"south": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"west": {"uv": [13, 13, 16, 16], "texture": "#0"},
+				"up": {"uv": [8, 8, 9, 10], "texture": "#0"},
+				"down": {"uv": [8, 8, 9, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-0.75, 7.5, 7.5],
+			"to": [0.25, 8.5, 8.5],
+			"faces": {
+				"north": {"uv": [8, 1, 9, 2], "texture": "#0"},
+				"east": {"uv": [8, 2, 9, 3], "texture": "#0"},
+				"south": {"uv": [9, 0, 10, 1], "texture": "#0"},
+				"west": {"uv": [8, 0, 9, 1], "texture": "#0"},
+				"up": {"uv": [9, 2, 10, 3], "texture": "#0"},
+				"down": {"uv": [9, 1, 10, 2], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-1.5, 7.5, 7.75],
+			"to": [-0.5, 8.5, 8.25],
+			"faces": {
+				"north": {"uv": [10, 3, 11, 4], "texture": "#0"},
+				"east": {"uv": [8, 3, 9, 4], "texture": "#0"},
+				"south": {"uv": [10, 4, 11, 5], "texture": "#0"},
+				"west": {"uv": [8, 4, 9, 5], "texture": "#0"},
+				"up": {"uv": [9, 3, 10, 4], "texture": "#0"},
+				"down": {"uv": [9, 4, 10, 5], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-1.4, 7.75, 7],
+			"to": [-0.9, 8.25, 9],
+			"faces": {
+				"north": {"uv": [10, 13, 11, 14], "texture": "#0"},
+				"east": {"uv": [10, 10, 11, 11], "texture": "#0"},
+				"south": {"uv": [9, 12, 10, 13], "texture": "#0"},
+				"west": {"uv": [8, 10, 9, 11], "texture": "#0"},
+				"up": {"uv": [9, 10, 10, 11], "texture": "#0"},
+				"down": {"uv": [10, 11, 11, 12], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-1.4, 6.25, 7],
+			"to": [-0.9, 6.75, 9],
+			"faces": {
+				"north": {"uv": [10, 13, 11, 14], "texture": "#0"},
+				"east": {"uv": [10, 10, 11, 11], "texture": "#0"},
+				"south": {"uv": [9, 12, 10, 13], "texture": "#0"},
+				"west": {"uv": [8, 10, 9, 11], "texture": "#0"},
+				"up": {"uv": [9, 10, 10, 11], "texture": "#0"},
+				"down": {"uv": [10, 11, 11, 12], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-1.4, 6.75, 7],
+			"to": [-0.9, 7.75, 7.5],
+			"faces": {
+				"north": {"uv": [10, 13, 11, 14], "texture": "#0"},
+				"east": {"uv": [10, 10, 11, 11], "texture": "#0"},
+				"south": {"uv": [9, 12, 10, 13], "texture": "#0"},
+				"west": {"uv": [8, 10, 9, 11], "texture": "#0"},
+				"up": {"uv": [9, 10, 10, 11], "texture": "#0"},
+				"down": {"uv": [10, 11, 11, 12], "texture": "#0"}
+			}
+		},
+		{
+			"from": [-1.4, 6.75, 8.5],
+			"to": [-0.9, 7.75, 9],
+			"faces": {
+				"north": {"uv": [10, 13, 11, 14], "texture": "#0"},
+				"east": {"uv": [10, 10, 11, 11], "texture": "#0"},
+				"south": {"uv": [9, 12, 10, 13], "texture": "#0"},
+				"west": {"uv": [8, 10, 9, 11], "texture": "#0"},
+				"up": {"uv": [9, 10, 10, 11], "texture": "#0"},
+				"down": {"uv": [10, 11, 11, 12], "texture": "#0"}
+			}
+		},
+		{
+			"from": [15.5, 7, 7],
+			"to": [16.5, 9, 9],
+			"rotation": {"angle": 0, "axis": "y", "origin": [7.25, 8, 8]},
+			"faces": {
+				"north": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"east": {"uv": [10, 8, 8, 10], "texture": "#0"},
+				"south": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"west": {"uv": [10, 8, 8, 10], "texture": "#0"},
+				"up": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"down": {"uv": [9, 8, 8, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [15.25, 7.5, 6],
+			"to": [16.25, 8.5, 7],
+			"rotation": {"angle": 0, "axis": "y", "origin": [7.25, 8, 8]},
+			"faces": {
+				"north": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"east": {"uv": [16, 13, 13, 16], "texture": "#0"},
+				"south": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"west": {"uv": [10, 8, 8, 10], "texture": "#0"},
+				"up": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"down": {"uv": [9, 8, 8, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [15.25, 7.5, 9],
+			"to": [16.25, 8.5, 10],
+			"rotation": {"angle": 0, "axis": "y", "origin": [7.25, 8, 8]},
+			"faces": {
+				"north": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"east": {"uv": [16, 13, 13, 16], "texture": "#0"},
+				"south": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"west": {"uv": [10, 8, 8, 10], "texture": "#0"},
+				"up": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"down": {"uv": [9, 8, 8, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [15.25, 9, 7.5],
+			"to": [16.25, 10, 8.5],
+			"rotation": {"angle": 0, "axis": "y", "origin": [7.25, 8, 8]},
+			"faces": {
+				"north": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"east": {"uv": [16, 13, 13, 16], "texture": "#0"},
+				"south": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"west": {"uv": [10, 8, 8, 10], "texture": "#0"},
+				"up": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"down": {"uv": [9, 8, 8, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [15.25, 6, 7.5],
+			"to": [16.25, 7, 8.5],
+			"rotation": {"angle": 0, "axis": "y", "origin": [7.25, 8, 8]},
+			"faces": {
+				"north": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"east": {"uv": [16, 13, 13, 16], "texture": "#0"},
+				"south": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"west": {"uv": [10, 8, 8, 10], "texture": "#0"},
+				"up": {"uv": [9, 8, 8, 10], "texture": "#0"},
+				"down": {"uv": [9, 8, 8, 10], "texture": "#0"}
+			}
+		},
+		{
+			"from": [15.75, 7.5, 7.5],
+			"to": [16.75, 8.5, 8.5],
+			"faces": {
+				"north": {"uv": [9, 1, 8, 2], "texture": "#0"},
+				"east": {"uv": [9, 0, 8, 1], "texture": "#0"},
+				"south": {"uv": [10, 0, 9, 1], "texture": "#0"},
+				"west": {"uv": [9, 2, 8, 3], "texture": "#0"},
+				"up": {"uv": [10, 2, 9, 3], "texture": "#0"},
+				"down": {"uv": [10, 1, 9, 2], "texture": "#0"}
+			}
+		},
+		{
+			"from": [16.5, 7.5, 7.75],
+			"to": [17.5, 8.5, 8.25],
+			"faces": {
+				"north": {"uv": [11, 3, 10, 4], "texture": "#0"},
+				"east": {"uv": [9, 4, 8, 5], "texture": "#0"},
+				"south": {"uv": [11, 4, 10, 5], "texture": "#0"},
+				"west": {"uv": [9, 3, 8, 4], "texture": "#0"},
+				"up": {"uv": [10, 3, 9, 4], "texture": "#0"},
+				"down": {"uv": [10, 4, 9, 5], "texture": "#0"}
+			}
+		},
+		{
+			"from": [16.9, 7.75, 7],
+			"to": [17.4, 8.25, 9],
+			"faces": {
+				"north": {"uv": [11, 13, 10, 14], "texture": "#0"},
+				"east": {"uv": [9, 10, 8, 11], "texture": "#0"},
+				"south": {"uv": [10, 12, 9, 13], "texture": "#0"},
+				"west": {"uv": [11, 10, 10, 11], "texture": "#0"},
+				"up": {"uv": [10, 10, 9, 11], "texture": "#0"},
+				"down": {"uv": [11, 11, 10, 12], "texture": "#0"}
+			}
+		},
+		{
+			"from": [16.9, 6.25, 7],
+			"to": [17.4, 6.75, 9],
+			"faces": {
+				"north": {"uv": [11, 13, 10, 14], "texture": "#0"},
+				"east": {"uv": [9, 10, 8, 11], "texture": "#0"},
+				"south": {"uv": [10, 12, 9, 13], "texture": "#0"},
+				"west": {"uv": [11, 10, 10, 11], "texture": "#0"},
+				"up": {"uv": [10, 10, 9, 11], "texture": "#0"},
+				"down": {"uv": [11, 11, 10, 12], "texture": "#0"}
+			}
+		},
+		{
+			"from": [16.9, 6.75, 7],
+			"to": [17.4, 7.75, 7.5],
+			"faces": {
+				"north": {"uv": [11, 13, 10, 14], "texture": "#0"},
+				"east": {"uv": [9, 10, 8, 11], "texture": "#0"},
+				"south": {"uv": [10, 12, 9, 13], "texture": "#0"},
+				"west": {"uv": [11, 10, 10, 11], "texture": "#0"},
+				"up": {"uv": [10, 10, 9, 11], "texture": "#0"},
+				"down": {"uv": [11, 11, 10, 12], "texture": "#0"}
+			}
+		},
+		{
+			"from": [16.9, 6.75, 8.5],
+			"to": [17.4, 7.75, 9],
+			"faces": {
+				"north": {"uv": [11, 13, 10, 14], "texture": "#0"},
+				"east": {"uv": [9, 10, 8, 11], "texture": "#0"},
+				"south": {"uv": [10, 12, 9, 13], "texture": "#0"},
+				"west": {"uv": [11, 10, 10, 11], "texture": "#0"},
+				"up": {"uv": [10, 10, 9, 11], "texture": "#0"},
+				"down": {"uv": [11, 11, 10, 12], "texture": "#0"}
+			}
+		}
+	],
+	"display": {
+		"thirdperson_righthand": {
+			"rotation": [-21, 0, 0],
+			"translation": [-6, 0, 0],
+			"scale": [0.5, 0.5, 0.5]
+		},
+		"thirdperson_lefthand": {
+			"rotation": [-21, 0, 0],
+			"translation": [-6, 0, 0],
+			"scale": [0.5, 0.5, 0.5]
+		},
+		"firstperson_righthand": {
+			"rotation": [0, 90, 0],
+			"translation": [2, 3.25, 0],
+			"scale": [0.6, 0.6, 0.6]
+		},
+		"firstperson_lefthand": {
+			"rotation": [0, 90, 0],
+			"translation": [2, 3.25, 0],
+			"scale": [0.6, 0.6, 0.6]
+		},
+		"ground": {
+			"scale": [0.5, 0.5, 0.5]
+		},
+		"gui": {
+			"rotation": [30, 45, 0],
+			"scale": [0.75, 0.75, 0.75]
+		}
+	},
+	"groups": [
+		{
+			"name": "group",
+			"origin": [8, 8, 8],
+			"children": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
+		},
+		{
+			"name": "group",
+			"origin": [8, 8, 8],
+			"children": [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
+		},
+		{
+			"name": "group",
+			"origin": [8, 8, 8],
+			"children": [27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]
+		}, 42, 43,
+		{
+			"name": "group",
+			"origin": [8, 8, 8],
+			"children": [44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54]
+		},
+		{
+			"name": "group",
+			"origin": [8, 8, 8],
+			"children": [55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]
+		}
+	]
+}

+ 6 - 0
src/main/resources/assets/sakura/models/item/coin.json

@@ -0,0 +1,6 @@
+{
+   "parent" : "item/generated",
+   "textures" : {
+      "layer0" : "sakura:items/coin"
+   }
+}

+ 7 - 0
src/main/resources/assets/sakura/recipes/_constants.json

@@ -13,6 +13,13 @@
       },
       "name" : "PAPER"
    },