From e07c6d6daf9276839b3265a64a351ab0c98cdf20 Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sun, 11 Dec 2016 10:44:38 +0000 Subject: [PATCH] Proper party experience distribution. --- .../dist/game/config/Character.ini | 16 +-- .../java/com/l2jmobius/Config.java | 6 +- .../l2jmobius/gameserver/model/L2Party.java | 110 ++++++++-------- .../gameserver/model/actor/L2Attackable.java | 122 +++++++++--------- 4 files changed, 117 insertions(+), 137 deletions(-) diff --git a/L2J_Mobius_Underground/dist/game/config/Character.ini b/L2J_Mobius_Underground/dist/game/config/Character.ini index 182c347db6..262b128f4b 100644 --- a/L2J_Mobius_Underground/dist/game/config/Character.ini +++ b/L2J_Mobius_Underground/dist/game/config/Character.ini @@ -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 diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/Config.java b/L2J_Mobius_Underground/java/com/l2jmobius/Config.java index 4615032002..22559c3d45 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/Config.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/Config.java @@ -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(";"); diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/L2Party.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/L2Party.java index 74bf985b37..834811cea4 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/L2Party.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/L2Party.java @@ -944,72 +944,72 @@ public class L2Party extends AbstractPlayerGroup private List getValidMembers(List members, int topLvl) { final List 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; } diff --git a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/L2Attackable.java b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/L2Attackable.java index e96f10cdca..575bafeaf7 100644 --- a/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/L2Attackable.java +++ b/L2J_Mobius_Underground/java/com/l2jmobius/gameserver/model/actor/L2Attackable.java @@ -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[] {