void saveItemsBranch(DOMNode* node, CTibiaTree* parent, xercesc::DOMDocument *doc) { int size = parent->children.size(); for (int i = 0; i < size; i++) { CTibiaTree* child = parent->children[i]; if (child->HasChildren() && child->data->GetType() == TT_BRANCH_NODE) { CTibiaTreeBranchData* data = (CTibiaTreeBranchData*)(child->data); DOMElement* itemElem = doc->createElement(XMLString::transcode("branch")); itemElem->setAttribute(XMLString::transcode("name"), XMLString::transcode(data->GetName())); node->appendChild(itemElem); saveItemsBranch(itemElem, child, doc); } else if (!child->HasChildren() && child->data->GetType() == TT_ITEM_NODE) { CTibiaTreeItemData* data = (CTibiaTreeItemData*)(child->data); char buf[512]; int id = data->GetId(); int type = data->GetItemType(); bool looted = data->IsLooted(); DOMElement* itemElem = doc->createElement(XMLString::transcode("item")); itemElem->setAttribute(XMLString::transcode("name"), XMLString::transcode(data->GetName())); sprintf(buf, "0x%x", id); itemElem->setAttribute(XMLString::transcode("id"), XMLString::transcode(buf)); sprintf(buf, "%d", looted ? 1 : 0); itemElem->setAttribute(XMLString::transcode("looted"), XMLString::transcode(buf)); sprintf(buf, "%d", type); itemElem->setAttribute(XMLString::transcode("type"), XMLString::transcode(buf)); node->appendChild(itemElem); } } }
void CTibiaItem::saveItemLists() { if (!xmlInitialised) { XMLPlatformUtils::Initialize(); xmlInitialised = 1; } XercesDOMParser *parser = new XercesDOMParser(); try { //int itemNr; char pathBuf[2048]; sprintf(pathBuf, "%s\\data\\tibiaauto-items.xml", CInstallPath::getInstallPath().c_str()); DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("Core")); xercesc::DOMDocument *doc = impl->createDocument(0, XMLString::transcode("item-definitions"), 0); doc->createComment((const unsigned short *)"<!-- Tibia Items for Tibia -->"); DOMElement *root = doc->getDocumentElement(); //ITEMS DOMNode *itemsNode = doc->createElement(XMLString::transcode("items")); root->appendChild(itemsNode); //recursively save data structure to XML saveItemsBranch(itemsNode, itemTree, doc); //FOOD DOMNode *foodNode = doc->createElement(XMLString::transcode("foods")); root->appendChild(foodNode); { int size = foodList.GetCount(); for (int i = 0; i < size; i++) { char buf[512]; DOMElement* itemElem = doc->createElement(XMLString::transcode("item")); foodNode->appendChild(itemElem); char* name = foodList.GetTextAtIndex(i); int id = foodList.GetValueAtIndex(i); int time = foodList.GetExtraInfoAtIndex(i); sprintf(buf, "0x%x", id); itemElem->setAttribute(XMLString::transcode("id"), XMLString::transcode(buf)); itemElem->setAttribute(XMLString::transcode("name"), XMLString::transcode(name)); sprintf(buf, "%d", time); itemElem->setAttribute(XMLString::transcode("time"), XMLString::transcode(buf)); } } //CONSTS /* never any need to save constants anymore DOMNode *constsNode = doc->createElement(XMLString::transcode("consts")); root->appendChild(constsNode); int size = constCodeList.GetCount(); for (int i=0;i<size;i++){ char buf[512]; DOMElement* itemElem = doc->createElement(XMLString::transcode("const")); constsNode->appendChild(itemElem); char* code=constCodeList.GetTextAtIndex(i); int value=constCodeList.GetValueAtIndex(i); sprintf(buf, "0x%x", value); itemElem->setAttribute(XMLString::transcode("value"), XMLString::transcode(buf)); itemElem->setAttribute(XMLString::transcode("code"), XMLString::transcode(code)); } */ XMLCh tempStr[100]; XMLString::transcode("LS", tempStr, 99); impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMLSSerializer* theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer(); DOMConfiguration* dc = theSerializer->getDomConfig(); if (dc->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true)) dc->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true); XMLFormatTarget *outFile = new LocalFileFormatTarget(pathBuf); DOMLSOutput *lsOut = ((DOMImplementationLS*)impl)->createLSOutput(); lsOut->setByteStream(outFile); theSerializer->write(doc, lsOut); theSerializer->release(); lsOut->release(); delete outFile; } catch (...) { AfxMessageBox("Unable to save item definitions!"); } delete parser; }
void CTibiaItem::saveItemLists() { if (!xmlInitialised) { XMLPlatformUtils::Initialize(); xmlInitialised = 1; } char installPath[1024] = { '\0' }; unsigned long installPathLen = 1023; HKEY hkey = NULL; if (!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "Software\\Tibia Auto\\", 0, KEY_READ, &hkey)) { RegQueryValueEx(hkey, TEXT("Install_Dir"), NULL, NULL, (unsigned char *)installPath, &installPathLen); RegCloseKey(hkey); } if (!strlen(installPath)) { AfxMessageBox("ERROR! Unable to read TA install directory! Please reinstall!"); PostQuitMessage(-1); return; } XercesDOMParser *parser = new XercesDOMParser(); try { //int itemNr; char pathBuf[2048]; sprintf(pathBuf, "%s\\data\\tibiaauto-items.xml", installPath); DOMImplementation* impl = DOMImplementationRegistry::getDOMImplementation(XMLString::transcode("Core")); xercesc::DOMDocument *doc = impl->createDocument(0, XMLString::transcode("item-definitions"), 0); doc->createComment((const unsigned short *)"<!-- Tibia Items for Tibia -->"); DOMElement *root = doc->getDocumentElement(); //ITEMS DOMNode *itemsNode = doc->createElement(XMLString::transcode("items")); root->appendChild(itemsNode); //recursively save data structure to XML saveItemsBranch(itemsNode, itemTree, doc); //FOOD DOMNode *foodNode = doc->createElement(XMLString::transcode("foods")); root->appendChild(foodNode); { int size = foodList.GetCount(); for (int i = 0; i < size; i++) { char buf[512]; DOMElement* itemElem = doc->createElement(XMLString::transcode("item")); foodNode->appendChild(itemElem); char* name = foodList.GetTextAtIndex(i); int id = foodList.GetValueAtIndex(i); int time = foodList.GetExtraInfoAtIndex(i); sprintf(buf, "0x%x", id); itemElem->setAttribute(XMLString::transcode("id"), XMLString::transcode(buf)); itemElem->setAttribute(XMLString::transcode("name"), XMLString::transcode(name)); sprintf(buf, "%d", time); itemElem->setAttribute(XMLString::transcode("time"), XMLString::transcode(buf)); } } //CONSTS /* never any need to save constants anymore DOMNode *constsNode = doc->createElement(XMLString::transcode("consts")); root->appendChild(constsNode); int size = constCodeList.GetCount(); for (int i=0;i<size;i++){ char buf[512]; DOMElement* itemElem = doc->createElement(XMLString::transcode("const")); constsNode->appendChild(itemElem); char* code=constCodeList.GetTextAtIndex(i); int value=constCodeList.GetValueAtIndex(i); sprintf(buf, "0x%x", value); itemElem->setAttribute(XMLString::transcode("value"), XMLString::transcode(buf)); itemElem->setAttribute(XMLString::transcode("code"), XMLString::transcode(code)); } */ XMLCh tempStr[100]; XMLString::transcode("LS", tempStr, 99); impl = DOMImplementationRegistry::getDOMImplementation(tempStr); DOMLSSerializer* theSerializer = ((DOMImplementationLS*)impl)->createLSSerializer(); DOMConfiguration* dc = theSerializer->getDomConfig(); if (dc->canSetParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true)) dc->setParameter(XMLUni::fgDOMWRTFormatPrettyPrint, true); XMLFormatTarget *outFile = new LocalFileFormatTarget(pathBuf); DOMLSOutput *lsOut = ((DOMImplementationLS*)impl)->createLSOutput(); lsOut->setByteStream(outFile); theSerializer->write(doc, lsOut); theSerializer->release(); lsOut->release(); delete outFile; } catch (...) { AfxMessageBox("Unable to save item definitions!"); } delete parser; }