void __cdecl RestartPython(void) { Com_Printf("Restarting Python...\n"); if (PyMinqlx_IsInitialized()) PyMinqlx_Finalize(); PyMinqlx_Initialize(); // minqlx initializes after the first new game starts, but since the game already // start, we manually trigger the event to make it initialize properly. NewGameDispatcher(0); }
PyMinqlx_InitStatus_t PyMinqlx_Finalize(void) { if (!PyMinqlx_IsInitialized()) { DebugPrint("%s was called before being initialized!\n", __func__); return PYM_NOT_INITIALIZED_ERROR; } for (handler_t* h = handlers; h->name; h++) { *h->handler = NULL; } PyEval_RestoreThread(mainstate); Py_Finalize(); initialized = 0; return PYM_SUCCESS; }
PyMinqlx_InitStatus_t PyMinqlx_Initialize(void) { if (PyMinqlx_IsInitialized()) { DebugPrint("%s was called while already initialized!\n", __func__); return PYM_ALREADY_INITIALIZED; } DebugPrint("Initializing Python...\n"); Py_SetProgramName(PYTHON_FILENAME); PyImport_AppendInittab("_minqlx", &PyMinqlx_InitModule); Py_Initialize(); PyEval_InitThreads(); // Add the main module. PyObject* main_module = PyImport_AddModule("__main__"); PyObject* main_dict = PyModule_GetDict(main_module); // Run script to load pyminqlx. PyObject* res = PyRun_String(loader, Py_file_input, main_dict, main_dict); if (res == NULL) { DebugPrint("PyRun_String() returned NULL. Did you modify the loader?\n"); return PYM_MAIN_SCRIPT_ERROR; } PyObject* ret = PyDict_GetItemString(main_dict, "ret"); Py_XDECREF(ret); Py_DECREF(res); if (ret == NULL) { DebugPrint("The loader script return value doesn't exist?\n"); return PYM_MAIN_SCRIPT_ERROR; } else if (ret != Py_True) { // No need to print anything, since the traceback should be printed already. return PYM_MAIN_SCRIPT_ERROR; } mainstate = PyEval_SaveThread(); initialized = 1; DebugPrint("Python initialized!\n"); return PYM_SUCCESS; }