void CGame::GetExp(int iClientH, int iExp, BOOL bIsAttackerOwn)
{
double dV1, dV2, dV3;
int i, iH, iUnitValue;
DWORD dwTime = timeGetTime();
int iTotalPartyMembers;
if (m_pClientList[iClientH] == NULL) return;
if (iExp <= 0) return;
if (m_pClientList[iClientH]->m_iLevel <= 80) {
dV1 = (double)(80 - m_pClientList[iClientH]->m_iLevel);
dV2 = dV1 * 0.025f;
dV3 = (double)iExp;
dV1 = (dV2 + 1.025f)*dV3;
iExp = (int)dV1;
}
else { //Lower exp
if ((m_pClientList[iClientH]->m_iLevel >= 100) &&((strcmp(m_pMapList[m_pClientList[iClientH]->m_cMapIndex]->m_cName, "arefarm") == 0)
|| (strcmp(m_pMapList[m_pClientList[iClientH]->m_cMapIndex]->m_cName, "elvfarm") == 0))) {
iExp = (iExp/10) ;
}
else if ((strcmp(m_pMapList[m_pClientList[iClientH]->m_cMapIndex]->m_cName, "arefarm") == 0)
|| (strcmp(m_pMapList[m_pClientList[iClientH]->m_cMapIndex]->m_cName, "elvfarm") == 0)) {
iExp = (iExp*1/4) ;
}
}
//Check for party status, else give exp to player
//if ((m_pClientList[iClientH]->m_iPartyID != NULL) && (m_pClientList[iClientH]->m_iPartyStatus == DEF_PARTYSTATUS_CONFIRM) &&
// ((dwTime - m_pClientList[iClientH]->m_dwLastActionTime) < 1000*60*5)) {
if ((m_pClientList[iClientH]->m_iPartyID != NULL) && (m_pClientList[iClientH]->m_iPartyStatus == DEF_PARTYSTATUS_CONFIRM)) {
//Only divide exp if > 1 person and exp > 10
if(iExp >= 10 && m_stPartyInfo[m_pClientList[iClientH]->m_iPartyID].iTotalMembers > 0){
//Calc total ppl in party
iTotalPartyMembers = 0;
for(i = 0; i < m_stPartyInfo[m_pClientList[iClientH]->m_iPartyID].iTotalMembers; i++){
iH = m_stPartyInfo[m_pClientList[iClientH]->m_iPartyID].iIndex
;
if ((m_pClientList[iH] != NULL) && (m_pClientList[iH]->m_iHP > 0)) {
//Newly added, Only players on same map get exp :}
//if(m_pClientList[iH]->m_cMapIndex == m_pClientList[iClientH]->m_cMapIndex)
if ((strlen(m_pMapList[m_pClientList[iH]->m_cMapIndex]->m_cName)) == (strlen(m_pMapList[m_pClientList[iClientH]->m_cMapIndex]->m_cName))) {
if(memcmp(m_pMapList[m_pClientList[iH]->m_cMapIndex]->m_cName,
m_pMapList[m_pClientList[iClientH]->m_cMapIndex]->m_cName,
strlen(m_pMapList[m_pClientList[iClientH]->m_cMapIndex]->m_cName)) == 0){
iTotalPartyMembers++;
}
}
}
}
//Check for party bug
if(iTotalPartyMembers >
{
wsprintf(G_cTxt, "(X) Party Bug !! partyMember %d XXXXXXXXXX", iTotalPartyMembers);
PutLogFileList(G_cTxt);
iTotalPartyMembers = 8;
}
//Figure out how much exp a player gets
dV1 = (double)iExp;
switch(iTotalPartyMembers){
case 1:
dV2 = dV1;
break;
case 2:
dV2 = (dV1 + (dV1 * 2.0e-2)) / 2.0;
break;
case 3:
dV2 = (dV1 + (dV1 * 5.0e-2)) / 3.0;
break;
case 4:
dV2 = (dV1 + (dV1 * 7.000000000000001e-2)) / 4.0;
break;
case 5:
dV2 = (dV1 + (dV1 * 1.0e-1)) / 5.0;
break;
case 6:
dV2 = (dV1 + (dV1 * 1.4e-1)) / 6.0;
break;
case 7:
dV2 = (dV1 + (dV1 * 1.7e-1)) / 7.0;
break;
case 8:
dV2 = (dV1 + (dV1 * 2.0e-1)) / 8.0;
break;
}
dV3 = dV2 + 5.0e-1;
iUnitValue = (int)dV3;
//Divide exp among party members
for(i = 0; i < iTotalPartyMembers; i++){
iH = m_stPartyInfo[m_pClientList[iClientH]->m_iPartyID].iIndex;
//Player who kills monster gets more exp
if ((m_pClientList[iH] != NULL) && (m_pClientList[iH]->m_bSkillUsingStatus[19] != 1) && (m_pClientList[iH]->m_iHP > 0)) { // Is player alive ??
//Exp gain based on lvl
if((m_pClientList[iH]->m_iStatus & 0x10000) != 0)
iUnitValue *= 3;
m_pClientList[iH]->m_iExpStock += iUnitValue;
iUnitValue = (int)dV3;
}
}
}
else{
if ((m_pClientList[iClientH]->m_iStatus & 0x10000) != 0)
iExp *= 3;
//m_pClientList[iClientH]->m_iExpStock += iExp;
}
}
else{
if ((m_pClientList[iClientH]->m_iStatus & 0x10000) != 0)
iExp *= 3;
//Add exp to player
//m_pClientList[iClientH]->m_iExpStock += iExp;
}
//hbest add exp after lvl
if (m_pClientList[iClientH]->m_iLevel < 121) {
iExp *= 4;
} else if (m_pClientList[iClientH]->m_iLevel < 141) {
iExp *= 3;
} else if (m_pClientList[iClientH]->m_iLevel < 161) {
iExp *= 2;
} else if (m_pClientList[iClientH]->m_iLevel < 180) {
iExp *= 1.5;
}
m_pClientList[iClientH]->m_iExpStock += iExp;
}