diff --git a/Aquaria/DSQ.cpp b/Aquaria/DSQ.cpp index 99427b2..dca1cc4 100644 --- a/Aquaria/DSQ.cpp +++ b/Aquaria/DSQ.cpp @@ -2334,6 +2334,8 @@ void DSQ::playPositionalSfx(const std::string &name, const Vector &position, flo void DSQ::shutdown() { + mod.stop(); + Network::shutdown(); scriptInterface.shutdown(); diff --git a/Aquaria/DSQ.h b/Aquaria/DSQ.h index e24d4ff..3be5ae6 100644 --- a/Aquaria/DSQ.h +++ b/Aquaria/DSQ.h @@ -257,6 +257,7 @@ class Mod { public: Mod(); + ~Mod(); void clear(); void setActive(bool v); void start(); @@ -297,6 +298,7 @@ protected: std::string name; std::string path; + Precacher modcache; }; class AquariaScreenTransition : public ScreenTransition diff --git a/Aquaria/Mod.cpp b/Aquaria/Mod.cpp index beac053..4a38b9c 100644 --- a/Aquaria/Mod.cpp +++ b/Aquaria/Mod.cpp @@ -39,6 +39,11 @@ Mod::Mod() shuttingDown = false; } +Mod::~Mod() +{ + modcache.clean(); +} + /* queue for actual stop and recache which happens in game::applystate @@ -182,6 +187,23 @@ void Mod::recache() core->resetTimer(); } + + if(active) + { + modcache.setBaseDir(dsq->secondaryTexturePath); + std::string fname = path; + if(fname[fname.length() - 1] != '/') + fname += '/'; + fname += "precache.txt"; + fname = localisePath(fname, dsq->mod.getPath()); + fname = core->adjustFilenameCase(fname); + if (exists(fname)) + modcache.precacheList(fname); + } + else + { + modcache.clean(); + } } void Mod::start() diff --git a/BBGE/Precacher.cpp b/BBGE/Precacher.cpp index 24e1585..3d604b8 100644 --- a/BBGE/Precacher.cpp +++ b/BBGE/Precacher.cpp @@ -34,6 +34,11 @@ Precacher::~Precacher() errorLog ("Precacher shutdown unclean"); } +void Precacher::setBaseDir(const std::string& dir) +{ + basedirOverride = dir; +} + void Precacher::clean() { for (unsigned int i = 0; i < renderObjects.size(); i++) @@ -88,6 +93,8 @@ void Precacher::precacheTex(const std::string &tex) } if (tex.empty()) return; + std::string basedir = basedirOverride.empty() ? core->getBaseTextureDirectory() : basedirOverride; + if (core->debugLogTextures) debugLog("PRECACHING: " + tex); @@ -99,7 +106,7 @@ void Precacher::precacheTex(const std::string &tex) int loc = tex.find('*'); std::string path = tex.substr(0, loc); std::string type = tex.substr(loc+1, tex.size()); - path = core->getBaseTextureDirectory() + path; + path = basedir + path; forEachFile(path, type, precacherCallback, (intptr_t)this); return; } @@ -108,9 +115,9 @@ void Precacher::precacheTex(const std::string &tex) if (loadProgressCallback) loadProgressCallback(); std::string t = tex; - if (tex.find(core->getBaseTextureDirectory()) != std::string::npos) + if (tex.find(basedir) != std::string::npos) { - t = tex.substr(core->getBaseTextureDirectory().size(), tex.size()); + t = tex.substr(basedir.size(), tex.size()); } Quad *q = new Quad; q->setTexture(t); diff --git a/BBGE/Precacher.h b/BBGE/Precacher.h index 87e9a05..4893123 100644 --- a/BBGE/Precacher.h +++ b/BBGE/Precacher.h @@ -32,11 +32,13 @@ public: void precacheList(const std::string &list, void progressCallback() = NULL); void clean(); void loadTextureRange(const std::string &file, const std::string &type, int start, int end); + void setBaseDir(const std::string& dir); std::vector renderObjects; private: bool cleaned; void (*loadProgressCallback)(); + std::string basedirOverride; }; #endif