package rtg.world.biome.deco;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.gen.feature.WorldGenerator;
import rtg.api.util.RandomUtil;
import rtg.api.util.WorldUtil;
import rtg.api.world.RTGWorld;
import rtg.world.biome.realistic.RealisticBiomeBase;
import rtg.world.gen.feature.WorldGenSponge;
/**
* @author WhichOnesPink
*/
public class DecoSponge extends DecoBase {
private IBlockState spongeBlock; // This can be any block.
private float strengthFactor; // Higher = more/bigger boulders.
private int minY; // Lower height restriction.
private int maxY; // Upper height restriction.
private HeightType heightType; // How we determine the Y coord.
private int chance; // Higher = more rare.
private boolean water;
protected ArrayList<Block> validGroundBlocks;
public DecoSponge() {
super();
/**
* Default values.
* These can be overridden when configuring the Deco object in the realistic biome.
*/
this.setSpongeBlock(Blocks.COBBLESTONE.getDefaultState());
this.setStrengthFactor(2f);
this.setMinY(20); // Sensible lower height limit by default.
this.setMaxY(50); // No upper height limit by default.
this.setHeightType(HeightType.GET_HEIGHT_VALUE);
this.setChance(10);
this.water = true;
this.validGroundBlocks = new ArrayList<Block>(Arrays.asList(
Blocks.GRASS,
Blocks.DIRT,
Blocks.STONE,
Blocks.GRAVEL,
Blocks.CLAY,
Blocks.SAND
));
this.addDecoTypes(DecoType.SPONGE);
}
@Override
public void generate(RealisticBiomeBase biome, RTGWorld rtgWorld, Random rand, int worldX, int worldZ, float strength, float river, boolean hasPlacedVillageBlocks) {
if (this.allowed) {
WorldUtil worldUtil = new WorldUtil(rtgWorld.world);
WorldGenerator worldGenerator = new WorldGenSponge(spongeBlock, 0, rand, validGroundBlocks);
for (int l1 = 0; l1 < this.strengthFactor * strength; ++l1) {
int i1 = worldX + rand.nextInt(16);// + 8;
int j1 = worldZ + rand.nextInt(16);// + 8;
int k1;
switch (this.heightType) {
case NEXT_INT:
k1 = RandomUtil.getRandomInt(rand, this.minY, this.maxY);
break;
case GET_HEIGHT_VALUE:
k1 = rtgWorld.world.getHeight(new BlockPos(i1, 0, j1)).getY();
break;
default:
k1 = rtgWorld.world.getHeight(new BlockPos(i1, 0, j1)).getY();
break;
}
if (k1 >= this.minY && k1 <= this.maxY && rand.nextInt(this.chance) == 0) {
worldGenerator.generate(rtgWorld.world, rand, new BlockPos(i1, k1, j1));
}
}
}
}
public enum HeightType {
NEXT_INT,
GET_HEIGHT_VALUE;
}
public IBlockState getSpongeBlock() {
return spongeBlock;
}
public DecoSponge setSpongeBlock(IBlockState spongeBlock) {
this.spongeBlock = spongeBlock;
return this;
}
public float getStrengthFactor() {
return strengthFactor;
}
public DecoSponge setStrengthFactor(float strengthFactor) {
this.strengthFactor = strengthFactor;
return this;
}
public int getMinY() {
return minY;
}
public DecoSponge setMinY(int minY) {
this.minY = minY;
return this;
}
public int getMaxY() {
return maxY;
}
public DecoSponge setMaxY(int maxY) {
this.maxY = maxY;
return this;
}
public int getChance() {
return chance;
}
public DecoSponge setChance(int chance) {
this.chance = chance;
return this;
}
public boolean isWater() {
return water;
}
public DecoSponge setWater(boolean water) {
this.water = water;
return this;
}
public HeightType getHeightType() {
return heightType;
}
public DecoSponge setHeightType(HeightType heightType) {
this.heightType = heightType;
return this;
}
public ArrayList<Block> getValidGroundBlocks() {
return validGroundBlocks;
}
public DecoSponge setValidGroundBlocks(ArrayList<Block> validGroundBlocks) {
this.validGroundBlocks = validGroundBlocks;
return this;
}
}