Высокое растение

Версия Minecraft
1.7.10

Led

291
3
0
Пытаюсь сделать кукурузу высотой два блока.
Подскажите, пожалуйста, как реализовать перетекания роста из первого блока во второй (теорию понимаю, как только мета стане 7, ставить блок с мета 8 на 1 выше по y) и мотать мету уже у него. Но как это реализовать, не понимаю.
Заранее благодарен.
 

Led

291
3
0
пишу, потому что не понял.
на форум пришел, потому что думаю, что тут мне помогут.

Дошел до такого кода:
Код:
package ru.legendary.lwmod.lwmfarm.block;

import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import ru.legendary.lwmod.lwmfarm.LWMFarm;
import ru.legendary.lwmod.lwmfarm.core.ModBlocks;
import ru.legendary.lwmod.lwmfarm.core.ModItems;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;

public class blockCornCropTop extends Block{
 
 IIcon[] iIcon;
 int f_posX;
 int f_posY;
 int f_posZ;
 World f_world;
 
 
 
 public blockCornCropTop()
 {
 super(Material.plants);
 this.setHardness(0);
 this.setResistance(0);
 this.setBlockName("mais_pousse_top");
 
 
 }
 
 
 
    public void onBlockAdded (World world, int posX, int posY, int posZ)
    {
     this.f_posX = posX;
     this.f_posY = posY;
     this.f_posZ = posZ;
     this.f_world = world;
     world.setBlockMetadataWithNotify(posX, posY, posZ, 0, 2);
    }

 
    public boolean isOpaqueCube()
    {
     return false;
    }
    
    public boolean renderAsNormalBlock()
    {
     return false;
    }

    public int getRenderType()
    {
     return 1;
    }
    
    @Override
    @SideOnly(Side.CLIENT)
    public void registerBlockIcons(IIconRegister parIIconRegister)
    {
          iIcon = new IIcon[3];
          // seems that crops like to have 8 growth icons, but okay to repeat actual texture if you want
          iIcon[0] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_top_stage_0");
          iIcon[1] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_top_stage_2");
          iIcon[2] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_top_stage_3");

    }
     
    @SideOnly(Side.CLIENT)
    public IIcon getIcon(int parSide, int parGrowthStage)
    {
     return iIcon[this.f_world.getBlockMetadata(f_posX, f_posY, f_posZ)];
    }
    

 
    public boolean canBlockStay (World world, int posX, int posY, int posZ) 
    {
     
       // Block soil = blocksList[world.getBlockId(x, y - 1, z)];
       //return (world.getFullBlockLightValue(x, y, z) >= 8 || world.canBlockSeeTheSky(x, y, z)) && (soil != null && soil.canSustainPlant(world, x, y - 1, z,ForgeDirection.UP, Generic.tomatoSeeds));
     //this.blockdudessu(world, posX, posY, posZ);
     
     Block dessous = world.getBlock(posX, posY, posZ);

     if (dessous == ModBlocks.blockCornCrop && !isAir(world, posX, posY - 1, posZ))
     {
     
     return true;
     }

     else 
     {
     return false;
     }
     
     
    }
    
    public AxisAlignedBB getCollisionBoundingBoxFromPool(World world, int posX, int posY, int posZ)
    {
        return null;
    }
    

    

}


Код:
package ru.legendary.lwmod.lwmfarm.block;

import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.block.Block;
import net.minecraft.block.BlockCrops;
import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import ru.legendary.lwmod.lwmfarm.LWMFarm;
import ru.legendary.lwmod.lwmfarm.core.ModBlocks;
import ru.legendary.lwmod.lwmfarm.core.ModItems;


public class blockCornCrop extends BlockCrops
{
    private IIcon[] iIcon;
 int f_posX;
 int f_posY;
 int f_posZ;
 World f_world;

    public blockCornCrop(String makeName) {
 }







 @Override
    public boolean canBlockStay (World world, int posX, int posY, int posZ) 
    {

     
     Block dessous = world.getBlock(posX, posY - 1, posZ);
     Block dessus = world.getBlock(posX, posY + 1, posZ);
     int met = world.getBlockMetadata(posX, posY, posZ);


     if (dessous == Blocks.farmland && dessus == ModBlocks.blockCornCropTop)
     {
     
     return true;
     }

     else 
     {
     return false;
     }
     
     
    }
    
    

    
    


    protected Item func_149866_P()
    {
        return ModItems.itemCorn;
    }

    protected Item func_149865_i()
    {
        return ModItems.itemCorn;
        
    }
    
