Proper party experience distribution.

This commit is contained in:
MobiusDev
2016-12-11 10:44:38 +00:00
parent bd93dc0ac6
commit e07c6d6daf
4 changed files with 117 additions and 137 deletions

View File

@ -944,72 +944,72 @@ public class L2Party extends AbstractPlayerGroup
private List<L2PcInstance> getValidMembers(List<L2PcInstance> members, int topLvl)
{
final List<L2PcInstance> validMembers = new ArrayList<>();
// Fixed LevelDiff cutoff point
if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("level"))
switch (Config.PARTY_XP_CUTOFF_METHOD)
{
for (L2PcInstance member : members)
case "level":
{
if ((topLvl - member.getLevel()) <= Config.PARTY_XP_CUTOFF_LEVEL)
for (L2PcInstance member : members)
{
validMembers.add(member);
if ((topLvl - member.getLevel()) <= Config.PARTY_XP_CUTOFF_LEVEL)
{
validMembers.add(member);
}
}
break;
}
}
// Fixed MinPercentage cutoff point
else if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("percentage"))
{
int sqLevelSum = 0;
for (L2PcInstance member : members)
case "percentage":
{
sqLevelSum += (member.getLevel() * member.getLevel());
}
for (L2PcInstance member : members)
{
final int sqLevel = member.getLevel() * member.getLevel();
if ((sqLevel * 100) >= (sqLevelSum * Config.PARTY_XP_CUTOFF_PERCENT))
int sqLevelSum = 0;
for (L2PcInstance member : members)
{
validMembers.add(member);
sqLevelSum += (member.getLevel() * member.getLevel());
}
}
}
// Automatic cutoff method
else if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("auto"))
{
int sqLevelSum = 0;
for (L2PcInstance member : members)
{
sqLevelSum += (member.getLevel() * member.getLevel());
}
int i = members.size() - 1;
if (i < 1)
{
return members;
}
if (i >= BONUS_EXP_SP.length)
{
i = BONUS_EXP_SP.length - 1;
}
for (L2PcInstance member : members)
{
final int sqLevel = member.getLevel() * member.getLevel();
if (sqLevel >= (sqLevelSum / (members.size() * members.size())))
for (L2PcInstance member : members)
{
validMembers.add(member);
final int sqLevel = member.getLevel() * member.getLevel();
if ((sqLevel * 100) >= (sqLevelSum * Config.PARTY_XP_CUTOFF_PERCENT))
{
validMembers.add(member);
}
}
break;
}
case "auto":
{
int sqLevelSum = 0;
for (L2PcInstance member : members)
{
sqLevelSum += (member.getLevel() * member.getLevel());
}
int i = members.size() - 1;
if (i < 1)
{
return members;
}
if (i >= BONUS_EXP_SP.length)
{
i = BONUS_EXP_SP.length - 1;
}
for (L2PcInstance member : members)
{
final int sqLevel = member.getLevel() * member.getLevel();
if (sqLevel >= (sqLevelSum / (members.size() * members.size())))
{
validMembers.add(member);
}
}
break;
}
case "highfive":
{
validMembers.addAll(members);
break;
}
case "none":
{
validMembers.addAll(members);
break;
}
}
// High Five cutoff method
else if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("highfive"))
{
validMembers.addAll(members);
}
else if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("none"))
{
validMembers.addAll(members);
}
return validMembers;
}

View File

@ -586,11 +586,8 @@ public class L2Attackable extends L2Npc
partyMul = ((float) partyDmg / totalDamage);
}
// Calculate the level difference between Party and L2Attackable
final int levelDiff = partyLvl - getLevel();
// Calculate Exp and SP rewards
final int[] expSp = calculateExpAndSp(levelDiff, partyDmg, totalDamage);
final int[] expSp = calculateExpAndSp(partyLvl, partyDmg, totalDamage);
long exp = expSp[0];
int sp = expSp[1];
@ -1274,70 +1271,67 @@ public class L2Attackable extends L2Npc
*/
private int[] calculateExpAndSp(int charLevel, int damage, long totalDamage)
{
final int levelDiff = charLevel - getLevel();
double xp = 0;
double sp = 0;
if ((levelDiff < 11) && (levelDiff > -11))
final int levelDiff = Math.abs(charLevel - getLevel());
double xp = Math.max(0, ((double) getExpReward() * damage) / totalDamage);
double sp = Math.max(0, ((double) getSpReward() * damage) / totalDamage);
double mul;
switch (levelDiff)
{
xp = Math.max(0, ((double) getExpReward() * damage) / totalDamage);
sp = Math.max(0, ((double) getSpReward() * damage) / totalDamage);
if ((charLevel > 84) && (levelDiff <= -3))
case 0:
case 1:
case 2:
{
double mul;
switch (levelDiff)
{
case -3:
{
mul = 0.97;
break;
}
case -4:
{
mul = 0.67;
break;
}
case -5:
{
mul = 0.42;
break;
}
case -6:
{
mul = 0.25;
break;
}
case -7:
{
mul = 0.15;
break;
}
case -8:
{
mul = 0.09;
break;
}
case -9:
{
mul = 0.05;
break;
}
case -10:
{
mul = 0.03;
break;
}
default:
{
mul = 1.;
break;
}
}
xp *= mul;
sp *= mul;
mul = 1.;
break;
}
case 3:
{
mul = 0.97;
break;
}
case 4:
{
mul = 0.67;
break;
}
case 5:
{
mul = 0.42;
break;
}
case 6:
{
mul = 0.25;
break;
}
case 7:
{
mul = 0.15;
break;
}
case 8:
{
mul = 0.09;
break;
}
case 9:
{
mul = 0.05;
break;
}
case 10:
{
mul = 0.03;
break;
}
default:
{
mul = 0.;
break;
}
}
xp *= mul;
sp *= mul;
return new int[]
{