Nether coral

This commit is contained in:
Emmanuel BENOîT 2016-07-21 12:50:43 +02:00
parent e6cbf48ed8
commit 7b3e9f63d0
12 changed files with 235 additions and 13 deletions

BIN
graphics/nether-coral.xcf Normal file

Binary file not shown.

View file

@ -1,6 +1,7 @@
package mmm; package mmm;
import mmm.plants.PNetherCoral;
import mmm.plants.PTomato; import mmm.plants.PTomato;
@ -9,9 +10,11 @@ public class MmmPlants
{ {
public static final PTomato TOMATO; public static final PTomato TOMATO;
public static final PNetherCoral NETHER_CORAL;
static { static {
TOMATO = new PTomato( ); TOMATO = new PTomato( );
NETHER_CORAL = new PNetherCoral( );
} }

View file

@ -24,5 +24,8 @@ public interface I_FloraParameters
public int getPlacementAttempts( World world , BlockPos pos , Random random ); public int getPlacementAttempts( World world , BlockPos pos , Random random );
public int getSuccessfulPlacements( World world , BlockPos pos , Random random );
public boolean canPlace( World world , BlockPos pos , Random random ); public boolean canPlace( World world , BlockPos pos , Random random );
} }

View file

@ -0,0 +1,135 @@
package mmm.plants;
import java.util.List;
import mmm.core.CRegistry;
import mmm.core.api.I_FloraRegistrar;
import mmm.core.api.world.I_FloraParameters;
import mmm.world.WLocation;
import mmm.world.gen.WGFloraParameters;
import net.minecraft.block.BlockBush;
import net.minecraft.block.SoundType;
import net.minecraft.block.properties.PropertyEnum;
import net.minecraft.block.state.BlockStateContainer;
import net.minecraft.block.state.IBlockState;
import net.minecraft.creativetab.CreativeTabs;
import net.minecraft.init.Blocks;
import net.minecraft.util.IStringSerializable;
public class PNetherCoral
implements I_FloraRegistrar
{
public static enum E_Color
implements IStringSerializable {
YELLOW ,
ORANGE ,
BLUE ,
RED;
private static final E_Color[] VALUES = E_Color.values( );
public static E_Color fromMetadata( final int meta )
{
return E_Color.VALUES[ meta ];
}
@Override
public String getName( )
{
return this.toString( ).toLowerCase( );
}
public int toMetadata( )
{
return this.ordinal( );
}
}
private static final PropertyEnum< E_Color > COLOR = PropertyEnum.create( "color" , E_Color.class );
public class Plant
extends BlockBush
{
public Plant( )
{
CRegistry.setIdentifiers( this , "plant" , "block" , "nether_coral" );
this.setTickRandomly( true );
this.setCreativeTab( (CreativeTabs) null );
this.setHardness( 0f );
this.setSoundType( SoundType.PLANT );
this.lightValue = 13;
this.disableStats( );
this.setDefaultState( this.blockState.getBaseState( ) //
.withProperty( PNetherCoral.COLOR , E_Color.YELLOW ) );
}
@Override
protected BlockStateContainer createBlockState( )
{
return new BlockStateContainer( this , PNetherCoral.COLOR );
}
@Override
public IBlockState getStateFromMeta( final int meta )
{
return this.getDefaultState( ).withProperty( PNetherCoral.COLOR , E_Color.fromMetadata( meta ) );
}
@Override
public int getMetaFromState( final IBlockState state )
{
return state.getValue( PNetherCoral.COLOR ).toMetadata( );
}
@Override
protected boolean canSustainBush( final IBlockState state )
{
return state.getBlock( ) == Blocks.NETHERRACK || state.getBlock( ) == Blocks.SOUL_SAND;
}
}
public final Plant PLANT;
public PNetherCoral( )
{
CRegistry.addRegistrar( this );
CRegistry.addBlock( this.PLANT = new Plant( ) , null );
}
@Override
public void getFloraGeneration( final List< I_FloraParameters > output )
{
output.add( new WGFloraParameters( this.getPlant( E_Color.YELLOW ) , //
0.2f , WLocation.inTheNether( ) ).setSuccessfulPlacements( 16 ) );
output.add( new WGFloraParameters( this.getPlant( E_Color.RED ) , //
0.2f , WLocation.inTheNether( ) ).setSuccessfulPlacements( 16 ) );
output.add( new WGFloraParameters( this.getPlant( E_Color.ORANGE ) , //
0.1f , WLocation.inTheNether( ) ).setSuccessfulPlacements( 8 ) );
output.add( new WGFloraParameters( this.getPlant( E_Color.BLUE ) , //
0.05f , WLocation.inTheNether( ) ).setSuccessfulPlacements( 4 ) );
}
private IBlockState getPlant( final E_Color color )
{
return this.PLANT.getDefaultState( ).withProperty( PNetherCoral.COLOR , color );
}
}

