mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-22 02:04:52 +01:00
MaNGOS merge: Mail System.
* Store loot in mail_loot_template indexed by mail template ids. * Implement proper creating mail text copy item from mail template based mail. * Move send functions to new MailDraft class from WorldSession. * Implement mails sending at player levelup. * Autor VladimirMangos, converted by me. --HG-- branch : trunk
This commit is contained in:
@@ -3537,6 +3537,9 @@ void ObjectMgr::LoadQuests()
|
||||
|
||||
delete result;
|
||||
|
||||
|
||||
std::map<uint32,uint32> usedMailTemplates;
|
||||
|
||||
// Post processing
|
||||
for (QuestMap::iterator iter = mQuestTemplates.begin(); iter != mQuestTemplates.end(); ++iter)
|
||||
{
|
||||
@@ -4030,21 +4033,31 @@ void ObjectMgr::LoadQuests()
|
||||
}
|
||||
}
|
||||
|
||||
if(qinfo->RewMailTemplateId)
|
||||
if (qinfo->RewMailTemplateId)
|
||||
{
|
||||
if(!sMailTemplateStore.LookupEntry(qinfo->RewMailTemplateId))
|
||||
if (!sMailTemplateStore.LookupEntry(qinfo->RewMailTemplateId))
|
||||
{
|
||||
sLog.outErrorDb("Quest %u has `RewMailTemplateId` = %u but mail template %u does not exist, quest will not have a mail reward.",
|
||||
qinfo->GetQuestId(),qinfo->RewMailTemplateId,qinfo->RewMailTemplateId);
|
||||
qinfo->RewMailTemplateId = 0; // no mail will send to player
|
||||
qinfo->RewMailDelaySecs = 0; // no mail will send to player
|
||||
}
|
||||
else if (usedMailTemplates.find(qinfo->RewMailTemplateId) != usedMailTemplates.end())
|
||||
{
|
||||
std::map<uint32,uint32>::const_iterator used_mt_itr = usedMailTemplates.find(qinfo->RewMailTemplateId);
|
||||
sLog.outErrorDb("Quest %u has `RewMailTemplateId` = %u but mail template %u already used for quest %u, quest will not have a mail reward.",
|
||||
qinfo->GetQuestId(),qinfo->RewMailTemplateId,qinfo->RewMailTemplateId,used_mt_itr->second);
|
||||
qinfo->RewMailTemplateId = 0; // no mail will send to player
|
||||
qinfo->RewMailDelaySecs = 0; // no mail will send to player
|
||||
}
|
||||
else
|
||||
usedMailTemplates[qinfo->RewMailTemplateId] = qinfo->GetQuestId();
|
||||
}
|
||||
|
||||
if(qinfo->NextQuestInChain)
|
||||
if (qinfo->NextQuestInChain)
|
||||
{
|
||||
QuestMap::iterator qNextItr = mQuestTemplates.find(qinfo->NextQuestInChain);
|
||||
if(qNextItr == mQuestTemplates.end())
|
||||
if (qNextItr == mQuestTemplates.end())
|
||||
{
|
||||
sLog.outErrorDb("Quest %u has `NextQuestInChain` = %u but quest %u does not exist, quest chain will not work.",
|
||||
qinfo->GetQuestId(),qinfo->NextQuestInChain ,qinfo->NextQuestInChain );
|
||||
@@ -4055,7 +4068,7 @@ void ObjectMgr::LoadQuests()
|
||||
}
|
||||
|
||||
// fill additional data stores
|
||||
if(qinfo->PrevQuestId)
|
||||
if (qinfo->PrevQuestId)
|
||||
{
|
||||
if (mQuestTemplates.find(abs(qinfo->GetPrevQuestId())) == mQuestTemplates.end())
|
||||
{
|
||||
@@ -4067,7 +4080,7 @@ void ObjectMgr::LoadQuests()
|
||||
}
|
||||
}
|
||||
|
||||
if(qinfo->NextQuestId)
|
||||
if (qinfo->NextQuestId)
|
||||
{
|
||||
QuestMap::iterator qNextItr = mQuestTemplates.find(abs(qinfo->GetNextQuestId()));
|
||||
if (qNextItr == mQuestTemplates.end())
|
||||
@@ -4081,9 +4094,9 @@ void ObjectMgr::LoadQuests()
|
||||
}
|
||||
}
|
||||
|
||||
if(qinfo->ExclusiveGroup)
|
||||
if (qinfo->ExclusiveGroup)
|
||||
mExclusiveQuestGroups.insert(std::pair<int32, uint32>(qinfo->ExclusiveGroup, qinfo->GetQuestId()));
|
||||
if(qinfo->LimitTime)
|
||||
if (qinfo->LimitTime)
|
||||
qinfo->SetFlag(QUEST_TRINITY_FLAGS_TIMED);
|
||||
}
|
||||
|
||||
@@ -7985,6 +7998,72 @@ bool ObjectMgr::DeleteGameTele(const std::string& name)
|
||||
return false;
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadMailLevelRewards()
|
||||
{
|
||||
m_mailLevelRewardMap.clear(); // for reload case
|
||||
|
||||
uint32 count = 0;
|
||||
QueryResult *result = WorldDatabase.Query("SELECT level, raceMask, mailTemplateId, senderEntry FROM mail_level_reward");
|
||||
|
||||
if( !result )
|
||||
{
|
||||
barGoLink bar( 1 );
|
||||
|
||||
bar.step();
|
||||
|
||||
sLog.outString();
|
||||
sLog.outErrorDb(">> Loaded `mail_level_reward`, table is empty!");
|
||||
return;
|
||||
}
|
||||
|
||||
barGoLink bar( result->GetRowCount() );
|
||||
|
||||
do
|
||||
{
|
||||
bar.step();
|
||||
|
||||
Field *fields = result->Fetch();
|
||||
|
||||
uint8 level = fields[0].GetUInt8();
|
||||
uint32 raceMask = fields[1].GetUInt32();
|
||||
uint32 mailTemplateId = fields[2].GetUInt32();
|
||||
uint32 senderEntry = fields[3].GetUInt32();
|
||||
|
||||
if(level > MAX_LEVEL)
|
||||
{
|
||||
sLog.outErrorDb("Table `mail_level_reward` have data for level %u that more supported by client (%u), ignoring.",level,MAX_LEVEL);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!(raceMask & RACEMASK_ALL_PLAYABLE))
|
||||
{
|
||||
sLog.outErrorDb("Table `mail_level_reward` have raceMask (%u) for level %u that not include any player races, ignoring.",raceMask,level);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!sMailTemplateStore.LookupEntry(mailTemplateId))
|
||||
{
|
||||
sLog.outErrorDb("Table `mail_level_reward` have invalid mailTemplateId (%u) for level %u that invalid not include any player races, ignoring.",mailTemplateId,level);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!GetCreatureTemplateStore(senderEntry))
|
||||
{
|
||||
sLog.outErrorDb("Table `mail_level_reward` have not existed sender creature entry (%u) for level %u that invalid not include any player races, ignoring.",senderEntry,level);
|
||||
continue;
|
||||
}
|
||||
|
||||
m_mailLevelRewardMap[level].push_back(MailLevelReward(raceMask,mailTemplateId,senderEntry));
|
||||
|
||||
++count;
|
||||
}
|
||||
while (result->NextRow());
|
||||
delete result;
|
||||
|
||||
sLog.outString();
|
||||
sLog.outString( ">> Loaded %u level dependent mail rewards,", count );
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadTrainerSpell()
|
||||
{
|
||||
// For reload case
|
||||
|
||||
Reference in New Issue
Block a user