70 lines
2.5 KiB
Java
70 lines
2.5 KiB
Java
/**
|
|
* Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team
|
|
* http://www.mod-buildcraft.com
|
|
*
|
|
* BuildCraft is distributed under the terms of the Minecraft Mod Public
|
|
* License 1.0, or MMPL. Please check the contents of the license located in
|
|
* http://www.mod-buildcraft.com/MMPL-1.0.txt
|
|
*/
|
|
package buildcraft.energy.worldgen;
|
|
|
|
import java.util.Random;
|
|
|
|
import net.minecraft.world.gen.layer.GenLayer;
|
|
import net.minecraft.world.gen.layer.IntCache;
|
|
|
|
import buildcraft.core.lib.utils.SimplexNoise;
|
|
|
|
public abstract class GenLayerBiomeReplacer extends GenLayer {
|
|
|
|
public static final int OFFSET_RANGE = 500000;
|
|
protected final double xOffset;
|
|
protected final double zOffset;
|
|
protected final double noiseScale;
|
|
protected final double noiseThreshold;
|
|
protected final int newBiomeId;
|
|
|
|
/**
|
|
*
|
|
* @param worldSeed
|
|
* @param seed
|
|
* @param parent
|
|
* @param noiseScale The scale of the noise field, smaller numbers zoom in
|
|
* the noise field.
|
|
* @param noiseThreshold The strength the field must reach to replace the
|
|
* biome. Larger numbers result in smaller patches.
|
|
* @param newBiomeId
|
|
*/
|
|
public GenLayerBiomeReplacer(final long worldSeed, final long seed, final GenLayer parent, double noiseScale, double noiseThreshold, int newBiomeId) {
|
|
super(seed);
|
|
this.parent = parent;
|
|
this.noiseScale = noiseScale;
|
|
this.noiseThreshold = noiseThreshold;
|
|
this.newBiomeId = newBiomeId;
|
|
Random rand = new Random(worldSeed);
|
|
xOffset = rand.nextInt(OFFSET_RANGE) - (OFFSET_RANGE / 2);
|
|
zOffset = rand.nextInt(OFFSET_RANGE) - (OFFSET_RANGE / 2);
|
|
}
|
|
|
|
protected abstract boolean canReplaceBiome(int biomeId);
|
|
|
|
@Override
|
|
public int[] getInts(final int x, final int z, final int width, final int length) {
|
|
final int[] inputBiomeIDs = parent.getInts(x - 1, z - 1, width + 2, length + 2);
|
|
final int[] outputBiomeIDs = IntCache.getIntCache(width * length);
|
|
for (int xIter = 0; xIter < width; ++xIter) {
|
|
for (int zIter = 0; zIter < length; ++zIter) {
|
|
initChunkSeed(xIter + x, zIter + z);
|
|
final int currentBiomeId = inputBiomeIDs[xIter + 1 + (zIter + 1) * (width + 2)];
|
|
if (canReplaceBiome(currentBiomeId) && SimplexNoise.noise((xIter + x + xOffset) * noiseScale, (zIter + z + zOffset) * noiseScale) > noiseThreshold) {
|
|
outputBiomeIDs[xIter + zIter * width] = newBiomeId;
|
|
// System.out.printf("Replaced Biome at %d, %d\n", xIter + x, zIter + z);
|
|
} else {
|
|
outputBiomeIDs[xIter + zIter * width] = currentBiomeId;
|
|
}
|
|
}
|
|
}
|
|
return outputBiomeIDs;
|
|
}
|
|
}
|