aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-07-30 20:38:04 +0200
committerShauren <shauren.trinity@gmail.com>2020-07-30 20:38:04 +0200
commit57eaab80d9e1f6f25274f376da16e1f2f67ab4bc (patch)
treed0031051d676b956283fddc191bbfea9fe866572 /src/server/game
parente94350fcc31cedb5a8140a71e2b2a03ab4125927 (diff)
Core/Mail: Load mails at login instead of on demand when queried by packets (logging in always sends one of the packets that cause mail loading anyway)
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/Entities/Player/Player.cpp43
-rw-r--r--src/server/game/Entities/Player/Player.h9
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp17
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp9
-rw-r--r--src/server/game/Handlers/MailHandler.cpp8
-rw-r--r--src/server/game/Mails/Mail.cpp56
6 files changed, 45 insertions, 97 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 80ac886585d..123f9886cb3 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -297,7 +297,6 @@ Player::Player(WorldSession* session): Unit(true)
_restFlagMask = 0;
////////////////////Rest System/////////////////////
- m_mailsLoaded = false;
m_mailsUpdated = false;
unReadMails = 0;
m_nextMailDelivereTime = 0;
@@ -17807,7 +17806,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder* holder)
_LoadActions(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_ACTIONS));
// unread mails and next delivery time, actual mails not loaded
- _LoadMailInit(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_COUNT), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_DATE));
+ _LoadMail(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAILS), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS));
m_social = sSocialMgr->LoadFromDB(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST), GetGUID());
@@ -18444,34 +18443,17 @@ Item* Player::_LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint
return item;
}
-void Player::_LoadMailInit(PreparedQueryResult resultUnread, PreparedQueryResult resultDelivery)
-{
- //set a count of unread mails
- //QueryResult* resultMails = CharacterDatabase.PQuery("SELECT COUNT(id) FROM mail WHERE receiver = '%u' AND (checked & 1)=0 AND deliver_time <= '" UI64FMTD "'", GUID_LOPART(playerGuid), (uint64)cTime);
- if (resultUnread)
- unReadMails = uint8((*resultUnread)[0].GetUInt64());
-
- // store nearest delivery time (it > 0 and if it < current then at next player update SendNewMaill will be called)
- //resultMails = CharacterDatabase.PQuery("SELECT MIN(deliver_time) FROM mail WHERE receiver = '%u' AND (checked & 1)=0", GUID_LOPART(playerGuid));
- if (resultDelivery)
- m_nextMailDelivereTime = time_t((*resultDelivery)[0].GetUInt32());
-}
-
-void Player::_LoadMail()
+void Player::_LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult)
{
m_mail.clear();
- CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL);
- stmt->setUInt32(0, GetGUID().GetCounter());
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
-
std::unordered_map<uint32, Mail*> mailById;
- if (result)
+ if (mailsResult)
{
do
{
- Field* fields = result->Fetch();
+ Field* fields = mailsResult->Fetch();
Mail* m = new Mail;
m->messageID = fields[0].GetUInt32();
@@ -18499,24 +18481,20 @@ void Player::_LoadMail()
m_mail.push_back(m);
mailById[m->messageID] = m;
}
- while (result->NextRow());
+ while (mailsResult->NextRow());
}
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
- stmt->setUInt32(0, GetGUID().GetCounter());
- result = CharacterDatabase.Query(stmt);
-
- if (result)
+ if (mailItemsResult)
{
do
{
- Field* fields = result->Fetch();
+ Field* fields = mailItemsResult->Fetch();
uint32 mailId = fields[14].GetUInt32();
_LoadMailedItem(GetGUID(), this, mailId, mailById[mailId], fields);
- } while (result->NextRow());
+ } while (mailItemsResult->NextRow());
}
- m_mailsLoaded = true;
+ UpdateNextMailTimeAndUnreads();
}
void Player::LoadPet()
@@ -19923,9 +19901,6 @@ void Player::_SaveInventory(CharacterDatabaseTransaction& trans)
void Player::_SaveMail(CharacterDatabaseTransaction& trans)
{
- if (!m_mailsLoaded)
- return;
-
CharacterDatabasePreparedStatement* stmt;
for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 542cca2f29f..a1d191b48e3 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -709,8 +709,8 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOAD_REPUTATION = 7,
PLAYER_LOGIN_QUERY_LOAD_INVENTORY = 8,
PLAYER_LOGIN_QUERY_LOAD_ACTIONS = 9,
- PLAYER_LOGIN_QUERY_LOAD_MAIL_COUNT = 10,
- PLAYER_LOGIN_QUERY_LOAD_MAIL_DATE = 11,
+ PLAYER_LOGIN_QUERY_LOAD_MAILS = 10,
+ PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS = 11,
PLAYER_LOGIN_QUERY_LOAD_SOCIAL_LIST = 12,
PLAYER_LOGIN_QUERY_LOAD_HOME_BIND = 13,
PLAYER_LOGIN_QUERY_LOAD_SPELL_COOLDOWNS = 14,
@@ -1346,7 +1346,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
static void DeleteOldCharacters();
static void DeleteOldCharacters(uint32 keepDays);
- bool m_mailsLoaded;
bool m_mailsUpdated;
void SetBindPoint(ObjectGuid guid) const;
@@ -1380,7 +1379,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SendNewMail() const;
void UpdateNextMailTimeAndUnreads();
void AddNewMailDeliverTime(time_t deliver_time);
- bool IsMailsLoaded() const { return m_mailsLoaded; }
void RemoveMail(uint32 id);
@@ -2227,8 +2225,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void _LoadGlyphAuras();
void _LoadBoundInstances(PreparedQueryResult result);
void _LoadInventory(PreparedQueryResult result, uint32 timeDiff);
- void _LoadMailInit(PreparedQueryResult resultUnread, PreparedQueryResult resultDelivery);
- void _LoadMail();
+ void _LoadMail(PreparedQueryResult mailsResult, PreparedQueryResult mailItemsResult);
static Item* _LoadMailedItem(ObjectGuid const& playerGuid, Player* player, uint32 mailId, Mail* mail, Field* fields);
void _LoadQuestStatus(PreparedQueryResult result);
void _LoadQuestStatusRewarded(PreparedQueryResult result);
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 52eca422e6c..57a773eab2b 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -6274,11 +6274,15 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
do
{
Field* fields = result->Fetch();
+ ObjectGuid::LowType receiver = fields[3].GetUInt32();
+ if (serverUp && ObjectAccessor::FindConnectedPlayer(ObjectGuid(HighGuid::Player, receiver)))
+ continue;
+
Mail* m = new Mail;
m->messageID = fields[0].GetUInt32();
m->messageType = fields[1].GetUInt8();
m->sender = fields[2].GetUInt32();
- m->receiver = fields[3].GetUInt32();
+ m->receiver = receiver;
bool has_items = fields[4].GetBool();
m->expire_time = time_t(fields[5].GetUInt32());
m->deliver_time = 0;
@@ -6286,17 +6290,6 @@ void ObjectMgr::ReturnOrDeleteOldMails(bool serverUp)
m->checked = fields[7].GetUInt8();
m->mailTemplateId = fields[8].GetInt16();
- Player* player = nullptr;
- if (serverUp)
- player = ObjectAccessor::FindConnectedPlayer(ObjectGuid(HighGuid::Player, m->receiver));
-
- if (player && player->m_mailsLoaded)
- { // this code will run very improbably (the time is between 4 and 5 am, in game is online a player, who has old mail
- // his in mailbox and he has already listed his mails)
- delete m;
- continue;
- }
-
// Delete or return mail
if (has_items)
{
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index e935fb8847e..fbb7c4213cb 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -124,14 +124,13 @@ bool LoginQueryHolder::Initialize()
stmt->setUInt32(0, lowGuid);
res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_ACTIONS, stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_MAILCOUNT);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAIL);
stmt->setUInt32(0, lowGuid);
- stmt->setUInt64(1, uint64(GameTime::GetGameTime()));
- res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAIL_COUNT, stmt);
+ res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAILS, stmt);
- stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_MAILDATE);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_MAILITEMS);
stmt->setUInt32(0, lowGuid);
- res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAIL_DATE, stmt);
+ res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_MAIL_ITEMS, stmt);
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_SOCIALLIST);
stmt->setUInt32(0, lowGuid);
diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
index 7e2963a93fa..cca8f2b0c67 100644
--- a/src/server/game/Handlers/MailHandler.cpp
+++ b/src/server/game/Handlers/MailHandler.cpp
@@ -604,10 +604,6 @@ void WorldSession::HandleGetMailList(WorldPacket& recvData)
Player* player = _player;
- //load players mails, and mailed items
- if (!player->m_mailsLoaded)
- player->_LoadMail();
-
// client can't work with packets > max int16 value
const uint32 maxPacketSize = 32767;
@@ -776,14 +772,10 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket& recvData)
}
}
-/// @todo Fix me! ... this void has probably bad condition, but good data are sent
void WorldSession::HandleQueryNextMailTime(WorldPacket & /*recvData*/)
{
WorldPacket data(MSG_QUERY_NEXT_MAIL_TIME, 8);
- if (!_player->m_mailsLoaded)
- _player->_LoadMail();
-
if (_player->unReadMails > 0)
{
data << float(0); // float
diff --git a/src/server/game/Mails/Mail.cpp b/src/server/game/Mails/Mail.cpp
index c42bd2a8e63..3233123c11a 100644
--- a/src/server/game/Mails/Mail.cpp
+++ b/src/server/game/Mails/Mail.cpp
@@ -250,43 +250,35 @@ void MailDraft::SendMailTo(CharacterDatabaseTransaction& trans, MailReceiver con
{
pReceiver->AddNewMailDeliverTime(deliver_time);
- if (pReceiver->IsMailsLoaded())
+ Mail* m = new Mail;
+ m->messageID = mailId;
+ m->mailTemplateId = GetMailTemplateId();
+ m->subject = GetSubject();
+ m->body = GetBody();
+ m->money = GetMoney();
+ m->COD = GetCOD();
+
+ for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
{
- Mail* m = new Mail;
- m->messageID = mailId;
- m->mailTemplateId = GetMailTemplateId();
- m->subject = GetSubject();
- m->body = GetBody();
- m->money = GetMoney();
- m->COD = GetCOD();
-
- for (MailItemMap::const_iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
- {
- Item* item = mailItemIter->second;
- m->AddItem(item->GetGUID().GetCounter(), item->GetEntry());
- }
+ Item* item = mailItemIter->second;
+ m->AddItem(item->GetGUID().GetCounter(), item->GetEntry());
+ }
- m->messageType = sender.GetMailMessageType();
- m->stationery = sender.GetStationery();
- m->sender = sender.GetSenderId();
- m->receiver = receiver.GetPlayerGUIDLow();
- m->expire_time = expire_time;
- m->deliver_time = deliver_time;
- m->checked = checked;
- m->state = MAIL_STATE_UNCHANGED;
+ m->messageType = sender.GetMailMessageType();
+ m->stationery = sender.GetStationery();
+ m->sender = sender.GetSenderId();
+ m->receiver = receiver.GetPlayerGUIDLow();
+ m->expire_time = expire_time;
+ m->deliver_time = deliver_time;
+ m->checked = checked;
+ m->state = MAIL_STATE_UNCHANGED;
- pReceiver->AddMail(m); // to insert new mail to beginning of maillist
+ pReceiver->AddMail(m); // to insert new mail to beginning of maillist
- if (!m_items.empty())
- {
- for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
- pReceiver->AddMItem(mailItemIter->second);
- }
- }
- else if (!m_items.empty())
+ if (!m_items.empty())
{
- CharacterDatabaseTransaction temp = CharacterDatabaseTransaction(nullptr);
- deleteIncludedItems(temp);
+ for (MailItemMap::iterator mailItemIter = m_items.begin(); mailItemIter != m_items.end(); ++mailItemIter)
+ pReceiver->AddMItem(mailItemIter->second);
}
}
else if (!m_items.empty())