33#include " Kismet/KismetSystemLibrary.h"
44#include " Kismet/KismetMathLibrary.h"
55
6+ #if WITH_EDITOR
7+ #include " Kismet2/KismetEditorUtilities.h"
8+ #endif
9+
610#include " PythonGeneratedClass.h"
711
812PyObject *py_unreal_engine_log (PyObject * self, PyObject * args) {
@@ -481,15 +485,15 @@ PyObject *py_unreal_engine_new_object(PyObject * self, PyObject * args) {
481485 return (PyObject *)ret;
482486}
483487
484- PyObject *py_unreal_engine_new_blueprint_class (PyObject * self, PyObject * args) {
488+ #if WITH_EDITOR
489+ PyObject *py_unreal_engine_create_blueprint (PyObject * self, PyObject * args) {
485490
486491 PyObject *py_parent;
487492 char *name;
488- if (!PyArg_ParseTuple (args, " Os:new_blueprint_class " , &py_parent, &name)) {
493+ if (!PyArg_ParseTuple (args, " Os:create_blueprint " , &py_parent, &name)) {
489494 return NULL ;
490495 }
491496
492- UObject *outer = CreatePackage (nullptr , TEXT (" /Script/Python" ));
493497 UClass *parent = UObject::StaticClass ();
494498
495499 if (py_parent != Py_None) {
@@ -501,7 +505,40 @@ PyObject *py_unreal_engine_new_blueprint_class(PyObject * self, PyObject * args)
501505 return PyErr_Format (PyExc_Exception, " uobject is not a UClass" );
502506 parent = (UClass *)py_obj->ue_object ;
503507 }
504-
508+
509+ UObject *outer = CreatePackage (nullptr , TEXT (" /Game/" ));
510+ UBlueprint *bp = FKismetEditorUtilities::CreateBlueprint (parent, outer, UTF8_TO_TCHAR (name), EBlueprintType::BPTYPE_Normal, UBlueprint::StaticClass (), UBlueprintGeneratedClass::StaticClass ());
511+
512+ ue_PyUObject *ret = ue_get_python_wrapper (bp);
513+ if (!ret)
514+ return PyErr_Format (PyExc_Exception, " uobject is in invalid state" );
515+ Py_INCREF (ret);
516+ return (PyObject *)ret;
517+
518+ }
519+ #endif
520+
521+ PyObject *py_unreal_engine_new_class (PyObject * self, PyObject * args) {
522+
523+ PyObject *py_parent;
524+ char *name;
525+ if (!PyArg_ParseTuple (args, " Os:new_class" , &py_parent, &name)) {
526+ return NULL ;
527+ }
528+
529+ UObject *outer = GetTransientPackage ();
530+ UClass *parent = UObject::StaticClass ();
531+
532+ if (py_parent != Py_None) {
533+ if (!ue_is_pyuobject (py_parent)) {
534+ return PyErr_Format (PyExc_Exception, " argument is not a UObject" );
535+ }
536+ ue_PyUObject *py_obj = (ue_PyUObject *)py_parent;
537+ if (!py_obj->ue_object ->IsA <UClass>())
538+ return PyErr_Format (PyExc_Exception, " uobject is not a UClass" );
539+ parent = (UClass *)py_obj->ue_object ;
540+ }
541+
505542 UBlueprintGeneratedClass *new_object = nullptr ;
506543
507544 if (Cast<UBlueprintGeneratedClass>(parent)) {
@@ -510,32 +547,22 @@ PyObject *py_unreal_engine_new_blueprint_class(PyObject * self, PyObject * args)
510547 }
511548 else {
512549 UE_LOG (LogPython, Warning, TEXT (" Parent class is NOT blueprint generated" ));
513- new_object = NewObject<UPythonGeneratedClass >(outer, UTF8_TO_TCHAR (name), RF_Public);
550+ new_object = NewObject<UBlueprintGeneratedClass >(outer, UTF8_TO_TCHAR (name), RF_Public);
514551 new_object->ClassFlags |= CLASS_Native;
515552 }
516553
517554 if (!new_object)
518- return PyErr_Format (PyExc_Exception, " unable to create blueprint class" );
519-
520- UBlueprint *blueprint = NewObject<UBlueprint>(outer);
521- blueprint->GeneratedClass = new_object;
522- new_object->ClassGeneratedBy = blueprint;
523-
555+ return PyErr_Format (PyExc_Exception, " unable to create class" );
524556
525- auto ClassConstructor = [](const FObjectInitializer& ObjectInitializer) {
526- auto _class = ObjectInitializer.GetClass ();
527- UE_LOG (LogPython, Warning, TEXT (" CALLING CONSTRUCTOR OF %s" ), *_class->GetName ());
528- _class->GetSuperClass ()->ClassConstructor (ObjectInitializer);
529- };
530557
531- new_object->ClassConstructor = ClassConstructor;
558+ new_object->ClassConstructor = parent-> ClassConstructor ;
532559 new_object->SetSuperStruct (parent);
533560
534561 new_object->PropertyLink = parent->PropertyLink ;
535562 new_object->ClassWithin = parent->ClassWithin ;
536563 new_object->ClassConfigName = parent->ClassConfigName ;
537564
538- new_object->ClassFlags |= (parent->ClassFlags & (CLASS_Inherit | CLASS_ScriptInherit | CLASS_CompiledFromBlueprint ));
565+ new_object->ClassFlags |= (parent->ClassFlags & (CLASS_Inherit | CLASS_ScriptInherit | CLASS_HideDropDown ));
539566 new_object->ClassCastFlags |= parent->ClassCastFlags ;
540567
541568 new_object->Bind ();
0 commit comments