and if you want a longer answer:
Q why not put everything from pawn inside the player state?
the reason you shouldn’t just put all of your pawns data into the playerState class is the same reason drill bits are sold separatly from drills. Modularity. a drill doesn’t know anything about what kind of bit you will use, it just knows it will fit, because it uses the same interface.
playerController uses pawn as the interface for your character.
playerState is the replicated database for your playerController.
pawn is a polymorphic base class used like a weapon or tool.
*a pawn is an end effector, it can be swapped out at run time for a change in behavior.
imagine an extreme scenario, where you could posses any object, and at any moment, switching between pawns with totally different behavior:
the player controller tells your generic pawn to moveFoward, without knowing what the pawn actually is. then your sublcass of pawn, which might be a red blood cell, interperets that MoveFoward command as moving along a path. if your pawn was a turret, it wouldn’t respond to MoveFoward at all. if your pawn was a golfer, MoveFoward might swing the golf club, while MoveBack might charge up the SwingPower.
your player controller probably shouldn’t know anything about Swingpower. if you are controlling a turret, you don’t need SwingPower, because turrets don’t play golf. if your golfer doesn’t exist, you don’t need Swingpower, so Swingpower should be part of the GolferPawn. but your playerState should keep track of player stats that might edit the golfer’s MaxSwingpower, so you can give the player upgrades to their golf skills. that same playerState, in a game that swapped between very different pawns all the time, could keep track of stats like TurretKills and DistanceTraveledAsABloodCell as well. but TurretAmmo should probably depend on which turret you possesed, so it should not be a PlayerState variable, it should be part of TurretPawn.