Lyra character
Player controller
classDiagram
    class ACommonPlayerController{
    }
    class AController{
    }
    class ALyraPlayerController{
        #TObjectPtr~APlayerState~ LastSeenPlayerState
    }
    class ALyraPlayerState{
    }
    class AModularPlayerState{
    }
    class APlayerController{
    }
    class APlayerState{
    }
    class AModularPlayerController{
    }
    class UCommonLocalPlayer{
    }
    class ULocalPlayer{
    }
    class ULyraLocalPlayer{
        -TWeakObjectPtr~APlayerController~ LastBoundPC
        +SpawnPlayActor(FString URL, FString OutError, UWorld InWorld) bool
        +SwitchController(APlayerController PC)
    }
    ACommonPlayerController --|> AModularPlayerController
    ALyraPlayerController --|> ACommonPlayerController
    ALyraPlayerState --|> AModularPlayerState
    AModularPlayerController --|> APlayerController
    AModularPlayerState --|> APlayerState
    APlayerController --|> AController
    UCommonLocalPlayer --|> ULocalPlayer
    ULyraLocalPlayer --|> UCommonLocalPlayer
    ULyraLocalPlayer "0..*" --* "1" APlayerController
    ALyraPlayerController "1" --* "1" APlayerState
Player start
classDiagram
    class ACommonPlayerController{
    }
    class AController{
    }
    class ALyraPlayerController{
    }
    class ALyraPlayerStart{
        #TObjectPtr~AController~ ClaimingController
        +IsClaimed() bool
        +TryClaim(AController OccupyingController) bool
    }
    class APlayerController{
    }
    class AModularPlayerController{
    }
    class ULyraPlayerSpawningManagerComponent{
        TArray~TWekObjectPtr~ALyraPlayerStart~~ CachedPlayerStarts
        -ChoosePlayerStart(AController Player) AActor
        -ControllerCanRestart(AController Player) bool
        -FinishRestartPlayer(AController NewPlayer, FRotator StartRotation)
    }
    ACommonPlayerController --|> AModularPlayerController
    ALyraPlayerController --|> ACommonPlayerController
    AModularPlayerController --|> APlayerController
    APlayerController --|> AController
    ALyraPlayerStart "1" --* "1" AController
    ULyraPlayerSpawningManagerComponent "1" --* "0..*" ALyraPlayerStart
Lyra Player Bot Controller
classDiagram
    class AAIController{
    }
    class AController{
    }
    class ALyraPlayerBotController{
        -TObjectPtr~APlayerState~ LastSeenPlayerState
    }
    class AModularAIController{
    }
    class APlayerState{
    }
    AAIController --|> AController
    ALyraPlayerBotController --|> AModularAIController
    AModularAIController --|> AAIController
    ALyraPlayerBotController "1" --* "1" APlayerState