Browse Source

maple cauldron complete

0999312 1 year ago
parent
commit
fdd7966bec
69 changed files with 3019 additions and 279 deletions
  1. 5 3
      src/main/java/cn/mcmod/sakura/ClientProxy.java
  2. 4 3
      src/main/java/cn/mcmod/sakura/SakuraOreDictLoader.java
  3. 2 2
      src/main/java/cn/mcmod/sakura/api/recipes/PotRecipes.java
  4. 13 2
      src/main/java/cn/mcmod/sakura/block/BlockBambooBlock.java
  5. 6 0
      src/main/java/cn/mcmod/sakura/block/BlockBase.java
  6. 4 14
      src/main/java/cn/mcmod/sakura/block/BlockFacing.java
  7. 1 0
      src/main/java/cn/mcmod/sakura/block/BlockKawara.java
  8. 56 6
      src/main/java/cn/mcmod/sakura/block/BlockLoader.java
  9. 109 0
      src/main/java/cn/mcmod/sakura/block/BlockMapleSpile.java
  10. 65 147
      src/main/java/cn/mcmod/sakura/block/BlockMapleSyrupCauldron.java
  11. 14 0
      src/main/java/cn/mcmod/sakura/block/BlockStairBasic.java
  12. 0 5
      src/main/java/cn/mcmod/sakura/block/BlockStoneMortar.java
  13. 1 1
      src/main/java/cn/mcmod/sakura/block/BlockTatami.java
  14. 1 1
      src/main/java/cn/mcmod/sakura/block/slab/BlockCarpetTatami.java
  15. 1 1
      src/main/java/cn/mcmod/sakura/block/slab/BlockHalfTatami.java
  16. 3 2
      src/main/java/cn/mcmod/sakura/block/slab/BlockSlabBase.java
  17. 0 41
      src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSapLog.java
  18. 1 1
      src/main/java/cn/mcmod/sakura/client/SakuraParticleType.java
  19. 0 2
      src/main/java/cn/mcmod/sakura/client/TileEntityRenderHelper.java
  20. 0 1
      src/main/java/cn/mcmod/sakura/client/particle/ParticleSakuraLeaf.java
  21. 78 0
      src/main/java/cn/mcmod/sakura/client/particle/ParticleSyrupDrop.java
  22. 0 2
      src/main/java/cn/mcmod/sakura/client/render/tileentity/RenderTileEntityCampfirePot.java
  23. 72 0
      src/main/java/cn/mcmod/sakura/client/render/tileentity/RenderTileEntityMapleCauldron.java
  24. 6 1
      src/main/java/cn/mcmod/sakura/client/render/tileentity/RenderTileEntityStoneMortar.java
  25. 6 6
      src/main/java/cn/mcmod/sakura/entity/villager/WAVillagerHouse.java
  26. 65 0
      src/main/java/cn/mcmod/sakura/gui/GuiMapleCauldron.java
  27. 13 4
      src/main/java/cn/mcmod/sakura/gui/SakuraGuiHandler.java
  28. 1 1
      src/main/java/cn/mcmod/sakura/inventory/ContainerBarrel.java
  29. 1 1
      src/main/java/cn/mcmod/sakura/inventory/ContainerCampfirePot.java
  30. 1 1
      src/main/java/cn/mcmod/sakura/inventory/ContainerDistillation.java
  31. 134 0
      src/main/java/cn/mcmod/sakura/inventory/ContainerMapleCauldron.java
  32. 1 1
      src/main/java/cn/mcmod/sakura/inventory/ContainerStoneMortar.java
  33. 23 0
      src/main/java/cn/mcmod/sakura/item/ItemBlockMeta.java
  34. 2 0
      src/main/java/cn/mcmod/sakura/item/ItemFoodBasic.java
  35. 4 3
      src/main/java/cn/mcmod/sakura/item/ItemLoader.java
  36. 5 5
      src/main/java/cn/mcmod/sakura/tileentity/TileEntityCampfirePot.java
  37. 3 19
      src/main/java/cn/mcmod/sakura/tileentity/TileEntityDistillation.java
  38. 366 0
      src/main/java/cn/mcmod/sakura/tileentity/TileEntityMapleCauldron.java
  39. 3 0
      src/main/java/cn/mcmod/sakura/tileentity/TileEntityRegistry.java
  40. 0 1
      src/main/java/cn/mcmod/sakura/tileentity/TileEntityStoneMortar.java
  41. 1 2
      src/main/java/cn/mcmod/sakura/util/SakuraRecipeRegister.java
  42. 26 0
      src/main/java/cn/mcmod/sakura/util/WorldUtil.java
  43. 222 0
      src/main/resources/assets/sakura/blockstates/bamboo_stair.json
  44. 222 0
      src/main/resources/assets/sakura/blockstates/bamboo_stair_sunburnt.json
  45. 6 0
      src/main/resources/assets/sakura/blockstates/fluids.json
  46. 10 0
      src/main/resources/assets/sakura/blockstates/maple_cauldron.json
  47. 11 0
      src/main/resources/assets/sakura/blockstates/maple_spile.json
  48. 23 0
      src/main/resources/assets/sakura/blockstates/slab_plank_bamboo.json
  49. 23 0
      src/main/resources/assets/sakura/blockstates/slab_plank_maple.json
  50. 23 0
      src/main/resources/assets/sakura/blockstates/slab_plank_sakura.json
  51. 23 0
      src/main/resources/assets/sakura/blockstates/slab_straw_block.json
  52. 222 0
      src/main/resources/assets/sakura/blockstates/stairs_plank_bamboo.json
  53. 222 0
      src/main/resources/assets/sakura/blockstates/stairs_plank_maple.json
  54. 222 0
      src/main/resources/assets/sakura/blockstates/stairs_plank_sakura.json
  55. 17 0
      src/main/resources/assets/sakura/blockstates/straw_block.json
  56. 222 0
      src/main/resources/assets/sakura/blockstates/straw_stair.json
  57. 251 0
      src/main/resources/assets/sakura/models/block/maple_cauldron.json
  58. 153 0
      src/main/resources/assets/sakura/models/block/spile.json
  59. 50 0
      src/main/resources/assets/sakura/models/item/bamboo_sunburnt.json
  60. BIN
      src/main/resources/assets/sakura/textures/blocks/barrelplanks.png
  61. BIN
      src/main/resources/assets/sakura/textures/blocks/kawara.png
  62. BIN
      src/main/resources/assets/sakura/textures/blocks/maple_syrup_flow.png
  63. BIN
      src/main/resources/assets/sakura/textures/blocks/maple_syrup_still.png
  64. BIN
      src/main/resources/assets/sakura/textures/blocks/straw_block.png
  65. BIN
      src/main/resources/assets/sakura/textures/gui/maple_pot.png
  66. BIN
      src/main/resources/assets/sakura/textures/items/coin.png
  67. BIN
      src/main/resources/assets/sakura/textures/items/maple_syrup.png
  68. BIN
      src/main/resources/assets/sakura/textures/particles/leaf.png
  69. BIN
      src/main/resources/assets/sakura/textures/particles/particles.png

+ 5 - 3
src/main/java/cn/mcmod/sakura/ClientProxy.java

@@ -9,6 +9,7 @@ import cn.mcmod.sakura.client.particle.ParticleMapleOrangeLeaf;
 import cn.mcmod.sakura.client.particle.ParticleMapleRedLeaf;
 import cn.mcmod.sakura.client.particle.ParticleMapleYellowLeaf;
 import cn.mcmod.sakura.client.particle.ParticleSakuraLeaf;
+import cn.mcmod.sakura.client.particle.ParticleSyrupDrop;
 import cn.mcmod.sakura.entity.SakuraEntityRegister;
 import cn.mcmod.sakura.item.ItemLoader;
 import cn.mcmod.sakura.item.drinks.DrinksLoader;
