2026-03-08 22:17:14 -04:00
# pragma once
# include "CoreMinimal.h"
# include "MCPHandler.h"
2026-03-10 07:17:42 -04:00
# include "MCPFetcher.h"
2026-03-08 22:17:14 -04:00
# include "MCPUtils.h"
# include "Engine/Blueprint.h"
# include "Kismet2/BlueprintEditorUtils.h"
2026-03-12 00:44:17 -04:00
# include "Blueprint_SetVariableMetadata.generated.h"
2026-03-08 22:17:14 -04:00
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
// ---------------------------------------------------------------------------
2026-03-12 00:44:17 -04:00
UCLASS ( )
class UMCP_Blueprint_SetVariableMetadata : public UObject , public IMCPHandler
2026-03-08 22:17:14 -04:00
{
GENERATED_BODY ( )
public :
UPROPERTY ( meta = ( Description = " Blueprint name or package path " ) )
FString Blueprint ;
UPROPERTY ( meta = ( Description = " Name of the variable to modify " ) )
FString Variable ;
UPROPERTY ( meta = ( Optional , Description = " Category to assign the variable to " ) )
FString Category ;
UPROPERTY ( meta = ( Optional , Description = " Tooltip text for the variable " ) )
FString Tooltip ;
UPROPERTY ( meta = ( Optional , Description = " Replication mode: none, replicated, or repNotify " ) )
FString Replication ;
UPROPERTY ( meta = ( Optional , Description = " If true, expose this variable on spawn " ) )
bool ExposeOnSpawn = false ;
UPROPERTY ( meta = ( Optional , Description = " If true, mark the variable as private " ) )
bool IsPrivate = false ;
UPROPERTY ( meta = ( Optional , Description = " Editability mode: editAnywhere, editDefaultsOnly, editInstanceOnly, or none " ) )
FString Editability ;
virtual FString GetDescription ( ) const override
{
return TEXT ( " Set variable metadata properties such as category, tooltip, "
" replication, editability, and visibility flags. " ) ;
}
2026-03-10 07:17:42 -04:00
virtual void Handle ( const FJsonObject * Json , FStringBuilderBase & Result ) override
2026-03-08 22:17:14 -04:00
{
2026-03-10 07:17:42 -04:00
MCPFetcher F ( Result ) ;
UBlueprint * BP = F . Walk ( Blueprint ) . Cast < UBlueprint > ( ) ;
if ( ! BP ) return ;
2026-03-08 22:17:14 -04:00
2026-03-10 07:17:42 -04:00
// Find the variable using Identifies for consistent name matching
2026-03-08 22:17:14 -04:00
FBPVariableDescription * VarDesc = nullptr ;
for ( FBPVariableDescription & Var : BP - > NewVariables )
{
2026-03-10 07:17:42 -04:00
if ( MCPUtils : : FormatName ( Var ) = = Variable | |
Var . VarName . ToString ( ) . Equals ( Variable , ESearchCase : : IgnoreCase ) )
2026-03-08 22:17:14 -04:00
{
VarDesc = & Var ;
break ;
}
}
if ( ! VarDesc )
{
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " ERROR: Variable '%s' not found in %s. \n Available variables: \n " ) ,
* Variable , * MCPUtils : : FormatName ( BP ) ) ;
2026-03-08 22:17:14 -04:00
for ( const FBPVariableDescription & Var : BP - > NewVariables )
{
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " %s \n " ) , * MCPUtils : : FormatName ( Var ) ) ;
2026-03-08 22:17:14 -04:00
}
return ;
}
2026-03-10 07:17:42 -04:00
FName VarFName = VarDesc - > VarName ;
int32 ChangeCount = 0 ;
2026-03-12 01:31:57 -04:00
F . PreEdit ( ) ;
2026-03-08 22:17:14 -04:00
// Category
if ( Json - > HasField ( TEXT ( " category " ) ) )
{
VarDesc - > Category = FText : : FromString ( Category ) ;
FBlueprintEditorUtils : : SetBlueprintVariableCategory ( BP , VarFName , nullptr , FText : : FromString ( Category ) ) ;
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " Set category to '%s'. \n " ) , * Category ) ;
ChangeCount + + ;
2026-03-08 22:17:14 -04:00
}
// Tooltip
if ( Json - > HasField ( TEXT ( " tooltip " ) ) )
{
FBlueprintEditorUtils : : SetBlueprintVariableMetaData ( BP , VarFName , nullptr , TEXT ( " tooltip " ) , Tooltip ) ;
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " Set tooltip to '%s'. \n " ) , * Tooltip ) ;
ChangeCount + + ;
2026-03-08 22:17:14 -04:00
}
// Replication
if ( Json - > HasField ( TEXT ( " replication " ) ) )
{
if ( Replication = = TEXT ( " none " ) )
{
VarDesc - > PropertyFlags & = ~ CPF_Net ;
VarDesc - > PropertyFlags & = ~ CPF_RepNotify ;
VarDesc - > RepNotifyFunc = NAME_None ;
}
else if ( Replication = = TEXT ( " replicated " ) )
{
VarDesc - > PropertyFlags | = CPF_Net ;
VarDesc - > PropertyFlags & = ~ CPF_RepNotify ;
VarDesc - > RepNotifyFunc = NAME_None ;
}
else if ( Replication = = TEXT ( " repNotify " ) )
{
VarDesc - > PropertyFlags | = CPF_Net | CPF_RepNotify ;
VarDesc - > RepNotifyFunc = FName ( * FString : : Printf ( TEXT ( " OnRep_%s " ) , * Variable ) ) ;
}
else
{
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " ERROR: Invalid replication value '%s'. Valid: none, replicated, repNotify \n " ) , * Replication ) ;
return ;
2026-03-08 22:17:14 -04:00
}
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " Set replication to '%s'. \n " ) , * Replication ) ;
ChangeCount + + ;
2026-03-08 22:17:14 -04:00
}
// ExposeOnSpawn
if ( Json - > HasField ( TEXT ( " exposeOnSpawn " ) ) )
{
if ( ExposeOnSpawn )
VarDesc - > PropertyFlags | = CPF_ExposeOnSpawn ;
else
VarDesc - > PropertyFlags & = ~ CPF_ExposeOnSpawn ;
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " Set exposeOnSpawn to %s. \n " ) , ExposeOnSpawn ? TEXT ( " true " ) : TEXT ( " false " ) ) ;
ChangeCount + + ;
2026-03-08 22:17:14 -04:00
}
// isPrivate
if ( Json - > HasField ( TEXT ( " isPrivate " ) ) )
{
FBlueprintEditorUtils : : SetBlueprintVariableMetaData ( BP , VarFName , nullptr ,
TEXT ( " BlueprintPrivate " ) , IsPrivate ? TEXT ( " true " ) : TEXT ( " false " ) ) ;
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " Set isPrivate to %s. \n " ) , IsPrivate ? TEXT ( " true " ) : TEXT ( " false " ) ) ;
ChangeCount + + ;
2026-03-08 22:17:14 -04:00
}
2026-03-10 07:17:42 -04:00
// Editability
2026-03-08 22:17:14 -04:00
if ( Json - > HasField ( TEXT ( " editability " ) ) )
{
VarDesc - > PropertyFlags & = ~ ( CPF_Edit | CPF_DisableEditOnInstance | CPF_DisableEditOnTemplate ) ;
if ( Editability = = TEXT ( " editAnywhere " ) )
{
VarDesc - > PropertyFlags | = CPF_Edit ;
}
else if ( Editability = = TEXT ( " editDefaultsOnly " ) )
{
VarDesc - > PropertyFlags | = CPF_Edit | CPF_DisableEditOnInstance ;
}
else if ( Editability = = TEXT ( " editInstanceOnly " ) )
{
VarDesc - > PropertyFlags | = CPF_Edit | CPF_DisableEditOnTemplate ;
}
2026-03-10 07:17:42 -04:00
else if ( Editability ! = TEXT ( " none " ) )
2026-03-08 22:17:14 -04:00
{
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " ERROR: Invalid editability value '%s'. Valid: editAnywhere, editDefaultsOnly, editInstanceOnly, none \n " ) , * Editability ) ;
return ;
2026-03-08 22:17:14 -04:00
}
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " Set editability to '%s'. \n " ) , * Editability ) ;
ChangeCount + + ;
2026-03-08 22:17:14 -04:00
}
2026-03-10 07:17:42 -04:00
if ( ChangeCount = = 0 )
2026-03-08 22:17:14 -04:00
{
2026-03-10 07:17:42 -04:00
Result . Append ( TEXT ( " ERROR: No metadata fields specified. Provide at least one of: category, tooltip, replication, exposeOnSpawn, isPrivate, editability \n " ) ) ;
return ;
2026-03-08 22:17:14 -04:00
}
2026-03-12 01:31:57 -04:00
F . PostEdit ( ) ;
2026-03-08 22:17:14 -04:00
bool bSaved = MCPUtils : : SaveBlueprintPackage ( BP ) ;
2026-03-10 07:17:42 -04:00
Result . Appendf ( TEXT ( " Updated %d field(s) on %s in %s.%s \n " ) ,
ChangeCount , * VarFName . ToString ( ) , * MCPUtils : : FormatName ( BP ) ,
bSaved ? TEXT ( " " ) : TEXT ( " WARNING: save failed. " ) ) ;
2026-03-08 22:17:14 -04:00
}
} ;