View file

@ -67,10 +67,8 @@ public class WDefaultGenWatcher
@SubscribeEvent @SubscribeEvent
public void onBiomeDecorate( DecorateBiomeEvent.Decorate event ) public void onBiomeDecorate( DecorateBiomeEvent.Post event )
{ {
if ( event.getType( ) == DecorateBiomeEvent.Decorate.EventType.GRASS ) { this.floraGenerator.generate( event.getWorld( ) , event.getRand( ) , event.getPos( ) );
this.floraGenerator.generate( event.getWorld( ) , event.getRand( ) , event.getPos( ) );
}
} }
} }

View file

@ -9,7 +9,9 @@ import mmm.core.api.I_FloraRegistrar;
import mmm.core.api.world.I_BiomeWithFlora; import mmm.core.api.world.I_BiomeWithFlora;
import mmm.core.api.world.I_FloraParameters; import mmm.core.api.world.I_FloraParameters;
import net.minecraft.block.state.IBlockState; import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.DimensionType;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.feature.WorldGenerator; import net.minecraft.world.gen.feature.WorldGenerator;
@ -88,24 +90,61 @@ public class WGFlora
private void tryGeneratePlant( final World worldIn , final Random rand , BlockPos position , private void tryGeneratePlant( final World worldIn , final Random rand , BlockPos position ,
final I_FloraParameters parameters ) final I_FloraParameters parameters )
{ {
IBlockState bs = worldIn.getBlockState( position ); if ( worldIn.provider.getDimensionType( ) == DimensionType.NETHER ) {
while ( ( bs.getBlock( ).isAir( bs , worldIn , position ) position = this.findNetherPosition( worldIn , rand , position );
|| bs.getBlock( ).isLeaves( bs , worldIn , position ) ) && position.getY( ) > 0 ) { } else {
position = position.down( ); position = this.findOverwordOrEndPosition( worldIn , position );
bs = worldIn.getBlockState( position );
} }
final int attempts = parameters.getPlacementAttempts( worldIn , position , rand ); final int attempts = parameters.getPlacementAttempts( worldIn , position , rand );
int successes = parameters.getSuccessfulPlacements( worldIn , position , rand );
for ( int i = 0 ; i < attempts ; ++i ) { for ( int i = 0 ; i < attempts ; ++i ) {
final BlockPos blockpos = position.add( // final BlockPos blockpos = position.add( //
rand.nextInt( 8 ) - rand.nextInt( 8 ) , // rand.nextInt( 8 ) - rand.nextInt( 8 ) , //
rand.nextInt( 4 ) - rand.nextInt( 4 ) , // rand.nextInt( 4 ) - rand.nextInt( 4 ) , //
rand.nextInt( 8 ) - rand.nextInt( 8 ) ); rand.nextInt( 8 ) - rand.nextInt( 8 ) );
if ( parameters.canPlace( worldIn , blockpos , rand ) ) { if ( !parameters.canPlace( worldIn , blockpos , rand ) ) {
worldIn.setBlockState( blockpos , parameters.getBlockState( worldIn , blockpos , rand ) , 2 ); continue;
}
worldIn.setBlockState( blockpos , parameters.getBlockState( worldIn , blockpos , rand ) , 2 );
successes--;
if ( successes == 0 ) {
break; break;
} }
} }
} }
private BlockPos findNetherPosition( final World worldIn , final Random rand , BlockPos position )
{
float keepGoing = 1.6f;
do {
keepGoing *= .5f;
IBlockState bs = worldIn.getBlockState( position );
while ( ( bs.getBlock( ) == Blocks.NETHERRACK || bs.getBlock( ) == Blocks.BEDROCK
|| bs.getMaterial( ).isLiquid( ) ) && position.getY( ) > 0 ) {
position = position.down( );
bs = worldIn.getBlockState( position );
}
while ( bs.getBlock( ).isAir( bs , worldIn , position ) && position.getY( ) > 0 ) {
position = position.down( );
bs = worldIn.getBlockState( position );
}
} while ( position.getY( ) > 0 && rand.nextFloat( ) < keepGoing );
return position;
}
private BlockPos findOverwordOrEndPosition( final World worldIn , BlockPos position )
{
IBlockState bs = worldIn.getBlockState( position );
while ( ( bs.getBlock( ).isAir( bs , worldIn , position ) //
|| bs.getBlock( ).isLeaves( bs , worldIn , position ) ) && position.getY( ) > 0 ) {
position = position.down( );
bs = worldIn.getBlockState( position );
}
return position;
}
} }