    public void onBlockAdded (World world, int posX, int posY, int posZ)
    {
     this.f_posX = posX;
     this.f_posY = posY;
     this.f_posZ = posZ;
     this.f_world = world;
     world.setBlock(posX, posY + 1, posZ, ModBlocks.blockCornCropTop);
    }

    @Override
  
    public void registerBlockIcons(IIconRegister parIIconRegister)
    {
          iIcon = new IIcon[8];
          iIcon[0] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_stage_0");
          iIcon[1] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_stage_0");
          iIcon[2] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_stage_1");
          iIcon[3] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_stage_1");
          iIcon[4] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_stage_2");
          iIcon[5] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_stage_2");
          iIcon[6] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_stage_3");
          iIcon[7] = parIIconRegister.registerIcon(LWMFarm.MOD_ID + ":pousse_mais_stage_3");
    }
     
    
    public IIcon getIcon(int parSide, int parGrowthStage)
    {
     if ( parGrowthStage > 3 && parGrowthStage < 6)
     {
     f_world.setBlockMetadataWithNotify(f_posX, f_posY + 1, f_posZ, 1, 2);
     }
     else if ( parGrowthStage > 5)
     {
     f_world.setBlockMetadataWithNotify(f_posX, f_posY + 1, f_posZ, 2, 2);
     }
     
     return iIcon[parGrowthStage];
    }
    
    

    
    

    public int getRenderType()
    {
     return 1;
    }
    
    public Item getItem(World world, int posX, int posY, int posZ)
    {
        return ModItems.itemCorn;
    }
}


Код:
package ru.legendary.lwmod.lwmfarm.item;

import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.item.Item;
import net.minecraft.item.ItemFood;
import net.minecraft.item.ItemSeeds;
import net.minecraft.item.ItemStack;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
import net.minecraftforge.common.EnumPlantType;
import net.minecraftforge.common.IPlantable;
import net.minecraftforge.common.util.ForgeDirection;
import ru.legendary.lwmod.lwmfarm.LWMFarm;
import ru.legendary.lwmod.lwmfarm.api.RecipeItemSeedFood;
import ru.legendary.lwmod.lwmfarm.core.ModBlocks;
import ru.legendary.lwmod.lwmfarm.core.ModCreativeTabs;

public class itemCorn extends ItemFood implements IPlantable {

 public itemCorn(String name, int parHealAmount, float parSaturationModifier, Block parBlockPlant, Block parSoilBlock) {
        super(1, 1.2F, true);
        setUnlocalizedName(name);
        setTextureName(LWMFarm.MOD_ID + ":itemCorn");
        setCreativeTab(ModCreativeTabs.tabLWMFarm);
 }

 @Override
    public boolean onItemUse(ItemStack parItemStack, EntityPlayer parPlayer, 
          World parWorld, int parX, int parY, int parZ, int par7, float par8, 
          float par9, float par10)
    {
     // не уверен, что это делает, скопировал из картофеля
        if (par7 != 1)
        {
            return false;
        }
        // проверить, если игрок имеет возможность редактировать
        else if (parPlayer.canPlayerEdit(parX, parY+1, parZ, par7, parItemStack))
        {
            // проверить, что почва подходит для блока
         // а так же, проверить наличие блока воздуха над ним
            if ((parWorld.getBlock(parX, parY, parZ).canSustainPlant(parWorld, parX, parY, parZ, ForgeDirection.UP, this) && parWorld.isAirBlock(parX, parY+1, parZ)) && parWorld.isAirBlock(parX, parY+2, parZ))
            {
             // помещаем блок саженца
                parWorld.setBlock(parX, parY+1, parZ, ModBlocks.blockCornCrop);
                // уменьшаем количество семян в руке на одну штуку
                --parItemStack.stackSize;
                return true;
            }
            else
            {
                return false;
            }
        }
        else
        {
            return false;
        }
    }

 
 
 
 
 
 //тип растения
 @Override
 public EnumPlantType getPlantType(IBlockAccess world, int x, int y, int z) {
 return EnumPlantType.Crop;
 }

 //какое растенеие сажает
 @Override
 public Block getPlant(IBlockAccess world, int x, int y, int z) {
 return ModBlocks.blockCornCrop;
 }

 @Override
 public int getPlantMetadata(IBlockAccess world, int x, int y, int z) {
 return 0;
 }
 
 //на какой блок можно сажать
    public Block getSoilId() 
    {
        return Blocks.farmland;
    }

}

крашит.
как я понял, почему то 
сюда
Код:
     f_world.setBlockMetadataWithNotify(f_posX, f_posY + 1, f_posZ, 1, 2);
не доходит значение f_world
как это исправить?
 
Сверху