From b3a967db604703fa716eb4954e0e8bca44a2c2f5 Mon Sep 17 00:00:00 2001 From: Petric Date: Sat, 24 Oct 2020 09:42:35 +0100 Subject: [PATCH] fix(Core): fixed crash happening when clearing old mail (#3604) --- src/server/game/Entities/Player/Player.cpp | 11 +++++++---- src/server/game/Entities/Player/Player.h | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 80baf23e0..2d8789f0a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3696,7 +3696,6 @@ void Player::UpdateNextMailTimeAndUnreads() void Player::AddNewMailDeliverTime(time_t deliver_time) { - ++totalMailCount; sWorld->UpdateGlobalPlayerMails(GetGUIDLow(), totalMailCount, false); if (deliver_time <= time(nullptr)) // ready now { @@ -19065,7 +19064,7 @@ void Player::_LoadMailInit(PreparedQueryResult resultMailCount, PreparedQueryRes //Set count for all mails used to display correct size later one if (resultMailCount) { - totalMailCount = uint64((*resultMailCount)[0].GetUInt64()); + totalMailCount = uint32((*resultMailCount)[0].GetUInt32()); sWorld->UpdateGlobalPlayerMails(GetGUIDLow(), totalMailCount, false); } @@ -19097,10 +19096,12 @@ void Player::_LoadMail() } //This should in theory always be < 100 - for (PlayerMails::iterator itr = GetMailBegin(); itr != GetMailEnd(); ++itr) + for (PlayerMails::iterator itr = GetMailBegin(); itr != GetMailEnd();) { - delete *itr; + Mail* m = *itr; m_mailCache.erase(itr); + if(m) + delete m; itr = GetMailBegin(); } @@ -20093,6 +20094,8 @@ void Player::_SaveMail(SQLTransaction& trans) stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_MAIL_ITEM_BY_ID); stmt->setUInt32(0, m->messageID); trans->Append(stmt); + if (totalMailCount > 0) + totalMailCount--; } } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index cf53bcbb6..b520da25f 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1669,7 +1669,7 @@ public: void RemoveMail(uint32 id); - void AddMail(Mail* mail) { m_mailCache.push_front(mail); }// for call from WorldSession::SendMailTo + void AddMail(Mail* mail) { totalMailCount++; m_mailCache.push_front(mail); }// for call from WorldSession::SendMailTo uint32 GetMailSize() { return totalMailCount; } uint32 GetMailCacheSize() { return m_mailCache.size();} Mail* GetMail(uint32 id); @@ -1682,7 +1682,7 @@ public: /*********************************************************/ uint8 unReadMails; - uint64 totalMailCount; + uint32 totalMailCount; time_t m_nextMailDelivereTime; typedef std::unordered_map ItemMap;