forked from Mirrorlandia_minetest/minetest
Properly handle mod name conflicts
This commit is contained in:
parent
2f4a92d701
commit
6b2023dc3e
18
src/mods.cpp
18
src/mods.cpp
@ -21,8 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||||||
#include <queue>
|
#include <queue>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <map>
|
||||||
#include "filesys.h"
|
#include "filesys.h"
|
||||||
#include "strfnd.h"
|
#include "strfnd.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
// Get a dependency-sorted list of ModSpecs
|
// Get a dependency-sorted list of ModSpecs
|
||||||
core::list<ModSpec> getMods(core::list<std::string> &modspaths)
|
core::list<ModSpec> getMods(core::list<std::string> &modspaths)
|
||||||
@ -31,6 +33,8 @@ core::list<ModSpec> getMods(core::list<std::string> &modspaths)
|
|||||||
std::queue<ModSpec> mods_satisfied;
|
std::queue<ModSpec> mods_satisfied;
|
||||||
core::list<ModSpec> mods_unsorted;
|
core::list<ModSpec> mods_unsorted;
|
||||||
core::list<ModSpec> mods_sorted;
|
core::list<ModSpec> mods_sorted;
|
||||||
|
// name, path: For detecting name conflicts
|
||||||
|
std::map<std::string, std::string> mod_names;
|
||||||
for(core::list<std::string>::Iterator i = modspaths.begin();
|
for(core::list<std::string>::Iterator i = modspaths.begin();
|
||||||
i != modspaths.end(); i++){
|
i != modspaths.end(); i++){
|
||||||
std::string modspath = *i;
|
std::string modspath = *i;
|
||||||
@ -40,6 +44,19 @@ core::list<ModSpec> getMods(core::list<std::string> &modspaths)
|
|||||||
continue;
|
continue;
|
||||||
std::string modname = dirlist[j].name;
|
std::string modname = dirlist[j].name;
|
||||||
std::string modpath = modspath + DIR_DELIM + modname;
|
std::string modpath = modspath + DIR_DELIM + modname;
|
||||||
|
// Detect mod name conflicts
|
||||||
|
{
|
||||||
|
std::map<std::string, std::string>::const_iterator i;
|
||||||
|
i = mod_names.find(modname);
|
||||||
|
if(i != mod_names.end()){
|
||||||
|
std::string s;
|
||||||
|
infostream<<"WARNING: Mod name conflict detected: "
|
||||||
|
<<std::endl
|
||||||
|
<<"Already loaded: "<<i->second<<std::endl
|
||||||
|
<<"Will not load: "<<modpath<<std::endl;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
std::set<std::string> depends;
|
std::set<std::string> depends;
|
||||||
std::ifstream is((modpath+DIR_DELIM+"depends.txt").c_str(),
|
std::ifstream is((modpath+DIR_DELIM+"depends.txt").c_str(),
|
||||||
std::ios_base::binary);
|
std::ios_base::binary);
|
||||||
@ -54,6 +71,7 @@ core::list<ModSpec> getMods(core::list<std::string> &modspaths)
|
|||||||
mods_unsorted.push_back(spec);
|
mods_unsorted.push_back(spec);
|
||||||
if(depends.empty())
|
if(depends.empty())
|
||||||
mods_satisfied.push(spec);
|
mods_satisfied.push(spec);
|
||||||
|
mod_names[modname] = modpath;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Sort by depencencies
|
// Sort by depencencies
|
||||||
|
@ -881,9 +881,9 @@ Server::Server(
|
|||||||
std::string builtinpath = porting::path_data + DIR_DELIM + "builtin.lua";
|
std::string builtinpath = porting::path_data + DIR_DELIM + "builtin.lua";
|
||||||
|
|
||||||
// Add default global mod search path
|
// Add default global mod search path
|
||||||
m_modspaths.push_back(porting::path_data + DIR_DELIM + "mods");
|
m_modspaths.push_front(porting::path_data + DIR_DELIM + "mods");
|
||||||
// Add world mod search path
|
// Add world mod search path
|
||||||
m_modspaths.push_back(mapsavedir + DIR_DELIM + "mods");
|
m_modspaths.push_front(mapsavedir + DIR_DELIM + "mods");
|
||||||
|
|
||||||
// Initialize scripting
|
// Initialize scripting
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user