Package extrabiomes.module.summa.worldgen

Source Code of extrabiomes.module.summa.worldgen.FlowerGenerator

/**
* This work is licensed under the Creative Commons
* Attribution-ShareAlike 3.0 Unported License. To view a copy of this
* license, visit http://creativecommons.org/licenses/by-sa/3.0/.
*/

package extrabiomes.module.summa.worldgen;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Random;

import extrabiomes.Extrabiomes;
import extrabiomes.proxy.CommonProxy;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.feature.WorldGenerator;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

import cpw.mods.fml.common.IWorldGenerator;
import extrabiomes.blocks.BlockCropBasic;
import extrabiomes.blocks.BlockCustomFlower;
import extrabiomes.blocks.BlockCustomFlower.BlockType;
import extrabiomes.helpers.LogHelper;
import extrabiomes.lib.BiomeSettings;
import extrabiomes.lib.DecorationSettings.Decoration;
import extrabiomes.lib.Element;
import extrabiomes.module.summa.biome.ExtrabiomeGenBase;

public class FlowerGenerator implements IWorldGenerator
{
  private final Map<BlockType, WorldGenerator>            flowerGens  = Maps.newHashMap();
  private final Map<BiomeSettings, List<BlockCustomFlower.BlockType>>  flowerMaps  = Maps.newHashMap();
  private final Map<Element, WorldGenerator>              cropGens  = Maps.newHashMap();

  private static FlowerGenerator                    INSTANCE;
   
  public static FlowerGenerator getInstance() {
    if (INSTANCE == null) INSTANCE = new FlowerGenerator();
    return INSTANCE;
  }

