From 1663045da6651c83785a694303a1cf4bf0dc6ee0 Mon Sep 17 00:00:00 2001 From: sudlud Date: Sun, 2 Jun 2024 14:29:54 +0200 Subject: [PATCH] =?UTF-8?q?fix(Core/Mail):=20calculate=20unReadMails=20and?= =?UTF-8?q?=20m=5FnextMailDelivereTime=20usin=E2=80=A6=20(#18996)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Core/Mail): calculate unReadMails and m_nextMailDelivereTime using mail cache - these values were grepped directly from DB before -> this change was introduced with azerothcore/azerothcore-wotlk#3420 - the whole mailing system relies on the mails beeing cached in the core -> these get stored in DB regularly or on specific events - so apparently the DB is not always in sync with the current mail cache state of the core -> so grepping data directly from DB is not a good idea at this point * Update PlayerUpdates.cpp --- .../game/Entities/Player/PlayerUpdates.cpp | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/server/game/Entities/Player/PlayerUpdates.cpp b/src/server/game/Entities/Player/PlayerUpdates.cpp index 7bcb5e567..4c1b5bb4a 100644 --- a/src/server/game/Entities/Player/PlayerUpdates.cpp +++ b/src/server/game/Entities/Player/PlayerUpdates.cpp @@ -435,31 +435,27 @@ void Player::UpdateNextMailTimeAndUnreads() { // Update the next delivery time and unread mails time_t cTime = GameTime::GetGameTime().count(); - // Get the next delivery time - CharacterDatabasePreparedStatement* stmtNextDeliveryTime = - CharacterDatabase.GetPreparedStatement(CHAR_SEL_NEXT_MAIL_DELIVERYTIME); - stmtNextDeliveryTime->SetData(0, GetGUID().GetCounter()); - stmtNextDeliveryTime->SetData(1, uint32(cTime)); - PreparedQueryResult resultNextDeliveryTime = - CharacterDatabase.Query(stmtNextDeliveryTime); - if (resultNextDeliveryTime) - { - Field* fields = resultNextDeliveryTime->Fetch(); - m_nextMailDelivereTime = time_t(fields[0].Get()); - } - // Get unread mails count - CharacterDatabasePreparedStatement* stmtUnreadAmount = - CharacterDatabase.GetPreparedStatement( - CHAR_SEL_CHARACTER_MAILCOUNT_UNREAD_SYNCH); - stmtUnreadAmount->SetData(0, GetGUID().GetCounter()); - stmtUnreadAmount->SetData(1, uint32(cTime)); - PreparedQueryResult resultUnreadAmount = - CharacterDatabase.Query(stmtUnreadAmount); - if (resultUnreadAmount) + m_nextMailDelivereTime = 0; + unReadMails = 0; + + for (Mail const* mail : GetMails()) { - Field* fields = resultUnreadAmount->Fetch(); - unReadMails = uint8(fields[0].Get()); + if (mail->deliver_time > cTime) + { + if (!m_nextMailDelivereTime || m_nextMailDelivereTime > mail->deliver_time) + m_nextMailDelivereTime = mail->deliver_time; + } + + // must be not checked yet + if (mail->checked & MAIL_CHECK_MASK_READ) + continue; + + // and already delivered or expired + if (cTime < mail->deliver_time || cTime > mail->expire_time) + continue; + + unReadMails++; } }