The class you need to set a breakpoint in is a part of FML, not a part of your code.
Open the LoadController class, navigate to the constructor, set a breakpoint in the handleException method of the anonymous class and then run Minecraft in debug mode.
When the breakpoint is hit, look at the value of the Throwable argument of the method to see where it was thrown from.
You will unfortunately need to create a recipe file for each recipe.
You can use the minecraft:item_exists condition to enable a recipe only when a specific Item has been registered.
It looks like you never register ClientProxy with the Forge event bus, so the ClientProxy.registerModels method is never called and your models are never registered.
Either register it manually or annotate the class with @Mod.EventBusSubscriber to automatically register it. Make sure you pass Side.CLIENT to the annotation so the class is only registered on the client, this prevents the dedicated server from loading the class and then crashing because it can't find the client-only classes referenced by it.
Forge's documentation explains events in more detail here.
You'll need to create your own condition that returns true or false based on this option and then create separate recipe files for easy and hard mode that use this condition.
Create a class that implements IConditionFactory and then specify this class in recipes/_factories.json. You can implement BooleanSupplier (the type returned by IConditionFactory#parse) using a lambda that returns the value of your config option.
In a recipe file, set the conditions property of the top-level object to an array containing an object for each condition. In each condition object, set the type property to the name of the condition type and include any other properties required by the condition type.
Forge will test the conditions at recipe load time and only register the recipe if all of them are met.
You can use the forge:not condition to invert the result of a condition.
If the hard and easy mode recipes are mostly the same except for one or two ingredients, you may want to use a conditional ingredient like this. This will allow the individual ingredients to change based on the config option instead of having one of two recipes enabled based on the config option.
Resource packs can't overwrite server-side files like recipes or loot tables, but Mojang plans to add data packs in 1.13 to allow that.
This worked in 1.10 but expect it to still work in 1.12.
You need to create and register a VillagerProfession using GameRegistry.register
.
You can then create one or more VillagerCareers for the VillagerProfession
and use VillagerCareer#addTrade to add trades to each VillagerCareer.