mirror of
https://github.com/love2d/love.git
synced 2026-08-21 21:15:09 +02:00
Updated love.filesystem's C library loader for require to look in paths added via love.filesystem.mount, when in fused mode
This commit is contained in:
@@ -397,6 +397,16 @@ std::string Filesystem::getSourceBaseDirectory() const
|
|||||||
return game_source.substr(0, base_end_pos);
|
return game_source.substr(0, base_end_pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string Filesystem::getRealDirectory(const char *filename) const
|
||||||
|
{
|
||||||
|
const char *dir = PHYSFS_getRealDir(filename);
|
||||||
|
|
||||||
|
if (dir == nullptr)
|
||||||
|
throw love::Exception("File does not exist.");
|
||||||
|
|
||||||
|
return std::string(dir);
|
||||||
|
}
|
||||||
|
|
||||||
bool Filesystem::exists(const char *file) const
|
bool Filesystem::exists(const char *file) const
|
||||||
{
|
{
|
||||||
return PHYSFS_exists(file);
|
return PHYSFS_exists(file);
|
||||||
|
|||||||
@@ -166,6 +166,11 @@ public:
|
|||||||
**/
|
**/
|
||||||
std::string getSourceBaseDirectory() const;
|
std::string getSourceBaseDirectory() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the real directory path containing the file.
|
||||||
|
**/
|
||||||
|
std::string getRealDirectory(const char *filename) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether a file exists in the current search path
|
* Checks whether a file exists in the current search path
|
||||||
* or not.
|
* or not.
|
||||||
|
|||||||
@@ -526,9 +526,31 @@ int extloader(lua_State *L)
|
|||||||
|
|
||||||
tokenized_name += library_extension();
|
tokenized_name += library_extension();
|
||||||
|
|
||||||
void *handle = SDL_LoadObject((std::string(instance->getAppdataDirectory()) + LOVE_PATH_SEPARATOR LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR + tokenized_name).c_str());
|
void *handle = nullptr;
|
||||||
if (!handle && instance->isFused())
|
|
||||||
handle = SDL_LoadObject((std::string(instance->getSaveDirectory()) + LOVE_PATH_SEPARATOR + tokenized_name).c_str());
|
// If the game is fused, try looking for the DLL in the game's read paths.
|
||||||
|
if (instance->isFused())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
std::string dir = instance->getRealDirectory(tokenized_name.c_str());
|
||||||
|
|
||||||
|
// We don't want to look in the game's source, because it can be a
|
||||||
|
// zip sometimes and a folder other times.
|
||||||
|
if (dir.find(instance->getSource()) == std::string::npos)
|
||||||
|
handle = SDL_LoadObject((dir + LOVE_PATH_SEPARATOR + tokenized_name).c_str());
|
||||||
|
}
|
||||||
|
catch (love::Exception &)
|
||||||
|
{
|
||||||
|
// Nothing...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!handle)
|
||||||
|
{
|
||||||
|
std::string path = std::string(instance->getAppdataDirectory()) + LOVE_PATH_SEPARATOR LOVE_APPDATA_FOLDER LOVE_PATH_SEPARATOR + tokenized_name;
|
||||||
|
handle = SDL_LoadObject(path.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
if (!handle)
|
if (!handle)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user