Basically you use the new BlockState system
// Code from BlockPlanks
@SideOnly(Side.CLIENT)
// Adds all blockstates to creative tab(s)
public void getSubBlocks(Item itemIn, CreativeTabs tab, List<ItemStack> list)
{
for (BlockPlanks.EnumType blockplanks$enumtype : BlockPlanks.EnumType.values())
{
list.add(new ItemStack(itemIn, 1, blockplanks$enumtype.getMetadata()));
}
}
/**
* Convert the given metadata into a BlockState for this Block
*/
public IBlockState getStateFromMeta(int meta)
{
return this.getDefaultState().withProperty(VARIANT, BlockPlanks.EnumType.byMetadata(meta));
}
/**
* Get the MapColor for this Block and the given BlockState
*/
// Just changes the color that will be displayed on minmaps for example
public MapColor getMapColor(IBlockState state)
{
return ((BlockPlanks.EnumType)state.getValue(VARIANT)).getMapColor();
}
/**
* Convert the BlockState into the correct metadata value
*/
public int getMetaFromState(IBlockState state)
{
return ((BlockPlanks.EnumType)state.getValue(VARIANT)).getMetadata();
}
// Does exactly what it says
protected BlockStateContainer createBlockState()
{
return new BlockStateContainer(this, new IProperty[] {VARIANT});
}
This allows you to add different models to the base model on different blockstates. I assume, but don't quote me, but you may also be able to change the base model. I(t will also allow you to change the texture(s). And a plus side is you do it in just one file, so you still only need 3 JSONs for one block (Yeah still kinda upset about that...).