// Copyright Epic Games, Inc. All Rights Reserved. #include "CommonGameInstance.h" #include "GameUIManagerSubsystem.h" #include "ICommonUIModule.h" #include "CommonUISettings.h" #include "CommonUserSubsystem.h" #include "CommonSessionSubsystem.h" #include "CommonLocalPlayer.h" #include "Messaging/CommonGameDialog.h" #include "LogCommonGame.h" UCommonGameInstance::UCommonGameInstance(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer) { } void UCommonGameInstance::HandleSystemMessage(FGameplayTag MessageType, FText Title, FText Message) { ULocalPlayer* FirstPlayer = GetFirstGamePlayer(); // Forward severe ones to the error dialog for the first player if (FirstPlayer && MessageType.MatchesTag(FCommonUserTags::SystemMessage_Error)) { if (UCommonMessagingSubsystem* Messaging = FirstPlayer->GetSubsystem()) { Messaging->ShowError(UCommonGameDialogDescriptor::CreateConfirmationOk(Title, Message)); } } } void UCommonGameInstance::HandlePrivilegeChanged(const UCommonUserInfo* UserInfo, ECommonUserPrivilege Privilege, ECommonUserAvailability OldAvailability, ECommonUserAvailability NewAvailability) { // By default show errors and disconnect if play privilege for first player is lost if (Privilege == ECommonUserPrivilege::CanPlay && OldAvailability == ECommonUserAvailability::NowAvailable && NewAvailability != ECommonUserAvailability::NowAvailable) { UE_LOG(LogCommonGame, Error, TEXT("HandlePrivilegeChanged: Player %d no longer has permission to play the game!"), UserInfo->LocalPlayerIndex); // TODO: Games can do something specific in subclass // ReturnToMainMenu(); } } int32 UCommonGameInstance::AddLocalPlayer(ULocalPlayer* NewPlayer, int32 ControllerId) { int32 ReturnVal = Super::AddLocalPlayer(NewPlayer, ControllerId); if (ReturnVal != INDEX_NONE) { if (!PrimaryPlayer.IsValid()) { UE_LOG(LogCommonGame, Log, TEXT("AddLocalPlayer: Set %s to Primary Player"), *NewPlayer->GetName()); PrimaryPlayer = NewPlayer; } GetSubsystem()->NotifyPlayerAdded(Cast(NewPlayer)); } return ReturnVal; } bool UCommonGameInstance::RemoveLocalPlayer(ULocalPlayer* ExistingPlayer) { if (PrimaryPlayer == ExistingPlayer) { //TODO: do we want to fall back to another player? PrimaryPlayer.Reset(); UE_LOG(LogCommonGame, Log, TEXT("RemoveLocalPlayer: Unsetting Primary Player from %s"), *ExistingPlayer->GetName()); } GetSubsystem()->NotifyPlayerDestroyed(Cast(ExistingPlayer)); return Super::RemoveLocalPlayer(ExistingPlayer); } void UCommonGameInstance::Init() { Super::Init(); // After subsystems are initialized, hook them together FGameplayTagContainer PlatformTraits = ICommonUIModule::GetSettings().GetPlatformTraits(); UCommonUserSubsystem* UserSubsystem = GetSubsystem(); if (ensure(UserSubsystem)) { UserSubsystem->SetTraitTags(PlatformTraits); UserSubsystem->OnHandleSystemMessage.AddDynamic(this, &UCommonGameInstance::HandleSystemMessage); UserSubsystem->OnUserPrivilegeChanged.AddDynamic(this, &UCommonGameInstance::HandlePrivilegeChanged); } } void UCommonGameInstance::ResetUserAndSessionState() { UCommonUserSubsystem* UserSubsystem = GetSubsystem(); if (ensure(UserSubsystem)) { UserSubsystem->ResetUserState(); } UCommonSessionSubsystem* SessionSubsystem = GetSubsystem(); if (ensure(SessionSubsystem)) { SessionSubsystem->CleanUpSessions(); } } void UCommonGameInstance::ReturnToMainMenu() { // By default when returning to main menu we should reset everything ResetUserAndSessionState(); Super::ReturnToMainMenu(); } //void UCommonGameInstance::OnPreLoadMap(const FString& MapName) //{ // if (!IsDedicatedServerInstance()) // { // if (!bWasInLoadMap) // { // UGameUIManagerSubsystem* UIManager = GetSubsystem(); // for (ULocalPlayer* LocalPlayer : LocalPlayers) // { // UIManager->NotifyPlayerAdded(Cast(LocalPlayer)); // } // } // } //}