PDA

View Full Version : Questions about exp.cpp


Thuz989
01-11-2013, 04:06 PM
I am trying to figure out a problem im having in this thread here...

http://www.eqemulator.org/forums/showthread.php?t=36253

As part of this i was looking at exp.cpp and i was wondering this...

How is the "conlevel" variable in this set? the default is 0xFF which will stop the con_scaling from working?? It seems like conscaling quit working so im trying to find a workaround but i cant figure out a way to check mob level within this funtion... bleh.

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));

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 ammount away from regular exp
add_exp -= add_aaxp;

float totalmod = 1.0;
float zemmod = 1.0;
//get modifiers
if(RuleR(Character, ExpMultiplier) >= 0){
totalmod *= RuleR(Character, ExpMultiplier);
}

if(zone->newzone_data.zone_exp_multiplier >= 0){
zemmod *= zone->newzone_data.zone_exp_multiplier;
}

if(RuleB(Character,UseRaceClassExpBonuses))
{
if(GetBaseRace() == HALFLING){
totalmod *= 1.05;
}

if(GetClass() == ROGUE || GetClass() == WARRIOR){
totalmod *= 1.05;
}
}

if(zone->IsHotzone())
{
totalmod += RuleR(Zone, HotZoneBonus);
}

add_exp = int32(float(add_exp) * totalmod * zemmod);


if(RuleB(Character,UseXPConScaling))
{
if (conlevel != 0xFF && !resexp) {
switch (conlevel)
{
case CON_GREEN:
add_exp = 0;
add_aaxp = 0;
return;
case CON_LIGHTBLUE:
add_exp = add_exp * RuleI(Character, LightBlueModifier)/100;
add_aaxp = add_aaxp * RuleI(Character, LightBlueModifier)/100;
break;
case CON_BLUE:
add_exp = add_exp * RuleI(Character, BlueModifier)/100;
add_aaxp = add_aaxp * RuleI(Character, BlueModifier)/100;
break;
case CON_WHITE:
add_exp = add_exp * RuleI(Character, WhiteModifier)/100;
add_aaxp = add_aaxp * RuleI(Character, WhiteModifier)/100;
break;
case CON_YELLOW:
add_exp = add_exp * RuleI(Character, YellowModifier)/100;
add_aaxp = add_aaxp * RuleI(Character, YellowModifier)/100;
break;
case CON_RED:
add_exp = add_exp * RuleI(Character, RedModifier)/100;
add_aaxp = add_aaxp * RuleI(Character, RedModifier)/100;
break;
}
}

lerxst2112
01-11-2013, 04:38 PM
You can't check the mob level in that function. conlevel is passed in as a parameter, so you need to look at where the function is called. Assuming you're not in a group and you killed a mob it's called from NPC::Death()


int conlevel = give_exp->GetLevelCon(GetLevel());
if (conlevel != CON_GREEN)
{
if(GetOwner() && GetOwner()->IsClient()){
}
else {
give_exp_client->AddEXP((EXP_FORMULA), conlevel); // Pyro: Comment this if NPC death crashes zone


You can see where conlevel is calculated and passed there.

Thuz989
01-11-2013, 11:20 PM
Thank you for the information it helped!!