Proper party experience distribution.
This commit is contained in:
@@ -244,8 +244,6 @@ public final class Config
|
||||
public static int MAX_PETITIONS_PENDING;
|
||||
public static boolean ALT_GAME_FREE_TELEPORT;
|
||||
public static int DELETE_DAYS;
|
||||
public static float ALT_GAME_EXPONENT_XP;
|
||||
public static float ALT_GAME_EXPONENT_SP;
|
||||
public static String PARTY_XP_CUTOFF_METHOD;
|
||||
public static double PARTY_XP_CUTOFF_PERCENT;
|
||||
public static int PARTY_XP_CUTOFF_LEVEL;
|
||||
@@ -1517,9 +1515,7 @@ public final class Config
|
||||
MAX_PETITIONS_PENDING = Character.getInt("MaxPetitionsPending", 25);
|
||||
ALT_GAME_FREE_TELEPORT = Character.getBoolean("AltFreeTeleporting", false);
|
||||
DELETE_DAYS = Character.getInt("DeleteCharAfterDays", 1);
|
||||
ALT_GAME_EXPONENT_XP = Character.getFloat("AltGameExponentXp", 0);
|
||||
ALT_GAME_EXPONENT_SP = Character.getFloat("AltGameExponentSp", 0);
|
||||
PARTY_XP_CUTOFF_METHOD = Character.getString("PartyXpCutoffMethod", "highfive");
|
||||
PARTY_XP_CUTOFF_METHOD = Character.getString("PartyXpCutoffMethod", "level").toLowerCase();
|
||||
PARTY_XP_CUTOFF_PERCENT = Character.getDouble("PartyXpCutoffPercent", 3);
|
||||
PARTY_XP_CUTOFF_LEVEL = Character.getInt("PartyXpCutoffLevel", 20);
|
||||
final String[] gaps = Character.getString("PartyXpCutoffGaps", "0,9;10,14;15,99").split(";");
|
||||
|
@@ -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;
|
||||
}
|
||||
|
@@ -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[]
|
||||
{
|
||||
|
Reference in New Issue
Block a user