    001package net.minecraft.world.gen.structure;
    002
    003import java.util.List;
    004import java.util.Random;
    005import net.minecraft.block.Block;
    006import net.minecraft.util.MathHelper;
    007import net.minecraft.world.World;
    008
    009public class ComponentVillageField extends ComponentVillage
    010{
    011    private int averageGroundLevel = -1;
    012
    013    /** First crop type for this field. */
    014    private int cropTypeA;
    015
    016    /** Second crop type for this field. */
    017    private int cropTypeB;
    018
    019    /** Third crop type for this field. */
    020    private int cropTypeC;
    021
    022    /** Fourth crop type for this field. */
    023    private int cropTypeD;
    024
    025    public ComponentVillageField(ComponentVillageStartPiece par1ComponentVillageStartPiece, int par2, Random par3Random, StructureBoundingBox par4StructureBoundingBox, int par5)
    026    {
    027        super(par1ComponentVillageStartPiece, par2);
    028        this.coordBaseMode = par5;
    029        this.boundingBox = par4StructureBoundingBox;
    030        this.cropTypeA = this.getRandomCrop(par3Random);
    031        this.cropTypeB = this.getRandomCrop(par3Random);
    032        this.cropTypeC = this.getRandomCrop(par3Random);
    033        this.cropTypeD = this.getRandomCrop(par3Random);
    034    }
    035
    036    /**
    037     * Returns a crop type to be planted on this field.
    038     */
    039    private int getRandomCrop(Random par1Random)
    040    {
    041        switch (par1Random.nextInt(5))
    042        {
    043            case 0:
    044                return Block.carrot.blockID;
    045            case 1:
    046                return Block.potato.blockID;
    047            default:
    048                return Block.crops.blockID;
    049        }
    050    }
    051
    052    public static ComponentVillageField func_74900_a(ComponentVillageStartPiece par0ComponentVillageStartPiece, List par1List, Random par2Random, int par3, int par4, int par5, int par6, int par7)
    053    {
    054        StructureBoundingBox structureboundingbox = StructureBoundingBox.getComponentToAddBoundingBox(par3, par4, par5, 0, 0, 0, 13, 4, 9, par6);
    055        return canVillageGoDeeper(structureboundingbox) && StructureComponent.findIntersecting(par1List, structureboundingbox) == null ? new ComponentVillageField(par0ComponentVillageStartPiece, par7, par2Random, structureboundingbox, par6) : null;
    056    }
    057
    058    /**
    059     * second Part of Structure generating, this for example places Spiderwebs, Mob Spawners, it closes Mineshafts at
    060     * the end, it adds Fences...
    061     */
    062    public boolean addComponentParts(World par1World, Random par2Random, StructureBoundingBox par3StructureBoundingBox)
    063    {
    064        if (this.averageGroundLevel < 0)
    065        {
    066            this.averageGroundLevel = this.getAverageGroundLevel(par1World, par3StructureBoundingBox);
    067
    068            if (this.averageGroundLevel < 0)
    069            {
    070                return true;
    071            }
    072
    073            this.boundingBox.offset(0, this.averageGroundLevel - this.boundingBox.maxY + 4 - 1, 0);
    074        }
    075
    076        this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 1, 0, 12, 4, 8, 0, 0, false);
    077        this.fillWithBlocks(par1World, par3StructureBoundingBox, 1, 0, 1, 2, 0, 7, Block.tilledField.blockID, Block.tilledField.blockID, false);
    078        this.fillWithBlocks(par1World, par3StructureBoundingBox, 4, 0, 1, 5, 0, 7, Block.tilledField.blockID, Block.tilledField.blockID, false);
    079        this.fillWithBlocks(par1World, par3StructureBoundingBox, 7, 0, 1, 8, 0, 7, Block.tilledField.blockID, Block.tilledField.blockID, false);
    080        this.fillWithBlocks(par1World, par3StructureBoundingBox, 10, 0, 1, 11, 0, 7, Block.tilledField.blockID, Block.tilledField.blockID, false);
    081        this.fillWithBlocks(par1World, par3StructureBoundingBox, 0, 0, 0, 0, 0, 8, Block.wood.blockID, Block.wood.blockID, false);
    082        this.fillWithBlocks(par1World, par3StructureBoundingBox, 6, 0, 0, 6, 0, 8, Block.wood.blockID, Block.wood.blockID, false);
    083        this.fillWithBlocks(par1World, par3StructureBoundingBox, 12, 0, 0, 12, 0, 8, Block.wood.blockID, Block.wood.blockID, false);
    084        this.fillWithBlocks(par1World, par3StructureBoundingBox, 1, 0, 0, 11, 0, 0, Block.wood.blockID, Block.wood.blockID, false);
    085        this.fillWithBlocks(par1World, par3StructureBoundingBox, 1, 0, 8, 11, 0, 8, Block.wood.blockID, Block.wood.blockID, false);
    086        this.fillWithBlocks(par1World, par3StructureBoundingBox, 3, 0, 1, 3, 0, 7, Block.waterMoving.blockID, Block.waterMoving.blockID, false);
    087        this.fillWithBlocks(par1World, par3StructureBoundingBox, 9, 0, 1, 9, 0, 7, Block.waterMoving.blockID, Block.waterMoving.blockID, false);
    088        int i;
    089
    090        for (i = 1; i <= 7; ++i)
    091        {
    092            this.placeBlockAtCurrentPosition(par1World, this.cropTypeA, MathHelper.getRandomIntegerInRange(par2Random, 2, 7), 1, 1, i, par3StructureBoundingBox);
    093            this.placeBlockAtCurrentPosition(par1World, this.cropTypeA, MathHelper.getRandomIntegerInRange(par2Random, 2, 7), 2, 1, i, par3StructureBoundingBox);
    094            this.placeBlockAtCurrentPosition(par1World, this.cropTypeB, MathHelper.getRandomIntegerInRange(par2Random, 2, 7), 4, 1, i, par3StructureBoundingBox);
    095            this.placeBlockAtCurrentPosition(par1World, this.cropTypeB, MathHelper.getRandomIntegerInRange(par2Random, 2, 7), 5, 1, i, par3StructureBoundingBox);
    096            this.placeBlockAtCurrentPosition(par1World, this.cropTypeC, MathHelper.getRandomIntegerInRange(par2Random, 2, 7), 7, 1, i, par3StructureBoundingBox);
    097            this.placeBlockAtCurrentPosition(par1World, this.cropTypeC, MathHelper.getRandomIntegerInRange(par2Random, 2, 7), 8, 1, i, par3StructureBoundingBox);
    098            this.placeBlockAtCurrentPosition(par1World, this.cropTypeD, MathHelper.getRandomIntegerInRange(par2Random, 2, 7), 10, 1, i, par3StructureBoundingBox);
    099            this.placeBlockAtCurrentPosition(par1World, this.cropTypeD, MathHelper.getRandomIntegerInRange(par2Random, 2, 7), 11, 1, i, par3StructureBoundingBox);
    100        }
    101
    102        for (i = 0; i < 9; ++i)
    103        {
    104            for (int j = 0; j < 13; ++j)
    105            {
    106                this.clearCurrentPositionBlocksUpwards(par1World, j, 4, i, par3StructureBoundingBox);
    107                this.fillCurrentPositionBlocksDownwards(par1World, Block.dirt.blockID, 0, j, -1, i, par3StructureBoundingBox);
    108            }
    109        }
    110
    111        return true;
    112    }
    113}