The problems you've had with desyncs might be related to player prediction. DoEffect (and probably also most, if not all the player-specific virtual functions defined in PlayerPawn) is run during player prediction.
You have to take that into account with
Code: Select all
if (Owner.player.cheats & CF_PREDICTING) // Return if running player prediction
return;