Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Toggle main menu visibility
Loading...
Searching...
No Matches
Formulas.h
Go to the documentation of this file.
1
/*
2
* This file is part of Project SkyFire https://www.projectskyfire.org.
3
* See LICENSE.md file for Copyright information
4
*/
5
6
#ifndef SKYFIRE_FORMULAS_H
7
#define SKYFIRE_FORMULAS_H
8
9
#include "
CurrencyFormulas.h
"
10
#include "
Player.h
"
11
#include "
ScriptMgr.h
"
12
#include "
SharedDefines.h
"
13
#include "
World.h
"
14
15
namespace
Skyfire
16
{
17
namespace
Honor
18
{
19
inline
float
hk_honor_at_level_f
(
uint8
level,
float
multiplier = 1.0f)
20
{
21
float
honor = multiplier * level * 1.55f;
22
sScriptMgr
->OnHonorCalculation(honor, level, multiplier);
23
return
honor;
24
}
25
26
inline
uint32
hk_honor_at_level
(
uint8
level,
float
multiplier = 1.0f)
27
{
28
return
uint32
(ceil(
hk_honor_at_level_f
(level, multiplier)));
29
}
30
}
// namespace Skyfire::Honor
31
32
namespace
XP
33
{
34
inline
uint8
GetGrayLevel
(
uint8
pl_level)
35
{
36
uint8
level;
37
38
if
(pl_level <= 5)
39
level = 0;
40
else
if
(pl_level <= 39)
41
level = pl_level - 5 - pl_level / 10;
42
else
if
(pl_level <= 59)
43
level = pl_level - 1 - pl_level / 5;
44
else
45
level = pl_level - 9;
46
47
sScriptMgr
->OnGrayLevelCalculation(level, pl_level);
48
return
level;
49
}
50
51
inline
XPColorChar
GetColorCode
(
uint8
pl_level,
uint8
mob_level)
52
{
53
XPColorChar
color;
54
55
if
(mob_level >= pl_level + 5)
56
color =
XP_RED
;
57
else
if
(mob_level >= pl_level + 3)
58
color =
XP_ORANGE
;
59
else
if
(mob_level >= pl_level - 2)
60
color =
XP_YELLOW
;
61
else
if
(mob_level >
GetGrayLevel
(pl_level))
62
color =
XP_GREEN
;
63
else
64
color =
XP_GRAY
;
65
66
sScriptMgr
->OnColorCodeCalculation(color, pl_level, mob_level);
67
return
color;
68
}
69
70
inline
uint8
GetZeroDifference
(
uint8
pl_level)
71
{
72
uint8
diff;
73
74
if
(pl_level < 8)
75
diff = 5;
76
else
if
(pl_level < 10)
77
diff = 6;
78
else
if
(pl_level < 12)
79
diff = 7;
80
else
if
(pl_level < 16)
81
diff = 8;
82
else
if
(pl_level < 20)
83
diff = 9;
84
else
if
(pl_level < 30)
85
diff = 11;
86
else
if
(pl_level < 40)
87
diff = 12;
88
else
if
(pl_level < 45)
89
diff = 13;
90
else
if
(pl_level < 50)
91
diff = 14;
92
else
if
(pl_level < 55)
93
diff = 15;
94
else
if
(pl_level < 60)
95
diff = 16;
96
else
97
diff = 17;
98
99
sScriptMgr
->OnZeroDifferenceCalculation(diff, pl_level);
100
return
diff;
101
}
102
103
inline
uint32
BaseGain
(
uint8
pl_level,
uint8
mob_level,
ContentLevels
content)
104
{
105
uint32
baseGain;
106
uint32
nBaseExp;
107
108
switch
(content)
109
{
110
case
CONTENT_1_60
:
111
nBaseExp = 45;
112
break
;
113
case
CONTENT_61_70
:
114
nBaseExp = 235;
115
break
;
116
case
CONTENT_71_80
:
117
nBaseExp = 580;
118
break
;
119
case
CONTENT_81_85
:
120
nBaseExp = 1878;
121
break
;
122
case
CONTENT_86_90
:
123
nBaseExp = 7194;
124
break
;
125
default
:
126
SF_LOG_ERROR
(
"misc"
,
"BaseGain: Unsupported content level %u"
, content);
127
nBaseExp = 45;
128
break
;
129
}
130
131
if
(mob_level >= pl_level)
132
{
133
uint8
nLevelDiff = mob_level - pl_level;
134
if
(nLevelDiff > 4)
135
nLevelDiff = 4;
136
137
baseGain = ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2;
138
}
139
else
140
{
141
uint8
gray_level =
GetGrayLevel
(pl_level);
142
if
(mob_level > gray_level)
143
{
144
uint8
ZD =
GetZeroDifference
(pl_level);
145
baseGain = (pl_level * 5 + nBaseExp) * (ZD + mob_level - pl_level) / ZD;
146
}
147
else
148
baseGain = 0;
149
}
150
151
sScriptMgr
->OnBaseGainCalculation(baseGain, pl_level, mob_level, content);
152
return
baseGain;
153
}
154
155
inline
uint32
Gain
(
Player
* player,
Unit
* u)
156
{
157
uint32
gain;
158
159
if
(u->
GetTypeId
() ==
TypeID::TYPEID_UNIT
&&
160
(((
Creature
*)u)->IsTotem() || ((
Creature
*)u)->IsPet() ||
161
(((
Creature
*)u)->GetCreatureTemplate()->flags_extra &
CREATURE_FLAG_EXTRA_NO_XP_AT_KILL
) ||
162
((
Creature
*)u)->GetCreatureTemplate()->type ==
CREATURE_TYPE_CRITTER
))
163
gain = 0;
164
else
165
{
166
gain =
BaseGain
(player->
getLevel
(), u->
getLevel
(),
GetContentLevelsForMapAndZone
(u->
GetMapId
(), u->
GetZoneId
()));
167
168
if
(gain != 0 && u->
GetTypeId
() ==
TypeID::TYPEID_UNIT
&& ((
Creature
*)u)->isElite())
169
{
170
// Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus.
171
if
(u->
GetMap
() && u->
GetMap
()->
IsInstance
())
172
gain =
uint32
(gain * 2.75);
173
else
174
gain *= 2;
175
}
176
177
gain =
uint32
(gain *
sWorld
->getRate(
Rates::RATE_XP_KILL
));
178
}
179
180
sScriptMgr
->OnGainCalculation(gain, player, u);
181
return
gain;
182
}
183
184
inline
float
xp_in_group_rate
(
uint32
count,
bool
isRaid)
185
{
186
float
rate;
187
188
if
(isRaid)
189
{
190
// FIXME: Must apply decrease modifiers depending on raid size.
191
rate = 1.0f;
192
}
193
else
194
{
195
switch
(count)
196
{
197
case
0:
198
case
1:
199
case
2:
200
rate = 1.0f;
201
break
;
202
case
3:
203
rate = 1.166f;
204
break
;
205
case
4:
206
rate = 1.3f;
207
break
;
208
case
5:
209
default
:
210
rate = 1.4f;
211
}
212
}
213
214
sScriptMgr
->OnGroupRateCalculation(rate, count, isRaid);
215
return
rate;
216
}
217
}
// namespace Skyfire::XP
218
}
// namespace Skyfire
219
220
#endif
CREATURE_FLAG_EXTRA_NO_XP_AT_KILL
@ CREATURE_FLAG_EXTRA_NO_XP_AT_KILL
Definition
Creature.h:35
CurrencyFormulas.h
GetContentLevelsForMapAndZone
ContentLevels GetContentLevelsForMapAndZone(uint32 mapid, uint32 zoneId)
Definition
DBCStores.cpp:1069
ContentLevels
ContentLevels
Definition
DBCStores.h:37
CONTENT_61_70
@ CONTENT_61_70
Definition
DBCStores.h:39
CONTENT_71_80
@ CONTENT_71_80
Definition
DBCStores.h:40
CONTENT_1_60
@ CONTENT_1_60
Definition
DBCStores.h:38
CONTENT_86_90
@ CONTENT_86_90
Definition
DBCStores.h:42
CONTENT_81_85
@ CONTENT_81_85
Definition
DBCStores.h:41
uint8
std::uint8_t uint8
Definition
Define.h:79
uint32
std::uint32_t uint32
Definition
Define.h:77
SF_LOG_ERROR
#define SF_LOG_ERROR(filterType__,...)
Definition
Log.h:143
TypeID::TYPEID_UNIT
@ TYPEID_UNIT
Definition
Object.h:54
Player.h
ScriptMgr.h
sScriptMgr
#define sScriptMgr
Definition
ScriptMgr.h:764
SharedDefines.h
CREATURE_TYPE_CRITTER
@ CREATURE_TYPE_CRITTER
Definition
SharedDefines.h:3081
XPColorChar
XPColorChar
Definition
SharedDefines.h:4120
XP_GREEN
@ XP_GREEN
Definition
SharedDefines.h:4124
XP_GRAY
@ XP_GRAY
Definition
SharedDefines.h:4125
XP_YELLOW
@ XP_YELLOW
Definition
SharedDefines.h:4123
XP_RED
@ XP_RED
Definition
SharedDefines.h:4121
XP_ORANGE
@ XP_ORANGE
Definition
SharedDefines.h:4122
World.h
Creature
Definition
Creature.h:427
Map::IsInstance
bool IsInstance() const
Definition
Map.h:368
Object::GetTypeId
TypeID GetTypeId() const
Definition
Object.h:131
Player
Definition
Player.h:1289
Unit
Definition
Unit.h:1367
Unit::getLevel
uint8 getLevel() const
Definition
Unit.h:1528
WorldLocation::GetMapId
uint32 GetMapId() const
Definition
Object.h:546
WorldObject::GetMap
Map * GetMap() const
Definition
Object.h:740
WorldObject::GetZoneId
uint32 GetZoneId() const
Definition
Object.cpp:1597
sWorld
#define sWorld
Definition
World.h:910
Rates::RATE_XP_KILL
@ RATE_XP_KILL
Definition
World.h:397
Skyfire::Honor
Definition
Formulas.h:18
Skyfire::Honor::hk_honor_at_level
uint32 hk_honor_at_level(uint8 level, float multiplier=1.0f)
Definition
Formulas.h:26
Skyfire::Honor::hk_honor_at_level_f
float hk_honor_at_level_f(uint8 level, float multiplier=1.0f)
Definition
Formulas.h:19
Skyfire::XP
Definition
Formulas.h:33
Skyfire::XP::xp_in_group_rate
float xp_in_group_rate(uint32 count, bool isRaid)
Definition
Formulas.h:184
Skyfire::XP::GetGrayLevel
uint8 GetGrayLevel(uint8 pl_level)
Definition
Formulas.h:34
Skyfire::XP::BaseGain
uint32 BaseGain(uint8 pl_level, uint8 mob_level, ContentLevels content)
Definition
Formulas.h:103
Skyfire::XP::Gain
uint32 Gain(Player *player, Unit *u)
Definition
Formulas.h:155
Skyfire::XP::GetColorCode
XPColorChar GetColorCode(uint8 pl_level, uint8 mob_level)
Definition
Formulas.h:51
Skyfire::XP::GetZeroDifference
uint8 GetZeroDifference(uint8 pl_level)
Definition
Formulas.h:70
Skyfire
Definition
AuthPatchTransfer.h:12
src
server
game
Miscellaneous
Formulas.h
Generated on
for Project SkyFire Core by
1.17.0