(1) Use the debugger and figure out what's null when.
But my guess would be that you start the game and when you go to open the gui to select a world to play, it crashes.
I'll give you one hint.
Of course not, because the vanilla sign item places the vanilla sign block, and the vanilla sign block creates the vanilla sign tile entity.
GetType only gets called for the game to determine how to serialize and deserialize the TE's data.
Inventory is server side. The items the client thinks it has aren't real and cannot be real unless either:
a) the server adds the items
b) the player is in creative mode
No.
The only way to write an abstraction layer that would be able to determine which method to call (eg. if its signature changed in any way) without crashing would be reflection. And using reflection on every point your code touches Forge or Vanilla would bog the JVM down to uselessness.
That's why major versions exist.
These do basically the same thing (if you had marked the methods with the @SubscribeEvent annotation, they actually would; as is the EVENT_BUS.register call does nothing).
But its largely pointless, because those event methods are empty anyway.
You should use a voxel shape that as closely matches your model as possible. Your model appears to be only 1 pixel thick in either the X or Z direction, aligned to the center of the block. So your voxel shape should be more like (0,0,7.5) to (16, 0, 8.5).
1.15 (well, 1.13+) does not have ModelLoader.setCustomModelResourceLocation because its functionality is no longer required because vanilla model systems are smarter.
For when you are in code that runs on both the logical server and the logical client, and what you want to do should only be performed on one or the other.
As I said, you're going to have to compute it yourself.
No. You're going to need to read the code.
But as far as I understand it, its just a bunch of axis aligned cuboids.