So. This is what vectors are for.
The player has a vector that is their "front" called "LookVec" (Search the EntityPlayer class).
Take that vector, multiply by 0.5 (or 0.2 or whatever), add their current position, and voila. You have the spot a half-block in front of them.
It's an interface with a single method, implement it to return Collections#emptyMap. There's no need for a tutorial or example.
Register it by calling ModelLoader#setCustomStateMapper on the client side in ModelRegistryEvent (if you're registering your Blocks/Items in RegistryEvent.Register) or preInit (if you're registering them in preInit).