Proper party experience distribution.
This commit is contained in:
@@ -712,24 +712,14 @@ AltFreeTeleporting = False
|
||||
# Default: 1
|
||||
DeleteCharAfterDays = 1
|
||||
|
||||
# Alternative Xp/Sp rewards, if not 0, then calculated as 2^((mob.level-player.level) / coef). Coef are the 2 numbers set below.
|
||||
# A few examples for "AltGameExponentXp = 5." and "AltGameExponentSp = 3.":
|
||||
# diff = 0 (player and mob has the same level), XP bonus rate = 1, SP bonus rate = 1
|
||||
# diff = 3 (mob is 3 levels above), XP bonus rate = 1.52, SP bonus rate = 2
|
||||
# diff = 5 (mob is 5 levels above), XP bonus rate = 2, SP bonus rate = 3.17
|
||||
# diff = -8 (mob is 8 levels below), XP bonus rate = 0.4, SP bonus rate = 0.16
|
||||
# Default: 0, 0
|
||||
AltGameExponentXp = 0
|
||||
AltGameExponentSp = 0
|
||||
|
||||
|
||||
# PARTY XP DISTRIBUTION
|
||||
# With "auto method" member is cut from Exp/SP distribution when his share is lower than party bonus acquired for him (30% for 2 member party).
|
||||
# In that case he will not receive any Exp/SP from party and is not counted for party bonus.
|
||||
# If you don't want to have a cutoff point for party members' XP distribution, set the first option to "none".
|
||||
# Available Options: highfive, auto, level, percentage, none
|
||||
# Default: highfive
|
||||
PartyXpCutoffMethod = highfive
|
||||
# Available Options: auto, level, percentage, highfive, none
|
||||
# Default: level
|
||||
PartyXpCutoffMethod = level
|
||||
|
||||
# This option takes effect when "percentage" method is chosen. Don't use high values for this!
|
||||
# Default: 3.0
|
||||
|
@@ -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