#pragma once #include "CoreMinimal.h" #include "MCPHandler.h" #include "MCPUtils.h" #include "Class_ShowProperties.generated.h" // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- // --------------------------------------------------------------------------- UCLASS() class UMCP_Class_ShowProperties : public UObject, public IMCPHandler { GENERATED_BODY() public: UPROPERTY(meta=(Description="Class name to list properties for")) FString ClassName; UPROPERTY(meta=(Optional, Description="Substring filter for property names")) FString Query; virtual FString GetDescription() const override { return TEXT("List properties on a UClass, including type, owning class, and property flags."); } virtual void Handle(FStringBuilderBase& Result) override { UClass* FoundClass = MCPUtils::FindClassByName(ClassName); if (!FoundClass) { Result.Appendf(TEXT("ERROR: Class '%s' not found\n"), *ClassName); return; } Result.Appendf(TEXT("Properties of %s:\n"), *MCPUtils::FormatName(FoundClass)); int32 Count = 0; for (TFieldIterator PropIt(FoundClass); PropIt; ++PropIt) { FProperty* Prop = *PropIt; if (!Prop) continue; FString PropName = Prop->GetName(); if (!Query.IsEmpty() && !PropName.Contains(Query, ESearchCase::IgnoreCase)) continue; // Build compact flags string TStringBuilder<256> Flags; if (Prop->HasAnyPropertyFlags(CPF_BlueprintVisible)) Flags.Append(TEXT(" BlueprintVisible")); if (Prop->HasAnyPropertyFlags(CPF_BlueprintReadOnly)) Flags.Append(TEXT(" BlueprintReadOnly")); if (Prop->HasAnyPropertyFlags(CPF_Edit)) Flags.Append(TEXT(" EditAnywhere")); if (Prop->HasAnyPropertyFlags(CPF_EditConst)) Flags.Append(TEXT(" VisibleOnly")); if (Prop->HasAnyPropertyFlags(CPF_Config)) Flags.Append(TEXT(" Config")); if (Prop->HasAnyPropertyFlags(CPF_SaveGame)) Flags.Append(TEXT(" SaveGame")); if (Prop->HasAnyPropertyFlags(CPF_Transient)) Flags.Append(TEXT(" Transient")); if (Prop->HasAnyPropertyFlags(CPF_RepNotify)) Flags.Append(TEXT(" RepNotify")); UClass* OwnerClass = Prop->GetOwnerClass(); Result.Appendf(TEXT(" %s %s"), *MCPUtils::FormatPropertyType(Prop), *PropName); if (OwnerClass && OwnerClass != FoundClass) Result.Appendf(TEXT(" [%s]"), *MCPUtils::FormatName(OwnerClass)); if (Flags.Len() > 0) Result.Appendf(TEXT(" (%s)"), Flags.ToString() + 1); // skip leading space Result.Append(TEXT("\n")); Count++; } if (Count == 0) { Result.Append(TEXT("No properties found.\n")); } } };