Add BaseLevelNameOverride for dedicated editor maps

PlayerController gets a BaseLevelNameOverride property. When set (e.g. "Warehouse"),
scenes are tagged with that level name instead of the auto-detected map name.

Use case: editing on "Warehouse_Editor" map but scenes should be associated
with the "Warehouse" base level for PROSERVE runtime loading.

Save, load list, and scene filtering all respect this override.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-12 12:01:43 +02:00
parent 4dc0f400b4
commit aafcbbb7f9
3 changed files with 24 additions and 6 deletions

View File

@@ -42,6 +42,15 @@ public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PS Editor") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PS Editor")
TSoftObjectPtr<UPS_Editor_MasterCatalog> MasterCatalogAsset; TSoftObjectPtr<UPS_Editor_MasterCatalog> MasterCatalogAsset;
/**
* Override the level name stored in saved scenes.
* If empty, auto-detected from the current map name.
* Use this when editing on a dedicated map (e.g. "Warehouse_Editor")
* but scenes should be associated with the base level ("Warehouse").
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "PS Editor")
FString BaseLevelNameOverride;
// ---- Editor Mode (Normal / SplinePlacement) ---- // ---- Editor Mode (Normal / SplinePlacement) ----
UFUNCTION(BlueprintCallable, Category = "PS Editor") UFUNCTION(BlueprintCallable, Category = "PS Editor")

View File

@@ -2,6 +2,7 @@
#include "PS_Editor_SpawnManager.h" #include "PS_Editor_SpawnManager.h"
#include "PS_Editor_SelectionManager.h" #include "PS_Editor_SelectionManager.h"
#include "PS_Editor_EditableComponent.h" #include "PS_Editor_EditableComponent.h"
#include "PS_Editor_PlayerController.h"
#include "PS_Editor_SplineActor.h" #include "PS_Editor_SplineActor.h"
#include "JsonObjectConverter.h" #include "JsonObjectConverter.h"
#include "Misc/FileHelper.h" #include "Misc/FileHelper.h"
@@ -22,10 +23,14 @@ bool UPS_Editor_SceneSerializer::SaveScene(const FString& SceneName, UPS_Editor_
SceneData.SceneName = SceneName; SceneData.SceneName = SceneName;
SceneData.Timestamp = FDateTime::Now().ToString(); SceneData.Timestamp = FDateTime::Now().ToString();
// Auto-detect the current level name // Use BaseLevelNameOverride if set, otherwise auto-detect from map name
if (APlayerController* PC = Cast<APlayerController>(GetOuter())) if (APS_Editor_PlayerController* EditorPC = Cast<APS_Editor_PlayerController>(GetOuter()))
{ {
if (UWorld* World = PC->GetWorld()) if (!EditorPC->BaseLevelNameOverride.IsEmpty())
{
SceneData.LevelName = EditorPC->BaseLevelNameOverride;
}
else if (UWorld* World = EditorPC->GetWorld())
{ {
SceneData.LevelName = World->GetMapName(); SceneData.LevelName = World->GetMapName();
SceneData.LevelName.RemoveFromStart(World->StreamingLevelsPrefix); SceneData.LevelName.RemoveFromStart(World->StreamingLevelsPrefix);

View File

@@ -570,11 +570,15 @@ void UPS_Editor_MainWidget::PopulateSceneList()
UPS_Editor_SceneSerializer* Ser = SceneSerializer.Get(); UPS_Editor_SceneSerializer* Ser = SceneSerializer.Get();
if (!Ser) return; if (!Ser) return;
// Get current level name for filtering // Get current level name for filtering (use override if set)
FString CurrentLevel; FString CurrentLevel;
if (APlayerController* PC = GetOwningPlayer()) if (APS_Editor_PlayerController* EditorPC = Cast<APS_Editor_PlayerController>(GetOwningPlayer()))
{ {
if (UWorld* World = PC->GetWorld()) if (!EditorPC->BaseLevelNameOverride.IsEmpty())
{
CurrentLevel = EditorPC->BaseLevelNameOverride;
}
else if (UWorld* World = EditorPC->GetWorld())
{ {
CurrentLevel = World->GetMapName(); CurrentLevel = World->GetMapName();
CurrentLevel.RemoveFromStart(World->StreamingLevelsPrefix); CurrentLevel.RemoveFromStart(World->StreamingLevelsPrefix);