SHOW:
|
|
- or go back to the newest paste.
1 | BOOL CMover::AddExperience(EXPINTEGER nExp, BOOL bFirstCall, BOOL bMultiPly, BOOL bMonster) | |
2 | { | |
3 | #ifdef __EXPMODE | |
4 | if (IsSMMode(SM_NOEXP1HR) || IsSMMode(SM_NOEXP30)) { nExp = 0; } | |
5 | #endif | |
6 | if (nExp < 0){ return FALSE; } | |
7 | if (m_nHitPoint <= 0){ return FALSE; } | |
8 | ||
9 | if (IsMaster() || IsHero() || IsLegendHero()){ nExp /= 2; } | |
10 | ||
11 | #if __VER >= 15 // __GUILD_HOUSE | |
12 | if (bFirstCall && bMultiPly) | |
13 | { | |
14 | #ifdef __WORLDSERVER | |
15 | EXPINTEGER nAddExp = static_cast<CUser*>(this)->GetAddExpAfterApplyRestPoint(nExp); | |
16 | nExp = (EXPINTEGER)(nExp * GetExpFactor()); | |
17 | nExp += nAddExp; | |
18 | #endif | |
19 | } | |
20 | #endif | |
21 | ||
22 | if (bFirstCall && HasBuffByIk3(IK3_ANGEL_BUFF)) | |
23 | { | |
24 | int nAngel = 100; | |
25 | #ifdef __BUFF_1107 | |
26 | IBuff* pBuff = m_buffs.GetBuffByIk3(IK3_ANGEL_BUFF); | |
27 | WORD wId = (pBuff ? pBuff->GetId() : 0); | |
28 | #else | |
29 | LPSKILLINFLUENCE lpSkillIn = m_SkillState.GetItemBuf(IK3_ANGEL_BUFF); | |
30 | WORD wId = (lpSkillIn ? lpSkillIn->wID : 0); | |
31 | #endif | |
32 | if (wId > 0) | |
33 | { | |
34 | ItemProp* pItemProp = prj.GetItemProp(wId); | |
35 | if (pItemProp){ nAngel = (int)((float)pItemProp->nAdjParamVal1); } | |
36 | } | |
37 | if (nAngel <= 0 || 100 < nAngel){ nAngel = 100; } | |
38 | ||
39 | EXPINTEGER nMaxAngelExp = prj.m_aExpCharacter[m_nAngelLevel].nExp1 / 100 * nAngel; | |
40 | if (m_nAngelExp < nMaxAngelExp) | |
41 | { | |
42 | nExp /= 2; | |
43 | m_nAngelExp += nExp; | |
44 | #ifdef __WORLDSERVER | |
45 | int nAngelExpPercent = (int)(m_nAngelExp * 100 / nMaxAngelExp); | |
46 | int nNextAngelExpLog = (int)(((CUser*)this)->m_nAngelExpLog / 20 + 1) * 20; | |
47 | ||
48 | if (nAngelExpPercent >= nNextAngelExpLog) | |
49 | { | |
50 | ((CUser*)this)->m_nAngelExpLog = nAngelExpPercent; | |
51 | ItemProp* pItemProp = prj.GetItemProp(wId); | |
52 | ||
53 | if (pItemProp) | |
54 | { | |
55 | LogItemInfo aLogItem; | |
56 | aLogItem.Action = "&"; | |
57 | aLogItem.SendName = ((CUser*)this)->GetName(); | |
58 | aLogItem.RecvName = "ANGEL_EXP_LOG"; | |
59 | aLogItem.WorldId = ((CUser*)this)->GetWorld()->GetID(); | |
60 | aLogItem.Gold = aLogItem.Gold2 = ((CUser*)this)->GetGold(); | |
61 | _stprintf(aLogItem.szItemName, "%d", pItemProp->dwID); | |
62 | aLogItem.Gold_1 = (DWORD)(m_nAngelExp); | |
63 | g_DPSrvr.OnLogItem(aLogItem); | |
64 | } | |
65 | } | |
66 | BOOL bAngelComplete = FALSE; | |
67 | if (m_nAngelExp > nMaxAngelExp) | |
68 | { | |
69 | m_nAngelExp = nMaxAngelExp; | |
70 | bAngelComplete = TRUE; | |
71 | } | |
72 | ((CUser*)this)->AddAngelInfo(bAngelComplete); | |
73 | #endif | |
74 | } | |
75 | } | |
76 | ||
77 | if (IsBaseJob()) | |
78 | { | |
79 | if (m_nLevel >= MAX_JOB_LEVEL) | |
80 | { | |
81 | m_nExp1 = 0; | |
82 | nExp = 0; | |
83 | return false; | |
84 | } | |
85 | } | |
86 | else if (IsExpert()) | |
87 | { | |
88 | if (m_nLevel >= MAX_JOB_LEVEL + MAX_EXP_LEVEL) | |
89 | { | |
90 | m_nExp1 = 0; | |
91 | nExp = 0; | |
92 | return false; | |
93 | } | |
94 | } | |
95 | else if (IsPro()) | |
96 | { | |
97 | if (m_nLevel > MAX_GENERAL_LEVEL) | |
98 | { | |
99 | m_nLevel = MAX_GENERAL_LEVEL; | |
100 | return false; | |
101 | } | |
102 | } | |
103 | else if (IsMaster()) | |
104 | { | |
105 | if (m_nLevel > MAX_GENERAL_LEVEL) | |
106 | { | |
107 | m_nLevel = MAX_GENERAL_LEVEL; | |
108 | - | return true; |
108 | + | |
109 | } | |
110 | } | |
111 | else if (IsHero()) | |
112 | { | |
113 | if (m_nLevel >= MAX_LEGEND_LEVEL) | |
114 | { | |
115 | m_nLevel = MAX_LEGEND_LEVEL; | |
116 | nExp = 0; | |
117 | return false; | |
118 | } | |
119 | } | |
120 | else if (IsLegendHero()) | |
121 | { | |
122 | if (m_nLevel > MAX_3RD_LEGEND_LEVEL) | |
123 | { | |
124 | m_nLevel = MAX_3RD_LEGEND_LEVEL; | |
125 | return false; | |
126 | } | |
127 | } | |
128 | ||
129 | int nNextLevel = m_nLevel + 1; | |
130 | m_nExp1 += nExp; | |
131 | ||
132 | if (bFirstCall) | |
133 | { | |
134 | //Quget PkValue | |
135 | //#if __VER >= 8 // __S8_PK | |
136 | #if __VER < 15 // __S8_PK | |
137 | #ifdef __WORLDSERVER | |
138 | if (bMonster && IsChaotic()) | |
139 | { | |
140 | m_dwPKExp = (DWORD)(m_dwPKExp + nExp); | |
141 | DWORD dwPropensity = GetPKPropensity(); | |
142 | int nLevelPKExp = prj.GetLevelExp(GetLevel()); | |
143 | if (nLevelPKExp != 0) | |
144 | { | |
145 | int nSubExp = m_dwPKExp / nLevelPKExp; | |
146 | if (nSubExp) | |
147 | { | |
148 | SetPKPropensity(GetPKPropensity() - (m_dwPKExp / nLevelPKExp)); | |
149 | if (dwPropensity <= GetPKPropensity()) | |
150 | SetPKPropensity(0); | |
151 | m_dwPKExp %= nLevelPKExp; | |
152 | ||
153 | g_UserMng.AddPKPropensity(this); | |
154 | g_dpDBClient.SendLogPkPvp(this, NULL, 0, 'P'); | |
155 | } | |
156 | } | |
157 | } | |
158 | #endif //__WORLDSERVER | |
159 | #endif // __VER >= 8 // __S8_PK | |
160 | } | |
161 | ||
162 | if (m_nExp1 >= prj.m_aExpCharacter[nNextLevel].nExp1) | |
163 | { | |
164 | if (IsLegendHero() && (nNextLevel > MAX_3RD_LEGEND_LEVEL)) | |
165 | { | |
166 | m_nLevel = MAX_3RD_LEGEND_LEVEL; | |
167 | m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1); | |
168 | - | return FALSE; |
168 | + | |
169 | } | |
170 | else if (IsHero() && (nNextLevel > MAX_LEGEND_LEVEL)) | |
171 | { | |
172 | m_nLevel = MAX_LEGEND_LEVEL; | |
173 | m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1); | |
174 | - | return FALSE; |
174 | + | |
175 | } | |
176 | else if (!IsHero() && !IsLegendHero() && nNextLevel > MAX_GENERAL_LEVEL) | |
177 | { | |
178 | m_nLevel = MAX_GENERAL_LEVEL; | |
179 | m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1); | |
180 | - | return FALSE; |
180 | + | |
181 | } | |
182 | ||
183 | EXPINTEGER nExptmp; | |
184 | m_nRemainGP += prj.m_aExpCharacter[nNextLevel].dwLPPoint; | |
185 | if (IsMaster() || IsHero() || IsLegendHero()){ m_nRemainGP++; } | |
186 | nExptmp = m_nExp1 - prj.m_aExpCharacter[nNextLevel].nExp1; | |
187 | m_nExp1 = 0; | |
188 | m_nLevel = nNextLevel; | |
189 | bool bLevelUp = true; | |
190 | if (IsBaseJob() && m_nLevel > MAX_JOB_LEVEL) | |
191 | { | |
192 | m_nLevel = MAX_JOB_LEVEL; | |
193 | bLevelUp = false; | |
194 | } | |
195 | else if (IsExpert() && m_nLevel > MAX_JOB_LEVEL + MAX_EXP_LEVEL) | |
196 | { | |
197 | m_nLevel = MAX_JOB_LEVEL + MAX_EXP_LEVEL; | |
198 | bLevelUp = false; | |
199 | } | |
200 | else if (IsPro() && m_nLevel > MAX_GENERAL_LEVEL) | |
201 | { | |
202 | m_nLevel = MAX_GENERAL_LEVEL; | |
203 | ||
204 | m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1); | |
205 | nExptmp = 0; | |
206 | return false; | |
207 | } | |
208 | else if (IsMaster() && m_nLevel > MAX_GENERAL_LEVEL) | |
209 | { | |
210 | m_nLevel = MAX_GENERAL_LEVEL; | |
211 | m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1); | |
212 | nExptmp = 0; | |
213 | return false; | |
214 | } | |
215 | else if (IsHero() && (m_nLevel > MAX_LEGEND_LEVEL)) | |
216 | { | |
217 | m_nLevel = MAX_LEGEND_LEVEL; | |
218 | m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1); | |
219 | nExptmp = 0; | |
220 | return false; | |
221 | } | |
222 | else if (IsLegendHero() && m_nLevel > MAX_3RD_LEGEND_LEVEL) | |
223 | { | |
224 | m_nLevel = MAX_GENERAL_LEVEL; | |
225 | m_nExp1 = (prj.m_aExpCharacter[nNextLevel].nExp1 - 1); | |
226 | nExptmp = 0; | |
227 | return false; | |
228 | } | |
229 | ||
230 | if (bLevelUp) | |
231 | { | |
232 | m_nHitPoint = GetMaxHitPoint(); | |
233 | m_nManaPoint = GetMaxManaPoint(); | |
234 | m_nFatiguePoint = GetMaxFatiguePoint(); | |
235 | SetJobLevel(m_nLevel, m_nJob); | |
236 | ||
237 | if (m_nDeathLevel >= m_nLevel) | |
238 | { | |
239 | m_nRemainGP -= prj.m_aExpCharacter[nNextLevel].dwLPPoint; | |
240 | if (IsMaster() || IsHero() || IsLegendHero()){ m_nRemainGP--; } | |
241 | } | |
242 | ||
243 | #ifdef __WORLDSERVER | |
244 | if (m_nLevel > m_nDeathLevel) | |
245 | { | |
246 | int nGetPoint = ((GetLevel() - 1) / 20) + 2; | |
247 | if (IsMaster() || IsHero()){ SetMasterSkillPointUp(); } | |
248 | else | |
249 | { | |
250 | AddSkillPoint(nGetPoint); | |
251 | g_dpDBClient.SendLogSkillPoint(LOG_SKILLPOINT_GET_HUNT, nGetPoint, this, NULL); | |
252 | #ifdef __S_NEW_SKILL_2 | |
253 | g_dpDBClient.SaveSkill((CUser*)this); | |
254 | #endif | |
255 | } | |
256 | #ifdef __S_RECOMMEND_EVE | |
257 | if (g_eLocal.GetState(EVE_RECOMMEND) && IsPlayer()){ g_dpDBClient.SendRecommend((CUser*)this); } | |
258 | #endif | |
259 | #ifdef __EXP_ANGELEXP_LOG | |
260 | ((CUser*)this)->m_nExpLog = 0; | |
261 | #endif | |
262 | #ifdef __EVENTLUA_GIFT | |
263 | prj.m_EventLua.SetLevelUpGift((CUser*)this, m_nLevel); | |
264 | #endif | |
265 | #if __VER >= 15 // __CAMPUS | |
266 | CCampusHelper::GetInstance()->SetLevelUpReward((CUser*)this); | |
267 | #endif | |
268 | } | |
269 | #endif // __WORLDSERVER | |
270 | } | |
271 | else | |
272 | { | |
273 | m_nRemainGP -= prj.m_aExpCharacter[nNextLevel].dwLPPoint; | |
274 | if (IsMaster() || IsHero() || IsLegendHero()){ m_nRemainGP--; } | |
275 | nExptmp = m_nExp1 = 0; | |
276 | } | |
277 | ||
278 | if (m_nLevel == 20){ SetFlightLv(1); } | |
279 | #ifdef __CLIENT | |
280 | if (m_pActMover && (m_pActMover->IsState(OBJSTA_STAND) || m_pActMover->IsState(OBJSTA_STAND2))){ SetMotion(MTI_LEVELUP, ANILOOP_1PLAY, MOP_FIXED); } | |
281 | CreateSfx(g_Neuz.m_pd3dDevice, XI_GEN_LEVEL_UP01, GetPos(), GetId()); | |
282 | - | //SoundSystemClass::playMusic(BGM_IN_LEVELUP, false); //PlayMusic( BGM_IN_LEVELUP ); |
282 | + | |
283 | #endif | |
284 | if (nExptmp > 0){ AddExperience(nExptmp, FALSE, bMultiPly); } | |
285 | return true; | |
286 | } | |
287 | return false; | |
288 | } |