create_node ignores posX/posY — every node is placed at (0,0)
Summary
manage_blueprint action=create_node accepts posX/posY but does not apply them: the created node ends up at graph position (0,0). When building a graph programmatically, every created node lands on the origin, stacked on top of each other, and has to be dragged apart by hand — which largely defeats scripted graph authoring.
Environment
- Plugin MCP Automation Bridge (previous reports were v0.5.30 — please confirm current version)
- Unreal Engine 5.6.1; OS: Windows editor, client on WSL2
- MCP client: claude-code (native WebSocket/HTTP transport)
Steps to reproduce
manage_blueprint
action = create_node
blueprintPath= /Game/.../MyBlueprint
graphName = EventGraph
nodeType = K2Node_CallFunction
memberName = Power
memberClass = KismetMathLibrary
posX = 600
posY = 6300
get_node_details on the returned node:
{ "nodeTitle": "Power", "x": 0, "y": 0, ... }
Reproduced for every node created this way in a session (variable get/set, math CallFunction, etc.) — all report x:0, y:0 regardless of the posX/posY passed. Result: dozens of new nodes overlap exactly at the origin.
Expected
The node is placed at the given posX/posY, and get_node_details reports those coordinates.
Likely root cause
NodePosX/NodePosY are not read from the payload (or are assigned before AddNode() / AllocateDefaultPins() and then reset). When routing through FGraphNodeCreator<T>, set the position before finalizing:
FGraphNodeCreator<UK2Node_CallFunction> Creator(*TargetGraph);
UK2Node_CallFunction* Node = Creator.CreateNode(false);
Node->NodePosX = PosX; // from payload
Node->NodePosY = PosY;
Creator.Finalize();
Suggested acceptance checks
create_nodeignoresposX/posY— every node is placed at (0,0)Summary
manage_blueprint action=create_nodeacceptsposX/posYbut does not apply them: the created node ends up at graph position (0,0). When building a graph programmatically, every created node lands on the origin, stacked on top of each other, and has to be dragged apart by hand — which largely defeats scripted graph authoring.Environment
Steps to reproduce
get_node_detailson the returned node:{ "nodeTitle": "Power", "x": 0, "y": 0, ... }Reproduced for every node created this way in a session (variable get/set, math CallFunction, etc.) — all report
x:0, y:0regardless of theposX/posYpassed. Result: dozens of new nodes overlap exactly at the origin.Expected
The node is placed at the given
posX/posY, andget_node_detailsreports those coordinates.Likely root cause
NodePosX/NodePosYare not read from the payload (or are assigned beforeAddNode()/AllocateDefaultPins()and then reset). When routing throughFGraphNodeCreator<T>, set the position before finalizing:Suggested acceptance checks
create_node ... posX=600 posY=6300→get_node_detailsreportsx:600, y:6300.posX/posYstill get a sane default position.