So does GameState, and it’s perfect that both are wiped. It seems that the GameMode must be as small as possible then, containing only the rules and controlling the GameState by the rules. I think I should be using the GameState to perform the actual game logic then by injecting manager classes into it. This would make it easy for clients to retrieve data from the GameState or its registered managers. A manager could be the zombie spawner, to which every spawned zombie is registered. A client could then do GameState->GetSpawnManager()->GetPawns() and filter by zombie type.
Same for actors placed in a level, for example a AZombieSpawner. OnBeginPlay it would do GameState->GetSpawnManager->RegisterSpawnPoint(Self) after which point it communicates with the Gamestate’s spawn manager.
This seems to be right to me and it keeps the GameMode and GameState to perform their intended functions and nothing else. Am I missing something else?