Package net.glowstone.generator.decorators

Source Code of net.glowstone.generator.decorators.FlowerDecorator

package net.glowstone.generator.decorators;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;

public class FlowerDecorator extends BlockDecorator {

    private final List<FlowerDecoration> defaultFlowers = new ArrayList<FlowerDecoration>();
    private final Map<Biome, List<FlowerDecoration>> biomesFlowers = new HashMap<Biome, List<FlowerDecoration>>();

    public final FlowerDecorator setDefaultFlowerWeight(int weight, Flower flower) {
        defaultFlowers.add(new FlowerDecoration(flower, weight));
        return this;
    }

    public final FlowerDecorator setFlowerWeight(int weight, Flower flower, Biome... biomes) {
        for (Biome biome : biomes) {
            if (biomesFlowers.containsKey(biome)) {
                biomesFlowers.get(biome).add(new FlowerDecoration(flower, weight));
            } else {
                final List<FlowerDecoration> decorations = new ArrayList<FlowerDecoration>();
                decorations.add(new FlowerDecoration(flower, weight));
                biomesFlowers.put(biome, decorations);
            }
        }
        return this;
    }

    @Override
    public void decorate(World world, Random random, Chunk source) {
        int sourceX = (source.getX() << 4) + random.nextInt(16);
        int sourceZ = (source.getZ() << 4) + random.nextInt(16);
        int sourceY = random.nextInt(world.getHighestBlockYAt(sourceX, sourceZ+ 32);

        // the flower can change on each decoration pass
        Flower flower = null;
        final Biome biome = world.getBiome(sourceX, sourceZ);
        if (biomesFlowers.containsKey(biome)) {
            flower = getRandomFlower(random, biomesFlowers.get(biome));
        } else {
            flower = getRandomFlower(random, defaultFlowers);
        }
        if (flower == null) {
            return;
        }

        for (int i = 0; i < 64; i++) {
            int x = sourceX + random.nextInt(8) - random.nextInt(8);
            int z = sourceZ + random.nextInt(8) - random.nextInt(8);
            int y = sourceY + random.nextInt(4) - random.nextInt(4);

            if (y < 255 && world.getBlockAt(x, y, z).getType() == Material.AIR &&
                    world.getBlockAt(x, y - 1, z).getType() == Material.GRASS) {
                if (flower.isDoublePlant() && world.getBlockAt(x, y + 1, z).getType() != Material.AIR) {
                    continue;
                }
                final Block block = world.getBlockAt(x, y, z);
                block.setType(flower.getType());
                block.setData((byte) flower.getData());
                if (flower.isDoublePlant()) {
                    world.getBlockAt(x, y + 1, z).setType(flower.getType());
                    world.getBlockAt(x, y + 1, z).setData((byte) 8);
                }
            }
        }
    }

    private Flower getRandomFlower(Random random, List<FlowerDecoration> decorations) {
        int totalWeight = 0;
        for (FlowerDecoration decoration : decorations) {
            totalWeight += decoration.getWeigth();
        }
        int weight = random.nextInt(totalWeight);
        for (FlowerDecoration decoration : decorations) {
            weight -= decoration.getWeigth();
            if (weight < 0) {
                return decoration.getFlower();
            }
        }
        return null;
    }

    public static enum Flower {

        DANDELION(Material.YELLOW_FLOWER, 0),
        POPPY(Material.RED_ROSE, 0),
        BLUE_ORCHID(Material.RED_ROSE, 1),
        ALLIUM(Material.RED_ROSE, 2),
        HOUSTONIA(Material.RED_ROSE, 3),
        TULIP_RED(Material.RED_ROSE, 4),
        TULIP_ORANGE(Material.RED_ROSE, 5),
        TULIP_WHITE(Material.RED_ROSE, 6),
        TULIP_PINK(Material.RED_ROSE, 7),
        OXEYE_DAISY(Material.RED_ROSE, 8),

        SUNFLOWER(Material.DOUBLE_PLANT, 0, true),
        LILAC(Material.DOUBLE_PLANT, 1, true),
        ROSE_BUSH(Material.DOUBLE_PLANT, 4, true),
        PEONIA(Material.DOUBLE_PLANT, 5, true);

        private final Material type;
        private final int data;
        private final boolean doublePlant;

        private Flower(Material type, int data) {
            this(type, data, false);
        }

        private Flower(Material type, int data, boolean doublePlant) {
            this.type = type;
            this.data = data;
            this.doublePlant = doublePlant;
        }

        public Material getType() {
            return type;
        }

        public int getData() {
            return data;
        }

        public boolean isDoublePlant() {
            return doublePlant;
        }
    }

    public static class FlowerDecoration {

        private final Flower flower;
        private final int weight;

        public FlowerDecoration(Flower flower, int weight) {
            this.flower = flower;
            this.weight = weight;
        }

        public Flower getFlower() {
            return flower;
        }

        public int getWeigth() {
            return weight;
        }
    }
}
TOP

Related Classes of net.glowstone.generator.decorators.FlowerDecorator

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.