Core/Player: Wait for correct transaction on character creation

This commit is contained in:
Shauren
2020-04-15 12:30:06 +02:00
parent b8966561e3
commit 01c68b2aa2
3 changed files with 20 additions and 11 deletions

View File

@@ -20170,6 +20170,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);

View File

@@ -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;

View File

@@ -748,12 +748,13 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
newChar->SetAtLoginFlag(AT_LOGIN_FIRST); // First login
// Player created, save it now
newChar->SaveToDB(true);
createInfo->CharCount += 1;
CharacterDatabaseTransaction characterTransaction = CharacterDatabase.BeginTransaction();
LoginDatabaseTransaction trans = LoginDatabase.BeginTransaction();
// Player created, save it now
newChar->SaveToDB(trans, characterTransaction, true);
createInfo->CharCount += 1;
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)
{