#pragma once #include "CoreMinimal.h" #include "MCPHandler.h" #include "MCPFetcher.h" #include "MCPTypes.h" #include "MCPUtils.h" #include "StructUtils/UserDefinedStruct.h" #include "UserDefinedStructure/UserDefinedStructEditorData.h" #include "UMCPHandler_AddStructField.generated.h" // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- UCLASS(meta=(Group="Unclassified")) class UMCPHandler_AddStructField : public UObject, public IMCPHandler { GENERATED_BODY() public: UPROPERTY(meta=(Description="Package path of the struct asset")) FString Struct; UPROPERTY(meta=(Description="Name for the new field")) FString Name; UPROPERTY(meta=(Description="Type for the new field (e.g. 'int32', 'FString', 'FVector')")) FString Type; virtual FString GetDescription() const override { return TEXT("Add a new field to a UserDefinedStruct asset."); } virtual void Handle(const FJsonObject* Json, FStringBuilderBase& Result) override { // Find the struct MCPFetcher F(Result); UUserDefinedStruct* S = F.Walk(Struct).Cast(); if (!S) return; // Resolve type FEdGraphPinType PinType; if (!UMCPTypes::TextToType(Type, PinType, Result)) return; // Snapshot existing GUIDs so we can find the newly added one TSet ExistingGuids; for (const FStructVariableDescription& Var : FStructureEditorUtils::GetVarDesc(S)) ExistingGuids.Add(Var.VarGuid); if (!FStructureEditorUtils::AddVariable(S, PinType)) { Result.Append(TEXT("ERROR: Failed to add field to struct.\n")); return; } // Find the new variable by diffing GUID sets and rename it for (const FStructVariableDescription& Var : FStructureEditorUtils::GetVarDesc(S)) { if (!ExistingGuids.Contains(Var.VarGuid)) { FStructureEditorUtils::RenameVariable(S, Var.VarGuid, Name); break; } } MCPUtils::SaveGenericPackage(S); Result.Appendf(TEXT("Added field: %s %s\n"), *Type, *Name); } };