Core/Player: Wait for correct transaction on character creation

This commit is contained in:
Shauren
2020-04-15 21:58:02 +02:00
committed by Ovahlord
parent df44e90fe6
commit ec6d64b9c6
3 changed files with 14 additions and 6 deletions

View File

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

View File

@@ -1497,6 +1497,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
/*********************************************************/
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;

View File

@@ -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)
{