Here is my current code for reference. I did not add it in my original question as I was planning on completely restarting my Item and Block classes from scratch.
I made a few edits to my code when I realised that the problem was that I was placing the Block version of the door, not the Item version.
ItemMyDoor class:
public class ItemMyDoor extends ItemDoor implements IHasModel
{
private final Block block;
public ItemMyDoor(Block doorBlock, String name)
{
super(doorBlock);
setUnlocalizedName(name);
setRegistryName(name);
this.block = doorBlock;
setCreativeTab(CreativeTabs.BUILDING_BLOCKS);
ModItems.ITEMS.add(this);
}
BlockMyDoor class:
public class BlockMyDoor extends BlockDoor implements IHasModel{
public Item placerItem;
public BlockMyDoor(String name, Item item, Material par2Material)
{
super(par2Material);
setUnlocalizedName(name);
setRegistryName(name);
placerItem = item;
ModBlocks.BLOCKS.add(this);
}
public void setDoorItem(Item doorItem)
{
this.placerItem = doorItem;
}
public Item getDoorItem()
{
return placerItem;
}
@Override
public void registerModels() {
Main.proxy.registerItemRenderer(Item.getItemFromBlock(this), 0, "inventory");
}
public boolean onBlockActivated(World worldIn, BlockPos pos, IBlockState state, EntityPlayer playerIn, EnumHand hand, @Nullable ItemStack heldItem, EnumFacing side, float hitX, float hitY, float hitZ)
{
if (this.blockMaterial == Material.IRON)
{
return true;
}
else
{
BlockPos blockpos = state.getValue(HALF) == BlockDoor.EnumDoorHalf.LOWER ? pos : pos.down();
IBlockState iblockstate = pos.equals(blockpos) ? state : worldIn.getBlockState(blockpos);
if (iblockstate.getBlock() != this)
{
return false;
}
else
{
state = iblockstate.cycleProperty(OPEN);
worldIn.setBlockState(blockpos, state, 2);
worldIn.markBlockRangeForRenderUpdate(blockpos, pos);
return true;
}
}
}
}
Initialisation Classes (ModBlocks & ModItems)
public static final Block WHITE_DOOR = new BlockMyDoor("white_door", ModItems.WHITE_DOOR, Material.WOOD);
public static final Item WHITE_DOOR = new ItemMyDoor(ModBlocks.WHITE_DOOR, "white_door");
I'm also pretty sure that my .json files are valid, as I copied them directly from a copy of the default texture pack and just replaced the names (acacia_door_bottom_rh became white_door_bottom_rh, etc.)