AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
ArenaSeasonTeamRewarderImpl Class Reference

#include "ArenaSeasonRewardsDistributor.h"

Inheritance diagram for ArenaSeasonTeamRewarderImpl:
ArenaSeasonTeamRewarder

Public Member Functions

void RewardTeamWithRewardGroup (ArenaTeam *arenaTeam, ArenaSeasonRewardGroup const &rewardGroup) override
 
- Public Member Functions inherited from ArenaSeasonTeamRewarder
virtual ~ArenaSeasonTeamRewarder ()=default
 

Private Member Functions

void RewardWithMail (ArenaTeam *arenaTeam, ArenaSeasonRewardGroup const &rewardGroup)
 
void RewardWithAchievements (ArenaTeam *arenaTeam, ArenaSeasonRewardGroup const &rewardGroup)
 

Detailed Description

Member Function Documentation

◆ RewardTeamWithRewardGroup()

void ArenaSeasonTeamRewarderImpl::RewardTeamWithRewardGroup ( ArenaTeam arenaTeam,
ArenaSeasonRewardGroup const &  rewardGroup 
)
overridevirtual

Implements ArenaSeasonTeamRewarder.

28{
29 RewardWithMail(arenaTeam, rewardGroup);
30 RewardWithAchievements(arenaTeam, rewardGroup);
31}
void RewardWithMail(ArenaTeam *arenaTeam, ArenaSeasonRewardGroup const &rewardGroup)
Definition ArenaSeasonRewardsDistributor.cpp:33
void RewardWithAchievements(ArenaTeam *arenaTeam, ArenaSeasonRewardGroup const &rewardGroup)
Definition ArenaSeasonRewardsDistributor.cpp:73

References RewardWithAchievements(), and RewardWithMail().

◆ RewardWithAchievements()

void ArenaSeasonTeamRewarderImpl::RewardWithAchievements ( ArenaTeam arenaTeam,
ArenaSeasonRewardGroup const &  rewardGroup 
)
private
74{
75 if (rewardGroup.achievementRewards.empty())
76 return;
77
78 for (auto const& member : arenaTeam->GetMembers())
79 {
80 uint32 teamSeasonGames = arenaTeam->GetStats().SeasonGames;
81 // Avoid division by zero.
82 if (teamSeasonGames == 0)
83 continue;
84
85 float memberParticipationPercentage = (static_cast<float>(member.SeasonGames) / teamSeasonGames) * 100;
86 if (memberParticipationPercentage < minPctTeamGamesForMemberToGetReward)
87 continue;
88
89 Player* player = ObjectAccessor::FindPlayer(member.Guid);
90 for (auto const& reward : rewardGroup.achievementRewards)
91 {
92 AchievementEntry const* achievement = sAchievementStore.LookupEntry(reward.entry);
93 if (!achievement)
94 continue;
95
96 if (player)
97 player->CompletedAchievement(achievement);
98 else
99 sAchievementMgr->CompletedAchievementForOfflinePlayer(member.Guid.GetCounter(), achievement);
100 }
101 }
102}
#define sAchievementMgr
Definition AchievementMgr.h:451
constexpr float minPctTeamGamesForMemberToGetReward
Definition ArenaSeasonRewardsDistributor.cpp:25
DBCStorage< AchievementEntry > sAchievementStore(Achievementfmt)
std::uint32_t uint32
Definition Define.h:107
const ArenaTeamStats & GetStats() const
Definition ArenaTeam.h:155
Definition Player.h:1081
void CompletedAchievement(AchievementEntry const *entry)
Definition Player.cpp:13994
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
Definition DBCStructure.h:39
uint16 SeasonGames
Definition ArenaTeam.h:129

References ArenaSeasonRewardGroup::achievementRewards, Player::CompletedAchievement(), ObjectAccessor::FindPlayer(), ArenaTeam::GetMembers(), ArenaTeam::GetStats(), minPctTeamGamesForMemberToGetReward, sAchievementMgr, sAchievementStore, and ArenaTeamStats::SeasonGames.

Referenced by RewardTeamWithRewardGroup().

◆ RewardWithMail()

void ArenaSeasonTeamRewarderImpl::RewardWithMail ( ArenaTeam arenaTeam,
ArenaSeasonRewardGroup const &  rewardGroup 
)
private
34{
35 if (rewardGroup.itemRewards.empty() && rewardGroup.goldReward == 0)
36 return;
37
38 const uint32 npcKingDondSender = 18897;
39
40 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
41 for (auto const& member : arenaTeam->GetMembers())
42 {
43 uint32 teamSeasonGames = arenaTeam->GetStats().SeasonGames;
44 // Avoid division by zero.
45 if (teamSeasonGames == 0)
46 continue;
47
48 float memberParticipationPercentage = (static_cast<float>(member.SeasonGames) / teamSeasonGames) * 100;
49 if (memberParticipationPercentage < minPctTeamGamesForMemberToGetReward)
50 continue;
51
52 Player* player = ObjectAccessor::FindPlayer(member.Guid);
53
54 auto draft = rewardGroup.rewardMailTemplateID > 0 ?
55 MailDraft(rewardGroup.rewardMailTemplateID, false) :
56 MailDraft(rewardGroup.rewardMailSubject, rewardGroup.rewardMailBody);
57
58 if (rewardGroup.goldReward > 0)
59 draft.AddMoney(rewardGroup.goldReward);
60
61 for (auto const& reward : rewardGroup.itemRewards)
62 if (Item* item = Item::CreateItem(reward.entry, 1))
63 {
64 item->SaveToDB(trans);
65 draft.AddItem(item);
66 }
67
68 draft.SendMailTo(trans, MailReceiver(player, member.Guid.GetCounter()), MailSender(npcKingDondSender));
69 }
70 CharacterDatabase.CommitTransaction(trans);
71}
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
Definition Item.h:220
Definition Mail.h:119
MailDraft & AddMoney(uint32 money)
Definition Mail.h:137
void SendMailTo(CharacterDatabaseTransaction trans, MailReceiver const &receiver, MailSender const &sender, MailCheckMask checked=MAIL_CHECK_MASK_NONE, uint32 deliver_delay=0, uint32 custom_expiration=0, bool deleteMailItemsFromDB=false, bool sendMail=true)
Definition Mail.cpp:185
MailDraft & AddItem(Item *item)
Definition Mail.cpp:93
Definition Mail.h:105
Definition Mail.h:83

References CharacterDatabase, Item::CreateItem(), ObjectAccessor::FindPlayer(), ArenaTeam::GetMembers(), ArenaTeam::GetStats(), ArenaSeasonRewardGroup::goldReward, ArenaSeasonRewardGroup::itemRewards, minPctTeamGamesForMemberToGetReward, ArenaSeasonRewardGroup::rewardMailBody, ArenaSeasonRewardGroup::rewardMailSubject, ArenaSeasonRewardGroup::rewardMailTemplateID, and ArenaTeamStats::SeasonGames.

Referenced by RewardTeamWithRewardGroup().


The documentation for this class was generated from the following files: