Fix hard crash in SpawnActor node creation
UK2Node_SpawnActorFromClass::PostPlacedNewNode() (engine source) overrides the base class without calling Super::PostPlacedNewNode(), and unconditionally dereferences GetScaleMethodPin() via FindPinChecked -- but that pin is only created in AllocateDefaultPins(), which FGraphNodeCreator::Finalize() always calls *after* PostPlacedNewNode(). Result: a hard assertion failure (EdGraphNode.h:586) that crashes the whole editor, every time, regardless of any node_json parameters. The real editor UI never hits this because it creates nodes through a different path (node spawner templates) that doesn't have this ordering problem. Our plugin uses the generic FGraphNodeCreator pattern directly, so it does. Fix: manually call SpawnNode->AllocateDefaultPins() before Creator.Finalize(), so pins already exist by the time PostPlacedNewNode() runs. Verified: SpawnActor node now creates cleanly with all expected pins (Class, SpawnTransform, etc), editor stayed stable and MCP connection alive afterward. Rebuilt via Live Coding successfully this time (Ctrl+Alt+F11) -- the earlier UbaCli spawn failure appears to have been a one-off, possibly from a conflicting concurrent Build.bat invocation.
This commit is contained in:
@@ -645,6 +645,13 @@ static UEdGraphNode* CreateBPNodeFromJson(UEdGraph* Graph, UBlueprint* Blueprint
|
||||
UK2Node_SpawnActorFromClass* SpawnNode = Creator.CreateNode(false);
|
||||
SpawnNode->NodePosX = PosX;
|
||||
SpawnNode->NodePosY = PosY;
|
||||
// Engine bug workaround: UK2Node_SpawnActorFromClass::PostPlacedNewNode() does not call
|
||||
// Super::PostPlacedNewNode() and unconditionally dereferences GetScaleMethodPin() via
|
||||
// FindPinChecked, but that pin is only created in AllocateDefaultPins(). FGraphNodeCreator::
|
||||
// Finalize() always calls PostPlacedNewNode() before AllocateDefaultPins(), so on this node
|
||||
// type it hard-crashes (assert) unless pins already exist beforehand. The real editor UI
|
||||
// avoids this node-creation path entirely; we can't, so pre-allocate pins ourselves.
|
||||
SpawnNode->AllocateDefaultPins();
|
||||
Creator.Finalize();
|
||||
NewNode = SpawnNode;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user