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

#include "KillRewarder.h"

Public Member Functions

 KillRewarder (Player *killer, Unit *victim, bool isBattleGround)
 
void Reward ()
 
UnitGetVictim ()
 
PlayerGetKiller ()
 

Private Member Functions

void _InitXP (Player *player)
 
void _InitGroupData ()
 
void _RewardHonor (Player *player)
 
void _RewardXP (Player *player, float rate)
 
void _RewardReputation (Player *player)
 
void _RewardKillCredit (Player *player)
 
void _RewardPlayer (Player *player, bool isDungeon)
 
void _RewardGroup ()
 

Private Attributes

Player_killer
 
Unit_victim
 
Group_group
 
float _groupRate
 
Player_maxNotGrayMember
 
uint32 _count
 
uint32 _aliveSumLevel
 
uint32 _sumLevel
 
uint32 _xp
 
bool _isFullXP
 
uint8 _maxLevel
 
bool _isBattleGround
 
bool _isPvP
 

Detailed Description

Constructor & Destructor Documentation

◆ KillRewarder()

KillRewarder::KillRewarder ( Player killer,
Unit victim,
bool  isBattleGround 
)
67 :
68// 1. Initialize internal variables to default values.
69 _killer(killer), _victim(victim), _group(killer->GetGroup()),
70 _groupRate(1.0f), _maxNotGrayMember(nullptr), _count(0), _aliveSumLevel(0), _sumLevel(0), _xp(0),
71 _isFullXP(false), _maxLevel(0), _isBattleGround(isBattleGround), _isPvP(false)
72{
73 // mark the credit as pvp if victim is player
74 if (victim->IsPlayer())
75 _isPvP = true;
76 // or if its owned by player and its not a vehicle
77 else if (victim->GetCharmerOrOwnerGUID().IsPlayer())
78 _isPvP = !victim->IsVehicle();
79
81}
uint8 _maxLevel
Definition KillRewarder.h:57
uint32 _count
Definition KillRewarder.h:52
float _groupRate
Definition KillRewarder.h:50
uint32 _xp
Definition KillRewarder.h:55
uint32 _aliveSumLevel
Definition KillRewarder.h:53
uint32 _sumLevel
Definition KillRewarder.h:54
Player * _maxNotGrayMember
Definition KillRewarder.h:51
Unit * _victim
Definition KillRewarder.h:48
Player * _killer
Definition KillRewarder.h:47
bool _isBattleGround
Definition KillRewarder.h:58
Group * _group
Definition KillRewarder.h:49
void _InitGroupData()
Definition KillRewarder.cpp:83
bool _isFullXP
Definition KillRewarder.h:56
bool _isPvP
Definition KillRewarder.h:59
bool IsPlayer() const
Definition ObjectGuid.h:168
bool IsPlayer() const
Definition Object.h:200
Group * GetGroup()
Definition Player.h:2482
bool IsVehicle() const
Definition Unit.h:790
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1280

References _InitGroupData(), _isPvP, Unit::GetCharmerOrOwnerGUID(), Object::IsPlayer(), ObjectGuid::IsPlayer(), and Unit::IsVehicle().

Member Function Documentation

◆ _InitGroupData()

void KillRewarder::_InitGroupData ( )
private
84{
85 if (_group)
86 {
87 // 2. In case when player is in group, initialize variables necessary for group calculations:
88 for (GroupReference* itr = _group->GetFirstMember(); itr != nullptr; itr = itr->next())
89 if (Player* member = itr->GetSource())
90 if ((_killer == member || member->IsAtGroupRewardDistance(_victim)))
91 {
92 const uint8 lvl = member->GetLevel();
93 if (member->IsAlive())
94 {
95 // 2.1. _count - number of alive group members within reward distance;
96 ++_count;
97 // 2.2. _aliveSumLevel - sum of levels of alive group members within reward distance;
98 _aliveSumLevel += lvl;
99 // 2.3. _maxLevel - maximum level of alive group member within reward distance;
100 if (_maxLevel < lvl)
101 {
102 _maxLevel = lvl;
103 }
104 // 2.4. _maxNotGrayMember - maximum level of alive group member within reward distance,
105 // for whom victim is not gray;
106 uint32 grayLevel = Acore::XP::GetGrayLevel(lvl);
107 if (_victim->GetLevel() > grayLevel && (!_maxNotGrayMember || _maxNotGrayMember->GetLevel() < lvl))
108 {
109 _maxNotGrayMember = member;
110 }
111 }
112 // 2.5. _sumLevel - sum of levels of group members within reward distance;
113 _sumLevel += lvl;
114 }
115 // 2.6. _isFullXP - flag identifying that for all group members victim is not gray,
116 // so 100% XP will be rewarded (50% otherwise).
118 }
119 else
120 _count = 1;
121}
std::uint8_t uint8
Definition Define.h:109
std::uint32_t uint32
Definition Define.h:107
Definition GroupReference.h:27
GroupReference * GetFirstMember()
Definition Group.h:243
Definition Player.h:1071
bool IsAtGroupRewardDistance(WorldObject const *pRewardSource) const
Definition Player.cpp:12801
uint8 GetLevel() const
Definition Unit.h:1088
uint8 GetGrayLevel(uint8 pl_level)
Definition Formulas.h:46

References _aliveSumLevel, _count, _group, _isFullXP, _killer, _maxLevel, _maxNotGrayMember, _sumLevel, _victim, Group::GetFirstMember(), Acore::XP::GetGrayLevel(), Unit::GetLevel(), and Player::IsAtGroupRewardDistance().

Referenced by KillRewarder().

◆ _InitXP()

void KillRewarder::_InitXP ( Player player)
private
124{
125 // Get initial value of XP for kill.
126 // XP is given:
127 // * on battlegrounds;
128 // * otherwise, not in PvP;
129 // * not if killer is on vehicle.
130 if (_victim && (_isBattleGround || (!_isPvP && !_killer->GetVehicle())))
132
133 if (_xp && !_isBattleGround && _victim) // pussywizard: npcs with relatively low hp give lower exp
134 if (_victim->IsCreature())
136 if (ct->ModHealth <= 0.75f && ct->ModHealth >= 0.0f)
137 _xp = uint32(_xp * ct->ModHealth);
138}
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:208
bool IsCreature() const
Definition Object.h:204
Creature * ToCreature()
Definition Object.h:205
Vehicle * GetVehicle() const
Definition Unit.h:1905
uint32 Gain(Player *player, Unit *unit, bool isBattleGround=false)
Definition Formulas.cpp:72
Definition CreatureData.h:186

References _isBattleGround, _isPvP, _killer, _victim, _xp, Acore::XP::Gain(), Creature::GetCreatureTemplate(), Unit::GetVehicle(), Object::IsCreature(), and Object::ToCreature().

Referenced by _RewardGroup(), and Reward().

◆ _RewardGroup()

void KillRewarder::_RewardGroup ( )
private
229{
230 if (_maxLevel)
231 {
233 // 3.1.1. Initialize initial XP amount based on maximum level of group member,
234 // for whom victim is not gray.
236 // To avoid unnecessary calculations and calls,
237 // proceed only if XP is not ZERO or player is not on battleground
238 // (battleground rewards only XP, that's why).
239 if (!_isBattleGround || _xp)
240 {
241 const bool isDungeon = !_isPvP && sMapStore.LookupEntry(_killer->GetMapId())->IsDungeon();
242 if (!_isBattleGround)
243 {
244 // 3.1.2. Alter group rate if group is in raid (not for battlegrounds).
245 const bool isRaid = !_isPvP && sMapStore.LookupEntry(_killer->GetMapId())->IsRaid() && _group->isRaidGroup();
247 }
248
249 // 3.1.3. Reward each group member (even dead or corpse) within reward distance.
250 for (GroupReference* itr = _group->GetFirstMember(); itr != nullptr; itr = itr->next())
251 {
252 if (Player* member = itr->GetSource())
253 {
254 if (_killer == member || member->IsAtGroupRewardDistance(_victim))
255 {
256 _RewardPlayer(member, isDungeon);
257 // Xinef: only count players
258 //if (_victim->IsPlayer())
259 // member->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, _victim);
260 }
261 }
262 }
263 }
264 }
265}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
bool isRaidGroup() const
Definition Group.cpp:2281
void _RewardPlayer(Player *player, bool isDungeon)
Definition KillRewarder.cpp:195
void _InitXP(Player *player)
Definition KillRewarder.cpp:123
uint32 GetMapId() const
Definition Position.h:281
float xp_in_group_rate(uint32 count, bool isRaid)
Definition Formulas.h:119

References _count, _group, _groupRate, _InitXP(), _isBattleGround, _isPvP, _killer, _maxLevel, _maxNotGrayMember, _RewardPlayer(), _victim, _xp, Group::GetFirstMember(), WorldLocation::GetMapId(), Player::IsAtGroupRewardDistance(), Group::isRaidGroup(), sMapStore, and Acore::XP::xp_in_group_rate().

Referenced by Reward().

◆ _RewardHonor()

