ProjectM/Source/ProjectT/System/Lobby/GameModes/LobbyGameMode.cpp

183 lines
5.0 KiB
C++

// Fill out your copyright notice in the Description page of Project Settings.
#include "LobbyGameMode.h"
#include "ProjectT/ProjectT.h"
#include "ProjectT/System/Lobby/Managers/LobbyWidgetManager.h"
#include "ProjectT/System/Core/Common/GlobalUtilsLibrary.h"
#include "ProjectT/System/Core/Interfaces/GlobalObjectProvider.h"
#include "ProjectT/System/Core/Managers/DataDam.h"
#include "ProjectT/Data/Gen/GenerateEnumDataTableKey.h"
#include "ProjectT/System/Lobby/Objects/LobbyPreviewCharacter.h"
ALobbyGameMode::ALobbyGameMode()
:CurrentStreamLevel(nullptr),
StageIDX(0)
{
}
void ALobbyGameMode::Tick(float DeltaSeconds)
{
Super::Tick(DeltaSeconds);
}
ULobbyWidgetManager* ALobbyGameMode::GetLobbyWidgetManager_Implementation()
{
NMT_MSG_CHECKF(CoreWidgetManager, "Widget Manager is Null");
ULobbyWidgetManager* LWM = Cast<ULobbyWidgetManager>(CoreWidgetManager);
NMT_MSG_CHECKF(LWM, "LobbyWidgetManager Cast Failed");
return LWM;
}
ALobbyPreviewCharacter* ALobbyGameMode::GetLobbyPreviewCharacter_Implementation()
{
AActor* FindActor;
FindActor = UGameplayStatics::GetActorOfClass(GetWorld(), ALobbyPreviewCharacter::StaticClass());
NMT_MSG_CHECKF(FindActor, "LobbyPreviewCharacter not found");
ALobbyPreviewCharacter* LPC = Cast<ALobbyPreviewCharacter>(FindActor);
NMT_MSG_CHECKF(LPC, "Cast fail to LobbyPreviewCharacter");
return LPC;
}
void ALobbyGameMode::InitGame(const FString& MapName, const FString& Options, FString& ErrorMessage)
{
Super::InitGame(MapName, Options, ErrorMessage);
InitializeManagers();
InitializeUI();
CurrentStreamLevel = LobbyLevels[0];
}
void ALobbyGameMode::BeginPlay()
{
Super::BeginPlay();
}
void ALobbyGameMode::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
Super::EndPlay(EndPlayReason);
}
void ALobbyGameMode::InitializeManagers()
{
Super::InitializeManagers();
UWorld* World = GetWorld();
NMT_CHECKF(World);
if(!CoreWidgetManager)
{
CoreWidgetManager = NewObject<ULobbyWidgetManager>(this);
CoreWidgetManager->InitializeManager(this);
NMT_CHECKF(CoreWidgetManager);
}
}
void ALobbyGameMode::InitializeUI()
{
Super::InitializeUI();
UWorld* World = UGlobalUtilsLibrary::GetValidWorld(this);
NMT_CHECKF(CoreWidgetManager);
ULobbyWidgetManager* LWM = CastChecked<ULobbyWidgetManager>(CoreWidgetManager);
LWM->OnRequestLevelChange.BindUFunction(this, FName("LevelChange"));
UDataDam* DD = IGlobalObjectProvider::Execute_GetDataDam(GetGameInstance());
NMT_CHECKF(DD);
const UDataTable* StageTable = DD->GetDataTableByEnum(EDataTableKey::Stage);
NMT_CHECKF(StageTable);
for(FName StageRow : StageTable->GetRowNames())
{
FStage* StageData = StageTable->FindRow<FStage>(StageRow, TEXT("Not Found StageDataRow"));
if(StageData)
{
LWM->StageDatas.Add(StageRow, *StageData);
}
}
const UDataTable* PlayerCharacterTable = DD->GetDataTableByEnum(EDataTableKey::PlayerCharacter);
NMT_CHECKF(PlayerCharacterTable);
for(FName PlayerCharacterRow : PlayerCharacterTable->GetRowNames())
{
FPlayerCharacter* PlayerCharacterData = PlayerCharacterTable->FindRow<FPlayerCharacter>(PlayerCharacterRow, TEXT("Not Found PlayerCharacterDataRow"));
if(PlayerCharacterData)
{
LWM->PlayerCharacterDatas.Add(PlayerCharacterRow, *PlayerCharacterData);
}
}
const UDataTable* SkillTable = DD->GetDataTableByEnum(EDataTableKey::Skill);
NMT_CHECKF(SkillTable);
for(FName SkillRow : SkillTable->GetRowNames())
{
FSkill* SkillData = SkillTable->FindRow<FSkill>(SkillRow, TEXT("Not Found SkillDataRow"));
if(SkillData)
{
LWM->SkillDatas.Add(SkillRow, *SkillData);
}
}
const UDataTable* ObjectiveTable = DD->GetDataTableByEnum(EDataTableKey::Objective);
NMT_CHECKF(ObjectiveTable);
for(FName ObjectiveRow : ObjectiveTable->GetRowNames())
{
FObjective* ObjectiveData = ObjectiveTable->FindRow<FObjective>(ObjectiveRow, TEXT("Not Found ObjectiveDataRow"));
if(ObjectiveData)
{
LWM->ObjectiveDatas.Add(ObjectiveRow, *ObjectiveData);
}
}
}
void ALobbyGameMode::LevelChange(int32 LobbyLevelIDX)
{
StageIDX = LobbyLevelIDX;
if(LobbyLevels.IsValidIndex(StageIDX))
{
FLatentActionInfo LatentInfo;
LatentInfo.CallbackTarget = this;
LatentInfo.ExecutionFunction = FName("CompleteLevelUnLoad");
LatentInfo.UUID = 1;
LatentInfo.Linkage = 0;
UGameplayStatics::UnloadStreamLevelBySoftObjectPtr(
this,
CurrentStreamLevel,
LatentInfo,
true
);
}
}
void ALobbyGameMode::CompleteLevelLoad()
{
ULobbyWidgetManager* LWM = CastChecked<ULobbyWidgetManager>(CoreWidgetManager);
CurrentStreamLevel = LobbyLevels[StageIDX];
LWM->OnCompleteLevelChange.ExecuteIfBound(StageIDX);
}
void ALobbyGameMode::CompleteLevelUnLoad()
{
if(LobbyLevels.IsValidIndex(StageIDX))
{
FLatentActionInfo LatentInfo;
LatentInfo.CallbackTarget = this;
LatentInfo.ExecutionFunction = FName("CompleteLevelLoad");
LatentInfo.UUID = 2;
LatentInfo.Linkage = 0;
const TSoftObjectPtr<UWorld>& LevelToLoad = LobbyLevels[StageIDX];
UGameplayStatics::LoadStreamLevelBySoftObjectPtr(
this,
LevelToLoad,
true,
true,
LatentInfo
);
}
}