/** * TODO Returns a context that should be placed on this coordinate * * <p>I'm not sure how to implement it atm, using the vanilla biomes would be an option. Or * generate my own Voroni Noise ( https://forums.bukkit.org/threads/wgen-voronoi-noise.161319/ , * http://shaneosullivan.wordpress.com/2007/04/05/fortunes-sweep-line-voronoi-algorithm-implemented-in-java/ * ) * * @param chunkX chunkSizeX coordinate * @param chunkZ chunkSizeZ coordinate * @return a Context to place there */ public ContextType getContext(long seed, int chunkX, int chunkZ, GridRandom random) { SimplexOctaveGenerator gen1 = new SimplexOctaveGenerator(seed, 2); SimplexOctaveGenerator gen2 = new SimplexOctaveGenerator(seed, 2); double holeScale = 0.03; double maxHeight = gen1.noise(chunkX * holeScale, chunkZ * holeScale, 0.3D, 0.6D, true); double altscale = 0.1; double alternate = gen2.noise(chunkX * altscale, chunkZ * altscale, 0.3D, 0.6D, true); // VoronoiGenerator gen1 = new VoronoiGenerator(seed, (short) 2); // double frequency = 0.1; // the reciprocal of the distance between points // int size = 2; // double maxHeight = gen1.noise((chunkX+1600)/size, (chunkZ+1600)/size, frequency); if (maxHeight < -0.3) { return ContextType.RESIDENTIAL; } else if (maxHeight < 0.2) { if (alternate > 0.4) { return ContextType.INDUSTRIAL; } else { return ContextType.LOWRISE; } } else if (maxHeight < 0.5) { return ContextType.MIDRISE; } else { return ContextType.HIGHRISE; } }
// Generate a chunk @Override public byte[] generate(World world, Random rand, int chunkx, int chunkz) { // Create a byte variable to write the chunk inside and return this variable byte[] result = new byte[32768]; // This will set the whole floor to stone (the floor of each chunk) for (int y = 30 + 3; y > 0; y--) for (int x = 0; x < 16; x++) for (int z = 0; z < 16; z++) result[xyzToByte(x, y, z)] = (byte) Material.STONE.getId(); // Set the lowest layer to bedrock for (int x = 0; x < 16; x++) for (int z = 0; z < 16; z++) result[xyzToByte(x, 0, z)] = (byte) Material.BEDROCK.getId(); // The layers for each 5 rooms in the variable y for (int y = 30; y < 30 + (7 * 6); y += 6) { // The 4 rooms on each layer saved in the variables x and z for (int x = 0; x < 16; x += 8) { for (int z = 0; z < 16; z += 8) { int xr = (rand.nextInt(3) - 1) * (x + 7); int zr = (rand.nextInt(3) - 1) * (z + 7); int yfloor = rand.nextInt(2); // All the y of the room in the variable y2 for (int y2 = y + yfloor; y2 < y + 8; y2++) { // All the x of the room in the variable x2 for (int x2 = x; x2 < x + 8; x2++) { // All the z of the room in the variable z2 for (int z2 = z; z2 < z + 8; z2++) { // Make the bottom of the room if (y2 == y + yfloor) for (int xb = x; xb < x + 8; xb++) for (int zb = z; zb < z + 8; zb++) result[xyzToByte(xb, y2, zb)] = (byte) Material.COBBLESTONE.getId(); // Fill the walls of the place with cobblestone if ((x2 == x || x2 == x + 7) && (z2 == z || z2 == z + 7)) result[xyzToByte(x2, y2, z2)] = (byte) 98; else if (xr == x2) result[xyzToByte(x2, y2, z2)] = (byte) 98; else if (zr == z2) result[xyzToByte(x2, y2, z2)] = (byte) 98; else result[xyzToByte(x2, y2, z2)] = (byte) Material.AIR.getId(); } } } } } } // Create the nose generator which generates wave formes to use for the surface. Random random = new Random(world.getSeed()); SimplexOctaveGenerator octave = new SimplexOctaveGenerator(random, 8); octave.setScale(1 / 48.0); // Generate the ceiling and the grass land for (int x = 0; x < 16; x++) { for (int z = 0; z < 16; z++) { /*int height = getHeight(world, chunkx + x * 0.0625, chunkz + z * 0.0625, 2) + 30+(7*6) + 7;*/ double height = octave.noise(x + chunkx * 16, z + chunkz * 16, 0.5, 0.5) * 4 + 9; result[xyzToByte(x, 30 + (7 * 6), z)] = (byte) Material.COBBLESTONE.getId(); for (int y = 30 + (7 * 6) + 1; y < 30 + (7 * 6) + 4; y++) result[xyzToByte(x, y, z)] = (byte) Material.STONE.getId(); // Get the current biome Biome biome = world.getBiome((chunkx * 16) + x, (chunkz * 16) + z); if (biome.equals(Biome.DESERT) || biome.equals(Biome.DESERT_HILLS)) { for (int y = 30 + (7 * 6) + 4; y < 30 + (7 * 6) + 2 + height; y++) result[xyzToByte(x, y, z)] = (byte) Material.SAND.getId(); } else if (biome.equals(Biome.MUSHROOM_ISLAND) || biome.equals(Biome.MUSHROOM_ISLAND)) { for (int y = 30 + (7 * 6) + 4; y < 30 + (7 * 6) + 2 + height; y++) result[xyzToByte(x, y, z)] = (byte) Material.DIRT.getId(); result[xyzToByte(x, (int) (30 + (7 * 6) + 2 + height), z)] = (byte) Material.MYCEL.getId(); } else { for (int y = 30 + (7 * 6) + 4; y < 30 + (7 * 6) + 2 + height; y++) result[xyzToByte(x, y, z)] = (byte) Material.DIRT.getId(); result[xyzToByte(x, (int) (30 + (7 * 6) + 2 + height), z)] = (byte) Material.GRASS.getId(); } } } return result; }