Posted June 9, 20178 yr Hello, I was having some trouble with editing the blocks that spawn when a vanilla structure is generated. Is there a way I can do this without making my own custom class file based off of that Structure? Method I'm attempting to change: protected IBlockState getBiomeSpecificBlockState(IBlockState blockstateIn) { net.minecraftforge.event.terraingen.BiomeEvent.GetVillageBlockID event = new net.minecraftforge.event.terraingen.BiomeEvent.GetVillageBlockID(startPiece == null ? null : startPiece.biome, blockstateIn); net.minecraftforge.common.MinecraftForge.TERRAIN_GEN_BUS.post(event); if (event.getResult() == net.minecraftforge.fml.common.eventhandler.Event.Result.DENY) return event.getReplacement(); if (this.structureType == 1) { if (blockstateIn.getBlock() == Blocks.LOG || blockstateIn.getBlock() == Blocks.LOG2) { return Blocks.SANDSTONE.getDefaultState(); } if (blockstateIn.getBlock() == Blocks.COBBLESTONE) { return Blocks.SANDSTONE.getStateFromMeta(BlockSandStone.EnumType.DEFAULT.getMetadata()); } if (blockstateIn.getBlock() == Blocks.PLANKS) { return Blocks.SANDSTONE.getStateFromMeta(BlockSandStone.EnumType.SMOOTH.getMetadata()); } if (blockstateIn.getBlock() == Blocks.OAK_STAIRS) { return Blocks.SANDSTONE_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, blockstateIn.getValue(BlockStairs.FACING)); } if (blockstateIn.getBlock() == Blocks.STONE_STAIRS) { return Blocks.SANDSTONE_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, blockstateIn.getValue(BlockStairs.FACING)); } if (blockstateIn.getBlock() == Blocks.GRAVEL) { return Blocks.SANDSTONE.getDefaultState(); } } else if (this.structureType == 3) { if (blockstateIn.getBlock() == Blocks.LOG || blockstateIn.getBlock() == Blocks.LOG2) { return Blocks.LOG.getDefaultState().withProperty(BlockOldLog.VARIANT, BlockPlanks.EnumType.SPRUCE).withProperty(BlockLog.LOG_AXIS, blockstateIn.getValue(BlockLog.LOG_AXIS)); } if (blockstateIn.getBlock() == Blocks.PLANKS) { return Blocks.PLANKS.getDefaultState().withProperty(BlockPlanks.VARIANT, BlockPlanks.EnumType.SPRUCE); } if (blockstateIn.getBlock() == Blocks.OAK_STAIRS) { return Blocks.SPRUCE_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, blockstateIn.getValue(BlockStairs.FACING)); } if (blockstateIn.getBlock() == Blocks.OAK_FENCE) { return Blocks.SPRUCE_FENCE.getDefaultState(); } } else if (this.structureType == 2) { if (blockstateIn.getBlock() == Blocks.LOG || blockstateIn.getBlock() == Blocks.LOG2) { return Blocks.LOG2.getDefaultState().withProperty(BlockNewLog.VARIANT, BlockPlanks.EnumType.ACACIA).withProperty(BlockLog.LOG_AXIS, blockstateIn.getValue(BlockLog.LOG_AXIS)); } if (blockstateIn.getBlock() == Blocks.PLANKS) { return Blocks.PLANKS.getDefaultState().withProperty(BlockPlanks.VARIANT, BlockPlanks.EnumType.ACACIA); } if (blockstateIn.getBlock() == Blocks.OAK_STAIRS) { return Blocks.ACACIA_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, blockstateIn.getValue(BlockStairs.FACING)); } if (blockstateIn.getBlock() == Blocks.COBBLESTONE) { return Blocks.LOG2.getDefaultState().withProperty(BlockNewLog.VARIANT, BlockPlanks.EnumType.ACACIA).withProperty(BlockLog.LOG_AXIS, BlockLog.EnumAxis.Y); } if (blockstateIn.getBlock() == Blocks.OAK_FENCE) { return Blocks.ACACIA_FENCE.getDefaultState(); } } return blockstateIn; } Villages spawn in the Ice Plains Biome in my mod, and I'd like some biome-specific blocks to generate on the structures that spawn. Referenced in the StructureVillagePieces.class: IBlockState iblockstate1 = this.getBiomeSpecificBlockState(Blocks.OAK_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.NORTH)); IBlockState iblockstate2 = this.getBiomeSpecificBlockState(Blocks.OAK_STAIRS.getDefaultState().withProperty(BlockStairs.FACING, EnumFacing.WEST)); IBlockState iblockstate3 = this.getBiomeSpecificBlockState(Blocks.PLANKS.getDefaultState()); this.setBlockState(worldIn, iblockstate3, 3, 3, 1, structureBoundingBoxIn); Thanks for any help.
June 10, 20178 yr The getBiomeSpecificBlockState method fires the BiomeEvent.GetVillageBlockID event, which allows you to change the IBlockState returned by it based on the Biome. To change the IBlockState: Subscribe to the event. Note that it's fired on MinecraftForge.TERRAIN_GEN_BUS rather than MinecraftForge.EVENT_BUS. Check that the Biome is Ice Plains. Use BiomeEvent.GetVillageBlockID#getOriginal to get the original IBlockState. Set the replacement IBlockState with BiomeEvent.GetVillageBlockID#setReplacement. Set the event's result to Event.Result.DENY with Event#setResult to use the replacement IBlockState instead of the original. Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.