void Pony::saveInventory() { win.logMsg(QObject::tr("%1 UDP: Saving Inventory for %2 (%3)").arg(LOG_INFO).arg(QString().setNum(netviewId)).arg(owner->name)); QDir playerPath(QDir::currentPath()); playerPath.cd("data"); playerPath.cd("players"); playerPath.mkdir(owner->name.toLatin1()); QFile file(QDir::currentPath()+"/data/players/"+owner->name.toLatin1()+"/inventory.lpd"); if (!file.open(QIODevice::ReadWrite)) { win.logMsg(QObject::tr("%1 UDP: Error Saving Inventory for %2 (%3)").arg(LOG_SEVERE).arg(QString().setNum(netviewId)).arg(owner->name)); return; } QByteArray invData = file.readAll(); // Try to find an existing entry for this pony, if found delete it. Then go at the end. for (int i=0; i<invData.size();) { // Read the name QString entryName = dataToString(invData.mid(i)); int nameSize = entryName.size()+getVUint32Size(invData.mid(i)); //win.logMessage("saveInventory : Reading entry "+entryName); quint8 invSize = invData[i+nameSize+4]; quint8 wornSize = invData[i+nameSize+4+1+invSize*9]; // Serialized sizeof InventoryItem is 9 if (entryName == this->name) // Delete the entry, we'll rewrite it at the end { invData.remove(i,nameSize+4+1+invSize*9+1+wornSize*5); break; } else // Skip this entry i += nameSize+4+1+invSize*9+1+wornSize*5; } // Now add our data at the end of the file QByteArray newEntry = stringToData(this->name); newEntry += uint32ToData(nBits); newEntry += uint8ToData(inv.size()); for (const InventoryItem& item : inv) { newEntry += uint8ToData(item.index); newEntry += uint32ToData(item.id); newEntry += uint32ToData(item.amount); } newEntry += uint8ToData(wornItm.size()); for (const WearableItem& item : wornItm) { newEntry += uint8ToData(item.index); newEntry += uint32ToData(item.id); } invData += newEntry; file.resize(0); file.write(invData); file.close(); }
void Pony::saveQuests() { win.logMessage("UDP: Saving quests for "+QString().setNum(netviewId)+" ("+owner->name+")", udpTag); QDir playerPath(QDir::currentPath()); playerPath.cd("data"); playerPath.cd("players"); playerPath.mkdir(owner->name.toLatin1()); QFile file(QDir::currentPath()+"/data/players/"+owner->name.toLatin1()+"/quests.dat"); if (!file.open(QIODevice::ReadWrite)) { win.logMessage("Error saving quests for "+QString().setNum(netviewId)+" ("+owner->name+")", udpTag); return; } QByteArray questData = file.readAll(); // Try to find an existing entry for this pony, if found delete it. Then go at the end. for (int i=0; i<questData.size();) { // Read the name QString entryName = dataToString(questData.mid(i)); int nameSize = entryName.size()+getVUint32Size(questData.mid(i)); //win.logMessage("saveQuests : Reading entry "+entryName); quint16 entryDataSize = 4 * dataToUint16(questData.mid(i+nameSize)); if (entryName == this->name) // Delete the entry, we'll rewrite it at the end { questData.remove(i,nameSize+entryDataSize+2); break; } else i += nameSize+entryDataSize+2; } // Now add our data at the end of the file QByteArray newEntry = stringToData(this->name); newEntry += (quint8)(quests.size() & 0xFF); newEntry += (quint8)((quests.size() >> 8) & 0xFF); for (const Quest& quest : quests) { newEntry += (quint8)(quest.id & 0xFF); newEntry += (quint8)((quest.id >> 8) & 0xFF); newEntry += (quint8)(quest.state & 0xFF); newEntry += (quint8)((quest.state >> 8) & 0xFF); } questData += newEntry; file.resize(0); file.write(questData); file.close(); }
void Pony::loadQuests() { win.logMessage("UDP: Loading quests for "+QString().setNum(netviewId)+" ("+owner->name+")", udpTag); QDir playerPath(QDir::currentPath()); playerPath.cd("data"); playerPath.cd("players"); playerPath.mkdir(owner->name.toLatin1()); QFile file(QDir::currentPath()+"/data/players/"+owner->name.toLatin1()+"/quests.dat"); if (!file.open(QIODevice::ReadOnly)) { win.logMessage("Error loading quests for "+QString().setNum(netviewId)+" ("+owner->name+")", sysTag); return; } QByteArray questData = file.readAll(); file.close(); // Try to find an existing entry for this pony and load it. for (int i=0; i<questData.size();) { // Read the name QString entryName = dataToString(questData.mid(i)); int nameSize = entryName.size()+getVUint32Size(questData.mid(i)); i+=nameSize; //win.logMessage("loadQuests : Reading entry "+entryName); quint16 nquests = dataToUint16(questData.mid(i)); i+=2; if (entryName == this->name) // Read the entry { for (int j=0; j<nquests; j++) { quint16 questId = dataToUint16(questData.mid(i)); quint16 questState = dataToUint16(questData.mid(i+2)); i+=4; for (Quest& quest : quests) { if (quest.id == questId) { quest.state = questState; break; } } } return; } else i += nquests * 4; } }
void Player::savePonies(Player *player, QList<Pony> ponies) { win.logMessage("UDP: Saving ponies for "+QString().setNum(player->pony.netviewId)+" ("+player->name+")", sysTag); QDir playerPath(QDir::currentPath()); playerPath.cd("data"); playerPath.cd("players"); playerPath.mkdir(player->name.toLatin1()); QFile file(QDir::currentPath()+"/data/players/"+player->name.toLatin1()+"/ponies.dat"); file.open(QIODevice::ReadWrite | QIODevice::Truncate); for (int i=0; i<ponies.size(); i++) { file.write(ponies[i].ponyData); file.write(vectorToData(ponies[i].pos)); file.write(stringToData(ponies[i].sceneName.toLower())); } }
bool Pony::loadInventory() { win.logMsg(QObject::tr("%1 UDP: Loading Inventory for %2 (%3)").arg(LOG_INFO).arg(QString().setNum(netviewId)).arg(owner->name)); QDir playerPath(QDir::currentPath()); playerPath.cd("data"); playerPath.cd("players"); playerPath.mkdir(owner->name.toLatin1()); QFile file(QDir::currentPath()+"/data/players/"+owner->name.toLatin1()+"/inventory.lpd"); if (!file.open(QIODevice::ReadOnly)) { win.logMsg(QObject::tr("%1 UDP: Error Loading Inventory for %2 (%3)").arg(LOG_SEVERE).arg(QString().setNum(netviewId)).arg(owner->name)); return false; } QByteArray invData = file.readAll(); file.close(); // Try to find an existing entry for this pony, if found load it. for (int i=0; i<invData.size();) { // Read the name QString entryName = dataToString(invData.mid(i)); int nameSize = entryName.size()+getVUint32Size(invData.mid(i)); //win.logMessage("loadInventory : Reading entry "+entryName); quint8 invSize = invData[i+nameSize+4]; quint8 wornSize = invData[i+nameSize+4+1+invSize*9]; // Serialized sizeof InventoryItem is 9 if (entryName == this->name) { i += nameSize; nBits = dataToUint32(invData.mid(i)); i+=5; // Skip nBits and invSize inv.clear(); for (int j=0; j<invSize; j++) { InventoryItem item; item.index = invData[i]; i++; item.id = dataToUint32(invData.mid(i)); i+=4; item.amount = dataToUint32(invData.mid(i)); i+=4; inv.append(item); } i++; // Skip wornSize wornItm.clear(); wornSlots = 0; for (int j=0; j<wornSize; j++) { WearableItem item; item.index = invData[i]; i++; item.id = dataToUint32(invData.mid(i)); i+=4; wornItm.append(item); wornSlots |= loe.wearablePositionsMap[item.id]; } return true; } else // Skip this entry i += nameSize+4+1+invSize*9+1+wornSize*5; } return false; // Entry not found }