The top down controller fonctionality is implemented inside HackAndSlashPlayerController, HackAndSlashCharacter, HackAndSlashPlayerControllerProxy and HackAndSlashCharacterProxy.
The proxies version of the character and controller are required to use the MoveTo() function in multiplayer. See this thread for more infos : https://answers.unrealengine.com/questions/34074/does-ue4-have-client-side-prediction-built-in.html
To sumerize, the moveTo() functionality of the engine is only implemented inside the AIController, not the PlayerController. To use this functionality, we need to spawn a second controller which is an AIController and which will only handle the moveTo() functionality. This second controller is the PlayerControllerProxy, and it will controls the PlayerCharacter.
You can still access the PlayerCharacter from the PlayerController with get OwningPlayerCharacter variable.
note : AiController only exists on server side.
When the character is possessed, he will automatically create the Character Proxy and the Controller Proxy. When he is destroyed, he will automatically destroy the Character Proxy and Controller Proxy.
Proxies creation is performed inside the PlayerCharacter::SpawnAndInitProxies() function