From a8e518d996e23de87888a421ff1e38dbe8c0c4f1 Mon Sep 17 00:00:00 2001 From: Skyth <19259897+blueskythlikesclouds@users.noreply.github.com> Date: Wed, 12 Jun 2024 22:14:00 +0300 Subject: [PATCH] Fix current directory change logic in hybrid directory. --- core/io/dir_access_hybrid.cpp | 55 +++++++++++++++++++++++++---------- core/io/dir_access_hybrid.h | 2 ++ core/project_settings.cpp | 14 ++++----- 3 files changed, 48 insertions(+), 23 deletions(-) diff --git a/core/io/dir_access_hybrid.cpp b/core/io/dir_access_hybrid.cpp index cea399039021..f843fea0275b 100644 --- a/core/io/dir_access_hybrid.cpp +++ b/core/io/dir_access_hybrid.cpp @@ -43,6 +43,8 @@ Error DirAccessHybrid::list_dir_begin() { dir_access_pack->list_dir_end(); } + cdir = !list_dirs.empty(); + return OK; } @@ -91,28 +93,44 @@ String DirAccessHybrid::get_drive(int p_drive) { Error DirAccessHybrid::change_dir(String p_dir) { - dir_access_os->set_access_type(get_access_type()); - dir_access_pack->set_access_type(get_access_type()); - - err_pack = dir_access_pack->change_dir(p_dir); + String old_dir = cur_dir; - if (err_pack == OK) { - err_os = dir_access_os->change_dir(dir_access_pack->get_current_dir()); - } else { + if (p_dir.begins_with("res://") || p_dir.begins_with("/")) { err_os = dir_access_os->change_dir(p_dir); + err_pack = dir_access_pack->change_dir(p_dir); + cur_dir = p_dir; + } else { + if (err_os == OK) { + err_os = dir_access_os->change_dir(p_dir); + } if (err_os == OK) { - err_pack = dir_access_pack->change_dir(dir_access_os->get_current_dir()); + cur_dir = dir_access_os->get_current_dir(); + err_pack = dir_access_pack->change_dir(cur_dir); + } else if (err_pack == OK) { + err_pack = dir_access_pack->change_dir(p_dir); + if (err_pack == OK) { + cur_dir = dir_access_pack->get_current_dir(); + err_os = dir_access_os->change_dir(cur_dir); + } } } - return err_os == OK || err_pack == OK ? OK : ERR_INVALID_PARAMETER; + if (err_os == OK || err_pack == OK) { + return OK; + } + + err_os = dir_access_os->change_dir(old_dir); + err_pack = dir_access_pack->change_dir(old_dir); + cur_dir = old_dir; + + return ERR_INVALID_PARAMETER; } String DirAccessHybrid::get_current_dir() { return err_os == OK ? dir_access_os->get_current_dir() : err_pack == OK ? dir_access_pack->get_current_dir() : - ""; + cur_dir; } Error DirAccessHybrid::make_dir(String p_dir) { @@ -166,12 +184,17 @@ String DirAccessHybrid::get_filesystem_type() const { return dir_access_os->get_filesystem_type(); } -DirAccessHybrid::DirAccessHybrid(){ - dir_access_os = DirAccess::create(AccessType::ACCESS_FILESYSTEM); - dir_access_pack = memnew(DirAccessPack); - err_os = OK; - err_pack = OK; - cdir = false; +DirAccessHybrid::DirAccessHybrid() { + + dir_access_os = DirAccess::create(AccessType::ACCESS_FILESYSTEM); + dir_access_os->set_access_type(AccessType::ACCESS_RESOURCES); + + dir_access_pack = memnew(DirAccessPack); + dir_access_pack->set_access_type(AccessType::ACCESS_RESOURCES); + + err_os = OK; + err_pack = OK; + cdir = false; } DirAccessHybrid::~DirAccessHybrid() { diff --git a/core/io/dir_access_hybrid.h b/core/io/dir_access_hybrid.h index 7cde1f1f1df4..05df423ebd10 100644 --- a/core/io/dir_access_hybrid.h +++ b/core/io/dir_access_hybrid.h @@ -13,6 +13,8 @@ class DirAccessHybrid : public DirAccess { Error err_os; Error err_pack; + String cur_dir; + List list_dirs; List list_files; diff --git a/core/project_settings.cpp b/core/project_settings.cpp index 2fcddaca664d..d0ef8977c5d0 100644 --- a/core/project_settings.cpp +++ b/core/project_settings.cpp @@ -368,17 +368,17 @@ Error ProjectSettings::_setup(const String &p_path, const String &p_main_pack, b ERR_FAIL_COND_V(err != OK, ERR_CANT_OPEN); - String currentFile = dir->get_next(); + String current_file = dir->get_next(); - while (currentFile != "") { - if (!currentFile.ends_with(".pck") || dir->current_is_dir()) { - currentFile = dir->get_next(); + while (current_file != "") { + if (dir->current_is_dir() || (!current_file.ends_with(".zip") && !current_file.ends_with(".pck"))) { + current_file = dir->get_next(); continue; } - printf("Add pack: %ls\n", currentFile.c_str()); - PackedData::get_singleton()->add_pack(currentFile); - currentFile = dir->get_next(); + printf("Add pack: %ls\n", current_file.c_str()); + PackedData::get_singleton()->add_pack(current_file); + current_file = dir->get_next(); } using_datapack = true;