Helper for custom biomes
This commit is contained in:
parent
5779ba020e
commit
0b2e45d2a2
3 changed files with 291 additions and 17 deletions
231
src/java/mmm/world/WBiomeHelper.java
Normal file
231
src/java/mmm/world/WBiomeHelper.java
Normal file
|
@ -0,0 +1,231 @@
|
|||
package mmm.world;
|
||||
|
||||
|
||||
import java.util.EnumMap;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraftforge.common.BiomeDictionary;
|
||||
import net.minecraftforge.common.BiomeManager;
|
||||
import net.minecraftforge.common.BiomeManager.BiomeType;
|
||||
import net.minecraftforge.fml.common.registry.GameRegistry;
|
||||
|
||||
|
||||
|
||||
public class WBiomeHelper
|
||||
{
|
||||
|
||||
private static final String BIOME_REG_BASE = "mmm:biome/";
|
||||
|
||||
private final Function< WBiomeHelper , ? extends Biome > constructor;
|
||||
|
||||
private String name;
|
||||
private String regPath;
|
||||
private String mutationBase;
|
||||
private float baseHeight;
|
||||
private float heightVariation;
|
||||
private float rainfall;
|
||||
private float temperature;
|
||||
private int waterColor = 0xffffff;
|
||||
private final EnumMap< BiomeType , Integer > biomeTypes = new EnumMap<>( BiomeType.class );
|
||||
private EnumMap< BiomeDictionary.Type , BiomeDictionary.Type > bdTags;
|
||||
private final HashMap< String , Object > extra = new HashMap<>( );
|
||||
|
||||
private Biome.BiomeProperties cachedProperties;
|
||||
|
||||
|
||||
public WBiomeHelper( final Function< WBiomeHelper , ? extends Biome > constructor )
|
||||
{
|
||||
this.constructor = constructor;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper startMutation( )
|
||||
{
|
||||
this.mutationBase = WBiomeHelper.BIOME_REG_BASE + this.regPath;
|
||||
this.cachedProperties = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper clearMutation( )
|
||||
{
|
||||
this.mutationBase = null;
|
||||
this.cachedProperties = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper setNames( final String name , final String regPath )
|
||||
{
|
||||
this.name = name;
|
||||
this.regPath = regPath;
|
||||
this.cachedProperties = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper setElevation( final float baseHeight , final float variation )
|
||||
{
|
||||
this.baseHeight = baseHeight;
|
||||
this.heightVariation = variation;
|
||||
this.cachedProperties = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper setWeather( final float rainfall , final float temperature )
|
||||
{
|
||||
this.rainfall = rainfall;
|
||||
this.temperature = temperature;
|
||||
this.cachedProperties = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper setWaterColor( final int filter )
|
||||
{
|
||||
this.waterColor = filter;
|
||||
this.cachedProperties = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper setType( final BiomeType biomeType , final int weight )
|
||||
{
|
||||
if ( weight > 0 ) {
|
||||
this.biomeTypes.put( biomeType , weight );
|
||||
} else {
|
||||
this.biomeTypes.remove( biomeType );
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper clearTags( )
|
||||
{
|
||||
this.bdTags = null;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper setTags( final BiomeDictionary.Type... tags )
|
||||
{
|
||||
if ( this.bdTags == null ) {
|
||||
this.bdTags = new EnumMap<>( BiomeDictionary.Type.class );
|
||||
}
|
||||
for ( final BiomeDictionary.Type tag : tags ) {
|
||||
this.bdTags.put( tag , tag );
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper removeTags( final BiomeDictionary.Type... tags )
|
||||
{
|
||||
if ( this.bdTags == null ) {
|
||||
return this;
|
||||
}
|
||||
for ( final BiomeDictionary.Type tag : tags ) {
|
||||
this.bdTags.remove( tag );
|
||||
}
|
||||
if ( this.bdTags.isEmpty( ) ) {
|
||||
this.bdTags = null;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper setExtraProperty( final String name )
|
||||
{
|
||||
this.extra.put( name , name );
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper setExtraProperty( final String name , final Object value )
|
||||
{
|
||||
this.extra.put( name , value );
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public WBiomeHelper removeExtraProperty( final String name )
|
||||
{
|
||||
this.extra.remove( name );
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
public boolean hasExtraProperty( final String name )
|
||||
{
|
||||
return this.extra.containsKey( name );
|
||||
}
|
||||
|
||||
|
||||
public < T > T getExtraProperty( final String name , final Class< T > cls )
|
||||
{
|
||||
return this.getExtraProperty( name , cls , null );
|
||||
}
|
||||
|
||||
|
||||
public < T > T getExtraProperty( final String name , final Class< T > cls , final T defaultValue )
|
||||
{
|
||||
final Object value = this.extra.get( name );
|
||||
if ( value == null ) {
|
||||
return defaultValue;
|
||||
}
|
||||
return cls.cast( value );
|
||||
}
|
||||
|
||||
|
||||
public Biome.BiomeProperties getProperties( )
|
||||
{
|
||||
if ( this.cachedProperties != null ) {
|
||||
return this.cachedProperties;
|
||||
}
|
||||
|
||||
final Biome.BiomeProperties rv = new Biome.BiomeProperties( this.name ) //
|
||||
.setBaseHeight( this.baseHeight ) //
|
||||
.setHeightVariation( this.heightVariation ) //
|
||||
.setRainfall( this.rainfall ) //
|
||||
.setTemperature( this.temperature ) //
|
||||
.setWaterColor( this.waterColor ) //
|
||||
;
|
||||
|
||||
if ( this.mutationBase != null ) {
|
||||
rv.setBaseBiome( this.mutationBase );
|
||||
}
|
||||
if ( this.temperature <= .1f ) {
|
||||
rv.setSnowEnabled( );
|
||||
}
|
||||
if ( this.rainfall == 0 ) {
|
||||
rv.setRainDisabled( );
|
||||
}
|
||||
this.cachedProperties = rv;
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
public Biome register( )
|
||||
{
|
||||
final Biome biome = this.constructor.apply( this );
|
||||
biome.setRegistryName( WBiomeHelper.BIOME_REG_BASE + this.regPath );
|
||||
this.cachedProperties = null;
|
||||
GameRegistry.register( biome );
|
||||
for ( final Map.Entry< BiomeType , Integer > entry : this.biomeTypes.entrySet( ) ) {
|
||||
BiomeManager.addBiome( entry.getKey( ) , new BiomeManager.BiomeEntry( biome , entry.getValue( ) ) );
|
||||
}
|
||||
if ( this.bdTags == null ) {
|
||||
BiomeDictionary.makeBestGuess( biome );
|
||||
} else {
|
||||
for ( final BiomeDictionary.Type tag : this.bdTags.keySet( ) ) {
|
||||
BiomeDictionary.registerBiomeType( biome , tag );
|
||||
}
|
||||
}
|
||||
return biome;
|
||||
}
|
||||
|
||||
}
|
|
@ -49,15 +49,34 @@ public class World
|
|||
BiomeManager.addBiome( BiomeType.WARM , new BiomeManager.BiomeEntry( BIOME_LIMESTONE_HILLS_EDGE , 5 ) );
|
||||
BiomeDictionary.makeBestGuess( World.BIOME_LIMESTONE_HILLS_EDGE );
|
||||
|
||||
// TEST REMOVE THIS XXX FIXME LOL
|
||||
WBLimestonePlateau testLol = new WBLimestonePlateau( false ,
|
||||
( new Biome.BiomeProperties( "LOL TEST" ) ).setBaseHeight( 0.5F ).setHeightVariation( 0.02F )
|
||||
.setTemperature( 0.8F ).setRainfall( 0.4F ).setWaterColor( 0xe0ff7f ) );
|
||||
testLol.setRegistryName( "mmm:test_lol" );
|
||||
GameRegistry.register( testLol );
|
||||
BiomeManager.addBiome( BiomeType.COOL , new BiomeManager.BiomeEntry( testLol , 25 ) );
|
||||
BiomeManager.addBiome( BiomeType.WARM , new BiomeManager.BiomeEntry( testLol , 25 ) );
|
||||
BiomeDictionary.makeBestGuess( testLol );
|
||||
WBiomeHelper helper = new WBiomeHelper( WBLimestonePlateau::new );
|
||||
helper.setNames( "Limestone Plateau" , "limestone_plateau" ) //
|
||||
.setElevation( .5f , .02f ) //
|
||||
.setWeather( .6f , .5f ) //
|
||||
.setWaterColor( 0xe0ff7f ) //
|
||||
.setType( BiomeType.COOL , 5 ) //
|
||||
.setType( BiomeType.WARM , 5 ) //
|
||||
.register( );
|
||||
helper.startMutation( );
|
||||
helper.setNames( "Chaotic Limestone Plateau" , "limestone_plateau/chaos" )//
|
||||
.setWeather( .8f , .5f ) //
|
||||
.setElevation( .6f , .07f ) //
|
||||
.setType( BiomeType.COOL , 1 ) //
|
||||
.setType( BiomeType.WARM , 1 ) //
|
||||
.setExtraProperty( "ChaosChance" , 4 ) //
|
||||
.register( );
|
||||
helper.setNames( "Chaotic Limestone Forest" , "limestone_plateau/chaos_forest" ) //
|
||||
.setExtraProperty( "Trees" )//
|
||||
.setType( BiomeType.COOL , 5 ) //
|
||||
.setType( BiomeType.WARM , 5 ) //
|
||||
.register( );
|
||||
helper.setNames( "Limestone Forest" , "limestone_plateau/forest" ) //
|
||||
.setElevation( .5f , .02f ) //
|
||||
.setWeather( .7f , .5f ) //
|
||||
.setType( BiomeType.COOL , 5 ) //
|
||||
.setType( BiomeType.WARM , 5 ) //
|
||||
.removeExtraProperty( "ChaosChance" )//
|
||||
.register( );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ import java.util.Random;
|
|||
|
||||
import mmm.materials.Materials;
|
||||
import mmm.world.I_WDefaultPopulateHandler;
|
||||
import mmm.world.WBiomeHelper;
|
||||
import mmm.world.gen.WGLimestoneChaos;
|
||||
import net.minecraft.block.BlockDirt;
|
||||
import net.minecraft.block.material.Material;
|
||||
|
@ -13,7 +14,10 @@ import net.minecraft.init.Blocks;
|
|||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.gen.feature.WorldGenAbstractTree;
|
||||
import net.minecraft.world.gen.feature.WorldGenLakes;
|
||||
import net.minecraft.world.gen.feature.WorldGenTaiga1;
|
||||
import net.minecraft.world.gen.feature.WorldGenTaiga2;
|
||||
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
|
||||
|
||||
|
||||
|
@ -26,26 +30,46 @@ public class WBLimestonePlateau
|
|||
BlockDirt.DirtType.COARSE_DIRT );
|
||||
private static final IBlockState BS_LIMESTONE = Materials.ROCK_LIMESTONE.getDefaultState( );
|
||||
|
||||
private static final WorldGenTaiga1 PINE_GENERATOR = new WorldGenTaiga1( );
|
||||
private static final WorldGenTaiga2 SPRUCE_GENERATOR = new WorldGenTaiga2( false );
|
||||
|
||||
private final int chaosChance;
|
||||
|
||||
|
||||
public WBLimestonePlateau( final boolean trees , final BiomeProperties properties )
|
||||
public WBLimestonePlateau( final WBiomeHelper helper )
|
||||
{
|
||||
super( properties );
|
||||
super( helper.getProperties( ) );
|
||||
|
||||
final boolean trees = helper.hasExtraProperty( "Trees" );
|
||||
if ( trees ) {
|
||||
this.theBiomeDecorator.treesPerChunk = 5;
|
||||
this.theBiomeDecorator.flowersPerChunk = 2;
|
||||
this.theBiomeDecorator.grassPerChunk = 0;
|
||||
this.theBiomeDecorator.flowersPerChunk = 4;
|
||||
this.theBiomeDecorator.grassPerChunk = 1;
|
||||
} else {
|
||||
this.theBiomeDecorator.treesPerChunk = 0;
|
||||
this.theBiomeDecorator.flowersPerChunk = 8;
|
||||
this.theBiomeDecorator.grassPerChunk = 1;
|
||||
this.theBiomeDecorator.grassPerChunk = 3;
|
||||
}
|
||||
this.theBiomeDecorator.field_189870_A = 0.1f;
|
||||
this.topBlock = Blocks.GRASS.getDefaultState( );
|
||||
this.fillerBlock = Blocks.DIRT.getDefaultState( );
|
||||
this.chaosChance = 4; // XXX
|
||||
this.chaosChance = helper.getExtraProperty( "ChaosChance" , Integer.class , 32 );
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public WorldGenAbstractTree genBigTreeChance( final Random rand )
|
||||
{
|
||||
final int rnd = rand.nextInt( 20 );
|
||||
if ( rnd < 1 ) {
|
||||
return Biome.BIG_TREE_FEATURE;
|
||||
} else if ( rnd < 5 ) {
|
||||
return Biome.TREE_FEATURE;
|
||||
} else if ( rnd < 7 ) {
|
||||
return WBLimestonePlateau.PINE_GENERATOR;
|
||||
} else {
|
||||
return WBLimestonePlateau.SPRUCE_GENERATOR;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -111,7 +135,7 @@ public class WBLimestonePlateau
|
|||
private void replaceWithLimestone( final World worldIn , final Random rand , final BlockPos.MutableBlockPos mbp )
|
||||
{
|
||||
if ( rand.nextInt( 8 ) != 0 ) {
|
||||
worldIn.setBlockState( mbp , BS_LIMESTONE );
|
||||
worldIn.setBlockState( mbp , WBLimestonePlateau.BS_LIMESTONE );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -119,7 +143,7 @@ public class WBLimestonePlateau
|
|||
private void replaceWithCoarseDirt( final World worldIn , final Random rand , final BlockPos.MutableBlockPos mbp )
|
||||
{
|
||||
if ( rand.nextInt( 16 ) == 0 ) {
|
||||
worldIn.setBlockState( mbp , BS_COARSE_DIRT );
|
||||
worldIn.setBlockState( mbp , WBLimestonePlateau.BS_COARSE_DIRT );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue