View difference between Paste ID: 0ip9yhpZ and AzuFrKUv
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
}