// Fill out your copyright notice in the Description page of Project Settings. #include "ResComFloorManager.h" // Sets default values AResComFloorManager::AResComFloorManager() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; } // Called when the game starts or when spawned void AResComFloorManager::BeginPlay() { Super::BeginPlay(); } // Called every frame void AResComFloorManager::Tick(float DeltaTime) { Super::Tick(DeltaTime); } void AResComFloorManager::AddPack(const FFloorPack& pack) { packs.Add(pack); } void AResComFloorManager::AddLevelToPack(FApartmentLocation loc, FFloorLevelStreaming level) { FFloorPack pack; FFloorPack* ppack=nullptr; if (GetPack(loc, ppack)) { //UE_LOG(LogTemp, Warning, TEXT("COUNT: %d"), ppack->levels.Num()); //UE_LOG(LogTemp, Warning, TEXT("COUNT loc: %d"), ppack->location.locHouse); ppack->levels.Add(level); //UE_LOG(LogTemp, Warning, TEXT("COUNT: %d"), ppack->levels.Num()); } else { pack.location = loc; pack.levels.Add(level); AddPack(pack); } } bool AResComFloorManager::GetPack(FApartmentLocation loc, FFloorPack *& pack) { for (int i = 0; i < packs.Num(); ++i) { if (packs[i].location == loc) { pack = &packs[i]; return true; } } return false; } bool AResComFloorManager::GetPack(FApartmentLocation loc, FFloorPack& pack) const { for (auto& packCurr : packs) { if (packCurr.location == loc) { pack = packCurr; return true; } } return false; } //bool AResComFloorManager::LoadPack(FApartmentLocation loc, const FOnPreview& delegatePreview, const FOnShouldBeVisible& delegateShouldBeVisible, const FOnShouldBeLoaded& delegateShouldBeLoaded) bool AResComFloorManager::LoadPack(FApartmentLocation loc, const FOnLoaded& delegateOnLoaded) { FFloorPack* pack = nullptr; if (!GetPack(loc, pack)) return false; OnLoaded = delegateOnLoaded; //OnPreview = delegatePreview; //OnShouldBeVisible = delegateShouldBeVisible; //OnShouldBeLoaded = delegateShouldBeLoaded; FVector Location(0.0f, 0.0f, 0.0f); FRotator Rotation(0.0f, 0.0f, 0.0f); FActorSpawnParameters SpawnInfo; GetWorld()->SpawnActor(Location, Rotation, SpawnInfo); return true; } bool AResComFloorManager::UnloadPack(FApartmentLocation loc, const FOnPreview& delegatePreview, const FOnShouldBeVisible& delegateShouldBeVisible, const FOnShouldBeLoaded& delegateShouldBeLoaded) { FFloorPack pack; if (!GetPack(loc, pack)) return false; FLatentActionInfo info; //for (auto& level : pack.levelsPreview) //{ // UGameplayStatics::UnloadStreamLevel(this,* level, info, false); // //Streamlevel //} //for (auto& level : pack.levelsShouldBeVisible) //{ // UGameplayStatics::UnloadStreamLevel(this, *level, info, false); //} //for (auto& level : pack.levelsShouldBeLoaded) //{ // UGameplayStatics::UnloadStreamLevel(this, *level, info, false); //} OnPreview = delegatePreview; OnShouldBeVisible = delegateShouldBeVisible; OnShouldBeLoaded = delegateShouldBeLoaded; return true; } void AResComFloorManager::OnLevelPreview() { OnPreview.Execute(); } void AResComFloorManager::OnLevelVisible() { OnShouldBeVisible.Execute(); } void AResComFloorManager::OnLevelLoaded() { OnShouldBeLoaded.Execute(); } TArray AResComFloorManager::GetStreamingLevels(const UObject* WorldContextObject) { TArray levels; UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull); for (ULevelStreaming* LevelStreaming : World->GetStreamingLevels()) { levels.Push(LevelStreaming); } return levels; } //ULevelStreaming* UGameplayStatics::GetStreamingLevel(const UObject* WorldContextObject, FName InPackageName) //{ // if (InPackageName != NAME_None) // { // if (UWorld* World = GEngine->GetWorldFromContextObject(WorldContextObject, EGetWorldErrorMode::LogAndReturnNull)) // { // FString SearchPackageName = FStreamLevelAction::MakeSafeLevelName(InPackageName, World); // if (FPackageName::IsShortPackageName(SearchPackageName)) // { // // Make sure MyMap1 and Map1 names do not resolve to a same streaming level // SearchPackageName = TEXT("/") + SearchPackageName; // } // // for (ULevelStreaming* LevelStreaming : World->GetStreamingLevels()) // { // // We check only suffix of package name, to handle situations when packages were saved for play into a temporary folder // // Like Saved/Autosaves/PackageName // if (LevelStreaming && LevelStreaming->GetWorldAssetPackageName().EndsWith(SearchPackageName, ESearchCase::IgnoreCase)) // { // return LevelStreaming; // } // } // } // } // // return NULL; //}