diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 11 |
3 files changed, 19 insertions, 10 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 77ba1a75518..9a3e2c2fb07 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -20171,6 +20171,17 @@ bool Player::_LoadHomeBind(PreparedQueryResult result) void Player::SaveToDB(bool create /*=false*/) { + CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); + LoginDatabaseTransaction loginTransaction = LoginDatabase.BeginTransaction(); + + SaveToDB(loginTransaction, trans, create); + + CharacterDatabase.CommitTransaction(trans); + LoginDatabase.CommitTransaction(loginTransaction); +} + +void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDatabaseTransaction trans, bool create /* = false */) +{ // delay auto save at any saves (manual, in code, or autosave) m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); @@ -20190,7 +20201,6 @@ void Player::SaveToDB(bool create /*=false*/) if (!create) sScriptMgr->OnPlayerSave(this); - CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); CharacterDatabasePreparedStatement* stmt = nullptr; uint8 index = 0; @@ -20540,10 +20550,7 @@ void Player::SaveToDB(bool create /*=false*/) if (m_session->isLogingOut() || !sWorld->getBoolConfig(CONFIG_STATS_SAVE_ONLY_ON_LOGOUT)) _SaveStats(trans); - CharacterDatabase.CommitTransaction(trans); - // TODO: Move this out - LoginDatabaseTransaction loginTransaction = LoginDatabase.BeginTransaction(); GetSession()->GetCollectionMgr()->SaveAccountToys(loginTransaction); GetSession()->GetBattlePetMgr()->SaveToDB(loginTransaction); GetSession()->GetCollectionMgr()->SaveAccountHeirlooms(loginTransaction); @@ -20566,8 +20573,6 @@ void Player::SaveToDB(bool create /*=false*/) loginStmt->setUInt32(6, time(nullptr)); loginTransaction->Append(loginStmt); - LoginDatabase.CommitTransaction(loginTransaction); - // save pet (hunter pet level and experience and all type pets health/mana). if (Pet* pet = GetPet()) pet->SavePetToDB(PET_SAVE_AS_CURRENT); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 895fbcea9f9..def458b8510 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1468,6 +1468,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> /*********************************************************/ void SaveToDB(bool create = false); + void SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDatabaseTransaction trans, bool create = false); void SaveInventoryAndGoldToDB(CharacterDatabaseTransaction& trans); // fast save function for item/money cheating preventing void SaveGoldToDB(CharacterDatabaseTransaction& trans) const; diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index e49763b2a31..8a33b26cf8b 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -748,12 +748,13 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact newChar->SetAtLoginFlag(AT_LOGIN_FIRST); // First login + CharacterDatabaseTransaction characterTransaction = CharacterDatabase.BeginTransaction(); + LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction(); + // Player created, save it now - newChar->SaveToDB(true); + newChar->SaveToDB(trans, characterTransaction, true); createInfo->CharCount += 1; - LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction(); - LoginDatabasePreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_REALM_CHARACTERS_BY_REALM); stmt->setUInt32(0, GetAccountId()); stmt->setUInt32(1, realm.Id.Realm); @@ -765,7 +766,9 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact stmt->setUInt32(2, realm.Id.Realm); trans->Append(stmt); - AddTransactionCallback(LoginDatabase.AsyncCommitTransaction(trans)).AfterComplete([this, newChar = std::move(newChar)](bool success) + LoginDatabase.CommitTransaction(trans); + + AddTransactionCallback(CharacterDatabase.AsyncCommitTransaction(characterTransaction)).AfterComplete([this, newChar = std::move(newChar)](bool success) { if (success) { |