Changed: Move user landmarks from icfg to own xml file
--HG-- branch : develop
This commit is contained in:
parent
4cbed9f957
commit
ac68a37f1b
8 changed files with 411 additions and 27 deletions
|
@ -488,8 +488,177 @@ CContinent *CContinentManager::get(const std::string &contName)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CContinentManager::serialUserLandMarks(NLMISC::IStream &f)
|
void CContinentManager::writeTo(xmlNodePtr node) const
|
||||||
{
|
{
|
||||||
|
// <landmarks continent="bagne" type="user" />
|
||||||
|
// <landmarks continent="tryker" type="user">
|
||||||
|
// <landmark type="0" x="0" y="0" title="landmark title"/>
|
||||||
|
// ...
|
||||||
|
// </landmarks>
|
||||||
|
for(TContinents::const_iterator it = _Continents.begin(); it != _Continents.end(); ++it)
|
||||||
|
{
|
||||||
|
std::string name = it->first;
|
||||||
|
xmlNodePtr contNode = xmlNewChild(node, NULL, (const xmlChar*)"landmarks", NULL);
|
||||||
|
xmlSetProp(contNode, (const xmlChar*)"continent", (const xmlChar*)name.c_str());
|
||||||
|
xmlSetProp(contNode, (const xmlChar*)"type", (const xmlChar*)"user");
|
||||||
|
|
||||||
|
if (it->second && it->second->UserLandMarks.size() > 0)
|
||||||
|
{
|
||||||
|
for(uint i = 0; i< it->second->UserLandMarks.size(); ++i)
|
||||||
|
{
|
||||||
|
const CUserLandMark& lm = it->second->UserLandMarks[i];
|
||||||
|
|
||||||
|
xmlNodePtr lmNode = xmlNewChild(contNode, NULL, (const xmlChar*)"landmark", NULL);
|
||||||
|
xmlSetProp(lmNode, (const xmlChar*)"type", (const xmlChar*)toString("%d", (uint32)lm.Type).c_str());
|
||||||
|
xmlSetProp(lmNode, (const xmlChar*)"x", (const xmlChar*)toString("%.2f", lm.Pos.x).c_str());
|
||||||
|
xmlSetProp(lmNode, (const xmlChar*)"y", (const xmlChar*)toString("%.2f", lm.Pos.y).c_str());
|
||||||
|
|
||||||
|
// sanitize ascii control chars
|
||||||
|
// libxml will encode other special chars itself
|
||||||
|
std::string title = lm.Title.toUtf8();
|
||||||
|
for(uint i = 0; i< title.size(); i++)
|
||||||
|
{
|
||||||
|
if (title[i] < ' ' && title[i] != '\n' && title[i] != '\t')
|
||||||
|
{
|
||||||
|
title[i] = '?';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
xmlSetProp(lmNode, (const xmlChar*)"title", (const xmlChar*)title.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CContinentManager::readFrom(xmlNodePtr node)
|
||||||
|
{
|
||||||
|
CXMLAutoPtr prop;
|
||||||
|
|
||||||
|
// <landmarks continent="bagne" type="user">
|
||||||
|
// <landmark type="0" x="0" y="0" title="landmark title" />
|
||||||
|
// ...
|
||||||
|
// </landmarks>
|
||||||
|
std::string continent;
|
||||||
|
prop = xmlGetProp(node, (xmlChar*)"continent");
|
||||||
|
if (!prop)
|
||||||
|
{
|
||||||
|
nlwarning("Ignore landmarks group 'continent' attribute.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
continent = (const char*)prop;
|
||||||
|
|
||||||
|
TContinents::iterator itContinent = _Continents.find(continent);
|
||||||
|
if (itContinent == _Continents.end() || !itContinent->second)
|
||||||
|
{
|
||||||
|
nlwarning("Ignore landmarks group with unknown 'continent' '%s'", continent.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string lmtype;
|
||||||
|
prop = xmlGetProp(node, (xmlChar*)"type");
|
||||||
|
if (!prop)
|
||||||
|
{
|
||||||
|
nlwarning("Ignore landmarks group without 'type' attribute.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
lmtype = toLower((const char*)prop);
|
||||||
|
if (lmtype != "user")
|
||||||
|
{
|
||||||
|
nlwarning("Ignore landmarks group with type '%s', expected 'user'.", lmtype.c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node->children;
|
||||||
|
while(node)
|
||||||
|
{
|
||||||
|
if (stricmp((char*)node->name, "landmark") != 0)
|
||||||
|
{
|
||||||
|
nlwarning("Ignore invalid node '%s' under landmarks group", (const char*)node->name);
|
||||||
|
|
||||||
|
node = node->next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool add = true;
|
||||||
|
CUserLandMark lm;
|
||||||
|
|
||||||
|
prop = xmlGetProp(node, (xmlChar*)"type");
|
||||||
|
if (prop)
|
||||||
|
fromString((const char*)prop, lm.Type);
|
||||||
|
else
|
||||||
|
nlwarning("Using default value for landmark type");
|
||||||
|
|
||||||
|
prop = xmlGetProp(node, (xmlChar*)"x");
|
||||||
|
if (prop)
|
||||||
|
{
|
||||||
|
fromString((const char*)prop, lm.Pos.x);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning("Landmark missing 'x' attribute");
|
||||||
|
add = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
prop = xmlGetProp(node, (xmlChar*)"y");
|
||||||
|
if (prop)
|
||||||
|
{
|
||||||
|
fromString((const char*)prop, lm.Pos.y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning("Landmark missing 'y' attribute");
|
||||||
|
add = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
prop = xmlGetProp(node, (xmlChar*)"title");
|
||||||
|
if (prop)
|
||||||
|
{
|
||||||
|
lm.Title.fromUtf8((const char*)prop);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning("Landmark missing 'title' attribute");
|
||||||
|
add = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (add)
|
||||||
|
{
|
||||||
|
// before adding, check for duplicate
|
||||||
|
// duplicates might be read from .icfg before .xml is read
|
||||||
|
add = true;
|
||||||
|
for(uint i = 0; i< itContinent->second->UserLandMarks.size(); ++i)
|
||||||
|
{
|
||||||
|
const CUserLandMark& test = itContinent->second->UserLandMarks[i];
|
||||||
|
uint xdiff = abs(test.Pos.x - lm.Pos.x) * 100;
|
||||||
|
uint ydiff = abs(test.Pos.y - lm.Pos.y) * 100;
|
||||||
|
if (xdiff == 0 && ydiff == 0)
|
||||||
|
{
|
||||||
|
add = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (add)
|
||||||
|
{
|
||||||
|
itContinent->second->UserLandMarks.push_back(lm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning("Ignore landmark with duplicate pos (continent:'%s', x:%.2f, y:%.2f, type:%d, title:'%s')", continent.c_str(), lm.Pos.x, lm.Pos.y, (uint8)lm.Type, lm.Title.toUtf8().c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning("Landmark not added");
|
||||||
|
}
|
||||||
|
|
||||||
|
node = node->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32 CContinentManager::serialUserLandMarks(NLMISC::IStream &f)
|
||||||
|
{
|
||||||
|
uint32 totalLandmarks = 0;
|
||||||
|
|
||||||
f.serialVersion(1);
|
f.serialVersion(1);
|
||||||
if (!f.isReading())
|
if (!f.isReading())
|
||||||
{
|
{
|
||||||
|
@ -502,6 +671,7 @@ void CContinentManager::serialUserLandMarks(NLMISC::IStream &f)
|
||||||
if (it->second)
|
if (it->second)
|
||||||
{
|
{
|
||||||
f.serialCont(it->second->UserLandMarks);
|
f.serialCont(it->second->UserLandMarks);
|
||||||
|
totalLandmarks += it->second->UserLandMarks.size();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -522,6 +692,7 @@ void CContinentManager::serialUserLandMarks(NLMISC::IStream &f)
|
||||||
if (it != _Continents.end() && it->second)
|
if (it != _Continents.end() && it->second)
|
||||||
{
|
{
|
||||||
f.serialCont(it->second->UserLandMarks);
|
f.serialCont(it->second->UserLandMarks);
|
||||||
|
totalLandmarks += it->second->UserLandMarks.size();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -530,6 +701,8 @@ void CContinentManager::serialUserLandMarks(NLMISC::IStream &f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return totalLandmarks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -109,8 +109,13 @@ public:
|
||||||
|
|
||||||
const std::string &getCurrentContinentSelectName();
|
const std::string &getCurrentContinentSelectName();
|
||||||
|
|
||||||
|
// load / save all user landmarks in xml format
|
||||||
|
void writeTo(xmlNodePtr node) const;
|
||||||
|
void readFrom(xmlNodePtr node);
|
||||||
|
|
||||||
// load / saves all user landMarks
|
// load / saves all user landMarks
|
||||||
void serialUserLandMarks(NLMISC::IStream &f);
|
// \return number of landmarks loaded or saved
|
||||||
|
uint32 serialUserLandMarks(NLMISC::IStream &f);
|
||||||
|
|
||||||
// rebuild visible landmarks on current map
|
// rebuild visible landmarks on current map
|
||||||
void updateUserLandMarks();
|
void updateUserLandMarks();
|
||||||
|
|
|
@ -1298,6 +1298,7 @@ void CFarTP::sendReady()
|
||||||
pIM->loadKeys();
|
pIM->loadKeys();
|
||||||
CWidgetManager::getInstance()->hideAllWindows();
|
CWidgetManager::getInstance()->hideAllWindows();
|
||||||
pIM->loadInterfaceConfig();
|
pIM->loadInterfaceConfig();
|
||||||
|
pIM->loadLandmarks();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
|
@ -2715,7 +2715,7 @@ CCtrlButton *CGroupMap::addUserLandMark(const NLMISC::CVector2f &pos, const ucst
|
||||||
addLandMark(_UserLM, pos, title, getUserLandMarkOptions((uint32)_CurContinent->UserLandMarks.size() - 1));
|
addLandMark(_UserLM, pos, title, getUserLandMarkOptions((uint32)_CurContinent->UserLandMarks.size() - 1));
|
||||||
|
|
||||||
// Save the config file each time a user landmark is created
|
// Save the config file each time a user landmark is created
|
||||||
CInterfaceManager::getInstance()->saveConfig();
|
CInterfaceManager::getInstance()->saveLandmarks();
|
||||||
|
|
||||||
return _UserLM.back();
|
return _UserLM.back();
|
||||||
}
|
}
|
||||||
|
|
|
@ -458,6 +458,7 @@ CInterfaceManager::CInterfaceManager()
|
||||||
parser->addModule( "command", new CCommandParser() );
|
parser->addModule( "command", new CCommandParser() );
|
||||||
parser->addModule( "key", new CKeyParser() );
|
parser->addModule( "key", new CKeyParser() );
|
||||||
parser->addModule( "macro", new CMacroParser() );
|
parser->addModule( "macro", new CMacroParser() );
|
||||||
|
parser->addModule( "landmarks", new CLandmarkParser() );
|
||||||
parser->setCacheUIParsing( ClientCfg.CacheUIParsing );
|
parser->setCacheUIParsing( ClientCfg.CacheUIParsing );
|
||||||
|
|
||||||
CViewRenderer::setDriver( Driver );
|
CViewRenderer::setDriver( Driver );
|
||||||
|
@ -982,6 +983,9 @@ void CInterfaceManager::initInGame()
|
||||||
// Interface config
|
// Interface config
|
||||||
loadInterfaceConfig();
|
loadInterfaceConfig();
|
||||||
|
|
||||||
|
//Load user landmarks
|
||||||
|
loadLandmarks();
|
||||||
|
|
||||||
// Must do extra init for people interaction after load
|
// Must do extra init for people interaction after load
|
||||||
PeopleInterraction.initAfterLoad();
|
PeopleInterraction.initAfterLoad();
|
||||||
|
|
||||||
|
@ -1217,6 +1221,22 @@ void CInterfaceManager::configureQuitDialogBox()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
//
|
||||||
|
std::string CInterfaceManager::getSaveFileName(const std::string &module, const std::string &ext, bool useShared) const
|
||||||
|
{
|
||||||
|
string filename = "save/" + module + "_" + PlayerSelectedFileName + "." + ext;
|
||||||
|
if (useShared && !CFile::fileExists(filename))
|
||||||
|
{
|
||||||
|
string sharedFile = "save/shared_" + module + "." + ext;
|
||||||
|
if (CFile::fileExists(sharedFile))
|
||||||
|
{
|
||||||
|
return sharedFile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return filename;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
void CInterfaceManager::loadKeys()
|
void CInterfaceManager::loadKeys()
|
||||||
{
|
{
|
||||||
|
@ -1228,26 +1248,19 @@ void CInterfaceManager::loadKeys()
|
||||||
vector<string> xmlFilesToParse;
|
vector<string> xmlFilesToParse;
|
||||||
|
|
||||||
// Does the keys file exist ?
|
// Does the keys file exist ?
|
||||||
string userKeyFileName = "save/keys_"+PlayerSelectedFileName+".xml";
|
string userKeyFileName = getSaveFileName("keys", "xml");
|
||||||
if (CFile::fileExists(userKeyFileName) && CFile::getFileSize(userKeyFileName) > 0)
|
if (CFile::fileExists(userKeyFileName) && CFile::getFileSize(userKeyFileName) > 0)
|
||||||
{
|
{
|
||||||
// Load the user key file
|
// Load the user key file
|
||||||
xmlFilesToParse.push_back (userKeyFileName);
|
xmlFilesToParse.push_back (userKeyFileName);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
string filename = "save/shared_keys.xml";
|
|
||||||
if(CFile::fileExists(filename) && CFile::getFileSize(filename) > 0)
|
|
||||||
{
|
|
||||||
xmlFilesToParse.push_back(filename);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Load the default key (but don't replace existings bounds, see keys.xml "key_def_no_replace")
|
// Load the default key (but don't replace existings bounds, see keys.xml "key_def_no_replace")
|
||||||
xmlFilesToParse.push_back ("keys.xml");
|
xmlFilesToParse.push_back ("keys.xml");
|
||||||
|
|
||||||
if (!parseInterface (xmlFilesToParse, true))
|
if (!parseInterface (xmlFilesToParse, true))
|
||||||
{
|
{
|
||||||
badXMLParseMessageBox();
|
createFileBackup("Error loading keys", userKeyFileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
_KeysLoaded = true;
|
_KeysLoaded = true;
|
||||||
|
@ -1260,10 +1273,7 @@ void CInterfaceManager::loadInterfaceConfig()
|
||||||
if (ClientCfg.R2EDEnabled) // in R2ED mode the CEditor class deals with it
|
if (ClientCfg.R2EDEnabled) // in R2ED mode the CEditor class deals with it
|
||||||
return;
|
return;
|
||||||
|
|
||||||
string filename = "save/interface_" + PlayerSelectedFileName + ".icfg";
|
string filename = getSaveFileName("interface", "icfg");
|
||||||
if (!CFile::fileExists(filename))
|
|
||||||
filename = "save/shared_interface.icfg";
|
|
||||||
|
|
||||||
loadConfig(filename); // Invalidate coords of changed groups
|
loadConfig(filename); // Invalidate coords of changed groups
|
||||||
|
|
||||||
_ConfigLoaded = true;
|
_ConfigLoaded = true;
|
||||||
|
@ -1680,6 +1690,7 @@ bool CInterfaceManager::loadConfig (const string &filename)
|
||||||
uint32 nNbMode;
|
uint32 nNbMode;
|
||||||
CInterfaceConfig ic;
|
CInterfaceConfig ic;
|
||||||
bool lastInGameScreenResLoaded= false;
|
bool lastInGameScreenResLoaded= false;
|
||||||
|
uint32 nbLandmarks = 0;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
sint ver = f.serialVersion(ICFG_STREAM_VERSION);
|
sint ver = f.serialVersion(ICFG_STREAM_VERSION);
|
||||||
|
@ -1775,7 +1786,7 @@ bool CInterfaceManager::loadConfig (const string &filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Load user landmarks
|
// Load user landmarks
|
||||||
ContinentMngr.serialUserLandMarks(f);
|
nbLandmarks = ContinentMngr.serialUserLandMarks(f);
|
||||||
|
|
||||||
CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp( "SERVER:INTERFACES:NB_BONUS_LANDMARKS" );
|
CCDBNodeLeaf *pNL = NLGUI::CDBManager::getInstance()->getDbProp( "SERVER:INTERFACES:NB_BONUS_LANDMARKS" );
|
||||||
if ( pNL )
|
if ( pNL )
|
||||||
|
@ -1809,10 +1820,9 @@ bool CInterfaceManager::loadConfig (const string &filename)
|
||||||
catch(const NLMISC::EStream &)
|
catch(const NLMISC::EStream &)
|
||||||
{
|
{
|
||||||
f.close();
|
f.close();
|
||||||
string sFileNameBackup = sFileName+"backup";
|
|
||||||
if (CFile::fileExists(sFileNameBackup))
|
createFileBackup("Config loading failed", sFileName);
|
||||||
CFile::deleteFile(sFileNameBackup);
|
|
||||||
CFile::moveFile(sFileNameBackup, sFileName);
|
|
||||||
nlwarning("Config loading failed : restore default");
|
nlwarning("Config loading failed : restore default");
|
||||||
vector<string> v;
|
vector<string> v;
|
||||||
if (!ClientCfg.R2EDEnabled)
|
if (!ClientCfg.R2EDEnabled)
|
||||||
|
@ -1823,6 +1833,35 @@ bool CInterfaceManager::loadConfig (const string &filename)
|
||||||
}
|
}
|
||||||
f.close();
|
f.close();
|
||||||
|
|
||||||
|
if (nbLandmarks > 0)
|
||||||
|
{
|
||||||
|
// use copy for backup so on save proper shared/player icfg file is used
|
||||||
|
createFileBackup("Landmarks will be migrated to xml", sFileName, true);
|
||||||
|
|
||||||
|
// if icfg is interface_player.icfg, then landmarks must also be loaded/saved to player file
|
||||||
|
if (nlstricmp(sFileName.substr(0, 12), "save/shared_") != 0)
|
||||||
|
{
|
||||||
|
string lmfile = getSaveFileName("landmarks", "xml", false);
|
||||||
|
if (!CFile::fileExists(lmfile))
|
||||||
|
{
|
||||||
|
// create placeholder player landmarks file so saveLandmarks will use it
|
||||||
|
// even if shared landmarks file exists
|
||||||
|
COFile f;
|
||||||
|
if (f.open(lmfile, false, false, true))
|
||||||
|
{
|
||||||
|
std::string xml;
|
||||||
|
xml = "<?xml version=\"1.0\"?>\n<interface_config />";
|
||||||
|
f.serialBuffer((uint8 *)xml.c_str(), xml.size());
|
||||||
|
f.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge .icfg landmarks with landmarks.xml
|
||||||
|
loadLandmarks();
|
||||||
|
saveLandmarks();
|
||||||
|
}
|
||||||
|
|
||||||
// *** If saved resolution is different from the current one setuped, must fix positions in _Modes
|
// *** If saved resolution is different from the current one setuped, must fix positions in _Modes
|
||||||
if(lastInGameScreenResLoaded)
|
if(lastInGameScreenResLoaded)
|
||||||
{
|
{
|
||||||
|
@ -1877,6 +1916,88 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool CInterfaceManager::saveLandmarks(bool verbose) const
|
||||||
|
{
|
||||||
|
bool ret = true;
|
||||||
|
|
||||||
|
if (!ClientCfg.R2EDEnabled)
|
||||||
|
{
|
||||||
|
uint8 currMode = getMode();
|
||||||
|
|
||||||
|
string filename = getSaveFileName("landmarks", "xml");
|
||||||
|
if (verbose) CInterfaceManager::getInstance()->displaySystemInfo("Saving " + filename);
|
||||||
|
ret = saveLandmarks(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CInterfaceManager::loadLandmarks()
|
||||||
|
{
|
||||||
|
// Does the keys file exist ?
|
||||||
|
string filename = getSaveFileName("landmarks", "xml");
|
||||||
|
|
||||||
|
CIFile f;
|
||||||
|
string sFileName;
|
||||||
|
sFileName = NLMISC::CPath::lookup (filename, false);
|
||||||
|
if (sFileName.empty() || !f.open(sFileName))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
bool ret = false;
|
||||||
|
vector<string> xmlFilesToParse;
|
||||||
|
xmlFilesToParse.push_back (filename);
|
||||||
|
|
||||||
|
//ContinentMngr.serialUserLandMarks(node);
|
||||||
|
if (!parseInterface (xmlFilesToParse, true))
|
||||||
|
{
|
||||||
|
f.close();
|
||||||
|
|
||||||
|
createFileBackup("Error while loading landmarks", filename);
|
||||||
|
|
||||||
|
ret = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CInterfaceManager::saveLandmarks(const std::string &filename) const
|
||||||
|
{
|
||||||
|
nlinfo( "Saving landmarks : %s", filename.c_str() );
|
||||||
|
|
||||||
|
bool ret = false;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
COFile f;
|
||||||
|
|
||||||
|
// using temporary file, so no f.close() unless its a success
|
||||||
|
if (f.open(filename, false, false, true))
|
||||||
|
{
|
||||||
|
COXml xmlStream;
|
||||||
|
xmlStream.init (&f);
|
||||||
|
|
||||||
|
xmlDocPtr doc = xmlStream.getDocument ();
|
||||||
|
xmlNodePtr node = xmlNewDocNode(doc, NULL, (const xmlChar*)"interface_config", NULL);
|
||||||
|
xmlDocSetRootElement (doc, node);
|
||||||
|
|
||||||
|
ContinentMngr.writeTo(node);
|
||||||
|
|
||||||
|
// Flush the stream
|
||||||
|
xmlStream.flush();
|
||||||
|
|
||||||
|
// Close the stream
|
||||||
|
f.close ();
|
||||||
|
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const Exception &e)
|
||||||
|
{
|
||||||
|
nlwarning ("Error while writing the file %s : %s.", filename.c_str(), e.what ());
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
bool CInterfaceManager::saveConfig (bool verbose)
|
bool CInterfaceManager::saveConfig (bool verbose)
|
||||||
|
@ -1887,9 +2008,7 @@ bool CInterfaceManager::saveConfig (bool verbose)
|
||||||
{
|
{
|
||||||
uint8 currMode = getMode();
|
uint8 currMode = getMode();
|
||||||
|
|
||||||
string filename = "save/interface_" + PlayerSelectedFileName + ".icfg";
|
string filename = getSaveFileName("interface", "icfg");
|
||||||
if (!CFile::fileExists(filename) && CFile::fileExists("save/shared_interface.icfg"))
|
|
||||||
filename = "save/shared_interface.icfg";
|
|
||||||
|
|
||||||
if (verbose) CInterfaceManager::getInstance()->displaySystemInfo("Saving " + filename);
|
if (verbose) CInterfaceManager::getInstance()->displaySystemInfo("Saving " + filename);
|
||||||
ret = saveConfig(filename);
|
ret = saveConfig(filename);
|
||||||
|
@ -2004,8 +2123,13 @@ bool CInterfaceManager::saveConfig (const string &filename)
|
||||||
CTaskBarManager *pTBM= CTaskBarManager::getInstance();
|
CTaskBarManager *pTBM= CTaskBarManager::getInstance();
|
||||||
pTBM->serial(f);
|
pTBM->serial(f);
|
||||||
|
|
||||||
// Save user landmarks
|
//ContinentMngr.serialUserLandMarks(f);
|
||||||
ContinentMngr.serialUserLandMarks(f);
|
// empty landmarks block for compatibility
|
||||||
|
{
|
||||||
|
f.serialVersion(1);
|
||||||
|
uint32 numCont = 0;
|
||||||
|
f.serial(numCont);
|
||||||
|
}
|
||||||
|
|
||||||
// Info Windows position.
|
// Info Windows position.
|
||||||
CInterfaceHelp::serialInfoWindows(f);
|
CInterfaceHelp::serialInfoWindows(f);
|
||||||
|
@ -2972,6 +3096,7 @@ class CAHSaveUI : public IActionHandler
|
||||||
{
|
{
|
||||||
CInterfaceManager::getInstance()->saveKeys(true);
|
CInterfaceManager::getInstance()->saveKeys(true);
|
||||||
CInterfaceManager::getInstance()->saveConfig(true);
|
CInterfaceManager::getInstance()->saveConfig(true);
|
||||||
|
CInterfaceManager::getInstance()->saveLandmarks(true);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
REGISTER_ACTION_HANDLER (CAHSaveUI, "save_ui");
|
REGISTER_ACTION_HANDLER (CAHSaveUI, "save_ui");
|
||||||
|
@ -4135,3 +4260,40 @@ bool CInterfaceManager::parseTokens(ucstring& ucstr)
|
||||||
ucstr = str;
|
ucstr = str;
|
||||||
return true;;
|
return true;;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string CInterfaceManager::getNextBackupName(std::string filename)
|
||||||
|
{
|
||||||
|
std::string ts = getTimestampHuman("%Y-%m-%d");
|
||||||
|
|
||||||
|
if (!ts.empty())
|
||||||
|
{
|
||||||
|
std::string::size_type pos = filename.find_last_of('.');
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
filename = filename + "_" + ts + "_";
|
||||||
|
else
|
||||||
|
filename = filename.substr(0, pos) + "_" + ts + "_" + filename.substr(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
// filename_YYYY-MM-DD_000.ext
|
||||||
|
return CFile::findNewFile(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CInterfaceManager::createFileBackup(const std::string &message, const std::string &filename, bool useCopy)
|
||||||
|
{
|
||||||
|
std::string backupName = getNextBackupName(filename);
|
||||||
|
nlwarning("%s: '%s'.", message.c_str(), filename.c_str());
|
||||||
|
if (!backupName.empty())
|
||||||
|
{
|
||||||
|
if (useCopy)
|
||||||
|
{
|
||||||
|
nlwarning("Backup copy saved as '%s'", backupName.c_str());
|
||||||
|
CFile::copyFile(backupName, filename);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nlwarning("File renamed to '%s'", backupName.c_str());
|
||||||
|
CFile::moveFile(backupName, filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -203,6 +203,19 @@ public:
|
||||||
/// Load a set of xml files
|
/// Load a set of xml files
|
||||||
bool parseInterface (const std::vector<std::string> &xmlFileNames, bool reload, bool isFilename = true);
|
bool parseInterface (const std::vector<std::string> &xmlFileNames, bool reload, bool isFilename = true);
|
||||||
|
|
||||||
|
/// return new filename that can be used to backup original file
|
||||||
|
std::string getNextBackupName(std::string filename);
|
||||||
|
/// copy/rename filename for backup and show error in log
|
||||||
|
void createFileBackup(const std::string &message, const std::string &filename, bool useCopy = false);
|
||||||
|
|
||||||
|
/// select player/shared file name from 'save' folder'
|
||||||
|
std::string getSaveFileName(const std::string &module, const std::string &ext, bool useShared = true) const;
|
||||||
|
|
||||||
|
/// Load / save user landmarks in .xml format
|
||||||
|
bool loadLandmarks ();
|
||||||
|
bool saveLandmarks (bool verbose = false) const;
|
||||||
|
bool saveLandmarks (const std::string &filename) const;
|
||||||
|
|
||||||
// Load/Save position, size, etc.. of windows
|
// Load/Save position, size, etc.. of windows
|
||||||
bool loadConfig (const std::string &filename);
|
bool loadConfig (const std::string &filename);
|
||||||
// Save config to default location, if verbose is true, display message in game sysinfo
|
// Save config to default location, if verbose is true, display message in game sysinfo
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include "../commands.h"
|
#include "../commands.h"
|
||||||
#include "interface_3d_scene.h"
|
#include "interface_3d_scene.h"
|
||||||
#include "nel/misc/i_xml.h"
|
#include "nel/misc/i_xml.h"
|
||||||
|
#include "../continent_manager.h"
|
||||||
|
|
||||||
using namespace NLMISC;
|
using namespace NLMISC;
|
||||||
|
|
||||||
|
@ -31,6 +32,8 @@ using namespace NLMISC;
|
||||||
#include "../client_cfg.h"
|
#include "../client_cfg.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern CContinentManager ContinentMngr;
|
||||||
|
|
||||||
CIF3DSceneParser::CIF3DSceneParser()
|
CIF3DSceneParser::CIF3DSceneParser()
|
||||||
{
|
{
|
||||||
parsingStage |= ( Resolved | GroupChildren );
|
parsingStage |= ( Resolved | GroupChildren );
|
||||||
|
@ -529,3 +532,21 @@ bool CMacroParser::parse( xmlNodePtr cur, NLGUI::CInterfaceGroup *parentGroup )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CLandmarkParser::CLandmarkParser()
|
||||||
|
{
|
||||||
|
parsingStage |= Unresolved;
|
||||||
|
}
|
||||||
|
|
||||||
|
CLandmarkParser::~CLandmarkParser()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CLandmarkParser::parse( xmlNodePtr cur, NLGUI::CInterfaceGroup *parentGroup )
|
||||||
|
{
|
||||||
|
H_AUTO(parseLandmark)
|
||||||
|
|
||||||
|
ContinentMngr.readFrom(cur);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,4 +76,13 @@ public:
|
||||||
bool parse( xmlNodePtr cur, CInterfaceGroup *parentGroup );
|
bool parse( xmlNodePtr cur, CInterfaceGroup *parentGroup );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class CLandmarkParser : public CInterfaceParser::IParserModule
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
CLandmarkParser();
|
||||||
|
~CLandmarkParser();
|
||||||
|
|
||||||
|
bool parse( xmlNodePtr cur, CInterfaceGroup *parentGroup );
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue