In short, DO NOT spam CastTo (your BP) nodes unless really necessary.
If you try to put many CastTo your own BP class nodes regularly, you will encounter circular compile BP situation.
Ie. you compiled GameMode, your pawn BP is set to dirty and requires compile again, and when you compile your Pawn BP, your GameMode BP gets set back to dirty and require compile again.
If you run into situation like this(ie, when you compile, other script become dirty), you need to re-setup your event so it takes native classes as parameter.
If you need to pass over a object reference with XXX_C, then when you compile the event invoking BP is going to get set back to dirty.
It might run properly in editor, but might not run properly when you try to package it later on.( since BP is sort of scripting language that parse the compiled ones on the fly when engine starts.)
I fight this for a bit in past few days and then figure out that only natvie objects cast to won’t do this.
So when you invoke events and want to pass over a object reference, cast to a native class( ie MyPlayerController=>PlayerController ), and then pass it to the event that need a player controller as input.