"trace_hit auslösen" ist etwas unglücklich formuliert. Stell dir das lieber als eine globale Variable vor, die jede Funktion gleich ändert:
trace_hit wird von jeder c_move und c_trace - Anweisung in deinem Code verändert, auch wenn diese in anderen Funktionen schlummern. Daher ist nach einer c_move bzw. c_trace-Anweisung der Wert von trace_hit nur solange richtig, bis die nächste c_move oder c_trace-Anweisung ausgeführt wird. Man sollte diese Variablen nach einem wait (oder anderen c_move, c_trace-Anweisung) also nicht mehr nutzen.
Du musst also entweder alles, was du mit dem Wert von trace_hit machen möchtest vor dem nächsten wait/c_move/c_trace erledigen (daher das if(trace_hit).. direkt hinter die c_move setzen), oder den Wert in einer Variablen zwischenspeichern (wie du dsa letzendlich mit "collision" machst).
Dafür bieten sich Entity-Skills oder lokale Variablen an.