From 81abf8730530bea7c1914f5028247664f0a96df9 Mon Sep 17 00:00:00 2001 From: jyelon Date: Sun, 15 Mar 2026 23:02:37 -0400 Subject: [PATCH] Add editing of variable defaults to BlueprrintVariable functions. --- Content/Testing/BP_VarTest2.uasset | 4 +- .../Handlers/BlueprintVariable_Create.h | 2 +- .../Handlers/BlueprintVariable_Modify.h | 2 +- .../BlueprintMCP/Private/BPVarEditor.cpp | 47 ++++++++++++++++--- .../Source/BlueprintMCP/Public/BPVarEditor.h | 13 +++-- 5 files changed, 53 insertions(+), 15 deletions(-) diff --git a/Content/Testing/BP_VarTest2.uasset b/Content/Testing/BP_VarTest2.uasset index d89a665d..09917adf 100644 --- a/Content/Testing/BP_VarTest2.uasset +++ b/Content/Testing/BP_VarTest2.uasset @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:af0f525d40c30779f7f64dd24204f92b5145e9d24e9e0957284e646080004e80 -size 46477 +oid sha256:769d8a49cd6d6bce7daba5a3cabd0bf9bc39469c6534dfbda1ac1baecf3df261 +size 25017 diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Handlers/BlueprintVariable_Create.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Handlers/BlueprintVariable_Create.h index b97026ae..693c6e51 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Handlers/BlueprintVariable_Create.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Handlers/BlueprintVariable_Create.h @@ -69,7 +69,7 @@ public: // Apply config if provided if (Config.Json && Config.Json->Values.Num() > 0) { - if (!Editor.LoadJson(Config.Json.Get())) + if (!Editor.ApplyJson(Config.Json.Get())) return; } diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Handlers/BlueprintVariable_Modify.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Handlers/BlueprintVariable_Modify.h index e6744135..ddef4949 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Handlers/BlueprintVariable_Modify.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Handlers/BlueprintVariable_Modify.h @@ -53,7 +53,7 @@ public: return; } - if (!Editor.LoadJson(Properties.Json.Get())) + if (!Editor.ApplyJson(Properties.Json.Get())) return; UMCPServer::Printf(TEXT("Modified variable %s (%s) in %s\n"), diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/BPVarEditor.cpp b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/BPVarEditor.cpp index 8db79383..50edf71f 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/BPVarEditor.cpp +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Private/BPVarEditor.cpp @@ -16,11 +16,21 @@ FBPVarEditor::FBPVarEditor(UBlueprint* BP, const FString& VarName) return; } Desc = &BP->NewVariables[VarIndex]; + + // Try to find the default value property on the CDO. + if (BP->GeneratedClass) + { + UObject* CDO = BP->GeneratedClass->GetDefaultObject(); + FProperty* Prop = BP->GeneratedClass->FindPropertyByName(VarFName); + if (CDO && Prop) + DefaultValueProp = MCPProperty(Prop, CDO); + } } void FBPVarEditor::Dump() { - Load(); + LoadFlags(); + LoadDefault(); TArray Props = MergedProperties(); for (MCPProperty& P : Props) { @@ -31,17 +41,22 @@ void FBPVarEditor::Dump() } } -bool FBPVarEditor::LoadJson(const FJsonObject* Json) +bool FBPVarEditor::ApplyJson(const FJsonObject* Json) { - Load(); + LoadFlags(); + bool bHasDefault = Json->HasField(TEXT("DefaultValue")); + TArray Props = MergedProperties(); if (!MCPJson::PopulateFromJson(Props, Json, true)) return false; - Save(); + + SaveFlags(); + if (bHasDefault) + return SaveDefault(); return true; } -void FBPVarEditor::Load() +void FBPVarEditor::LoadFlags() { InstanceEditable = !(Desc->PropertyFlags & CPF_DisableEditOnInstance); BlueprintReadOnly = (Desc->PropertyFlags & CPF_BlueprintReadOnly) != 0; @@ -49,14 +64,21 @@ void FBPVarEditor::Load() ExposeOnSpawn = Desc->HasMetaData(FBlueprintMetadata::MD_ExposeOnSpawn); Private = Desc->HasMetaData(FBlueprintMetadata::MD_Private); - FString Tooltip; if (Desc->HasMetaData(TEXT("tooltip"))) Description = Desc->GetMetaData(TEXT("tooltip")); else Description.Empty(); } -void FBPVarEditor::Save() const +void FBPVarEditor::LoadDefault() +{ + if (DefaultValueProp) + DefaultValue = DefaultValueProp.GetText(); + else + DefaultValue.Empty(); +} + +void FBPVarEditor::SaveFlags() { // CPF flags if (InstanceEditable) @@ -92,6 +114,13 @@ void FBPVarEditor::Save() const Desc->RemoveMetaData(TEXT("tooltip")); } +bool FBPVarEditor::SaveDefault() +{ + if (DefaultValueProp) + return DefaultValueProp.SetText(DefaultValue); + return true; +} + TArray FBPVarEditor::MergedProperties() { TArray Props = MCPProperty::GetAll( @@ -106,5 +135,9 @@ TArray FBPVarEditor::MergedProperties() Props.Append(MCPProperty::GetAll( FBPVarEditor::StaticStruct(), this, (EPropertyFlags)0)); + // Remove DefaultValue if we don't have a CDO property to back it. + if (!DefaultValueProp) + MCPProperty::Remove(Props, TEXT("DefaultValue")); + return Props; } diff --git a/Plugins/BlueprintMCP/Source/BlueprintMCP/Public/BPVarEditor.h b/Plugins/BlueprintMCP/Source/BlueprintMCP/Public/BPVarEditor.h index 963043af..1e2888e8 100644 --- a/Plugins/BlueprintMCP/Source/BlueprintMCP/Public/BPVarEditor.h +++ b/Plugins/BlueprintMCP/Source/BlueprintMCP/Public/BPVarEditor.h @@ -15,13 +15,16 @@ struct FBPVarEditor GENERATED_BODY() FBPVariableDescription* Desc = nullptr; + MCPProperty DefaultValueProp; FBPVarEditor() = default; - FBPVarEditor(FBPVariableDescription* InDesc) : Desc(InDesc) {} FBPVarEditor(UBlueprint* BP, const FString& VarName); bool NotFound() const { return Desc == nullptr; } + UPROPERTY(EditAnywhere, meta=(Optional, Description="Default value in Unreal text format")) + FString DefaultValue; + UPROPERTY(EditAnywhere, meta=(Optional, Description="Variable description/tooltip")) FString Description; @@ -41,13 +44,15 @@ struct FBPVarEditor bool ExposeToCinematics = false; // Load from Desc, populate from JSON, save back to Desc. - bool LoadJson(const FJsonObject* Json); + bool ApplyJson(const FJsonObject* Json); // Print all properties and their current values. void Dump(); private: - void Load(); - void Save() const; + void LoadFlags(); + void LoadDefault(); + void SaveFlags(); + bool SaveDefault(); TArray MergedProperties(); };