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.
@@ -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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"}
@@ -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 full BP structure. Params: assetPath
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":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,EAAE,EAAgB,MAAM,aAAa,CAAC;AAE7D,MAAM,CAAC,MAAM,aAAa,GAAY,YAAY,CAChD,WAAW,EACX,2IAA2I,EAC3I;IACE,IAAI,EAAe,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACvE,cAAc,EAAK,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACjF,cAAc,EAAK,EAAE,CAAC,0BAA0B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACjF,UAAU,EAAS,EAAE,CAAC,sBAAsB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACrG,MAAM,EAAa,EAAE,CAAC,kBAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IACrG,YAAY,EAAO,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IACpG,uBAAuB,EAAE,EAAE,CAAC,yBAAyB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IAChQ,eAAe,EAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IACtG,eAAe,EAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;IACtG,eAAe,EAAI,EAAE,CAAC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;IAChH,QAAQ,EAAW,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;IAC3J,WAAW,EAAQ,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClH,iBAAiB,EAAE,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;IACtK,YAAY,EAAO,EAAE,CAAC,cAAc,CAAC;IACrC,aAAa,EAAM,EAAE,CAAC,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC,cAAc,EAAE,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5J,OAAO,EAAY,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAC1E,eAAe,EAAI,EAAE,CAAC,iBAAiB,CAAC;IACxC,iBAAiB,EAAE,EAAE,CAAC,mBAAmB,CAAC;IAC1C,gBAAgB,EAAG,EAAE,CAAC,4BAA4B,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IACnF,aAAa,EAAM,EAAE,CAAC,yBAAyB,CAAC;IAChD,WAAW,EAAY,EAAE,CAAC,uBAAuB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAClF,oBAAoB,EAAE,EAAE,CAAC,sBAAsB,CAAC;CACjD,EACD;;;;;;;;;;;;;;;;;;;;;oEAqBkE,EAClE;IACE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;IACjE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;IACrF,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACnF,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACtC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC9E,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACpE,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnE,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3E,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IACxC,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3E,CACF,CAAC"}
1
+ {"version":3,"file":"blueprint.js","sourceRoot":"","sources":["../../src/tools/blueprint.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ue-mcp",
3
- "version": "0.4.18",
3
+ "version": "0.4.20",
4
4
  "description": "Unreal Engine MCP server — 19 tools, 300+ actions for AI-driven editor control",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -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);