implement getUngeneratedBlock

This commit is contained in:
dfsek
2021-01-13 17:48:30 -07:00
parent e04d363123
commit 4bd943ae7b
3 changed files with 89 additions and 0 deletions

View File

@@ -1,10 +1,17 @@
package com.dfsek.terra;
import com.dfsek.terra.api.math.vector.Location;
import com.dfsek.terra.api.math.vector.Vector3;
import com.dfsek.terra.api.platform.TerraPlugin;
import com.dfsek.terra.api.platform.block.BlockData;
import com.dfsek.terra.api.platform.generator.GeneratorWrapper;
import com.dfsek.terra.api.platform.world.World;
import com.dfsek.terra.api.world.palette.Palette;
import com.dfsek.terra.biome.BiomeProvider;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.generation.math.Sampler;
import net.jafama.FastMath;
public class TerraWorld {
private final BiomeProvider provider;
@@ -12,6 +19,7 @@ public class TerraWorld {
private final boolean safe;
private final TerraProfiler profiler;
private final World world;
private final BlockData air;
public TerraWorld(World w, ConfigPack c, TerraPlugin main) {
@@ -19,6 +27,7 @@ public class TerraWorld {
profiler = new TerraProfiler(w);
this.provider = config.getTemplate().getProviderBuilder().build(w.getSeed());
this.world = w;
air = main.getWorldHandle().createBlockData("minecraft:air");
safe = true;
}
@@ -45,4 +54,39 @@ public class TerraWorld {
public TerraProfiler getProfiler() {
return profiler;
}
/**
* Get a block at an ungenerated location
*
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
* @return BlockData
*/
public BlockData getUngeneratedBlock(int x, int y, int z) {
UserDefinedBiome biome = (UserDefinedBiome) provider.getBiome(x, z);
Palette<BlockData> palette = biome.getGenerator(world).getPalette(y);
Sampler sampler = config.getSamplerCache().get(world, x, z);
int fdX = FastMath.floorMod(x, 16);
int fdZ = FastMath.floorMod(z, 16);
double noise = sampler.sample(fdX, y, fdZ);
if(noise > 0) {
int level = 0;
for(int yi = world.getMaxHeight(); yi > y; yi--) {
if(sampler.sample(fdX, yi, fdZ) > 0) level++;
else level = 0;
}
return palette.get(level, x, y, z);
} else if(y <= biome.getConfig().getSeaLevel()) {
return biome.getConfig().getOceanPalette().get(biome.getConfig().getSeaLevel() - y, x, y, z);
} else return air;
}
public BlockData getUngeneratedBlock(Location l) {
return getUngeneratedBlock(l.getBlockX(), l.getBlockY(), l.getBlockZ());
}
public BlockData getUngeneratedBlock(Vector3 v) {
return getUngeneratedBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ());
}
}