Project SkyFire Core
SkyFire 5.4.8 server core API documentation
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
15namespace 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
Definition Creature.h:35
ContentLevels GetContentLevelsForMapAndZone(uint32 mapid, uint32 zoneId)
ContentLevels
Definition DBCStores.h:37
@ CONTENT_61_70
Definition DBCStores.h:39
@ CONTENT_71_80
Definition DBCStores.h:40
@ CONTENT_1_60
Definition DBCStores.h:38
@ CONTENT_86_90
Definition DBCStores.h:42
@ CONTENT_81_85
Definition DBCStores.h:41
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
@ TYPEID_UNIT
Definition Object.h:54
#define sScriptMgr
Definition ScriptMgr.h:764
@ CREATURE_TYPE_CRITTER
XPColorChar
@ XP_GREEN
@ XP_GRAY
@ XP_YELLOW
@ XP_RED
@ XP_ORANGE
bool IsInstance() const
Definition Map.h:368
TypeID GetTypeId() const
Definition Object.h:131
Definition Unit.h:1367
uint8 getLevel() const
Definition Unit.h:1528
uint32 GetMapId() const
Definition Object.h:546
Map * GetMap() const
Definition Object.h:740
uint32 GetZoneId() const
Definition Object.cpp:1597
#define sWorld
Definition World.h:910
@ RATE_XP_KILL
Definition World.h:397
uint32 hk_honor_at_level(uint8 level, float multiplier=1.0f)
Definition Formulas.h:26
float hk_honor_at_level_f(uint8 level, float multiplier=1.0f)
Definition Formulas.h:19
float xp_in_group_rate(uint32 count, bool isRaid)
Definition Formulas.h:184
uint8 GetGrayLevel(uint8 pl_level)
Definition Formulas.h:34
uint32 BaseGain(uint8 pl_level, uint8 mob_level, ContentLevels content)
Definition Formulas.h:103
uint32 Gain(Player *player, Unit *u)
Definition Formulas.h:155
XPColorChar GetColorCode(uint8 pl_level, uint8 mob_level)
Definition Formulas.h:51
uint8 GetZeroDifference(uint8 pl_level)
Definition Formulas.h:70