// Copyright Epic Games, Inc. All Rights Reserved. #include "GameSettingRegistry.h" #include "GameSetting.h" #include "GameSettingCollection.h" #include "GameSettingAction.h" #include #include "Stats/Stats.h" #define LOCTEXT_NAMESPACE "GameSetting" //-------------------------------------- // UGameSettingRegistry //-------------------------------------- UGameSettingRegistry::UGameSettingRegistry() { } void UGameSettingRegistry::Initialize(ULocalPlayer* InLocalPlayer) { OwningLocalPlayer = InLocalPlayer; OnInitialize(InLocalPlayer); //UGameFeaturesSubsystem } void UGameSettingRegistry::Regenerate() { for (UGameSetting* Setting : RegisteredSettings) { Setting->MarkAsGarbage(); } RegisteredSettings.Reset(); TopLevelSettings.Reset(); OnInitialize(OwningLocalPlayer); } bool UGameSettingRegistry::IsFinishedInitializing() const { bool bReady = true; for (UGameSetting* Setting : RegisteredSettings) { if (!Setting->IsReady()) { bReady = false; break; } } return bReady; } void UGameSettingRegistry::SaveChanges() { } void UGameSettingRegistry::GetSettingsForFilter(const FGameSettingFilterState& FilterState, TArray& InOutSettings) { TArray RootSettings; if (FilterState.GetSettingRootList().Num() > 0) { RootSettings.Append(FilterState.GetSettingRootList()); } else { RootSettings.Append(TopLevelSettings); } for (UGameSetting* TopLevelSetting : RootSettings) { if (const UGameSettingCollection* TopLevelCollection = Cast(TopLevelSetting)) { TopLevelCollection->GetSettingsForFilter(FilterState, InOutSettings); } else { if (FilterState.DoesSettingPassFilter(*TopLevelSetting)) { InOutSettings.Add(TopLevelSetting); } } } } UGameSetting* UGameSettingRegistry::FindSettingByDevName(const FName& SettingDevName) { for (UGameSetting* Setting : RegisteredSettings) { if (Setting->GetDevName() == SettingDevName) { return Setting; } } return nullptr; } void UGameSettingRegistry::RegisterSetting(UGameSetting* InSetting) { if (InSetting) { TopLevelSettings.Add(InSetting); InSetting->SetRegistry(this); RegisterInnerSettings(InSetting); } } void UGameSettingRegistry::RegisterInnerSettings(UGameSetting* InSetting) { InSetting->OnSettingChangedEvent.AddUObject(this, &ThisClass::HandleSettingChanged); InSetting->OnSettingEditConditionChangedEvent.AddUObject(this, &ThisClass::HandleSettingEditConditionsChanged); // Not a fan of this, but it makes sense to aggregate action events for simplicity. if (UGameSettingAction* ActionSetting = Cast(InSetting)) { ActionSetting->OnExecuteNamedActionEvent.AddUObject(this, &ThisClass::HandleSettingNamedAction); } // Not a fan of this, but it makes sense to aggregate navigation events for simplicity. else if (UGameSettingCollectionPage* NewPageCollection = Cast(InSetting)) { NewPageCollection->OnExecuteNavigationEvent.AddUObject(this, &ThisClass::HandleSettingNavigation); } #if !UE_BUILD_SHIPPING ensureAlwaysMsgf(!RegisteredSettings.Contains(InSetting), TEXT("This setting has already been registered!")); ensureAlwaysMsgf(nullptr == RegisteredSettings.FindByPredicate([&InSetting](UGameSetting* ExistingSetting) { return InSetting->GetDevName() == ExistingSetting->GetDevName(); }), TEXT("A setting with this DevName has already been registered! DevNames must be unique within a registry.")); #endif RegisteredSettings.Add(InSetting); for (UGameSetting* ChildSetting : InSetting->GetChildSettings()) { RegisterInnerSettings(ChildSetting); } } void UGameSettingRegistry::HandleSettingChanged(UGameSetting* Setting, EGameSettingChangeReason Reason) { OnSettingChangedEvent.Broadcast(Setting, Reason); } void UGameSettingRegistry::HandleSettingEditConditionsChanged(UGameSetting* Setting) { OnSettingEditConditionChangedEvent.Broadcast(Setting); } void UGameSettingRegistry::HandleSettingNamedAction(UGameSetting* Setting, FGameplayTag GameSettings_Action_Tag) { OnSettingNamedActionEvent.Broadcast(Setting, GameSettings_Action_Tag); } void UGameSettingRegistry::HandleSettingNavigation(UGameSetting* Setting) { OnExecuteNavigationEvent.Broadcast(Setting); } #undef LOCTEXT_NAMESPACE