Can anyone point me to proper ways to work with game mode and game state?

Its easiest to see GameMode and GameState as coming in pairs, and the same for PlayerController and PlayerState. The distinction is that the -States exist on all clients in a multiplayer game whereas the GameMode and PlayerControllers don’t.

I’m assuming that you want your PlayerController to report some events to your game mode? Crocopede’s suggestion may work well then. Suppose you want your PlayerController to report deaths to the game mode. You can create an interface IPlayerDeathListener, and when a player dies his PlayerController Gets All Actors that implement IPlayerDeathListener and calls a function on them. And if one of them happens to be a game mode that implements that interface, you have your result: the game mode gets the event and your PC is still game mode independent.