mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-19 03:45:43 +00:00
feat(Core/Mail): Server mail (#10628)
This commit is contained in:
@@ -9761,3 +9761,116 @@ uint32 ObjectMgr::GetQuestMoneyReward(uint8 level, uint32 questMoneyDifficulty)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ObjectMgr::SendServerMail(Player* player, uint32 id, uint32 reqLevel, uint32 reqPlayTime, uint32 rewardMoneyA, uint32 rewardMoneyH, uint32 rewardItemA, uint32 rewardItemCountA, uint32 rewardItemH, uint32 rewardItemCountH, std::string subject, std::string body, uint8 active) const
|
||||
{
|
||||
if (active)
|
||||
{
|
||||
if (player->getLevel() < reqLevel)
|
||||
return;
|
||||
|
||||
if (player->GetTotalPlayedTime() < reqPlayTime)
|
||||
return;
|
||||
|
||||
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
|
||||
|
||||
MailSender sender(MAIL_NORMAL, player->GetGUID().GetCounter(), MAIL_STATIONERY_GM);
|
||||
MailDraft draft(subject, body);
|
||||
|
||||
draft.AddMoney(player->GetTeamId() == TEAM_ALLIANCE ? rewardMoneyH : rewardMoneyA);
|
||||
if (Item* mailItem = Item::CreateItem(player->GetTeamId() == TEAM_ALLIANCE ? rewardItemH : rewardItemA, player->GetTeamId() == TEAM_ALLIANCE ? rewardItemCountH : rewardItemCountA))
|
||||
{
|
||||
mailItem->SaveToDB(trans);
|
||||
draft.AddItem(mailItem);
|
||||
}
|
||||
|
||||
draft.SendMailTo(trans, MailReceiver(player), sender);
|
||||
CharacterDatabase.CommitTransaction(trans);
|
||||
|
||||
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_MAIL_SERVER_CHARACTER);
|
||||
stmt->SetData(0, player->GetGUID().GetCounter());
|
||||
stmt->SetData(1, id);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
LOG_DEBUG("entities.player", "ObjectMgr::SendServerMail() Sent mail id {} to {}", id, player->GetGUID().ToString());
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadMailServerTemplates()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
_serverMailStore.clear(); // for reload case
|
||||
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11
|
||||
QueryResult result = CharacterDatabase.Query("SELECT `id`, `reqLevel`, `reqPlayTime`, `moneyA`, `moneyH`, `itemA`, `itemCountA`, `itemH`,`itemCountH`, `subject`, `body`, `active` FROM `mail_server_template`");
|
||||
if (!result)
|
||||
{
|
||||
LOG_INFO("sql.sql", ">> Loaded 0 server mail rewards. DB table `mail_server_template` is empty.");
|
||||
LOG_INFO("server.loading", " ");
|
||||
return;
|
||||
}
|
||||
|
||||
_serverMailStore.rehash(result->GetRowCount());
|
||||
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 id = fields[0].Get<uint32>();
|
||||
|
||||
ServerMail& servMail = _serverMailStore[id];
|
||||
|
||||
servMail.id = id;
|
||||
servMail.reqLevel = fields[1].Get<uint8>();
|
||||
servMail.reqPlayTime = fields[2].Get<uint32>();
|
||||
servMail.moneyA = fields[3].Get<uint32>();
|
||||
servMail.moneyH = fields[4].Get<uint32>();
|
||||
servMail.itemA = fields[5].Get<uint32>();
|
||||
servMail.itemCountA = fields[6].Get<uint32>();
|
||||
servMail.itemH = fields[7].Get<uint32>();
|
||||
servMail.itemCountH = fields[8].Get<uint32>();
|
||||
servMail.subject = fields[9].Get<std::string>();
|
||||
servMail.body = fields[10].Get<std::string>();
|
||||
servMail.active = fields[11].Get<uint8>();
|
||||
|
||||
if (servMail.reqLevel > sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
|
||||
{
|
||||
LOG_ERROR("sql.sql", "Table `mail_server_template` has reqLevel {} but max level is {} for id {}, skipped.", servMail.reqLevel, sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL), servMail.id);
|
||||
return;
|
||||
}
|
||||
|
||||
if (servMail.moneyA > MAX_MONEY_AMOUNT || servMail.moneyH > MAX_MONEY_AMOUNT)
|
||||
{
|
||||
LOG_ERROR("sql.sql", "Table `mail_server_template` has moneyA {} or moneyH {} larger than MAX_MONEY_AMOUNT {} for id {}, skipped.", servMail.moneyA, servMail.moneyH, MAX_MONEY_AMOUNT, servMail.id);
|
||||
return;
|
||||
}
|
||||
|
||||
ItemTemplate const* itemTemplateA = sObjectMgr->GetItemTemplate(servMail.itemA);
|
||||
if (!itemTemplateA && servMail.itemA)
|
||||
{
|
||||
LOG_ERROR("sql.sql", "Table `mail_server_template` has invalid item in itemA {} for id {}, skipped.", servMail.itemA, servMail.id);
|
||||
return;
|
||||
}
|
||||
ItemTemplate const* itemTemplateH = sObjectMgr->GetItemTemplate(servMail.itemH);
|
||||
if (!itemTemplateH && servMail.itemH)
|
||||
{
|
||||
LOG_ERROR("sql.sql", "Table `mail_server_template` has invalid item in itemH {} for id {}, skipped.", servMail.itemH, servMail.id);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!servMail.itemA && servMail.itemCountA)
|
||||
{
|
||||
LOG_ERROR("sql.sql", "Table `mail_server_template` has itemCountA {} with no ItemA, set to 0", servMail.itemCountA);
|
||||
servMail.itemCountA = 0;
|
||||
}
|
||||
if (!servMail.itemH && servMail.itemCountH)
|
||||
{
|
||||
LOG_ERROR("sql.sql", "Table `mail_server_template` has itemCountH {} with no ItemH, set to 0", servMail.itemCountH);
|
||||
servMail.itemCountH = 0;
|
||||
}
|
||||
} while (result->NextRow());
|
||||
|
||||
LOG_INFO("server.loading", ">> Loaded {} Mail Server Template in {} ms", _serverMailStore.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
LOG_INFO("server.loading", " ");
|
||||
}
|
||||
|
||||
@@ -667,6 +667,7 @@ typedef std::array<std::unordered_map<uint32, QuestGreeting>, 2> QuestGreetingCo
|
||||
|
||||
typedef std::unordered_map<uint32, VendorItemData> CacheVendorItemContainer;
|
||||
typedef std::unordered_map<uint32, TrainerSpellData> CacheTrainerSpellContainer;
|
||||
typedef std::unordered_map<uint32, ServerMail> ServerMailContainer;
|
||||
|
||||
enum SkillRangeType
|
||||
{
|
||||
@@ -1040,6 +1041,7 @@ public:
|
||||
void LoadInstanceTemplate();
|
||||
void LoadInstanceEncounters();
|
||||
void LoadMailLevelRewards();
|
||||
void LoadMailServerTemplates();
|
||||
void LoadVehicleTemplateAccessories();
|
||||
void LoadVehicleAccessories();
|
||||
|
||||
@@ -1169,6 +1171,8 @@ public:
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
[[nodiscard]] ServerMailContainer const& GetAllServerMailStore() const { return _serverMailStore; }
|
||||
|
||||
[[nodiscard]] BroadcastText const* GetBroadcastText(uint32 id) const
|
||||
{
|
||||
BroadcastTextContainer::const_iterator itr = _broadcastTextStore.find(id);
|
||||
@@ -1404,6 +1408,7 @@ public:
|
||||
[[nodiscard]] bool IsTransportMap(uint32 mapId) const { return _transportMaps.count(mapId) != 0; }
|
||||
|
||||
[[nodiscard]] uint32 GetQuestMoneyReward(uint8 level, uint32 questMoneyDifficulty) const;
|
||||
void SendServerMail(Player* player, uint32 id, uint32 reqLevel, uint32 reqPlayTime, uint32 rewardMoneyA, uint32 rewardMoneyH, uint32 rewardItemA, uint32 rewardItemCountA, uint32 rewardItemH, uint32 rewardItemCountH, std::string subject, std::string body, uint8 active) const;
|
||||
|
||||
private:
|
||||
// first free id for selected id type
|
||||
@@ -1558,6 +1563,8 @@ private:
|
||||
CacheVendorItemContainer _cacheVendorItemStore;
|
||||
CacheTrainerSpellContainer _cacheTrainerSpellStore;
|
||||
|
||||
ServerMailContainer _serverMailStore;
|
||||
|
||||
std::set<uint32> _difficultyEntries[MAX_DIFFICULTY - 1]; // already loaded difficulty 1 value in creatures, used in CheckCreatureTemplate
|
||||
std::set<uint32> _hasDifficultyEntries[MAX_DIFFICULTY - 1]; // already loaded creatures with difficulty 1 values, used in CheckCreatureTemplate
|
||||
|
||||
|
||||
@@ -211,4 +211,21 @@ struct Mail
|
||||
[[nodiscard]] bool IsReturnedMail() const { return checked & MAIL_CHECK_MASK_RETURNED; }
|
||||
};
|
||||
|
||||
struct ServerMail
|
||||
{
|
||||
ServerMail() = default;
|
||||
uint32 id{ 0 };
|
||||
uint8 reqLevel{ 0 };
|
||||
uint32 reqPlayTime{ 0 };
|
||||
uint32 moneyA{ 0 };
|
||||
uint32 moneyH{ 0 };
|
||||
uint32 itemA{ 0 };
|
||||
uint32 itemCountA{ 0 };
|
||||
uint32 itemH{ 0 };
|
||||
uint32 itemCountH{ 0 };
|
||||
std::string subject;
|
||||
std::string body;
|
||||
uint8 active{ 0 };
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1834,6 +1834,9 @@ void World::SetInitialWorldSettings()
|
||||
LOG_INFO("server.loading", "Loading Player level dependent mail rewards...");
|
||||
sObjectMgr->LoadMailLevelRewards();
|
||||
|
||||
LOG_INFO("server.loading", "Load Mail Server Template...");
|
||||
sObjectMgr->LoadMailServerTemplates();
|
||||
|
||||
// Loot tables
|
||||
LoadLootTables();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user