diff --git a/TODO.txt b/TODO.txt index a671a8c..ced01fd 100644 --- a/TODO.txt +++ b/TODO.txt @@ -42,7 +42,6 @@ materials No Alloys materials No Metal from slag -> in metal recycler materials No Black sand URGENT -materials No Quicksand / quagmire URGENT materials No Metals Lead Aluminium diff --git a/src/java/mmm/materials/MMud.java b/src/java/mmm/materials/MMud.java index 48cb77f..9c0f2f0 100644 --- a/src/java/mmm/materials/MMud.java +++ b/src/java/mmm/materials/MMud.java @@ -44,6 +44,13 @@ public class MMud } + @Override + public String getTrapType( ) + { + return "slow"; + } + + @Override public AxisAlignedBB getCollisionBoundingBox( final IBlockState blockState , final World worldIn , final BlockPos pos ) diff --git a/src/java/mmm/materials/MQuicksand.java b/src/java/mmm/materials/MQuicksand.java index b565ecc..f7a8102 100644 --- a/src/java/mmm/materials/MQuicksand.java +++ b/src/java/mmm/materials/MQuicksand.java @@ -48,6 +48,13 @@ public class MQuicksand } + @Override + public String getTrapType( ) + { + return "quicksand"; + } + + @Override public MapColor getMapColor( IBlockState state ) { diff --git a/src/java/mmm/utils/I_UTrapBlock.java b/src/java/mmm/utils/I_UTrapBlock.java index a1481c5..d9e5064 100644 --- a/src/java/mmm/utils/I_UTrapBlock.java +++ b/src/java/mmm/utils/I_UTrapBlock.java @@ -8,6 +8,9 @@ import net.minecraft.block.state.IBlockState; public interface I_UTrapBlock { + public String getTrapType( ); + + public IBlockState[] getReplacedBlocks( ); } diff --git a/src/java/mmm/utils/UTrapBlocks.java b/src/java/mmm/utils/UTrapBlocks.java index 1344d3d..797e7d5 100644 --- a/src/java/mmm/utils/UTrapBlocks.java +++ b/src/java/mmm/utils/UTrapBlocks.java @@ -1,9 +1,12 @@ package mmm.utils; +import java.util.ArrayList; import java.util.List; import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Lists; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; @@ -13,12 +16,16 @@ import net.minecraft.block.state.IBlockState; public enum UTrapBlocks { INSTANCE; + private final ArrayListMultimap< IBlockState , I_UTrapBlock > traps = ArrayListMultimap.create( ); private final ArrayListMultimap< IBlockState , IBlockState > replacements = ArrayListMultimap.create( ); + private final LinkedHashMultimap< IBlockState , String > trapTypes = LinkedHashMultimap.create( ); public void register( final I_UTrapBlock block ) { for ( IBlockState state : block.getReplacedBlocks( ) ) { + this.traps.put( state , block ); + this.trapTypes.put( state , block.getTrapType( ) ); this.replacements.put( state , ( (Block) block ).getDefaultState( ) ); } } @@ -29,4 +36,25 @@ public enum UTrapBlocks { return this.replacements.get( blockState ); } + + public List< IBlockState > getReplacements( final IBlockState blockState , final String trapType ) + { + ArrayList< IBlockState > out = Lists.newArrayList( ); + List< I_UTrapBlock > traps = this.traps.get( blockState ); + int nTraps = traps.size( ); + for ( int i = 0 ; i < nTraps ; i++ ) { + I_UTrapBlock trap = traps.get( i ); + if ( trap.getTrapType( ).equals( trapType ) ) { + out.add( ( (Block) trap ).getDefaultState( ) ); + } + } + return out; + } + + + public ArrayList< String > getTrapTypes( final IBlockState blockState ) + { + return Lists.newArrayList( this.trapTypes.get( blockState ) ); + } + } diff --git a/src/java/mmm/world/gen/WGTrapBlocks.java b/src/java/mmm/world/gen/WGTrapBlocks.java index 67d05b4..979c785 100644 --- a/src/java/mmm/world/gen/WGTrapBlocks.java +++ b/src/java/mmm/world/gen/WGTrapBlocks.java @@ -1,9 +1,12 @@ package mmm.world.gen; +import java.util.ArrayList; import java.util.List; import java.util.Random; +import com.google.common.collect.Lists; + import mmm.utils.UTrapBlocks; import net.minecraft.block.material.Material; import net.minecraft.block.state.IBlockState; @@ -66,9 +69,34 @@ public class WGTrapBlocks check.setY( check.getY( ) - radius / 2 + rand.nextInt( radius ) ); } - // Replace blocks + // Find possible trap types BlockPos bp = new BlockPos( check ); int sqr = radius * radius; + ArrayList< String > types = Lists.newArrayList( ); + 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 + 1 ) { + continue; + } + + final BlockPos pos = bp.add( x , y , z ); + final IBlockState atPos = worldIn.getBlockState( pos ); + final List< String > trapTypes = UTrapBlocks.INSTANCE.getTrapTypes( atPos ); + for ( String rep : trapTypes ) { + if ( !types.contains( rep ) ) { + types.add( rep ); + } + } + } + } + } + if ( types.isEmpty( ) ) { + return false; + } + + String trapType = types.get( rand.nextInt( types.size( ) ) ); + System.err.println( "Trap at " + bp + " -> " + trapType ); for ( int x = -radius ; x <= radius ; x++ ) { for ( int y = -radius ; y <= radius ; y++ ) { for ( int z = -radius ; z <= radius ; z++ ) { @@ -78,7 +106,7 @@ public class WGTrapBlocks final BlockPos pos = bp.add( x , y , z ); final IBlockState atPos = worldIn.getBlockState( pos ); - final List< IBlockState > replacements = UTrapBlocks.INSTANCE.getReplacements( atPos ); + final List< IBlockState > replacements = UTrapBlocks.INSTANCE.getReplacements( atPos , trapType ); final int nReplacements = replacements.size( ); if ( nReplacements == 0 ) { continue; diff --git a/src/resources/assets/mmm/lang/en_US.lang b/src/resources/assets/mmm/lang/en_US.lang index cfc6043..105e1e8 100644 --- a/src/resources/assets/mmm/lang/en_US.lang +++ b/src/resources/assets/mmm/lang/en_US.lang @@ -77,6 +77,7 @@ tile.mmm.materials.planks.bamboo.name=Bamboo Wood Planks tile.mmm.materials.trap.sand.name=Quicksand tile.mmm.materials.trap.red_sand.name=Red Quicksand tile.mmm.materials.trap.mud.name=Mud +tile.mmm.materials.trap.swamp_pit.name=Silty Quicksand tile.mmm.tech.base.alloy_furnace.inactive.name=Alloy Furnace