From ec6d64b9c6875112e711a9812f7cbab2acfb07f4 Mon Sep 17 00:00:00 2001 From: Shauren Date: Wed, 15 Apr 2020 21:58:02 +0200 Subject: [PATCH] Core/Player: Wait for correct transaction on character creation --- src/server/game/Entities/Player/Player.cpp | 12 +++++++++--- src/server/game/Entities/Player/Player.h | 1 + src/server/game/Handlers/CharacterHandler.cpp | 7 ++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c1290dde422..08c297ed196 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -19625,6 +19625,15 @@ bool Player::_LoadHomeBind(PreparedQueryResult result) /*********************************************************/ void Player::SaveToDB(bool create /*=false*/) +{ + CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); + + SaveToDB(trans, create); + + CharacterDatabase.CommitTransaction(trans); +} + +void Player::SaveToDB(CharacterDatabaseTransaction trans, bool create /* = false */) { // delay auto save at any saves (manual, in code, or autosave) m_nextSave = sWorld->getIntConfig(CONFIG_INTERVAL_SAVE); @@ -19645,7 +19654,6 @@ void Player::SaveToDB(bool create /*=false*/) if (!create) sScriptMgr->OnPlayerSave(this); - CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction(); CharacterDatabasePreparedStatement* stmt = nullptr; uint8 index = 0; @@ -19972,8 +19980,6 @@ void Player::SaveToDB(bool create /*=false*/) if (m_session->isLogingOut() || !sWorld->getBoolConfig(CONFIG_STATS_SAVE_ONLY_ON_LOGOUT)) _SaveStats(trans); - CharacterDatabase.CommitTransaction(trans); - // save pet (hunter pet level and experience and all type pets health/mana). if (Pet* pet = GetPet()) pet->SavePetToDB(PET_SAVE_CURRENT_STATE); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index c0b793f4deb..0ac26fadbca 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1497,6 +1497,7 @@ class TC_GAME_API Player : public Unit, public GridObject /*********************************************************/ void SaveToDB(bool create = false); + void SaveToDB(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 fcfc14a2d87..183a70e8168 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -618,8 +618,9 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) newChar->SetAtLoginFlag(AT_LOGIN_FIRST); // First login - // Player created, save it now - newChar->SaveToDB(true); + CharacterDatabaseTransaction characterTransaction = CharacterDatabase.BeginTransaction(); + // Player created, save it now + newChar->SaveToDB(characterTransaction, true); createInfo->CharCount += 1; LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction(); @@ -637,7 +638,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) LoginDatabase.CommitTransaction(trans); - AddTransactionCallback(LoginDatabase.AsyncCommitTransaction(trans)).AfterComplete([this, newChar = std::move(newChar)](bool success) + AddTransactionCallback(CharacterDatabase.AsyncCommitTransaction(characterTransaction)).AfterComplete([this, newChar = std::move(newChar)](bool success) { if (success) {