AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Acore::XP Namespace Reference

Functions

uint8 GetGrayLevel (uint8 pl_level)
 
XPColorChar GetColorCode (uint8 pl_level, uint8 mob_level)
 
uint8 GetZeroDifference (uint8 pl_level)
 
uint32 BaseGain (uint8 pl_level, uint8 mob_level, ContentLevels content)
 
uint32 Gain (Player *player, Unit *unit, bool isBattleGround=false)
 
float xp_in_group_rate (uint32 count, bool isRaid)
 

Function Documentation

◆ BaseGain()

uint32 Acore::XP::BaseGain ( uint8  pl_level,
uint8  mob_level,
ContentLevels  content 
)
27{
28 uint32 baseGain;
29 uint32 nBaseExp;
30
31 switch (content)
32 {
33 case CONTENT_1_60:
34 nBaseExp = 45;
35 break;
36 case CONTENT_61_70:
37 nBaseExp = 235;
38 break;
39 case CONTENT_71_80:
40 nBaseExp = 580;
41 break;
42 default:
43 LOG_ERROR("misc", "BaseGain: Unsupported content level {}", content);
44 nBaseExp = 45;
45 break;
46 }
47
48 if (mob_level >= pl_level)
49 {
50 uint8 nLevelDiff = mob_level - pl_level;
51 if (nLevelDiff > 4)
52 nLevelDiff = 4;
53
54 baseGain = ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2;
55 }
56 else
57 {
58 uint8 gray_level = GetGrayLevel(pl_level);
59 if (mob_level > gray_level)
60 {
61 uint8 ZD = GetZeroDifference(pl_level);
62 baseGain = (pl_level * 5 + nBaseExp) * (ZD + mob_level - pl_level) / ZD;
63 }
64 else
65 baseGain = 0;
66 }
67
68 //sScriptMgr->OnBaseGainCalculation(baseGain, pl_level, mob_level, content); // pussywizard: optimization
69 return baseGain;
70}
@ CONTENT_61_70
Definition DBCStores.h:43
@ CONTENT_71_80
Definition DBCStores.h:44
@ CONTENT_1_60
Definition DBCStores.h:42
std::uint8_t uint8
Definition Define.h:109
std::uint32_t uint32
Definition Define.h:107
#define LOG_ERROR(filterType__,...)
Definition Log.h:157

References CONTENT_1_60, CONTENT_61_70, CONTENT_71_80, GetGrayLevel(), GetZeroDifference(), and LOG_ERROR.

Referenced by Gain(), and TEST().

◆ Gain()

