soniknoise
07-03-2012, 01:47 PM
Hello, new to project1999 player here. Sorry if this has been brought up before, but I wasn't able to find this specific experience issue discussed/resolved in the bug section yet so thought I would post it here.
I think group experience is currently setup incorrectly. It seems to be setup like AA experience worked rather than how normal experience worked in classic. IIRC in classic as long as your group was all within the appropriate level range you would get experience for kills based on what the mob conned to you - not the highest level of the group. For AA experience (obviously not classic) it was based on the highest level of group con.
I tried to find some good sources to back up this claim, but this was about the best I could do - http://everquest.allakhazam.com/forum.html?forum=1&mid=126428051345149414&h=50
Looking at Group::SplitExp in exp.cpp confirms that it is using the highest level in group con rather than individual to determine experience gains.
It seems like this code:
int conlevel = Mob::GetLevelCon(maxlevel, other->GetLevel());
if(conlevel == CON_GREEN)
return; //no exp for greenies...
if (membercount == 0)
return;
for (i = 0; i < MAX_GROUP_MEMBERS; i++) {
if (members[i] != NULL && members[i]->IsClient()) // If Group Member is Client
{
Client *cmember = members[i]->CastToClient();
// add exp + exp cap
sint16 diff = cmember->GetLevel() - maxlevel;
sint16 maxdiff = -(cmember->GetLevel()*15/10 - cmember->GetLevel());
if(maxdiff > -5)
maxdiff = -5;
if (diff >= (maxdiff)) { /*Instead of person who killed the mob, the person who has the highest level in the group*/
uint32 tmp = (cmember->GetLevel()+3) * (cmember->GetLevel()+3) * 75 * 35 / 10;
uint32 tmp2 = groupexp / membercount;
cmember->AddEXP( tmp < tmp2 ? tmp : tmp2, conlevel );
}
}
}
Should be changed to this code:
if (membercount == 0)
return;
for (i = 0; i < MAX_GROUP_MEMBERS; i++) {
if (members[i] != NULL && members[i]->IsClient()) // If Group Member is Client
{
Client *cmember = members[i]->CastToClient();
// add exp + exp cap
int conlevel = Mob::GetLevelCon(cmember->GetLevel(), other->GetLevel());
sint16 diff = cmember->GetLevel() - maxlevel;
sint16 maxdiff = -(cmember->GetLevel()*15/10 - cmember->GetLevel());
if(maxdiff > -5)
maxdiff = -5;
if (diff >= (maxdiff)) { /*Instead of person who killed the mob, the person who has the highest level in the group*/
uint32 tmp = (cmember->GetLevel()+3) * (cmember->GetLevel()+3) * 75 * 35 / 10;
uint32 tmp2 = groupexp / membercount;
cmember->AddEXP( tmp < tmp2 ? tmp : tmp2, conlevel );
}
}
}
While this isn't a huge deal at higher levels it is quite annoying for low level groups - especially if you are trying to play with real life friends who get behind in levels. If it worked correctly you could still group and assuming you were killing in an area that was partially green to the higher levels but all experience for the lower levels - the lower levels could eventually begin to catch up. Right now it seems the only way for the lower levels to catch up is to solo which just makes the game more group unfriendly and hurts player retention.
My personal example: I recently started playing with 5 friends. We are having a great time and love the server, but a couple of them are already seeming discouraged by being behind in levels since they don't have enough play time. Even when they do get time to play now we basically can't group up and all play together because of these mechanics. I realize there are other workarounds for this - playing 2ndary characters, out of group assistance, etc., but none of those would be as enjoyable as just actually grouping together in an appropriate area where they could catch up.
Thanks for reading and for all the work put into this server!
I think group experience is currently setup incorrectly. It seems to be setup like AA experience worked rather than how normal experience worked in classic. IIRC in classic as long as your group was all within the appropriate level range you would get experience for kills based on what the mob conned to you - not the highest level of the group. For AA experience (obviously not classic) it was based on the highest level of group con.
I tried to find some good sources to back up this claim, but this was about the best I could do - http://everquest.allakhazam.com/forum.html?forum=1&mid=126428051345149414&h=50
Looking at Group::SplitExp in exp.cpp confirms that it is using the highest level in group con rather than individual to determine experience gains.
It seems like this code:
int conlevel = Mob::GetLevelCon(maxlevel, other->GetLevel());
if(conlevel == CON_GREEN)
return; //no exp for greenies...
if (membercount == 0)
return;
for (i = 0; i < MAX_GROUP_MEMBERS; i++) {
if (members[i] != NULL && members[i]->IsClient()) // If Group Member is Client
{
Client *cmember = members[i]->CastToClient();
// add exp + exp cap
sint16 diff = cmember->GetLevel() - maxlevel;
sint16 maxdiff = -(cmember->GetLevel()*15/10 - cmember->GetLevel());
if(maxdiff > -5)
maxdiff = -5;
if (diff >= (maxdiff)) { /*Instead of person who killed the mob, the person who has the highest level in the group*/
uint32 tmp = (cmember->GetLevel()+3) * (cmember->GetLevel()+3) * 75 * 35 / 10;
uint32 tmp2 = groupexp / membercount;
cmember->AddEXP( tmp < tmp2 ? tmp : tmp2, conlevel );
}
}
}
Should be changed to this code:
if (membercount == 0)
return;
for (i = 0; i < MAX_GROUP_MEMBERS; i++) {
if (members[i] != NULL && members[i]->IsClient()) // If Group Member is Client
{
Client *cmember = members[i]->CastToClient();
// add exp + exp cap
int conlevel = Mob::GetLevelCon(cmember->GetLevel(), other->GetLevel());
sint16 diff = cmember->GetLevel() - maxlevel;
sint16 maxdiff = -(cmember->GetLevel()*15/10 - cmember->GetLevel());
if(maxdiff > -5)
maxdiff = -5;
if (diff >= (maxdiff)) { /*Instead of person who killed the mob, the person who has the highest level in the group*/
uint32 tmp = (cmember->GetLevel()+3) * (cmember->GetLevel()+3) * 75 * 35 / 10;
uint32 tmp2 = groupexp / membercount;
cmember->AddEXP( tmp < tmp2 ? tmp : tmp2, conlevel );
}
}
}
While this isn't a huge deal at higher levels it is quite annoying for low level groups - especially if you are trying to play with real life friends who get behind in levels. If it worked correctly you could still group and assuming you were killing in an area that was partially green to the higher levels but all experience for the lower levels - the lower levels could eventually begin to catch up. Right now it seems the only way for the lower levels to catch up is to solo which just makes the game more group unfriendly and hurts player retention.
My personal example: I recently started playing with 5 friends. We are having a great time and love the server, but a couple of them are already seeming discouraged by being behind in levels since they don't have enough play time. Even when they do get time to play now we basically can't group up and all play together because of these mechanics. I realize there are other workarounds for this - playing 2ndary characters, out of group assistance, etc., but none of those would be as enjoyable as just actually grouping together in an appropriate area where they could catch up.
Thanks for reading and for all the work put into this server!