Well I was still testing this but I was able to max out at level 253 via experience before hitting a wall.
Required sql
Code:
update rule_values set rule_value = 239765 where rule_name = 'AA:ExpPerPoint';
update rule_values set rule_value = 254 where rule_name = 'Character:MaxLevel';
update rule_values set rule_value = 254 where rule_name = ' Character:MaxExpLevel';
This part is optional as it just mantains an exp scaling similar to what exists in the default peq database.
zone/exp.cpp
Code:
void Client::AddEXP(int32 in_add_exp, int8 conlevel, bool resexp) {
int32 add_exp = in_add_exp;
if(!resexp && (XPRate != 0))
- add_exp = static_cast<int32>(in_add_exp * (static_cast<float>(XPRate) / 100.0f));
+ add_exp = static_cast<int32>(in_add_exp * (static_cast<float>(XPRate) / 10000.0f));
if (m_epp.perAA<0 || m_epp.perAA>100)
m_epp.perAA=0; // stop exploit with sanity check
int32 add_aaxp;
if(resexp) {
add_aaxp = 0;
} else {
//figure out how much of this goes to AAs
add_aaxp = add_exp * m_epp.perAA / 100;
//take that amount away from regular exp
add_exp -= add_aaxp;
zone/exp.cpp
Code:
//check_level represents the level we should be when we have
//this ammount of exp (once these loops complete)
int16 check_level = GetLevel()+1;
//see if we gained any levels
while (set_exp >= GetEXPForLevel(check_level)) {
check_level++;
- if (check_level > 127) { //hard level cap
+ if (check_level > 254) { //hard level cap
- check_level = 127;
+ check_level = 254;
break;
}
}
zone/exp.cpp
Code:
// Note: The client calculates exp separately, we cant change this function
// Add: You can set the values you want now, client will be always sync :) - Merkur
uint32 Client::GetEXPForLevel(int16 check_level)
{
int16 check_levelm1 = check_level-1;
float mod;
if (check_level < 31)
mod = 1.0;
else if (check_level < 36)
mod = 1.1;
else if (check_level < 41)
mod = 1.2;
else if (check_level < 46)
mod = 1.3;
else if (check_level < 52)
mod = 1.4;
else if (check_level < 53)
mod = 1.5;
else if (check_level < 54)
mod = 1.6;
else if (check_level < 55)
mod = 1.7;
else if (check_level < 56)
mod = 1.9;
else if (check_level < 57)
mod = 2.1;
else if (check_level < 58)
mod = 2.3;
else if (check_level < 59)
mod = 2.5;
else if (check_level < 60)
mod = 2.7;
else if (check_level < 61)
mod = 3.0;
else
mod = 3.1;
float base = (check_levelm1)*(check_levelm1)*(check_levelm1);
- mod *= 1000;
+ mod *= 10;
return(uint32(base * mod));
}