uint32 Acore::XP::Gain ( Player player,
Unit unit,
bool  isBattleGround = false 
)
73{
74 Creature* creature = unit->ToCreature();
75 uint32 gain = 0;
76
77 if (!creature || (!creature->IsTotem() && !creature->IsPet() && !creature->IsCritter() &&
79 {
80 float xpMod = 1.0f;
81
82 gain = BaseGain(player->GetLevel(), unit->GetLevel(), GetContentLevelsForMapAndZone(unit->GetMapId(), unit->GetZoneId()));
83
84 if (gain && creature)
85 {
86 if (creature->isElite())
87 {
88 // Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus.
89 if (unit->GetMap() && unit->GetMap()->IsDungeon())
90 xpMod *= 2.75f;
91 else
92 xpMod *= 2.0f;
93 }
94
95 xpMod *= creature->GetCreatureTemplate()->ModExperience;
96 }
97
98 if (isBattleGround)
99 {
100 switch (player->GetMapId())
101 {
103 xpMod *= sWorld->getRate(RATE_XP_BG_KILL_AV);
104 break;
106 xpMod *= sWorld->getRate(RATE_XP_BG_KILL_WSG);
107 break;
108 case MAP_ARATHI_BASIN:
109 xpMod *= sWorld->getRate(RATE_XP_BG_KILL_AB);
110 break;
112 xpMod *= sWorld->getRate(RATE_XP_BG_KILL_EOTS);
113 break;
115 xpMod *= sWorld->getRate(RATE_XP_BG_KILL_SOTA);
116 break;
118 xpMod *= sWorld->getRate(RATE_XP_BG_KILL_IC);
119 break;
120 }
121 }
122 else
123 {
124 xpMod *= sWorld->getRate(RATE_XP_KILL);
125 }
126
127 // if players dealt less than 50% of the damage and were credited anyway (due to CREATURE_FLAG_EXTRA_NO_PLAYER_DAMAGE_REQ), scale XP gained appropriately (linear scaling)
128 if (creature && creature->GetPlayerDamageReq())
129 {
130 xpMod *= 1.0f - 2.0f * creature->GetPlayerDamageReq() / creature->GetMaxHealth();
131 }
132
133 gain = uint32(gain * xpMod);
134 }
135
136 //sScriptMgr->OnGainCalculation(gain, player, u); // pussywizard: optimization
137 return gain;
138}
@ MAP_STRAND_OF_THE_ANCIENTS
Definition AreaDefines.h:255
@ MAP_ARATHI_BASIN
Definition AreaDefines.h:214
@ MAP_ISLE_OF_CONQUEST
Definition AreaDefines.h:263
@ MAP_ALTERAC_VALLEY
Definition AreaDefines.h:187
@ MAP_EYE_OF_THE_STORM
Definition AreaDefines.h:239
@ MAP_WARSONG_GULCH
Definition AreaDefines.h:212
@ CREATURE_FLAG_EXTRA_NO_XP
Definition CreatureData.h:51
ContentLevels GetContentLevelsForMapAndZone(uint32 mapid, uint32 zoneId)
Definition DBCStores.cpp:714
@ RATE_XP_KILL
Definition IWorld.h:475
@ RATE_XP_BG_KILL_SOTA
Definition IWorld.h:480
@ RATE_XP_BG_KILL_WSG
Definition IWorld.h:477
@ RATE_XP_BG_KILL_AB
Definition IWorld.h:478
@ RATE_XP_BG_KILL_EOTS
Definition IWorld.h:479
@ RATE_XP_BG_KILL_IC
Definition IWorld.h:481
@ RATE_XP_BG_KILL_AV
Definition IWorld.h:476
Definition Creature.h:43
bool HasFlagsExtra(uint32 flag) const
Definition Creature.h:73
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:209
uint32 GetPlayerDamageReq() const
Definition Creature.cpp:3848
bool isElite() const
Definition Creature.h:112
bool IsDungeon() const
Definition Map.h:295
Creature * ToCreature()
Definition Object.h:206
bool IsPet() const
Definition Unit.h:747
uint32 GetMaxHealth() const
Definition Unit.h:1030
bool IsCritter() const
Definition Unit.h:783
bool IsTotem() const
Definition Unit.h:749
uint8 GetLevel() const
Definition Unit.h:1024
uint32 GetMapId() const
Definition Position.h:280
Map * GetMap() const
Definition Object.h:537
uint32 GetZoneId() const
Definition Object.cpp:3148
#define sWorld
Definition World.h:357
uint32 BaseGain(uint8 pl_level, uint8 mob_level, ContentLevels content)
Definition Formulas.cpp:26
float ModExperience
Definition CreatureData.h:240

References BaseGain(), CREATURE_FLAG_EXTRA_NO_XP, GetContentLevelsForMapAndZone(), Creature::GetCreatureTemplate(), Unit::GetLevel(), WorldObject::GetMap(), WorldLocation::GetMapId(), Unit::GetMaxHealth(), Creature::GetPlayerDamageReq(), WorldObject::GetZoneId(), Creature::HasFlagsExtra(), Unit::IsCritter(), Map::IsDungeon(), Creature::isElite(), Unit::IsPet(), Unit::IsTotem(), MAP_ALTERAC_VALLEY, MAP_ARATHI_BASIN, MAP_EYE_OF_THE_STORM, MAP_ISLE_OF_CONQUEST, MAP_STRAND_OF_THE_ANCIENTS, MAP_WARSONG_GULCH, CreatureTemplate::ModExperience, RATE_XP_BG_KILL_AB, RATE_XP_BG_KILL_AV, RATE_XP_BG_KILL_EOTS, RATE_XP_BG_KILL_IC, RATE_XP_BG_KILL_SOTA, RATE_XP_BG_KILL_WSG, RATE_XP_KILL, sWorld, and Object::ToCreature().

Referenced by KillRewarder::_InitXP().

◆ GetColorCode()

XPColorChar Acore::XP::GetColorCode ( uint8  pl_level,
uint8  mob_level 
)
inline
64 {
65 XPColorChar color;
66
67 if (mob_level >= pl_level + 5)
68 color = XP_RED;
69 else if (mob_level >= pl_level + 3)
70 color = XP_ORANGE;
71 else if (mob_level >= pl_level - 2)
72 color = XP_YELLOW;
73 else if (mob_level > GetGrayLevel(pl_level))
74 color = XP_GREEN;
75 else
76 color = XP_GRAY;
77
78 //sScriptMgr->OnColorCodeCalculation(color, pl_level, mob_level); // pussywizard: optimization
79 return color;
80 }
XPColorChar
Definition SharedDefines.h:3593
@ XP_GREEN
Definition SharedDefines.h:3597
@ XP_GRAY
Definition SharedDefines.h:3598
@ XP_YELLOW
Definition SharedDefines.h:3596
@ XP_RED
Definition SharedDefines.h:3594
@ XP_ORANGE
Definition SharedDefines.h:3595
uint8 GetGrayLevel(uint8 pl_level)
Definition Formulas.h:46

References GetGrayLevel(), XP_GRAY, XP_GREEN, XP_ORANGE, XP_RED, and XP_YELLOW.

Referenced by TEST().

◆ GetGrayLevel()

uint8 Acore::XP::GetGrayLevel ( uint8  pl_level)
inline
47 {
48 uint8 level;
49
50 if (pl_level <= 5)
51 level = 0;
52 else if (pl_level <= 39)
53 level = pl_level - 5 - pl_level / 10;
54 else if (pl_level <= 59)
55 level = pl_level - 1 - pl_level / 5;
56 else
57 level = pl_level - 9;
58
59 //sScriptMgr->OnGrayLevelCalculation(level, pl_level); // pussywizard: optimization
60 return level;
61 }

Referenced by KillRewarder::_InitGroupData(), BaseGain(), Player::CalculateReputationGain(), GetColorCode(), Player::isHonorOrXPTarget(), Player::RewardHonor(), TEST(), and Player::UpdateCombatSkills().

◆ GetZeroDifference()

uint8 Acore::XP::GetZeroDifference ( uint8  pl_level)
inline
83 {
84 uint8 diff;
85
86 if (pl_level < 8)
87 diff = 5;
88 else if (pl_level < 10)
89 diff = 6;
90 else if (pl_level < 12)
91 diff = 7;
92 else if (pl_level < 16)
93 diff = 8;
94 else if (pl_level < 20)
95 diff = 9;
96 else if (pl_level < 30)
97 diff = 11;
98 else if (pl_level < 40)
99 diff = 12;
100 else if (pl_level < 45)
101 diff = 13;
102 else if (pl_level < 50)
103 diff = 14;
104 else if (pl_level < 55)
105 diff = 15;
106 else if (pl_level < 60)
107 diff = 16;
108 else
109 diff = 17;
110
111 //sScriptMgr->OnZeroDifferenceCalculation(diff, pl_level); // pussywizard: optimization
112 return diff;
113 }

Referenced by BaseGain(), and TEST().

◆ xp_in_group_rate()

float Acore::XP::xp_in_group_rate ( uint32  count,
bool  isRaid 
)
inline
120 {
121 float rate;
122
123 if (isRaid)
124 {
125 // FIXME: Must apply decrease modifiers depending on raid size.
126 rate = 1.0f;
127 }
128 else
129 {
130 switch (count)
131 {
132 case 0:
133 case 1:
134 case 2:
135 rate = 1.0f;
136 break;
137 case 3:
138 rate = 1.166f;
139 break;
140 case 4:
141 rate = 1.3f;
142 break;
143 case 5:
144 default:
145 rate = 1.4f;
146 }
147 }
148
149 //sScriptMgr->OnGroupRateCalculation(rate, count, isRaid); // pussywizard: optimization
150 return rate;
151 }

Referenced by KillRewarder::_RewardGroup().