Real control fix (#5787)

* Allow enabling and disabling mods.

* Re-fix 605599b6f150b89ba6539c4d088231b326adcb48

This breaks some chars like € in chat.

Instead verify is char is a non control char -> iswcntrl
This commit is contained in:
Loïc Blot 2017-05-20 22:29:15 +02:00 committed by GitHub
parent 358074b296
commit 90808a4f34
4 changed files with 62 additions and 68 deletions

@ -627,7 +627,7 @@ bool GUIChatConsole::OnEvent(const SEvent& event)
bool backwards = event.KeyInput.Shift; bool backwards = event.KeyInput.Shift;
prompt.nickCompletion(names, backwards); prompt.nickCompletion(names, backwards);
return true; return true;
} else if (iswprint(event.KeyInput.Char) && !event.KeyInput.Control) { } else if (!iswcntrl(event.KeyInput.Char) && !event.KeyInput.Control) {
#if defined(__linux__) && (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9) #if defined(__linux__) && (IRRLICHT_VERSION_MAJOR == 1 && IRRLICHT_VERSION_MINOR < 9)
wchar_t wc = L'_'; wchar_t wc = L'_';
mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) ); mbtowc( &wc, (char *) &event.KeyInput.Char, sizeof(event.KeyInput.Char) );

@ -214,6 +214,55 @@ void ModConfiguration::addMods(const std::vector<ModSpec> &new_mods)
} }
} }
void ModConfiguration::addModsFormConfig(const std::string &settings_path, const std::set<std::string> &mods)
{
Settings conf;
std::set<std::string> load_mod_names;
conf.readConfigFile(settings_path.c_str());
std::vector<std::string> names = conf.getNames();
for (std::vector<std::string>::iterator it = names.begin();
it != names.end(); ++it) {
std::string name = *it;
if (name.compare(0,9,"load_mod_")==0 && conf.getBool(name))
load_mod_names.insert(name.substr(9));
}
std::vector<ModSpec> addon_mods;
for (std::set<std::string>::const_iterator i = mods.begin();
i != mods.end(); ++i) {
std::vector<ModSpec> addon_mods_in_path = flattenMods(getModsInPath(*i));
for (std::vector<ModSpec>::const_iterator it = addon_mods_in_path.begin();
it != addon_mods_in_path.end(); ++it) {
const ModSpec& mod = *it;
if (load_mod_names.count(mod.name) != 0)
addon_mods.push_back(mod);
else
conf.setBool("load_mod_" + mod.name, false);
}
}
conf.updateConfigFile(settings_path.c_str());
addMods(addon_mods);
checkConflictsAndDeps();
// complain about mods declared to be loaded, but not found
for (std::vector<ModSpec>::iterator it = addon_mods.begin();
it != addon_mods.end(); ++it)
load_mod_names.erase((*it).name);
std::vector<ModSpec> UnsatisfiedMods = getUnsatisfiedMods();
for (std::vector<ModSpec>::iterator it = UnsatisfiedMods.begin();
it != UnsatisfiedMods.end(); ++it)
load_mod_names.erase((*it).name);
if (!load_mod_names.empty()) {
errorstream << "The following mods could not be found:";
for (std::set<std::string>::iterator it = load_mod_names.begin();
it != load_mod_names.end(); ++it)
errorstream << " \"" << (*it) << "\"";
errorstream << std::endl;
}
}
void ModConfiguration::checkConflictsAndDeps() void ModConfiguration::checkConflictsAndDeps()
{ {
// report on name conflicts // report on name conflicts
@ -296,53 +345,22 @@ ServerModConfiguration::ServerModConfiguration(const std::string &worldpath):
addModsInPath(gamespec.gamemods_path); addModsInPath(gamespec.gamemods_path);
addModsInPath(worldpath + DIR_DELIM + "worldmods"); addModsInPath(worldpath + DIR_DELIM + "worldmods");
// check world.mt file for mods explicitely declared to be // Load normal mods
// loaded or not by a load_mod_<modname> = ... line.
std::string worldmt = worldpath + DIR_DELIM + "world.mt"; std::string worldmt = worldpath + DIR_DELIM + "world.mt";
Settings worldmt_settings; addModsFormConfig(worldmt, gamespec.addon_mods_paths);
worldmt_settings.readConfigFile(worldmt.c_str());
std::vector<std::string> names = worldmt_settings.getNames();
std::set<std::string> include_mod_names;
for (std::vector<std::string>::const_iterator it = names.begin();
it != names.end(); ++it) {
std::string name = *it;
// for backwards compatibility: exclude only mods which are
// explicitely excluded. if mod is not mentioned at all, it is
// enabled. So by default, all installed mods are enabled.
if (name.compare(0,9,"load_mod_") == 0 &&
worldmt_settings.getBool(name)) {
include_mod_names.insert(name.substr(9));
}
}
// Collect all mods that are also in include_mod_names
std::vector<ModSpec> addon_mods;
for (std::set<std::string>::const_iterator it_path = gamespec.addon_mods_paths.begin();
it_path != gamespec.addon_mods_paths.end(); ++it_path) {
std::vector<ModSpec> addon_mods_in_path = flattenMods(getModsInPath(*it_path));
for (std::vector<ModSpec>::const_iterator it = addon_mods_in_path.begin();
it != addon_mods_in_path.end(); ++it) {
const ModSpec& mod = *it;
if (include_mod_names.count(mod.name) != 0)
addon_mods.push_back(mod);
else
worldmt_settings.setBool("load_mod_" + mod.name, false);
}
}
worldmt_settings.updateConfigFile(worldmt.c_str());
addMods(addon_mods);
checkConflictsAndDeps();
} }
#ifndef SERVER #ifndef SERVER
ClientModConfiguration::ClientModConfiguration(const std::string &path): ClientModConfiguration::ClientModConfiguration(const std::string &path):
ModConfiguration(path) ModConfiguration(path)
{ {
addModsInPath(path); std::set<std::string> paths;
addModsInPath(porting::path_user + DIR_DELIM + "clientmods"); std::string path_user = porting::path_user + DIR_DELIM + "clientmods";
checkConflictsAndDeps(); paths.insert(path);
paths.insert(path_user);
std::string settings_path = path_user + DIR_DELIM + "mods.conf";
addModsFormConfig(settings_path, paths);
} }
#endif #endif

