diff options
-rw-r--r-- | src/client.cpp | 7 | ||||
-rw-r--r-- | src/gui/windows/updaterwindow.cpp | 117 | ||||
-rw-r--r-- | src/gui/windows/updaterwindow.h | 10 |
3 files changed, 122 insertions, 12 deletions
diff --git a/src/client.cpp b/src/client.cpp index 443c156fb..649c1f08c 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -1176,6 +1176,10 @@ int Client::gameExec() Net::getPartyHandler()->clear(); if (chatLogger) chatLogger->clear(); + if (mOptions.dataPath.empty()) + UpdaterWindow::unloadMods(mOldUpdates); + else + UpdaterWindow::unloadMods(mOptions.dataPath); } mOldState = mState; @@ -1372,6 +1376,7 @@ int Client::gameExec() { mState = STATE_LOAD_DATA; mOldUpdates = ""; + UpdaterWindow::loadDirMods(mOptions.dataPath); } else if (loginData.updateType & LoginData::Upd_Skip) { @@ -1456,7 +1461,7 @@ int Client::gameExec() NPCDB::load(); PETDB::load(); EmoteDB::load(); - ModDB::load(); +// ModDB::load(); StatusEffect::load(); Units::loadUnits(); diff --git a/src/gui/windows/updaterwindow.cpp b/src/gui/windows/updaterwindow.cpp index 099142cbe..fe3a4cbcf 100644 --- a/src/gui/windows/updaterwindow.cpp +++ b/src/gui/windows/updaterwindow.cpp @@ -39,6 +39,8 @@ #include "resources/resourcemanager.h" +#include "resources/db/moddb.h" + #include "utils/gettext.h" #include "utils/mkdir.h" #include "utils/paths.h" @@ -75,14 +77,12 @@ static std::vector<UpdateFile> loadXMLFile(const std::string &fileName) if (!xmlNameEqual(fileNode, "update")) continue; - if (XML::getProperty(fileNode, "group", "default") != "default") - continue; - UpdateFile file; file.name = XML::getProperty(fileNode, "file", ""); file.hash = XML::getProperty(fileNode, "hash", ""); file.type = XML::getProperty(fileNode, "type", "data"); file.desc = XML::getProperty(fileNode, "description", ""); + file.group = XML::getProperty(fileNode, "group", ""); const std::string version = XML::getProperty( fileNode, "version", ""); if (!version.empty()) @@ -128,6 +128,7 @@ static std::vector<UpdateFile> loadTxtFile(const std::string &fileName) thisFile.name = name; thisFile.hash = hash; thisFile.type = "data"; + thisFile.group = ""; thisFile.required = true; thisFile.desc.clear(); @@ -573,10 +574,14 @@ void UpdaterWindow::loadUpdates() const unsigned sz = static_cast<unsigned>(mUpdateFiles.size()); for (mUpdateIndex = 0; mUpdateIndex < sz; mUpdateIndex++) { - UpdaterWindow::addUpdateFile(resman, mUpdatesDir, fixPath, - mUpdateFiles[mUpdateIndex].name, false); + const UpdateFile &file = mUpdateFiles[mUpdateIndex]; + if (!file.group.empty()) + continue; + UpdaterWindow::addUpdateFile(resman, mUpdatesDir, + fixPath, file.name, false); } loadManaPlusUpdates(mUpdatesDir, resman); + loadMods(mUpdatesDir, resman, mUpdateFiles); } void UpdaterWindow::loadLocalUpdates(const std::string &dir) @@ -599,10 +604,14 @@ void UpdaterWindow::loadLocalUpdates(const std::string &dir) for (unsigned int updateIndex = 0, sz = static_cast<unsigned int>( updateFiles.size()); updateIndex < sz; updateIndex ++) { - UpdaterWindow::addUpdateFile(resman, dir, fixPath, - updateFiles[updateIndex].name, false); + const UpdateFile &file = updateFiles[updateIndex]; + if (!file.group.empty()) + continue; + UpdaterWindow::addUpdateFile(resman, dir, + fixPath, file.name, false); } loadManaPlusUpdates(dir, resman); + loadMods(dir, resman, updateFiles); } void UpdaterWindow::unloadUpdates(const std::string &dir) @@ -956,13 +965,9 @@ void UpdaterWindow::handleLink(const std::string &link, gcn::MouseEvent *event A_UNUSED) { if (strStartWith(link, "http://") || strStartWith(link, "https://")) - { openBrowser(link); - } else if (link == "news") - { loadFile("news"); - } } void UpdaterWindow::loadFile(std::string file) @@ -977,3 +982,93 @@ void UpdaterWindow::loadFile(std::string file) for (size_t i = 0, sz = lines.size(); i < sz; ++i) mBrowserBox->addRow(lines[i]); } + +void UpdaterWindow::loadMods(const std::string &dir, + const ResourceManager *const resman, + const std::vector<UpdateFile> &updateFiles) +{ + ModDB::load(); + std::string modsString = serverConfig.getValue("mods", ""); + std::set<std::string> modsList; + splitToStringSet(modsList, modsString, '|'); + + const std::string fixPath = dir + "/fix"; + for (unsigned int updateIndex = 0, sz = static_cast<unsigned int>( + updateFiles.size()); updateIndex < sz; updateIndex ++) + { + const UpdateFile &file = updateFiles[updateIndex]; + if (file.group.empty()) + continue; + const std::set<std::string>::const_iterator + it = modsList.find(file.group); + if (it != modsList.end()) + { + UpdaterWindow::addUpdateFile(resman, dir, + fixPath, file.name, false); + } + } + + std::vector<UpdateFile> updateFiles2 + = loadXMLFile(std::string(fixPath).append("/").append(xmlUpdateFile)); + + for (unsigned int updateIndex = 0, sz = static_cast<unsigned int>( + updateFiles2.size()); updateIndex < sz; updateIndex ++) + { + const UpdateFile &file = updateFiles2[updateIndex]; + if (file.group.empty()) + continue; + std::string name = file.name; + if (strStartWith(name, "manaplus_")) + { + const std::set<std::string>::const_iterator + it = modsList.find(file.group); + if (it != modsList.end()) + { + struct stat statbuf; + std::string file = std::string(fixPath).append( + "/").append(name); + if (!stat(file.c_str(), &statbuf)) + resman->addToSearchPath(file, false); + } + } + } + +} + +void UpdaterWindow::loadDirMods(const std::string &dir) +{ + ModDB::load(); + const ResourceManager *const resman = ResourceManager::getInstance(); + const ModInfos &mods = ModDB::getAll(); + + std::string modsString = serverConfig.getValue("mods", ""); + StringVect modsList; + splitToStringVector(modsList, modsString, '|'); + FOR_EACH (StringVectCIter, it, modsList) + { + const std::string &name = *it; + const ModInfoCIterator modIt = mods.find(name); + if (modIt == mods.end()) + continue; + const ModInfo *const mod = (*modIt).second; + resman->addToSearchPath(dir + "/" + mod->getLocalDir(), false); + } +} + +void UpdaterWindow::unloadMods(const std::string &dir) +{ + const ResourceManager *const resman = ResourceManager::getInstance(); + const ModInfos &mods = ModDB::getAll(); + std::string modsString = serverConfig.getValue("mods", ""); + StringVect modsList; + splitToStringVector(modsList, modsString, '|'); + FOR_EACH (StringVectCIter, it, modsList) + { + const std::string &name = *it; + const ModInfoCIterator modIt = mods.find(name); + if (modIt == mods.end()) + continue; + const ModInfo *const mod = (*modIt).second; + resman->removeFromSearchPath(dir + "/" + mod->getLocalDir()); + } +} diff --git a/src/gui/windows/updaterwindow.h b/src/gui/windows/updaterwindow.h index 433ab82ad..bddd3ef9e 100644 --- a/src/gui/windows/updaterwindow.h +++ b/src/gui/windows/updaterwindow.h @@ -51,6 +51,7 @@ struct UpdateFile final hash(), type(), desc(), + group(), required(false) { } @@ -58,6 +59,7 @@ struct UpdateFile final std::string hash; std::string type; std::string desc; + std::string group; bool required; }; @@ -151,6 +153,14 @@ class UpdaterWindow final : public Window, static unsigned long getFileHash(const std::string &filePath); + static void loadMods(const std::string &dir, + const ResourceManager *const resman, + const std::vector<UpdateFile> &updateFiles); + + static void loadDirMods(const std::string &dir); + + static void unloadMods(const std::string &dir); + private: void download(); |