1
0
mirror of https://github.com/chylex/Hardcore-Ender-Expansion.git synced 2025-04-14 14:15:42 +02:00

Moar populators :3

This commit is contained in:
chylex 2014-10-27 02:49:52 +01:00
parent 40340a9898
commit 791ebc0a45
4 changed files with 126 additions and 79 deletions
src/main/java/chylex/hee/world/feature/blobs

View File

@ -1,32 +0,0 @@
package chylex.hee.world.feature.blobs.old;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import chylex.hee.world.feature.WorldGenBlobOld;
public class FlowerPopulator extends Populator{
private Block flower;
public FlowerPopulator(Block flower){
this.flower = flower;
}
@Override
public void populate(World world, Random rand, int x, int y, int z){
int planeAreaSquared = (int)Math.floor(Math.sqrt(size[0]*size[2]))>>1;
for(int a = 0; a < planeAreaSquared; a++){
int xx = rand.nextInt(maxPos[0]-minPos[0])+minPos[0],
zz = rand.nextInt(maxPos[2]-minPos[2])+minPos[2],yy;
boolean can = false;
for(yy = maxPos[1]; yy > minPos[1]; yy--){
if (getBlock(world,xx,yy,zz) == WorldGenBlobOld.filler){
can = true;
break;
}
}
if (can)world.setBlock(xx,yy+1,zz,flower);
}
}
}

View File

@ -1,47 +0,0 @@
package chylex.hee.world.feature.blobs.old;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import net.minecraft.world.World;
import chylex.hee.world.feature.WorldGenBlobOld;
public class LakePopulator extends Populator{
private Block liquid;
public LakePopulator(Block liquid){
this.liquid = liquid;
}
@Override
public void populate(World world, Random rand, int x, int y, int z){
for(int attempt = 0; attempt < 3; attempt++){
int px = rand.nextInt(maxPos[0]-minPos[0])+minPos[0],
pz = rand.nextInt(maxPos[2]-minPos[2])+minPos[2],
py = maxPos[1];
boolean found = false;
for(; py > minPos[1]; py--){
if (getBlock(world,px,py,pz) == WorldGenBlobOld.filler){
found = true;
break;
}
}
if (!found)continue;
for(int xx = minPos[0]; xx <= maxPos[0]; xx++){
for(int zz = minPos[2]; zz <= maxPos[2]; zz++){
if (isBlockSuitable(world,xx,py,zz))world.setBlock(xx,py,zz,liquid);
}
}
if (rand.nextInt(3) != 0)break;
}
}
private boolean isBlockSuitable(World world, int x, int y, int z){
if (!(isInRange(x-1,y,z-1) && isInRange(x+1,y,z+1)) || getBlock(world,x,y+1,z) != Blocks.air)return false;
return getBlock(world,x+1,y,z) != Blocks.air && getBlock(world,x-1,y,z) != Blocks.air&&
getBlock(world,x,y,z+2) != Blocks.air && getBlock(world,x,y,z-1) != Blocks.air;
}
}

View File

@ -0,0 +1,52 @@
package chylex.hee.world.feature.blobs.populators;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import chylex.hee.world.feature.blobs.BlobPopulator;
import chylex.hee.world.feature.util.DecoratorFeatureGenerator;
public class BlobPopulatorLake extends BlobPopulator{
private Block liquid;
private double minRadius, maxRadius;
public BlobPopulatorLake(int weight){
super(weight);
}
public BlobPopulatorLake block(Block liquid){
this.liquid = liquid;
return this;
}
public BlobPopulatorLake rad(double minRadius, double maxRadius){
this.minRadius = minRadius;
this.maxRadius = maxRadius;
return this;
}
@Override
public void generate(DecoratorFeatureGenerator gen, Random rand){
double rad = minRadius+rand.nextDouble()*(maxRadius-minRadius);
int irad = (int)Math.ceil(rad);
for(int attempt = 0, x, y, z; attempt < 30; attempt++){
x = rand.nextInt(32)-16;
y = rand.nextInt(32)-16;
z = rand.nextInt(32)-16;
if (gen.getBlock(x,y,z) == Blocks.end_stone && gen.getBlock(x,y+1,z) == Blocks.air){
for(int xx = x-irad; xx <= x+irad; xx++){
for(int zz = z-irad; zz <= z+irad; zz++){
if (gen.getBlock(xx,y,zz) == Blocks.end_stone && gen.getBlock(xx,y+1,zz) == Blocks.air &&
gen.getBlock(xx-1,y,zz) == Blocks.air && gen.getBlock(xx+1,y,zz) == Blocks.air &&
gen.getBlock(xx,y,zz-1) == Blocks.air && gen.getBlock(xx,y,zz+1) == Blocks.air){
gen.setBlock(xx,y,zz,liquid);
}
}
}
break;
}
}
}
}

View File

@ -0,0 +1,74 @@
package chylex.hee.world.feature.blobs.populators;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.init.Blocks;
import chylex.hee.world.feature.blobs.BlobPopulator;
import chylex.hee.world.feature.util.DecoratorFeatureGenerator;
import chylex.hee.world.util.BlockLocation;
import chylex.hee.world.util.IRandomAmount;
public class BlobPopulatorPlant extends BlobPopulator{
private Block plant;
private IRandomAmount amountGen;
private int minAttempts, maxAttempts, minPlantAmount, maxPlantAmount;
private boolean knownBlockLocations;
public BlobPopulatorPlant(int weight){
super(weight);
}
public BlobPopulatorPlant block(Block plant){
this.plant = plant;
return this;
}
public BlobPopulatorPlant attempts(int minAttempts, int maxAttempts){
this.minAttempts = (byte)minAttempts;
this.maxAttempts = (byte)maxAttempts;
return this;
}
public BlobPopulatorPlant blockAmount(IRandomAmount amountGen, int minPlantAmount, int maxPlantAmount){
this.amountGen = amountGen;
this.minPlantAmount = (byte)minPlantAmount;
this.maxPlantAmount = (byte)maxPlantAmount;
return this;
}
/**
* Populator will know all generated blocks and use those to place ores, attempt amount will have an effect in cases when the random block is not air above End Stone.
*/
public BlobPopulatorPlant knownBlockLocations(){
this.knownBlockLocations = true;
return this;
}
@Override
public void generate(DecoratorFeatureGenerator gen, Random rand){
int blocks = amountGen.generate(rand,minPlantAmount,maxPlantAmount);
List<BlockLocation> locs = null;
for(int attempt = 0, attempts = minAttempts+rand.nextInt(maxAttempts-minAttempts+1), x, y, z; attempt < attempts && blocks > 0; attempt++){
if (knownBlockLocations){
if (attempt == 0)locs = gen.getUsedLocations();
if (locs.isEmpty())return;
BlockLocation loc = locs.get(rand.nextInt(locs.size()));
x = loc.x;
y = loc.y;
z = loc.z;
}
else{
x = rand.nextInt(32)-16;
y = rand.nextInt(32)-16;
z = rand.nextInt(32)-16;
}
if (gen.getBlock(x,y,z) == Blocks.air && gen.getBlock(x,y-1,z) == Blocks.end_stone){
gen.setBlock(x,y,z,plant);
--blocks;
}
}
}
}