Real control fix (#5787)
* Allow enabling and disabling mods.
* Re-fix 605599b6f1
This breaks some chars like € in chat.
Instead verify is char is a non control char -> iswcntrl
master
parent
358074b296
commit
90808a4f34
|
@ -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) );
|
||||||
|
|
100
src/mods.cpp
100
src/mods.cpp
|
@ -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";
|
addModsFormConfig(worldmt, gamespec.addon_mods_paths);
|
||||||
Settings worldmt_settings;
|
|
||||||
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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue