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 ()
 
uint8 _GetPlayerLevel (Player const *player)
 

Private Attributes

Player_killer
 
Unit_victim
 
Group_group
 
float _groupRate
 
Player_maxNotGrayMember
 
uint8 _maxNotGrayMemberLevel
 
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 
)
68 :
69// 1. Initialize internal variables to default values.
70 _killer(killer), _victim(victim), _group(killer->GetGroup()),
72 _isFullXP(false), _maxLevel(0), _isBattleGround(isBattleGround), _isPvP(false)
73{
74 // mark the credit as pvp if victim is player
75 if (victim->IsPlayer())
76 _isPvP = true;
77 // or if its owned by player and its not a vehicle
78 else if (victim->GetCharmerOrOwnerGUID().IsPlayer())
79 _isPvP = !victim->IsVehicle();
80
82}
uint8 _maxLevel
Definition KillRewarder.h:59
uint32 _count
Definition KillRewarder.h:54
uint8 _maxNotGrayMemberLevel
Definition KillRewarder.h:53
float _groupRate
Definition KillRewarder.h:51
uint32 _xp
Definition KillRewarder.h:57
uint32 _aliveSumLevel
Definition KillRewarder.h:55
uint32 _sumLevel
Definition KillRewarder.h:56
Player * _maxNotGrayMember
Definition KillRewarder.h:52
Unit * _victim
Definition KillRewarder.h:49
Player * _killer
Definition KillRewarder.h:48
bool _isBattleGround
Definition KillRewarder.h:60
Group * _group
Definition KillRewarder.h:50
void _InitGroupData()
Definition KillRewarder.cpp:84
bool _isFullXP
Definition KillRewarder.h:58
bool _isPvP
Definition KillRewarder.h:61
bool IsPlayer() const
Definition ObjectGuid.h:168
bool IsPlayer() const
Definition Object.h:201
Group * GetGroup()
Definition Player.h:2509
bool IsVehicle() const
Definition Unit.h:800
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1295

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

Member Function Documentation

◆ _GetPlayerLevel()

uint8 KillRewarder::_GetPlayerLevel ( Player const *  player)
private
283{
284 uint8 level = player->GetLevel();
285 sScriptMgr->OnPlayerBeforeGetLevelForXPGain(player, level);
286 return level;
287}
std::uint8_t uint8
Definition Define.h:109
#define sScriptMgr
Definition ScriptMgr.h:740

References Unit::GetLevel(), and sScriptMgr.

Referenced by _InitGroupData(), _RewardPlayer(), and _RewardXP().

◆ _InitGroupData()

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

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

Referenced by KillRewarder().

◆ _InitXP()

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

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
244{
245 if (_maxLevel)
246 {
248 // 3.1.1. Initialize initial XP amount based on maximum level of group member,
249 // for whom victim is not gray.
251 // To avoid unnecessary calculations and calls,
252 // proceed only if XP is not ZERO or player is not on battleground
253 // (battleground rewards only XP, that's why).
254 if (!_isBattleGround || _xp)
255 {
256 const bool isDungeon = !_isPvP && sMapStore.LookupEntry(_killer->GetMapId())->IsDungeon();
257 if (!_isBattleGround)
258 {
259 // 3.1.2. Alter group rate if group is in raid (not for battlegrounds).
260 const bool isRaid = !_isPvP && sMapStore.LookupEntry(_killer->GetMapId())->IsRaid() && _group->isRaidGroup();
262 }
263
264 // 3.1.3. Reward each group member (even dead or corpse) within reward distance.
265 for (GroupReference* itr = _group->GetFirstMember(); itr != nullptr; itr = itr->next())
266 {
267 if (Player* member = itr->GetSource())
268 {
269 if (_killer == member || member->IsAtGroupRewardDistance(_victim))
270 {
271 _RewardPlayer(member, isDungeon);
272 // Xinef: only count players
273 //if (_victim->IsPlayer())
274 // member->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_SPECIAL_PVP_KILL, 1, 0, _victim);
275 }
276 }
277 }
278 }
279 }
280}
DBCStorage< MapEntry > sMapStore(MapEntryfmt)
bool isRaidGroup() const
Definition Group.cpp:2346
void _RewardPlayer(Player *player, bool isDungeon)
Definition KillRewarder.cpp:210
void _InitXP(Player *player)
Definition KillRewarder.cpp:125
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
143{
144 // Rewarded player must be alive.
145 if (player->IsAlive())
146 player->RewardHonor(_victim, _count, -1);
147}
bool RewardHonor(Unit *victim, uint32 groupsize, int32 honor=-1, bool awardXP=true)
Definition Player.cpp:6106
bool IsAlive() const
Definition Unit.h:1797

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