View file

@ -33,6 +33,8 @@ public class WGFloraParameters
public final float perChunk; public final float perChunk;
public final I_LocationCheck location; public final I_LocationCheck location;
public final BiPredicate< World , BlockPos > placementCheck; public final BiPredicate< World , BlockPos > placementCheck;
private int attempts = 128;
private int successes = 1;
public WGFloraParameters( final IBlockState floraType , final float perChunk ) public WGFloraParameters( final IBlockState floraType , final float perChunk )
@ -64,6 +66,26 @@ public class WGFloraParameters
} }
public WGFloraParameters setPlacementAttempts( int attempts )
{
if ( attempts < 1 ) {
throw new IllegalArgumentException( "invalid placement attempts count" );
}
this.attempts = attempts;
return this;
}
public WGFloraParameters setSuccessfulPlacements( int successes )
{
if ( successes < 1 ) {
throw new IllegalArgumentException( "invalid successful placement count" );
}
this.successes = successes;
return this;
}
@Override @Override
public IBlockState getBlockState( final World world , final BlockPos pos , final Random random ) public IBlockState getBlockState( final World world , final BlockPos pos , final Random random )
{ {
@ -72,7 +94,7 @@ public class WGFloraParameters
@Override @Override
public boolean canPlaceInChunk( World world , BlockPos pos ) public boolean canPlaceInChunk( final World world , final BlockPos pos )
{ {
return this.location.checkLocation( world , pos.getX( ) >> 4 , pos.getZ( ) >> 4 , world.getChunkProvider( ) ); return this.location.checkLocation( world , pos.getX( ) >> 4 , pos.getZ( ) >> 4 , world.getChunkProvider( ) );
} }
@ -93,7 +115,14 @@ public class WGFloraParameters
@Override @Override
public int getPlacementAttempts( final World world , final BlockPos pos , final Random random ) public int getPlacementAttempts( final World world , final BlockPos pos , final Random random )
{ {
return 128; return this.attempts;
}
@Override
public int getSuccessfulPlacements( final World world , final BlockPos pos , final Random random )
{
return this.successes;
} }

View file

@ -0,0 +1,15 @@
{
"forge_marker": 1 ,
"defaults" : {
"model": "minecraft:cross"
} ,
"variants" : {
"color" : {
"yellow" : { "textures" : { "cross" : "mmm:blocks/plant/nether_coral/yellow" } } ,
"red" : { "textures" : { "cross" : "mmm:blocks/plant/nether_coral/red" } } ,
"orange" : { "textures" : { "cross" : "mmm:blocks/plant/nether_coral/orange" } } ,
"blue" : { "textures" : { "cross" : "mmm:blocks/plant/nether_coral/blue" } }
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B