Blueprint¶
104 tools. Back to the index.
add_actor_begin_overlap_event¶
Additive, idempotent.
Add a real AActor event OVERRIDE node (bOverrideFunction set, so it is not an eclipsed stub) -- ReceiveActorBeginOverlap by default, or any other AActor event via event_name (ReceiveActorEndOverlap, ReceiveHit, ReceiveBeginPlay...) -- and compile. Idempotent: an existing override of that event in the graph is returned with already_exists:true. It only reaches events declared on the ACTOR; for a component's delegate use add_component_bound_event, and for an interface member use override_interface_member.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of an Actor Blueprint. |
event_name |
string | no | AActor event function to override; defaults to "ReceiveActorBeginOverlap". Must exist on the Blueprint's class or the call errors. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[...the event's output params...], blueprint_name, graph_name, event_name, is_override, already_exists? } -- is_override:true is what distinguishes a live override from a dead look-alike; already_exists is only present when an existing node was reused.
add_ai_perception_sense¶
Additive, idempotent.
Configure a sight or hearing sense on an AIPerceptionComponent TEMPLATE of a Blueprint, creating the config as an Instanced subobject of the template so it persists with the asset, and saving the package. Idempotent: ConfigureSense dedups by config class, so re-calling with the same sense_type UPDATES the existing config in place instead of stacking a second one. Only "sight" and "hearing" are supported (no damage, touch or team senses). It authors the TEMPLATE only -- whether the AI actually perceives anything is a live-PIE question this cannot answer; read the authored result back with get_ai_perception_senses.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint owning the component |
component_name |
string | yes | Name of the AIPerceptionComponent SCS node |
sense_type |
string | yes | "sight" or "hearing" |
dominant |
boolean | no | Optional bool; if true, sets this sense as the component's dominant sense |
sight_radius |
number | no | (sight) Maximum sight distance, cm (ClampMin 0) |
lose_sight_radius |
number | no | (sight) Distance to keep seeing an already-seen target, cm (ClampMin 0) |
peripheral_vision_angle |
number | no | (sight) Peripheral vision half-angle, degrees (Clamp 0..180) |
hearing_range |
number | no | (hearing) Hearing range, cm (ClampMin 0) |
detect_enemies |
boolean | no | Optional bool affiliation filter |
detect_neutrals |
boolean | no | Optional bool affiliation filter |
detect_friendlies |
boolean | no | Optional bool affiliation filter |
Returns: { blueprint_name, component_name, sense_type, config_class, <sense fields>, note }
add_blueprint_function¶
Destructive.
Create a NEW function graph on a Blueprint, or with override=true a real OVERRIDE of an inherited/interface member (delegated to implement_interface_function, so an event-shape member becomes an event override node and a value-returning one an override graph). It REFUSES rather than guessing: a name that collides with an overridable inherited function errors with a hint instead of silently creating a "<name>_0" shadow, and an EVENT-shape member already shadowed by a local function graph errors telling you to remove that graph first. The new graph does not exist in the generated class until compile_blueprint, so compile BEFORE add_function_parameter or any node that calls it -- otherwise a build_blueprint_graph step fails with "Function not found" and rolls the whole batch back.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
function_name |
string | yes | Name for the new function; with override=true, the EXACT name of the inherited (interface or parent-class) function to override. |
override |
boolean | no | Optional. When true, create an OVERRIDE of an inherited function ('My Blueprint > Override'): resolves the interface/parent-virtual signature and creates the override graph (function-shape) or event override node (event-shape) with the inherited signature + exact name -- NOT a new deduped function. When omitted and the name collides with an inherited overridable function, the call errors with a hint (instead of silently making a '<name>_0' shadow); pass override=false to force a brand-new function anyway. |
Returns: { blueprint_name: string, function_name: string, graph_name: string, success: bool [, kind, already_existed, node_id, already_exists, is_interface_function, note] } -- with override=true the payload is implement_interface_function's (kind='function'|'event', graph_name or node_id). success:true can come back WITHOUT the graph actually appearing, so confirm with get_blueprint_functions before wiring it.
add_blueprint_variable¶
Additive.
Add a MEMBER variable to a Blueprint (add_function_local_variable is the function-scoped twin), then read/write it with add_graph_node node_type=variable_get/variable_set. TRAP 1: the variable is born NOT editable per instance -- placing the actor and writing that variable fails with "cannot be edited on instances" -- and get_blueprint_variables reports instance_editable:true anyway; fix it with set_bp_variable_metadata(instance_editable=true). TRAP 2: on a class that ALREADY has actors placed in a level, those instances keep the value of the first compile, so a default set afterwards never reaches them -- verify on the instances, not on the CDO.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
variable_name |
string | yes | New variable name (fails if the name already exists on this Blueprint). |
variable_type |
string | yes | Type string: bool, int, int64, float, string, name, text, byte, or the name/path of a struct, enum, class or object (e.g. Vector, /Game/Dir/S_Foo.S_Foo, /Script/Engine.Actor). |
is_array |
boolean | no | When true, make the variable an array container; defaults to false. This is the ONLY array authoring path -- add_function_parameter has no equivalent. |
default_value |
string | no | Initial default value for the new variable, in exported-text form; optional |
Returns: { blueprint_name, variable_name, variable_type, is_array } -- an echo of the request, NOT a verification: read the variable back with get_blueprint_variables (or the CDO) before relying on it.
add_branch_node¶
Additive.
Add a Branch (if/then/else) node -- pins 'execute', 'Condition', 'then' (true), 'else' (false) -- AND compile the Blueprint as a side effect. add_graph_node node_type="branch" creates the identical node without compiling, which is what you want inside a build_blueprint_graph batch; use this one when a standalone compile is wanted anyway. Leaving 'else' unwired is legitimate and lint_blueprint_graph will not flag it, except inside a function that returns a value (function_exit_without_return).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[execute, Condition, then, else], blueprint_name, graph_name }
add_break_struct_node¶
Additive.
Create a Break Struct node with ONE OUTPUT PIN PER MEMBER of the struct (Blueprint-defined structs included) and return them all, so each field can be read out with connect_pins without a follow-up read. Same node as add_graph_node node_type="break_struct", but reconstructed after creation so the per-member pins are refreshed from the struct. Inverse: add_make_struct_node. Does NOT compile.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | no | Blueprint name or path. |
struct_type |
string | no | UScriptStruct path (/Game/.../S_Foo.S_Foo), bare name, or engine alias (Vector/Rotator/Transform...). |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. |
position_x |
string | no | Node X position (ignored when node_position is set). |
position_y |
string | no | Node Y position (ignored when node_position is set). |
node_position |
string | no | Node canvas position as [x, y]; takes precedence over position_x/position_y. |
Returns: { node_id, pins:[...the struct input + one output pin per struct member...], blueprint_name, graph_name, struct_type }
add_broadcast_node¶
Additive.
Add the node that BROADCASTS (fires) an event dispatcher on self -- own or inherited -- with one input pin per signature parameter, so listeners run. Does NOT compile. The dispatcher must already exist in the compiled class (add_event_dispatcher then compile_blueprint), and its parameter pins only appear after set_event_dispatcher_signature. The opposite direction (LISTENING) is add_graph_node node_type="add_delegate" for self, add_object_bound_event for another object's dispatcher.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint that owns (or inherits) the dispatcher |
dispatcher_name |
string | yes | Exact name of the multicast delegate to broadcast; resolved on the skeleton class, so inherited dispatchers work |
graph_name |
string | no | Target graph; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[execute, then, one input per signature param], blueprint_name, graph_name, dispatcher_name } -- an empty parameter list means the dispatcher has no signature yet.
add_call_library_function¶
Additive.
Add a call node for a STATIC library function -- an engine library by name (KismetMathLibrary, KismetSystemLibrary, GameplayStatics, KismetStringLibrary, or any other /Script/Engine class) or a USER BlueprintFunctionLibrary by asset path -- and compile. Prefer add_graph_node node_type="call_function" when the target is a member function of an actor/component. Plan the wiring with get_function_pins, which returns the exact pin names WITHOUT creating anything. TRAP inside build_blueprint_graph: the parameter is 'function_library'; passing 'class_name' fails only THAT step ("Missing required parameter: function_library") while the batch continues, leaving every connection that needed the node reporting "Target node not found".
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
function_library |
string | yes | A standard engine function library ("KismetMathLibrary", "KismetSystemLibrary", "GameplayStatics", "KismetStringLibrary", with or without the U prefix) OR a user BlueprintFunctionLibrary asset path ("/Game/Dir/BFL_X", "/Game/Dir/BFL_X.BFL_X", or the "..._C" generated class). |
function_name |
string | yes | Exact UFunction name on that library (e.g. "Abs", "MakeVector", "PrintString"); get_function_pins resolves and previews it first. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[...every param pin, already named...], blueprint_name, graph_name, function_library, function } -- pins come back with the node, so connect_pins/set_pin_default_value need no follow-up read.
add_cast_node¶
Additive.
Add an IMPURE Cast To <Class> node (exec in, Cast Succeeded / Cast Failed out) and compile the Blueprint. Same node as add_graph_node node_type="cast", which does NOT compile -- use that one inside a build_blueprint_graph batch. Skip the cast entirely when it only exists to type a GetComponentByClass result: add_get_component_by_class_node returns a ReturnValue pin already typed to the component class.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
target_class_name |
string | yes | Class to cast to: a name ("Pawn", "Character"), a /Script/Module.Class path, or a Blueprint generated-class path (/Game/Dir/BP_X.BP_X_C). |
target_class |
string | no | Alias accepted instead of target_class_name (same meaning); one of the two is required. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[...], blueprint_name, graph_name, cast_to } -- the node WITH its pins ('execute', 'Object', 'then'/Cast Succeeded, 'CastFailed', 'As<Class>'), so it can be wired without a follow-up read.
add_comment_node¶
Destructive.
Add a resizable comment box (UEdGraphNode_Comment) to a graph. KNOWN BUG: the 'text' parameter is LOST -- the comment is assigned before the node is finalized and the engine's PostPlacedNewNode then overwrites it, so every box created this way reads "Comment"; the returned "comment" field is the oracle and there is no MCP way to fix it (write the rationale in the system's docs instead, and delete the empty box). It also has NO pins, so a pin_defaults entry aimed at it breaks a whole build_blueprint_graph batch.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
text |
string | no | Comment text; currently IGNORED (see the bug above), the box always ends up saying "Comment" |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
width |
number | no | Comment box width in pixels; defaults to 400 |
height |
number | no | Comment box height in pixels; defaults to 200 |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pos_x, pos_y, comment } -- no pins array. comment=="Comment" means the requested text was not written.
add_component_bound_event¶
Additive, idempotent.
Bind a multicast delegate OF ONE OF THIS BLUEPRINT'S OWN COMPONENTS (OnComponentBeginOverlap, OnComponentHit, a vendor component's dispatcher...) to a generated handler event in the event graph -- the editor's component-event flow -- then compile and re-check that the binding registered (bound). ALSO WORKS ON A WIDGET BLUEPRINT: pass the WBP and a WIDGET's name as component_name to wire a Button's OnClicked, a Slider's OnValueChanged, a CheckBox's OnCheckStateChanged -- exactly what the Designer's "+ OnClicked" green button does, and the only headless route to it (bound:true, with a BndEvt__..._OnButtonClickedEvent created). A UMG widget is not an SCS component but IS a property of the generated class, which is all this needs. Idempotent: an identical binding is returned instead of duplicated. The Blueprint must already be compiled, since the component/widget has to exist as a property of the generated class. For a dispatcher on an object that is NOT self and NOT one of its components, use add_object_bound_event; for one on SELF, add_graph_node node_type="add_delegate".
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of an Actor Blueprint OR a Widget Blueprint (already compiled). |
component_name |
string | yes | SCS component variable name on this Blueprint (e.g. "BodyMesh"), OR -- on a Widget Blueprint -- the name of a widget in its tree (e.g. "Btn_Play"); resolved on the skeleton class, so inherited components and widgets work too. |
delegate_name |
string | yes | Exact multicast delegate property name on the COMPONENT's class (e.g. "OnComponentBeginOverlap"). On a miss the error names the component class so the right delegate can be looked up. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[...the delegate's params as OUTPUT pins...], blueprint_name, graph_name, component_name, delegate, custom_function_name, bound, already_exists? } -- bound is a post-compile re-lookup (the real oracle); already_exists is only present when an existing binding was reused.
add_component_to_blueprint¶
Additive.
Add a component to a Blueprint's SCS (engine class or a Blueprint AC_* class) with an optional relative transform and parent, then compile. TRAP 1: on a CHILD Blueprint whose scene root is INHERITED, a SCENE component can end up written into the PARENT's SCS (source:"inherited", owner_class = the parent) -- which silently edits a vendor/library asset; non-scene ActorComponents land correctly on the child. TRAP 2: a scene component of a BLUEPRINT class, or one given a location, can report success without persisting and then materialize LATER as a duplicate. Both have the same oracle: get_blueprint_scs_tree right after, checking owner_class and source of the new node -- never the return value.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
component_type |
string | yes | Component class: a native short name ('StaticMesh', 'Box', 'Sphere'), a /Script path ('/Script/Engine.StaticMeshComponent'), OR a Blueprint component class given as its object path ('/Game/.../AC_Foo.AC_Foo_C'), a bare package path ('/Game/.../AC_Foo'), or a bare '<Name>_C' ('AC_Foo_C'). |
component_name |
string | yes | Name for the new component instance |
location |
array | no | Optional [x, y, z] relative location for scene components |
rotation |
array | no | Optional [pitch, yaw, roll] relative rotation for scene components |
scale |
array | no | Optional [x, y, z] relative scale for scene components |
transform |
object | no | Optional {"location":[x,y,z], "rotation":[p,y,r], "scale":[x,y,z]} alias for scene components; any flat location/rotation/scale arg above wins over the matching axis in here if both are given. |
parent_component_name |
string | no | Optional parent for scene components; omit / "root" attaches under the Blueprint's EXISTING scene root (SCS or native) instead of force-adding a second orphan root node. May also name a NATIVE inherited scene component (e.g. ACharacter's "CharacterMesh0"), mirroring attach_blueprint_component. Ignored for non-scene ActorComponents (no transform, no hierarchy to join). |
socket_name |
string | no | Optional socket/bone name on the parent (AttachToName) |
Returns: { component_name: string, component_type: string } -- an ECHO of the request with no owner, no source and no verification. It says nothing about WHERE the node landed: read get_blueprint_scs_tree afterwards.
add_custom_event_node¶
Additive, idempotent.
Add a NEW Custom Event node (an entry point you invent, not an override of anything) and compile. Idempotent by name: an existing custom event with that name in the graph is returned with already_existed:true, because re-adding one compiles into "more than one function with the same name" and breaks the Blueprint. HARD LIMIT: a custom event cannot be given PARAMETERS -- add_function_parameter answers "Function graph not found" and there is no other route -- so anything that needs arguments (an RPC in particular) must be a function instead. To override an inherited/interface event use override_interface_member.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
event_name |
string | yes | Name for the custom event (becomes CustomFunctionName). Must not collide with an overridable inherited function or lint_blueprint_graph flags it as custom_event_shadowing_override. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[...], blueprint_name, graph_name, event_name, node_title, already_existed } -- the node WITH its pins ('then' and the delegate output), ready for connect_pins. already_existed is only present when an existing event was reused.
add_enhanced_input_action_node¶
Additive.
Add an Enhanced Input action event node (UK2Node_EnhancedInputAction) bound to a UInputAction asset. Unlike add_input_action_event_node -- which creates the LEGACY UK2Node_InputAction that does NOT fire under Enhanced Input -- this node exposes the real ETriggerEvent exec pins (Triggered/Started/Ongoing/Canceled/Completed) that fire from the Enhanced Input pipeline. Use this instead of polling IsInputKeyDown in a timer; it is rebind-aware (bound to the InputAction asset, not a raw key).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of an Actor/Pawn Blueprint. |
input_action |
string | yes | Asset path (or short name) of the UInputAction to bind, e.g. "/Game/Input/IA_Crouch". |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, pins:[{name, direction, type, linked_to, default}], blueprint_name, graph_name, input_action, node_class } -- the created node WITH its freshly-allocated pins: ETriggerEvent exec outputs (Triggered/Started/Ongoing/Canceled/Completed) plus data outputs (ActionValue/ElapsedSeconds/TriggeredSeconds/InputAction). Wire it via connect_pins WITHOUT a follow-up get_graph_nodes.
add_event_dispatcher¶
Additive.
Create an event dispatcher (multicast delegate) on a Blueprint: adds BOTH the delegate member variable and its signature graph, the way the editor's "+ Event Dispatcher" does. It starts with NO parameters -- give it a signature with set_event_dispatcher_signature. Everything downstream needs the class REGENERATED first, so compile_blueprint before add_broadcast_node (to fire it) or add_graph_node node_type="add_delegate" / add_object_bound_event (to listen).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
dispatcher_name |
string | yes | Name of the new event dispatcher; fails if a member variable of that name already exists |
Returns: { blueprint_name, dispatcher_name, created } -- created is always true on success; confirm with get_event_dispatchers.
add_function_local_variable¶
Additive.
Add a variable scoped to ONE function graph (interface-override graphs included), instead of a class member like add_blueprint_variable -- use it for scratch state that no other graph should see. Reach it from the graph with add_graph_node node_type=variable_get/variable_set and scope="local" (the default scope="auto" already prefers a local over a member of the same name).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
function_name |
string | yes | Name of an existing function graph (FunctionGraphs or an interface-override graph) |
variable_name |
string | yes | Variable name; the call fails if the name already exists in that function |
variable_type |
string | yes | Type string: bool, int, int64, float, string, name, text, byte, Vector, or a struct/enum/class/object name or path |
default_value |
string | no | Initial default value for the local variable, in exported-text form; optional |
Returns: { blueprint_name, function_name, variable_name, variable_type } -- an echo of the request; local variables do NOT appear in get_blueprint_variables (which lists members), so verify from the graph itself.
add_function_parameter¶
Additive.
Add an input or output (return) parameter to an existing Blueprint FUNCTION graph -- interface-override graphs included -- and reconstruct its Entry/Result node. TWO HARD LIMITS, both silent-ish: it cannot create an ARRAY parameter (there is no is_array; the param comes out SCALAR with success), so redesign the signature to read the array where it lives; and it cannot reach a CUSTOM EVENT ("Function graph not found"), so a Server/Client RPC WITH arguments must be authored as a function plus set_bp_function_rpc. On a Blueprint just given a new function, compile_blueprint between creation and this call.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
function_name |
string | yes | Name of an existing function graph (FunctionGraphs or an interface-override graph). A custom event is NOT a function graph and is rejected here. |
param_name |
string | yes | New parameter name; made unique, so the applied name is the one echoed back in the response. |
param_type |
string | yes | Type string: bool, int, int64, float, string, name, text, byte, Vector, or a struct/enum/class/object name or path. Arrays are NOT expressible. |
is_output |
boolean | no | When true, add an output/return param (an input pin on the Result node) instead of an input; defaults to false |
Returns: { blueprint_name, function_name, param_name, param_type, is_output } -- param_name is the pin name actually created (uniquified). Verify with get_graph_nodes at compact=false: compact hides the new, still-unlinked pin and makes it look like nothing was created.
add_get_component_by_class_node¶
Additive.
Add a GetComponentByClass node BORN TYPED: the ComponentClass pin is set before the node is reconstructed, so ReturnValue comes out as that component class instead of the generic ActorComponent and no cast is needed. Use it instead of add_graph_node + a pin_defaults entry: inside build_blueprint_graph the defaults are applied AFTER the connections, so a still-generic node fails to connect ("Actor Component Object Reference is not compatible with ...") and, with stop_on_error's default true, takes the whole batch down with it.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint to add the node to |
component_class |
string | yes | Component class to fetch: short name, /Script/Module.Class, or a /Game Blueprint component path. Must be a UActorComponent subclass or the call errors. |
graph_name |
string | no | Target graph; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[...], blueprint_name, graph_name, component_class, return_pin_type } -- return_pin_type is the ORACLE: if it does not name the requested component class, the pin stayed generic and connecting it will fail.
add_graph_node¶
Additive.
Create ONE node in a Blueprint's event/function graph (node_type selects the kind) and return it WITH its freshly allocated pins, so connect_pins / set_pin_default_value can wire it immediately without a follow-up get_graph_nodes. Use build_blueprint_graph instead when several nodes must be created AND wired in a single undo transaction, and get_function_pins to learn a call_function's pin names BEFORE creating anything. node_type='event' creates a REAL override (the declaring interface/parent class is resolved automatically and bOverrideFunction is set; target_class is ignored here) and fails loudly for a name that is not an overridable event -- an interface method WITH a return value is not an event, use implement_interface_function.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name (resolved under /Game/Blueprints) or full asset path. Pass the FULL path when the short name is ambiguous: a bare name that matches two assets resolves to one of them silently. |
node_type |
string | yes | One of event, custom_event, call_function, print_string, variable_get, variable_set, branch, sequence, self, cast, spawn_actor (alias spawn_actor_from_class), create_widget, make_struct, break_struct, get_array_item, select, make_array, make_set, make_map, switch_int, switch_string, switch_name, switch_enum, enum_literal, format_text, foreach, foreach_with_break, do_once, gate, flipflop, for_loop, while_loop, is_valid, add_delegate, macro_instance |
event_name |
string | yes | Event name; required for event and custom_event node types |
function_name |
string | yes | Function to call; required for call_function node type |
target_class |
string | yes | Class owning the function or cast/spawn target class. For variable_get/variable_set it names the class that owns the variable, producing a non-self member-access node (with a 'target' pin) instead of a self-context node. For create_widget it names the widget class to construct (e.g. WBP_Foo_C, a full asset path, or the widget Blueprint short name); the node exposes that widget's Expose-On-Spawn pins. |
variable_name |
string | yes | Variable to get/set; required for variable_get and variable_set |
struct_type |
string | yes | Struct type; required for make_struct and break_struct nodes |
enum_path |
string | yes | Enum path or name; required for switch_enum and enum_literal nodes |
dispatcher |
string | yes | Event-dispatcher (multicast delegate) name; required for add_delegate node type. Must already exist in the COMPILED class (add_event_dispatcher + compile_blueprint), and it binds on self only -- for a dispatcher on another class use add_object_bound_event. |
macro_graph_name |
string | yes | Macro graph name; required for node_type=macro_instance. Resolved against this Blueprint's own MacroGraphs first, then the engine StandardMacros. |
scope |
string | no | Optional scope hint for variable_get/variable_set: 'auto' (default; a function-local variable declared in the target graph wins, else a self/member variable), 'local' (function-local variable ONLY), or 'member' (member variable only -- self, or on target_class when supplied). Ignored by other node types. |
num_inputs |
number | no | Optional input-pin count for make_array/make_set/make_map (added after spawn) |
cases |
string | no | Optional string array of case pins for switch_int/switch_string/switch_name |
arguments |
string | no | Optional string array of argument names for format_text |
macro_source |
string | no | Set to "standard_macros" to skip this Blueprint's own MacroGraphs and resolve macro_graph_name only in the engine StandardMacros library. Only read for node_type=macro_instance. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pos_x, pos_y, comment, pins:[{name, direction:'input'|'output', type, linked_to, default}], blueprint_name, graph_name } -- the created node WITH its freshly-allocated pins. The pin names are already here, so you can wire the node via connect_pins/set_pin_default_value WITHOUT a follow-up get_graph_nodes. Read "class" as a sanity check: a node_type that was expected to produce an async/latent node and comes back as "K2Node_CallFunction" is a mute no-op that still compiles 0/0.
add_input_action_event_node¶
Additive.
Add the LEGACY action-mapping event node (UK2Node_InputAction) bound to an action mapping NAME, and compile. WARNING: this node does NOT fire under Enhanced Input, which is what UE5 projects use -- it compiles clean and simply never runs. For an Enhanced Input action asset use add_enhanced_input_action_node, whose Triggered/Started/Completed pins actually execute. Only reach for this one on a project still using the legacy input mappings.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of an Actor/Pawn Blueprint (SupportsInputEvents is enforced). |
input_action_name |
string | yes | Name of the LEGACY action mapping. It is not validated against the project's mappings: a typo yields a node that never fires. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[Pressed, Released, Key], blueprint_name, graph_name, input_action_name, node_class } -- node_class should read K2Node_InputAction (the legacy node); nothing here proves the mapping exists.
add_macro_instance_node¶
Additive.
Instantiate a macro from a macro LIBRARY asset ("/Game/Lib/ML_X.ML_X:MyMacro", or the library path plus macro_graph) -- the only way to reach a third-party or project macro library, since add_graph_node's macro aliases (foreach, do_once, gate, is_valid...) only look inside the engine StandardMacros. With no library path it falls back to this Blueprint's own MacroGraphs and then StandardMacros. Does NOT compile. Its pins start WILDCARD and only re-type once something is connected, which connect_pins handles by reconstructing the node.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint to add the node to. |
macro |
string | yes | Macro identifier: "<macro-library-path>:<MacroGraphName>" (e.g. "/Game/Lib/ML_X.ML_X:MyMacro"), OR just the library asset path with the graph name in 'macro_graph', OR a bare graph name to resolve against this Blueprint's own MacroGraphs and then the engine StandardMacros. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. |
macro_graph |
string | no | Macro graph name, used when 'macro' is a library path with no ":<GraphName>" suffix. |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, input_pins:[string], output_pins:[string], blueprint_name, graph_name } -- pin NAMES only, split by direction (no types or defaults); use get_node_pin_info on the node_id when the types matter.
add_make_struct_node¶
Additive.
Create a Make Struct node with ONE INPUT PIN PER EDITABLE MEMBER of the struct (Blueprint-defined structs included) and return them all, so the struct can be filled with set_pin_default_value / connect_pins without a follow-up read. Same node as add_graph_node node_type="make_struct", but reconstructed after creation so the per-member pins are refreshed from the struct. Inverse: add_break_struct_node. Does NOT compile.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | no | Blueprint name or path. |
struct_type |
string | no | UScriptStruct path (/Game/.../S_Foo.S_Foo), bare name, or engine alias (Vector/Rotator/Transform...). |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. |
position_x |
string | no | Node X position (ignored when node_position is set). |
position_y |
string | no | Node Y position (ignored when node_position is set). |
node_position |
string | no | Node canvas position as [x, y]; takes precedence over position_x/position_y. |
Returns: { node_id, pins:[...one input pin per struct member + the struct output...], blueprint_name, graph_name, struct_type }
add_object_bound_event¶
Additive.
Bind a BlueprintAssignable event dispatcher of an EXTERNAL object (not self, not a component) to a handler custom event -- the editor's right-click "Assign" flow (FEdGraphSchemaAction_K2AssignDelegate). Use this to react to a dispatcher on a widget/actor instance held in a variable (e.g. a UMG widget's "On Radial Menu Item Selected"): it spawns a UK2Node_AddDelegate bound to target_class' dispatcher with its self/target pin LEFT UNCONNECTED (you wire the instance) and a UK2Node_CustomEvent whose OUTPUT pins mirror the dispatcher's params (e.g. the segment-data struct), already wired to the AddDelegate's Delegate pin. Unlike the add_delegate node_type (self-context only), this reaches a dispatcher on a foreign class. Does NOT compile the Blueprint (mirrors the engine action); compile afterward.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint being edited (the object that will bind the event, e.g. the hub component BP). |
target_class |
string | yes | The EXTERNAL class that owns the dispatcher. Accepts a Blueprint/widget short name, a full asset path, a full class path (/Game/.../WBP.WBP_C), a native /Script path, or the generated "..._C" class name. Prefer a full path or the "_C" class for reliable resolution. |
dispatcher_name |
string | yes | The multicast delegate (event dispatcher) property to assign. Matched tolerantly: exact name, spaces stripped, or the display name (so "On Item Selected" resolves to the spaceless FName). On failure the error lists the assignable delegates found on target_class. |
event_name |
string | no | Optional desired name for the handler custom event; made unique in the Blueprint. Defaults to "<Dispatcher>_Event". |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { blueprint_name, graph_name, target_class, dispatcher, add_delegate_node_id, custom_event_node_id, custom_event_name, wired, node_id, pins:[...] (the AddDelegate node's pins -- wire 'self'/Target = the widget instance and 'execute'/'then' into your exec flow), custom_event:{ node_id, pins:[...] } (hang handler logic off its 'then'/'output_delegate' and read the dispatcher's param output pins) }
add_parent_call_node¶
Additive.
Add a "Parent: <Function>" node that calls the parent-class implementation of an overridden function/event -- the second half of the child-first shape "Event X -> Parent: X -> our logic" that keeps a vendor base class working while the child adds behaviour. Searches the WHOLE ancestor chain, not just the immediate parent. Does NOT compile, and IS allowed inside build_blueprint_graph, so the event + super + logic can be built in one transaction.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint whose parent function is called |
function_name |
string | yes | Name of the overridden function/event whose parent implementation to call; must exist on some ancestor or the call errors |
graph_name |
string | no | Target graph (usually the override's own graph); defaults to the event graph |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[execute, then, the parent's params], blueprint_name, graph_name, function_name, parent_class } -- parent_class names the ancestor that actually declares the implementation being called.
add_reroute_node¶
Additive.
Add a reroute/knot node: pure layout, it re-emits whatever is wired into it and changes no behaviour. Does NOT compile. Note when reading graphs back: get_graph_nodes with compact=true excludes knots by default, so a chain that looks broken there may simply route through one -- re-read with exclude_classes=[].
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[...wildcard in/out until wired...], blueprint_name, graph_name }
add_select_node¶
Additive.
Create a Select node with the RIGHT NUMBER OF OPTION PINS: pass option_count to grow beyond the built-in 2, or an enum in enum_path so one option pin is generated per enum entry and the Index pin becomes that enum. add_graph_node node_type="select" only ever makes the plain 2-option wildcard version. The response names the index pin, the return pin and every option pin, so the branches can be wired without a follow-up read. Its pins stay WILDCARD until something is connected (connect_pins reconstructs the node to re-type them).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. |
option_count |
number | no | Optional total number of option pins to end up with (default = the node's built-in 2; capped internally at a safe growth loop). Ignored when an enum drives the index. |
enum_path |
string | no | Optional enum path/name to drive the Index pin (option pins are then auto-generated per enum entry). An engine enum may live in an unexpected module -- ask the enum itself with static_enum().get_path_name() rather than guessing /Script/Engine. |
index_type |
string | no | Alias of enum_path (an enum path/name for the Index pin). |
position_x |
number | no | Node X position (ignored when node_position is set). |
position_y |
number | no | Node Y position (ignored when node_position is set). |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y. |
Returns: { node_id, pins:[...], blueprint_name, graph_name, index_pin, return_value_pin, option_pins:[string], option_count, index_enum? }
add_sequence_node¶
Additive.
Add a Sequence node that fires its outputs in order, spawned with its default two 'Then 0'/'Then 1' pins (there is no parameter to add more), AND compile the Blueprint. add_graph_node node_type="sequence" makes the same node without compiling -- prefer that inside a build_blueprint_graph batch.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[execute, Then 0, Then 1], blueprint_name, graph_name }
add_timeline_to_blueprint¶
Additive.
Add a Timeline to an Actor Blueprint: creates BOTH the UTimelineTemplate variable and its UK2Node_Timeline node in one call, sets a fixed length in seconds, compiles, and verifies the template really registered (timeline_created). Actor-derived Blueprints only. It does NOT author curves or tracks -- the node comes with Play/Stop/Reverse inputs and Update/Finished outputs and nothing driven; a requested name already in use is silently uniquified, so wire the RETURNED timeline_name.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of an Actor Blueprint. |
timeline_name |
string | yes | Desired variable name for the timeline; if it is taken, a unique one is generated and returned instead. |
length |
number | no | Timeline length in seconds (sets fixed-length mode); defaults to 5.0 |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, class, title, pins:[...], blueprint_name, graph_name, timeline_name, length, timeline_created, timeline_guid } -- timeline_name is the name ACTUALLY used and timeline_created is a post-compile re-lookup of the template, so false means the variable did not survive.
apply_component_property_overrides¶
Destructive.
Re-apply N component-property overrides on ONE Blueprint with a SINGLE compile and a SINGLE save, then verify each value against the POST-COMPILE template (what a fresh instance actually reads). ICH-aware exactly like set_blueprint_component_property: an override on a component inherited from an ancestor Blueprint is routed through this class' InheritableComponentHandler. Built for post-reparent re-authoring, where one call per override means N compiles and N chances for an ICH record not to survive.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset path or short name |
overrides |
array | yes | Array of { component_name, property_name, property_value } objects, applied in the given order |
compile |
boolean | no | Optional bool (default true). false skips the compile: nothing is verifiable, every entry reports matches_requested=false with verification_status='not_verifiable' |
save |
boolean | no | Optional bool (default true). Saves the Blueprint package ONCE, after the compile |
Returns: { success, error?, data: { blueprint_name, requested_count, applied_count, verified_count, mismatched_count, failed_count, compiled, saved, save_error?, equality_predicate, results: [{ index, component_name, property_name, source, applied, apply_error?, verification_status, matches_requested, post_value, post_source, note? }], verification } }
apply_material_to_blueprint¶
Destructive.
Assign a material ASSET to one slot of a Blueprint component TEMPLATE (an OWN SCS node, not a placed actor) -- the persistent counterpart of set_mesh_material_color, which only builds a runtime dynamic instance. Does NOT compile and does NOT save. Actors ALREADY placed in a level keep their serialized material: change the template and the placed instances stay as they were.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
component_name |
string | yes | Name of an OWN SCS component; must be a UPrimitiveComponent |
material_path |
string | yes | Asset path of the UMaterialInterface (material or material instance) to assign; a path that does not load is an error |
material_slot |
number | no | Optional material slot index; defaults to 0. It is not range-checked against the mesh's slot count. |
Returns: { blueprint_name: string, component_name: string, material_path: string, material_slot: int, success: bool } -- an echo: success:true only means the material loaded and SetMaterial was called. Read it back with get_blueprint_material_info.
attach_blueprint_component¶
Destructive.
Parent an existing SCS component under another component (or the native root). The parent may be an SCS component of this Blueprint OR a NATIVE inherited scene component from a parent C++ class (e.g. ACharacter's "CharacterMesh0" or the native capsule) -- when the name is not an SCS node and is not the native root, it is resolved from the parent-class CDO and the child is parented to it natively (bIsParentComponentNative=true). This makes sockets on inherited native meshes reachable (e.g. a socket under CharacterMesh0 at "spine_4", or a ChildActor attached at "spine_2").
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
component_name |
string | yes | Name of the SCS component to attach (the child) |
parent_component_name |
string | no | Optional parent component name; omit / "root" / the native root name attaches to the native root component. May also name a NATIVE inherited scene component (e.g. "CharacterMesh0") to parent the child natively to it. |
socket_name |
string | no | Optional socket/bone name on the parent (AttachToName) |
Returns: { blueprint_name, component_name, parent, parent_is_native, attach_socket, already_attached }
build_blueprint_graph¶
Destructive.
Build several nodes, wire their pins, and set pin defaults in one pass, wrapped in a single undo transaction -- the way to author a whole graph shape without create -> get_graph_nodes -> connect round-trips (get_function_pins gives you the pin names up front). THE ORDER IS FIXED AND MATTERS: every node first, then ALL connections, then pin_defaults -- so a node whose TYPE depends on a pin default (a generic GetComponentByClass) is connected while still untyped, fails with "... is not compatible with ..." and, under stop_on_error's default true, takes the whole call down; use add_get_component_by_class_node, which is born typed. add_comment_node has no pins at all, so a pin_defaults entry aimed at one also kills the batch. Self-contained: each sub-step runs its command directly, never through the bridge (only these: add_graph_node, add_custom_event_node, add_timeline_to_blueprint, add_cast_node, add_branch_node, add_sequence_node, add_component_bound_event, add_input_action_event_node, add_enhanced_input_action_node, add_actor_begin_overlap_event, add_call_library_function, add_reroute_node, add_comment_node, add_select_node, add_make_struct_node, add_break_struct_node, add_parent_call_node, add_get_component_by_class_node, add_broadcast_node, add_object_bound_event, add_macro_instance_node). add_component_event is NOT usable here; create it with its own call.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
nodes |
array | yes | [{id: string, command_type: string, params?: object}, ...] (required, non-empty). 'id' is a caller-chosen local key used to reference the node from 'connections'/'pin_defaults'; 'params' is that command's own param object (blueprint_name/graph_name are auto-filled if omitted). WORKED EXAMPLE (print "hi" on BeginPlay, one call): nodes=[{"id":"beg","command_type":"add_graph_node","params":{"node_type":"event","event_name":"ReceiveBeginPlay"}},{"id":"print","command_type":"add_graph_node","params":{"node_type":"print_string"}}], connections=[{"from_node":"beg","from_pin":"then","to_node":"print","to_pin":"execute"}], pin_defaults=[{"node":"print","pin":"InString","value":"hi"}]. Pin names for a call_function node are knowable up front via get_function_pins (so no create->get_graph_nodes->connect round-trips). Child-override canonical shape (call the parent first), one call: nodes=[{"id":"evt","command_type":"add_graph_node","params":{"node_type":"event","event_name":"ReceiveBeginPlay"}},{"id":"super","command_type":"add_parent_call_node","params":{"function_name":"ReceiveBeginPlay"}}], connections=[{"from_node":"evt","from_pin":"then","to_node":"super","to_pin":"execute"}]. NOTE on add_object_bound_event: it creates TWO nodes; the step's local 'id' resolves to the UK2Node_AddDelegate (wire the external instance into its 'self' pin and the exec flow into 'execute'), while the handler custom event is addressable as "<id>.custom_event" and its real NodeGuid is echoed back as custom_event_node_id. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
connections |
array | no | [{from_node, from_pin, to_node, to_pin}, ...]; from_node/to_node may be a local 'id' from 'nodes' (or "<id>.custom_event" for an add_object_bound_event step's handler event) or a pre-existing real NodeGuid. |
pin_defaults |
array | no | [{node, pin, value}, ...]; node may be a local 'id' from 'nodes' (or "<id>.custom_event") or a pre-existing real NodeGuid. |
stop_on_error |
boolean | no | Stop (and try to roll back the whole transaction) on the first failing step; defaults to true, unlike batch's default false, since connections/pin_defaults depend on earlier nodes existing. With stop_on_error:false there is NO rollback at all -- the editor's global undo is never touched, every step is attempted, and whatever half-built shape remains is cleaned up with delete_node/disconnect_pin. That is the safer mode when other work is live in the editor's undo buffer. |
Returns: { blueprint_name, graph_name, nodes: [{index, id, command_type, ok, node_id?, custom_event_node_id?, error?}], connections: [{index, ok, error?}], pin_defaults: [{index, ok, error?}], stopped_early, rollback_required, rolled_back, transaction_opened, undo_queue_len_before, undo_queue_len_after, top_transaction_title, rollback_refused_reason?, warning? }. rolled_back reports whether the undo ACTUALLY ran, not the intention: the rollback is refused (rolled_back:false + rollback_refused_reason + warning) whenever the top of the editor's undo stack is not this call's own transaction, because GEditor->UndoTransaction is global and would otherwise revert another agent's or another session's work in memory while the disk stays clean. A payload that fails pre-validation returns instead { success:false, error, validation_errors: [{section, index, id?, error}], transaction_opened:false, blueprint_name, graph_name } and never opens a transaction.
compile_blueprint¶
Destructive.
Compile a Blueprint to regenerate its class, returning the REAL outcome (succeeded == zero errors) plus the error/warning counts, and with return_messages=true the per-message log with each message anchored to its node_id/graph. Required after authoring functions, variables or RPCs and before anything calls them. TRAP: num_errors:0 is not a promise the graph works -- an unresolved WILDCARD pin on an array/ForEach node can compile clean and still block PIE, and warnings (a "was pruned" node whose consumers silently read defaults) do not lower it. Read the warnings too, and get_compile_errors as a second opinion.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint. A short name matching two assets compiles ONE of them silently -- pass the full path when in doubt. |
return_messages |
boolean | no | Optional (default false). When true, ALSO returns the per-message compiler results log so callers can see node-anchored errors/warnings. When false/absent the response omits the messages array but still reports the REAL compile status. |
Returns: { name: string, compiled: bool, succeeded: bool, num_errors: int, num_warnings: int } -- `compiled`/`succeeded` reflect the ACTUAL compile outcome (true iff zero errors; warnings still compile). Both the default and return_messages paths return these fields. When return_messages=true additionally { messages: [{severity: 'error'|'warning'|'note', text: string, node_id: string, node_title: string, graph_name: string}] } (node_id/node_title/graph_name are empty strings when the message is not anchored to a graph node)
connect_pins¶
Destructive.
Wire one node's OUTPUT pin to another node's INPUT pin inside one Blueprint graph, type-checked by the K2 schema (an incompatible pair is returned as an error, never a silent no-op). Nodes are addressed by NodeGuid, pins by name. Either node that still carries a WILDCARD pin is reconstructed afterwards, so array / ForEach / Select pins really re-type instead of compiling into "The type of Target Array is undetermined" (which compile_blueprint reports as compiled:true). Use validate_pin_connection to test a pair without mutating, and build_blueprint_graph to create+wire in one transaction.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
source_node_id |
string | yes | NodeGuid of the source node (from add_graph_node / get_graph_nodes). |
source_pin |
string | yes | Output pin name on the source node (e.g. "then", "ReturnValue"). An output pin of that name is preferred; any pin with the name is accepted as a fallback. |
target_node_id |
string | yes | NodeGuid of the target node. |
target_pin |
string | yes | Input pin name on the target node (e.g. "execute", "Condition"). |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. BOTH nodes must live in this same graph. |
Returns: { connected, source_node_id, target_node_id } -- connected is always true when the call succeeds; the failure path is an error response, so there is no false to check.
create_actor_action_utility¶
Additive.
Create, compile and save a Blueprint parented to UActorActionUtility, whose CallInEditor functions become right-click actions on level actors. An existing Blueprint at the path is returned unchanged, whatever its parent; a failed save only sets saved false. Returns asset_path, created, already_existed and saved. Refused during PIE unless force.
| Parameter | Type | Required | Description |
|---|---|---|---|
package_path |
string | yes | Content folder for the asset, e.g. "/Game/EditorTools"; a trailing slash is ignored. |
name |
string | yes | Asset name without path or extension, e.g. "EUA_AlignToFloor". |
Returns: success or error payload
create_asset_action_utility¶
Additive.
Create, compile and save a Blueprint parented to UAssetActionUtility, whose CallInEditor functions become right-click actions on Content Browser assets. An existing Blueprint at the path is returned unchanged, whatever its parent; a failed save only sets saved false. Returns asset_path, created, already_existed and saved. Refused during PIE unless force.
| Parameter | Type | Required | Description |
|---|---|---|---|
package_path |
string | yes | Content folder for the asset, e.g. "/Game/EditorTools"; a trailing slash is ignored. |
name |
string | yes | Asset name without path or extension, e.g. "EUA_RenameTextures". |
Returns: success or error payload
create_blueprint¶
Additive.
Create a new Blueprint asset, optionally as a child of ANY parent class -- native or another Blueprint (pass its "..._C" class or asset path) -- and save it to disk immediately unless PIE is running. Also makes Blueprint Function Libraries and Macro Libraries, which have no Actor parent and which the normal path would reject. It does NOT create interfaces (create_blueprint_interface) nor the framework-class shortcuts (create_game_mode_class_bp, create_player_controller_class_bp, ...). It refuses instead of overwriting when the asset already exists on disk, and it never confirms the parent: read it back with get_blueprint_parent.
| Parameter | Type | Required | Description |
|---|---|---|---|
name |
string | yes | Blueprint name. Either a bare name (created under 'path' or /Game/Blueprints/) OR a full content path ("/Game/MyGame/Systems/World/BP_Foo"); an object-path form ("/Game/.../BP_Foo.BP_Foo") is also accepted. |
parent_class |
string | no | Optional parent class. Accepts a native name ("Actor", "Pawn", "Character", "StaticMeshActor", "BlueprintFunctionLibrary"), a "/Script/Module.Class" path, a Blueprint generated-class path ("/Game/.../BP_X.BP_X_C"), or a Blueprint asset path ("/Game/.../BP_X"). Defaults to AActor. Passing "BlueprintFunctionLibrary" makes a Function Library. |
blueprint_type |
string | no | Optional Blueprint type override: "normal" (default), "function_library" (a UBlueprintFunctionLibrary of static functions; parent_class is ignored/forced), or "macro" (a Macro Library; keeps parent_class or defaults to Actor). Function-library is also auto-detected from parent_class="BlueprintFunctionLibrary". |
path |
string | no | Optional target content folder ("/Game/MyGame/Systems"). Used only when 'name' is a bare name; ignored when 'name' is already a full path. |
Returns: { name: string, path: string, package_path: string, parent_class: string, generated_class: string, blueprint_type: string, already_exists: bool, saved: bool, save_error?: string } -- parent_class here is what was REQUESTED and resolved, not proof the asset carries it: confirm a child's real parent with get_blueprint_parent. saved:false is honest and always carries save_error (PIE was running, or the Blueprint was already resident in memory and left untouched) -- an unsaved Blueprint exists only in the editor and a later compile on it also returns success.
create_blueprint_macro¶
Additive, idempotent.
Create an EMPTY, Tunnel-terminated macro graph owned by this Blueprint's MacroGraphs (a reusable snippet, not a function: macros inline at compile time and can carry multiple exec outputs). Idempotent -- an existing macro of that name is returned with already_existed:true. Fill it with add_graph_node using graph_name=<macro>, then instantiate it with add_macro_instance_node (add_graph_node node_type="macro_instance" also finds the Blueprint's own macros).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
macro_name |
string | yes | Name for the new macro graph. |
Returns: { blueprint_name, macro_name, graph_name, already_existed } -- graph_name is what to pass as graph_name / macro_graph downstream.
create_editor_utility_blueprint¶
Additive.
Create, compile and save an Editor Utility Blueprint at package_path/name, parented to parent_class. Returns asset_path, parent_class, created, already_existed and saved; an existing Editor Utility Blueprint there is returned unchanged and parent_class is not applied to it. Refused during PIE unless force.
| Parameter | Type | Required | Description |
|---|---|---|---|
package_path |
string | yes | Content folder for the asset, e.g. "/Game/EditorUtilities"; a trailing slash is ignored. |
name |
string | yes | Asset name without path or extension, e.g. "EUB_BatchRename". |
parent_class |
string | no | Parent class by name without the U or A prefix, e.g. "EditorUtilityActor", or by path such as "/Script/Blutility.EditorUtilityObject" (default EditorUtilityObject); it must be Blueprintable. |
Returns: { name, package_path, asset_path, blueprint_class, parent_class, created, already_existed, saved, save_error }
create_editor_utility_widget_blueprint¶
Additive.
Create, compile and save an Editor Utility Widget Blueprint (parent UEditorUtilityWidget) with a CanvasPanel root at package_path/name. Returns asset_path, root_widget, root_widget_class, created, already_existed and saved; an existing one is returned unchanged. Open it as a tab with run_editor_utility_widget. Refused during PIE unless force.
| Parameter | Type | Required | Description |
|---|---|---|---|
package_path |
string | yes | Content folder for the asset, e.g. "/Game/EditorUtilities"; a trailing slash is ignored. |
name |
string | yes | Asset name without path or extension, e.g. "EUW_LevelTools". |
Returns: { name, package_path, asset_path, blueprint_class, parent_class, root_widget, root_widget_class, created, already_existed, root_created, saved, save_error }
delete_bp_variable¶
Destructive.
Remove a member variable DECLARED on this Blueprint (inherited/native variables are refused) and report whether it is really gone by re-looking it up. Nodes that still read/write it survive as broken references, so run compile_blueprint + get_compile_errors afterwards. For an event dispatcher use remove_event_dispatcher instead -- this call would drop the delegate variable and strand its signature graph.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
variable_name |
string | yes | Name of a variable declared on THIS Blueprint |
Returns: { blueprint_name, variable_name, deleted } -- deleted is re-checked after the removal, so false means it is still there.
delete_node¶
Destructive.
Delete ONE node from a graph by its NodeGuid, breaking its links; refused for nodes the editor protects (FunctionEntry, Result, tunnels). This is the cleanup for orphan nodes left behind when a build_blueprint_graph batch fails and its rollback is refused, and it is reversible (the .uasset on disk is untouched until save_asset). It does NOT compile -- follow with compile_blueprint + get_compile_errors.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
node_id |
string | yes | NodeGuid of the node to delete |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
Returns: { deleted, node_id }
disconnect_pin¶
Destructive.
Break ALL links on one pin of one node (there is no way to drop a single link of a multi-linked pin). Main use: clearing links that point at nodes which no longer exist after a failed or refused build_blueprint_graph rollback -- get_graph_nodes with compact=false shows those as linked_to entries with dead GUIDs. To remove the whole node instead, use delete_node.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
node_id |
string | yes | NodeGuid of the node owning the pin (from add_graph_node / get_graph_nodes) |
pin_name |
string | yes | Pin name, in either direction |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
Returns: { disconnected, node_id, pin_name }
find_blueprint_node_references¶
Read-only.
"Find in Blueprints" over MCP: locate every Blueprint NODE that references a symbol -- variable, function, event, custom event, multicast delegate, macro, timeline, cast target, component, or a class/object in a pin default -- across a content path, returning each hit's asset, graph chain, node_id, title, match_kind and RESOLVED declaring class (resolved:false = a name-only guess). READ-ONLY. THE RULE FOR READING A ZERO: matches_found:0 only measures NON-EXISTENCE when assets_hit_prefilter_without_graph_match comes back EMPTY -- if it names assets, the symbol's string IS in those packages, so either the real name is spelled differently or the reference lives outside a graph (component template, property default). Check coverage_complete too: a truncated, timed-out or capped scan proves nothing. Blind by construction: Level Script Blueprints inside a .umap, and C++ callers.
| Parameter | Type | Required | Description |
|---|---|---|---|
symbol |
string | no | Required (unless component_name is given): the name to look for, matched EXACTLY (variable/function/event/macro/class/component name). A misspelling returns 0 with a full-coverage report -- see assets_hit_prefilter_without_graph_match before believing it. |
component_name |
string | no | Optional: search for an actor COMPONENT by name; implies mode="component" and, with owner_blueprint, also matches GetComponentByClass/Cast pins that target the component's class. |
owner_blueprint |
string | no | Optional: Blueprint that DECLARES component_name (asset name or path); required to resolve the component's class for the class-pin matching. |
mode |
string | no | Optional (default "auto"): auto|all|variable|function|event|delegate|macro|component|class|pin_default. Filters which match kinds are returned; an unrecognized value returns everything and sets mode_recognized=false. |
path |
string | no | Optional (default "/Game"): content path root to scan. |
recursive |
boolean | no | Optional (default true): recurse into subfolders of path. |
exclude_paths |
array | no | Optional: array of package-path prefixes to skip (e.g. ["/Game/VendorPack/Demo"]). |
include_paths |
array | no | Optional: array of package-path prefixes to restrict the scan to (applied after path). |
prefilter |
boolean | no | Optional (default true): byte-scan the .uasset name map before loading. Turning it OFF loads every Blueprint under path (slow, but the ground truth to compare against). |
case_sensitive |
boolean | no | Optional (default false): case-sensitive symbol matching (both the byte prefilter and the node classifier). |
include_pin_defaults |
boolean | no | Optional (default true): also report pin defaults / pin types that name the symbol, on nodes with no structural match. |
include_node_json |
boolean | no | Optional (default false): embed the full NodeToJson serialization of each matching node. |
include_pins |
boolean | no | Optional (default false): when include_node_json is on, include the node's pins. |
max_assets |
number | no | Optional (default 20000): hard cap on candidate assets examined. |
max_matches |
number | no | Optional (default 200): stop after this many matches (sets truncated=true). |
max_seconds |
number | no | Optional (default 60): wall-clock budget; on expiry the scan stops and timed_out=true. |
Returns: { symbol, mode, mode_recognized, path, recursive, prefilter_enabled, component_class, component_declared_in, assets_in_path, assets_scanned, assets_prefiltered_out, assets_prefilter_unavailable, assets_prefilter_bypassed_dirty, assets_loaded, assets_load_failed, assets_with_matches, graphs_visited, nodes_visited, foreign_subgraphs_skipped, matches_found, truncated, timed_out, coverage_complete, elapsed_ms, assets_hit_prefilter_without_graph_match:[string], notes:[string], matches:[{asset_name, asset_path, package_name, graph, graph_chain, graph_kind, node_id, node_class, node_title, match_kind, member_name, declaring_class, resolved, is_component_ref, is_interface_call, exact, detail, pin, pin_value, node?}], success }
fork_class_chain¶
Destructive.
One-call thin-fork + optional reparent + verify: collapses the create->reparent->verify pattern into a single call. It creates a NEW thin child Blueprint of base_class at fork_name (the seam you insert between a shared-library base and your own class), optionally tags it with the fork-origin metadata tag (project setting ForkOriginTag), saves it, and then -- only if reparent_target is given -- reparents that existing Blueprint onto the new fork through the guarded reparent_blueprint_safe path (snapshot + compile flags + post-check + rollback) and reports its verification. WARNING: no durable backup is taken -- the rollback is in-memory only, so call backup_asset yourself first if you want a rollback-to-disk safety net.
| Parameter | Type | Required | Description |
|---|---|---|---|
fork_name |
string | yes | Name or full /Game path for the NEW thin child Blueprint to create. |
base_class |
string | yes | Parent class for the new fork (native /Script, /Game/.../BP.BP_C, or a BP asset path). |
path |
string | no | Optional folder for fork_name when it is a bare name (default /Game/Blueprints). |
fork_origin |
string | no | Optional: value stored in the fork's fork-origin metadata tag (project setting ForkOriginTag, default 'mcp.forkOrigin'), recording its fork lineage. |
reparent_target |
string | no | Optional: an existing Blueprint to reparent onto the new fork. |
auto_rollback |
boolean | no | Optional (default true): forwarded to the safe reparent of reparent_target. |
rename_colliding_vars |
boolean | no | Optional (default false): forwarded to the safe reparent of reparent_target. |
Returns: { fork_name, fork_path, fork_generated_class, base_class, already_exists, fork_origin_set, saved, save_error?, reparent:{...safe-reparent result...}|null, verification, verification_checks, error?, success }
get_actor_material_info¶
Read-only.
List the material slots of an actor PLACED IN THE EDITOR WORLD, one row per slot per StaticMeshComponent, with the material actually assigned (name, path, class) or "None". Scope limits worth knowing: it only walks UStaticMeshComponents (a skeletal mesh's slots are invisible here) and only the EDITOR world (no PIE selector), and the actor is matched by its object NAME, not its outliner label. The Blueprint-template twin is get_blueprint_material_info.
| Parameter | Type | Required | Description |
|---|---|---|---|
actor_name |
string | yes | Object name of the actor in the EDITOR world (GetName(), not the display label shown in the outliner) |
Returns: { actor_name: string, material_slots: [{ slot, component, material_name, material_path, material_class }], total_slots: int } -- total_slots 0 means no StaticMeshComponent had slots, NOT that the actor has no materials.
get_ai_perception_senses¶
Read-only.
Read back the senses configured on an AIPerceptionComponent TEMPLATE of a Blueprint: for each one its config class plus the fields that matter (sight radius / lose-sight radius / peripheral angle, or hearing range) and the three affiliation filters. This is the verification step for add_ai_perception_sense. It reads the OWN SCS template, so an AIPerception component inherited from a parent Blueprint is not found, and a config class other than Sight or Hearing comes back with sense_type "unknown" and no fields.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint owning the component |
component_name |
string | yes | Name of an OWN SCS AIPerceptionComponent node; another component type is an explicit error |
Returns: { blueprint_name, component_name, senses: [ { config_class, sense_type, sight_radius|hearing_range, ... , detect_enemies, detect_neutrals, detect_friendlies } ], sense_count } -- sense_count 0 means the template has no configured sense, which is also what an AI that never perceives anything looks like.
get_available_materials¶
Read-only.
Enumerate material assets under a content path and return each one's name, object path, package and class -- the object path is what apply_material_to_blueprint / set_actor_material expect. One Asset Registry query on UMaterialInterface and all its subclasses (materials, material instances, project or plugin material classes); nothing is loaded, so a wide path is cheap. For one known name prefer resolve_asset_by_name.
| Parameter | Type | Required | Description |
|---|---|---|---|
search_path |
string | no | Optional content path filter (e.g. "/Game/Materials"); empty/absent means the whole project and is reported back as "/Game/" |
include_engine_materials |
boolean | no | When true, also include /Engine/ materials; defaults to true, so the list is large unless a search_path narrows it |
Returns: { materials: [{ name, path, package, class }], count: int, search_path_used: string } -- there is no truncation flag: count is everything that matched.
get_blueprint_component_object_path¶
Read-only.
Resolve a Blueprint component's TEMPLATE archetype and return its object path, so get_property_value/set_property_value/call_function can target that component directly.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name/path of the Blueprint that owns the component. |
component_name |
string | yes | Component variable name. Resolves an OWN SCS component (the _GEN_VARIABLE archetype on USCS_Node::ComponentTemplate) or an INHERITED/native component (the like-named subobject on the generated-class CDO). |
Returns: { object_path: string, class: string, source: 'scs'|'inherited' } -- object_path is GetPathName() (feed it to get/set_property_value); class is the component class' full path.
get_blueprint_component_property¶
Read-only.
Read the EFFECTIVE default of a property on a Blueprint component TEMPLATE, resolving components INHERITED from a parent/grandparent Blueprint. Read-only twin of set_blueprint_component_property: it NEVER mints an ICH override. Resolution order: own SCS template -> existing child InheritableComponentHandler override -> ancestor's declaring SCS template -> native CDO subobject. Omit property_name to dump ALL properties of the resolved template.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset path or short name |
component_name |
string | yes | Component variable name (own or inherited) |
property_name |
string | no | Property to read; omit to return ALL properties of the resolved template |
include_inherited |
boolean | no | Also resolve inherited/ICH/native components (default true); when false only this Blueprint's own SCS components are considered |
group_by_field |
string | no | Optional. Only with property_name pointing at a TArray of STRUCTS: group the elements by this struct member and report duplicate_groups[]/empty_key_indices[]/has_duplicates. Two elements sharing a key is invisible in a plain value dump, yet when that array feeds a TMap the LAST one silently wins (Map.Add overwrites) -- this is the guardrail for exactly that class of bug. |
report_duplicates |
boolean | no | Optional bool. Implied true when group_by_field is given; pass true WITHOUT group_by_field to group by the WHOLE element value instead of one member. |
Returns: { blueprint_name: string, component_name: string, component_class: string, source: 'scs'|'inherited-ich'|'inherited-scs'|'inherited-native', resolved_from_class: string, property_name: string, value: any (single-property mode), properties: object, property_count: int (all-properties mode), duplicate_analysis?: { grouped_by, element_count, distinct_keys, duplicate_groups: [{key, count, indices[]}], empty_key_indices: [int], has_duplicates: bool, keys: [string] } }
get_blueprint_components¶
Read-only.
List the components this Blueprint DECLARES in its own SCS, with type, relative transform and the real hierarchy linkage (in-tree parent from the ChildNodes tree, parent_is_native for a native/inherited parent, attach_socket, children). SCOPE: own SCS only -- components inherited from a parent Blueprint or declared natively are NOT here, so a small count is not proof the actor is small. For the full picture including ancestors use get_blueprint_scs_tree (which reports what it deduplicates), and cross-check the CDO when a component must be proven to exist.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
Returns: { blueprint_name: string, components: [{ name, type, is_scene_component, parent, parent_is_native, attach_socket, children:[name], location?, rotation?, scale? }], component_count: int } -- "parent" is the in-tree SCS parent, falling back to the inherited/native parent name when the node is parented outside this SCS; location/rotation/scale only appear for scene components.
get_blueprint_functions¶
Read-only.
List the callable graphs of a Blueprint. Enumerates the FULL graph set (UBlueprint::GetAllGraphs), not just Blueprint->FunctionGraphs: an INTERFACE override graph lives in ImplementedInterfaces[].Graphs, which FunctionGraphs alone misses (a function that exists would read as "missing"). Each entry carries graph_type so the caller can tell a plain function from an interface override, a macro or a delegate signature.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint. Pass the FULL path: a short name that matches two assets (a backup copy shares the original's name) resolves to one of them SILENTLY, and the listing then describes the wrong asset. |
include_ubergraphs |
boolean | no | Optional bool (default false): also list the EventGraph/ubergraph pages (graph_type='ubergraph'). Off by default so 'functions' stays function-shaped. |
include_subgraphs |
boolean | no | Optional bool (default false): also list nested/collapsed sub-graphs reached by GetAllGraphs but owned by no top-level list (graph_type='subgraph') |
Returns: { blueprint_name: string, functions: [{ name, node_count, graph_type, is_interface, interface_name?, is_user_constructed }], function_count: int, own_function_graph_count: int, interface_graph_count: int, macro_graph_count: int, delegate_graph_count: int, ubergraph_count: int, subgraph_count: int, graphs_total: int } -- graph_type is function|interface|macro|delegate_signature|ubergraph|subgraph; is_user_constructed is just node_count>2, i.e. "someone wrote something beyond the auto Entry/Result terminators", because implementing an interface pre-creates empty graphs. subgraph_count>0 with include_subgraphs off is the warning that collapsed graphs exist and are not listed.
get_blueprint_info¶
Read-only.
One cheap overview of a Blueprint: parent class, compile status, and the counts + names of its OWN components, variables, function graphs and ubergraph pages. Everything here is what THIS asset declares -- nothing inherited, and interface-override graphs are not listed. So use it to orient, and the specialists to decide: get_blueprint_scs_tree for the real component set including ancestors, get_blueprint_functions for interface/macro/delegate graphs, get_blueprint_variables for variable flags, get_graph_nodes to read a graph.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
Returns: { blueprint_name: string, parent_class: string, components: [{ name, type }], component_count: int, variables: [{ name, type }], variable_count: int, functions: [{ name }], function_count: int, graphs: [{ name, type }], graph_count: int, has_event_graph: bool, event_graph_name?: string, status: string } -- parent_class is a short NAME (ambiguous between an engine class and a same-named project one), variable "type" is only the pin CATEGORY (no struct/class), and status is UpToDate/Error/Unknown.
get_blueprint_material_info¶
Read-only.
Read the material slots of ONE StaticMeshComponent TEMPLATE in a Blueprint (an OWN SCS node), with the material assigned to each slot or "None". This is the verification step after apply_material_to_blueprint / set_static_mesh_properties. The slot count comes from the assigned static mesh's LOD 0 sections, so with no mesh assigned it returns ZERO slots and has_static_mesh:false -- which is a missing mesh, not a missing material. For a placed actor use get_actor_material_info.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
component_name |
string | yes | Name of an OWN SCS component; it must be a UStaticMeshComponent (any other type is an error) |
Returns: { blueprint_name: string, component_name: string, material_slots: [{ slot, component, material_name, material_path, material_class }], total_slots: int, has_static_mesh: bool } -- read has_static_mesh FIRST: total_slots:0 with has_static_mesh:false means no mesh was assigned, so the array says nothing about materials.
get_blueprint_variable_detailed_info¶
Read-only.
Read ONE variable's full detail: its default value, the structured type (category, sub-category object and container kind -- not just the pin category get_blueprint_variables gives you), and every checkbox of the variable Details panel -- is_instance_editable / is_expose_on_spawn / is_blueprint_read_only / is_expose_to_cinematics / is_replicated / replication_condition / save_game. This is the headless oracle for "does this variable really persist into a .sav?", which otherwise costs a co-op PIE session plus a binary grep of the slot file. save_game is reported from BOTH places the flag lives, because they disagree until you compile: save_game is CPF_SaveGame as AUTHORED (FBPVariableDescription::PropertyFlags, exactly what the editor checkbox writes) while save_game_generated is the same flag on the FProperty of the GENERATED class, which is the one the save archive consults -- so save_game:true + save_game_generated:false means MARKED BUT NOT COMPILED, and nothing will persist yet; save_game_matches says it in one field. Read is_replicated FIRST: replication_condition is always populated (COND_None by default) and only means anything when replication is on. default_value is read from the CDO when the class is compiled (default_value_source:"cdo"), so it does not come back EMPTY for arrays, maps and every variable of an already-compiled Blueprint. Booleans of this family are contrasted, not believed -- audit_replication is the ground truth for replication.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
variable_name |
string | yes | Name of a variable DECLARED on this Blueprint (e.g. "MyFloat"); inherited variables are not covered |
Returns: { blueprint_name: string, variable_name: string, default_value: string, default_value_source: "cdo"|"blueprint_description", default_value_serialized: string, var_type: string, property_type: string, var_type_detail: {category, sub_category, sub_category_object, sub_category_object_path, container}, is_instance_editable: bool, is_expose_on_spawn: bool, is_blueprint_read_only: bool, is_expose_to_cinematics: bool, is_replicated: bool, replication_condition: string, save_game: bool, save_game_generated: bool, save_game_generated_found: bool, save_game_matches: bool }
get_blueprint_variables¶
Read-only.
List the variables this Blueprint DECLARES (its NewVariables): name, pin category, editor category and three flags. Inherited variables, function locals and components are NOT here. THE THREE FLAGS ARE UNRELIABLE, read off the stored variable description rather than the compiled property: instance_editable checks CPF_Edit and ignores CPF_DisableEditOnInstance, so it says true for variables the editor refuses to edit per instance; expose_on_spawn checks a property flag while set_bp_variable_metadata writes the ExposeOnSpawn METADATA, so it says false for variables that DO show up as SpawnActor pins; and expose_to_cinematics is hardcoded false. Oracles: write the placed instance for editability, the spawn node's pins for exposure, get_blueprint_variable_detailed_info for type/replication.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
Returns: { blueprint_name: string, variables: [{ name, type, category, instance_editable, expose_on_spawn, expose_to_cinematics }], variable_count: int } -- "type" is only the pin CATEGORY (e.g. "struct", "object"), not the struct or class; the three booleans are the unreliable ones described above.
get_event_dispatchers¶
Read-only.
List a Blueprint's event dispatchers (multicast delegates) WITH each one's full parameter signature (name, C++ type, is_output) and whether it is inherited. Read from the SKELETON class, so it reflects edits made since the last full compile. Use it before add_broadcast_node / add_object_bound_event / set_event_dispatcher_signature, whose pins mirror this signature; only the dispatchers this Blueprint DECLARES can have their signature edited.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
include_inherited |
boolean | no | Also include dispatchers inherited from parent classes; default false = only the ones this Blueprint declares (i.e. the editable ones) |
Returns: { blueprint_name: string, dispatchers: [ { name: string, is_inherited: bool, param_count: int, params: [ { name: string, type: string, is_output: bool } ] } ], dispatcher_count: int }
get_function_pins¶
Read-only.
Preview the EXACT pins a call_function / add_call_library_function node WOULD expose for a UFunction WITHOUT creating anything: owner_class, is_pure, is_static, exec_input/exec_output ("execute"/"then", null when pure), self_pin (null when static), input_params, output_params and return_value. This is what lets a whole build_blueprint_graph (nodes + connections + pin_defaults) be written in ONE call instead of create -> get_graph_nodes -> connect round-trips. It answers "what pins would it have", NOT "can a Blueprint call it": some engine functions resolve and preview here and are still rejected by the compiler, so the oracle for callability is compile_blueprint + get_compile_errors.
| Parameter | Type | Required | Description |
|---|---|---|---|
function_name |
string | yes | UFunction name, matched EXACTLY against the reflected name (e.g. "PrintString", "K2_GetActorLocation", or a Blueprint function graph's own name, which may contain spaces like "Emit Noise At Location"). A guessed name that does not exist just errors -- it never returns an empty preview. |
target_class |
string | no | Optional class searched FIRST: native name ("KismetSystemLibrary"), "/Script/Module.Class", a Blueprint class path ("/Game/...X_C"), or a user BFL. Also always searched: the blueprint's own class + KismetSystem/GameplayStatics/KismetMath. |
blueprint_name |
string | no | Optional Blueprint whose generated class joins the search (for self / BP-local functions). |
Returns: { function_name, owner_class, is_pure, is_static, exec_input, exec_output, self_pin, input_params:[{name,type}], output_params:[{name,type}], return_value:{name,type}|null, note }
get_graph_nodes¶
Read-only.
Read one Blueprint graph: every node with its node_id (NodeGuid), class, title, position, comment and pins (name, direction, type, linked_to, default) -- the read that feeds connect_pins / set_pin_default_value / delete_node, and the way to see what a graph actually DOES. TRAP: compact=true drops per-pin type metadata AND omits every pin that is unlinked and default-less (plus knots and comment boxes), so a pin missing from a compact listing is NOT proof the pin does not exist -- re-read with compact=false before concluding anything about pins. Also: a bare blueprint_name that matches two assets picks one silently (pass the full path), and reading a graph under a read-only vendor root leaves that package DIRTY in memory (reload_asset_package with on_dirty="discard" cleans it).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path. Prefer the FULL path: a short name with more than one match resolves silently to one of them, and stale backup copies share the original's name. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. Also resolves a collapsed composite subgraph by its title (e.g. 'In Game HUD') and accepts a path form ('EventGraph > In Game HUD'). |
expand_composites |
boolean | no | When true, inline the nodes of collapsed composite subgraphs recursively; each node gains a "graph" tag naming the graph it came from. Macro-library graphs are never inlined. (Optional, default false) |
compact |
boolean | no | Token-lean listing: drops pin types, positions and comments, and skips pins that are unlinked AND have no default. Also excludes K2Node_Knot + EdGraphNode_Comment unless exclude_classes is given. Good for reading topology, WRONG for checking whether a pin exists. (Optional, default false) |
exclude_classes |
array | no | Array of leaf node class names to skip, matched against each node's "class" field (e.g. ["K2Node_Knot"]). Pass [] to include everything even in compact mode. Absent + compact=true means knots and comments are excluded; absent + compact=false excludes nothing. |
max_nodes |
number | no | Cap on the number of nodes emitted (<=0 or absent = unlimited); the response still counts every non-excluded node in total_node_count and sets truncated=true. |
Returns: { blueprint_name, graph_name, nodes:[{node_id, class, title, pos_x, pos_y, comment, pins:[...], subgraph?}], node_count, compact, total_node_count, excluded_count, truncated } -- node_count is what was EMITTED, total_node_count what exists; a node owning a nested graph (composite / macro instance) carries "subgraph" with the name to pass back as graph_name.
get_node_pin_info¶
Read-only.
Dump ONE node's full pin detail -- every pin's name, direction, type, linked_to and default -- plus its class, title, position and comment, addressed by NodeGuid. Use it instead of get_graph_nodes when the node is already known: the listing is always FULL fidelity (get_graph_nodes with compact=true hides unlinked default-less pins) and costs a fraction of the tokens of a whole graph.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
node_id |
string | yes | NodeGuid of the node (from add_graph_node / get_graph_nodes) |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. Also resolves collapsed composite subgraphs by title or a path form ('EventGraph > In Game HUD'). |
Returns: { node_id, class, title, pos_x, pos_y, comment, pins:[{name, direction, type, linked_to, default}] }
get_property_access_path¶
Read-only.
Read a UK2Node_PropertyAccess node's binding Path -- the anim-Blueprint property binding (InAnimInstance.Foo, InDeltaTime...) that no ordinary pin read exposes -- as segments plus its display text_path, and say whether the leaf actually RESOLVED (a still-wildcard Value pin means the path points at nothing). Read-only; errors on any node that is not a K2Node_PropertyAccess. Writer twin: set_property_access_path.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path (usually an Animation Blueprint). |
node_id |
string | yes | NodeGuid of the property-access node (from get_graph_nodes). |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. |
Returns: { node_id, graph_name, path:[string], text_path, resolved, resolved_pin:{name,direction,type,...} } -- resolved:false (Value pin still wildcard) is the signal that the binding is broken.
implement_interface¶
Destructive.
Add a Blueprint Interface to a Blueprint's implemented list (asset path or class name). NOT idempotent: an interface already implemented comes back as an error, unlike remove_interface. It only registers the contract -- the graphs that IMPLEMENT each member are created by implement_interface_function / override_interface_member, which are also the only correct route for interface EVENTS.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
interface_path |
string | yes | Blueprint interface asset path (e.g. /Game/Dir/BPI_Foo.BPI_Foo), or a resolvable interface class name/path |
Returns: { blueprint_name, interface, implemented } -- implemented is always true on success; failure is an error response. Confirm the member set with get_blueprint_functions (interface graphs live in ImplementedInterfaces, not FunctionGraphs).
implement_interface_function¶
Destructive, idempotent.
Create or resolve the graph that IMPLEMENTS an interface member (or a parent virtual) and return a graph_name you can immediately wire with get_graph_nodes / connect_pins / set_pin_default_value. It picks the right shape by itself: a member WITH a return value gets a real FUNCTION graph in ImplementedInterfaces[].Graphs -- where add_blueprint_function refuses it ("Function already exists") and an event node would be a useless return-less stub -- while an event-shape member (no return value) gets a genuine event OVERRIDE node in the event graph, with its node_id returned. Idempotent in both branches. override_interface_member is the same logic under a friendlier name/response.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path (must already implement the interface / inherit the virtual; implement_interface first). |
function_name |
string | yes | Name of the interface or overridable function (e.g. "CanInteract", "GetInteractText"). |
Returns: { blueprint_name, function_name, graph_name, kind: "function"|"event", already_existed: bool, node_id? } -- kind "function": graph_name is an editable function graph, ready to wire with get_graph_nodes / connect_pins; kind "event": the member returns nothing, so an event OVERRIDE node was created (or reused) in the event graph that graph_name names, and node_id is that node, to wire with connect_pins.
lint_blueprint_graph¶
Read-only.
Read-only lint of a Blueprint's graphs for four authoring bugs that COMPILE CLEAN and only show up in play: eclipsed_interface_event and custom_event_shadowing_override (a node that looks like an override and is not, so the base contract never runs), unreachable_exec_node (a node no exec chain reaches from any entry) and function_exit_without_return (a live exec path that falls off the end of a value-returning function, so the caller silently gets false/0/None). Scans ALL ubergraph + function + macro graphs by default. HONESTY LIMIT: findings:[] is NOT a clean bill of health -- by deliberate design it never flags a merely unconnected exec output, so a Branch or Is Valid with dangling outputs can pass; check linked_to yourself with get_graph_nodes (compact=false) or get_node_pin_info.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint to analyze. |
graph_name |
string | no | Optional single graph to analyze; when omitted, scans ALL ubergraph (event) pages + function graphs + macro graphs owned by this Blueprint. Interface-override graphs are NOT in that default set -- name one explicitly to lint it. |
Returns: { findings: [ { kind, node_id, node_title, graph_name, why, fix_hint, pin? } ] } -- kind is one of eclipsed_interface_event, custom_event_shadowing_override, unreachable_exec_node, function_exit_without_return (this one also reports the offending exec pin in "pin"); "why" carries a best-effort pointer at the likely upstream break. No counters and no coverage flags: an empty array only means these four rules found nothing.
list_editor_utility_widgets¶
Read-only.
List the Editor Utility Widget Blueprint assets under a content folder and its subfolders, read from the Asset Registry without loading them. Returns search_path, count and widgets [{name, asset_path, package_name, package_path}]; open one as an editor tab with run_editor_utility_widget.
| Parameter | Type | Required | Description |
|---|---|---|---|
path |
string | no | Content folder to search recursively, without a trailing slash, e.g. "/Game/EditorUtilities" (default /Game). |
Returns: { name, asset_path, package_name, package_path, search_path, count, widgets }
list_overridable_functions¶
Read-only.
Enumerate the functions/events that a Blueprint deriving from a class could override. Works on an EXISTING Blueprint (blueprint_name) or on ANY class (class_name) so the override surface can be inspected BEFORE the child exists. Gated with UEdGraphSchema_K2::CanKismetOverrideFunction -- the same predicate add_blueprint_function(override=true) enforces -- so discovery and authoring agree (a bare NativeEvent||FUNC_BlueprintEvent filter lets a parent Blueprint's *__DelegateSignature through as "overridable"). Each entry reports where the member is DECLARED and where it is last IMPLEMENTED, with is_stub, which is what distinguishes a concrete ancestor from its _Abstract sibling.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | no | Name/path of an existing Blueprint. Its ParentClass is the override surface. |
class_name |
string | no | Alternative to blueprint_name: any class ("Actor", "/Script/Engine.Pawn", "/Game/.../BP_X.BP_X_C", or a Blueprint asset path). The override surface is THAT class, i.e. what a new child would get. Ignored when blueprint_name is given. |
include_non_overridable |
boolean | no | Optional bool (default false). true also lists the entries a NativeEvent||FUNC_BlueprintEvent filter passes but CanKismetOverrideFunction rejects (delegate signatures, BlueprintInternalUseOnly, deprecated), each flagged can_kismet_override=false. Nothing is lost silently. |
Returns: { blueprint_name?, class_name?, source_mode, resolved_class, base_class, ancestors: [string], count, functions: [{ function_name, display_name, declaring_class, is_native_event, is_event, is_interface, interface_name?, kind, can_kismet_override, has_override_graph, has_user_logic, is_implemented, parent_impl_kind, parent_impl_owner_class, parent_impl_graph, parent_impl_node_count, is_stub, is_stub_basis }] }
list_scripted_action_utilities¶
Read-only.
List Editor Utility Blueprints that are scripted Asset/Actor Action Utilities
| Parameter | Type | Required | Description |
|---|---|---|---|
path |
string | no | Optional content path to search under (default /Game) |
Returns: { name, path, package_name, kind, parent_class, search_path, count, utilities }
list_widget_bound_events¶
Read-only.
List every event-dispatcher BINDING wired in a Blueprint, across the three node kinds that make one in practice: UK2Node_AddDelegate (from add_object_bound_event / add_graph_node node_type="add_delegate"), UK2Node_ComponentBoundEvent (from add_component_bound_event -- a component's dispatcher OR a UMG widget's, e.g. a Button's OnClicked) and UK2Node_ActorBoundEvent (a level actor's, bound from the Level Blueprint). Each entry reports which kind it is (binding_kind), what it is bound ON (bound_to: the component/widget variable, or the actor), the delegate's owner class and name, and the handler on the other end. Despite the name it works on ANY Blueprint -- but it only walks Ubergraph pages and FunctionGraphs, so a binding inside a macro or interface graph is out of scope. Run it BEFORE add_object_bound_event / add_component_bound_event: double-binding one delegate to two handlers compiles fine and silently runs BOTH. A reader that cannot see what the writer wrote is worse than no reader: a 0 reads as "not wired" and sends you to re-wire what is already there.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path (Actor Blueprint, Widget Blueprint or Level Blueprint). |
Returns: { blueprint_name, bindings:[{ graph_name, node_id, binding_kind, bound_to, delegate_owner_class, delegate_name, delegate_resolved, wired, custom_event_name, custom_event_node_id }], binding_count, kind_counts:{add_delegate,component_bound_event,actor_bound_event} } -- binding_kind names the node class behind the entry. bound_to is the component/widget variable name (component_bound_event), the actor name (actor_bound_event), or empty for add_delegate, whose target pin is left unconnected by design. delegate_resolved=false means the delegate no longer resolves live (renamed/removed). wired=false is a DANGLING add_delegate bind (its Delegate pin has no handler); the two *BoundEvent kinds ARE their own handler, so they are always wired and custom_event_name is the generated BndEvt__ function.
move_node¶
Destructive.
Move a node to a new [x, y] canvas position. Purely cosmetic layout: no pin, link, default or type changes, and no compile. Returns the position actually applied.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
node_id |
string | yes | NodeGuid of the node to move |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
position_x |
number | no | Node X position on the graph canvas (ignored when node_position is set) |
position_y |
number | no | Node Y position on the graph canvas (ignored when node_position is set) |
node_position |
array | no | Node canvas position as [x, y]; takes precedence over position_x/position_y |
Returns: { node_id, pos_x, pos_y }
override_interface_member¶
Destructive, idempotent.
Override a Blueprint interface member or parent virtual by name: an event override node (kind="event", node_id) when it returns nothing, else a function-override graph (kind="function", graph_name). Idempotent (was_already_overridden); leaves the Blueprint needing a compile, unsaved. Prefer it to hand-placed interface event nodes, which can compile yet never fire.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path (must implement the interface / inherit the virtual). |
member_name |
string | yes | Name of the interface or overridable function to override (e.g. "CanInteract"). |
interface_path |
string | no | Ignored: the member is resolved by member_name alone, implemented interfaces first, then parent classes. |
node_position |
any | no | Optional [x, y] canvas position applied to a freshly created event-override node. |
position_x |
number | no | Ignored by this tool: the new node is only moved when node_position is given, and node_position then wins. |
position_y |
number | no | Ignored by this tool: the new node is only moved when node_position is given, and node_position then wins. |
Returns: { kind: "event"|"function", created: bool, was_already_overridden: bool, graph_name, node_id? } -- kind "event": an event OVERRIDE node was created or reused in the event graph that graph_name names, and node_id is that node; kind "function": graph_name is an editable function-override graph, ready to wire.
recombine_blueprint_pin¶
Destructive.
Collapse a previously split struct pin back into ONE pin (inverse of split_blueprint_pin), which is what set_pin_default_value needs before it will write a struct literal. Accepts either the parent pin's name or any of its sub-pin names; links on the sub-pins are dropped by the engine as part of recombining.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
node_id |
string | yes | NodeGuid of the node owning the pin. |
pin_name |
string | yes | Name of the parent pin OR of any of its sub-pins. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
Returns: { recombined } -- always true on the success path; a pin that is not split is an error response instead.
reconcile_function_signature¶
Destructive.
Repair a LOCAL function graph's parameter pins so they match a parent UFUNCTION -- for an override whose signature went stale after a reparent -- WITHOUT nuking the graph's downstream nodes, which is what re-creating the override by hand costs you. It diffs the parent's parameters against the function's entry/result pins: mode='add_missing' (the default) only ADDS the missing pins, so it is non-destructive and safe to run blind; mode='remove_extra' / 'mirror' also DROP pins the parent lacks, which can sever downstream connections, and are therefore gated behind force_remove=true -- without it the extra pins are merely REPORTED (partially_implemented=true).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path owning the function. |
function_name |
string | yes | Name of the local function graph to reconcile. |
parent_class |
string | no | Optional: class whose UFUNCTION defines the target signature (default: the Blueprint's current ParentClass). |
mode |
string | no | Optional (default 'add_missing'): 'add_missing' | 'remove_extra' | 'mirror'. |
force_remove |
boolean | no | Optional (default false): actually remove extra pins for 'remove_extra'/'mirror' (may drop connections). |
Returns: { blueprint_name, function_name, parent_class, mode, added:[{name,direction}], removed:[{name,direction}], extra_pins:[{name,direction}], missing_pins:[{name,direction}], removal_performed, partially_implemented, note, success }
remove_blueprint_component_node¶
Destructive, idempotent.
Remove one or MORE SCS component nodes in a single batch (ONE compile for the whole lot), optionally promoting their children, and report the double census (flat AllNodes vs a walk of RootNodes) so descendants that go missing or become unreachable are NAMED instead of silently dropped. Same engine work as remove_component_from_blueprint; the difference is the contract for a component that is not there: this one is IDEMPOTENT (already_removed:true, no error), while remove_component_from_blueprint treats "nothing matched" as a caller error. Prefer this one in scripts that may re-run.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
component_name |
string | no | Name of the SCS component node to remove (single form) |
component_names |
array | no | Optional array of SCS component node names removed in ONE batch with a SINGLE compile. Chaining single-node calls is what causes collateral deletions; prefer this for lots. Merged with component_name when both are given. |
promote_children |
boolean | no | Optional bool (default true); true keeps descendants (RemoveNodeAndPromoteChildren), false orphans/deletes them (RemoveNode) |
Returns: { success, error?, data: { blueprint_name, component_name, promote_children, removed, already_removed, requested[], removed_components[], also_removed[], unexpected_losses[], not_found[], still_present[], node_count_before, node_count_after, reachable_before, reachable_after, orphans_before[], orphans_after[], root_nodes_before[], root_nodes_after[], root_nodes_changed, compiled, compile_count, verification } }
remove_blueprint_function¶
Destructive.
Delete a function graph OWNED BY the Blueprint (Blueprint->FunctionGraphs) by name. WARNING: It resolves more graphs than it can delete: name lookup goes through FindGraph (all graphs, interface overrides and macros included) but the delete only touches FunctionGraphs and only when bAllowDeletion is true, so an INTERFACE OVERRIDE resolves and cannot be removed. That case is a hard error naming the reason -- to change an interface override, author the signature on the INTERFACE and re-create it (add_function_parameter on the BPI_ -> compile_blueprint -> implement_interface_function). Not idempotent: a name that does not resolve is an error. TRAP when deleting to re-create: the class is NOT regenerated here, so an immediate add_blueprint_function with the same name fails with "is an inherited overridable function (declared on <this very class>)" because the stale UFunction is still in the generated class -- put a compile_blueprint BETWEEN the two calls. Callers of the removed function are left broken until the next compile.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
function_name |
string | yes | Name of the function graph to remove; must exist, be owned by this Blueprint and be deletable, or the call errors |
Returns: { blueprint_name: string, removed_function: string, success: bool } -- success:true means the graph is gone from Blueprint->FunctionGraphs (re-read after the delete), not merely that the call ran.
remove_component_from_blueprint¶
Destructive, idempotent.
Remove one or more component nodes from a Blueprint's SCS, with a DOUBLE CENSUS (flat AllNodes vs a walk of RootNodes) so collateral losses are reported instead of hidden: also_removed names descendants that went with their parent and unexpected_losses names nodes left in AllNodes but unreachable from any root. Batch-capable and that is the point -- chaining SINGLE-node calls on the same Blueprint is exactly the pattern that deletes components nobody asked for, so pass component_names and take ONE compile for the lot. A re-added component comes back with its CLASS defaults: per-instance overrides are gone and do not come back on save. "Nothing matched" is an ERROR here; remove_blueprint_component_node is the idempotent twin that reports already_removed instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name/path of the blueprint |
component_name |
string | no | Name of the component to remove (single form; matches the variable name or the _GEN_VARIABLE internal name) |
component_names |
array | no | Optional array of component names removed as ONE batch with a SINGLE compile. Chaining single-node calls is the pattern that causes collateral deletions. Merged with component_name when both are given. |
promote_children |
boolean | no | Optional bool, default true: keep descendants by re-parenting them (RemoveNodeAndPromoteChildren). Pass false for plain RemoveNode, which orphans the whole subtree. |
Returns: { success, error?, data: { blueprint_name, removed_component, requested[], removed_components[], also_removed[], unexpected_losses[], not_found[], still_present[], node_count_before, node_count_after, reachable_before, reachable_after, orphans_before[], orphans_after[], root_nodes_before[], root_nodes_after[], root_nodes_changed, promote_children, compiled, compile_count, success, verification } }
remove_event_dispatcher¶
Destructive, idempotent.
Remove an event dispatcher, dropping BOTH artifacts add_event_dispatcher created: the delegate member variable AND its signature graph (delete_bp_variable removes only the variable and strands the graph, which is why this exists). Idempotent -- when neither artifact is present it returns removed:false instead of erroring. Broadcast/bind nodes that referenced it are left broken: compile_blueprint + get_compile_errors after.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
dispatcher_name |
string | yes | Name of the event dispatcher to remove (must be one this Blueprint owns; inherited ones have no local artifacts) |
Returns: { blueprint_name, dispatcher_name, removed } -- removed:false means nothing was there (no-op), not a failure.
remove_interface¶
Destructive, idempotent.
Remove an implemented Blueprint Interface (inverse of implement_interface) and, unless preserve_functions is set, DELETE the graphs that implemented it -- work is lost, so pass preserve_functions=true to keep them as ordinary Blueprint functions. Idempotent, unlike implement_interface: an interface that is not implemented returns removed:false instead of erroring.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
interface_path |
string | yes | Blueprint interface asset path (or class name) to remove |
preserve_functions |
boolean | no | When true, keep the interface's function graphs as normal Blueprint functions instead of deleting them; defaults to false |
Returns: { blueprint_name, interface, removed } -- removed:false means it was not implemented (no-op), not a failure.
remove_unused_variables¶
Destructive.
Delete EVERY variable the engine considers unused from a Blueprint in one shot (GatherUnusedVariables + RemoveUnusedVariables) and report which ones went. Destructive and non-selective -- "unused" means no graph node reads or writes it, so a variable only touched from C++, a DataTable, a save game or a runtime name lookup counts as unused and is deleted. Preview it by comparing get_blueprint_variables before/after, or delete a specific one with delete_bp_variable.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
Returns: { blueprint_name: string, removed_count: int, removed_variables?: [string] } -- removed_variables is the list gathered BEFORE the removal and removed_count what the engine reported removing; when they disagree, trust neither and re-read get_blueprint_variables.
rename_bp_variable¶
Destructive.
Rename a member variable DECLARED on this Blueprint, KEEPING everything the delete+re-add workaround throws away: the VarGuid, the type, the default value, the category, the tooltip and the replication flags -- and, crucially, RE-WIRING every Get/Set node that reads it, in this Blueprint and in every dependent one. This is the only correct way to rename an authored variable in place (e.g. to translate its name). WARNING: it refuses a variable that has a RepNotify function: the engine's own rename opens a MODAL dialog for that case (FSuppressableWarningDialog, which does NOT honour unattended mode) and would hang the editor waiting for a click -- clear the RepNotify with set_bp_variable_replication, rename, then set it back. WARNING: dependent Blueprints are only repaired if they are LOADED: this command loads the ones the Asset Registry reports as referencers first, and reports them in referencers_loaded, but an asset that references it in a way the registry does not see keeps the old name silently. It does NOT create CoreRedirects, so a saved game, a DataTable cell or a Python set_editor_property that names the variable as text is NOT fixed -- grep for those. Run compile_blueprint afterwards and save_asset on this Blueprint AND on every referencer.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path owning the variable. |
old_name |
string | yes | Current name of a variable declared on THIS Blueprint; inherited/native ones are refused. |
new_name |
string | yes | New name. Must be a legal identifier and free across the WHOLE class chain (the engine does not check this and would happily create a duplicate). Case-only changes are allowed. |
load_referencers |
boolean | no | Optional bool (default true). Load the Blueprints the Asset Registry lists as referencers BEFORE renaming, so the engine's reference fixup reaches them; it only ever sees what is already in memory. |
Returns: { blueprint_name, old_name, new_name, renamed (re-read: true only if new_name exists and old_name is gone), referencers_loaded: [string], repnotify_cleared: bool, warning? }
rename_function_parameter¶
Destructive.
Rename a PARAMETER of a Blueprint function graph -- the parameter counterpart of rename_bp_variable, and the only headless way to do it: add_function_parameter only ADDS, there is no remove_function_parameter, so "delete and re-add" is not even available. It renames the pin on the Entry node and on EVERY Result node of the graph, and registers a CoreRedirect so that call sites re-map themselves. That redirect is not a nicety: it is what stops this from being a PHANTOM PIN FACTORY. With the redirect, the call site's pin takes the new name AND KEEPS ITS LITERAL VALUE; renamed WITHOUT one, the old pin stays alive and ORPHANED on the caller. WARNING: that orphan is silent: it survives compiles that report num_errors:0 -- so compile_blueprint is NOT the oracle here. The oracle is get_graph_nodes(compact=false) on the callers, checking that NO pin still carries the old name. The redirect matches on Class.Function.Param, so it reaches callers that merely CALL the function (K2Node_Message included) without implementing its interface, and dependents that are not even loaded -- both of which rename_bp_variable cannot reach. It does NOT rename anything that names the parameter as TEXT (a DataTable cell, a saved game, Python). Run compile_blueprint afterwards and save_asset on this Blueprint AND on every caller. AND THE COMPILE IS NOT THE END OF IT: what reaches the .uasset is UserDefinedPins, not the EdGraphPins you read back -- a rename checked only on the latter can report renamed:true, compile at num_errors:0, be saved and COMMITTED, and still come back as the OLD name the next time the editor starts. So it also reports entry_user_pins_after/result_user_pins_after (the serialized side, legitimately EMPTY on an interface-override graph) and refuses to claim success while any UserDefinedPin still carries the old name. The end-to-end oracle is still disk: save_asset -> reload_asset_package -> get_function_pins.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path owning the function graph. |
function_name |
string | yes | Name of the function graph (an interface's own function graph and an interface-override graph both work). |
old_name |
string | yes | Current parameter name, matched on the Entry node and on every Result node. A name present on only one of them is fine. |
new_name |
string | yes | New parameter name. Must be free on the terminal nodes; a collision is refused up front via the engine's own dry-run, before anything is touched. |
write_redirect |
boolean | no | Optional bool (default true). Also PERSIST the redirect as a +PropertyRedirects line in Config/DefaultEngine.ini, so it survives a restart and reaches the other machine. With false the redirect is registered in memory only and the rename EVAPORATES for anyone who opens the project later. |
load_referencers |
boolean | no | Optional bool (default true). Load the Blueprints the Asset Registry lists as referencers BEFORE renaming, so their nodes reconstruct in this session instead of the next one. |
Returns: { blueprint_name, function_name, old_name, new_name, renamed: bool, terminals_renamed: [string], entry_pins_after: [string], result_pins_after: [string], entry_user_pins_after: [string], result_user_pins_after: [string], redirect_registered: string, redirect_persisted_to: string|null, referencers_loaded: [string], must_compile_and_save: [string], warning: string } -- the *_user_pins_after pair is the SERIALIZED side (UserDefinedPins): empty on an interface-override graph is normal, but the old name appearing there is the rename that will revert on restart.
reparent_blueprint¶
Destructive.
Change a Blueprint's parent class and recompile with the editor's own reparent compile flags (delta serialization + skip-new-variable-defaults, whose absence crashes the reinstancer on Blueprints holding class-typed variables). NO snapshot and NO rollback here -- reparent_blueprint_safe adds those, and even its rollback is only PARTIAL (it restores the parent but leaves SCS components RENAMED), so after ANY failed attempt restore the .uasset with git checkout BEFORE measuring again or the leftovers read as pre-existing damage. Errors when the parent is already that class.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
new_parent_class |
string | yes | New parent class: /Script/Module.Class, a Blueprint's generated class path (/Game/Dir/BP_X.BP_X_C), or a resolvable class name |
Returns: { blueprint_name, old_parent, new_parent, reparented } -- reparented is set unconditionally on the success path; the real oracles are get_blueprint_parent, the component overrides (apply_component_property_overrides re-authors them) and git status of the .uasset.
reparent_blueprint_safe¶
Destructive.
Guarded, rollback-capable Blueprint reparent -- PREFER THIS OVER the raw reparent_blueprint, which has none of these guards. It adds: a pre-flight snapshot (parent chain, own-variable count, CDO component count); an OPTIONAL variable de-collision rename (rename_colliding_vars) for own variables whose name collides with a member the NEW parent already declares, which a plain reparent would otherwise clobber; the delta-serialization compile flags, without which a Blueprint with more than ~10 type-pinned variables CRASHES the editor during reinstancing; the same SCS-root reconciliation the Blueprint editor itself does, so a silently renamed component ("Mesh" -> "Mesh1") is reported instead of hidden; an invariant post-check (parent matches, no compile error, own-variable count did not shrink); and, on failure, an in-memory auto_rollback that restores the original parent, restores the component names and recompiles. It never saves to disk. This is a genuinely destructive multi-step transaction: run it with dry_run=true first on any real fork -- that reports the plan and the would-rename set without mutating anything.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path to reparent. |
new_parent_class |
string | yes | New parent class name or path (native /Script, /Game/.../BP.BP_C, or a BP asset path -> its GeneratedClass). |
dry_run |
boolean | no | Optional (default false): analyze + report the plan (snapshot, would-rename vars, component collisions) without mutating. |
rename_colliding_vars |
boolean | no | Optional (default false): before reparenting, rename own NewVariables that collide by name with a member on the new parent. |
auto_rollback |
boolean | no | Optional (default true): on post-check failure, restore the original parent, restore the SCS node names and recompile. |
reconcile_scene_root |
boolean | no | Optional (default true): run the editor's own post-reparent conform pass -- ValidateSceneRootNodes + PrepareToConformSparseClassData + a second pass after the compile. Setting it FALSE disables all three; it exists only as a bisect escape hatch. |
treat_component_renames_as_regression |
boolean | no | Optional (default false): count a silently renamed SCS component as a post-check regression (which triggers auto_rollback). |
Returns: { blueprint_name, blueprint_path, old_parent, new_parent, dry_run, reparented, renamed_variables:[{from,to}], pre_variable_count, post_variable_count, pre_component_count, post_component_count, pre_scs_node_count, post_scs_node_count, scene_root_reconciled, scene_root_reconciled_post_compile, default_scene_root_removed, sparse_class_data_conform_prepared, compile_messages:[{severity,text}], compile_error_count, compile_warning_count, renamed_components:[{guid,from,to,matched_by}], removed_components:[{guid,name}], components_without_guid, colliding_components:[{name,own_class,parent_class}], child_only_components:[{name,class}], compile_status, parent_match, compile_ok, variables_intact, components_intact, post_check_ok, rolled_back, rollback_complete, rollback_restored_components:[{guid,name}] (snapshotted nodes whose name MATCHES again after the rollback), rollback_unrestored_components:[{guid,expected_name,actual_name}], rollback_compile_messages:[{severity,text}], regressions:[string], saved_to_disk (always false -- this tool never saves), persistence_note, verification, verification_checks, success }
run_asset_action_utility¶
Destructive.
Run (or introspect) a scripted action on an Asset/Actor Action Utility
| Parameter | Type | Required | Description |
|---|---|---|---|
utility_path |
string | yes | Object path of the utility blueprint, e.g. |
function_name |
string | no | CallInEditor action to run (default first action) |
Returns: { utility_path, kind, generated_class, action_functions, function_name, function_found, invoked, note }
run_editor_utility_widget¶
Destructive.
Spawn and register an Editor Utility Widget Blueprint as an editor tab
| Parameter | Type | Required | Description |
|---|---|---|---|
widget_blueprint_path |
string | yes | /Game path of the Editor Utility Widget Blueprint |
Returns: { widget_blueprint_path, asset_path, tab_id, registration_name, registered, tab_exists, widget_spawned }
set_blueprint_component_array_element¶
Destructive, idempotent.
Author ONE element of a TArray property on a Blueprint component TEMPLATE (own SCS, or ICH-aware for a component inherited from an ancestor Blueprint): patch named struct members of an existing element, insert a new element at an index, or remove one. Every OTHER element is exported before and after and compared, so a whole-array rewrite that quietly loses the empty/None gaps cannot pass itself off as a targeted edit. There is deliberately NO 'move' operation.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset path or short name |
component_name |
string | yes | Component variable name (own or inherited) |
property_name |
string | yes | Name of the TArray property on the component template |
index |
number | yes | 0-based element index. set_fields/remove need an existing index; insert accepts 0..Num (Num appends) |
operation |
string | no | 'set_fields' (default), 'insert' or 'remove' |
fields |
object | no | Object of { StructMemberName: value } applied to the element. Used by set_fields, and by insert when the element type is a struct |
element |
any | no | Whole-element JSON value. Used by insert for NON-struct element types (or instead of 'fields' for a struct) |
compile |
boolean | no | Optional bool (default true): compile so the edited template reinstances |
save |
boolean | no | Optional bool (default true): save the Blueprint package after the compile |
Returns: { success, error?, data: { blueprint_name, component_name, property_name, source, operation, index, inner_type, num_before, num_after, fields_applied[], field_errors[], siblings_unchanged, siblings_changed[], element_value, post_compile_num, post_compile_element, compiled, saved, save_error?, verification } }
set_blueprint_component_collision¶
Destructive, idempotent.
Set collision on a Blueprint component TEMPLATE (own SCS or inherited via ICH), not on a spawned actor, applying in this order: profile through SetCollisionProfileName (which expands the profile into the FBodyInstance response array -- a raw reflection write would set the string and leave BodyInstance inconsistent, and that is the whole reason this is a separate tool), then collision_enabled, then per-channel responses. Use it instead of set_blueprint_component_property for anything collision-shaped. Unknown channel, response or collision_enabled names are hard errors, never a silent default. Note the ORDER: a later profile would reset the per-channel responses, so responses always win here.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset path or name (required) |
component_name |
string | yes | Component to modify (required); must resolve to a UPrimitiveComponent or the call errors with "no collision to set" |
profile |
string | no | Collision profile name, e.g. "BlockAll" (optional). Applied FIRST, so it does not undo the per-channel responses below. |
collision_enabled |
string | no | ECollisionEnabled value name: NoCollision, QueryOnly, PhysicsOnly or QueryAndPhysics (optional). Any other string is an error. |
responses |
object | no | Object mapping channel -> response, e.g. {"Visibility":"Ignore","ECC_Pawn":"Overlap"} (optional). Channels accept the friendly display name or an ECC_* token (custom project channels included); responses are Ignore, Overlap or Block. An unknown channel is refused rather than defaulting to WorldStatic. |
compile |
boolean | no | Optional bool (default FALSE): compile the Blueprint afterwards so the FBodyInstance change reinstances on the next spawn/PIE. Without it the edit stays in the uncompiled template. |
return_messages |
boolean | no | No effect here: it is only read by the compile this tool may run internally, whose message log is discarded. Call compile_blueprint directly if you want the messages. |
Returns: { success, data: { blueprint_name, component_name, source ("scs" | "inherited-ich" | "inherited-native": which template was written), profile?, collision_enabled?, responses_applied: [{channel, response}], compiled } } -- responses_applied lists ONLY the per-channel writes; profile and collision_enabled appear as their own fields only when they were given. Nothing is re-read: verify with get_blueprint_component_property or get_collision_info.
set_blueprint_component_property¶
Destructive, idempotent.
Set the DEFAULT of a property on a Blueprint component TEMPLATE, including components INHERITED from an ancestor Blueprint (routed through this class' InheritableComponentHandler) or native inherited subobjects; only FRESH instances read the new value. THREE TRAPS, all with the same shape (a green return over a different reality): (1) it can drop an entire OTHER component from the Blueprint IN MEMORY while disk and git stay clean -- count get_blueprint_components before and after, and reload_asset_package(on_dirty="discard") is the cure; (2) on an OBJECT-REFERENCE property it can write None and report override_persisted:true, wiping the inherited default -- check with get_blueprint_component_overrides; (3) actors ALREADY PLACED in a level keep their serialized value, so only runtime-spawned ones change. Read the effective value with get_blueprint_component_property (the read-only twin, which never mints an override), and use apply_component_property_overrides for several writes at once.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset path or short name |
component_name |
string | yes | Component variable name (own or inherited) |
property_name |
string | yes | Property to set on the component template |
property_value |
any | no | New value (any JSON type; same importer as set_component_property). An array value REWRITES THE WHOLE ARRAY, including the empty/None gaps -- set_blueprint_component_array_element edits one element and proves the siblings did not move. |
Returns: { blueprint_name, component_name, property_name, component_class, source, override_persisted } -- source tells you which template was hit (scs / inherited-ich / inherited-scs / inherited-native) and override_persisted only guards the ICH case; NEITHER field re-reads the value, so they are not proof the write landed.
set_blueprint_function_pure¶
Destructive, idempotent.
Mark a Blueprint function as PURE (or back to impure), the editor's "Pure" checkbox: a pure function has no exec pins and is re-evaluated wherever its output is read. REQUIRED to finish a UMG property binding -- FDelegateEditorBinding::IsBindingValid refuses any function that is not FUNC_BlueprintPure or const, so add_widget_property_binding will report valid:false until this has been run on the function. The counterpart reader is get_blueprint_functions_list's is_pure, which reads the same flag off the same UK2Node_FunctionEntry. WARNING: Turning a function pure REMOVES its exec pins: any existing wire into or out of them is dropped by the reconstruct, so do this BEFORE building the function's body, not after.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint owning the function. |
function_name |
string | yes | Name of the function GRAPH (not an event; events cannot be pure). |
is_pure |
boolean | no | true to mark pure (default true), false to make it impure again. |
Returns: { blueprint_name, function_name, is_pure, was_pure, changed, function_flags } -- is_pure is RE-READ from the entry node after the compile, so it is evidence and not an echo.
set_bp_class_replication¶
Destructive, idempotent.
Set class-level ACTOR replication on a Blueprint's CDO (bReplicates, optionally bAlwaysRelevant), compile, and read the values back off the RE-FETCHED post-compile CDO. Actor Blueprints only: a component Blueprint is refused (component replication is set_component_replication). Related reader trap: audit_replication's class_replicates reads the ACTOR flag, so it reports false for every component Blueprint whatever its CDO says.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of an Actor Blueprint (must be compiled at least once). |
replicates |
boolean | yes | Whether the Actor class replicates to network clients. Required. |
always_relevant |
boolean | no | Sets the Actor's bAlwaysRelevant flag; only applied when the field is present |
Returns: { blueprint_name, replicates, always_relevant_set, always_relevant } -- values re-read from the CDO after compiling; always_relevant is only present when it was requested.
set_bp_function_rpc¶
Destructive, idempotent.
Turn a Blueprint FUNCTION into an RPC (rpc_type Server / Client / NetMulticast, or NotReplicated to undo it, plus reliable), then compile and read the FUNC_Net* flags back off the entry node. This is the ONLY headless way to author an RPC THAT TAKES ARGUMENTS: add_function_parameter cannot reach a custom event, so build the RPC as add_blueprint_function -> compile_blueprint -> add_function_parameter -> here. Engine limits that follow: a replicated function cannot return a value and cannot host latent nodes (put a Delay in a separate, parameterless custom event).
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
function_name |
string | yes | Name of an existing FUNCTION graph on the Blueprint (a custom event has no entry node here and is refused). |
rpc_type |
string | yes | One of "NotReplicated", "Server", "Client", "NetMulticast" (case-insensitive). |
reliable |
boolean | no | Mark the RPC reliable; ignored (and cleared) when rpc_type is NotReplicated; defaults to false |
Returns: { blueprint_name, function_name, rpc_type, is_net, reliable, function_flags } -- re-read from the entry node's flags after compiling; rpc_type is the RESOLVED type, so compare it with what you asked for. Proof that the call really crosses the wire is not here: drive it in PIE and read the resulting state on the OTHER side.
set_bp_variable_default¶
Destructive, idempotent.
Set the default value of a variable DECLARED on this Blueprint: writes the live CDO and mirrors the result back into the serialized variable description so it survives save/reload. LIMIT (not a lie, a hard boundary): it CANNOT touch an INHERITED variable -- it answers "Variable 'X' is not declared on this blueprint" -- so the "child that only overrides a parent default" pattern needs the CDO route (execute_python + set_editor_property + compile_blueprint + save). And on a class with actors already placed in a level, the placed instances keep their serialized value: verify on the instances, never on the CDO.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
variable_name |
string | yes | Name of a variable declared on THIS Blueprint (inherited ones are refused) |
value |
string | no | New default in exported-text form, parsed into the variable's type; empty allowed. A value the type cannot parse is an error AND the previous value is restored (the engine's struct import zeroes the target before parsing, so a failed parse wipes the CDO). |
Returns: { blueprint_name, variable_name, default_value, roundtrip_verified } -- default_value is re-exported from the CDO after the write, so it is the real stored value. WARNING: roundtrip_verified:false means the exported text does NOT re-import into the type (e.g. FGameplayTagContainer): the CDO holds the right value and the compiler's property copy carries it, but the serialized description was deliberately left empty because feeding an unparseable string back through a Full compile ZEROES the default. Verify that variable on the CDO after compiling, and prefer wiring it in the graph if it must survive a fresh regeneration.
set_bp_variable_metadata¶
Destructive, idempotent.
Set the editor-facing checkboxes and text of an existing Blueprint variable: instance_editable (per-instance editability), save_game (CPF_SaveGame -- whether the variable goes into a .sav), expose_on_spawn (adds the variable as a pin on SpawnActor), category and tooltip. Only the fields present are touched; passing none is an error. This is the fix for a variable created by add_blueprint_variable, which is born NOT instance-editable while the readers report it as editable. Variable must be declared on THIS Blueprint; on a library variable the answer is a child class of your own, not this call. WARNING: this call does NOT compile: it structurally-modifies the Blueprint, which regenerates the SKELETON only, so a save_game just written is authored but NOT yet on the generated class the save archive reads -- the response says so in save_game_needs_compile, and the loop that finishes the job is compile_blueprint -> save_asset -> get_blueprint_variable_detailed_info and check save_game_generated.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
variable_name |
string | yes | Name of a variable declared on THIS Blueprint (inherited ones are refused). |
instance_editable |
boolean | no | true = editable on each placed actor. Verify by WRITING the placed instance and reading it back; the reporting field is unreliable for every variable. |
save_game |
boolean | no | true = tick "SaveGame" (CPF_SaveGame), so a SaveGame archive (ArIsSaveGame) serializes this variable; false unticks it. The only headless way to set this flag -- set_property_value, Python, set_bp_variable_replication and BlueprintEditorLibrary all refuse it. Needs a compile to reach the generated class. |
expose_on_spawn |
boolean | no | true = the variable shows up as an input pin on SpawnActorFromClass. Verify on the NODE's pins, not on get_blueprint_variables' expose_on_spawn, which reports false for variables that ARE exposed. |
category |
string | no | Category to group the variable under in the editor |
tooltip |
string | no | Tooltip text shown for the variable |
Returns: { blueprint_name, variable_name, updated, save_game?, save_game_generated?, save_game_needs_compile? } -- updated:true only means at least one field was applied, not that it persisted. The three save_game_* fields appear only when save_game was passed, and are READ BACK after the write: save_game off the variable descriptor, save_game_generated off the FProperty of the generated class.
set_bp_variable_replication¶
Destructive, idempotent.
Set a Blueprint variable's replication mode -- None / Replicated / RepNotify (RepNotify also creates the OnRep_<Variable> function graph if missing) -- then compiles and reads CPF_Net/CPF_RepNotify back. TRAP: the full green report can come back WITHOUT the flag surviving into the generated class (a variable reported is_replicated:true that never replicates; re-running this same call fixes it). The ground truth is audit_replication (its payload's replicated_variables list), then compile and re-audit -- never this return, and never one client alone.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
variable_name |
string | yes | Name of a variable DECLARED on this Blueprint (inherited/native variables are refused). |
mode |
string | yes | One of "None", "Replicated", "RepNotify" (case-insensitive). "None" also clears the RepNotify function and resets the lifetime condition. |
Returns: { blueprint_name, variable_name, mode, is_replicated, is_rep_notify, rep_notify_func, property_flags } -- read back from the variable's flags after compiling, which is necessary but NOT sufficient (see the trap above).
set_component_replication¶
Destructive, idempotent.
Set bReplicates on ONE SCS component TEMPLATE of a Blueprint (the archetype, not a spawned actor's instance), compile, and read it back off the template. It governs the component's own PROPERTY replication; note that a component declared in the SCS already routes its RPCs through its stable network name WITHOUT this flag (a component added at RUNTIME does not, and loses them). For the owning actor use set_bp_class_replication.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name (or full object path) of the Blueprint. |
component_name |
string | yes | SCS component variable name on this Blueprint (inherited-only components have no local SCS node and are not found). |
replicates |
boolean | yes | Whether the component should replicate. Required. |
Returns: { blueprint_name, component_name, replicates } -- replicates is re-read from the template after compiling.
set_event_dispatcher_signature¶
Destructive, idempotent.
Add to (mode="add", the idempotent default) or rewrite (mode="replace") the parameter list of a dispatcher this Blueprint OWNS -- inherited dispatchers have no local signature graph and are refused with the list of owned ones. Every requested type is resolved BEFORE anything is mutated, so a bad type aborts cleanly. The parameters become the OUTPUT pins of every bound handler and the INPUT pins of add_broadcast_node; existing nodes keep stale pins until compile_blueprint reconstructs them.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path that OWNS the dispatcher (inherited dispatchers cannot be edited here). |
dispatcher_name |
string | yes | Name of an existing event dispatcher (created by add_event_dispatcher or the editor). |
params |
array | yes | Array of parameter specs to add: [ { name: string, type: string } ]. Dispatcher params are input-only; 'type' accepts the same strings as add_function_parameter (bool, int, int64, float, string, name, text, byte, Vector, Array<T>, an object/class/struct/enum name or path). |
mode |
string | no | "add" (default, idempotent: skip a param whose name already exists) or "replace" (clear the existing signature first, then add the given params). |
Returns: { blueprint_name, dispatcher_name, mode, added: [string], params: [ { name, type } ], param_count }
set_mesh_material_color¶
Destructive, idempotent.
Tint one material slot of a Blueprint component template by creating a DYNAMIC material instance (MID) over the current or given material, setting one vector parameter, and assigning the MID to the slot. A MID is a RUNTIME object, so this is a quick preview, NOT the way to author a change that must survive save/reload -- for a persistent tint make a MaterialInstanceConstant and assign it with apply_material_to_blueprint. A parameter_name the material does not declare is accepted silently and simply does nothing.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
component_name |
string | yes | Name of an OWN SCS component; must be a UPrimitiveComponent |
color |
array | yes | RGBA color [R, G, B, A] as floats, each clamped to 0.0-1.0; exactly 4 values are required |
material_slot |
number | no | Optional slot index; defaults to 0 |
parameter_name |
string | no | Optional vector parameter name; defaults to "BaseColor". A name the material does not declare is NOT reported as an error -- it just has no visible effect. |
material_path |
string | no | Optional material asset path to use as the MID's parent; without it the component's current slot material is used, falling back to /Engine/BasicShapes/BasicShapeMaterial |
Returns: { component: string, material_slot: int, parameter_name: string, color: [number, number, number, number], success: bool } -- success:true only means the MID was created and assigned; re-read with get_blueprint_material_info after a save/reload to see whether anything persisted.
set_physics_properties¶
Destructive, idempotent.
Set simulate-physics, mass override, linear and angular damping on ONE primitive component TEMPLATE of a Blueprint (an OWN SCS node only -- inherited components are not found here, and it is the template, not a placed actor). Only the fields present are touched. It does NOT compile and does NOT save. For any other property of a component template use set_blueprint_component_property, which is ICH-aware and reaches inherited components.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
component_name |
string | yes | Name of an OWN SCS component; must resolve to a UPrimitiveComponent or the call errors |
simulate_physics |
boolean | no | Optional bool to toggle physics simulation |
mass |
number | no | Optional mass override in kg (applied as SetMassOverrideInKg, not a scale) |
linear_damping |
number | no | Optional linear damping coefficient |
angular_damping |
number | no | Optional angular damping coefficient |
Returns: { component: string } -- just the component name back. NOTHING is read back, so verify with get_blueprint_component_property on each property you set.
set_pin_default_value¶
Destructive, idempotent.
Write the literal default of an UNCONNECTED input pin and return the value read BACK off the pin. Struct pins are canonicalized: a bare GameplayTag name becomes (TagName="X") and an UNREGISTERED tag is rejected up front instead of silently landing as an empty tag; value_json nativizes any struct (and is the only way to put SEVERAL tags in a GameplayTagContainer). Array/set/map pins are refused (use a MakeArray/MakeSet/MakeMap node) and so are pins currently split into sub-pins (recombine_blueprint_pin first). A plain string is fine for an FText pin. TRAP: on a FormatText "Format" pin the literal IS written but the {argument} pins are NOT created, leaving a valid, useless node -- build the string with Concat_StrStr / Conv_StringToText instead.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint asset name or path |
node_id |
string | yes | NodeGuid of the node owning the pin |
pin_name |
string | yes | Pin name; an INPUT pin of that name is preferred, any pin with the name is the fallback |
value |
string | no | Literal default in the pin's exported-text form; empty string allowed (clears it). For a struct pin, "()" clears and a leading "(" is passed through untouched. |
value_json |
object | no | Optional JSON object nativized into the struct's export-text form, for STRUCT pins only. For an FGameplayTagContainer it must carry a "GameplayTags" array (["A","B"] or [{"TagName":"A"}]) and every tag is validated; takes precedence over 'value'. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
Returns: { node_id, pin_name, default_value } -- default_value is re-read from the pin AFTER the write, so it is the oracle for what actually landed (a rejected value shows up as the old one).
set_property_access_path¶
Destructive, idempotent.
Rewrite a UK2Node_PropertyAccess node's binding Path and reconstruct the node so the leaf property re-resolves and the Value pin re-types, then return the path READ BACK -- so resolved:true is real evidence the new binding points at something. It does NOT recompile: follow with compile_blueprint + get_compile_errors. reconstructed:false means the PropertyAccessEditor feature was unavailable: the path WAS written but text_path/resolved_pin stay stale until the graph reopens.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path (usually an Animation Blueprint). |
node_id |
string | yes | NodeGuid of the property-access node; any other node class is refused by name. |
path |
any | no | The new path: either an array of segment strings (["InAnimInstance","Foo"]) OR a dotted string ("InAnimInstance.Foo"). An empty result is an error, never a cleared binding. |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted. |
Returns: { node_id, graph_name, reconstructed, path:[string], text_path, resolved, resolved_pin, note? } -- path/text_path/resolved are re-read AFTER the reconstruct, so they are the oracle rather than an echo.
set_replication_condition¶
Destructive, idempotent.
Set the ELifetimeCondition (COND_OwnerOnly, COND_SkipOwner, COND_InitialOnly...) that decides WHICH clients get a replicated variable, then compile. It is the second half of set_bp_variable_replication, which decides WHETHER it replicates at all: on a variable that is not Replicated/RepNotify the condition is stored and completely INERT, and the response says so through is_replicated:false plus a "note". Blueprint-declared variables only.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
variable_name |
string | yes | Name of a variable DECLARED on this Blueprint (inherited ones are refused). |
condition |
string | yes | ELifetimeCondition name, with or without the COND_ prefix (e.g. "OwnerOnly" or "COND_OwnerOnly"); an unknown name is an error. |
Returns: { blueprint_name, variable_name, condition, is_replicated, note? } -- condition is the canonical COND_ name that was stored; is_replicated:false means the setting has no effect yet.
set_static_mesh_properties¶
Destructive, idempotent.
Assign a static mesh asset and/or a slot-0 material to a mesh component TEMPLATE of a Blueprint (an OWN SCS node, not a placed actor), in one call. Does NOT compile and does NOT save. Use apply_material_to_blueprint when only a material is changing or the slot is not 0, and get_blueprint_material_info to read the resulting slots back.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
component_name |
string | yes | Name of an OWN SCS mesh component |
static_mesh |
string | no | Optional asset path of the UStaticMesh to assign |
material |
string | no | Optional asset path of the UMaterialInterface for slot 0 |
Returns: { component: string } -- name only, no verification: read the result with get_blueprint_material_info / get_blueprint_component_property.
spawn_blueprint_actor¶
Additive.
Spawn an instance of a Blueprint class as an actor and report WHICH world took it and whether the actor has AUTHORITY. The default (world absent or 'editor') places it in the EDITOR level, not in play. For anything that must exist for every player during PIE use world='server'; world='pie' is ambiguous and can land on the CLIENT, where the actor has no authority, no AI controller and no server-side existence while looking identical in the payload. The actor is NOT saved into the map: save_level afterwards for an editor-world spawn.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Name of the blueprint |
actor_name |
string | yes | Label applied to the spawned actor (SetActorLabel); it is not the object name and is not made unique |
location |
array | no | Optional [x, y, z] world location |
rotation |
array | no | Optional [pitch, yaw, roll] world rotation |
world |
string | no | Optional world selector: absent/'editor' (default) spawns into the editor level | 'server' spawns into the PIE world WITH AUTHORITY (what you want for anything that must exist for every player: an actor spawned into the client world has no authority and no server-side existence) | 'client' | 'pie:N' | 'pie' (ambiguous: PlayWorld, else the first PIE context -- can land on the CLIENT) | 'game' (alias of 'pie') |
Returns: { actor JSON via DescribeActorObject, world: string, has_authority: bool (AActor::HasAuthority() read off the spawned actor), local_role: string, world_name: string|null, world_package: string|null, world_type: string|null, net_mode: string|null, pie_instance: number }
split_blueprint_pin¶
Destructive.
Split a struct-typed pin (Vector, Rotator, Transform...) into its scalar sub-pins and return their names, so each component can be wired or defaulted on its own instead of writing the whole struct literal. Refused when the schema says the pin is not splittable. Note the interaction: set_pin_default_value REFUSES a pin that is currently split -- recombine_blueprint_pin first if you want to write the struct as one value.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
node_id |
string | yes | NodeGuid of the node owning the pin. |
pin_name |
string | yes | Name of the struct pin to split (either direction). |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
Returns: { split, sub_pins:[string] } -- sub_pins are the names to pass to connect_pins / set_pin_default_value from now on (e.g. "NewLocation_X").
validate_pin_connection¶
Read-only.
Dry-run the K2 schema's verdict on a pin pair WITHOUT touching the graph: returns valid plus the schema's own message (which names the incompatible types) and its raw response code. connect_pins runs the same check and then connects, so use this one to test a plan before committing a build_blueprint_graph batch whose rollback can be refused, or to find out WHY a connection was rejected without leaving anything behind.
| Parameter | Type | Required | Description |
|---|---|---|---|
blueprint_name |
string | yes | Blueprint name or path. |
source_node_id |
string | yes | NodeGuid of the source node. |
source_pin |
string | yes | Output pin name on the source node (falls back to any pin with that name). |
target_node_id |
string | yes | NodeGuid of the target node; must be in the same graph as the source. |
target_pin |
string | yes | Input pin name on the target node (falls back to any pin with that name). |
graph_name |
string | no | Target graph name; defaults to the Blueprint's event graph when omitted |
Returns: { valid, message, response_code } -- valid is false only for an outright DISALLOW; a response that would connect WITH a conversion node or by breaking an existing link still reports valid:true, and "message" is where that shows.