@@ -28,7 +29,7 @@ import net.minecraftforge.fml.relauncher.SideOnly;
 
 @SideOnly(Side.CLIENT)
 public class ClientProxy extends CommonProxy {
-    public static ResourceLocation leafTexture = new ResourceLocation(SakuraMain.MODID, "textures/particles/leaf.png");
+    public static ResourceLocation leafTexture = new ResourceLocation(SakuraMain.MODID, "textures/particles/particles.png");
     public static KeyBinding ChangeMode;
     
     @Override
@@ -64,9 +65,7 @@ public class ClientProxy extends CommonProxy {
         if (mc.effectRenderer != null) {
             int i = mc.gameSettings.particleSetting;
             if (i == 1 && world.rand.nextInt(3) == 0) i = 2;
-
             Particle particle = null;
-
             switch (particleType) {
             case MAPLERED:
                 particle = new ParticleMapleRedLeaf(world, x, y, z, velX, velY, velZ);
@@ -83,6 +82,9 @@ public class ClientProxy extends CommonProxy {
 			case LEAVESSAKURA:
 				particle = new ParticleSakuraLeaf(world, x, y, z, velX, velY, velZ);
 				break;
+			case SYRUPDROP:
+				particle = new ParticleSyrupDrop(world, x, y, z, velX, velY, velZ);
+				break;
 			default:
 				break;
 

+ 4 - 3
src/main/java/cn/mcmod/sakura/SakuraOreDictLoader.java

@@ -14,7 +14,7 @@ import java.util.TreeSet;
 
 public class SakuraOreDictLoader {
 	public static final Set<String> OreList = new TreeSet<>();
-	public static final ItemStack MAPLE_SYRUP = new ItemStack(ItemLoader.MAPLE_SYRUP,1,OreDictionary.WILDCARD_VALUE);
+	
 	public SakuraOreDictLoader() {
 		registerOre("cropRice", new ItemStack(ItemLoader.MATERIAL, 1, 1));
 		registerOre("foodFlour", new ItemStack(ItemLoader.MATERIAL, 1, 4));
@@ -38,14 +38,15 @@ public class SakuraOreDictLoader {
         registerOre("plankWood", new ItemStack(BlockLoader.MAPLE_PLANK, 1));
         registerOre("plankWood", new ItemStack(BlockLoader.SAKURA_PLANK, 1));
         registerOre("plankWood", new ItemStack(BlockLoader.BAMBOO_PLANK, 1));
-        
+
         registerOre("treeLeaves", new ItemStack(BlockLoader.MAPLE_LEAVE_GREEN, 1));
         registerOre("treeLeaves", new ItemStack(BlockLoader.MAPLE_LEAVE_ORANGE, 1));
         registerOre("treeLeaves", new ItemStack(BlockLoader.MAPLE_LEAVE_RED, 1));
         registerOre("treeLeaves", new ItemStack(BlockLoader.MAPLE_LEAVE_YELLOW, 1));
         registerOre("treeLeaves", new ItemStack(BlockLoader.SAKURA_LEAVES, 1));
         registerOre("sakuraLeaves", new ItemStack(BlockLoader.SAKURA_LEAVES, 1));
-		
+		registerOre("cropMaplesyrup", new ItemStack(ItemLoader.MATERIAL, 1,49));
+		registerOre("listAllsugar", new ItemStack(ItemLoader.MATERIAL, 1,49));
 		
 		registerOre("seedRice", new ItemStack(ItemLoader.RICE_SEEDS, 1));
 		registerOre("foodSoysauce", new ItemStack(ItemLoader.MATERIAL, 1,33));

+ 2 - 2
src/main/java/cn/mcmod/sakura/api/recipes/PotRecipes.java

@@ -122,7 +122,7 @@ public class PotRecipes {
             	if(obj1 instanceof ItemStack){
             		ItemStack stack1 = (ItemStack) obj1;
 	                if (ItemStack.areItemsEqual(stack1, inventoryList.get(i))) {
-	                    inventoryList.remove(i);
+//	                    inventoryList.remove(i);
 	                    flg2 = true;
 	                    break;
 	                }
@@ -130,7 +130,7 @@ public class PotRecipes {
                 	String dict = (String) obj1;
                 	NonNullList<ItemStack> ore =OreDictionary.getOres(dict);
                 	if (!ore.isEmpty()&&RecipesUtil.containsMatch(false, ore, inventoryList.get(i))) {
-                        inventoryList.remove(obj1);
+//                        inventoryList.remove(obj1);
                         flg2 = true;
                         break;
                     }

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

@@ -1,5 +1,7 @@
 package cn.mcmod.sakura.block;
 
+import java.util.Random;
+
 import cn.mcmod.sakura.CommonProxy;
 import net.minecraft.block.BlockRotatedPillar;
 import net.minecraft.block.material.Material;
@@ -16,12 +18,21 @@ import net.minecraft.world.World;
 
 public class BlockBambooBlock extends BlockRotatedPillar {
     public static final PropertyEnum<EnumAxis> LOG_AXIS = PropertyEnum.<EnumAxis>create("axis", EnumAxis.class);
-
-    public BlockBambooBlock(Material material) {
+    private final boolean isSunburnt;
+    public BlockBambooBlock(Material material,boolean sunburnt) {
         super(material);
+        isSunburnt=sunburnt;
         this.setCreativeTab(CommonProxy.tab);
     }
 
+	@Override
+	public void updateTick(World worldIn, BlockPos pos, IBlockState state, Random rand) {
+		if(!isSunburnt&&worldIn.canBlockSeeSky(pos)&&worldIn.isDaytime()){
+				worldIn.setBlockState(pos, (BlockLoader.BAMBOO_BLOCK_SUNBURNT).getDefaultState().withProperty(LOG_AXIS, state.getValue(LOG_AXIS)));
+		}
+		super.updateTick(worldIn, pos, state, rand);
+	}
+    
     @Override
     public int getMetaFromState(IBlockState state) {
         switch (state.getValue(LOG_AXIS)) {

+ 6 - 0
src/main/java/cn/mcmod/sakura/block/BlockBase.java

@@ -2,6 +2,7 @@ package cn.mcmod.sakura.block;
 
 import cn.mcmod.sakura.CommonProxy;
 import net.minecraft.block.Block;
+import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 
 public class BlockBase extends Block{
@@ -9,4 +10,9 @@ public class BlockBase extends Block{
         super(material);
         this.setCreativeTab(CommonProxy.tab);
     }
+    
+	@Override
+	public Block setSoundType(SoundType sound) {
+		return super.setSoundType(sound);
+	}
 }

+ 4 - 14
src/main/java/cn/mcmod/sakura/block/BlockFacing.java

@@ -1,8 +1,6 @@
 package cn.mcmod.sakura.block;
 
-import net.minecraft.block.Block;
 import net.minecraft.block.BlockHorizontal;
-import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.properties.IProperty;
 import net.minecraft.block.properties.PropertyDirection;
@@ -19,16 +17,13 @@ import net.minecraft.world.World;
 import net.minecraftforge.fml.relauncher.Side;
 import net.minecraftforge.fml.relauncher.SideOnly;
 
-public class BlockFacing extends Block {
+public class BlockFacing extends BlockBase {
 	public final boolean isFull;
     public BlockFacing(Material materialIn,boolean isfull) {
 		super(materialIn);
 		isFull = isfull;
 	}
-	@Override
-	public Block setSoundType(SoundType sound) {
-		return super.setSoundType(sound);
-	}
+
 	public static final PropertyDirection FACING = BlockHorizontal.FACING;
 	   /**
      * Called after the block is set in the Chunk data, but before the Tile Entity is set
@@ -91,12 +86,7 @@ public class BlockFacing extends Block {
      */
     public IBlockState getStateFromMeta(int meta)
     {
-        EnumFacing enumfacing = EnumFacing.getFront(meta);
-
-        if (enumfacing.getAxis() == EnumFacing.Axis.Y)
-        {
-            enumfacing = EnumFacing.NORTH;
-        }
+        EnumFacing enumfacing = EnumFacing.getHorizontal(meta);
 
         return this.getDefaultState().withProperty(FACING, enumfacing);
     }
@@ -106,7 +96,7 @@ public class BlockFacing extends Block {
      */
     public int getMetaFromState(IBlockState state)
     {
-        return state.getValue(FACING).getIndex();
+        return state.getValue(FACING).getHorizontalIndex();
     }
 
     /**

+ 1 - 0
src/main/java/cn/mcmod/sakura/block/BlockKawara.java

@@ -21,6 +21,7 @@ public class BlockKawara extends BlockFacing
   public BlockKawara()
   {
     super(Material.ROCK,false);
+    this.useNeighborBrightness = true;
     setDefaultState(this.blockState.getBaseState().withProperty(SHAPE, EnumShape.STRAIGHT));
   }
   

+ 56 - 6
src/main/java/cn/mcmod/sakura/block/BlockLoader.java

@@ -38,6 +38,8 @@ import net.minecraftforge.fml.relauncher.SideOnly;
 public class BlockLoader {
 	public static Fluid FOODOIL_FLUID = new FluidBasic("food_oil");
 	public static Block FOODOIL;
+	public static Fluid MAPLE_SYRUP_FLUID = new FluidBasic("maple_syrup");
+	public static Block MAPLE_SYRUP;
 	public static Fluid GRAPE_FLUID = new FluidBasic("grape_fluid");
 	public static Block GRAPE_FLUID_BLOCK;
 	public static Fluid RED_WINE_FLUID = new FluidBasic("red_wine");
@@ -74,8 +76,8 @@ public class BlockLoader {
     public static Block BAMBOO = new BlockPlantBamboo();
     public static Block WINDBELL = new BlockWindBell();
     public static BlockBambooShoot BAMBOOSHOOT = new BlockBambooShoot();
-    public static Block BAMBOO_BLOCK = new BlockBambooBlock(Material.WOOD).setHardness(1.6F).setResistance(6.0F);
-    public static Block BAMBOO_BLOCK_SUNBURNT = new BlockBambooBlock(Material.WOOD).setHardness(1.6F).setResistance(5.5F);
+    public static Block BAMBOO_BLOCK = new BlockBambooBlock(Material.WOOD,false).setHardness(1.6F).setResistance(6.0F);
+    public static Block BAMBOO_BLOCK_SUNBURNT = new BlockBambooBlock(Material.WOOD,true).setHardness(1.6F).setResistance(5.5F);
     public static BlockSlabBase BAMBOO_SLAB = new BlockBambooSlab(Material.WOOD);
     public static BlockSlabBase BAMBOO_SLAB_SUNBURNT = new BlockBambooSlab(Material.WOOD);
     public static Block BAMBOOLANTERN = new BlockBambooLantern();
@@ -92,7 +94,7 @@ public class BlockLoader {
 	public static Block MAPLE_LOG_SAP = new BlockMapleSapLog();
     public static Block BAMBOO_PLANK = new BlockSakuraPlank(Material.WOOD);
     public static Block MAPLE_PLANK = new BlockSakuraPlank(Material.WOOD);
-//	public static Block MAPLE_SYRUP_CAUDRON = new BlockMapleSyrupCauldron();
+	public static Block MAPLE_CAULDRON = new BlockMapleSyrupCauldron();
 	public static Block CAMPFIRE_IDLE = new BlockCampfire(false);
 	public static Block CAMPFIRE_LIT = new BlockCampfire(true);
     public static Block CAMPFIRE_POT_IDLE = new BlockCampfirePot(false);
@@ -153,12 +155,29 @@ public class BlockLoader {
 	public static Block UDON_BLOCK = new BlockUdon();
 	public static Block RAMEN_BLOCK = new BlockRamen();
 	public static Block SOBA_BLOCK = new BlockSoba();
+	
+	public static Block STRAW_BLOCK = new BlockBase(Material.CLOTH).setSoundType(SoundType.PLANT).setHardness(0.25F).setResistance(0.5F);
+	public static Block STRAW_BLOCK_STAIR = new BlockStairBasic(STRAW_BLOCK.getDefaultState());
+	public static Block SAKURA_PLANK_STAIR = new BlockStairBasic(SAKURA_PLANK.getDefaultState());
+	public static Block BAMBOO_PLANK_STAIR = new BlockStairBasic(BAMBOO_PLANK.getDefaultState());
+	public static Block MAPLE_PLANK_STAIR = new BlockStairBasic(MAPLE_PLANK.getDefaultState());
+	public static Block BAMBOO_STAIR = new BlockStairBasic(BAMBOO_BLOCK.getDefaultState());
+	public static Block BAMBOO_SUNBURNT_STAIR = new BlockStairBasic(BAMBOO_BLOCK_SUNBURNT.getDefaultState());
+	
+	public static Block STRAW_BLOCK_SLAB = new BlockBambooSlab(Material.WOOD).setSoundType(SoundType.PLANT).setHardness(0.25F).setResistance(0.5F);
+	public static Block SAKURA_PLANK_SLAB = new BlockBambooSlab(Material.WOOD);
+	public static Block BAMBOO_PLANK_SLAB = new BlockBambooSlab(Material.WOOD);
+	public static Block MAPLE_PLANK_SLAB = new BlockBambooSlab(Material.WOOD);
+	
+	public static Block MAPLE_SPILE = new BlockMapleSpile();
 	public BlockLoader(FMLPreInitializationEvent event) {
 //		register blocks
 //		DON'T REGISTER RENDERS IN THIS VOID,PLEASE!!!
 
 		FluidRegistry.addBucketForFluid(FOODOIL_FLUID);
 		FOODOIL=registerFluidBlock(FOODOIL_FLUID, new BlockFluidBasic(FOODOIL_FLUID), "foodoil");
+		FluidRegistry.addBucketForFluid(MAPLE_SYRUP_FLUID);
+		MAPLE_SYRUP=registerFluidBlock(MAPLE_SYRUP_FLUID, new BlockFluidBasic(MAPLE_SYRUP_FLUID), "maple_syrup");
 		FluidRegistry.addBucketForFluid(GRAPE_FLUID);
 		GRAPE_FLUID_BLOCK=registerFluidBlock(GRAPE_FLUID, new BlockFluidBasic(GRAPE_FLUID), "grape_fluid");
 		FluidRegistry.addBucketForFluid(RED_WINE_FLUID);
@@ -202,8 +221,12 @@ public class BlockLoader {
         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");
+        register(BAMBOO_PLANK_SLAB, new ItemBlock(BAMBOO_PLANK_SLAB), "slab_plank_bamboo");
         register(BAMBOO_BLOCK, new ItemBlock(BAMBOO_BLOCK), "bamboo_block");
         register(BAMBOO_BLOCK_SUNBURNT, new ItemBlock(BAMBOO_BLOCK_SUNBURNT), "bamboo_block_sunburnt");
+        register(BAMBOO_STAIR, new ItemBlock(BAMBOO_STAIR), "bamboo_stair");
+        register(BAMBOO_SUNBURNT_STAIR, new ItemBlock(BAMBOO_SUNBURNT_STAIR), "bamboo_stair_sunburnt");
         register(BAMBOO_SLAB, new ItemSlabBase(BAMBOO_SLAB), "bamboo_slab");
         register(BAMBOO_SLAB_SUNBURNT, new ItemSlabBase(BAMBOO_SLAB_SUNBURNT), "bamboo_slab_sunburnt");
 		register(BAMBOO_FENCE, new ItemBlock(BAMBOO_FENCE), "bamboo_fence");
@@ -211,6 +234,10 @@ public class BlockLoader {
 		
         register(BAMBOOLANTERN, new ItemBlock(BAMBOOLANTERN), "bamboo_lantern");
         register(WINDBELL, new ItemBlock(WINDBELL), "windbell");
+        
+        register(STRAW_BLOCK, new ItemBlock(STRAW_BLOCK), "straw_block");
+        register(STRAW_BLOCK_STAIR, new ItemBlock(STRAW_BLOCK_STAIR), "straw_stair");
+        register(STRAW_BLOCK_SLAB, new ItemBlock(STRAW_BLOCK_SLAB), "slab_straw_block");
         register(TATAMI_TAN, new ItemBlock(TATAMI_TAN), "tatami_tan");
         register(TATAMI, new ItemBlock(TATAMI), "tatami");
         register(TATAMI_TAN_NS, new ItemBlock(TATAMI_TAN_NS), "tatami_tan_ns");
@@ -228,6 +255,7 @@ public class BlockLoader {
         
 		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_LEAVE_RED, new ItemBlock(MAPLE_LEAVE_RED), "maple_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");
@@ -238,11 +266,18 @@ public class BlockLoader {
 		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");
-		register(SAKURA_LEAVES, new ItemBlock(SAKURA_LEAVES), "sakuraleaves");
+        register(MAPLE_PLANK_STAIR, new ItemBlock(MAPLE_PLANK_STAIR), "stairs_plank_maple");
+        register(MAPLE_PLANK_SLAB, new ItemBlock(MAPLE_PLANK_SLAB), "slab_plank_maple");
+        register(SAKURA_LEAVES, new ItemBlock(SAKURA_LEAVES), "sakuraleaves");
 		register(SAKURA_SAPLING, new ItemBlock(SAKURA_SAPLING), "sakura_sapling");
 		register(SAKURA_LOG, new ItemBlock(SAKURA_LOG), "sakura_log");
         register(SAKURA_PLANK, new ItemBlock(SAKURA_PLANK), "plank_sakura");
-		register(STONEMORTAR, new ItemBlock(STONEMORTAR), "stone_mortar");
+        register(SAKURA_PLANK_STAIR, new ItemBlock(SAKURA_PLANK_STAIR), "stairs_plank_sakura");
+        register(SAKURA_PLANK_SLAB, new ItemBlock(SAKURA_PLANK_SLAB), "slab_plank_sakura");
+	
+        register(MAPLE_SPILE, new ItemBlock(MAPLE_SPILE), "maple_spile");
+        
+        register(STONEMORTAR, new ItemBlock(STONEMORTAR), "stone_mortar");
 		register(BARREL, new ItemBlock(BARREL), "barrel");
 		register(BARREL_DISTILLATION, new ItemBlock(BARREL_DISTILLATION), "barrel_distillation");
 		register(CAMPFIRE_IDLE, new ItemBlock(CAMPFIRE_IDLE), "campfire_idle");
@@ -303,6 +338,20 @@ public class BlockLoader {
 	@SideOnly(Side.CLIENT)
 	public static void registerRenders() {
 //		please register blocks' renders in THIS void!
+		registerRender(MAPLE_SPILE);
+		registerRender(STRAW_BLOCK);
+		registerRender(STRAW_BLOCK_STAIR);
+		registerRender(SAKURA_PLANK_STAIR);
+		registerRender(BAMBOO_PLANK_STAIR);
+		registerRender(MAPLE_PLANK_STAIR);
+		registerRender(BAMBOO_STAIR);
+		registerRender(BAMBOO_SUNBURNT_STAIR);
+		
+		registerRender(STRAW_BLOCK_SLAB);
+		registerRender(SAKURA_PLANK_SLAB);
+		registerRender(BAMBOO_PLANK_SLAB);
+		registerRender(MAPLE_PLANK_SLAB);
+		
 		registerRender(WINDBELL);
 		registerRender(BARREL_DISTILLATION);
 		registerRender(UDON_UNFINISHED);
@@ -329,6 +378,7 @@ public class BlockLoader {
 		registerFluidBlockRendering(LIQUEUR, "liqueur");
 		
 		registerFluidBlockRendering(FOODOIL, "food_oil");
+		registerFluidBlockRendering(MAPLE_SYRUP, "maple_syrup");
 		registerFluidBlockRendering(GRAPE_FLUID_BLOCK, "grape_fluid");
 		registerFluidBlockRendering(GREEN_GRAPE_FLUID_BLOCK, "green_grape_fluid");
 		registerFluidBlockRendering(RED_WINE, "red_wine");
@@ -342,7 +392,7 @@ public class BlockLoader {
 		registerFluidBlockRendering(VODKA, "vodka");
 		registerFluidBlockRendering(BRANDY, "brandy");
 		registerFluidBlockRendering(WHISKEY, "whiskey");
-		
+		registerRender(MAPLE_CAULDRON);
 		registerRender(BAMBOO_FENCE);
 		registerRender(BAMBOO_FENCE_SUNBURNT);
 		registerRender(KAWARA_BLOCK);

+ 109 - 0
src/main/java/cn/mcmod/sakura/block/BlockMapleSpile.java

@@ -0,0 +1,109 @@
+package cn.mcmod.sakura.block;
+
+import java.util.Random;
+
+import cn.mcmod.sakura.SakuraMain;
+import cn.mcmod.sakura.block.tree.BlockMapleSapLog;
+import cn.mcmod.sakura.client.SakuraParticleType;
+import net.minecraft.block.Block;
+import net.minecraft.block.material.Material;
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.util.EnumFacing;
+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.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+public class BlockMapleSpile extends BlockFacing {
+	private static final AxisAlignedBB AABB_N = new AxisAlignedBB(0.3125D, 0.1875D, 0.1875D, 0.6875D, 0.6875D, 1.0D);
+	private static final AxisAlignedBB AABB_S = new AxisAlignedBB(0.3125D, 0.1875D, 0D, 0.6875D, 0.6875D, 0.8125D);
+	private static final AxisAlignedBB AABB_W = new AxisAlignedBB(0.1875D, 0.1875D, 0.3125D, 1.0D, 0.6875D, 0.6875D);
+	private static final AxisAlignedBB AABB_E = new AxisAlignedBB(0D, 0.1875D, 0.3125D, 0.8125D, 0.6875D, 0.6875D);
+	public BlockMapleSpile() {
+		super(Material.IRON,false);
+		setTickRandomly(true);
+	}
+	
+	@Override
+    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos)
+    {
+       switch (state.getValue(FACING)) {
+		case EAST:
+			return AABB_E;
+		case NORTH:
+			return AABB_N;
+		case SOUTH:
+			return AABB_S;
+		case WEST:
+			return AABB_W;
+		default:
+			break;
+		}
+       return AABB_N;
+    }
+	
+    /**
+     * Checks if this block can be placed exactly at the given position.
+     */
+    public boolean canPlaceBlockAt(World worldIn, BlockPos pos)  {
+        for (EnumFacing enumfacing : FACING.getAllowedValues())
+            if (this.canPlaceAt(worldIn, pos, enumfacing))
+                return true;
+        return false;
+    }
+	@Override
+	public void setDefaultFacing(World worldIn, BlockPos pos, IBlockState state) {
+		 for (EnumFacing enumfacing : FACING.getAllowedValues())
+	            if (this.canPlaceAt(worldIn, pos, enumfacing))
+	                worldIn.setBlockState(pos, state.withProperty(FACING, enumfacing), 2);
+	}
+    private boolean canPlaceAt(World worldIn, BlockPos pos, EnumFacing facing) {
+        BlockPos blockpos = pos.offset(facing.getOpposite());
+        IBlockState iblockstate = worldIn.getBlockState(blockpos);
+        Block block = iblockstate.getBlock();
+        if (facing != EnumFacing.UP && facing != EnumFacing.DOWN) {
+            boolean flag1 = !isExceptBlockForAttachWithPiston(block);
+            boolean flag2 = block instanceof BlockMapleSapLog && iblockstate.getValue(BlockMapleSapLog.SAP_AGE).intValue()<5;
+            return flag1&&flag2;
+        }
+		return false;
+    }
+    @Override
+    public void randomTick(World worldIn, BlockPos pos, IBlockState state, Random random) {
+        if(canWork(worldIn, pos, state)){
+        	EnumFacing facing = state.getValue(FACING);
+        	BlockPos blockpos = pos.offset(facing.getOpposite());
+            IBlockState iblockstate = worldIn.getBlockState(blockpos);
+        	if(worldIn.rand.nextInt(5000)==0)
+        		worldIn.setBlockState(blockpos, iblockstate.withProperty(BlockMapleSapLog.SAP_AGE, iblockstate.getValue(BlockMapleSapLog.SAP_AGE).intValue()+1));		
+        }
+    }
+    
+    public static boolean canWork(World worldIn, BlockPos pos, IBlockState state) {
+    	EnumFacing facing = state.getValue(FACING);
+    	BlockPos blockpos = pos.offset(facing.getOpposite());
+        IBlockState iblockstate = worldIn.getBlockState(blockpos);
+        Block block = iblockstate.getBlock();
+        if(block instanceof BlockMapleSapLog&&iblockstate.getValue(BlockMapleSapLog.SAP_AGE).intValue()<5)
+        	return true;
+		return false;
+	}
+    
+    @SideOnly(Side.CLIENT)
+    @Override
+    public void randomDisplayTick(IBlockState stateIn, World worldIn, BlockPos pos, Random rand) {
+    	if(canWork(worldIn, pos, stateIn)){
+	    	if (rand.nextInt(10) == 0) {
+	            double d0 = pos.getX() + 0.5D;
+	            double d1 = pos.getY() - 0.15D;
+	            double d2 = pos.getZ() + 0.5D;
+	            double d3 = 0D;
+	            double d4 = ((rand.nextFloat()) * 0.055D) + 0.015D;
+	            double d5 = 0D;
+	            SakuraMain.proxy.spawnParticle(SakuraParticleType.SYRUPDROP, d0, d1, d2, d3, -d4, d5);
+	        }
+        }
+    }
+}

+ 65 - 147
src/main/java/cn/mcmod/sakura/block/BlockMapleSyrupCauldron.java

@@ -1,192 +1,110 @@
 package cn.mcmod.sakura.block;
 
-import cn.mcmod.sakura.item.ItemLoader;
+import cn.mcmod.sakura.CommonProxy;
+import cn.mcmod.sakura.SakuraMain;
+import cn.mcmod.sakura.gui.SakuraGuiHandler;
+import cn.mcmod.sakura.tileentity.TileEntityMapleCauldron;
 import net.minecraft.block.Block;
+import net.minecraft.block.BlockContainer;
+import net.minecraft.block.ITileEntityProvider;
 import net.minecraft.block.SoundType;
-import net.minecraft.block.material.MapColor;
 import net.minecraft.block.material.Material;
-import net.minecraft.block.properties.IProperty;
-import net.minecraft.block.properties.PropertyInteger;
 import net.minecraft.block.state.BlockFaceShape;
-import net.minecraft.block.state.BlockStateContainer;
 import net.minecraft.block.state.IBlockState;
-import net.minecraft.entity.Entity;
+import net.minecraft.entity.EntityLivingBase;
 import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.init.Blocks;
-import net.minecraft.init.Items;
-import net.minecraft.init.SoundEvents;
-import net.minecraft.item.Item;
+import net.minecraft.inventory.InventoryHelper;
 import net.minecraft.item.ItemStack;
-import net.minecraft.stats.StatList;
-import net.minecraft.util.EnumFacing;
-import net.minecraft.util.EnumHand;
-import net.minecraft.util.SoundCategory;
-import net.minecraft.util.math.AxisAlignedBB;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.*;
 import net.minecraft.util.math.BlockPos;
-import net.minecraft.util.math.MathHelper;
 import net.minecraft.world.IBlockAccess;
 import net.minecraft.world.World;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
 
-import javax.annotation.Nullable;
-import java.util.List;
-import java.util.Random;
-
-public class BlockMapleSyrupCauldron extends Block {
-    public static final PropertyInteger LEVEL = PropertyInteger.create("level", 0, 7);
-    protected static final AxisAlignedBB AABB_LEGS = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.3125D, 1.0D);
-    protected static final AxisAlignedBB AABB_WALL_NORTH = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.125D);
-    protected static final AxisAlignedBB AABB_WALL_SOUTH = new AxisAlignedBB(0.0D, 0.0D, 0.875D, 1.0D, 1.0D, 1.0D);
-    protected static final AxisAlignedBB AABB_WALL_EAST = new AxisAlignedBB(0.875D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D);
-    protected static final AxisAlignedBB AABB_WALL_WEST = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.125D, 1.0D, 1.0D);
-
-
+public class BlockMapleSyrupCauldron extends BlockContainer implements ITileEntityProvider {
+    private static boolean keepInventory;
     public BlockMapleSyrupCauldron() {
-        super(Material.IRON, MapColor.STONE);
-        this.setSoundType(SoundType.METAL);
-        this.setHardness(2.0F);
+        super(Material.IRON);
+        this.setHardness(0.5F);
+        this.setSoundType(SoundType.ANVIL);
+        this.setCreativeTab(CommonProxy.tab);
     }
 
-    public void addCollisionBoxToList(IBlockState state, World worldIn, BlockPos pos, AxisAlignedBB entityBox, List<AxisAlignedBB> collidingBoxes, @Nullable Entity entityIn, boolean isActualState) {
-        addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_LEGS);
-        addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_WALL_WEST);
-        addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_WALL_NORTH);
-        addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_WALL_EAST);
-        addCollisionBoxToList(pos, entityBox, collidingBoxes, AABB_WALL_SOUTH);
+    @Override
+    public EnumBlockRenderType getRenderType(IBlockState state) {
+        return EnumBlockRenderType.MODEL;
     }
 
-    public AxisAlignedBB getBoundingBox(IBlockState state, IBlockAccess source, BlockPos pos) {
-        return FULL_BLOCK_AABB;
+    @SideOnly(Side.CLIENT)
+    public BlockRenderLayer getBlockLayer() {
+        return BlockRenderLayer.CUTOUT_MIPPED;
     }
 
-    /**
-     * Used to determine ambient occlusion and culling when rebuilding chunks for render
-     */
+    @Override
     public boolean isOpaqueCube(IBlockState state) {
         return false;
     }
 
+    @Override
     public boolean isFullCube(IBlockState state) {
         return false;
     }
 
-    /**
-     * Called When an Entity Collided with the Block
-     */
-    /*public void onEntityCollidedWithBlock(World worldIn, BlockPos pos, IBlockState state, Entity entityIn)
-    {
-        int i = ((Integer)state.getValue(LEVEL)).intValue();
-        float f = (float)pos.getY() + (6.0F + (float)(3 * i)) / 16.0F;
-
-        if (!worldIn.isRemote && entityIn.isBurning() && i > 0 && entityIn.getEntityBoundingBox().minY <= (double)f)
-        {
-            entityIn.extinguish();
-            this.setSyrupLevel(worldIn, pos, state, i - 1);
-        }
-    }*/
-
-    /**
-     * Called when the block is right clicked by a player.
-     */
-    public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, EnumFacing facing, float hitX, float hitY, float hitZ) {
-        ItemStack itemstack = playerIn.getHeldItem(hand);
-
-        if (itemstack.isEmpty()) {
-            return true;
-        }
-		int i = state.getValue(LEVEL).intValue();
-		Item item = itemstack.getItem();
-		if (item == Items.GLASS_BOTTLE) {
-		    if (i > 0 && !worldIn.isRemote) {
-		        if (!playerIn.capabilities.isCreativeMode) {
-		            ItemStack itemstack3 = new ItemStack(ItemLoader.MAPLE_SYRUP);
-		            playerIn.addStat(StatList.CAULDRON_USED);
-		            itemstack.shrink(1);
-
-		            if (itemstack.isEmpty()) {
-		                playerIn.setHeldItem(hand, itemstack3);
-		            } else if (!playerIn.inventory.addItemStackToInventory(itemstack3)) {
-		                playerIn.dropItem(itemstack3, false);
-		            } else if (playerIn instanceof EntityPlayerMP) {
-		                ((EntityPlayerMP) playerIn).sendContainerToPlayer(playerIn.inventoryContainer);
-		            }
-		        }
-
-		        worldIn.playSound((EntityPlayer) null, pos, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
-		        this.setSyrupLevel(worldIn, pos, state, i - 1);
-		    }
-
-		    return true;
-		}
-		return false;
+    @Override
+    public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) {
+        return BlockFaceShape.UNDEFINED;
     }
 
-    public void setSyrupLevel(World worldIn, BlockPos pos, IBlockState state, int level) {
-        if (level == 0) {
-            worldIn.setBlockState(pos, Blocks.CAULDRON.getDefaultState(), 2);
-        } else {
-            worldIn.setBlockState(pos, state.withProperty(LEVEL, Integer.valueOf(MathHelper.clamp(level, 0, 7))), 2);
-            worldIn.updateComparatorOutputLevel(pos, this);
-        }
+    @Override
+    public boolean canPlaceBlockAt(World worldIn, BlockPos pos) {
+        IBlockState downState = worldIn.getBlockState(pos.down());
+        return (downState.isTopSolid() || downState.getBlockFaceShape(worldIn, pos.down(), EnumFacing.UP) == BlockFaceShape.SOLID) && super.canPlaceBlockAt(worldIn, pos);
     }
 
-    /**
-     * Get the Item that this Block should drop when harvested.
-     */
-    public Item getItemDropped(IBlockState state, Random rand, int fortune) {
-        return Items.CAULDRON;
+    public boolean canBlockStay(World worldIn, BlockPos pos) {
+        IBlockState downState = worldIn.getBlockState(pos.down());
+        return downState.isTopSolid() || downState.getBlockFaceShape(worldIn, pos.down(), EnumFacing.UP) == BlockFaceShape.SOLID;
     }
 
-    public ItemStack getItem(World worldIn, BlockPos pos, IBlockState state) {
-        return new ItemStack(Items.CAULDRON);
+    @Override
+    public void neighborChanged(IBlockState state, World worldIn, BlockPos pos, Block blockIn, BlockPos fromPos) {
+        if (!this.canBlockStay(worldIn, pos)) {
+            this.dropBlockAsItem(worldIn, pos, state, 0);
+            worldIn.setBlockToAir(pos);
+        }
     }
 
-    public boolean hasComparatorInputOverride(IBlockState state) {
+    @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;
+        }
+        playerIn.openGui(SakuraMain.instance, SakuraGuiHandler.ID_MAPLECAULDRON, worldIn, pos.getX(), pos.getY(), pos.getZ());
         return true;
     }
 
-    public int getComparatorInputOverride(IBlockState blockState, World worldIn, BlockPos pos) {
-        return blockState.getValue(LEVEL).intValue();
-    }
-
-    /**
-     * Convert the given metadata into a BlockState for this Block
-     */
-    public IBlockState getStateFromMeta(int meta) {
-        return this.getDefaultState().withProperty(LEVEL, Integer.valueOf(meta));
-    }
-
-    /**
-     * Convert the BlockState into the correct metadata value
-     */
-    public int getMetaFromState(IBlockState state) {
-        return state.getValue(LEVEL).intValue();
+    @Override
+    public void onBlockPlacedBy(World worldIn, BlockPos pos, IBlockState state, EntityLivingBase placer, ItemStack stack) {
+        worldIn.getBlockState(pos.up()).getBlock().onNeighborChange(worldIn, pos.up(), pos);
     }
-
-    protected BlockStateContainer createBlockState() {
-        return new BlockStateContainer(this, new IProperty[]{LEVEL});
+  
+    @Override
+    public void breakBlock(World worldIn, BlockPos pos, IBlockState state) {
+        if (!keepInventory) {
+            TileEntity te = worldIn.getTileEntity(pos);
+            if (te instanceof TileEntityMapleCauldron) {
+                InventoryHelper.dropInventoryItems(worldIn, pos, (TileEntityMapleCauldron)te);
+                worldIn.updateComparatorOutputLevel(pos, this);
+            }
+        }
+        super.breakBlock(worldIn, pos, state);
     }
 
-    /**
-     * Determines if an entity can path through this block
-     */
-    public boolean isPassable(IBlockAccess worldIn, BlockPos pos) {
-        return true;
+    @Override
+    public TileEntity createNewTileEntity(World worldIn, int meta) {
+        return new TileEntityMapleCauldron();
     }
 
-    /**
-     * Get the geometry of the queried face at the given position and state. This is used to decide whether things like
-     * buttons are allowed to be placed on the face, or how glass panes connect to the face, among other things.
-     * <p>
-     * Common values are {@code SOLID}, which is the default, and {@code UNDEFINED}, which represents something that
-     * does not fit the other descriptions and will generally cause other things not to connect to the face.
-     *
-     * @return an approximation of the form of the given face
-     */
-    public BlockFaceShape getBlockFaceShape(IBlockAccess worldIn, IBlockState state, BlockPos pos, EnumFacing face) {
-        if (face == EnumFacing.UP) {
-            return BlockFaceShape.BOWL;
-        }
-		return face == EnumFacing.DOWN ? BlockFaceShape.UNDEFINED : BlockFaceShape.SOLID;
-    }
 }

+ 14 - 0
src/main/java/cn/mcmod/sakura/block/BlockStairBasic.java

@@ -0,0 +1,14 @@
+package cn.mcmod.sakura.block;
+
+import net.minecraft.block.BlockStairs;
+import net.minecraft.block.state.IBlockState;
+
+public class BlockStairBasic extends BlockStairs {
+
+	protected BlockStairBasic(IBlockState modelState) {
+		super(modelState);
+		  this.useNeighborBrightness = true;
+		    this.setCreativeTab(modelState.getBlock().getCreativeTabToDisplayOn());
+	}
+
+}

+ 0 - 5
src/main/java/cn/mcmod/sakura/block/BlockStoneMortar.java

@@ -80,21 +80,16 @@ public class BlockStoneMortar extends BlockContainer implements ITileEntityProvi
     //Only on top of FullBlock can place
     private boolean canPlaceFullBlock(World worldIn, BlockPos pos) {
         IBlockState downState = worldIn.getBlockState(pos.down());
-
         return downState.isTopSolid() && downState.getBlockFaceShape(worldIn, pos.down(), EnumFacing.UP) == BlockFaceShape.SOLID;
     }
 
     @Override
     public void breakBlock(World worldIn, BlockPos pos, IBlockState state) {
-
         TileEntity tileentity = worldIn.getTileEntity(pos);
-
         if (tileentity instanceof TileEntityStoneMortar) {
             InventoryHelper.dropInventoryItems(worldIn, pos, (TileEntityStoneMortar) tileentity);
             worldIn.updateComparatorOutputLevel(pos, this);
         }
-
-
         super.breakBlock(worldIn, pos, state);
     }
 

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

@@ -11,7 +11,7 @@ import net.minecraft.world.World;
 public class BlockTatami extends BlockFacing{
 	public final boolean isNS;
 	public BlockTatami(boolean ns) {
-		super(Material.GRASS,true);
+		super(Material.CLOTH,true);
 		this.setTickRandomly(true);
 		this.setSoundType(SoundType.PLANT);
 		setHardness(0.5F).setResistance(0.5F);

+ 1 - 1
src/main/java/cn/mcmod/sakura/block/slab/BlockCarpetTatami.java

@@ -12,7 +12,7 @@ import net.minecraft.world.World;
 public class BlockCarpetTatami extends BlockCarpetFacing{
 	public final boolean isNS;
 	public BlockCarpetTatami(boolean ns) {
-		super(Material.GRASS);
+		super(Material.CLOTH);
 		this.setTickRandomly(true);
 		this.setSoundType(SoundType.PLANT);
 		setHardness(0.15F).setResistance(0.5F);

+ 1 - 1
src/main/java/cn/mcmod/sakura/block/slab/BlockHalfTatami.java

@@ -12,7 +12,7 @@ import net.minecraft.world.World;
 public class BlockHalfTatami extends BlockHalfFacing{
 	public final boolean isNS;
 	public BlockHalfTatami(boolean ns) {
-		super(Material.GRASS);
+		super(Material.CLOTH);
 		this.setTickRandomly(true);
 		this.setSoundType(SoundType.PLANT);
 		setHardness(0.25F).setResistance(0.5F);

+ 3 - 2
src/main/java/cn/mcmod/sakura/block/slab/BlockSlabBase.java

@@ -1,6 +1,5 @@
 package cn.mcmod.sakura.block.slab;
 
-import net.minecraft.block.Block;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.properties.PropertyEnum;
@@ -22,7 +21,9 @@ import net.minecraft.world.World;
 
 import java.util.Random;
 
-public class BlockSlabBase extends Block {
+import cn.mcmod.sakura.block.BlockBase;
+
+public class BlockSlabBase extends BlockBase {
     public static final PropertyEnum<EnumBlockFrostHalf> HALF = PropertyEnum.create("half", EnumBlockFrostHalf.class);
     protected static final AxisAlignedBB AABB_BOTTOM_HALF = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.5D, 1.0D);
     protected static final AxisAlignedBB AABB_TOP_HALF = new AxisAlignedBB(0.0D, 0.5D, 0.0D, 1.0D, 1.0D, 1.0D);

+ 0 - 41
src/main/java/cn/mcmod/sakura/block/tree/BlockMapleSapLog.java

@@ -2,26 +2,16 @@ package cn.mcmod.sakura.block.tree;
 
 import cn.mcmod.sakura.CommonProxy;
 import cn.mcmod.sakura.block.BlockLoader;
-import cn.mcmod.sakura.item.ItemLoader;
 import net.minecraft.block.Block;
 import net.minecraft.block.SoundType;
 import net.minecraft.block.material.Material;
 import net.minecraft.block.properties.PropertyInteger;
 import net.minecraft.block.state.BlockStateContainer;
 import net.minecraft.block.state.IBlockState;
-import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.init.Items;
-import net.minecraft.init.SoundEvents;
 import net.minecraft.item.Item;
-import net.minecraft.item.ItemStack;
 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.IBlockAccess;
-import net.minecraft.world.World;
-
 import java.util.Random;
 
 public class BlockMapleSapLog extends Block {
@@ -35,37 +25,6 @@ public class BlockMapleSapLog extends Block {
         this.setDefaultState(this.getBlockState().getBaseState().withProperty(SAP_AGE, 0));
     }
 
-    @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;
-        }
-		int j = state.getValue(SAP_AGE).intValue();
-		ItemStack stack = playerIn.getHeldItem(hand);
-		if (stack.getItem() == Items.GLASS_BOTTLE&& j < 5) {
-		    ItemStack itemstack3 =new ItemStack(ItemLoader.MAPLE_SYRUP);
-		    if (!playerIn.capabilities.isCreativeMode) {
-		        stack.shrink(1);
-		    }
-
-		    if (stack.isEmpty()) {
-		        playerIn.setHeldItem(hand, itemstack3);
-		    } else if (!playerIn.inventory.addItemStackToInventory(itemstack3)) {
-		        playerIn.dropItem(itemstack3, false);
-		    } else if (playerIn instanceof EntityPlayerMP) {
-		        ((EntityPlayerMP) playerIn).sendContainerToPlayer(playerIn.inventoryContainer);
-		    }
-
-		    if(worldIn.rand.nextInt(2) == 0) {
-		        worldIn.setBlockState(pos, state.withProperty(SAP_AGE, Integer.valueOf(j + 1)), 4);
-		    }
-		    worldIn.playSound((EntityPlayer) null, pos, SoundEvents.ITEM_BOTTLE_FILL, SoundCategory.BLOCKS, 1.0F, 1.0F);
-
-		    return true;
-		}
-		return true;
-    }
-
     public Item getItemDropped(IBlockState state, Random rand, int fortune)
     {
         return Item.getItemFromBlock(BlockLoader.MAPLE_LOG);

+ 1 - 1
src/main/java/cn/mcmod/sakura/client/SakuraParticleType.java

@@ -1,5 +1,5 @@
 package cn.mcmod.sakura.client;
 
 public enum SakuraParticleType {
-    MAPLERED,MAPLEYELLOW,MAPLEGREEN,MAPLEORANGE,LEAVESSAKURA
+    MAPLERED,MAPLEYELLOW,MAPLEGREEN,MAPLEORANGE,LEAVESSAKURA,SYRUPDROP
 }

+ 0 - 2
src/main/java/cn/mcmod/sakura/client/TileEntityRenderHelper.java

@@ -16,9 +16,7 @@ public class TileEntityRenderHelper extends TileEntityItemStackRenderer {
 
     @Override
     public void renderByItem(ItemStack itemStack) {
-
         Block block = Block.getBlockFromItem(itemStack.getItem());
-//        Item item = itemStack.getItem();
         if (block == BlockLoader.STONEMORTAR) {
             TileEntityRendererDispatcher.instance.render(this.mortarRender, 0.0D, 0.0D, 0.0D, 0.0F);
         } else {

+ 0 - 1
src/main/java/cn/mcmod/sakura/client/particle/ParticleSakuraLeaf.java

@@ -57,7 +57,6 @@ public class ParticleSakuraLeaf extends Particle {
 
     @Override
     public void onUpdate() {
-
         prevPosX = posX;
         prevPosY = posY;
         prevPosZ = posZ;

+ 78 - 0
src/main/java/cn/mcmod/sakura/client/particle/ParticleSyrupDrop.java

@@ -0,0 +1,78 @@
+package cn.mcmod.sakura.client.particle;
+
+import cn.mcmod.sakura.ClientProxy;
+import net.minecraft.client.particle.Particle;
+import net.minecraft.client.renderer.BufferBuilder;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.entity.Entity;
+import net.minecraft.world.World;
+import net.minecraftforge.fml.client.FMLClientHandler;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+@SideOnly(Side.CLIENT)
+public class ParticleSyrupDrop extends Particle {
+
+    public ParticleSyrupDrop(World world, double xCoordIn, double yCoordIn, double zCoordIn, double motionXIn, double motionYIn, double motionZIn) {
+        super(world, xCoordIn, yCoordIn, zCoordIn, motionXIn, motionYIn, motionZIn);
+        this.particleTextureIndexX = 0;
+        this.particleTextureIndexY = 1;
+
+        this.motionX *= 0.0D;
+        this.motionY *= 0.1D;
+        this.motionZ *= 0.0D;
+
+        this.motionX += motionXIn;
+        this.motionY += motionYIn;
+        this.motionZ += motionZIn;
+
+        this.particleScale = 0.96F + 0.02F * world.rand.nextInt(8);
+
+        this.particleMaxAge = world.rand.nextInt(30) + 120;
+
+        this.particleAlpha = 1.0F;
+        this.particleGravity = 0.02F;
+        this.canCollide = true;
+    }
+
+    @Override
+    public int getFXLayer() {
+        return 2;
+    }
+
+    @Override
+    public void renderParticle(BufferBuilder buffer, Entity entity, float partialTicks, float rotX, float rotXZ, float rotZ, float rotYZ, float rotXY) {
+        // EffectRenderer will by default bind the vanilla particles texture, override with our own
+        FMLClientHandler.instance().getClient().renderEngine.bindTexture(ClientProxy.leafTexture);
+
+        GlStateManager.depthMask(false);
+        GlStateManager.enableBlend();
+        GlStateManager.blendFunc(770, 1);
+
+        super.renderParticle(buffer, entity, partialTicks, rotX, rotXZ, rotZ, rotYZ, rotXY);
+
+        GlStateManager.disableBlend();
+        GlStateManager.depthMask(true);
+    }
+
+    @Override
+    public void onUpdate() {
+
+        prevPosX = posX;
+        prevPosY = posY;
+        prevPosZ = posZ;
+
+        if (particleAge++ >= particleMaxAge) {
+            this.setExpired();
+        }
+
+        this.move(this.motionX, this.motionY, this.motionZ);
+        this.motionY -= 0.003000000026077032D;
+        this.motionY = Math.max(this.motionY, -0.14000000059604645D);
+
+        if (onGround) {
+            motionX *= 0.0D;
+            motionZ *= 0.0D;
+        }
+    }
+}

+ 0 - 2
src/main/java/cn/mcmod/sakura/client/render/tileentity/RenderTileEntityCampfirePot.java

@@ -25,7 +25,6 @@ public class RenderTileEntityCampfirePot extends TileEntitySpecialRenderer<TileE
 
     private static final ResourceLocation TEXTURES = new ResourceLocation(SakuraMain.MODID, "textures/entity/tileentity/pot.png");
 
-
     private final ModelPot model = new ModelPot();
 
     protected ItemStack renderItemStack = ItemStack.EMPTY;
@@ -96,7 +95,6 @@ public class RenderTileEntityCampfirePot extends TileEntitySpecialRenderer<TileE
         FluidStack fluid = te.getFluidForRendering(partialTicks);
 
         if (fluid != null) {
-
             RenderHelper.disableStandardItemLighting();
             GlStateManager.enableBlend();
             GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);

+ 72 - 0
src/main/java/cn/mcmod/sakura/client/render/tileentity/RenderTileEntityMapleCauldron.java

@@ -0,0 +1,72 @@
+package cn.mcmod.sakura.client.render.tileentity;
+
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.renderer.BufferBuilder;
+import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.RenderHelper;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.texture.TextureAtlasSprite;
+import net.minecraft.client.renderer.texture.TextureMap;
+import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
+import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
+import net.minecraft.entity.item.EntityItem;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import org.lwjgl.opengl.GL11;
+
+import cn.mcmod.sakura.tileentity.TileEntityMapleCauldron;
+
+@SideOnly(Side.CLIENT)
+public class RenderTileEntityMapleCauldron extends TileEntitySpecialRenderer<TileEntityMapleCauldron> {
+
+    protected ItemStack renderItemStack = ItemStack.EMPTY;
+    protected EntityItem renderItemEntity = null;
+    @Override
+    public void render(TileEntityMapleCauldron te, double x, double y, double z, float partialTicks, int destroyStage, float alpha) {
+        super.render(te, x, y, z, partialTicks, destroyStage, alpha);
+
+        FluidStack fluid = te.getFluidForRendering(partialTicks);
+
+        if (fluid != null) {
+            RenderHelper.disableStandardItemLighting();
+            GlStateManager.enableBlend();
+            GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA);
+            GlStateManager.pushMatrix();
+            Minecraft.getMinecraft().renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
+            Tessellator tessellator = Tessellator.getInstance();
+            BufferBuilder buffer = tessellator.getBuffer();
+            buffer.begin(GL11.GL_QUADS, DefaultVertexFormats.BLOCK);
+            TextureAtlasSprite still = Minecraft.getMinecraft().getTextureMapBlocks().getTextureExtry(fluid.getFluid().getStill(fluid).toString());
+            if (still == null) {
+                still = Minecraft.getMinecraft().getTextureMapBlocks().getMissingSprite();
+            }
+
+            int brightness = Minecraft.getMinecraft().world.getCombinedLight(te.getPos(), fluid.getFluid().getLuminosity(fluid));
+            int lx = brightness >> 0x10 & 0xFFFF;
+            int ly = brightness & 0xFFFF;
+
+            int color = fluid.getFluid().getColor(fluid);
+            int r = color >> 16 & 0xFF;
+            int g = color >> 8 & 0xFF;
+            int b = color & 0xFF;
+            int a = color >> 24 & 0xFF;
+
+            double height = 0.6 + 0.4 * ((double) fluid.amount / te.tank.getCapacity());
+
+            GlStateManager.translate(x + 0.1, y, z + 0.1);
+            GlStateManager.scale(0.8, 0.8, 0.8);
+
+            buffer.pos(0.0625, height, 0.0625).color(r, g, b, a).tex(still.getMinU(), still.getMinV()).lightmap(lx, ly).endVertex();
+            buffer.pos(0.0625, height, 0.9375).color(r, g, b, a).tex(still.getMinU(), still.getMaxV()).lightmap(lx, ly).endVertex();
+            buffer.pos(0.9375, height, 0.9375).color(r, g, b, a).tex(still.getMaxU(), still.getMaxV()).lightmap(lx, ly).endVertex();
+            buffer.pos(0.9375, height, 0.0625).color(r, g, b, a).tex(still.getMaxU(), still.getMinV()).lightmap(lx, ly).endVertex();
+
+            tessellator.draw();
+            GlStateManager.disableBlend();
+            GlStateManager.popMatrix();
+            RenderHelper.enableStandardItemLighting();
+        }
+    }
+}

+ 6 - 1
src/main/java/cn/mcmod/sakura/client/render/tileentity/RenderTileEntityStoneMortar.java

@@ -52,7 +52,12 @@ public class RenderTileEntityStoneMortar extends TileEntitySpecialRenderer<TileE
 
         this.model.block1.render(0.0625F);
 
-        GlStateManager.rotate(1.8f * te.getUpdateTag().getInteger("processTimer"), 0.0F, 1.0F, 0.0F);
+        if(te.getUpdateTag().getInteger("processTimer")!=0){
+            float rot = te.getWorld().getTotalWorldTime() % 360;
+            rot = rot * 2;
+            GlStateManager.rotate(rot, 0.0F, 1.0F, 0.0F);
+        }
+
         this.model.block2.render(0.0625F);
         this.model.handle.render(0.0625F);
         GlStateManager.enableCull();

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

@@ -57,13 +57,13 @@ public class WAVillagerHouse extends StructureVillagePieces.Village {
             this.boundingBox.offset(0, this.averageGroundLvl - this.boundingBox.maxY + 9 - 1, 0);
         }
 
-        IBlockState iblockstate = this.getBiomeSpecificBlockState(Blocks.STONEBRICK.getDefaultState());
-        IBlockState iblockstate1 = this.getBiomeSpecificBlockState(Blocks.OAK_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.NORTH));
-        IBlockState iblockstate2 = this.getBiomeSpecificBlockState(Blocks.OAK_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.SOUTH));
-        IBlockState iblockstate3 = this.getBiomeSpecificBlockState(Blocks.OAK_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.EAST));
+        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 iblockstate3 = BlockLoader.BAMBOO_PLANK_STAIR.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.EAST);
         IBlockState iblockstate4 = BlockLoader.BAMBOO_PLANK.getDefaultState();
-        IBlockState iblockstate5 = this.getBiomeSpecificBlockState(Blocks.STONE_STAIRS.getDefaultState().withProperty(BlockFacing.FACING, EnumFacing.NORTH));
-        IBlockState iblockstate6 = this.getBiomeSpecificBlockState(Blocks.OAK_FENCE.getDefaultState());
+        IBlockState iblockstate5 = BlockLoader.MAPLE_PLANK_STAIR.getDefaultState().withProperty(BlockFacing.FACING, EnumFacing.NORTH);
+        IBlockState iblockstate6 = BlockLoader.BAMBOO_FENCE.getDefaultState();
         this.fillWithBlocks(worldIn, structureBoundingBoxIn, 1, 1, 1, 7, 5, 4, Blocks.AIR.getDefaultState(), Blocks.AIR.getDefaultState(), false);
         this.fillWithBlocks(worldIn, structureBoundingBoxIn, 0, 0, 0, 8, 0, 5, iblockstate, iblockstate, false);
         this.fillWithBlocks(worldIn, structureBoundingBoxIn, 0, 5, 0, 8, 5, 5, iblockstate, iblockstate, false);

+ 65 - 0
src/main/java/cn/mcmod/sakura/gui/GuiMapleCauldron.java

@@ -0,0 +1,65 @@
+package cn.mcmod.sakura.gui;
+
+import cn.mcmod.sakura.inventory.ContainerMapleCauldron;
+import cn.mcmod.sakura.tileentity.TileEntityMapleCauldron;
+import cn.mcmod.sakura.util.ClientUtils;
+import net.minecraft.client.gui.inventory.GuiContainer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.util.ResourceLocation;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import org.lwjgl.opengl.GL11;
+
+@SideOnly(Side.CLIENT)
+public class GuiMapleCauldron extends GuiContainer {
+
+    private static final ResourceLocation GuiTextures = new ResourceLocation("sakura:textures/gui/maple_pot.png");
+
+    private TileEntityMapleCauldron tilePot;
+
+    public GuiMapleCauldron(InventoryPlayer inventory, TileEntityMapleCauldron tile) {
+        super(new ContainerMapleCauldron(inventory, tile));
+        this.tilePot = tile;
+    }
+
+    @Override
+    protected void drawGuiContainerBackgroundLayer(float partialTickTime, int x, int y) {
+
+        GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
+        this.mc.getTextureManager().bindTexture(GuiTextures);
+
+        int k = (this.width - this.xSize) / 2;
+        int l = (this.height - this.ySize) / 2;
+
+        this.drawTexturedModalRect(k, l, 0, 0, this.xSize, this.ySize);
+        
+        if(this.tilePot.isBurning()){
+        	this.drawTexturedModalRect(k + 71, l + 59, 176, 17, 14, 14);
+        }
+        
+        int l2 = this.getProgressScaled(44);
+        this.drawTexturedModalRect(k + 59, l + 36, 176, 0, l2 + 1, 17);
+        
+        if (this.tilePot.getTank().getFluid() != null) {
+            FluidTank fluidTank = this.tilePot.getTank();
+            int heightInd = (int) (68 * ((float) fluidTank.getFluidAmount() / (float) fluidTank.getCapacity()));
+            if (heightInd > 0) {
+                ClientUtils.drawRepeatedFluidSprite(fluidTank.getFluid(), k + 35, l + 78 - heightInd , 16f, heightInd);
+            }
+        }
+    }
+
+    private int getProgressScaled(int pixels) {
+        int i = this.tilePot.getField(1);
+        return i != 0 ? i * pixels / 500 : 0;
+    }
+
+    @Override
+    public void drawScreen(int mouseX, int mouseY, float partialTicks) {
+        this.drawDefaultBackground();
+        super.drawScreen(mouseX, mouseY, partialTicks);
+        this.renderHoveredToolTip(mouseX, mouseY);
+    }
+
+}

+ 13 - 4
src/main/java/cn/mcmod/sakura/gui/SakuraGuiHandler.java

@@ -3,10 +3,12 @@ package cn.mcmod.sakura.gui;
 import cn.mcmod.sakura.inventory.ContainerBarrel;
 import cn.mcmod.sakura.inventory.ContainerCampfirePot;
 import cn.mcmod.sakura.inventory.ContainerDistillation;
+import cn.mcmod.sakura.inventory.ContainerMapleCauldron;
 import cn.mcmod.sakura.inventory.ContainerStoneMortar;
 import cn.mcmod.sakura.tileentity.TileEntityBarrel;
 import cn.mcmod.sakura.tileentity.TileEntityCampfirePot;
 import cn.mcmod.sakura.tileentity.TileEntityDistillation;
+import cn.mcmod.sakura.tileentity.TileEntityMapleCauldron;
 import cn.mcmod.sakura.tileentity.TileEntityStoneMortar;
 import net.minecraft.entity.player.EntityPlayer;
 import net.minecraft.tileentity.TileEntity;
@@ -19,7 +21,7 @@ public class SakuraGuiHandler implements IGuiHandler {
     public static final int ID_CAMPFIREPOT = 1;
     public static final int ID_BARREL = 2;
     public static final int ID_DISTILLATION = 3;
-
+    public static final int ID_MAPLECAULDRON = 4;
     @Override
     public Object getServerGuiElement(int ID, EntityPlayer player, World world, int x, int y, int z) {
         TileEntity tile = world.getTileEntity(new BlockPos(x, y, z));
@@ -44,6 +46,11 @@ public class SakuraGuiHandler implements IGuiHandler {
                 return new ContainerDistillation(player.inventory, (TileEntityDistillation) tile);
             }
         }
+        if (ID == ID_MAPLECAULDRON) {
+            if (tile instanceof TileEntityMapleCauldron) {
+                return new ContainerMapleCauldron(player.inventory, (TileEntityMapleCauldron) tile);
+            }
+        }
 
         return null;
     }
@@ -54,13 +61,11 @@ public class SakuraGuiHandler implements IGuiHandler {
 
         if (ID == ID_STONEMORTAR) {
             if (tile instanceof TileEntityStoneMortar) {
-
                 return new GuiStoneMortar(player.inventory, (TileEntityStoneMortar) tile);
             }
         }
         if (ID == ID_CAMPFIREPOT) {
             if (tile instanceof TileEntityCampfirePot) {
-
                 return new GuiCampfirePot(player.inventory, (TileEntityCampfirePot) tile);
             }
         }
@@ -74,7 +79,11 @@ public class SakuraGuiHandler implements IGuiHandler {
                 return new GuiDistillation(player.inventory, (TileEntityDistillation) tile);
             }
         }
-
+        if (ID == ID_MAPLECAULDRON) {
+            if (tile instanceof TileEntityMapleCauldron) {
+                return new GuiMapleCauldron(player.inventory, (TileEntityMapleCauldron) tile);
+            }
+        }
         return null;
     }
 }

+ 1 - 1
src/main/java/cn/mcmod/sakura/inventory/ContainerBarrel.java

@@ -84,7 +84,7 @@ public class ContainerBarrel extends Container {
         // 5-31: Player inventory
         // 32-41: Hot bar in the player inventory
 
-        ItemStack itemStack = null;
+        ItemStack itemStack = ItemStack.EMPTY;
         Slot slot = this.inventorySlots.get(index);
 
         if (slot != null && slot.getHasStack())

+ 1 - 1
src/main/java/cn/mcmod/sakura/inventory/ContainerCampfirePot.java

@@ -91,7 +91,7 @@ public class ContainerCampfirePot extends Container {
         // 10-36: Player inventory
         // 37-46: Hot bar in the player inventory
 
-        ItemStack itemStack = null;
+        ItemStack itemStack = ItemStack.EMPTY;
         Slot slot = this.inventorySlots.get(index);
 
         if (slot != null && slot.getHasStack())

+ 1 - 1
src/main/java/cn/mcmod/sakura/inventory/ContainerDistillation.java

@@ -85,7 +85,7 @@ public class ContainerDistillation extends Container {
         // 5-31: Player inventory
         // 32-41: Hot bar in the player inventory
 
-        ItemStack itemStack = null;
+        ItemStack itemStack = ItemStack.EMPTY;
         Slot slot = this.inventorySlots.get(index);
 
         if (slot != null && slot.getHasStack())

+ 134 - 0
src/main/java/cn/mcmod/sakura/inventory/ContainerMapleCauldron.java

@@ -0,0 +1,134 @@
+package cn.mcmod.sakura.inventory;
+
+import cn.mcmod.sakura.tileentity.TileEntityMapleCauldron;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.InventoryPlayer;
+import net.minecraft.inventory.Container;
+import net.minecraft.inventory.IContainerListener;
+import net.minecraft.inventory.Slot;
+import net.minecraft.item.ItemStack;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+
+public class ContainerMapleCauldron extends Container {
+    private TileEntityMapleCauldron tileCampfire;
+    private int cookTime;
+    private int mapleTime;
+
+    public ContainerMapleCauldron(InventoryPlayer inventory, TileEntityMapleCauldron tile) {
+        tileCampfire = tile;
+        addSlotToContainer(new Slot(tile, 0, 114, 36) {
+            @Override
+            public boolean isItemValid(ItemStack stack) {
+                return false;
+            }
+        });
+        int i,j;
+
+        for (i = 0; i < 3; ++i)
+            for (j = 0; j < 9; ++j)
+                addSlotToContainer(new Slot(inventory, j + i * 9 + 9, 8 + j * 18, 84 + i * 18));
+
+        for (i = 0; i < 9; ++i)
+            addSlotToContainer(new Slot(inventory, i, 8 + i * 18, 142));
+    }
+
+    @Override
+    public void addListener(IContainerListener listener) {
+        super.addListener(listener);
+        listener.sendAllWindowProperties(this, this.tileCampfire);
+    }
+
+    @Override
+    public void detectAndSendChanges() {
+        super.detectAndSendChanges();
+        for (int i = 0; i < this.listeners.size(); ++i) {
+            IContainerListener icontainerlistener = this.listeners.get(i);
+
+            if (this.mapleTime != this.tileCampfire.getField(0)) {
+                icontainerlistener.sendWindowProperty(this, 0, this.tileCampfire.getField(0));
+            }
+
+            if (this.cookTime != this.tileCampfire.getField(1)) {
+                icontainerlistener.sendWindowProperty(this, 1, this.tileCampfire.getField(1));
+            }
+
+        }
+        this.mapleTime = this.tileCampfire.getField(0);
+        this.cookTime = this.tileCampfire.getField(1);
+    }
+
+    @Override
+    @SideOnly(Side.CLIENT)
+    public void updateProgressBar(int id, int value) {
+        this.tileCampfire.setField(id, value);
+    }
+
+    @Override
+    public boolean canInteractWith(EntityPlayer player) {
+        return tileCampfire.isUsableByPlayer(player);
+    }
+
+    /**
+     * Called when a player shift-clicks on a slot. You must override this or you will crash when someone does that.
+     */
+    @Override
+    public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int index)
+    {
+        // 0-0: Contain inventory
+        // 1-27: Player inventory
+        // 28-37: Hot bar in the player inventory
+
+        ItemStack itemStack = ItemStack.EMPTY;
+        Slot slot = this.inventorySlots.get(index);
+
+        if (slot != null && slot.getHasStack())
+        {
+            ItemStack itemStack1 = slot.getStack();
+            itemStack = itemStack1.copy();
+
+            if (index >= 0 && index <= 9){
+                if (!this.mergeItemStack(itemStack1, 1, 37, true))
+                {
+                    return ItemStack.EMPTY;
+                }
+
+                slot.onSlotChange(itemStack1, itemStack);
+            }
+            else if (index >= 1){
+            	if (index >= 1 && index < 28){
+                    if (!this.mergeItemStack(itemStack1, 28, 37, false))
+                    {
+                        return ItemStack.EMPTY;
+                    }
+                }
+                else if (index >= 28 && index < 37 && !this.mergeItemStack(itemStack1, 1, 37, false))
+                {
+                    return ItemStack.EMPTY;
+                }
+            }
+            else if (!this.mergeItemStack(itemStack1, 1, 37, false))
+            {
+                return ItemStack.EMPTY;
+            }
+
+            if (itemStack1.getCount() == 0)
+            {
+                slot.putStack(ItemStack.EMPTY);
+            }
+            else
+            {
+                slot.onSlotChanged();
+            }
+
+            if (itemStack1.getCount() == itemStack.getCount())
+            {
+                return ItemStack.EMPTY;
+            }
+
+            slot.onTake(par1EntityPlayer, itemStack1);
+        }
+
+        return itemStack;
+    }
+}

+ 1 - 1
src/main/java/cn/mcmod/sakura/inventory/ContainerStoneMortar.java

@@ -90,7 +90,7 @@ public class ContainerStoneMortar extends Container {
         // 6-32: Player inventory
         // 33-42: Hot bar in the player inventory
 
-        ItemStack itemStack = null;
+        ItemStack itemStack = ItemStack.EMPTY;
         Slot slot = this.inventorySlots.get(index);
 
         if (slot != null && slot.getHasStack())

+ 23 - 0
src/main/java/cn/mcmod/sakura/item/ItemBlockMeta.java

@@ -0,0 +1,23 @@
+package cn.mcmod.sakura.item;
+
+import net.minecraft.block.Block;
+import net.minecraft.item.ItemBlock;
+
+public class ItemBlockMeta extends ItemBlock {
+	
+	public ItemBlockMeta(Block block) {
+		super(block);
+        this.setMaxDamage(0);
+        this.setHasSubtypes(true);
+	}
+    /**
+     * Converts the given ItemStack damage value into a metadata value to be placed in the world when this Item is
+     * placed as a Block (mostly used with ItemBlocks).
+     */
+	@Override
+    public int getMetadata(int damage)
+    {
+        return damage;
+    }
+
+}

+ 2 - 0
src/main/java/cn/mcmod/sakura/item/ItemFoodBasic.java

@@ -18,6 +18,8 @@ public class ItemFoodBasic extends ItemFood {
 		this.setUnlocalizedName(SakuraMain.MODID+"."+name);
 		this.setHasSubtypes(subNames!=null&&subNames.length > 0);
 		this.setMaxStackSize(stackSize);
+		this.setMaxDamage(0);
+		this.setNoRepair();
 		this.subNames = subNames!=null&&subNames.length > 0?subNames: null;
 		this.amount = amounts!=null&&amounts.length > 0?amounts: null;
 		this.saturation = saturations!=null&&saturations.length > 0?saturations: null;

+ 4 - 3
src/main/java/cn/mcmod/sakura/item/ItemLoader.java

@@ -61,7 +61,7 @@ public class ItemLoader {
     public static Item RAPESEED = new ItemSeeds(BlockLoader.RAPESEEDCROP, Blocks.FARMLAND).setUnlocalizedName(SakuraMain.MODID + "." + "rapeseeds");
     public static Item ONION = new ItemFood(2, false).setUnlocalizedName(SakuraMain.MODID + "." + "onion");
     public static Item ONION_SEEDS = new ItemSeeds(BlockLoader.ONIONCROP, Blocks.FARMLAND).setUnlocalizedName(SakuraMain.MODID + "." + "onion_seeds");
-    public static Item MAPLE_SYRUP = new ItemSeasoning(SakuraMain.MODID + "." + "maple_syrup", 15);
+//    public static Item MAPLE_SYRUP = new ItemSeasoning(SakuraMain.MODID + "." + "maple_syrup", 15);
     public static ItemFoodBasic FOODSET = new ItemFoodBasic("foodset", 64,
             new int[]{
                     1, 3, 5,//2
@@ -373,6 +373,9 @@ public class ItemLoader {
             SakuraMain.MODID + "." + "mint",//45
             SakuraMain.MODID + "." + "mint_tea_leaves",//46
             SakuraMain.MODID + "." + "empty_bottle",//47
+            SakuraMain.MODID + "." + "bamboo_sunburnt",//48
+           
+            SakuraMain.MODID + "." + "maple_syrup",//49
     });
     public static Item POT = new ItemPot();
     public static Item KNIFE_NOODLE = new ItemKnifeNoodle();
@@ -411,7 +414,6 @@ public class ItemLoader {
         register(RED_BEAN);
         register(BUCKWHEAT);
         register(RAPESEED);
-        register(MAPLE_SYRUP);
         register(KNIFE_NOODLE);
         register(SAKURA_DIAMOND);
         register(MATERIAL);
@@ -475,7 +477,6 @@ public class ItemLoader {
         registerRender(RICE_SEEDS);
         registerRender(RED_BEAN);
         registerRender(BAMBOO_DOOR);
-        registerRender(MAPLE_SYRUP);
         registerRender(FOODSET);
         registerRender(HYDRA_RAMEN);
         registerRender(BUGGYS_MEAT);

+ 5 - 5
src/main/java/cn/mcmod/sakura/tileentity/TileEntityCampfirePot.java

@@ -111,13 +111,14 @@ public class TileEntityCampfirePot extends TileEntity implements ITickable, IInv
             --this.burnTime;
         }
         //check can cook
-
-
         if (!this.world.isRemote) {
 	        if (!isRecipes()) {
 	            cookTime = 0;
 	        } else {
-	            if (isBurning()) {
+        	  ItemStack itemstack = this.inventory.get(9);
+              ItemStack result = getRecipesResult().getResultItemStack();
+              	if(!itemstack.isEmpty()&&!itemstack.isItemEqual(result))  cookTime = 0;
+              	else if (isBurning()) {
 	                cookTime += 1;
 	            }
 	        }
@@ -142,7 +143,7 @@ public class TileEntityCampfirePot extends TileEntity implements ITickable, IInv
 
         if (itemstack.isEmpty()) {
             this.inventory.set(9, result.copy());
-        } else if (itemstack.getItem() == result.getItem()) {
+        } else if (itemstack.isItemEqual(result)) {
             itemstack.grow(result.getCount());
         }
         
@@ -341,7 +342,6 @@ public class TileEntityCampfirePot extends TileEntity implements ITickable, IInv
         return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY || super.hasCapability(capability, facing);
     }
 
-
     @Override
     @Nullable
     public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {

+ 3 - 19
src/main/java/cn/mcmod/sakura/tileentity/TileEntityDistillation.java

@@ -1,11 +1,7 @@
 package cn.mcmod.sakura.tileentity;
 
-import net.minecraft.block.Block;
-import net.minecraft.block.BlockFire;
-import net.minecraft.block.BlockMagma;
 import net.minecraft.block.state.IBlockState;
 import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.init.Blocks;
 import net.minecraft.inventory.IInventory;
 import net.minecraft.inventory.ItemStackHelper;
 import net.minecraft.item.ItemStack;
@@ -28,6 +24,7 @@ import javax.annotation.Nullable;
 
 import cn.mcmod.sakura.api.recipes.DistillationRecipes;
 import cn.mcmod.sakura.api.recipes.LiquidToItemRecipe;
+import cn.mcmod.sakura.util.WorldUtil;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -92,7 +89,7 @@ public class TileEntityDistillation extends TileEntity implements ITickable, IIn
         inputs.add(inventory.get(2));
         List<DistillationRecipes> recipes = DistillationRecipes.getPossibleRecipes(tank.getFluid(), inputs);
 
-        if (recipes.isEmpty()||getHeatStrength(getWorld(), getPos())<2) {
+        if (recipes.isEmpty()||WorldUtil.getHeatStrength(getWorld(), getPos())<2) {
             processTimer = 0;
         } else {
             processTimer += 1;
@@ -349,20 +346,7 @@ public class TileEntityDistillation extends TileEntity implements ITickable, IIn
         super.onDataPacket(net, packet);
         readPacketNBT(packet.getNbtCompound());
     }
-    
-    private int getHeatStrength(World par1World, BlockPos pos)
-    {
-        for (int i = 1; i < 5; i++)
-        {
-            Block block = par1World.getBlockState(pos.down(i)).getBlock();
-            if (block instanceof BlockMagma||block instanceof BlockFire || block == Blocks.LAVA || block == Blocks.FLOWING_LAVA)
-            {
-                return i <= 2 ? 2 : 1;
-            }
-        }
-        return 0;
-    }
-    
+
     private void DrainInput() {
        ItemStack itemstack = this.inventory.get(3);
        if(getRecipesResult()!=null){

+ 366 - 0
src/main/java/cn/mcmod/sakura/tileentity/TileEntityMapleCauldron.java

@@ -0,0 +1,366 @@
+package cn.mcmod.sakura.tileentity;
+
+import net.minecraft.block.state.IBlockState;
+import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.inventory.IInventory;
+import net.minecraft.inventory.ItemStackHelper;
+import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.network.NetworkManager;
+import net.minecraft.network.play.server.SPacketUpdateTileEntity;
+import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumFacing;
+import net.minecraft.util.ITickable;
+import net.minecraft.util.NonNullList;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.world.World;
+import net.minecraftforge.common.capabilities.Capability;
+import net.minecraftforge.fluids.FluidStack;
+import net.minecraftforge.fluids.FluidTank;
+import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import cn.mcmod.sakura.block.BlockLoader;
+import cn.mcmod.sakura.block.BlockMapleSpile;
+import cn.mcmod.sakura.item.ItemLoader;
+import cn.mcmod.sakura.util.WorldUtil;
+
+public class TileEntityMapleCauldron extends TileEntity implements ITickable, IInventory {
+
+    public FluidTank tank = new FluidTank(5000) {
+        @Override
+        protected void onContentsChanged() {
+            TileEntityMapleCauldron.this.refresh();
+        }
+    };
+
+    private FluidStack liquidForRendering = null;
+    /**
+     * The number of ticks that a fresh copy of the currently-burning item would keep the furnace burning for
+     */
+    private int cookTime;
+    private int mapleTime;
+
+    public FluidTank getTank() {
+        return this.tank;
+    }
+
+    //Render only
+    @SideOnly(Side.CLIENT)
+    public FluidStack getFluidForRendering(float partialTicks) {
+        final FluidStack actual = tank.getFluid();
+        int actualAmount;
+        if (actual != null && !actual.equals(liquidForRendering)) {
+            liquidForRendering = new FluidStack(actual, 0);
+        }
+
+        if (liquidForRendering == null) {
+            return null;
+        }
+
+        actualAmount = actual == null ? 0 : actual.amount;
+        int delta = actualAmount - liquidForRendering.amount;
+        if (Math.abs(delta) <= 40) {
+            liquidForRendering.amount = actualAmount;
+        } else {
+            int i = (int) (delta * partialTicks * 0.1);
+            if (i == 0) {
+                i = delta > 0 ? 1 : -1;
+            }
+            liquidForRendering.amount += i;
+        }
+        if (liquidForRendering.amount == 0) {
+            liquidForRendering = null;
+        }
+        return liquidForRendering;
+    }
+
+    public boolean isBurning() {
+        return this.getTank().canDrainFluidType(new FluidStack(BlockLoader.MAPLE_SYRUP_FLUID, 500))
+        		&&this.getTank().getFluidAmount()>=500
+        		&&WorldUtil.getHeatStrength(getWorld(), getPos()) > 0;
+    }
+
+    public boolean canDraw() {
+		if(getWorld().getBlockState(getPos().up()).getBlock() instanceof BlockMapleSpile){
+			if(BlockMapleSpile.canWork(getWorld(), getPos().up(), getWorld().getBlockState(getPos().up())))
+				return true;
+		}
+		return false;
+	}
+    
+    public int getCookTime() {
+        return this.cookTime;
+    }
+    
+    public int getMapleTime() {
+        return this.mapleTime;
+    }
+
+    protected void refresh() {
+        if (hasWorld() && !world.isRemote) {
+            IBlockState state = world.getBlockState(pos);
+            world.markAndNotifyBlock(pos, world.getChunkFromBlockCoords(pos), state, state, 11);
+        }
+    }
+
+    @Override
+    public void update() {
+        //check can cook
+    	if (!this.world.isRemote) {
+	    	this.drawing();
+	    	this.cooking();
+    	}
+    }
+
+    private void drawing() {
+    	boolean flag = this.canDraw();
+        boolean flag1 = false;
+        
+    	if (canDraw()) {
+            mapleTime += getWorld().rand.nextInt(9)+1;
+    	}
+	    if (mapleTime >= 20) {
+	    	mapleTime = 0;
+	    	if(this.getTank().canFill())
+	    		this.getTank().fill(new FluidStack(BlockLoader.MAPLE_SYRUP_FLUID, 10), true);
+	        flag1 = true;
+	    }
+	    if (flag != this.canDraw()) {
+	       flag1 = true;
+	    }
+	    if (flag1)
+	    	this.markDirty();
+	}
+    
+    private void cooking() {
+    	boolean flag = this.isBurning();
+        boolean flag1 = false;
+        
+    	if (isBurning()) {
+            cookTime += 1;
+    	}
+	    if (cookTime >= 500) {
+	        cookTime = 0;
+            ItemStack itemstack = this.inventory.get(0);
+
+            if (itemstack.isEmpty()) {
+                this.inventory.set(0, new ItemStack(ItemLoader.MATERIAL, 8, 49).copy());
+            } else {
+            	itemstack.grow(8);
+            }
+            this.tank.drainInternal(500, true);
+	        flag1 = true;
+	    }
+	    if (flag != this.isBurning()) {
+	       flag1 = true;
+	    }
+	    if (flag1)
+	    	this.markDirty();
+	}
+
+    @Override
+    public void markDirty() {
+        super.markDirty();
+
+    }
+
+    protected NonNullList<ItemStack> inventory =
+            NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
+
+    @Override
+    public String getName() {
+        return "container.sakura.maple_cauldron";
+    }
+
+    @Override
+    public boolean hasCustomName() {
+        return false;
+    }
+
+    @Override
+    public int getSizeInventory() {
+        return 1;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        for (ItemStack itemstack : this.inventory) {
+            if (!itemstack.isEmpty()) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    @Override
+    public ItemStack getStackInSlot(int index) {
+        return inventory.get(index);
+    }
+
+    @Override
+    public ItemStack decrStackSize(int index, int count) {
+        ItemStack itemstack = ItemStackHelper.getAndSplit(inventory, index, count);
+
+        if (!itemstack.isEmpty()) {
+            this.markDirty();
+        }
+
+        return itemstack;
+    }
+
+    @Override
+    public ItemStack removeStackFromSlot(int index) {
+        return ItemStackHelper.getAndRemove(inventory, index);
+    }
+
+    @Override
+    public void setInventorySlotContents(int index, ItemStack stack) {
+        inventory.set(index, stack);
+        if (stack.getCount() > this.getInventoryStackLimit()) {
+            stack.setCount(this.getInventoryStackLimit());
+        }
+        this.markDirty();
+    }
+
+    @Override
+    public int getInventoryStackLimit() {
+        return 64;
+    }
+
+    @Override
+    public boolean isUsableByPlayer(EntityPlayer player) {
+        if (this.world.getTileEntity(this.pos) != this) {
+            return false;
+        }
+		return player.getDistanceSq(this.pos.getX() + 0.5D, this.pos.getY() + 0.5D, this.pos.getZ() + 0.5D) <= 64.0D;
+    }
+
+    @Override
+    public void openInventory(EntityPlayer player) {
+        this.markDirty();
+    }
+
+    @Override
+    public void closeInventory(EntityPlayer player) {
+        this.markDirty();
+    }
+
+    @Override
+    public boolean isItemValidForSlot(int index, ItemStack stack) {
+        return true;
+    }
+
+    public int getField(int id) {
+        switch (id) {
+            case 0:
+                return this.mapleTime;
+            case 1:
+                return this.cookTime;
+            default:
+                return 0;
+
+        }
+    }
+
+
+    public void setField(int id, int value) {
+        switch (id) {
+            case 0:
+                this.mapleTime = value;
+                break;
+            case 1:
+                this.cookTime = value;
+                break;
+        }
+    }
+
+    public int getFieldCount() {
+        return 2;
+    }
+
+    @Override
+    public void clear() {
+        inventory.clear();
+    }
+
+    public NonNullList<ItemStack> getInventory() {
+        return inventory;
+    }
+
+    @Override
+    public boolean hasCapability(Capability<?> capability, EnumFacing facing) {
+        return capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY || super.hasCapability(capability, facing);
+    }
+
+    @Override
+    @Nullable
+    public <T> T getCapability(Capability<T> capability, @Nullable EnumFacing facing) {
+        if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
+            return CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY.cast(tank);
+        }
+        return super.getCapability(capability, facing);
+    }
+
+    @Override
+    public boolean shouldRefresh(World world, BlockPos pos, @Nonnull IBlockState oldState, @Nonnull IBlockState newState) {
+        return oldState.getBlock() != newState.getBlock();
+    }
+
+    @Nonnull
+    @Override
+    public NBTTagCompound writeToNBT(NBTTagCompound par1nbtTagCompound) {
+        NBTTagCompound ret = super.writeToNBT(par1nbtTagCompound);
+        writePacketNBT(ret);
+        return ret;
+    }
+
+    @Nonnull
+    @Override
+    public final NBTTagCompound getUpdateTag() {
+        return writeToNBT(new NBTTagCompound());
+    }
+
+    @Override
+    public void readFromNBT(NBTTagCompound par1nbtTagCompound) {
+        super.readFromNBT(par1nbtTagCompound);
+        readPacketNBT(par1nbtTagCompound);
+    }
+
+    public void writePacketNBT(NBTTagCompound cmp) {
+        ItemStackHelper.saveAllItems(cmp, this.inventory);
+        cmp.setInteger("MapleTime", this.mapleTime);
+        cmp.setInteger("CookTime", this.cookTime);
+        NBTTagCompound tankTag = this.tank.writeToNBT(new NBTTagCompound());
+        cmp.setTag("Tank", tankTag);
+        if (tank.getFluid() != null) {
+            liquidForRendering = tank.getFluid().copy();
+        }
+    }
+
+    public void readPacketNBT(NBTTagCompound cmp) {
+        this.inventory =
+                NonNullList.<ItemStack>withSize(this.getSizeInventory(), ItemStack.EMPTY);
+        ItemStackHelper.loadAllItems(cmp, this.inventory);
+        this.mapleTime = cmp.getInteger("MapleTime");
+        this.cookTime = cmp.getInteger("CookTime");
+        this.tank.readFromNBT(cmp.getCompoundTag("Tank"));
+    }
+
+    @Override
+    public final SPacketUpdateTileEntity getUpdatePacket() {
+        NBTTagCompound tag = new NBTTagCompound();
+        writePacketNBT(tag);
+        return new SPacketUpdateTileEntity(pos, -999, tag);
+    }
+
+    @Override
+    public void onDataPacket(NetworkManager net, SPacketUpdateTileEntity packet) {
+        super.onDataPacket(net, packet);
+        readPacketNBT(packet.getNbtCompound());
+    }
+
+}

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

@@ -5,6 +5,7 @@ import cn.mcmod.sakura.block.BlockLoader;
 import cn.mcmod.sakura.client.TileEntityRenderHelper;
 import cn.mcmod.sakura.client.render.tileentity.RenderTileEntityCampfire;
 import cn.mcmod.sakura.client.render.tileentity.RenderTileEntityCampfirePot;
+import cn.mcmod.sakura.client.render.tileentity.RenderTileEntityMapleCauldron;
 import cn.mcmod.sakura.client.render.tileentity.RenderTileEntityStoneMortar;
 import cn.mcmod.sakura.client.render.tileentity.ShojiRender;
 import net.minecraft.block.Block;
@@ -25,6 +26,7 @@ public class TileEntityRegistry {
         registerTileEntity(TileEntityShoji.class, "shoji");
         registerTileEntity(TileEntityBarrel.class, "barrel");
         registerTileEntity(TileEntityDistillation.class, "barrel_distillation");
+        registerTileEntity(TileEntityMapleCauldron.class, "maple_cauldron");
     }
 
     @SideOnly(Side.CLIENT)
@@ -32,6 +34,7 @@ public class TileEntityRegistry {
         ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCampfire.class, new RenderTileEntityCampfire());
         ClientRegistry.bindTileEntitySpecialRenderer(TileEntityStoneMortar.class, new RenderTileEntityStoneMortar());
         ClientRegistry.bindTileEntitySpecialRenderer(TileEntityCampfirePot.class, new RenderTileEntityCampfirePot());
+        ClientRegistry.bindTileEntitySpecialRenderer(TileEntityMapleCauldron.class, new RenderTileEntityMapleCauldron());
         ClientRegistry.bindTileEntitySpecialRenderer(TileEntityShoji.class, new ShojiRender());
         getItem(BlockLoader.STONEMORTAR).setTileEntityItemStackRenderer(new TileEntityRenderHelper());
     }

+ 0 - 1
src/main/java/cn/mcmod/sakura/tileentity/TileEntityStoneMortar.java

@@ -84,7 +84,6 @@ public class TileEntityStoneMortar extends TileEntity implements ITickable, IInv
     @Override
     public void markDirty() {
         super.markDirty();
-
     }
 
     /**

+ 1 - 2
src/main/java/cn/mcmod/sakura/util/SakuraRecipeRegister.java

@@ -6,7 +6,6 @@ import java.util.List;
 import org.apache.logging.log4j.Level;
 
 import cn.mcmod.sakura.SakuraMain;
-import cn.mcmod.sakura.SakuraOreDictLoader;
 import cn.mcmod.sakura.api.recipes.BarrelRecipes;
 import cn.mcmod.sakura.api.recipes.DistillationRecipes;
 import cn.mcmod.sakura.api.recipes.LiquidToItemRecipe;
@@ -1162,7 +1161,7 @@ public class SakuraRecipeRegister {
                         "listAllsugar",
                         "listAllegg",
                         "foodVanilla",
-                        SakuraOreDictLoader.MAPLE_SYRUP
+                        "cropMaplesyrup"
                         },
                         new FluidStack(FluidRegistry.WATER, 200)));
         PotRecipes.addRecipe(

+ 26 - 0
src/main/java/cn/mcmod/sakura/util/WorldUtil.java

@@ -0,0 +1,26 @@
+package cn.mcmod.sakura.util;
+
+import cn.mcmod.sakura.block.BlockCampfire;
+import net.minecraft.block.Block;
+import net.minecraft.block.BlockFire;
+import net.minecraft.block.BlockMagma;
+import net.minecraft.init.Blocks;
+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++)
+        {
+            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)
+            {
+                return i <= 3 ? 2 : 1;
+            }
+        }
+        return 0;
+    }
+    
+}

+ 222 - 0
src/main/resources/assets/sakura/blockstates/bamboo_stair.json

@@ -0,0 +1,222 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "textures": {
+      "top": "sakura:blocks/bamboo_block_top",
+      "bottom": "sakura:blocks/bamboo_block",
+      "side": "sakura:blocks/bamboo_block"
+    }
+  },
+  "variants": {
+    "inventory": [
+      {
+        "model": "stairs"
+      }
+    ],
+    "facing=east,half=bottom,shape=straight": {
+      "model": "stairs"
+    },
+    "facing=west,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=outer_right": {
+      "model": "outer_stairs"
+    },
+    "facing=west,half=bottom,shape=outer_right": {
+      "model": "outer_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=outer_right": {
+      "model": "outer_stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=bottom,shape=outer_right": {
+      "model": "outer_stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=outer_left": {
+      "model": "outer_stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=west,half=bottom,shape=outer_left": {
+      "model": "outer_stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=outer_left": {
+      "model": "outer_stairs"
+    },
+    "facing=north,half=bottom,shape=outer_left": {
+      "model": "outer_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=inner_right": {
+      "model": "inner_stairs"
+    },
+    "facing=west,half=bottom,shape=inner_right": {
+      "model": "inner_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=inner_right": {
+      "model": "inner_stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=bottom,shape=inner_right": {
+      "model": "inner_stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=inner_left": {
+      "model": "inner_stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=west,half=bottom,shape=inner_left": {
+      "model": "inner_stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=inner_left": {
+      "model": "inner_stairs"
+    },
+    "facing=north,half=bottom,shape=inner_left": {
+      "model": "inner_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=straight": {
+      "model": "stairs",
+      "x": 180,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=straight": {
+      "model": "stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=straight": {
+      "model": "stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=straight": {
+      "model": "stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=outer_right": {
+      "model": "outer_stairs",
+      "x": 180,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=outer_right": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=outer_right": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=outer_right": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=outer_left": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=outer_left": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=outer_left": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=outer_left": {
+      "model": "outer_stairs",
+      "x": 180,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=inner_right": {
+      "model": "inner_stairs",
+      "x": 180,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=inner_right": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=inner_right": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=inner_right": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=inner_left": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=inner_left": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=inner_left": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=inner_left": {
+      "model": "inner_stairs",
+      "x": 180,
+      "uvlock": true
+    }
+  }
+}

+ 222 - 0
src/main/resources/assets/sakura/blockstates/bamboo_stair_sunburnt.json

@@ -0,0 +1,222 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "textures": {
+      "top": "sakura:blocks/bamboo_block_sunburnt_top",
+      "bottom": "sakura:blocks/bamboo_block_sunburnt",
+      "side": "sakura:blocks/bamboo_block_sunburnt"
+    }
+  },
+  "variants": {
+    "inventory": [
+      {
+        "model": "stairs"
+      }
+    ],
+    "facing=east,half=bottom,shape=straight": {
+      "model": "stairs"
+    },
+    "facing=west,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=outer_right": {
+      "model": "outer_stairs"
+    },
+    "facing=west,half=bottom,shape=outer_right": {
+      "model": "outer_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=outer_right": {
+      "model": "outer_stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=bottom,shape=outer_right": {
+      "model": "outer_stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=outer_left": {
+      "model": "outer_stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=west,half=bottom,shape=outer_left": {
+      "model": "outer_stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=outer_left": {
+      "model": "outer_stairs"
+    },
+    "facing=north,half=bottom,shape=outer_left": {
+      "model": "outer_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=inner_right": {
+      "model": "inner_stairs"
+    },
+    "facing=west,half=bottom,shape=inner_right": {
+      "model": "inner_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=inner_right": {
+      "model": "inner_stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=bottom,shape=inner_right": {
+      "model": "inner_stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=inner_left": {
+      "model": "inner_stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=west,half=bottom,shape=inner_left": {
+      "model": "inner_stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=inner_left": {
+      "model": "inner_stairs"
+    },
+    "facing=north,half=bottom,shape=inner_left": {
+      "model": "inner_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=straight": {
+      "model": "stairs",
+      "x": 180,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=straight": {
+      "model": "stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=straight": {
+      "model": "stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=straight": {
+      "model": "stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=outer_right": {
+      "model": "outer_stairs",
+      "x": 180,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=outer_right": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=outer_right": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=outer_right": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=outer_left": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=outer_left": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=outer_left": {
+      "model": "outer_stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=outer_left": {
+      "model": "outer_stairs",
+      "x": 180,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=inner_right": {
+      "model": "inner_stairs",
+      "x": 180,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=inner_right": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=inner_right": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=inner_right": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=top,shape=inner_left": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=west,half=top,shape=inner_left": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=south,half=top,shape=inner_left": {
+      "model": "inner_stairs",
+      "x": 180,
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=north,half=top,shape=inner_left": {
+      "model": "inner_stairs",
+      "x": 180,
+      "uvlock": true
+    }
+  }
+}

+ 6 - 0
src/main/resources/assets/sakura/blockstates/fluids.json

@@ -96,6 +96,12 @@
          "custom" : {
             "fluid" : "cocoa_liqueur"
          }
+      },
+      "maple_syrup" : {
+         "model" : "forge:fluid",
+         "custom" : {
+            "fluid" : "maple_syrup"
+         }
       }
    }
 }

+ 10 - 0
src/main/resources/assets/sakura/blockstates/maple_cauldron.json

@@ -0,0 +1,10 @@
+{
+  "variants": {
+    "normal": {
+      "model": "sakura:maple_cauldron"
+    },
+	"inventory": {
+      "model": "sakura:maple_cauldron"
+    }
+  }
+}

+ 11 - 0
src/main/resources/assets/sakura/blockstates/maple_spile.json

@@ -0,0 +1,11 @@
+{
+    "variants": {
+	"inventory" : {
+			 "model" : "sakura:spile"
+		  },
+        "facing=north": { "model": "sakura:spile" },
+        "facing=south": { "model": "sakura:spile", "y": 180 },
+        "facing=west":  { "model": "sakura:spile", "y": 270 },
+        "facing=east":  { "model": "sakura:spile", "y": 90 }
+    }
+}

+ 23 - 0
src/main/resources/assets/sakura/blockstates/slab_plank_bamboo.json

@@ -0,0 +1,23 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "textures": {
+      "top": "sakura:blocks/plank_bamboo",
+      "bottom": "#top",
+      "side": "#top",
+      "all": "#top"
+    }
+  },
+  "variants": {
+    "inventory": [{"model": "half_slab"}],
+    "half=bottom": {
+      "model": "half_slab"
+    },
+    "half=top": {
+      "model": "upper_slab"
+    },
+    "half=full": {
+      "model": "minecraft:cube_all"
+    }
+  }
+}

+ 23 - 0
src/main/resources/assets/sakura/blockstates/slab_plank_maple.json

@@ -0,0 +1,23 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "textures": {
+      "top": "sakura:blocks/plank_maple",
+      "bottom": "#top",
+      "side": "#top",
+      "all": "#top"
+    }
+  },
+  "variants": {
+    "inventory": [{"model": "half_slab"}],
+    "half=bottom": {
+      "model": "half_slab"
+    },
+    "half=top": {
+      "model": "upper_slab"
+    },
+    "half=full": {
+      "model": "minecraft:cube_all"
+    }
+  }
+}

+ 23 - 0
src/main/resources/assets/sakura/blockstates/slab_plank_sakura.json

@@ -0,0 +1,23 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "textures": {
+      "top": "sakura:blocks/plank_sakura",
+      "bottom": "#top",
+      "side": "#top",
+      "all": "#top"
+    }
+  },
+  "variants": {
+    "inventory": [{"model": "half_slab"}],
+    "half=bottom": {
+      "model": "half_slab"
+    },
+    "half=top": {
+      "model": "upper_slab"
+    },
+    "half=full": {
+      "model": "minecraft:cube_all"
+    }
+  }
+}

+ 23 - 0
src/main/resources/assets/sakura/blockstates/slab_straw_block.json

@@ -0,0 +1,23 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "textures": {
+      "top": "sakura:blocks/straw_block",
+      "bottom": "#top",
+      "side": "#top",
+      "all": "#top"
+    }
+  },
+  "variants": {
+    "inventory": [{"model": "half_slab"}],
+    "half=bottom": {
+      "model": "half_slab"
+    },
+    "half=top": {
+      "model": "upper_slab"
+    },
+    "half=full": {
+      "model": "minecraft:cube_all"
+    }
+  }
+}

+ 222 - 0
src/main/resources/assets/sakura/blockstates/stairs_plank_bamboo.json

@@ -0,0 +1,222 @@
+{
+  "forge_marker": 1,
+  "defaults": {
+    "textures": {
+      "top": "sakura:blocks/plank_bamboo",
+      "bottom": "#top",
+      "side": "#top"
+    }
+  },
+  "variants": {
+    "inventory": [
+      {
+        "model": "stairs"
+      }
+    ],
+    "facing=east,half=bottom,shape=straight": {
+      "model": "stairs"
+    },
+    "facing=west,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 90,
+      "uvlock": true
+    },
+    "facing=north,half=bottom,shape=straight": {
+      "model": "stairs",
+      "y": 270,
+      "uvlock": true
+    },
+    "facing=east,half=bottom,shape=outer_right": {
+      "model": "outer_stairs"
+    },
+    "facing=west,half=bottom,shape=outer_right": {
+      "model": "outer_stairs",
+      "y": 180,
+      "uvlock": true
+    },
+    "facing=south,half=bottom,shape=outer_right": {
+      "model": "outer_stairs",
+      "y": 90,
+      "uvlock": true
+    },