Trap block generation
Only works in deserts for now due to only having quicksand
This commit is contained in:
parent
cffe5b6728
commit
d1aa93b171
8 changed files with 198 additions and 2 deletions
|
@ -1,6 +1,7 @@
|
||||||
package mmm.materials;
|
package mmm.materials;
|
||||||
|
|
||||||
|
|
||||||
|
import mmm.utils.I_UTrapBlock;
|
||||||
import mmm.utils.URegistry;
|
import mmm.utils.URegistry;
|
||||||
import net.minecraft.block.Block;
|
import net.minecraft.block.Block;
|
||||||
import net.minecraft.block.BlockFalling;
|
import net.minecraft.block.BlockFalling;
|
||||||
|
@ -21,6 +22,7 @@ import net.minecraftforge.common.IPlantable;
|
||||||
|
|
||||||
public class MQuicksand
|
public class MQuicksand
|
||||||
extends BlockFalling
|
extends BlockFalling
|
||||||
|
implements I_UTrapBlock
|
||||||
{
|
{
|
||||||
public final IBlockState forType;
|
public final IBlockState forType;
|
||||||
|
|
||||||
|
@ -36,6 +38,13 @@ public class MQuicksand
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBlockState getReplacedBlock( )
|
||||||
|
{
|
||||||
|
return this.forType;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MapColor getMapColor( IBlockState state )
|
public MapColor getMapColor( IBlockState state )
|
||||||
{
|
{
|
||||||
|
|
13
src/java/mmm/utils/I_UTrapBlock.java
Normal file
13
src/java/mmm/utils/I_UTrapBlock.java
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
package mmm.utils;
|
||||||
|
|
||||||
|
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public interface I_UTrapBlock
|
||||||
|
{
|
||||||
|
|
||||||
|
public IBlockState getReplacedBlock( );
|
||||||
|
|
||||||
|
}
|
|
@ -156,6 +156,9 @@ public class URegistry
|
||||||
|
|
||||||
URegistry.addRecipeRegistrar( block );
|
URegistry.addRecipeRegistrar( block );
|
||||||
URegistry.addOreGenerationRegistrar( block );
|
URegistry.addOreGenerationRegistrar( block );
|
||||||
|
if ( block instanceof I_UTrapBlock ) {
|
||||||
|
UTrapBlocks.INSTANCE.register( (I_UTrapBlock) block );
|
||||||
|
}
|
||||||
|
|
||||||
if ( blockItem != null ) {
|
if ( blockItem != null ) {
|
||||||
URegistry.addItem( blockItem , registerItemModel );
|
URegistry.addItem( blockItem , registerItemModel );
|
||||||
|
|
30
src/java/mmm/utils/UTrapBlocks.java
Normal file
30
src/java/mmm/utils/UTrapBlocks.java
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package mmm.utils;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import com.google.common.collect.ArrayListMultimap;
|
||||||
|
|
||||||
|
import net.minecraft.block.Block;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public enum UTrapBlocks {
|
||||||
|
INSTANCE;
|
||||||
|
|
||||||
|
private final ArrayListMultimap< IBlockState , IBlockState > replacements = ArrayListMultimap.create( );
|
||||||
|
|
||||||
|
|
||||||
|
public void register( final I_UTrapBlock block )
|
||||||
|
{
|
||||||
|
this.replacements.put( block.getReplacedBlock( ) , ( (Block) block ).getDefaultState( ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public List< IBlockState > getReplacements( final IBlockState blockState )
|
||||||
|
{
|
||||||
|
return this.replacements.get( blockState );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,8 +1,12 @@
|
||||||
package mmm.world;
|
package mmm.world;
|
||||||
|
|
||||||
|
|
||||||
|
import mmm.world.biome.I_WBTrappedBiome;
|
||||||
|
import mmm.world.gen.WGTrapBlocks;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.biome.Biome;
|
import net.minecraft.world.biome.Biome;
|
||||||
|
import net.minecraft.world.biome.BiomeDesert;
|
||||||
|
import net.minecraft.world.biome.BiomeSwamp;
|
||||||
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
|
import net.minecraftforge.event.terraingen.PopulateChunkEvent;
|
||||||
import net.minecraftforge.fml.common.eventhandler.Event.Result;
|
import net.minecraftforge.fml.common.eventhandler.Event.Result;
|
||||||
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
|
||||||
|
@ -23,4 +27,31 @@ public class WDefaultGenWatcher
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@SubscribeEvent
|
||||||
|
public void afterPopulate( final PopulateChunkEvent.Post event )
|
||||||
|
{
|
||||||
|
if ( event.isHasVillageGenerated( ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final BlockPos bp = new BlockPos( event.getChunkX( ) * 16 , 0 , event.getChunkZ( ) * 16 );
|
||||||
|
final net.minecraft.world.World world = event.getWorld( );
|
||||||
|
final Biome biome = world.getBiomeGenForCoords( bp );
|
||||||
|
// FIXME hardcoding is bad
|
||||||
|
|
||||||
|
final WGTrapBlocks traps;
|
||||||
|
if ( biome instanceof BiomeDesert ) {
|
||||||
|
traps = new WGTrapBlocks( false , .05f );
|
||||||
|
} else if ( biome instanceof BiomeSwamp ) {
|
||||||
|
traps = new WGTrapBlocks( false , .1f );
|
||||||
|
} else if ( biome instanceof I_WBTrappedBiome ) {
|
||||||
|
traps = new WGTrapBlocks( false , ( (I_WBTrappedBiome) biome ).getTrapBlockChance( ) );
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
traps.generate( world , event.getRand( ) , bp );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,10 @@ public class World
|
||||||
{
|
{
|
||||||
|
|
||||||
static {
|
static {
|
||||||
MinecraftForge.TERRAIN_GEN_BUS.register( new WDefaultGenWatcher( ) );
|
WDefaultGenWatcher dgw = new WDefaultGenWatcher( );
|
||||||
|
MinecraftForge.TERRAIN_GEN_BUS.register( dgw );
|
||||||
|
MinecraftForge.EVENT_BUS.register( dgw );
|
||||||
|
|
||||||
WBiomeHelper helper;
|
WBiomeHelper helper;
|
||||||
|
|
||||||
helper = new WBiomeHelper( WBLimestoneMountains::new );
|
helper = new WBiomeHelper( WBLimestoneMountains::new );
|
||||||
|
@ -71,7 +74,7 @@ public class World
|
||||||
.setElevation( -.2f , .1f ) //
|
.setElevation( -.2f , .1f ) //
|
||||||
.setWeather( .95f , .95f ) //
|
.setWeather( .95f , .95f ) //
|
||||||
.setWaterColor( 0xe0ffae ) // Same as vanilla swamps
|
.setWaterColor( 0xe0ffae ) // Same as vanilla swamps
|
||||||
.setType( BiomeType.WARM , 40 ) // FIXME
|
.setType( BiomeType.WARM , 3 ) //
|
||||||
.register( );
|
.register( );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
7
src/java/mmm/world/biome/I_WBTrappedBiome.java
Normal file
7
src/java/mmm/world/biome/I_WBTrappedBiome.java
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
package mmm.world.biome;
|
||||||
|
|
||||||
|
|
||||||
|
public interface I_WBTrappedBiome
|
||||||
|
{
|
||||||
|
public float getTrapBlockChance( );
|
||||||
|
}
|
100
src/java/mmm/world/gen/WGTrapBlocks.java
Normal file
100
src/java/mmm/world/gen/WGTrapBlocks.java
Normal file
|
@ -0,0 +1,100 @@
|
||||||
|
package mmm.world.gen;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import mmm.utils.UTrapBlocks;
|
||||||
|
import net.minecraft.block.material.Material;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.world.World;
|
||||||
|
import net.minecraft.world.gen.feature.WorldGenerator;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public class WGTrapBlocks
|
||||||
|
extends WorldGenerator
|
||||||
|
{
|
||||||
|
|
||||||
|
private final float chance;
|
||||||
|
|
||||||
|
|
||||||
|
public WGTrapBlocks( final boolean notify , final float chance )
|
||||||
|
{
|
||||||
|
super( notify );
|
||||||
|
this.chance = chance;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean generate( final World worldIn , final Random rand , final BlockPos position )
|
||||||
|
{
|
||||||
|
if ( rand.nextFloat( ) > this.chance ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select radius and centre
|
||||||
|
final int radius = 2 + rand.nextInt( 2 );
|
||||||
|
final int space = 16 - radius * 2;
|
||||||
|
final BlockPos.MutableBlockPos check = new BlockPos.MutableBlockPos(
|
||||||
|
position.getX( ) + radius + rand.nextInt( space ) , //
|
||||||
|
255 , //
|
||||||
|
position.getZ( ) + radius + rand.nextInt( space ) );
|
||||||
|
|
||||||
|
// Find the ground
|
||||||
|
final int minDepth = Math.max( 0 , worldIn.getSeaLevel( ) - 20 );
|
||||||
|
boolean found = false;
|
||||||
|
while ( check.getY( ) > minDepth ) {
|
||||||
|
final Material material = worldIn.getBlockState( check ).getMaterial( );
|
||||||
|
if ( material.isLiquid( ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if ( material != Material.AIR ) {
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
check.setY( check.getY( ) - 1 );
|
||||||
|
}
|
||||||
|
if ( !found ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Displace the centre vertically
|
||||||
|
if ( check.getY( ) > radius / 2 && check.getY( ) < 255 - radius / 2 ) {
|
||||||
|
check.setY( check.getY( ) - radius / 2 + rand.nextInt( radius ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace blocks
|
||||||
|
BlockPos bp = new BlockPos( check );
|
||||||
|
int sqr = radius * radius;
|
||||||
|
for ( int x = -radius ; x <= radius ; x++ ) {
|
||||||
|
for ( int y = -radius ; y <= radius ; y++ ) {
|
||||||
|
for ( int z = -radius ; z <= radius ; z++ ) {
|
||||||
|
if ( x * x + y * y + z * z > sqr + rand.nextInt( 2 ) ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final BlockPos pos = bp.add( x , y , z );
|
||||||
|
final IBlockState atPos = worldIn.getBlockState( pos );
|
||||||
|
final List< IBlockState > replacements = UTrapBlocks.INSTANCE.getReplacements( atPos );
|
||||||
|
final int nReplacements = replacements.size( );
|
||||||
|
if ( nReplacements == 0 ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
int repIndex;
|
||||||
|
if ( nReplacements == 1 ) {
|
||||||
|
repIndex = 0;
|
||||||
|
} else {
|
||||||
|
repIndex = rand.nextInt( nReplacements );
|
||||||
|
}
|
||||||
|
this.setBlockAndNotifyAdequately( worldIn , pos , replacements.get( repIndex ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Reference in a new issue