diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_1.0_Ertheia/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_1.0_Ertheia/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 85429a77e7..581ab52ea3 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index fafb6a0137..816b6257bb 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/Config.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/Config.java index bd33347d82..a3c2660b94 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/Config.java @@ -1119,6 +1119,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2679,6 +2684,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Formulas.java index 8f2a2bc751..1f4cd49e8c 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_2.5_Underground/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_2.5_Underground/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_2.5_Underground/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 85429a77e7..581ab52ea3 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index fafb6a0137..816b6257bb 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/Config.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/Config.java index fedc2b1460..3bf6fd6167 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/Config.java @@ -1126,6 +1126,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2696,6 +2701,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/Formulas.java index 8f2a2bc751..1f4cd49e8c 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_3.0_Helios/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_3.0_Helios/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_3.0_Helios/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 85429a77e7..581ab52ea3 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index fafb6a0137..816b6257bb 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java index a2a87bae22..38fce9dfd5 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/Config.java @@ -1134,6 +1134,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2711,6 +2716,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/Formulas.java index 8f2a2bc751..1f4cd49e8c 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_4.0_GrandCrusade/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 85429a77e7..581ab52ea3 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index fafb6a0137..816b6257bb 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java index 9e6d9fbdb7..e7aa6ce1ac 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/Config.java @@ -1121,6 +1121,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2685,6 +2690,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Formulas.java index 2c5384955e..e520ae1fd5 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_5.0_Salvation/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_5.0_Salvation/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_5.0_Salvation/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 85429a77e7..581ab52ea3 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index fafb6a0137..816b6257bb 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java index ddbb95035c..b4e6c7f1fc 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/Config.java @@ -1117,6 +1117,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2761,6 +2766,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Formulas.java index 2c5384955e..e520ae1fd5 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_5.5_EtinasFate/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 85429a77e7..581ab52ea3 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index fafb6a0137..816b6257bb 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java index ddbb95035c..b4e6c7f1fc 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/Config.java @@ -1117,6 +1117,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2761,6 +2766,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Formulas.java index 2c5384955e..e520ae1fd5 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_6.0_Fafurion/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_6.0_Fafurion/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 85429a77e7..581ab52ea3 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index fafb6a0137..816b6257bb 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java index 685d0718f0..f67e6d753f 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/Config.java @@ -1134,6 +1134,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2796,6 +2801,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Formulas.java index 2c5384955e..e520ae1fd5 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 952f2343ff..a2810c4b99 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index 90e9edd0b9..d175278761 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java index e6da831bc5..78ce5a2ffb 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/Config.java @@ -1063,6 +1063,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2558,6 +2563,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Formulas.java index fe3abcbfd0..3d9d1ccc5a 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 952f2343ff..a2810c4b99 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index 90e9edd0b9..d175278761 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java index 0cd2ac3ab9..fa808c8daf 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/Config.java @@ -1067,6 +1067,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2565,6 +2570,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Formulas.java index fe3abcbfd0..3d9d1ccc5a 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 952f2343ff..a2810c4b99 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index 90e9edd0b9..d175278761 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java index 0cd2ac3ab9..fa808c8daf 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/Config.java @@ -1067,6 +1067,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2565,6 +2570,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Formulas.java index fe3abcbfd0..3d9d1ccc5a 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 952f2343ff..a2810c4b99 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index 90e9edd0b9..d175278761 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java index 0cd2ac3ab9..fa808c8daf 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/Config.java @@ -1067,6 +1067,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2565,6 +2570,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Formulas.java index fe3abcbfd0..3d9d1ccc5a 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/Custom/ClassBalance.ini b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/Custom/ClassBalance.ini index 1eba8f2df8..0ea8b03373 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/Custom/ClassBalance.ini +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/config/Custom/ClassBalance.ini @@ -1,8 +1,7 @@ # --------------------------------------------------------------------------- # Class Balance # --------------------------------------------------------------------------- - -# Multiply attack and defence based on player class. +# Multiply parameters based on player class. # Example: ClassId1,Multiplier1;ClassId2,Multiplier2;... PveMagicalSkillDamageMultipliers = @@ -22,3 +21,11 @@ PvpPhysicalAttackDamageMultipliers = PvePhysicalAttackDefenceMultipliers = PvpPhysicalAttackDefenceMultipliers = + +PveBlowSkillDamageMultipliers = +PvpBlowSkillDamageMultipliers = + +PveBlowSkillDefenceMultipliers = +PvpBlowSkillDefenceMultipliers = + +PlayerHealingSkillMultipliers = diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/Heal.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/Heal.java index 952f2343ff..a2810c4b99 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/Heal.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/Heal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -109,6 +110,7 @@ public final class Heal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill)) { diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java index 90e9edd0b9..d175278761 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/dist/game/data/scripts/handlers/effecthandlers/HpCpHeal.java @@ -16,6 +16,7 @@ */ package handlers.effecthandlers; +import org.l2jmobius.Config; import org.l2jmobius.gameserver.enums.ShotType; import org.l2jmobius.gameserver.model.StatsSet; import org.l2jmobius.gameserver.model.actor.Creature; @@ -105,6 +106,7 @@ public final class HpCpHeal extends AbstractEffect amount += staticShotBonus + Math.sqrt(mAtkMul * effector.getMAtk()); amount *= effected.getStat().getValue(Stats.HEAL_EFFECT, 1); amount += effected.getStat().getValue(Stats.HEAL_EFFECT_ADD, 0); + amount *= (item == null) && effector.isPlayable() ? Config.PLAYER_HEALING_SKILL_MULTIPLIERS.getOrDefault(effector.getActingPlayer().getClassId(), 1f) : 1; // Heal critic, since CT2.3 Gracia Final if (skill.isMagic() && (Formulas.calcCrit(skill.getMagicCriticalRate(), effector, effected, skill) || effector.isAffected(EffectFlag.HPCPHEAL_CRITICAL))) { diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java index 0cd2ac3ab9..fa808c8daf 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/Config.java @@ -1067,6 +1067,11 @@ public final class Config public static Map PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); public static Map PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>(); + public static Map PLAYER_HEALING_SKILL_MULTIPLIERS = new ConcurrentHashMap<>(); public static boolean MULTILANG_ENABLE; public static List MULTILANG_ALLOWED = new ArrayList<>(); public static String MULTILANG_DEFAULT; @@ -2565,6 +2570,76 @@ public final class Config } } } + final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pveBlowSkillDamageMultipliers.length > 0) + { + for (String info : pveBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDamageMultipliers = ClassBalance.getString("PvpBlowSkillDamageMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear(); + if (pvpBlowSkillDamageMultipliers.length > 0) + { + for (String info : pvpBlowSkillDamageMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pveBlowSkillDefenceMultipliers = ClassBalance.getString("PveBlowSkillDefenceMultipliers", "").trim().split(";"); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pveBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pveBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] pvpBlowSkillDefenceMultipliers = ClassBalance.getString("PvpBlowSkillDefenceMultipliers", "").trim().split(";"); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.clear(); + if (pvpBlowSkillDefenceMultipliers.length > 0) + { + for (String info : pvpBlowSkillDefenceMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } + final String[] playerHealingSkillMultipliers = ClassBalance.getString("PlayerHealingSkillMultipliers", "").trim().split(";"); + PLAYER_HEALING_SKILL_MULTIPLIERS.clear(); + if (playerHealingSkillMultipliers.length > 0) + { + for (String info : playerHealingSkillMultipliers) + { + final String[] classInfo = info.trim().split(","); + if (classInfo.length == 2) + { + final String id = classInfo[0].trim(); + PLAYER_HEALING_SKILL_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim())); + } + } + } // Load CommunityBoard config file (if exists) final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE); diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Formulas.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Formulas.java index fe3abcbfd0..3d9d1ccc5a 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Formulas.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/Formulas.java @@ -120,11 +120,21 @@ public final class Formulas // power *= 1 - (Math.min(target.getLevel() - attacker.getLevel(), 9) / 10); // } + double balanceMod = 1; + if (attacker.isPlayable()) + { + balanceMod = target.isPlayable() ? Config.PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f); + } + if (target.isPlayable()) + { + defence *= attacker.isPlayable() ? Config.PVP_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f) : Config.PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(target.getActingPlayer().getClassId(), 1f); + } + // ........................_____________________________Initial Damage____________________________...___________Position Additional Damage___________..._CriticalAdd_ // ATTACK CALCULATION 77 * [(skillpower+patk) * 0.666 * cdbonus * cdPosBonusHalf * cdVulnHalf * ss + isBack0.2Side0.05 * (skillpower+patk*ss) * random + 6 * cd_patk] / pdef // ````````````````````````^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^```^^^^^^^^^^^^ final double baseMod = (77 * (((power + attacker.getPAtk()) * 0.666) + (isPosition * (power + attacker.getPAtk()) * randomMod) + (6 * cdPatk))) / defence; - final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod; + final double damage = baseMod * ssmod * cdMult * weaponTraitMod * generalTraitMod * weaknessMod * attributeMod * randomMod * pvpPveMod * balanceMod; return damage; }