Balance mod for critical chance and damage.
This commit is contained in:
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1111,14 +1111,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2572,6 +2584,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2628,6 +2696,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2684,6 +2808,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1118,14 +1118,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2589,6 +2601,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2645,6 +2713,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2701,6 +2825,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1126,14 +1126,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2604,6 +2616,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2660,6 +2728,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2716,6 +2840,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1113,14 +1113,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2578,6 +2590,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2634,6 +2702,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2690,6 +2814,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
+36
-5
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1109,14 +1109,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2654,6 +2666,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2710,6 +2778,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2766,6 +2890,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1109,14 +1109,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2654,6 +2666,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2710,6 +2778,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2766,6 +2890,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1126,14 +1126,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2689,6 +2701,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2745,6 +2813,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2801,6 +2925,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1055,14 +1055,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2451,6 +2463,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2507,6 +2575,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2563,6 +2687,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
+36
-5
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1059,14 +1059,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2458,6 +2470,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2514,6 +2582,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2570,6 +2694,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
+36
-5
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1059,14 +1059,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2458,6 +2470,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2514,6 +2582,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2570,6 +2694,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
+36
-5
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1059,14 +1059,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2458,6 +2470,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2514,6 +2582,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2570,6 +2694,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
+36
-5
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
+18
@@ -10,18 +10,36 @@ PvpMagicalSkillDamageMultipliers =
|
|||||||
PveMagicalSkillDefenceMultipliers =
|
PveMagicalSkillDefenceMultipliers =
|
||||||
PvpMagicalSkillDefenceMultipliers =
|
PvpMagicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpMagicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PveMagicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpMagicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDamageMultipliers =
|
PvePhysicalSkillDamageMultipliers =
|
||||||
PvpPhysicalSkillDamageMultipliers =
|
PvpPhysicalSkillDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalSkillDefenceMultipliers =
|
PvePhysicalSkillDefenceMultipliers =
|
||||||
PvpPhysicalSkillDefenceMultipliers =
|
PvpPhysicalSkillDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalSkillCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalSkillCriticalDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDamageMultipliers =
|
PvePhysicalAttackDamageMultipliers =
|
||||||
PvpPhysicalAttackDamageMultipliers =
|
PvpPhysicalAttackDamageMultipliers =
|
||||||
|
|
||||||
PvePhysicalAttackDefenceMultipliers =
|
PvePhysicalAttackDefenceMultipliers =
|
||||||
PvpPhysicalAttackDefenceMultipliers =
|
PvpPhysicalAttackDefenceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalChanceMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalChanceMultipliers =
|
||||||
|
|
||||||
|
PvePhysicalAttackCriticalDamageMultipliers =
|
||||||
|
PvpPhysicalAttackCriticalDamageMultipliers =
|
||||||
|
|
||||||
PveBlowSkillDamageMultipliers =
|
PveBlowSkillDamageMultipliers =
|
||||||
PvpBlowSkillDamageMultipliers =
|
PvpBlowSkillDamageMultipliers =
|
||||||
|
|
||||||
|
|||||||
@@ -1059,14 +1059,26 @@ public final class Config
|
|||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<ClassId, Float> PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVP_BLOW_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
public static Map<ClassId, Float> PVE_BLOW_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
@@ -2458,6 +2470,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PveMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PveMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpMagicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalSkillDamageMultipliers = ClassBalance.getString("PvePhysicalSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
if (pvePhysicalSkillDamageMultipliers.length > 0)
|
||||||
@@ -2514,6 +2582,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalSkillCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
final String[] pvePhysicalAttackDamageMultipliers = ClassBalance.getString("PvePhysicalAttackDamageMultipliers", "").trim().split(";");
|
||||||
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
if (pvePhysicalAttackDamageMultipliers.length > 0)
|
||||||
@@ -2570,6 +2694,62 @@ public final class Config
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalChanceMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalChanceMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalChanceMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalChanceMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvePhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackCriticalDamageMultipliers = ClassBalance.getString("PvpPhysicalAttackCriticalDamageMultipliers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackCriticalDamageMultipliers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackCriticalDamageMultipliers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split("[*]");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
final String id = classInfo[0].trim();
|
||||||
|
PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.put(Util.isDigit(id) ? ClassId.getClassId(Integer.parseInt(id)) : Enum.valueOf(ClassId.class, id), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
final String[] pveBlowSkillDamageMultipliers = ClassBalance.getString("PveBlowSkillDamageMultipliers", "").trim().split(";");
|
||||||
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
PVE_BLOW_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
if (pveBlowSkillDamageMultipliers.length > 0)
|
if (pveBlowSkillDamageMultipliers.length > 0)
|
||||||
|
|||||||
+36
-5
@@ -230,7 +230,13 @@ public final class Formulas
|
|||||||
return Math.min(finalRate, 32) > Rnd.get(100);
|
return Math.min(finalRate, 32) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.min(finalRate, 20) > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (Math.min(finalRate, 20) * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Physical skill critical rate.
|
// Physical skill critical rate.
|
||||||
@@ -250,8 +256,14 @@ public final class Formulas
|
|||||||
}
|
}
|
||||||
|
|
||||||
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
final double rateBonus = creature.getStat().getValue(Stats.CRITICAL_RATE_SKILL, 1);
|
||||||
double finalRate = rate * statBonus * rateBonus;
|
|
||||||
return finalRate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * statBonus * rateBonus * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Autoattack critical rate.
|
// Autoattack critical rate.
|
||||||
@@ -271,7 +283,13 @@ public final class Formulas
|
|||||||
// Autoattack critical rate is limited between 3%-97%.
|
// Autoattack critical rate is limited between 3%-97%.
|
||||||
rate = CommonUtil.constrain(rate, 3, 97);
|
rate = CommonUtil.constrain(rate, 3, 97);
|
||||||
|
|
||||||
return rate > Rnd.get(100);
|
double balanceMod = 1;
|
||||||
|
if (creature.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_CHANCE_MULTIPLIERS.getOrDefault(creature.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (rate * balanceMod) > Rnd.get(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -315,6 +333,7 @@ public final class Formulas
|
|||||||
{
|
{
|
||||||
final double criticalDamage;
|
final double criticalDamage;
|
||||||
final double defenceCriticalDamage;
|
final double defenceCriticalDamage;
|
||||||
|
double balanceMod = 1;
|
||||||
|
|
||||||
if (skill != null)
|
if (skill != null)
|
||||||
{
|
{
|
||||||
@@ -323,11 +342,19 @@ public final class Formulas
|
|||||||
// Magic critical damage.
|
// Magic critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_MAGIC_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_MAGICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE_SKILL, 1);
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE_SKILL, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_SKILL_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -335,9 +362,13 @@ public final class Formulas
|
|||||||
// Autoattack critical damage.
|
// Autoattack critical damage.
|
||||||
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
criticalDamage = attacker.getStat().getValue(Stats.CRITICAL_DAMAGE, 1) * attacker.getStat().getPositionTypeValue(Stats.CRITICAL_DAMAGE, Position.getPosition(attacker, target));
|
||||||
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
defenceCriticalDamage = target.getStat().getValue(Stats.DEFENCE_CRITICAL_DAMAGE, 1);
|
||||||
|
if (attacker.isPlayable())
|
||||||
|
{
|
||||||
|
balanceMod = target.isPlayable() ? Config.PVP_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f) : Config.PVE_PHYSICAL_ATTACK_CRITICAL_DAMAGE_MULTIPLIERS.getOrDefault(attacker.getActingPlayer().getClassId(), 1f);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 2 * criticalDamage * defenceCriticalDamage;
|
return 2 * criticalDamage * defenceCriticalDamage * balanceMod;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user