@ -99,6 +99,8 @@ protected:
// adds all mods in the set. // adds all mods in the set.
void addMods(const std::vector<ModSpec> &new_mods); void addMods(const std::vector<ModSpec> &new_mods);
void addModsFormConfig(const std::string &settings_path, const std::set<std::string> &mods);
void checkConflictsAndDeps(); void checkConflictsAndDeps();
private: private:
// move mods from m_unsatisfied_mods to m_sorted_mods // move mods from m_unsatisfied_mods to m_sorted_mods

@ -230,32 +230,6 @@ Server::Server(
modconf.printUnsatisfiedModsError(); modconf.printUnsatisfiedModsError();
} }
Settings worldmt_settings;
std::string worldmt = m_path_world + DIR_DELIM + "world.mt";
worldmt_settings.readConfigFile(worldmt.c_str());
std::vector<std::string> names = worldmt_settings.getNames();
std::set<std::string> load_mod_names;
for(std::vector<std::string>::iterator it = names.begin();
it != names.end(); ++it) {
std::string name = *it;
if(name.compare(0,9,"load_mod_")==0 && worldmt_settings.getBool(name))
load_mod_names.insert(name.substr(9));
}
// complain about mods declared to be loaded, but not found
for(std::vector<ModSpec>::iterator it = m_mods.begin();
it != m_mods.end(); ++it)
load_mod_names.erase((*it).name);
for(std::vector<ModSpec>::iterator it = unsatisfied_mods.begin();
it != unsatisfied_mods.end(); ++it)
load_mod_names.erase((*it).name);
if(!load_mod_names.empty()) {
errorstream << "The following mods could not be found:";
for(std::set<std::string>::iterator it = load_mod_names.begin();
it != load_mod_names.end(); ++it)
errorstream << " \"" << (*it) << "\"";
errorstream << std::endl;
}
//lock environment //lock environment
MutexAutoLock envlock(m_env_mutex); MutexAutoLock envlock(m_env_mutex);