void KillRewarder::_RewardHonor ( Player player)
private
141{
142 // Rewarded player must be alive.
143 if (player->IsAlive())
144 player->RewardHonor(_victim, _count, -1);
145}
bool RewardHonor(Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
Definition Player.cpp:6141
bool IsAlive() const
Definition Unit.h:1773

References _count, _victim, Unit::IsAlive(), and Player::RewardHonor().

Referenced by _RewardPlayer().

◆ _RewardKillCredit()

void KillRewarder::_RewardKillCredit ( Player player)
private
185{
186 // 4.4. Give kill credit (player must not be in group, or he must be alive or without corpse).
187 if (!_group || player->IsAlive() || !player->GetCorpse())
188 if (Creature* target = _victim->ToCreature())
189 {
190 player->KilledMonster(target->GetCreatureTemplate(), target->GetGUID());
191 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE, target->GetCreatureType(), 1, target);
192 }
193}
@ ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE
Definition DBCEnums.h:188
Definition Creature.h:47
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2163
void KilledMonster(CreatureTemplate const *cInfo, ObjectGuid guid)
Definition PlayerQuest.cpp:1913
Corpse * GetCorpse() const
Definition Player.cpp:4697

References _group, _victim, ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE, Player::GetCorpse(), Unit::IsAlive(), Player::KilledMonster(), Object::ToCreature(), and Player::UpdateAchievementCriteria().

Referenced by _RewardPlayer().

◆ _RewardPlayer()

void KillRewarder::_RewardPlayer ( Player player,
bool  isDungeon 
)
private
196{
197 // 4. Reward player.
198 if (!_isBattleGround)
199 {
200 // 4.1. Give honor (player must be alive and not on BG).
201 _RewardHonor(player);
202 // 4.1.1 Send player killcredit for quests with PlayerSlain
203 if (_victim->IsPlayer())
204 player->KilledPlayerCredit();
205 }
206
207 // Give XP only in PvE or in battlegrounds.
208 // Give reputation and kill credit only in PvE.
209 if (!_isPvP || _isBattleGround)
210 {
211 float xpRate = _group ? _groupRate * float(player->GetLevel()) / _aliveSumLevel : /*Personal rate is 100%.*/ 1.0f; // Group rate depends on the sum of levels.
212 sScriptMgr->OnPlayerRewardKillRewarder(player, this, isDungeon, xpRate); // Personal rate is 100%.
213
214 if (_xp)
215 {
216 // 4.2. Give XP.
217 _RewardXP(player, xpRate);
218 }
219 if (!_isBattleGround)
220 {
221 // If killer is in dungeon then all members receive full reputation at kill.
222 _RewardReputation(player);
223 _RewardKillCredit(player);
224 }
225 }
226}
#define sScriptMgr
Definition ScriptMgr.h:719
void _RewardReputation(Player *player)
Definition KillRewarder.cpp:177
void _RewardHonor(Player *player)
Definition KillRewarder.cpp:140
void _RewardXP(Player *player, float rate)
Definition KillRewarder.cpp:147
void _RewardKillCredit(Player *player)
Definition KillRewarder.cpp:184
void KilledPlayerCredit(uint16 count=1)
Definition PlayerQuest.cpp:1993

References _aliveSumLevel, _group, _groupRate, _isBattleGround, _isPvP, _RewardHonor(), _RewardKillCredit(), _RewardReputation(), _RewardXP(), _victim, _xp, Unit::GetLevel(), Object::IsPlayer(), Player::KilledPlayerCredit(), and sScriptMgr.

Referenced by _RewardGroup(), and Reward().

◆ _RewardReputation()

void KillRewarder::_RewardReputation ( Player player)
private
178{
179 // 4.3. Give reputation (player must not be on BG).
180 // Even dead players and corpses are rewarded.
181 player->RewardReputation(_victim);
182}
void RewardReputation(Unit *victim)
Definition Player.cpp:6019

References _victim, and Player::RewardReputation().

Referenced by _RewardPlayer().

◆ _RewardXP()

