diff --git a/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSavableLocalPlayerSubsystem.cpp b/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSavableLocalPlayerSubsystem.cpp index 3b867d75..d43afba6 100644 --- a/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSavableLocalPlayerSubsystem.cpp +++ b/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSavableLocalPlayerSubsystem.cpp @@ -3,6 +3,7 @@ #include "GameFramework/SaveGame/GBFSaveGameSubsystem.h" #include +#include void UGBFSavableLocalPlayerSubsystem::Initialize( FSubsystemCollectionBase & collection ) { @@ -22,4 +23,30 @@ void UGBFSavableLocalPlayerSubsystem::Deinitialize() } Super::Deinitialize(); +} + +void UGBFSavableLocalPlayerSubsystem::PlayerControllerChanged( APlayerController * new_player_controller ) +{ + Super::PlayerControllerChanged( new_player_controller ); + + if ( auto * save_system = UGBFSaveGameSubsystem::Get( GetLocalPlayer< ULocalPlayer >() ) ) + { + save_system->RegisterSavable( this ); + } + + new_player_controller->OnPossessedPawnChanged.AddUniqueDynamic( this, &ThisClass::OnPlayerControllerPossessedPawnChanged ); + + if ( auto * pawn = new_player_controller->GetCharacter() ) + { + OnPawnChanged( pawn ); + } +} + +void UGBFSavableLocalPlayerSubsystem::OnPlayerControllerPossessedPawnChanged( APawn * /*old_pawn*/, APawn * new_pawn ) +{ + OnPawnChanged( new_pawn ); +} + +void UGBFSavableLocalPlayerSubsystem::OnPawnChanged( APawn * /*pawn*/ ) +{ } \ No newline at end of file diff --git a/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGame.cpp b/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGame.cpp index 0707cdaa..b10f1dbe 100644 --- a/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGame.cpp +++ b/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGame.cpp @@ -40,6 +40,12 @@ bool IGBFSaveGameSystemSavableInterface::CanBeSerialized() const return true; } +void FGBFSavableData::Reset() +{ + Savable->OnSaveGameReset(); + Data.Reset(); +} + void UGBFSaveGame::HandlePreSave() { Super::HandlePreSave(); @@ -82,7 +88,7 @@ void UGBFSaveGame::ResetToDefault() for ( auto & savable_data : SavablesData ) { - savable_data.Data.Reset(); + savable_data.Reset(); } } diff --git a/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGameSubsystem.cpp b/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGameSubsystem.cpp index 27ce7138..26d55412 100644 --- a/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGameSubsystem.cpp +++ b/Source/GameBaseFramework/Private/GameFramework/SaveGame/GBFSaveGameSubsystem.cpp @@ -30,6 +30,14 @@ void UGBFSaveGameSubsystem::Load() auto * settings = GetDefault< UGameBaseFrameworkGameSettings >(); + if ( SaveGame != nullptr ) + { + for ( const auto & savable_data : SaveGame->SavablesData ) + { + PendingSavables.Add( savable_data.Savable ); + } + } + SaveGame = Cast< UGBFSaveGame >( UGBFSaveGame::LoadOrCreateSaveGameForLocalPlayer( settings->SaveGameClass, PrimaryPlayer.Get(), settings->SaveGameSlotName ) ); for ( const auto & pending_savable : PendingSavables ) @@ -48,6 +56,14 @@ void UGBFSaveGameSubsystem::Save() } } +void UGBFSaveGameSubsystem::Reset() +{ + if ( SaveGame != nullptr ) + { + SaveGame->ResetToDefault(); + } +} + void UGBFSaveGameSubsystem::RegisterSavable( const TScriptInterface< IGBFSaveGameSystemSavableInterface > & savable ) { if ( SaveGame != nullptr ) diff --git a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSavableLocalPlayerSubsystem.h b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSavableLocalPlayerSubsystem.h index b4f3bf3e..1dc9f780 100644 --- a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSavableLocalPlayerSubsystem.h +++ b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSavableLocalPlayerSubsystem.h @@ -7,7 +7,7 @@ #include "GBFSavableLocalPlayerSubsystem.generated.h" -UCLASS() +UCLASS( abstract ) class GAMEBASEFRAMEWORK_API UGBFSavableLocalPlayerSubsystem : public ULocalPlayerSubsystem, public IGBFSaveGameSystemSavableInterface { GENERATED_BODY() @@ -15,4 +15,12 @@ class GAMEBASEFRAMEWORK_API UGBFSavableLocalPlayerSubsystem : public ULocalPlaye public: void Initialize( FSubsystemCollectionBase & collection ) override; void Deinitialize() override; + void PlayerControllerChanged( APlayerController * new_player_controller ) override; + +protected: + virtual void OnPawnChanged( APawn * pawn ); + +private: + UFUNCTION() + void OnPlayerControllerPossessedPawnChanged( APawn * old_pawn, APawn * new_pawn ); }; diff --git a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSavableWorldSubsystem.h b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSavableWorldSubsystem.h index 96c7f851..f3dd5391 100644 --- a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSavableWorldSubsystem.h +++ b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSavableWorldSubsystem.h @@ -7,7 +7,7 @@ #include "GBFSavableWorldSubsystem.generated.h" -UCLASS() +UCLASS( abstract ) class GAMEBASEFRAMEWORK_API UGBFSavableWorldSubsystem : public UWorldSubsystem, public IGBFSaveGameSystemSavableInterface { GENERATED_BODY() diff --git a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGame.h b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGame.h index 3bac5ea5..478a9ea3 100644 --- a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGame.h +++ b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGame.h @@ -33,6 +33,8 @@ struct FGBFSavableData { } + void Reset(); + UPROPERTY( Transient ) TScriptInterface< IGBFSaveGameSystemSavableInterface > Savable; diff --git a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGameSubsystem.h b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGameSubsystem.h index 9f944ef4..a4982e5e 100644 --- a/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGameSubsystem.h +++ b/Source/GameBaseFramework/Public/GameFramework/SaveGame/GBFSaveGameSubsystem.h @@ -21,6 +21,9 @@ class GAMEBASEFRAMEWORK_API UGBFSaveGameSubsystem : public UGameInstanceSubsyste UFUNCTION( BlueprintCallable ) void Save(); + UFUNCTION( BlueprintCallable ) + void Reset(); + void RegisterSavable( const TScriptInterface< IGBFSaveGameSystemSavableInterface > & savable ); void UnRegisterSavable( const TScriptInterface< IGBFSaveGameSystemSavableInterface > & savable );