Referenced by _RewardPlayer().

◆ _RewardKillCredit()

void KillRewarder::_RewardKillCredit ( Player player)
private
200{
201 // 4.4. Give kill credit (player must not be in group, or he must be alive or without corpse).
202 if (!_group || player->IsAlive() || !player->GetCorpse())
203 if (Creature* target = _victim->ToCreature())
204 {
205 player->KilledMonster(target->GetCreatureTemplate(), target->GetGUID());
206 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_KILL_CREATURE_TYPE, target->GetCreatureType(), 1, target);
207 }
208}
@ 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:2174
void KilledMonster(CreatureTemplate const *cInfo, ObjectGuid guid)
Definition PlayerQuest.cpp:1951
Corpse * GetCorpse() const
Definition Player.cpp:4631

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
211{
212 // 4. Reward player.
213 if (!_isBattleGround)
214 {
215 // 4.1. Give honor (player must be alive and not on BG).
216 _RewardHonor(player);
217 // 4.1.1 Send player killcredit for quests with PlayerSlain
218 if (_victim->IsPlayer())
219 player->KilledPlayerCredit();
220 }
221
222 // Give XP only in PvE or in battlegrounds.
223 // Give reputation and kill credit only in PvE.
224 if (!_isPvP || _isBattleGround)
225 {
226 float xpRate = _group ? _groupRate * float(_GetPlayerLevel(player)) / _aliveSumLevel : /*Personal rate is 100%.*/ 1.0f; // Group rate depends on the sum of levels.
227 sScriptMgr->OnPlayerRewardKillRewarder(player, this, isDungeon, xpRate); // Personal rate is 100%.
228
229 if (_xp)
230 {
231 // 4.2. Give XP.
232 _RewardXP(player, xpRate);
233 }
234 if (!_isBattleGround)
235 {
236 // If killer is in dungeon then all members receive full reputation at kill.
237 _RewardReputation(player);
238 _RewardKillCredit(player);
239 }
240 }
241}
void _RewardReputation(Player *player)
Definition KillRewarder.cpp:192
void _RewardHonor(Player *player)
Definition KillRewarder.cpp:142
void _RewardXP(Player *player, float rate)
Definition KillRewarder.cpp:149
void _RewardKillCredit(Player *player)
Definition KillRewarder.cpp:199
void KilledPlayerCredit(uint16 count=1)
Definition PlayerQuest.cpp:2031

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

Referenced by _RewardGroup(), and Reward().

◆ _RewardReputation()

void KillRewarder::_RewardReputation ( Player player)
private
193{
194 // 4.3. Give reputation (player must not be on BG).
195 // Even dead players and corpses are rewarded.
196 player->RewardReputation(_victim);
197}
void RewardReputation(Unit *victim)
Definition Player.cpp:5957

References _victim, and Player::RewardReputation().

Referenced by _RewardPlayer().

◆ _RewardXP()

