• 0

    posted a message on Help with custom crops
    Well I tried to change the method you mentioned but I'm not sure if what I wrote was right, because it's still not working in game.
    Here is the section of code that I changed:

    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
    {
    if (par7 != 1)
    {
    return false;
    }
    else if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par2EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack))
    {
    int var11 = par3World.getBlockId(par4, par5, par6);
    Block soil = Block.blocksList[var11];
    
    if (par5 == Block.dirt.blockID || par5 + 1 == Block.waterStill.blockID)
    {
    par3World.setBlockWithNotify(par4, par5 + 1, par6, this.blockType);
    --par1ItemStack.stackSize;
    return true;
    }
    else
    {
    return false;
    }
    }
    else
    {
    return false;
    }
    }



    Posted in: Modification Development
  • 0

    posted a message on Help with custom crops
    BlockUnderwaterCrops:

    package Mods.Common;
    import java.util.ArrayList;
    import java.util.Random;
    import net.minecraft.block.Block;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    import net.minecraftforge.common.ForgeDirection;
    import cpw.mods.fml.relauncher.Side;
    import cpw.mods.fml.relauncher.SideOnly;
    public class BlockUnderwaterCrops extends BlockUnderwaterFlower
    {
    protected BlockUnderwaterCrops(int par1, int par2, int par3)
    {
    super(par1, par2);
    this.blockIndexInTexture = par2;
    this.setTickRandomly(true);
    float var3 = 0.5F;
    this.setBlockBounds(0.5F - var3, 0.0F, 0.5F - var3, 0.5F + var3, 0.25F, 0.5F + var3);
    this.setCreativeTab((CreativeTabs)null);
    this.setHardness(0.0F);
    this.setStepSound(soundGrassFootstep);
    this.disableStats();
    this.setRequiresSelfNotify();
    }
    /**
    * Gets passed in the blockID of the block below and supposed to return true if its allowed to grow on the type of
    * blockID passed in. Args: blockID
    */
    protected boolean canThisPlantGrowOnThisBlockID(int par1)
    {
    return par1 == Block.dirt.blockID || par1 == Block.sand.blockID;
    }
    /**
    * Ticks the block if it's been scheduled
    */
    public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random)
    {
    super.updateTick(par1World, par2, par3, par4, par5Random);
    if (par1World.getBlockLightValue(par2, par3 + 1, par4) >= 9)
    {
    int var6 = par1World.getBlockMetadata(par2, par3, par4);
    if (var6 < 7)
    {
    float var7 = this.getGrowthRate(par1World, par2, par3, par4);
    if (par5Random.nextInt((int)(25.0F / var7) + 1) == 0)
    {
    ++var6;
    par1World.setBlockMetadataWithNotify(par2, par3, par4, var6);
    }
    }
    }
    }
    /**
    * Apply bonemeal to the crops.
    */
    public void fertilize(World par1World, int par2, int par3, int par4)
    {
    par1World.setBlockMetadataWithNotify(par2, par3, par4, 7);
    }
    /**
    * Gets the growth rate for the crop. Setup to encourage rows by halving growth rate if there is diagonals, crops on
    * different sides that aren't opposing, and by adding growth for every crop next to this one (and for crop below
    * this one). Args: x, y, z
    */
    private float getGrowthRate(World par1World, int par2, int par3, int par4)
    {
    float var5 = 1.0F;
    int var6 = par1World.getBlockId(par2, par3, par4 - 1);
    int var7 = par1World.getBlockId(par2, par3, par4 + 1);
    int var8 = par1World.getBlockId(par2 - 1, par3, par4);
    int var9 = par1World.getBlockId(par2 + 1, par3, par4);
    int var10 = par1World.getBlockId(par2 - 1, par3, par4 - 1);
    int var11 = par1World.getBlockId(par2 + 1, par3, par4 - 1);
    int var12 = par1World.getBlockId(par2 + 1, par3, par4 + 1);
    int var13 = par1World.getBlockId(par2 - 1, par3, par4 + 1);
    boolean var14 = var8 == this.blockID || var9 == this.blockID;
    boolean var15 = var6 == this.blockID || var7 == this.blockID;
    boolean var16 = var10 == this.blockID || var11 == this.blockID || var12 == this.blockID || var13 == this.blockID;
    for (int var17 = par2 - 1; var17 <= par2 + 1; ++var17)
    {
    for (int var18 = par4 - 1; var18 <= par4 + 1; ++var18)
    {
    int var19 = par1World.getBlockId(var17, par3 - 1, var18);
    float var20 = 0.0F;
    if (blocksList[var19] != null && blocksList[var19].canSustainPlant(par1World, var17, par3 - 1, var18, ForgeDirection.UP, this))
    {
    var20 = 1.0F;
    if (blocksList[var19].isFertile(par1World, var17, par3 - 1, var18))
    {
    var20 = 3.0F;
    }
    }
    if (var17 != par2 || var18 != par4)
    {
    var20 /= 4.0F;
    }
    var5 += var20;
    }
    }
    if (var16 || var14 && var15)
    {
    var5 /= 2.0F;
    }
    return var5;
    }
    /**
    * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata
    */
    public int getBlockTextureFromSideAndMetadata(int par1, int par2)
    {
    if (par2 < 0)
    {
    par2 = 7;
    }
    return this.blockIndexInTexture + par2;
    }
    /**
    * The type of render function that is called for this block
    */
    public int getRenderType()
    {
    return 6;
    }
    /**
    * Generate a seed ItemStack for this crop.
    */
    protected int getSeedItem()
    {
    return mod_Main.SeaweedBulb.shiftedIndex;
    }
    /**
    * Generate a crop produce ItemStack for this crop.
    */
    protected int getCropItem()
    {
    return mod_Main.Seaweed.shiftedIndex;
    }
    /**
    * Drops the block items with a specified chance of dropping the specified items
    */
    public void dropBlockAsItemWithChance(World par1World, int par2, int par3, int par4, int par5, float par6, int par7)
    {
    super.dropBlockAsItemWithChance(par1World, par2, par3, par4, par5, par6, 0);
    }
    @Override
    public ArrayList<ItemStack> getBlockDropped(World world, int x, int y, int z, int metadata, int fortune)
    {
    ArrayList<ItemStack> ret = super.getBlockDropped(world, x, y, z, metadata, fortune);
    if (metadata >= 7)
    {
    for (int n = 0; n < 3 + fortune; n++)
    {
    if (world.rand.nextInt(15) <= metadata)
    {
    ret.add(new ItemStack(this.getSeedItem(), 1, 0));
    }
    }
    }
    return ret;
    }
    /**
    * Returns the ID of the items to drop on destruction.
    */
    public int idDropped(int par1, Random par2Random, int par3)
    {
    return par1 == 7 ? this.getCropItem() : this.getSeedItem();
    }
    /**
    * Returns the quantity of items to drop on block destruction.
    */
    public int quantityDropped(Random par1Random)
    {
    return 1 + par1Random.nextInt(2);
    }
    @SideOnly(Side.CLIENT)
    /**
    * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative)
    */
    public int idPicked(World par1World, int par2, int par3, int par4)
    {
    return this.getSeedItem();
    }
    }


    BlockUnderwaterFlower:

    package Mods.Common;
    
    import java.util.Random;
    import net.minecraft.block.Block;
    import net.minecraft.block.material.Material;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.util.AxisAlignedBB;
    import net.minecraft.world.World;
    import net.minecraftforge.common.EnumPlantType;
    import net.minecraftforge.common.ForgeDirection;
    import net.minecraftforge.common.IPlantable;
    public class BlockUnderwaterFlower extends Block implements IPlantable
    {
    protected BlockUnderwaterFlower(int par1, int par2, Material par3Material)
    {
    	 super(par1, par3Material);
    	 this.blockIndexInTexture = par2;
    	 this.setTickRandomly(true);
    	 float var4 = 0.2F;
    	 this.setBlockBounds(0.5F - var4, 0.0F, 0.5F - var4, 0.5F + var4, var4 * 3.0F, 0.5F + var4);
    	 this.setCreativeTab(CreativeTabs.tabDecorations);
    }
    protected BlockUnderwaterFlower(int par1, int par2)
    {
    	 this(par1, par2, Material.water);
    }
    /**
    	 * Checks to see if its valid to put this block at the specified coordinates. Args: world, x, y, z
    	 */
    public boolean canPlaceBlockAt(World par1World, int par2, int par3, int par4)
    {
    	 return true;
    }
    /**
    	 * Gets passed in the blockID of the block below and supposed to return true if its allowed to grow on the type of
    	 * blockID passed in. Args: blockID
    	 */
    protected boolean canThisPlantGrowOnThisBlockID(int par1)
    {
    	 return par1 == Block.dirt.blockID;
    }
    
    
    /**
    	 * Is this block (a) opaque and (B) a full 1m cube? This determines whether or not to render the shared face of two
    	 * adjacent blocks and also whether the player can attach torches, redstone wire, etc to this block.
    	 */
    public boolean isOpaqueCube()
    {
    	 return false;
    }
    /**
    	 * If this block doesn't render as an ordinary block it will return False (examples: signs, buttons, stairs, etc)
    	 */
    public boolean renderAsNormalBlock()
    {
    	 return false;
    }
    /**
    	 * The type of render function that is called for this block
    	 */
    public int getRenderType()
    {
    	 return 1;
    }
    
    @Override
    public int getPlantID(World world, int x, int y, int z)
    {
    	 return blockID;
    }
    @Override
    public int getPlantMetadata(World world, int x, int y, int z)
    {
    	 return world.getBlockMetadata(x, y, z);
    }
    @Override
    public EnumPlantType getPlantType(World world, int x, int y, int z) {
    // TODO Auto-generated method stub
    return null;
    }
    }


    UnderwaterSeeds

    package Mods.Common;
    import net.minecraft.block.Block;
    import net.minecraft.creativetab.CreativeTabs;
    import net.minecraft.entity.player.EntityPlayer;
    import net.minecraft.item.Item;
    import net.minecraft.item.ItemStack;
    import net.minecraft.world.World;
    import net.minecraftforge.common.EnumPlantType;
    import net.minecraftforge.common.ForgeDirection;
    import net.minecraftforge.common.IPlantable;
    public class UnderwaterSeeds extends Item implements IPlantable
    {
    /**
    	 * The type of block this seed turns into (wheat or pumpkin stems for instance)
    	 */
    private int blockType;
    /** BlockID of the block the seeds can be planted on. */
    private int soilBlockID;
    public UnderwaterSeeds(int par1, int par2, int par3)
    {
    	 super(par1);
    	 this.blockType = par2;
    	 this.soilBlockID = par3;
    	 this.setCreativeTab(CreativeTabs.tabMaterials);
    }
    /**
    	 * Callback for item usage. If the item does something special on right clicking, he will have one of those. Return
    	 * True if something happen and false if it don't. This is for ITEMS, not BLOCKS
    	 */
    public boolean onItemUse(ItemStack par1ItemStack, EntityPlayer par2EntityPlayer, World par3World, int par4, int par5, int par6, int par7, float par8, float par9, float par10)
    {
    	 if (par7 != 1)
    	 {
    		 return false;
    	 }
    	 else if (par2EntityPlayer.canPlayerEdit(par4, par5, par6, par7, par1ItemStack) && par2EntityPlayer.canPlayerEdit(par4, par5 + 1, par6, par7, par1ItemStack))
    	 {
    		 int var11 = par3World.getBlockId(par4, par5, par6);
    		 Block soil = Block.blocksList[var11];
    		 if (soil != null && soil.canSustainPlant(par3World, par4, par5, par6, ForgeDirection.UP, this))
    		 {
    			 par3World.setBlockWithNotify(par4, par5 + 1, par6, this.blockType);
    			 --par1ItemStack.stackSize;
    			 return true;
    		 }
    		 else
    		 {
    			 return false;
    		 }
    	 }
    	 else
    	 {
    		 return false;
    	 }
    }
    @Override
    public EnumPlantType getPlantType(World world, int x, int y, int z)
    {
    	 return (blockType == Block.netherStalk.blockID ? EnumPlantType.Nether : EnumPlantType.Crop);
    }
    @Override
    public int getPlantID(World world, int x, int y, int z)
    {
    	 return blockType;
    }
    @Override
    public int getPlantMetadata(World world, int x, int y, int z)
    {
    	 return 0;
    }
    public String getTextureFile(){
    return "/CustomItems.png";
    }
    }


    That's pretty much it, I know that it's not right but I'm not sure what to do next or what to change.
    Posted in: Modification Development
  • 0

    posted a message on Help with custom crops
    I have been trying to make underwater blocks/crops and I have finally been able to create the underwater block, and made it spawn underwater naturally. The next step in my mod is making the block a plantable crop that can be grown underwater, since the block is made underwater... I have messed around with the ItemSeeds, BlockCrops, and BlockFlower classes but I havent been able to make it able to be planted on a regular dort block, and underwater.
    Posted in: Modification Development
  • 0

    posted a message on Problems with WorldGen?
    I figured it out! I have finally created my underwater block! +'s for everyone!
    Thanks for all the help everyone! :Diamond: :Diamond: :Diamond:
    Posted in: Modification Development
  • 0

    posted a message on Problems with WorldGen?
    Well I tried it again, I just copied the WorldGenClay class and changed a few things. Thought it would work but my block is STILL not showing up... Any suggestions, or am I doing something wrong?
    Here's my code:

    package Mods.Common;
    
    import java.util.Random;
    
    import net.minecraft.src.Block;
    import net.minecraft.src.Material;
    import net.minecraft.src.World;
    import net.minecraft.src.WorldGenMinable;
    import net.minecraft.src.WorldGenerator;
    
    public class WorldGenFlower extends WorldGenerator
    {
    
    private int block;
    
    /** The number of blocks to generate. */
    private int numberOfBlocks;
    
    
    public WorldGenFlower()
    {
    this.block = mod_Main.TestBlock.blockID;
    
    }
    
    public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
    {
    
    if (par1World.getBlockMaterial(par3, par4, par5) != Material.water)
    {
    return false;
    }
    else
    {
    int var6 = par2Random.nextInt(this.numberOfBlocks - 2) + 2;
    byte var7 = 1;
    
    for (int var8 = par3 - var6; var8 <= par3 + var6; ++var8)
    {
    for (int var9 = par5 - var6; var9 <= par5 + var6; ++var9)
    {
    int var10 = var8 - par3;
    int var11 = var9 - par5;
    
    if (var10 * var10 + var11 * var11 <= var6 * var6)
    {
    for (int var12 = par4 - var7; var12 <= par4 + var7; ++var12)
    {
    int var13 = par1World.getBlockId(var8, var12, var9);
    
    if (var13 == Block.dirt.blockID || var13 == Block.sand.blockID)
    {
    par1World.setBlock(var8, var12, var9, this.block);
    
    for(int var14 = par4 - var7; var14<=par4+var7; ++var14){
    int XCOORD = par4+par2Random.nextInt(16);
    int ZCOORD = par5+par2Random.nextInt(16);
    int YCOORD = (60);
    if (YCOORD + 1 == Block.waterStill.blockID|| YCOORD - 1 == Block.dirt.blockID){
    par1World.setBlockWithNotify(XCOORD, YCOORD, ZCOORD, mod_Main.TestBlock.blockID);
    (new WorldGenMinable(mod_Main.TestBlock.blockID, 50)).generate(par1World, par2Random, XCOORD, YCOORD, ZCOORD);
    }
    }
    
    
    
    }
    }
    }
    }
    }
    
    return true;
    }
    }
    }

    Posted in: Modification Development
  • 0

    posted a message on Problems with WorldGen?
    Quote from Manpooper

    Check the code for ClayGen.java.


    I have looked and tried that a lot. I change the right things and everything, but my custom block doesn't show up.
    Posted in: Modification Development
  • 0

    posted a message on Problems with WorldGen?
    This is what my code looks like... It't just a regular generation code that I learned from a tutorial I watched, I just added it to the ChunkProviderGenerate class.

    private void generateSurface(World world, Random random, int BlockX, int BlockZ){
    for(int k =200; k < 2000; k++){
    int XCOORD = BlockX+random.nextInt(16);
    int ZCOORD = BlockZ +random.nextInt(16);
    int YCOORD = (60);
    if (YCOORD + 1 == Block.waterStill.blockID || YCOORD - 1 ==Block.dirt.blockID){
    world.setBlock(YCOORD, YCOORD, YCOORD, mod_Main.TestBlock.blockID);
    {
    (new WorldGenMinable(mod_Main.TestBlock.blockID, 40)).generate(world, random, XCOORD, YCOORD, ZCOORD);
    }
    }
    }
    }


    It's mainly bs, I am just testing it out before going to the trouble of creating a real block. I'll do that when I figure this out.

    Everything checks out fine, I can run the client without any errors. The only problem is that when the new world generates, there are floating TestBlocks everywhere, including underwater. I just want them underwater, not up in the air too.
    Posted in: Modification Development
  • 0

    posted a message on Problems with WorldGen?
    Is it possible to copy the WorldGenClay class to make a block spawn underwater? What would you have to change, or add?
    Posted in: Modification Development
  • 0

    posted a message on Problems with WorldGen?
    Does it have to be ocean or beach, because I wanted to make it in any body of water. To be honest, I don't really know how to do all the checks and ifs and all of that.
    Posted in: Modification Development
  • 0

    posted a message on Problems with WorldGen?
    I have been trying to figure out how to make a block or a plant be able to spawn underwater and haven't been able to get it right. I want the block to spawn on top of a dirt or sand block, but I also want the block to be underwater. I don't know how to make those checks to tell it to spawn like that... Can somebody give an example code, or give me some kind of advice?? Thanks in advance!

    PM's are fine too.
    Posted in: Modification Development
  • 0

    posted a message on Problems with underwater generation
    Anybody??
    Posted in: Modification Development
  • 0

    posted a message on Problems with underwater generation
    I have been trying to make a block spawn underwater, but I just can't figure it out..!
    Here is my main mod code:


    package Mods.Common;
    import net.minecraft.src.Block;
    import net.minecraft.src.BlockFlower;
    import net.minecraft.src.Item;
    import cpw.mods.fml.common.Mod;
    import cpw.mods.fml.common.Mod.Init;
    import cpw.mods.fml.common.SidedProxy;
    import cpw.mods.fml.common.event.FMLInitializationEvent;
    import cpw.mods.fml.common.network.NetworkMod;
    import cpw.mods.fml.common.registry.GameRegistry;
    import cpw.mods.fml.common.registry.LanguageRegistry;
    
    @Mod(modid="steven2.0", name="+Mods+", version="1.0.0")
    @NetworkMod(clientSideRequired=true, serverSideRequired=false)
    public class mod_Main {
    
    [url=""]//[email protected][/url]!!
    public static Block TestBlock;
    public static BlockFlower TestFlower;
    
    public static Block BlockBlock;
    
    
    [url=""]//[email protected][/url]!!
    [url=""]//[email protected][/url]!!
    public static Item Rice;
    public static Item TestFood;
    public static Item TestFood2;
    
    @SidedProxy(clientSide="Mods.Client.ClientProxyMods", serverSide ="Mods.Common.CommonProxyMods")
    public static CommonProxyMods proxy;
    
    @Init
    public void load(FMLInitializationEvent event){
    [url=""]//[email protected][/url]!!
    TestBlock = new BlockTestBlock(255, 1).setBlockName("TestBlock");
    TestFlower = (BlockFlower) new BlockTestFlower(254, 0).setBlockName("TestFlower");
    BlockBlock = new BlockBlockBlock(253, 10).setBlockName("BlockBlock");
    
    
    [url=""]//[email protected][/url]!!
    
    [url=""]//[email protected][/url]!!
    Rice = new mod_Foods(500, 3, 2F, false).setItemName("Rice").setIconCoord(12, 0);
    TestFood = new mod_Foods(502, 3, 4F, false).setItemName("TestFood").setIconCoord(13, 0);
    TestFood2 = new mod_Foods(503, 3, 4F, false).setItemName("TestFood2").setIconCoord(14, 0);
     
    [url=""]//[email protected][/url]!!
    GameRegistry.registerBlock(TestBlock);
    GameRegistry.registerBlock(TestFlower);
    GameRegistry.registerBlock(BlockBlock);
    
    [url=""]//[email protected][/url]!!
    
    [url=""]//[email protected][/url]!!
    LanguageRegistry.addName(TestFood2, "Test Food 2");
    
    [url=""]//[email protected][/url]!!
    GameRegistry.registerWorldGenerator(new WorldGenTest());
    
    proxy.registerRenderThings();
    
    }
    
    }


    And here is the worldgen class that I have created:
    package Mods.Common;
    import java.util.Random;
    import net.minecraft.src.Block;
    import net.minecraft.src.IChunkProvider;
    import net.minecraft.src.Material;
    import net.minecraft.src.World;
    import net.minecraft.src.WorldGenFlowers;
    import net.minecraft.src.WorldGenMinable;
    import cpw.mods.fml.common.IWorldGenerator;
    public class WorldGenTest implements IWorldGenerator {
    @Override
    public void generate(Random random, int chunkX, int chunkZ, World world,
    IChunkProvider chunkGenerator, IChunkProvider chunkProvider) {
    switch(world.provider.dimensionId){
    case -1: generateNether(world, random, chunkX*16, chunkZ*16);
    case 0: generateSurface(world, random, chunkX*16, chunkZ*16);
    }
    }
    private void generateSurface(World world, Random random, int BlockX, int BlockZ) {
    for(int i=10; i<30; i++);
    int XCoord = BlockX+random.nextInt(16);
    int ZCoord = BlockZ+random.nextInt(16);
    int YCoord = random.nextInt(100);
    (new WorldGenMinable(mod_Main.TestBlock.blockID, 50)).generate(world, random, XCoord, YCoord, ZCoord);
    
    for(int j=20; j<50; j++);
    int Xcoord = BlockX+random.nextInt(16);
    int Zcoord = BlockZ+random.nextInt(16);
    int Ycoord = random.nextInt(256);
    (new WorldGenFlowers(mod_Main.TestFlower.blockID)).generate(world, random, Xcoord, Ycoord, Zcoord);
    }
    
    private void generateNether(World world, Random random, int i, int j) {
    
    
    }
    
    private int numberOfBlocks;
    private int clayBlockId = mod_Main.BlockBlock.blockID;
    public boolean generate(World par1World, Random par2Random, int par3, int par4, int par5)
    {
    if (par1World.getBlockMaterial(par3, par4, par5) != Material.water)
    {
    	 return false;
    }
    else
    {
    	 int var6 = par2Random.nextInt(this.numberOfBlocks - 2) + 2;
    	 byte var7 = 1;
    	 for (int var8 = par3 - var6; var8 <= par3 + var6; ++var8)
    	 {
    		 for (int var9 = par5 - var6; var9 <= par5 + var6; ++var9)
    		 {
    			 int var10 = var8 - par3;
    			 int var11 = var9 - par5;
    			 if (var10 * var10 + var11 * var11 <= var6 * var6)
    			 {
    				 for (int var12 = par4 - var7; var12 <= par4 + var7; ++var12)
    				 {
    					 int var13 = par1World.getBlockId(var8, var12, var9);
    					 if (var13 == Block.dirt.blockID || var13 == mod_Main.BlockBlock.blockID)
    					 {
    						 par1World.setBlock(var8, var12, var9, this.clayBlockId);
    					 }
    				 }
    			 }
    		 }
    	 }
    	 return true;
    }
    }
    }

    Basically what I did is copied the WorldGenClay class and pasted it in my worldgen class.
    Is there something wrong, am I missing something...?
    Posted in: Modification Development
  • 0

    posted a message on [Creating Mods] Minecraft Forge [28/1/12]
    Hello all, I have been searching everywhere for help and I was wondering if anyone had an answer, or could help me out... I have been trying to make a flower that will spawn naturally underwater. I get the world generation part of it, I have made my custom flower able to spawn naturally, just on land though. Any help would be greatly appreciated!
    Posted in: Tutorials
  • 0

    posted a message on Chaging growth stages
    Sorry, this might be a simple question with a simple answer, but is there any way to change the growth stages of a crop? Say you wanted to make a crop that grew in half of the time that wheat does, what exactly do you have to change?
    Posted in: Modification Development
  • 0

    posted a message on Help with underwater crops/plants?
    Hmm... That makes sense. I had tried looking at all of the WorldGen classes, like plants and reed but never understood most of it. But thanks for your help, I think I'll be able to figure it out now. Oh and yes, I am using Forge. I like it a lot more than just regular ModLoader.
    Posted in: Modification Development
  • To post a comment, please .