Do the same things, however this time use the latest build (the recommended build being more of a guideline) and this time get rid of --refresh-dependencies. This should get rid of all problems.
Not necessarily toFile(), just something like it. You could make a new File, and then use the .getResourcePath();, and return the new file. Otherwise, I'm not sure.
Just a question, why are you using ImageIO? Also, try looking at the methods available for ResourceLocation, like this:
ImageIO.write(combined, "PNG", new ResourceLocation("tvmod", "textures/blocks/combined.png").toFile());
Or something like that.
But my problem with that is what if it's the top middle or something like that. Then, my for loops would return something completely wrong and the player would have to place the block in the bottom left to get it to work. How would I get it to do the for loops with an x/y/z relative to the bottom left corner rather than an x/y/z relative to the block itself?
Ok, in your getSmeltingResult method parameters, switch String to ItemStack and you are now good to go. Also, get rid of the cast to ItemStack, because it sure isn't helping you.