void KillRewarder::_RewardXP ( Player player,
float  rate 
)
private
150{
151 uint32 xp(_xp);
152 if (_group)
153 {
154 // 4.2.1. If player is in group, adjust XP:
155 // * set to 0 if player's level is more than maximum level of not gray member;
156 // * cut XP in half if _isFullXP is false.
157 if (_maxNotGrayMember && player->IsAlive() &&
159 xp = _isFullXP ?
160 uint32(xp * rate) : // Reward FULL XP if all group members are not gray.
161 uint32(xp * rate / 2) + 1; // Reward only HALF of XP if some of group members are gray.
162 else
163 xp = 0;
164 }
165
166 // An ungrouped helper who out-levels everyone eligible for the kill and for
167 // whom the victim is gray halves the tagger's XP, matching the group
168 // gray-member penalty. Closes a power-leveling exploit.
169 if (xp)
170 if (Creature* creature = _victim->ToCreature())
171 {
172 uint8 const referenceLevel = _group ? _maxLevel : player->GetLevel();
173 uint8 const highestLevel = creature->GetHighestPlayerAttackerLevel();
174 if (highestLevel > referenceLevel && creature->GetLevel() <= Acore::XP::GetGrayLevel(highestLevel))
175 xp = xp / 2 + 1;
176 }
177
178 if (xp)
179 {
180 // 4.2.2. Apply auras modifying rewarded XP (SPELL_AURA_MOD_XP_PCT).
182
183 // 4.2.3. Give XP to player.
184 sScriptMgr->OnPlayerGiveXP(player, xp, _victim, PlayerXPSource::XPSOURCE_KILL);
185 player->GiveXP(xp, _victim, _groupRate);
186 if (Pet* pet = player->GetPet())
187 // 4.2.4. If player has pet, reward pet with XP (100% for single player, 50% for group case).
188 pet->GivePetXP(_group ? xp / 2 : xp);
189 }
190}
@ XPSOURCE_KILL
Definition Player.h:1005
@ SPELL_AURA_MOD_XP_PCT
Definition SpellAuraDefines.h:263
Definition Pet.h:41
Pet * GetPet() const
Definition Player.cpp:8970
void GiveXP(uint32 xp, Unit *victim, float group_rate=1.0f, bool isLFGReward=false)
Definition Player.cpp:2356
float GetTotalAuraMultiplier(AuraType auratype) const
Definition Unit.cpp:6308

References _GetPlayerLevel(), _group, _groupRate, _isFullXP, _maxLevel, _maxNotGrayMember, _maxNotGrayMemberLevel, _victim, _xp, Acore::XP::GetGrayLevel(), Unit::GetLevel(), Player::GetPet(), Unit::GetTotalAuraMultiplier(), Player::GiveXP(), Unit::IsAlive(), SPELL_AURA_MOD_XP_PCT, sScriptMgr, Object::ToCreature(), and XPSOURCE_KILL.

Referenced by _RewardPlayer().

◆ GetKiller()

Player * KillRewarder::GetKiller ( )
322{
323 return _killer;
324}

References _killer.

◆ GetVictim()

Unit * KillRewarder::GetVictim ( )
317{
318 return _victim;
319}

References _victim.

◆ Reward()

void KillRewarder::Reward ( )
290{
291 // 3. Reward killer (and group, if necessary).
292 if (_group)
293 // 3.1. If killer is in group, reward group.
294 _RewardGroup();
295 else
296 {
297 // 3.2. Reward single killer (not group case).
298 // 3.2.1. Initialize initial XP amount based on killer's level.
300 // To avoid unnecessary calculations and calls,
301 // proceed only if XP is not ZERO or player is not on battleground
302 // (battleground rewards only XP, that's why).
303 if (!_isBattleGround || _xp)
304 // 3.2.2. Reward killer.
305 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
306 _RewardPlayer(_killer, false);
307 }
308
309 // 5. Credit instance encounter.
310 if (Creature* victim = _victim->ToCreature())
311 if (victim->IsDungeonBoss())
312 if (Map* map = _victim->FindMap())
313 map->UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, _victim->GetEntry(), _victim);
314}
@ ENCOUNTER_CREDIT_KILL_CREATURE
Definition Map.h:161
void _RewardGroup()
Definition KillRewarder.cpp:243
Definition Map.h:166
uint32 GetEntry() const
Definition Object.h:117
Map * FindMap() const
Definition Object.h:626
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1335

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

◆ _maxNotGrayMember

Player* KillRewarder::_maxNotGrayMember
private

◆ _maxNotGrayMemberLevel

uint8 KillRewarder::_maxNotGrayMemberLevel
private

Referenced by _InitGroupData(), and _RewardXP().

◆ _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: