ue-mcp 0.4.18 → 0.4.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tools/animation.js +2 -1
- package/dist/tools/animation.js.map +1 -1
- package/dist/tools/blueprint.js +3 -1
- package/dist/tools/blueprint.js.map +1 -1
- package/package.json +1 -1
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.cpp +307 -0
- package/plugin/ue_mcp_bridge/Source/UE_MCP_Bridge/Private/Handlers/BlueprintHandlers.h +1 -0
package/dist/tools/animation.js
CHANGED
|
@@ -25,7 +25,7 @@ export const animationTool = categoryTool("animation", "Animation assets, skelet
|
|
|
25
25
|
- read_blendspace: Read blendspace. Params: assetPath
|
|
26
26
|
- list: List anim assets. Params: directory?, recursive?
|
|
27
27
|
- create_montage: Create montage. Params: animSequencePath, name?, packagePath?
|
|
28
|
-
- create_anim_blueprint: Create AnimBP. Params: skeletonPath, name?, packagePath?
|
|
28
|
+
- create_anim_blueprint: Create AnimBP. Params: skeletonPath, name?, packagePath?, parentClass? (e.g. "MyAnimInstance")
|
|
29
29
|
- create_blendspace: Create blendspace. Params: skeletonPath, name?, packagePath?, axisHorizontal?, axisVertical?
|
|
30
30
|
- add_notify: Add notify. Params: assetPath, notifyName, triggerTime, notifyClass?
|
|
31
31
|
- get_skeleton_info: Read skeleton. Params: assetPath
|
|
@@ -58,6 +58,7 @@ export const animationTool = categoryTool("animation", "Animation assets, skelet
|
|
|
58
58
|
frameRate: z.number().optional(),
|
|
59
59
|
boneName: z.string().optional(),
|
|
60
60
|
boneNames: z.array(z.string()).optional(),
|
|
61
|
+
parentClass: z.string().optional().describe("Parent AnimInstance class name for create_anim_blueprint"),
|
|
61
62
|
keyframes: z.array(z.object({
|
|
62
63
|
frame: z.number(),
|
|
63
64
|
location: z.object({ x: z.number(), y: z.number(), z: z.number() }).optional(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../../src/tools/animation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"animation.js","sourceRoot":"","sources":["../../src/tools/animation.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/blueprint.js
CHANGED
|
@@ -16,6 +16,7 @@ export const blueprintTool = categoryTool("blueprint", "Blueprint reading, autho
|
|
|
16
16
|
set_node_property: bp("set_node_property", (p) => ({ path: p.assetPath, graphName: p.graphName, nodeName: p.nodeName, propertyName: p.propertyName, value: p.value })),
|
|
17
17
|
connect_pins: bp("connect_pins"),
|
|
18
18
|
add_component: bp("add_component", (p) => ({ path: p.assetPath, componentClass: p.componentClass, componentName: p.componentName ?? p.componentClass })),
|
|
19
|
+
set_component_property: bp("set_component_property", (p) => ({ path: p.assetPath, componentName: p.componentName, propertyName: p.propertyName, value: p.value })),
|
|
19
20
|
compile: bp("compile_blueprint", (p) => ({ path: p.assetPath })),
|
|
20
21
|
list_node_types: bp("list_node_types"),
|
|
21
22
|
search_node_types: bp("search_node_types"),
|
|
@@ -23,7 +24,7 @@ export const blueprintTool = categoryTool("blueprint", "Blueprint reading, autho
|
|
|
23
24
|
add_interface: bp("add_blueprint_interface"),
|
|
24
25
|
list_graphs: bp("list_blueprint_graphs", (p) => ({ path: p.assetPath })),
|
|
25
26
|
add_event_dispatcher: bp("add_event_dispatcher"),
|
|
26
|
-
}, `- read: Read
|
|
27
|
+
}, `- read: Read BP structure incl. SCS components (name, class, mesh, materials, transform). Params: assetPath
|
|
27
28
|
- list_variables: List variables. Params: assetPath
|
|
28
29
|
- list_functions: List functions/graphs. Params: assetPath
|
|
29
30
|
- list_graphs: List all graphs in a blueprint (EventGraph, AnimGraph, functions). Params: assetPath
|
|
@@ -39,6 +40,7 @@ export const blueprintTool = categoryTool("blueprint", "Blueprint reading, autho
|
|
|
39
40
|
- set_node_property: Set node pin default or struct property (supports dot paths like "Node.IKBone.BoneName"). Params: assetPath, graphName, nodeName, propertyName, value
|
|
40
41
|
- connect_pins: Wire nodes. Params: sourceNode, sourcePin, targetNode, targetPin, assetPath, graphName?
|
|
41
42
|
- add_component: Add BP component. Params: assetPath, componentClass, componentName?
|
|
43
|
+
- set_component_property: Set property on SCS component template (supports dot paths, asset paths for object refs). Params: assetPath, componentName, propertyName, value
|
|
42
44
|
- compile: Compile Blueprint. Params: assetPath
|
|
43
45
|
- list_node_types: List node types. Params: category?, includeFunctions?
|
|
44
46
|
- search_node_types: Search nodes. Params: query
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../../src/tools/blueprint.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../../src/tools/blueprint.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -41,6 +41,15 @@
|
|
|
41
41
|
#include "Kismet/KismetStringLibrary.h"
|
|
42
42
|
#include "Kismet/KismetArrayLibrary.h"
|
|
43
43
|
|
|
44
|
+
// SCS component access
|
|
45
|
+
#include "Engine/SimpleConstructionScript.h"
|
|
46
|
+
#include "Engine/SCS_Node.h"
|
|
47
|
+
#include "Components/StaticMeshComponent.h"
|
|
48
|
+
#include "Components/SkeletalMeshComponent.h"
|
|
49
|
+
#include "Engine/StaticMesh.h"
|
|
50
|
+
#include "Engine/SkeletalMesh.h"
|
|
51
|
+
#include "EditorAssetLibrary.h"
|
|
52
|
+
|
|
44
53
|
// Helper: find a UClass by short name (e.g. "AnimInstance" finds UAnimInstance)
|
|
45
54
|
static UClass* FindClassByShortName(const FString& ClassName)
|
|
46
55
|
{
|
|
@@ -83,6 +92,7 @@ void FBlueprintHandlers::RegisterHandlers(FMCPHandlerRegistry& Registry)
|
|
|
83
92
|
Registry.RegisterHandler(TEXT("delete_node"), &DeleteNode);
|
|
84
93
|
Registry.RegisterHandler(TEXT("set_node_property"), &SetNodeProperty);
|
|
85
94
|
Registry.RegisterHandler(TEXT("list_blueprint_graphs"), &ListGraphs);
|
|
95
|
+
Registry.RegisterHandler(TEXT("set_component_property"), &SetComponentProperty);
|
|
86
96
|
}
|
|
87
97
|
|
|
88
98
|
UBlueprint* FBlueprintHandlers::LoadBlueprint(const FString& AssetPath)
|
|
@@ -330,6 +340,115 @@ TSharedPtr<FJsonValue> FBlueprintHandlers::ReadBlueprint(const TSharedPtr<FJsonO
|
|
|
330
340
|
{
|
|
331
341
|
Result->SetStringField(TEXT("parentClass"), Blueprint->ParentClass->GetName());
|
|
332
342
|
}
|
|
343
|
+
|
|
344
|
+
// Enumerate SCS components
|
|
345
|
+
TArray<TSharedPtr<FJsonValue>> ComponentsArray;
|
|
346
|
+
if (USimpleConstructionScript* SCS = Blueprint->SimpleConstructionScript)
|
|
347
|
+
{
|
|
348
|
+
// Build child->parent map from the tree
|
|
349
|
+
TMap<USCS_Node*, USCS_Node*> ParentMap;
|
|
350
|
+
for (USCS_Node* Node : SCS->GetAllNodes())
|
|
351
|
+
{
|
|
352
|
+
if (!Node) continue;
|
|
353
|
+
for (USCS_Node* Child : Node->ChildNodes)
|
|
354
|
+
{
|
|
355
|
+
if (Child) ParentMap.Add(Child, Node);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
for (USCS_Node* Node : SCS->GetAllNodes())
|
|
360
|
+
{
|
|
361
|
+
if (!Node || !Node->ComponentTemplate) continue;
|
|
362
|
+
|
|
363
|
+
UActorComponent* Template = Node->ComponentTemplate;
|
|
364
|
+
TSharedPtr<FJsonObject> CompObj = MakeShared<FJsonObject>();
|
|
365
|
+
CompObj->SetStringField(TEXT("name"), Node->GetVariableName().ToString());
|
|
366
|
+
CompObj->SetStringField(TEXT("class"), Template->GetClass()->GetName());
|
|
367
|
+
|
|
368
|
+
// Parent component
|
|
369
|
+
if (USCS_Node** ParentPtr = ParentMap.Find(Node))
|
|
370
|
+
{
|
|
371
|
+
CompObj->SetStringField(TEXT("parent"), (*ParentPtr)->GetVariableName().ToString());
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
// Transform for SceneComponents
|
|
375
|
+
if (USceneComponent* SceneComp = Cast<USceneComponent>(Template))
|
|
376
|
+
{
|
|
377
|
+
TSharedPtr<FJsonObject> Loc = MakeShared<FJsonObject>();
|
|
378
|
+
Loc->SetNumberField(TEXT("x"), SceneComp->GetRelativeLocation().X);
|
|
379
|
+
Loc->SetNumberField(TEXT("y"), SceneComp->GetRelativeLocation().Y);
|
|
380
|
+
Loc->SetNumberField(TEXT("z"), SceneComp->GetRelativeLocation().Z);
|
|
381
|
+
CompObj->SetObjectField(TEXT("relativeLocation"), Loc);
|
|
382
|
+
|
|
383
|
+
TSharedPtr<FJsonObject> Rot = MakeShared<FJsonObject>();
|
|
384
|
+
Rot->SetNumberField(TEXT("pitch"), SceneComp->GetRelativeRotation().Pitch);
|
|
385
|
+
Rot->SetNumberField(TEXT("yaw"), SceneComp->GetRelativeRotation().Yaw);
|
|
386
|
+
Rot->SetNumberField(TEXT("roll"), SceneComp->GetRelativeRotation().Roll);
|
|
387
|
+
CompObj->SetObjectField(TEXT("relativeRotation"), Rot);
|
|
388
|
+
|
|
389
|
+
TSharedPtr<FJsonObject> Scale = MakeShared<FJsonObject>();
|
|
390
|
+
Scale->SetNumberField(TEXT("x"), SceneComp->GetRelativeScale3D().X);
|
|
391
|
+
Scale->SetNumberField(TEXT("y"), SceneComp->GetRelativeScale3D().Y);
|
|
392
|
+
Scale->SetNumberField(TEXT("z"), SceneComp->GetRelativeScale3D().Z);
|
|
393
|
+
CompObj->SetObjectField(TEXT("relativeScale3D"), Scale);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
// StaticMesh info
|
|
397
|
+
if (UStaticMeshComponent* SMC = Cast<UStaticMeshComponent>(Template))
|
|
398
|
+
{
|
|
399
|
+
if (UStaticMesh* Mesh = SMC->GetStaticMesh())
|
|
400
|
+
{
|
|
401
|
+
CompObj->SetStringField(TEXT("staticMesh"), Mesh->GetPathName());
|
|
402
|
+
}
|
|
403
|
+
// Material overrides
|
|
404
|
+
TArray<TSharedPtr<FJsonValue>> Mats;
|
|
405
|
+
for (int32 i = 0; i < SMC->GetNumMaterials(); i++)
|
|
406
|
+
{
|
|
407
|
+
if (UMaterialInterface* Mat = SMC->GetMaterial(i))
|
|
408
|
+
{
|
|
409
|
+
Mats.Add(MakeShared<FJsonValueString>(Mat->GetPathName()));
|
|
410
|
+
}
|
|
411
|
+
else
|
|
412
|
+
{
|
|
413
|
+
Mats.Add(MakeShared<FJsonValueNull>());
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
if (Mats.Num() > 0)
|
|
417
|
+
{
|
|
418
|
+
CompObj->SetArrayField(TEXT("materials"), Mats);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// SkeletalMesh info
|
|
423
|
+
if (USkeletalMeshComponent* SkMC = Cast<USkeletalMeshComponent>(Template))
|
|
424
|
+
{
|
|
425
|
+
if (USkeletalMesh* Mesh = SkMC->GetSkeletalMeshAsset())
|
|
426
|
+
{
|
|
427
|
+
CompObj->SetStringField(TEXT("skeletalMesh"), Mesh->GetPathName());
|
|
428
|
+
}
|
|
429
|
+
TArray<TSharedPtr<FJsonValue>> Mats;
|
|
430
|
+
for (int32 i = 0; i < SkMC->GetNumMaterials(); i++)
|
|
431
|
+
{
|
|
432
|
+
if (UMaterialInterface* Mat = SkMC->GetMaterial(i))
|
|
433
|
+
{
|
|
434
|
+
Mats.Add(MakeShared<FJsonValueString>(Mat->GetPathName()));
|
|
435
|
+
}
|
|
436
|
+
else
|
|
437
|
+
{
|
|
438
|
+
Mats.Add(MakeShared<FJsonValueNull>());
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
if (Mats.Num() > 0)
|
|
442
|
+
{
|
|
443
|
+
CompObj->SetArrayField(TEXT("materials"), Mats);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
ComponentsArray.Add(MakeShared<FJsonValueObject>(CompObj));
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
Result->SetArrayField(TEXT("components"), ComponentsArray);
|
|
451
|
+
|
|
333
452
|
Result->SetBoolField(TEXT("success"), true);
|
|
334
453
|
|
|
335
454
|
return MakeShared<FJsonValueObject>(Result);
|
|
@@ -2204,3 +2323,191 @@ TSharedPtr<FJsonValue> FBlueprintHandlers::SetNodeProperty(const TSharedPtr<FJso
|
|
|
2204
2323
|
|
|
2205
2324
|
return MakeShared<FJsonValueObject>(Result);
|
|
2206
2325
|
}
|
|
2326
|
+
|
|
2327
|
+
// ---------------------------------------------------------------------------
|
|
2328
|
+
// set_component_property — Set a property on an SCS component template
|
|
2329
|
+
// Params: assetPath, componentName, propertyName, value
|
|
2330
|
+
// ---------------------------------------------------------------------------
|
|
2331
|
+
TSharedPtr<FJsonValue> FBlueprintHandlers::SetComponentProperty(const TSharedPtr<FJsonObject>& Params)
|
|
2332
|
+
{
|
|
2333
|
+
TSharedPtr<FJsonObject> Result = MakeShared<FJsonObject>();
|
|
2334
|
+
|
|
2335
|
+
FString AssetPath;
|
|
2336
|
+
if (!Params->TryGetStringField(TEXT("path"), AssetPath) && !Params->TryGetStringField(TEXT("assetPath"), AssetPath))
|
|
2337
|
+
{
|
|
2338
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'assetPath' parameter"));
|
|
2339
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2340
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2341
|
+
}
|
|
2342
|
+
|
|
2343
|
+
FString ComponentName;
|
|
2344
|
+
if (!Params->TryGetStringField(TEXT("componentName"), ComponentName))
|
|
2345
|
+
{
|
|
2346
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'componentName' parameter"));
|
|
2347
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2348
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2349
|
+
}
|
|
2350
|
+
|
|
2351
|
+
FString PropertyName;
|
|
2352
|
+
if (!Params->TryGetStringField(TEXT("propertyName"), PropertyName))
|
|
2353
|
+
{
|
|
2354
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'propertyName' parameter"));
|
|
2355
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2356
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2357
|
+
}
|
|
2358
|
+
|
|
2359
|
+
FString Value;
|
|
2360
|
+
if (!Params->TryGetStringField(TEXT("value"), Value))
|
|
2361
|
+
{
|
|
2362
|
+
Result->SetStringField(TEXT("error"), TEXT("Missing 'value' parameter"));
|
|
2363
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2364
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2365
|
+
}
|
|
2366
|
+
|
|
2367
|
+
UBlueprint* Blueprint = LoadBlueprint(AssetPath);
|
|
2368
|
+
if (!Blueprint)
|
|
2369
|
+
{
|
|
2370
|
+
Result->SetStringField(TEXT("error"), FString::Printf(TEXT("Blueprint not found: %s"), *AssetPath));
|
|
2371
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2372
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2373
|
+
}
|
|
2374
|
+
|
|
2375
|
+
USimpleConstructionScript* SCS = Blueprint->SimpleConstructionScript;
|
|
2376
|
+
if (!SCS)
|
|
2377
|
+
{
|
|
2378
|
+
Result->SetStringField(TEXT("error"), TEXT("Blueprint has no SimpleConstructionScript (not an Actor blueprint?)"));
|
|
2379
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2380
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2381
|
+
}
|
|
2382
|
+
|
|
2383
|
+
// Find the SCS node by variable name or component template name
|
|
2384
|
+
USCS_Node* TargetNode = nullptr;
|
|
2385
|
+
for (USCS_Node* Node : SCS->GetAllNodes())
|
|
2386
|
+
{
|
|
2387
|
+
if (!Node || !Node->ComponentTemplate) continue;
|
|
2388
|
+
if (Node->GetVariableName().ToString() == ComponentName ||
|
|
2389
|
+
Node->ComponentTemplate->GetName() == ComponentName)
|
|
2390
|
+
{
|
|
2391
|
+
TargetNode = Node;
|
|
2392
|
+
break;
|
|
2393
|
+
}
|
|
2394
|
+
}
|
|
2395
|
+
|
|
2396
|
+
if (!TargetNode || !TargetNode->ComponentTemplate)
|
|
2397
|
+
{
|
|
2398
|
+
// List available component names for error message
|
|
2399
|
+
TArray<FString> Names;
|
|
2400
|
+
for (USCS_Node* Node : SCS->GetAllNodes())
|
|
2401
|
+
{
|
|
2402
|
+
if (Node && Node->ComponentTemplate)
|
|
2403
|
+
{
|
|
2404
|
+
Names.Add(Node->GetVariableName().ToString());
|
|
2405
|
+
}
|
|
2406
|
+
}
|
|
2407
|
+
Result->SetStringField(TEXT("error"), FString::Printf(
|
|
2408
|
+
TEXT("Component '%s' not found. Available: [%s]"),
|
|
2409
|
+
*ComponentName, *FString::Join(Names, TEXT(", "))));
|
|
2410
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2411
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2412
|
+
}
|
|
2413
|
+
|
|
2414
|
+
UActorComponent* Template = TargetNode->ComponentTemplate;
|
|
2415
|
+
|
|
2416
|
+
// Navigate dotted property paths (e.g. "RelativeLocation.X")
|
|
2417
|
+
TArray<FString> PathParts;
|
|
2418
|
+
PropertyName.ParseIntoArray(PathParts, TEXT("."));
|
|
2419
|
+
|
|
2420
|
+
UStruct* CurrentStruct = Template->GetClass();
|
|
2421
|
+
void* CurrentContainer = Template;
|
|
2422
|
+
FProperty* FinalProp = nullptr;
|
|
2423
|
+
|
|
2424
|
+
for (int32 i = 0; i < PathParts.Num(); i++)
|
|
2425
|
+
{
|
|
2426
|
+
FProperty* Prop = CurrentStruct->FindPropertyByName(FName(*PathParts[i]));
|
|
2427
|
+
if (!Prop) break;
|
|
2428
|
+
|
|
2429
|
+
if (i < PathParts.Num() - 1)
|
|
2430
|
+
{
|
|
2431
|
+
FStructProperty* StructProp = CastField<FStructProperty>(Prop);
|
|
2432
|
+
if (!StructProp) break;
|
|
2433
|
+
CurrentContainer = StructProp->ContainerPtrToValuePtr<void>(CurrentContainer);
|
|
2434
|
+
CurrentStruct = StructProp->Struct;
|
|
2435
|
+
}
|
|
2436
|
+
else
|
|
2437
|
+
{
|
|
2438
|
+
FinalProp = Prop;
|
|
2439
|
+
}
|
|
2440
|
+
}
|
|
2441
|
+
|
|
2442
|
+
if (!FinalProp)
|
|
2443
|
+
{
|
|
2444
|
+
// List available properties for error message
|
|
2445
|
+
TArray<FString> PropNames;
|
|
2446
|
+
for (TFieldIterator<FProperty> It(Template->GetClass()); It; ++It)
|
|
2447
|
+
{
|
|
2448
|
+
PropNames.Add(It->GetName());
|
|
2449
|
+
}
|
|
2450
|
+
Result->SetStringField(TEXT("error"), FString::Printf(
|
|
2451
|
+
TEXT("Property '%s' not found on %s. Properties: [%s]"),
|
|
2452
|
+
*PropertyName, *Template->GetClass()->GetName(),
|
|
2453
|
+
*FString::Join(PropNames, TEXT(", "))));
|
|
2454
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2455
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2456
|
+
}
|
|
2457
|
+
|
|
2458
|
+
// For object reference properties, try loading the asset by path first
|
|
2459
|
+
void* ValuePtr = FinalProp->ContainerPtrToValuePtr<void>(CurrentContainer);
|
|
2460
|
+
|
|
2461
|
+
if (FObjectPropertyBase* ObjProp = CastField<FObjectPropertyBase>(FinalProp))
|
|
2462
|
+
{
|
|
2463
|
+
UObject* LoadedObj = LoadObject<UObject>(nullptr, *Value);
|
|
2464
|
+
if (!LoadedObj)
|
|
2465
|
+
{
|
|
2466
|
+
// Try with common prefixes stripped
|
|
2467
|
+
LoadedObj = LoadObject<UObject>(nullptr, *Value);
|
|
2468
|
+
}
|
|
2469
|
+
if (LoadedObj)
|
|
2470
|
+
{
|
|
2471
|
+
ObjProp->SetObjectPropertyValue(ValuePtr, LoadedObj);
|
|
2472
|
+
}
|
|
2473
|
+
else
|
|
2474
|
+
{
|
|
2475
|
+
Result->SetStringField(TEXT("error"), FString::Printf(
|
|
2476
|
+
TEXT("Could not load object at '%s' for property '%s'"), *Value, *PropertyName));
|
|
2477
|
+
Result->SetBoolField(TEXT("success"), false);
|
|
2478
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2479
|
+
}
|
|
2480
|
+
}
|
|
2481
|
+
else if (FSoftObjectProperty* SoftProp = CastField<FSoftObjectProperty>(FinalProp))
|
|
2482
|
+
{
|
|
2483
|
+
FSoftObjectPath SoftPath(Value);
|
|
2484
|
+
SoftProp->SetPropertyValue(ValuePtr, SoftPath);
|
|
2485
|
+
}
|
|
2486
|
+
else
|
|
2487
|
+
{
|
|
2488
|
+
// Generic: use ImportText for value types (int, float, bool, FVector, FName, etc.)
|
|
2489
|
+
FinalProp->ImportText_Direct(*Value, ValuePtr, nullptr, PPF_None);
|
|
2490
|
+
}
|
|
2491
|
+
|
|
2492
|
+
Template->PostEditChange();
|
|
2493
|
+
|
|
2494
|
+
// Compile and save
|
|
2495
|
+
FKismetEditorUtilities::CompileBlueprint(Blueprint);
|
|
2496
|
+
UPackage* Package = Blueprint->GetOutermost();
|
|
2497
|
+
if (Package)
|
|
2498
|
+
{
|
|
2499
|
+
Package->MarkPackageDirty();
|
|
2500
|
+
FString PackageFileName = FPackageName::LongPackageNameToFilename(Package->GetName(), FPackageName::GetAssetPackageExtension());
|
|
2501
|
+
FSavePackageArgs SaveArgs;
|
|
2502
|
+
SaveArgs.TopLevelFlags = RF_Standalone;
|
|
2503
|
+
UPackage::SavePackage(Package, nullptr, *PackageFileName, SaveArgs);
|
|
2504
|
+
}
|
|
2505
|
+
|
|
2506
|
+
Result->SetStringField(TEXT("path"), AssetPath);
|
|
2507
|
+
Result->SetStringField(TEXT("componentName"), ComponentName);
|
|
2508
|
+
Result->SetStringField(TEXT("propertyName"), PropertyName);
|
|
2509
|
+
Result->SetStringField(TEXT("value"), Value);
|
|
2510
|
+
Result->SetBoolField(TEXT("success"), true);
|
|
2511
|
+
|
|
2512
|
+
return MakeShared<FJsonValueObject>(Result);
|
|
2513
|
+
}
|
|
@@ -36,6 +36,7 @@ private:
|
|
|
36
36
|
static TSharedPtr<FJsonValue> DeleteNode(const TSharedPtr<FJsonObject>& Params);
|
|
37
37
|
static TSharedPtr<FJsonValue> SetNodeProperty(const TSharedPtr<FJsonObject>& Params);
|
|
38
38
|
static TSharedPtr<FJsonValue> ListGraphs(const TSharedPtr<FJsonObject>& Params);
|
|
39
|
+
static TSharedPtr<FJsonValue> SetComponentProperty(const TSharedPtr<FJsonObject>& Params);
|
|
39
40
|
|
|
40
41
|
// Helper functions
|
|
41
42
|
static class UBlueprint* LoadBlueprint(const FString& AssetPath);
|