Proper party experience distribution.
This commit is contained in:
@@ -712,24 +712,14 @@ AltFreeTeleporting = False
|
|||||||
# Default: 1
|
# Default: 1
|
||||||
DeleteCharAfterDays = 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
|
# 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).
|
# 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.
|
# 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".
|
# 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
|
# Available Options: auto, level, percentage, highfive, none
|
||||||
# Default: highfive
|
# Default: level
|
||||||
PartyXpCutoffMethod = highfive
|
PartyXpCutoffMethod = level
|
||||||
|
|
||||||
# This option takes effect when "percentage" method is chosen. Don't use high values for this!
|
# This option takes effect when "percentage" method is chosen. Don't use high values for this!
|
||||||
# Default: 3.0
|
# Default: 3.0
|
||||||
|
@@ -244,8 +244,6 @@ public final class Config
|
|||||||
public static int MAX_PETITIONS_PENDING;
|
public static int MAX_PETITIONS_PENDING;
|
||||||
public static boolean ALT_GAME_FREE_TELEPORT;
|
public static boolean ALT_GAME_FREE_TELEPORT;
|
||||||
public static int DELETE_DAYS;
|
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 String PARTY_XP_CUTOFF_METHOD;
|
||||||
public static double PARTY_XP_CUTOFF_PERCENT;
|
public static double PARTY_XP_CUTOFF_PERCENT;
|
||||||
public static int PARTY_XP_CUTOFF_LEVEL;
|
public static int PARTY_XP_CUTOFF_LEVEL;
|
||||||
@@ -1517,9 +1515,7 @@ public final class Config
|
|||||||
MAX_PETITIONS_PENDING = Character.getInt("MaxPetitionsPending", 25);
|
MAX_PETITIONS_PENDING = Character.getInt("MaxPetitionsPending", 25);
|
||||||
ALT_GAME_FREE_TELEPORT = Character.getBoolean("AltFreeTeleporting", false);
|
ALT_GAME_FREE_TELEPORT = Character.getBoolean("AltFreeTeleporting", false);
|
||||||
DELETE_DAYS = Character.getInt("DeleteCharAfterDays", 1);
|
DELETE_DAYS = Character.getInt("DeleteCharAfterDays", 1);
|
||||||
ALT_GAME_EXPONENT_XP = Character.getFloat("AltGameExponentXp", 0);
|
PARTY_XP_CUTOFF_METHOD = Character.getString("PartyXpCutoffMethod", "level").toLowerCase();
|
||||||
ALT_GAME_EXPONENT_SP = Character.getFloat("AltGameExponentSp", 0);
|
|
||||||
PARTY_XP_CUTOFF_METHOD = Character.getString("PartyXpCutoffMethod", "highfive");
|
|
||||||
PARTY_XP_CUTOFF_PERCENT = Character.getDouble("PartyXpCutoffPercent", 3);
|
PARTY_XP_CUTOFF_PERCENT = Character.getDouble("PartyXpCutoffPercent", 3);
|
||||||
PARTY_XP_CUTOFF_LEVEL = Character.getInt("PartyXpCutoffLevel", 20);
|
PARTY_XP_CUTOFF_LEVEL = Character.getInt("PartyXpCutoffLevel", 20);
|
||||||
final String[] gaps = Character.getString("PartyXpCutoffGaps", "0,9;10,14;15,99").split(";");
|
final String[] gaps = Character.getString("PartyXpCutoffGaps", "0,9;10,14;15,99").split(";");
|
||||||
|
@@ -944,9 +944,9 @@ public class L2Party extends AbstractPlayerGroup
|
|||||||
private List<L2PcInstance> getValidMembers(List<L2PcInstance> members, int topLvl)
|
private List<L2PcInstance> getValidMembers(List<L2PcInstance> members, int topLvl)
|
||||||
{
|
{
|
||||||
final List<L2PcInstance> validMembers = new ArrayList<>();
|
final List<L2PcInstance> validMembers = new ArrayList<>();
|
||||||
|
switch (Config.PARTY_XP_CUTOFF_METHOD)
|
||||||
// Fixed LevelDiff cutoff point
|
{
|
||||||
if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("level"))
|
case "level":
|
||||||
{
|
{
|
||||||
for (L2PcInstance member : members)
|
for (L2PcInstance member : members)
|
||||||
{
|
{
|
||||||
@@ -955,16 +955,15 @@ public class L2Party extends AbstractPlayerGroup
|
|||||||
validMembers.add(member);
|
validMembers.add(member);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
// Fixed MinPercentage cutoff point
|
case "percentage":
|
||||||
else if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("percentage"))
|
|
||||||
{
|
{
|
||||||
int sqLevelSum = 0;
|
int sqLevelSum = 0;
|
||||||
for (L2PcInstance member : members)
|
for (L2PcInstance member : members)
|
||||||
{
|
{
|
||||||
sqLevelSum += (member.getLevel() * member.getLevel());
|
sqLevelSum += (member.getLevel() * member.getLevel());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (L2PcInstance member : members)
|
for (L2PcInstance member : members)
|
||||||
{
|
{
|
||||||
final int sqLevel = member.getLevel() * member.getLevel();
|
final int sqLevel = member.getLevel() * member.getLevel();
|
||||||
@@ -973,16 +972,15 @@ public class L2Party extends AbstractPlayerGroup
|
|||||||
validMembers.add(member);
|
validMembers.add(member);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
// Automatic cutoff method
|
case "auto":
|
||||||
else if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("auto"))
|
|
||||||
{
|
{
|
||||||
int sqLevelSum = 0;
|
int sqLevelSum = 0;
|
||||||
for (L2PcInstance member : members)
|
for (L2PcInstance member : members)
|
||||||
{
|
{
|
||||||
sqLevelSum += (member.getLevel() * member.getLevel());
|
sqLevelSum += (member.getLevel() * member.getLevel());
|
||||||
}
|
}
|
||||||
|
|
||||||
int i = members.size() - 1;
|
int i = members.size() - 1;
|
||||||
if (i < 1)
|
if (i < 1)
|
||||||
{
|
{
|
||||||
@@ -992,7 +990,6 @@ public class L2Party extends AbstractPlayerGroup
|
|||||||
{
|
{
|
||||||
i = BONUS_EXP_SP.length - 1;
|
i = BONUS_EXP_SP.length - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (L2PcInstance member : members)
|
for (L2PcInstance member : members)
|
||||||
{
|
{
|
||||||
final int sqLevel = member.getLevel() * member.getLevel();
|
final int sqLevel = member.getLevel() * member.getLevel();
|
||||||
@@ -1001,15 +998,18 @@ public class L2Party extends AbstractPlayerGroup
|
|||||||
validMembers.add(member);
|
validMembers.add(member);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
// High Five cutoff method
|
case "highfive":
|
||||||
else if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("highfive"))
|
|
||||||
{
|
{
|
||||||
validMembers.addAll(members);
|
validMembers.addAll(members);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
else if (Config.PARTY_XP_CUTOFF_METHOD.equalsIgnoreCase("none"))
|
case "none":
|
||||||
{
|
{
|
||||||
validMembers.addAll(members);
|
validMembers.addAll(members);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return validMembers;
|
return validMembers;
|
||||||
}
|
}
|
||||||
|
@@ -586,11 +586,8 @@ public class L2Attackable extends L2Npc
|
|||||||
partyMul = ((float) partyDmg / totalDamage);
|
partyMul = ((float) partyDmg / totalDamage);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Calculate the level difference between Party and L2Attackable
|
|
||||||
final int levelDiff = partyLvl - getLevel();
|
|
||||||
|
|
||||||
// Calculate Exp and SP rewards
|
// Calculate Exp and SP rewards
|
||||||
final int[] expSp = calculateExpAndSp(levelDiff, partyDmg, totalDamage);
|
final int[] expSp = calculateExpAndSp(partyLvl, partyDmg, totalDamage);
|
||||||
long exp = expSp[0];
|
long exp = expSp[0];
|
||||||
int sp = expSp[1];
|
int sp = expSp[1];
|
||||||
|
|
||||||
@@ -1274,70 +1271,67 @@ public class L2Attackable extends L2Npc
|
|||||||
*/
|
*/
|
||||||
private int[] calculateExpAndSp(int charLevel, int damage, long totalDamage)
|
private int[] calculateExpAndSp(int charLevel, int damage, long totalDamage)
|
||||||
{
|
{
|
||||||
final int levelDiff = charLevel - getLevel();
|
final int levelDiff = Math.abs(charLevel - getLevel());
|
||||||
double xp = 0;
|
double xp = Math.max(0, ((double) getExpReward() * damage) / totalDamage);
|
||||||
double sp = 0;
|
double sp = Math.max(0, ((double) getSpReward() * damage) / totalDamage);
|
||||||
|
|
||||||
if ((levelDiff < 11) && (levelDiff > -11))
|
|
||||||
{
|
|
||||||
xp = Math.max(0, ((double) getExpReward() * damage) / totalDamage);
|
|
||||||
sp = Math.max(0, ((double) getSpReward() * damage) / totalDamage);
|
|
||||||
|
|
||||||
if ((charLevel > 84) && (levelDiff <= -3))
|
|
||||||
{
|
|
||||||
double mul;
|
double mul;
|
||||||
switch (levelDiff)
|
switch (levelDiff)
|
||||||
{
|
{
|
||||||
case -3:
|
case 0:
|
||||||
|
case 1:
|
||||||
|
case 2:
|
||||||
|
{
|
||||||
|
mul = 1.;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3:
|
||||||
{
|
{
|
||||||
mul = 0.97;
|
mul = 0.97;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case -4:
|
case 4:
|
||||||
{
|
{
|
||||||
mul = 0.67;
|
mul = 0.67;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case -5:
|
case 5:
|
||||||
{
|
{
|
||||||
mul = 0.42;
|
mul = 0.42;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case -6:
|
case 6:
|
||||||
{
|
{
|
||||||
mul = 0.25;
|
mul = 0.25;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case -7:
|
case 7:
|
||||||
{
|
{
|
||||||
mul = 0.15;
|
mul = 0.15;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case -8:
|
case 8:
|
||||||
{
|
{
|
||||||
mul = 0.09;
|
mul = 0.09;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case -9:
|
case 9:
|
||||||
{
|
{
|
||||||
mul = 0.05;
|
mul = 0.05;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case -10:
|
case 10:
|
||||||
{
|
{
|
||||||
mul = 0.03;
|
mul = 0.03;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
mul = 1.;
|
mul = 0.;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
xp *= mul;
|
xp *= mul;
|
||||||
sp *= mul;
|
sp *= mul;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new int[]
|
return new int[]
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user