  private FlowerGenerator()
    {
    registerFlower(BiomeSettings.ALPINE, BlockType.BLUE_POPPY);
    registerFlower(BiomeSettings.ALPINE, BlockType.HYDRANGEA);
    registerFlower(BiomeSettings.ALPINE, BlockType.IRIS_BLUE);
    registerFlower(BiomeSettings.ALPINE, BlockType.IRIS_PURPLE);
    registerFlower(BiomeSettings.ALPINE, BlockType.PANSY);
    registerFlower(BiomeSettings.ALPINE, BlockType.VIOLET);

    registerFlower(BiomeSettings.AUTUMNWOODS, BlockType.ALLIUM);
    registerFlower(BiomeSettings.AUTUMNWOODS, BlockType.REDROVER);

    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.ALLIUM);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.BLUEBELL);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.BUTTERCUP);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.DAISY);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.DANDELION);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.HYDRANGEA);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.PANSY);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.REDROVER);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.TULIP);
    registerFlower(BiomeSettings.BIRCHFOREST, BlockType.VIOLET);

    registerFlower(BiomeSettings.EXTREMEJUNGLE, BlockType.BELLADONNA);
    registerFlower(BiomeSettings.EXTREMEJUNGLE, BlockType.GARDENIA);
    registerFlower(BiomeSettings.EXTREMEJUNGLE, BlockType.GERBERA_ORANGE);
    registerFlower(BiomeSettings.EXTREMEJUNGLE, BlockType.GERBERA_PINK);
    registerFlower(BiomeSettings.EXTREMEJUNGLE, BlockType.GERBERA_RED);
    registerFlower(BiomeSettings.EXTREMEJUNGLE, BlockType.GERBERA_YELLOW);
    registerFlower(BiomeSettings.EXTREMEJUNGLE, BlockType.ORIENTAL_PINK_LILY);

    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.ALLIUM);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.BLUEBELL);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.DAISY);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.DANDELION);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.HYDRANGEA);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.IRIS_BLUE);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.IRIS_PURPLE);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.LAVENDER);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.LILY);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.ORIENTAL_PINK_LILY);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.TULIP);
    registerFlower(BiomeSettings.FORESTEDHILLS, BlockType.VIOLET);

    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.ALLIUM);
    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.BLUE_POPPY);
    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.DAISY);
    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.DANDELION);
    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.IRIS_BLUE);
    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.IRIS_PURPLE);
    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.LAVENDER);
    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.LILY);
    registerFlower(BiomeSettings.FORESTEDISLAND, BlockType.ORIENTAL_PINK_LILY);

    registerFlower(BiomeSettings.GREENHILLS, BlockType.ALLIUM);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.BACHELORS_BUTTON);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.BLUEBELL);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.BLUE_POPPY);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.DAISY);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.DANDELION);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.IRIS_BLUE);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.IRIS_PURPLE);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.LILY);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.ORIENTAL_PINK_LILY);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.TULIP);
    registerFlower(BiomeSettings.GREENHILLS, BlockType.VIOLET);

    registerFlower(BiomeSettings.GREENSWAMP, BlockType.ALLIUM);
    registerFlower(BiomeSettings.GREENSWAMP, BlockType.BELLADONNA);
    registerFlower(BiomeSettings.GREENSWAMP, BlockType.BLUE_POPPY);
    registerFlower(BiomeSettings.GREENSWAMP, BlockType.BUTTERCUP);
    registerFlower(BiomeSettings.GREENSWAMP, BlockType.DAISY);
    registerFlower(BiomeSettings.GREENSWAMP, BlockType.DANDELION);
    //registerFlower(BiomeSettings.GREENSWAMP, BlockType.EELGRASS);
    registerFlower(BiomeSettings.GREENSWAMP, BlockType.LILY);
    registerFlower(BiomeSettings.GREENSWAMP, BlockType.MARSH_MARIGOLD);
    registerFlower(BiomeSettings.GREENSWAMP, BlockType.ORIENTAL_PINK_LILY);

    registerFlower(BiomeSettings.MEADOW, BlockType.ALLIUM);
    registerFlower(BiomeSettings.MEADOW, BlockType.BACHELORS_BUTTON);
    registerFlower(BiomeSettings.MEADOW, BlockType.BUTTERCUP);
    registerFlower(BiomeSettings.MEADOW, BlockType.DAISY);
    registerFlower(BiomeSettings.MEADOW, BlockType.DANDELION);
    registerFlower(BiomeSettings.MEADOW, BlockType.GERBERA_ORANGE);
    registerFlower(BiomeSettings.MEADOW, BlockType.GERBERA_PINK);
    registerFlower(BiomeSettings.MEADOW, BlockType.GERBERA_RED);
    registerFlower(BiomeSettings.MEADOW, BlockType.GERBERA_YELLOW);
    registerFlower(BiomeSettings.MEADOW, BlockType.HYDRANGEA);
    registerFlower(BiomeSettings.MEADOW, BlockType.POPPY);
    registerFlower(BiomeSettings.MEADOW, BlockType.YARROW);

    registerFlower(BiomeSettings.MINIJUNGLE, BlockType.BELLADONNA);
    registerFlower(BiomeSettings.MINIJUNGLE, BlockType.BLUE_POPPY);
    registerFlower(BiomeSettings.MINIJUNGLE, BlockType.GARDENIA);
    registerFlower(BiomeSettings.MINIJUNGLE, BlockType.GERBERA_ORANGE);
    registerFlower(BiomeSettings.MINIJUNGLE, BlockType.GERBERA_PINK);
    registerFlower(BiomeSettings.MINIJUNGLE, BlockType.GERBERA_RED);
    registerFlower(BiomeSettings.MINIJUNGLE, BlockType.GERBERA_YELLOW);
    registerFlower(BiomeSettings.MINIJUNGLE, BlockType.ORIENTAL_PINK_LILY);

    registerFlower(BiomeSettings.MOUNTAINTAIGA, BlockType.PANSY);

    registerFlower(BiomeSettings.PINEFOREST, BlockType.BLUEBELL);
    registerFlower(BiomeSettings.PINEFOREST, BlockType.BUTTERCUP);
    registerFlower(BiomeSettings.PINEFOREST, BlockType.PANSY);
    registerFlower(BiomeSettings.PINEFOREST, BlockType.REDROVER);
    registerFlower(BiomeSettings.PINEFOREST, BlockType.TULIP);
    registerFlower(BiomeSettings.PINEFOREST, BlockType.VIOLET);

    registerFlower(BiomeSettings.RAINFOREST, BlockType.BELLADONNA);
    registerFlower(BiomeSettings.RAINFOREST, BlockType.GARDENIA);
    registerFlower(BiomeSettings.RAINFOREST, BlockType.GERBERA_ORANGE);
    registerFlower(BiomeSettings.RAINFOREST, BlockType.GERBERA_PINK);
    registerFlower(BiomeSettings.RAINFOREST, BlockType.GERBERA_RED);
    registerFlower(BiomeSettings.RAINFOREST, BlockType.GERBERA_YELLOW);
    registerFlower(BiomeSettings.RAINFOREST, BlockType.ORIENTAL_PINK_LILY);

    registerFlower(BiomeSettings.REDWOODLUSH, BlockType.BLUEBELL);
    registerFlower(BiomeSettings.REDWOODLUSH, BlockType.TULIP);
    registerFlower(BiomeSettings.REDWOODLUSH, BlockType.VIOLET);

    registerFlower(BiomeSettings.SAVANNA, BlockType.ALLIUM);
    registerFlower(BiomeSettings.SAVANNA, BlockType.AMARYLLIS_PINK);
    registerFlower(BiomeSettings.SAVANNA, BlockType.AMARYLLIS_RED);
    registerFlower(BiomeSettings.SAVANNA, BlockType.AMARYLLIS_WHITE);
    registerFlower(BiomeSettings.SAVANNA, BlockType.BELLS_OF_IRELAND);
    registerFlower(BiomeSettings.SAVANNA, BlockType.CALLA_BLACK);
    registerFlower(BiomeSettings.SAVANNA, BlockType.CALLA_WHITE);
    registerFlower(BiomeSettings.SAVANNA, BlockType.DAISY);
    registerFlower(BiomeSettings.SAVANNA, BlockType.DANDELION);
    registerFlower(BiomeSettings.SAVANNA, BlockType.GERBERA_ORANGE);
    registerFlower(BiomeSettings.SAVANNA, BlockType.GERBERA_PINK);
    registerFlower(BiomeSettings.SAVANNA, BlockType.GERBERA_RED);
    registerFlower(BiomeSettings.SAVANNA, BlockType.GERBERA_YELLOW);
    registerFlower(BiomeSettings.SAVANNA, BlockType.HYDRANGEA);
    registerFlower(BiomeSettings.SAVANNA, BlockType.LAVENDER);
    registerFlower(BiomeSettings.SAVANNA, BlockType.POPPY);
    registerFlower(BiomeSettings.SAVANNA, BlockType.SNAPDRAGON);
    registerFlower(BiomeSettings.SAVANNA, BlockType.YARROW);

    registerFlower(BiomeSettings.SHRUBLAND, BlockType.ALLIUM);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.BACHELORS_BUTTON);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.BLUEBELL);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.DAISY);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.DANDELION);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.GERBERA_ORANGE);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.GERBERA_PINK);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.GERBERA_RED);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.GERBERA_YELLOW);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.HYDRANGEA);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.SNAPDRAGON);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.TULIP);
    registerFlower(BiomeSettings.SHRUBLAND, BlockType.YARROW);

    registerFlower(BiomeSettings.WOODLANDS, BlockType.ALLIUM);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.BACHELORS_BUTTON);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.BLUEBELL);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.BLUE_POPPY);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.DAISY);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.DANDELION);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.IRIS_BLUE);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.IRIS_PURPLE);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.LAVENDER);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.LILY);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.ORIENTAL_PINK_LILY);
    registerFlower(BiomeSettings.WOODLANDS, BlockType.TULIP);
    }
   
  public void registerBlock(Block block, Collection<BlockType> types) {
    for( BlockCustomFlower.BlockType type : types ) {
      // special cases
      final WorldGenerator gen;
      switch( type ) {
        case ROOT:
          gen = new WorldGenRoot(block, type.metadata());
          break;
        case TINY_CACTUS:
          gen = new WorldGenTinyCactus(block, type.metadata());
          break;
        default:
          gen = new WorldGenMetadataFlowers(block, type.metadata());
      }
      flowerGens.put(type, gen);
    }
  }

  // special gen for wild crops
  public void registerCrop(Element element) {
    if (element.isPresent()) {
      final WorldGenerator gen = new WorldGenMetadataFlowers(
          Block.getBlockFromItem(element.get().getItem()), BlockCropBasic.MAX_GROWTH_STAGE);
      cropGens.put(element, gen);
    }
  }

  protected void registerFlower(BiomeSettings settings, BlockType type) {
    if (!settings.getBiome().isPresent()) return;

        BiomeGenBase biome = settings.getBiome().get();
        final CommonProxy proxy = Extrabiomes.proxy;
        proxy.addGrassPlant(type.block(), type.metadata(), type.weight(), biome);

    final List<BlockType> list;
    if (flowerMaps.containsKey(settings)) {
      list = flowerMaps.get(settings);
    } else {
      list = Lists.newArrayList();
      flowerMaps.put(settings, list);
    }
    list.add(type);
  }
   
  protected int applyGenerator(BlockType type, World world, int chunkX, int chunkZ, Random rand, int times) {
    final WorldGenerator gen = flowerGens.get(type);
    int count = 0;
    if (gen != null) {
      for (int i = 0; i < times; ++i) {
        final int x = chunkX + rand.nextInt(16) + 8;
        final int y = rand.nextInt(128);
        final int z = chunkZ + rand.nextInt(16) + 8;
        if (gen.generate(world, rand, x, y, z)) ++count;
      }
    }
    return count;
  }

  protected boolean applyGenerator(BlockType type, World world, int chunkX, int chunkZ, Random rand) {
    final WorldGenerator gen = flowerGens.get(type);
    if (gen != null) {
      return applyGenerator(gen, world, chunkX, chunkZ, rand);
    }
    return false;
  }

  protected boolean applyGenerator(WorldGenerator gen, World world, int chunkX, int chunkZ, Random rand) {
    if (gen != null) {
      final int x = chunkX + rand.nextInt(16) + 8;
      final int y = rand.nextInt(128);
      final int z = chunkZ + rand.nextInt(16) + 8;
      return gen.generate(world, rand, x, y, z);
    }
    return false;
  }


  protected boolean biomeCheck(BiomeSettings settings, BiomeGenBase biome) {
    return settings.getBiome().isPresent()
        && biome == settings.getBiome().get();
  }

    @Override
    public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkProvider chunkGenerator, IChunkProvider chunkProvider)
    {
        chunkX = chunkX << 4;
        chunkZ = chunkZ << 4;
        final BiomeGenBase biome = world.getBiomeGenForCoords(chunkX, chunkZ);
       
    final BiomeSettings settings = BiomeSettings.findBiomeSettings(biome.biomeID);
    if (settings != null && biomeCheck(settings, biome) && flowerMaps.containsKey(settings)) {
      final ExtrabiomeGenBase eBiome = (ExtrabiomeGenBase)biome;
      final int maxFlowers = eBiome.getDecorationSettings().getSetting(Decoration.NEW_FLOWERS);
      if( maxFlowers > 0 ) {
        List<BlockType> map = flowerMaps.get(settings);
        //LogHelper.finer("[FG] "+eBiome.getDecorationSettings()+" = "+maxFlowers+", "+map.size()+" varieties");
        for (int flowers = 0; flowers < maxFlowers; ++flowers) {
          final int idx = rand.nextInt(map.size());
          final BlockType type = map.get(idx);
          //LogHelper.finest("[FG] "+eBiome.biomeName+" > "+flowers+"/"+maxFlowers+" = "+type);
          applyGenerator(type, world, chunkX, chunkZ, rand);
        }
      }
    }

    // //////// nonstandard flowers //////////

    if (biomeCheck(BiomeSettings.MOUNTAINDESERT, biome)
        || biomeCheck(BiomeSettings.MOUNTAINRIDGE, biome)) {
      applyGenerator(BlockType.TINY_CACTUS, world, chunkX, chunkZ, rand, 64);
    }

    if (biomeCheck(BiomeSettings.AUTUMNWOODS, biome)
        || biomeCheck(BiomeSettings.PINEFOREST, biome)
        || biomeCheck(BiomeSettings.TEMPORATERAINFOREST, biome)) {
      applyGenerator(BlockType.TOADSTOOL, world, chunkX, chunkZ, rand, 2);
    }

    if (biomeCheck(BiomeSettings.GREENHILLS, biome)
        || biomeCheck(BiomeSettings.FORESTEDHILLS, biome)
        || biomeCheck(BiomeSettings.FORESTEDISLAND, biome)
        || biomeCheck(BiomeSettings.BIRCHFOREST, biome)
        || biomeCheck(BiomeSettings.PINEFOREST, biome)
        || biomeCheck(BiomeSettings.MEADOW, biome)
        || biomeCheck(BiomeSettings.WOODLANDS, biome)) {
      final WorldGenerator gen = cropGens.get(Element.PLANT_STRAWBERRY);
      for (int x = 0; x < 4; ++x)
        applyGenerator(gen, world, chunkX, chunkZ, rand);
    }
    }
}
TOP

Related Classes of extrabiomes.module.summa.worldgen.FlowerGenerator

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.