void Channel::UpdateChannelInDB() const { if (m_IsSaved) { std::ostringstream banlist; BannedList::const_iterator iter; for (iter = banned.begin(); iter != banned.end(); ++iter) banlist << (*iter) << " "; std::string banListStr = banlist.str(); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SET_CHANNEL); stmt->setBool(0, m_announce); stmt->setBool(1, m_ownership); stmt->setString(2, m_password); stmt->setString(3, banListStr); stmt->setString(4, m_name); stmt->setUInt32(5, m_Team); CharacterDatabase.Execute(stmt); sLog->outDebug(LOG_FILTER_CHATSYS,"Channel(%s) updated in database", m_name.c_str()); } }
void GmTicket::SaveToDB(SQLTransaction& trans) const { uint8 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_ADD_GM_TICKET); stmt->setUInt32( index, _id); stmt->setUInt32(++index, GUID_LOPART(_playerGuid)); stmt->setString(++index, _playerName); stmt->setString(++index, _message); stmt->setUInt32(++index, uint32(_createTime)); stmt->setUInt16(++index, _mapId); stmt->setFloat (++index, _posX); stmt->setFloat (++index, _posY); stmt->setFloat (++index, _posZ); stmt->setUInt32(++index, uint32(_lastModifiedTime)); stmt->setInt32 (++index, GUID_LOPART(_closedBy)); stmt->setUInt32(++index, GUID_LOPART(_assignedTo)); stmt->setString(++index, _comment); stmt->setBool (++index, _completed); stmt->setUInt8 (++index, uint8(_escalatedStatus)); stmt->setBool (++index, _viewed); CharacterDatabase.ExecuteOrAppend(trans, stmt); }
void Channel::UpdateChannelInDB() const { if (_IsSaved) { std::ostringstream banlist; BannedContainer::const_iterator iter; for (iter = bannedStore.begin(); iter != bannedStore.end(); ++iter) banlist << (*iter) << ' '; std::string banListStr = banlist.str(); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHANNEL); stmt->setBool(0, _announce); stmt->setBool(1, _ownership); stmt->setString(2, _password); stmt->setString(3, banListStr); stmt->setString(4, _name); stmt->setUInt32(5, _Team); CharacterDatabase.Execute(stmt); TC_LOG_DEBUG("chat.system", "Channel(%s) updated in database", _name.c_str()); } }
static bool HandleAccountLockCommand(ChatHandler* handler, char const* args) { if (!*args) { handler->SendSysMessage(LANG_USE_BOL); handler->SetSentErrorMessage(true); return false; } std::string param = (char*)args; if (!param.empty()) { PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_ACCOUNT_LOCK); if (param == "on") { stmt->setBool(0, true); // locked handler->PSendSysMessage(LANG_COMMAND_ACCLOCKLOCKED); } else if (param == "off") { stmt->setBool(0, false); // unlocked handler->PSendSysMessage(LANG_COMMAND_ACCLOCKUNLOCKED); } stmt->setUInt32(1, handler->GetSession()->GetAccountId()); LoginDatabase.Execute(stmt); return true; } handler->SendSysMessage(LANG_USE_BOL); handler->SetSentErrorMessage(true); return false; }
void GmTicket::SaveToDB(SQLTransaction& trans) const { uint8 idx = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_TICKET); stmt->setUInt32(idx, _id); stmt->setUInt64(++idx, _playerGuid.GetCounter()); stmt->setString(++idx, _description); stmt->setUInt32(++idx, _createTime); stmt->setUInt16(++idx, _mapId); stmt->setFloat(++idx, _pos.x); stmt->setFloat(++idx, _pos.y); stmt->setFloat(++idx, _pos.z); stmt->setUInt32(++idx, uint32(_lastModifiedTime)); stmt->setInt64(++idx, int64(_closedBy.GetCounter())); stmt->setUInt64(++idx, _assignedTo.GetCounter()); stmt->setString(++idx, _comment); stmt->setString(++idx, _response); stmt->setBool(++idx, _completed); stmt->setUInt8(++idx, uint8(_assignedToStatus)); stmt->setUInt8(++idx, _openedByGmStatus); stmt->setBool(++idx, _needMoreHelp); CharacterDatabase.ExecuteOrAppend(trans, stmt); }
bool Battlenet::Session::HandleRiskFingerprintModule(BitStream* dataStream, ServerPacket** response) { Authentication::LogonResponse* logonResponse = new Authentication::LogonResponse(); if (dataStream->Read<uint8>(8) == 1) { logonResponse->AccountId = _accountId; logonResponse->GameAccountName = _gameAccountName; logonResponse->GameAccountFlags = GAMEACCOUNT_FLAG_PROPASS_LOCK; PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BNET_FAILED_LOGINS); stmt->setUInt32(0, _accountId); if (PreparedQueryResult failedLoginsResult = LoginDatabase.Query(stmt)) logonResponse->FailedLogins = (*failedLoginsResult)[0].GetUInt32(); SQLTransaction trans = LoginDatabase.BeginTransaction(); stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_LAST_LOGIN_INFO); stmt->setString(0, GetRemoteIpAddress().to_string()); stmt->setUInt8(1, GetLocaleByName(_locale)); stmt->setString(2, _os); stmt->setUInt32(3, _accountId); trans->Append(stmt); stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_SESSION_KEY); stmt->setString(0, K.AsHexStr()); stmt->setBool(1, true); stmt->setUInt32(2, _accountId); trans->Append(stmt); LoginDatabase.CommitTransaction(trans); _authed = true; sSessionMgr.AddSession(this); } else logonResponse->SetAuthResult(AUTH_BAD_VERSION_HASH); ReplaceResponse(response, logonResponse); return true; }
uint32 CharacterBooster::_PrepareMail(SQLTransaction& trans, std::string const& subject, std::string const& body) const { PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_MAIL); uint32 mailId = sObjectMgr->GenerateMailID(); stmt->setUInt32(0, mailId); stmt->setUInt8(1, MAIL_NORMAL); stmt->setInt8(2, MAIL_STATIONERY_DEFAULT); stmt->setUInt16(3, 0); stmt->setUInt32(4, m_charBoostInfo.lowGuid); stmt->setUInt32(5, m_charBoostInfo.lowGuid); stmt->setString(6, subject); stmt->setString(7, body); stmt->setBool(8, true); stmt->setUInt64(9, time(NULL) + 180 * DAY); stmt->setUInt64(10, time(NULL)); stmt->setUInt32(11, 0); stmt->setUInt32(12, 0); stmt->setUInt8(13, 0); trans->Append(stmt); return mailId; }
void MailDraft::SendMailTo(SQLTransaction& trans, MailReceiver const& receiver, MailSender const& sender, MailCheckMask checked, uint32 deliver_delay) { Player* pReceiver = receiver.GetPlayer(); // can be NULL Player* pSender = sObjectMgr->GetPlayerByLowGUID(sender.GetSenderId()); if (pReceiver) prepareItems(pReceiver, trans); // generate mail template items uint32 mailId = sObjectMgr->GenerateMailID(); time_t deliver_time = time(NULL) + deliver_delay; //expire time if COD 3 days, if no COD 30 days, if auction sale pending 1 hour uint32 expire_delay; // auction mail without any items and money if (sender.GetMailMessageType() == MAIL_AUCTION && m_items.empty() && !m_money) expire_delay = sWorld->getIntConfig(CONFIG_MAIL_DELIVERY_DELAY); // mail from battlemaster (rewardmarks) should last only one day else if (sender.GetMailMessageType() == MAIL_CREATURE && sBattlegroundMgr->GetBattleMasterBG(sender.GetSenderId()) != BATTLEGROUND_TYPE_NONE) expire_delay = DAY; // default case: expire time if COD 3 days, if no COD 30 days (or 90 days if sender is a game master) else { if (m_COD) expire_delay = 3 * DAY; else expire_delay = pSender && pSender->IsGameMaster() ? 90 * DAY : 30 * DAY; } time_t expire_time = deliver_time + expire_delay; // Add to DB uint8 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_MAIL); stmt->setUInt32( index, mailId); stmt->setUInt8 (++index, uint8(sender.GetMailMessageType())); stmt->setInt8 (++index, int8(sender.GetStationery())); stmt->setUInt16(++index, GetMailTemplateId()); stmt->setUInt32(++index, sender.GetSenderId()); stmt->setUInt32(++index, receiver.GetPlayerGUIDLow()); stmt->setString(++index, GetSubject()); stmt->setString(++index, GetBody()); stmt->setBool (++index, !m_items.empty()); stmt->setUInt64(++index, uint64(expire_time)); stmt->setUInt64(++index, uint64(deliver_time)); stmt->setUInt32(++index, m_money); stmt->setUInt32(++index, m_COD); stmt->setUInt8 (++index, uint8(checked)); trans->Append(stmt); for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter) { Item* pItem = mailItemIter->second; stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_MAIL_ITEM); stmt->setUInt32(0, mailId); stmt->setUInt32(1, pItem->GetGUID().GetCounter()); stmt->setUInt32(2, receiver.GetPlayerGUIDLow()); trans->Append(stmt); } // For online receiver update in game mail status and data if (pReceiver) { pReceiver->AddNewMailDeliverTime(deliver_time); if (pReceiver->IsMailsLoaded()) { Mail* m = new Mail; m->messageID = mailId; m->mailTemplateId = GetMailTemplateId(); m->subject = GetSubject(); m->body = GetBody(); m->money = GetMoney(); m->COD = GetCOD(); for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter) { Item* item = mailItemIter->second; m->AddItem(item->GetGUID().GetCounter(), item->GetEntry()); } m->messageType = sender.GetMailMessageType(); m->stationery = sender.GetStationery(); m->sender = sender.GetSenderId(); m->receiver = receiver.GetPlayerGUIDLow(); m->expire_time = expire_time; m->deliver_time = deliver_time; m->checked = checked; m->state = MAIL_STATE_UNCHANGED; pReceiver->AddMail(m); // to insert new mail to beginning of maillist if (!m_items.empty()) { for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter) pReceiver->AddMItem(mailItemIter->second); } } else if (!m_items.empty()) { SQLTransaction temp = SQLTransaction(NULL); deleteIncludedItems(temp); } } else if (!m_items.empty()) { SQLTransaction temp = SQLTransaction(NULL); deleteIncludedItems(temp); } }
bool Battlenet::Session::HandleResumeModule(BitStream* dataStream, ServerPacket** response) { if (dataStream->Read<uint8>(8) != 1) { Authentication::ResumeResponse* resumeResponse = new Authentication::ResumeResponse(); resumeResponse->SetAuthResult(AUTH_CORRUPTED_MODULE); ReplaceResponse(response, resumeResponse); return false; } static uint8 const ResumeClient = 0; static uint8 const ResumeServer = 1; std::unique_ptr<uint8[]> clientChallenge = dataStream->ReadBytes(16); std::unique_ptr<uint8[]> clientProof = dataStream->ReadBytes(32); std::unique_ptr<uint8[]> serverChallenge = _reconnectProof.AsByteArray(16); std::unique_ptr<uint8[]> sessionKey = K.AsByteArray(64); HmacSha256 clientPart(64, sessionKey.get()); clientPart.UpdateData(&ResumeClient, 1); clientPart.UpdateData(clientChallenge.get(), 16); clientPart.UpdateData(serverChallenge.get(), 16); clientPart.Finalize(); HmacSha256 serverPart(64, sessionKey.get()); serverPart.UpdateData(&ResumeServer, 1); serverPart.UpdateData(serverChallenge.get(), 16); serverPart.UpdateData(clientChallenge.get(), 16); serverPart.Finalize(); uint8 newSessionKey[64]; memcpy(&newSessionKey[0], clientPart.GetDigest(), clientPart.GetLength()); memcpy(&newSessionKey[32], serverPart.GetDigest(), serverPart.GetLength()); K.SetBinary(newSessionKey, 64); HmacSha256 proof(64, newSessionKey); proof.UpdateData(&ResumeClient, 1); proof.UpdateData(clientChallenge.get(), 16); proof.UpdateData(serverChallenge.get(), 16); proof.Finalize(); if (memcmp(proof.GetDigest(), clientProof.get(), serverPart.GetLength())) { PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_FAILED_LOGINS); stmt->setString(0, _accountInfo->Login); LoginDatabase.Execute(stmt); TC_LOG_DEBUG("session", "[Battlenet::Resume] %s attempted to reconnect with invalid password!", GetClientInfo().c_str()); Authentication::ResumeResponse* resumeResponse = new Authentication::ResumeResponse(); resumeResponse->SetAuthResult(AUTH_UNKNOWN_ACCOUNT); ReplaceResponse(response, resumeResponse); return false; } PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BNET_SESSION_KEY); stmt->setString(0, K.AsHexStr()); stmt->setBool(1, true); stmt->setUInt32(2, _accountInfo->Id); LoginDatabase.Execute(stmt); HmacSha256 serverProof(64, newSessionKey); serverProof.UpdateData(&ResumeServer, 1); serverProof.UpdateData(serverChallenge.get(), 16); serverProof.UpdateData(clientChallenge.get(), 16); serverProof.Finalize(); ModuleInfo* resume = sModuleMgr->CreateModule(_os, "Resume"); BitStream resumeData; uint8 state = 2; resumeData.WriteBytes(&state, 1); resumeData.WriteBytes(serverProof.GetDigest(), serverProof.GetLength()); resume->DataSize = resumeData.GetSize(); resume->Data = new uint8[resume->DataSize]; memcpy(resume->Data, resumeData.GetBuffer(), resume->DataSize); Authentication::ResumeResponse* resumeResponse = new Authentication::ResumeResponse(); resumeResponse->Modules.push_back(resume); ReplaceResponse(response, resumeResponse); _authed = true; sSessionMgr.AddSession(this); return true; }
InstancePlayerBind* InstanceSaveManager::PlayerBindToInstance(uint32 guidLow, InstanceSave* save, bool permanent, Player* player /*= NULL*/) { InstancePlayerBind& bind = playerBindStorage[guidLow]->m[save->GetDifficulty()][save->GetMapId()]; ASSERT(!bind.perm || permanent); // ensure there's no changing permanent to temporary, this can be done only by unbinding if (bind.save) { if (save != bind.save || permanent != bind.perm) { bind.extended = false; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_INSTANCE); stmt->setUInt32(0, save->GetInstanceId()); stmt->setBool(1, permanent); stmt->setUInt32(2, guidLow); stmt->setUInt32(3, bind.save->GetInstanceId()); CharacterDatabase.Execute(stmt); } } else { // pussywizard: protect against mysql thread races! // pussywizard: CHANGED MY MIND! DON'T SLOW DOWN THIS QUERY! HANDLE ONLY DURING LOADING FROM DB! // example: enter instance -> bind -> update old id to new id -> exit -> delete new id // if delete by new id is executed before update, then we end up with shit in db /*SQLTransaction trans = CharacterDatabase.BeginTransaction(); // ensure any shit for that map+difficulty is deleted! PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_INSTANCE_BY_GUID_MAP_DIFF); // DELETE ci FROM character_instance ci JOIN instance i ON ci.instance = i.id WHERE ci.guid = ? AND i.map = ? AND i.difficulty = ? stmt->setUInt32(0, guidLow); stmt->setUInt16(1, uint16(save->GetMapId())); stmt->setUInt8(2, uint8(save->GetDifficulty())); trans->Append(stmt); stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_INSTANCE); stmt->setUInt32(0, guidLow); stmt->setUInt32(1, save->GetInstanceId()); stmt->setBool(2, permanent); trans->Append(stmt); CharacterDatabase.CommitTransaction(trans);*/ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHAR_INSTANCE); stmt->setUInt32(0, guidLow); stmt->setUInt32(1, save->GetInstanceId()); stmt->setBool(2, permanent); CharacterDatabase.Execute(stmt); } if (bind.save != save) { if (bind.save) bind.save->RemovePlayer(guidLow, this); save->AddPlayer(guidLow); } if (permanent) { save->SetCanReset(false); if (!bind.perm && player) // temporary changing to permanent player->GetSession()->SendCalendarRaidLockout(save, true); } bind.save = save; bind.perm = permanent; if (player) sScriptMgr->OnPlayerBindToInstance(player, save->GetDifficulty(), save->GetMapId(), permanent); return &bind; }
void GmTicket::SaveToDB(SQLTransaction& trans) const { // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 // ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed uint8 index = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_TICKET); stmt->setUInt32( index, _id); stmt->setUInt32(++index, GUID_LOPART(_playerGuid)); stmt->setString(++index, _playerName); stmt->setString(++index, _message); stmt->setUInt32(++index, uint32(_createTime)); stmt->setUInt16(++index, _mapId); stmt->setFloat (++index, _posX); stmt->setFloat (++index, _posY); stmt->setFloat (++index, _posZ); stmt->setUInt32(++index, uint32(_lastModifiedTime)); stmt->setInt32 (++index, GUID_LOPART(_closedBy)); stmt->setUInt32(++index, GUID_LOPART(_assignedTo)); stmt->setString(++index, _comment); stmt->setBool (++index, _completed); stmt->setUInt8 (++index, uint8(_escalatedStatus)); stmt->setBool (++index, _viewed); char dest[20]; std::string ticketstatusmsg; uint32 countOpen = sTicketMgr->GetOpenTicketCount(); if (countOpen > 1) { ticketstatusmsg += "PRIVMSG ChanServ TOPIC #wowticket "; ticketstatusmsg += "\x03"; ticketstatusmsg += "4 "; sprintf(dest, "%d", countOpen); ticketstatusmsg += dest; ticketstatusmsg += " Tickets sind noch offen!"; sIRC.SendIRC(ticketstatusmsg); } else if (countOpen == 1) { ticketstatusmsg += "PRIVMSG ChanServ TOPIC #wowticket "; ticketstatusmsg += "\x03"; ticketstatusmsg += "4 "; ticketstatusmsg += "1 Ticket ist noch offen!"; sIRC.SendIRC(ticketstatusmsg); } else if (countOpen == 0) { ticketstatusmsg += "PRIVMSG ChanServ TOPIC #wowticket "; ticketstatusmsg += "\x03"; ticketstatusmsg += "4"; ticketstatusmsg += "Es sind keine Tickets mehr offen!"; sIRC.SendIRC(ticketstatusmsg); } std::string infomsg; if (GUID_LOPART(_closedBy)) { infomsg += "PRIVMSG #wowticket "; infomsg += "\x03"; infomsg += "4Ticket mit ID "; sprintf(dest, "%d", _id); infomsg += dest; infomsg += " von Player "; infomsg += _playerName; infomsg += " (GUID: "; sprintf(dest, "%d", GUID_LOPART(_playerGuid)); infomsg += dest; infomsg += ") wurde von Player-GUID: "; sprintf(dest, "%d", GUID_LOPART(_closedBy)); infomsg += dest; infomsg += " geschlossen!"; sIRC.SendIRC(infomsg); } else { infomsg += "PRIVMSG #wowticket "; infomsg += "\x03"; infomsg += "4Player: "; infomsg += _playerName; infomsg += ", Player GUID: "; sprintf(dest, "%d", GUID_LOPART(_playerGuid)); infomsg += dest; infomsg += ", Ticket GUID: "; sprintf(dest, "%d", _id); infomsg += dest; infomsg += "; "; infomsg += "\x03"; infomsg += "1Map: "; sprintf(dest, "%d", _mapId); infomsg += dest; infomsg += "; X: "; sprintf(dest, "%f", _posX); infomsg += dest; infomsg += "; Y: "; sprintf(dest, "%f", _posY); infomsg += dest; infomsg += "; Z: "; sprintf(dest, "%f", _posZ); infomsg += dest; infomsg += "; GM GUID: "; sprintf(dest, "%d", GUID_LOPART(_assignedTo)); infomsg += dest; infomsg += "; CLOSED: "; sprintf(dest, "%d", GUID_LOPART(_closedBy)); infomsg += dest; sIRC.SendIRC(infomsg); if (_message.length() > 220) { std::string msgpart1; std::string msg1; msgpart1.insert(0, _message, 0, 220); msg1 += "PRIVMSG #wowticket "; msg1 += msgpart1; std::replace( msg1.begin(), msg1.end(), '\n', ' '); sIRC.SendIRC(msg1); std::string msgpart2; std::string msg2; msgpart2.insert(0, _message, 220, _message.length() - 220); msg2 += "PRIVMSG #wowticket "; msg2 += msgpart2; std::replace( msg2.begin(), msg2.end(), '\n', ' '); sIRC.SendIRC(msg2); } else { std::string msgpart1; std::string msg1; msgpart1.insert(0, _message, 0, _message.length()); msg1 += "PRIVMSG #wowticket "; msg1 += msgpart1; std::replace( msg1.begin(), msg1.end(), '\n', ' '); sIRC.SendIRC(msg1); } } CharacterDatabase.ExecuteOrAppend(trans, stmt); }
void Garrison::SaveToDB(SQLTransaction trans) { DeleteFromDB(_owner->GetGUID().GetCounter(), trans); PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); stmt->setUInt32(1, _siteLevel->ID); stmt->setUInt32(2, _followerActivationsRemainingToday); trans->Append(stmt); for (uint32 building : _knownBuildings) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON_BLUEPRINTS); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); stmt->setUInt32(1, building); trans->Append(stmt); } for (auto const& p : _plots) { Plot const& plot = p.second; if (plot.BuildingInfo.PacketInfo) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON_BUILDINGS); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); stmt->setUInt32(1, plot.BuildingInfo.PacketInfo->GarrPlotInstanceID); stmt->setUInt32(2, plot.BuildingInfo.PacketInfo->GarrBuildingID); stmt->setUInt64(3, plot.BuildingInfo.PacketInfo->TimeBuilt); stmt->setBool(4, plot.BuildingInfo.PacketInfo->Active); trans->Append(stmt); } } for (auto const& p : _followers) { Follower const& follower = p.second; uint8 index = 0; stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON_FOLLOWERS); stmt->setUInt64(index++, follower.PacketInfo.DbID); stmt->setUInt64(index++, _owner->GetGUID().GetCounter()); stmt->setUInt32(index++, follower.PacketInfo.GarrFollowerID); stmt->setUInt32(index++, follower.PacketInfo.Quality); stmt->setUInt32(index++, follower.PacketInfo.FollowerLevel); stmt->setUInt32(index++, follower.PacketInfo.ItemLevelWeapon); stmt->setUInt32(index++, follower.PacketInfo.ItemLevelArmor); stmt->setUInt32(index++, follower.PacketInfo.Xp); stmt->setUInt32(index++, follower.PacketInfo.CurrentBuildingID); stmt->setUInt32(index++, follower.PacketInfo.CurrentMissionID); stmt->setUInt32(index++, follower.PacketInfo.FollowerStatus); trans->Append(stmt); uint8 slot = 0; for (GarrAbilityEntry const* ability : follower.PacketInfo.AbilityID) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON_FOLLOWER_ABILITIES); stmt->setUInt64(0, follower.PacketInfo.DbID); stmt->setUInt32(1, ability->ID); stmt->setUInt8(2, slot++); trans->Append(stmt); } } }
void BattlePetMgr::SaveToDB(SQLTransaction& trans) { PreparedStatement* stmt = nullptr; for (auto itr = _pets.begin(); itr != _pets.end();) { switch (itr->second.SaveInfo) { case BATTLE_PET_NEW: stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BATTLE_PETS); stmt->setUInt64(0, itr->first); stmt->setUInt32(1, _owner->GetBattlenetAccountId()); stmt->setUInt32(2, itr->second.PacketInfo.Species); stmt->setUInt16(3, itr->second.PacketInfo.Breed); stmt->setUInt16(4, itr->second.PacketInfo.Level); stmt->setUInt16(5, itr->second.PacketInfo.Exp); stmt->setUInt32(6, itr->second.PacketInfo.Health); stmt->setUInt8(7, itr->second.PacketInfo.Quality); stmt->setUInt16(8, itr->second.PacketInfo.Flags); stmt->setString(9, itr->second.PacketInfo.Name); trans->Append(stmt); itr->second.SaveInfo = BATTLE_PET_UNCHANGED; ++itr; break; case BATTLE_PET_CHANGED: stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_BATTLE_PETS); stmt->setUInt16(0, itr->second.PacketInfo.Level); stmt->setUInt16(1, itr->second.PacketInfo.Exp); stmt->setUInt32(2, itr->second.PacketInfo.Health); stmt->setUInt8(3, itr->second.PacketInfo.Quality); stmt->setUInt16(4, itr->second.PacketInfo.Flags); stmt->setString(5, itr->second.PacketInfo.Name); stmt->setUInt32(6, _owner->GetBattlenetAccountId()); stmt->setUInt64(7, itr->first); trans->Append(stmt); itr->second.SaveInfo = BATTLE_PET_UNCHANGED; ++itr; break; case BATTLE_PET_REMOVED: stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BATTLE_PETS); stmt->setUInt32(0, _owner->GetBattlenetAccountId()); stmt->setUInt64(1, itr->first); trans->Append(stmt); itr = _pets.erase(itr); break; default: ++itr; break; } } stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_BATTLE_PET_SLOTS); stmt->setUInt32(0, _owner->GetBattlenetAccountId()); trans->Append(stmt); for (WorldPackets::BattlePet::BattlePetSlot const& slot : _slots) { stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_BATTLE_PET_SLOTS); stmt->setUInt8(0, slot.Index); stmt->setUInt32(1, _owner->GetBattlenetAccountId()); stmt->setUInt64(2, slot.Pet.Guid.GetCounter()); stmt->setBool(3, slot.Locked); trans->Append(stmt); } }