diff --git a/editor/script/script_create_dialog.cpp b/editor/script/script_create_dialog.cpp index e69fd72896..5a70d6d9b7 100644 --- a/editor/script/script_create_dialog.cpp +++ b/editor/script/script_create_dialog.cpp @@ -413,6 +413,9 @@ void ScriptCreateDialog::_load_exist() { void ScriptCreateDialog::_language_changed(int l) { language = ScriptServer::get_language(l); + if (language == nullptr) { + return; + } can_inherit_from_file = language->can_inherit_from_file(); supports_built_in = language->supports_builtin_mode(); @@ -527,6 +530,9 @@ void ScriptCreateDialog::_path_changed(const String &p_path) { } void ScriptCreateDialog::_update_template_menu() { + if (language == nullptr) { + return; + } bool is_language_using_templates = language->is_using_templates(); template_menu->set_disabled(false); template_menu->clear(); @@ -898,8 +904,18 @@ ScriptCreateDialog::ScriptCreateDialog() { default_language = i; } } - if (default_language >= 0) { + if (ScriptServer::get_language_count() == 0) { + // Edge Case 1: No scripting languages exist at all. + get_ok_button()->set_disabled(true); // Explicitly disable the confirmation button to prevent downstream crashes. + language_menu->set_disabled(true); + language_menu->set_auto_translate_mode(AUTO_TRANSLATE_MODE_ALWAYS); + language_menu->add_item(TTR("No Scripting Languages Available")); + } else if (default_language >= 0) { + // Normal Case: GDScript is available, select it. language_menu->select(default_language); + } else { + // Edge Case 2: Languages exist (like C#), but GDScript is disabled. + language_menu->select(0); } language_menu->connect(SceneStringName(item_selected), callable_mp(this, &ScriptCreateDialog::_language_changed));