void KillRewarder::_RewardXP ( Player player,
float  rate 
)
private
148{
149 uint32 xp(_xp);
150 if (_group)
151 {
152 // 4.2.1. If player is in group, adjust XP:
153 // * set to 0 if player's level is more than maximum level of not gray member;
154 // * cut XP in half if _isFullXP is false.
155 if (_maxNotGrayMember && player->IsAlive() &&
156 _maxNotGrayMember->GetLevel() >= player->GetLevel())
157 xp = _isFullXP ?
158 uint32(xp * rate) : // Reward FULL XP if all group members are not gray.
159 uint32(xp * rate / 2) + 1; // Reward only HALF of XP if some of group members are gray.
160 else
161 xp = 0;
162 }
163 if (xp)
164 {
165 // 4.2.2. Apply auras modifying rewarded XP (SPELL_AURA_MOD_XP_PCT).
167
168 // 4.2.3. Give XP to player.
169 sScriptMgr->OnPlayerGiveXP(player, xp, _victim, PlayerXPSource::XPSOURCE_KILL);
170 player->GiveXP(xp, _victim, _groupRate);
171 if (Pet* pet = player->GetPet())
172 // 4.2.4. If player has pet, reward pet with XP (100% for single player, 50% for group case).
173 pet->GivePetXP(_group ? xp / 2 : xp);
174 }
175}
@ XPSOURCE_KILL
Definition Player.h:1004
@ SPELL_AURA_MOD_XP_PCT
Definition SpellAuraDefines.h:263
Definition Pet.h:41
Pet * GetPet() const
Definition Player.cpp:8997
void GiveXP(uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
Definition Player.cpp:2365
float GetTotalAuraMultiplier(AuraType auratype) const
Definition Unit.cpp:6131

References _group, _groupRate, _isFullXP, _maxNotGrayMember, _victim, _xp, Unit::GetLevel(), Player::GetPet(), Unit::GetTotalAuraMultiplier(), Player::GiveXP(), Unit::IsAlive(), SPELL_AURA_MOD_XP_PCT, sScriptMgr, and XPSOURCE_KILL.

Referenced by _RewardPlayer().

◆ GetKiller()

Player * KillRewarder::GetKiller ( )
300{
301 return _killer;
302}

References _killer.

◆ GetVictim()

Unit * KillRewarder::GetVictim ( )
295{
296 return _victim;
297}

References _victim.

◆ Reward()

void KillRewarder::Reward ( )
268{
269 // 3. Reward killer (and group, if necessary).
270 if (_group)
271 // 3.1. If killer is in group, reward group.
272 _RewardGroup();
273 else
274 {
275 // 3.2. Reward single killer (not group case).
276 // 3.2.1. Initialize initial XP amount based on killer's level.
278 // To avoid unnecessary calculations and calls,
279 // proceed only if XP is not ZERO or player is not on battleground
280 // (battleground rewards only XP, that's why).
281 if (!_isBattleGround || _xp)
282 // 3.2.2. Reward killer.
283 if (_killer->IsInMap(_victim)) // pussywizard: killer may be on other map (crashfix), when killing in a group same map is required, so its not a problem
284 _RewardPlayer(_killer, false);
285 }
286
287 // 5. Credit instance encounter.
288 if (Creature* victim = _victim->ToCreature())
289 if (victim->IsDungeonBoss())
290 if (Map* map = _victim->FindMap())
291 map->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, _victim->GetEntry(), _victim);
292}
@ ENCOUNTER_CREDIT_KILL_CREATURE
Definition Map.h:158
void _RewardGroup()
Definition KillRewarder.cpp:228
Definition Map.h:163
uint32 GetEntry() const
Definition Object.h:116
Map * FindMap() const
Definition Object.h:621
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1311

References _group, _InitXP(), _isBattleGround, _killer, _RewardGroup(), _RewardPlayer(), _victim, _xp, ENCOUNTER_CREDIT_KILL_CREATURE, WorldObject::FindMap(), Object::GetEntry(), WorldObject::IsInMap(), and Object::ToCreature().

Referenced by Player::RewardPlayerAndGroupAtKill().

Member Data Documentation

◆ _aliveSumLevel

uint32 KillRewarder::_aliveSumLevel
private

Referenced by _InitGroupData(), and _RewardPlayer().

◆ _count

uint32 KillRewarder::_count
private

◆ _group

Group* KillRewarder::_group
private

◆ _groupRate

float KillRewarder::_groupRate
private

◆ _isBattleGround

bool KillRewarder::_isBattleGround
private

◆ _isFullXP

bool KillRewarder::_isFullXP
private

Referenced by _InitGroupData(), and _RewardXP().

◆ _isPvP

bool KillRewarder::_isPvP
private

◆ _killer

Player* KillRewarder::_killer
private

◆ _maxLevel

uint8 KillRewarder::_maxLevel
private

Referenced by _InitGroupData(), and _RewardGroup().

◆ _maxNotGrayMember

Player* KillRewarder::_maxNotGrayMember
private

◆ _sumLevel

uint32 KillRewarder::_sumLevel
private

Referenced by _InitGroupData().

◆ _victim

◆ _xp

uint32 KillRewarder::_xp
private

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