Hey mate, sorry I am short on time
But I want to point you some edge cases for your trace function:
You must check if there was a blocking hit in your trace - if there was so just return the hit location, else you shall return start + destination and it will be the point you will shot at.