/** * Copyright (c) 2011-2015, SpaceToad and the BuildCraft Team * http://www.mod-buildcraft.com * <p/> * 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; } }