mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 21:01:29 +00:00
[Bug Fix] client_max_level allow leveling to end of level (#4455)
When using a method that leverages client_max_level (e.g. Max Level by bucket / qglobal / quest API) it would stop xp at 0% into the level rather than maximum xp for the level. This could pose an issue where: If you had a max level of 65 via a databucket and a raid zone required level 65, one death would de-level them and potentially prevent them from entering the zone. I reorganized the code to leverage the existing max_level logic which allows max xp in the max level. I also cleaned up the overall functions formating (Mostly brackets and implied if statements).
This commit is contained in:
parent
eece0a92e3
commit
9987029791
104
zone/exp.cpp
104
zone/exp.cpp
@ -607,10 +607,10 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
Message(Chat::Red, "Error in Client::SetEXP. EXP not set.");
|
||||
return; // Must be invalid class/race
|
||||
}
|
||||
|
||||
uint32 i = 0;
|
||||
uint32 membercount = 0;
|
||||
if(GetGroup())
|
||||
{
|
||||
if(GetGroup()) {
|
||||
for (i = 0; i < MAX_GROUP_MEMBERS; i++) {
|
||||
if (GetGroup()->members[i] != nullptr) {
|
||||
membercount++;
|
||||
@ -627,25 +627,29 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
if (RuleI(Character, ShowExpValues) >= 1) {
|
||||
if (exp_gained > 0 && aa_exp_gained > 0) {
|
||||
exp_amount_message = fmt::format("({}) ({})", exp_gained, aa_exp_gained);
|
||||
}
|
||||
else if (exp_gained > 0) {
|
||||
} else if (exp_gained > 0) {
|
||||
exp_amount_message = fmt::format("({})", exp_gained);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
exp_amount_message = fmt::format("({}) AA", aa_exp_gained);
|
||||
}
|
||||
}
|
||||
|
||||
std::string exp_percent_message = "";
|
||||
if (RuleI(Character, ShowExpValues) >= 2) {
|
||||
if (exp_gained > 0 && aa_exp_gained > 0) exp_percent_message = StringFormat("(%.3f%%, %.3f%%AA)", exp_percent, aa_exp_percent);
|
||||
else if (exp_gained > 0) exp_percent_message = StringFormat("(%.3f%%)", exp_percent);
|
||||
else exp_percent_message = StringFormat("(%.3f%%AA)", aa_exp_percent);
|
||||
if (exp_gained > 0 && aa_exp_gained > 0) {
|
||||
exp_percent_message = StringFormat("(%.3f%%, %.3f%%AA)", exp_percent, aa_exp_percent);
|
||||
} else if (exp_gained > 0) {
|
||||
exp_percent_message = StringFormat("(%.3f%%)", exp_percent);
|
||||
} else {
|
||||
exp_percent_message = StringFormat("(%.3f%%AA)", aa_exp_percent);
|
||||
}
|
||||
}
|
||||
if (isrezzexp) {
|
||||
if (RuleI(Character, ShowExpValues) > 0)
|
||||
if (RuleI(Character, ShowExpValues) > 0) {
|
||||
Message(Chat::Experience, "You regain %s experience from resurrection. %s", exp_amount_message.c_str(), exp_percent_message.c_str());
|
||||
else MessageString(Chat::Experience, REZ_REGAIN);
|
||||
} else {
|
||||
MessageString(Chat::Experience, REZ_REGAIN);
|
||||
}
|
||||
} else {
|
||||
if (membercount > 1) {
|
||||
if (RuleI(Character, ShowExpValues) > 0) {
|
||||
@ -673,14 +677,17 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(total_add_exp < total_current_exp){ //only loss message if you lose exp, no message if you gained/lost nothing.
|
||||
} else if(total_add_exp < total_current_exp) { //only loss message if you lose exp, no message if you gained/lost nothing.
|
||||
uint64 exp_lost = current_exp - set_exp;
|
||||
float exp_percent = (float)((float)exp_lost / (float)(GetEXPForLevel(GetLevel() + 1) - GetEXPForLevel(GetLevel())))*(float)100;
|
||||
|
||||
if (RuleI(Character, ShowExpValues) == 1 && exp_lost > 0) Message(Chat::Yellow, "You have lost %i experience.", exp_lost);
|
||||
else if (RuleI(Character, ShowExpValues) == 2 && exp_lost > 0) Message(Chat::Yellow, "You have lost %i experience. (%.3f%%)", exp_lost, exp_percent);
|
||||
else Message(Chat::Yellow, "You have lost experience.");
|
||||
if (RuleI(Character, ShowExpValues) == 1 && exp_lost > 0) {
|
||||
Message(Chat::Yellow, "You have lost %i experience.", exp_lost);
|
||||
} else if (RuleI(Character, ShowExpValues) == 2 && exp_lost > 0) {
|
||||
Message(Chat::Yellow, "You have lost %i experience. (%.3f%%)", exp_lost, exp_percent);
|
||||
} else {
|
||||
Message(Chat::Yellow, "You have lost experience.");
|
||||
}
|
||||
}
|
||||
|
||||
//check_level represents the level we should be when we have
|
||||
@ -698,9 +705,10 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
}
|
||||
level_count++;
|
||||
|
||||
if(GetMercenaryID())
|
||||
if (GetMercenaryID()) {
|
||||
UpdateMercLevel();
|
||||
}
|
||||
}
|
||||
//see if we lost any levels
|
||||
while (set_exp < GetEXPForLevel(check_level-1)) {
|
||||
check_level--;
|
||||
@ -709,9 +717,10 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
break;
|
||||
}
|
||||
level_increase = false;
|
||||
if(GetMercenaryID())
|
||||
if (GetMercenaryID()) {
|
||||
UpdateMercLevel();
|
||||
}
|
||||
}
|
||||
check_level--;
|
||||
|
||||
|
||||
@ -747,12 +756,14 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
//Message(Chat::Yellow, "You have gained %d skill points!!", m_pp.aapoints - last_unspentAA);
|
||||
char val1[20] = { 0 };
|
||||
char val2[20] = { 0 };
|
||||
if (gained == 1 && m_pp.aapoints == 1)
|
||||
|
||||
if (gained == 1 && m_pp.aapoints == 1) {
|
||||
MessageString(Chat::Experience, GAIN_SINGLE_AA_SINGLE_AA, ConvertArray(m_pp.aapoints, val1)); //You have gained an ability point! You now have %1 ability point.
|
||||
else if (gained == 1 && m_pp.aapoints > 1)
|
||||
} else if (gained == 1 && m_pp.aapoints > 1) {
|
||||
MessageString(Chat::Experience, GAIN_SINGLE_AA_MULTI_AA, ConvertArray(m_pp.aapoints, val1)); //You have gained an ability point! You now have %1 ability points.
|
||||
else
|
||||
} else {
|
||||
MessageString(Chat::Experience, GAIN_MULTI_AA_MULTI_AA, ConvertArray(gained, val1), ConvertArray(m_pp.aapoints, val2)); //You have gained %1 ability point(s)! You now have %2 ability point(s).
|
||||
}
|
||||
|
||||
if (RuleB(AA, SoundForAAEarned)) {
|
||||
SendSound();
|
||||
@ -765,7 +776,7 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
RecordPlayerEventLog(PlayerEvent::AA_GAIN, PlayerEvent::AAGainedEvent{gained});
|
||||
|
||||
/* QS: PlayerLogAARate */
|
||||
if (RuleB(QueryServ, PlayerLogAARate)){
|
||||
if (RuleB(QueryServ, PlayerLogAARate)) {
|
||||
int add_points = (m_pp.aapoints - last_unspentAA);
|
||||
std::string query = StringFormat("INSERT INTO `qs_player_aa_rate_hourly` (char_id, aa_count, hour_time) VALUES (%i, %i, UNIX_TIMESTAMP() - MOD(UNIX_TIMESTAMP(), 3600)) ON DUPLICATE KEY UPDATE `aa_count` = `aa_count` + %i", CharacterID(), add_points, add_points);
|
||||
QServ->SendQuery(query.c_str());
|
||||
@ -774,48 +785,45 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
//Message(Chat::Yellow, "You now have %d skill points available to spend.", m_pp.aapoints);
|
||||
}
|
||||
|
||||
uint8 maxlevel = RuleI(Character, MaxExpLevel) + 1;
|
||||
uint8 max_level = RuleI(Character, MaxExpLevel) + 1;
|
||||
|
||||
if(maxlevel <= 1)
|
||||
maxlevel = RuleI(Character, MaxLevel) + 1;
|
||||
|
||||
if(check_level > maxlevel) {
|
||||
check_level = maxlevel;
|
||||
|
||||
if(RuleB(Character, KeepLevelOverMax)) {
|
||||
set_exp = GetEXPForLevel(GetLevel()+1);
|
||||
}
|
||||
else {
|
||||
set_exp = GetEXPForLevel(maxlevel);
|
||||
}
|
||||
if (max_level <= 1) {
|
||||
max_level = RuleI(Character, MaxLevel) + 1;
|
||||
}
|
||||
|
||||
auto client_max_level = GetClientMaxLevel();
|
||||
if (client_max_level) {
|
||||
if (GetLevel() >= client_max_level) {
|
||||
auto exp_needed = GetEXPForLevel(client_max_level);
|
||||
if (set_exp > exp_needed) {
|
||||
set_exp = exp_needed;
|
||||
max_level = client_max_level + 1;
|
||||
}
|
||||
|
||||
if (check_level > max_level) {
|
||||
check_level = max_level;
|
||||
|
||||
if (RuleB(Character, KeepLevelOverMax)) {
|
||||
set_exp = GetEXPForLevel(GetLevel()+1);
|
||||
} else {
|
||||
set_exp = GetEXPForLevel(max_level);
|
||||
}
|
||||
}
|
||||
|
||||
if ((GetLevel() != check_level) && !(check_level >= maxlevel)) {
|
||||
if ((GetLevel() != check_level) && !(check_level >= max_level)) {
|
||||
char val1[20]={0};
|
||||
if (level_increase)
|
||||
{
|
||||
if (level_count == 1)
|
||||
if (level_increase) {
|
||||
if (level_count == 1) {
|
||||
MessageString(Chat::Experience, GAIN_LEVEL, ConvertArray(check_level, val1));
|
||||
else
|
||||
} else {
|
||||
Message(Chat::Yellow, "Welcome to level %i!", check_level);
|
||||
}
|
||||
|
||||
if (check_level == RuleI(Character, DeathItemLossLevel) &&
|
||||
m_ClientVersionBit & EQ::versions::maskUFAndEarlier)
|
||||
m_ClientVersionBit & EQ::versions::maskUFAndEarlier) {
|
||||
MessageString(Chat::Yellow, CORPSE_ITEM_LOST);
|
||||
}
|
||||
|
||||
if (check_level == RuleI(Character, DeathExpLossLevel))
|
||||
if (check_level == RuleI(Character, DeathExpLossLevel)) {
|
||||
MessageString(Chat::Yellow, CORPSE_EXP_LOST);
|
||||
}
|
||||
}
|
||||
|
||||
uint8 myoldlevel = GetLevel();
|
||||
|
||||
@ -828,9 +836,9 @@ void Client::SetEXP(ExpSource exp_source, uint64 set_exp, uint64 set_aaxp, bool
|
||||
}
|
||||
|
||||
//If were at max level then stop gaining experience if we make it to the cap
|
||||
if(GetLevel() == maxlevel - 1){
|
||||
if (GetLevel() == max_level - 1){
|
||||
uint32 expneeded = GetEXPForLevel(maxlevel);
|
||||
if(set_exp > expneeded) {
|
||||
if (set_exp > expneeded) {
|
||||
set_exp = expneeded;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user