You create a new block and register it:
//Register<Block> event
//somewhere in your code
final Block[] blocks = {
new BlockBasic(Material.ROCK, "first_block", "my_first_block")
};
event.getRegistry().registerAll(blocks);
Then you register the items with the reference of the previously mentioned block above (in my case they are stored in TutorialBlocks)
final Item[] itemBlocks = {
new ItemBlock(TutorialBlocks.MY_FIRST_BLOCK).setRegistryName(TutorialBlocks.MY_FIRST_BLOCK.getRegistryName())
};
//this is the event where you would register your items normally
event.getRegistry().registerAll(itemBlocks);
Then you register the model as you would do with an item
registerModel(Item.getItemFromBlock(TutorialBlocks.MY_FIRST_BLOCK));
private static void registerModel(Item item) {
ModelLoader.setCustomModelResourceLocation(item, 0, new ModelResourceLocation(item.getRegistryName(), "inventory"));
}
If you need the .jsons as well tag me.