Package net.glowstone.generator.populators

Source Code of net.glowstone.generator.populators.LakePopulator

package net.glowstone.generator.populators;

import org.bukkit.Chunk;
import org.bukkit.ChunkSnapshot;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.util.BlockVector;
import org.bukkit.util.Vector;

import java.util.ArrayList;
import java.util.Random;

/**
* BlockPopulator that generates water and lava lakes.
*/
public class LakePopulator extends BlockPopulator {

    @Override
    public void populate(World world, Random random, Chunk source) {
        if (random.nextInt(10) > 1) {
            return;
        }

        ChunkSnapshot snapshot = source.getChunkSnapshot();

        int rx16 = random.nextInt(16);
        int rx = (source.getX() << 4) + rx16;
        int rz16 = random.nextInt(16);
        int rz = (source.getZ() << 4) + rz16;
        if (snapshot.getHighestBlockYAt(rx16, rz16) < 4) {
            return;
        }
        int ry = 6 + random.nextInt(snapshot.getHighestBlockYAt(rx16, rz16) - 3);
        int radius = 2 + random.nextInt(3);

        Material liquidMaterial = Material.LAVA;
        Material solidMaterial = Material.OBSIDIAN;

        if (random.nextInt(10) < 3) {
            ry = snapshot.getHighestBlockYAt(rx16, rz16) - 1;
        }
        if (random.nextInt(96) < ry && world.getEnvironment() != Environment.NETHER) {
            liquidMaterial = Material.WATER;
            solidMaterial = Material.WATER;
        } else if (world.getBlockAt(rx, ry, rz).getBiome() == Biome.FOREST) {
            return;
        }

        ArrayList<Block> lakeBlocks = new ArrayList<>();
        for (int i = -1; i < 4; i++) {
            Vector center = new BlockVector(rx, ry - i, rz);
            for (int x = -radius; x <= radius; x++) {
                for (int z = -radius; z <= radius; z++) {
                    Vector position = center.clone().add(new Vector(x, 0, z));
                    if (center.distance(position) <= radius + 0.5 - i) {
                        lakeBlocks.add(world.getBlockAt(position.toLocation(world)));
                    }
                }
            }
        }

        for (Block block : lakeBlocks) {
            // Ensure it's not air or liquid already
            if (!block.isEmpty() && !block.isLiquid()) {
                if (block.getY() == ry + 1) {
                    if (random.nextBoolean()) {
                        block.setType(Material.AIR);
                    }
                } else if (block.getY() == ry) {
                    block.setType(Material.AIR);
                } else if (random.nextInt(10) > 1) {
                    block.setType(liquidMaterial);
                } else {
                    block.setType(solidMaterial);
                }
            }
        }
    }
   
}
TOP

Related Classes of net.glowstone.generator.populators.LakePopulator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.