Addition of custom class balance configurations.
This commit is contained in:
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -111,6 +112,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1104,6 +1106,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2493,6 +2507,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -112,6 +113,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1111,6 +1113,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2510,6 +2524,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
+16
-14
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -112,6 +113,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1119,6 +1121,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2525,6 +2539,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -112,6 +113,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1106,6 +1108,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2499,6 +2513,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
+16
-14
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -114,6 +115,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1102,6 +1104,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2575,6 +2589,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -114,6 +115,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1102,6 +1104,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2575,6 +2589,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -114,6 +115,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1119,6 +1121,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2610,6 +2624,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -112,6 +113,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1048,6 +1050,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2372,6 +2386,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
+16
-14
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -112,6 +113,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1052,6 +1054,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2379,6 +2393,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
+16
-14
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -112,6 +113,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1052,6 +1054,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2379,6 +2393,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
+16
-14
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -112,6 +113,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1052,6 +1054,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2379,6 +2393,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
+16
-14
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Class Balance
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Multiply attack and defence based on player class.
|
||||||
|
# Example: ClassId1,Multiplier1;ClassId2,Multiplier2;...
|
||||||
|
|
||||||
|
PveMagicalSkillDamageMultipiers =
|
||||||
|
PvpMagicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PveMagicalSkillDefenceMultipiers =
|
||||||
|
PvpMagicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDamageMultipiers =
|
||||||
|
PvpPhysicalSkillDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalSkillDefenceMultipiers =
|
||||||
|
PvpPhysicalSkillDefenceMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDamageMultipiers =
|
||||||
|
PvpPhysicalAttackDamageMultipiers =
|
||||||
|
|
||||||
|
PvePhysicalAttackDefenceMultipiers =
|
||||||
|
PvpPhysicalAttackDefenceMultipiers =
|
||||||
@@ -43,6 +43,7 @@ import java.util.List;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
@@ -112,6 +113,7 @@ public final class Config
|
|||||||
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
private static final String CUSTOM_BANKING_CONFIG_FILE = "./config/Custom/Banking.ini";
|
||||||
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
private static final String CUSTOM_CHAMPION_MONSTERS_CONFIG_FILE = "./config/Custom/ChampionMonsters.ini";
|
||||||
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
private static final String CUSTOM_CHAT_MODERATION_CONFIG_FILE = "./config/Custom/ChatModeration.ini";
|
||||||
|
private static final String CUSTOM_CLASS_BALANCE_CONFIG_FILE = "./config/Custom/ClassBalance.ini";
|
||||||
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
private static final String CUSTOM_COMMUNITY_BOARD_CONFIG_FILE = "./config/Custom/CommunityBoard.ini";
|
||||||
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
private static final String CUSTOM_CUSTOM_MAIL_MANAGER_CONFIG_FILE = "./config/Custom/CustomMailManager.ini";
|
||||||
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
private static final String CUSTOM_DUALBOX_CHECK_CONFIG_FILE = "./config/Custom/DualboxCheck.ini";
|
||||||
@@ -1052,6 +1054,18 @@ public final class Config
|
|||||||
public static String TITLE_FOR_PVP_AMOUNT4;
|
public static String TITLE_FOR_PVP_AMOUNT4;
|
||||||
public static String TITLE_FOR_PVP_AMOUNT5;
|
public static String TITLE_FOR_PVP_AMOUNT5;
|
||||||
public static boolean CHAT_ADMIN;
|
public static boolean CHAT_ADMIN;
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
|
public static Map<Integer, Float> PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS = new ConcurrentHashMap<>();
|
||||||
public static boolean MULTILANG_ENABLE;
|
public static boolean MULTILANG_ENABLE;
|
||||||
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
public static List<String> MULTILANG_ALLOWED = new ArrayList<>();
|
||||||
public static String MULTILANG_DEFAULT;
|
public static String MULTILANG_DEFAULT;
|
||||||
@@ -2379,6 +2393,166 @@ public final class Config
|
|||||||
|
|
||||||
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
CHAT_ADMIN = ChatModeration.getBoolean("ChatAdmin", true);
|
||||||
|
|
||||||
|
// Load ClassBalance config file (if exists)
|
||||||
|
final PropertiesParser ClassBalance = new PropertiesParser(CUSTOM_CLASS_BALANCE_CONFIG_FILE);
|
||||||
|
|
||||||
|
final String[] pveMagicalSkillDamageMultipiers = ClassBalance.getString("PveMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDamageMultipiers = ClassBalance.getString("PvpMagicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pveMagicalSkillDefenceMultipiers = ClassBalance.getString("PveMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pveMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pveMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpMagicalSkillDefenceMultipiers = ClassBalance.getString("PvpMagicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpMagicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpMagicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDamageMultipiers = ClassBalance.getString("PvePhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDamageMultipiers = ClassBalance.getString("PvpPhysicalSkillDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalSkillDefenceMultipiers = ClassBalance.getString("PvePhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalSkillDefenceMultipiers = ClassBalance.getString("PvpPhysicalSkillDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalSkillDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalSkillDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDamageMultipiers = ClassBalance.getString("PvePhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDamageMultipiers = ClassBalance.getString("PvpPhysicalAttackDamageMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDamageMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDamageMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvePhysicalAttackDefenceMultipiers = ClassBalance.getString("PvePhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvePhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvePhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
final String[] pvpPhysicalAttackDefenceMultipiers = ClassBalance.getString("PvpPhysicalAttackDefenceMultipiers", "").trim().split(";");
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.clear();
|
||||||
|
if (pvpPhysicalAttackDefenceMultipiers.length > 0)
|
||||||
|
{
|
||||||
|
for (String info : pvpPhysicalAttackDefenceMultipiers)
|
||||||
|
{
|
||||||
|
final String[] classInfo = info.trim().split(",");
|
||||||
|
if (classInfo.length == 2)
|
||||||
|
{
|
||||||
|
PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.put(Integer.parseInt(classInfo[0].trim()), Float.parseFloat(classInfo[1].trim()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Load CommunityBoard config file (if exists)
|
// Load CommunityBoard config file (if exists)
|
||||||
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
final PropertiesParser CommunityBoard = new PropertiesParser(CUSTOM_COMMUNITY_BOARD_CONFIG_FILE);
|
||||||
|
|
||||||
|
|||||||
+16
-14
@@ -1527,6 +1527,8 @@ public final class Formulas
|
|||||||
|
|
||||||
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
public static double calculatePvpPveBonus(Creature attacker, Creature target, Skill skill, boolean crit)
|
||||||
{
|
{
|
||||||
|
final PlayerInstance player = attacker.getActingPlayer();
|
||||||
|
|
||||||
// PvP bonus
|
// PvP bonus
|
||||||
if (attacker.isPlayable() && target.isPlayable())
|
if (attacker.isPlayable() && target.isPlayable())
|
||||||
{
|
{
|
||||||
@@ -1537,21 +1539,21 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvP
|
// Magical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DAMAGE, 1) * Config.PVP_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_MAGICAL_SKILL_DEFENCE, 1) * Config.PVP_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvP
|
// Physical Skill PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DAMAGE, 1) * Config.PVP_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_SKILL_DEFENCE, 1) * Config.PVP_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvP
|
// Autoattack PvP
|
||||||
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1);
|
pvpAttack = attacker.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DAMAGE, 1) * Config.PVP_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1);
|
pvpDefense = target.getStat().getValue(Stats.PVP_PHYSICAL_ATTACK_DEFENCE, 1) * Config.PVP_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1 + (pvpAttack - pvpDefense);
|
return 1 + (pvpAttack - pvpDefense);
|
||||||
@@ -1565,9 +1567,9 @@ public final class Formulas
|
|||||||
final double pveRaidDefense;
|
final double pveRaidDefense;
|
||||||
|
|
||||||
double pvePenalty = 1;
|
double pvePenalty = 1;
|
||||||
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (attacker.getActingPlayer() != null) && ((target.getLevel() - attacker.getActingPlayer().getLevel()) >= 2))
|
if (!target.isRaid() && !target.isRaidMinion() && (target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY) && (player != null) && ((target.getLevel() - player.getLevel()) >= 2))
|
||||||
{
|
{
|
||||||
final int lvlDiff = target.getLevel() - attacker.getActingPlayer().getLevel() - 1;
|
final int lvlDiff = target.getLevel() - player.getLevel() - 1;
|
||||||
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
if (lvlDiff >= Config.NPC_SKILL_DMG_PENALTY.size())
|
||||||
{
|
{
|
||||||
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
pvePenalty = Config.NPC_SKILL_DMG_PENALTY.get(Config.NPC_SKILL_DMG_PENALTY.size() - 1);
|
||||||
@@ -1583,23 +1585,23 @@ public final class Formulas
|
|||||||
if (skill.isMagic())
|
if (skill.isMagic())
|
||||||
{
|
{
|
||||||
// Magical Skill PvE
|
// Magical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_MAGICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_MAGICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_MAGICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Physical Skill PvE
|
// Physical Skill PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_SKILL_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_SKILL_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_SKILL_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Autoattack PvE
|
// Autoattack PvE
|
||||||
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1);
|
pveAttack = attacker.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DAMAGE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DAMAGE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1);
|
pveDefense = target.getStat().getValue(Stats.PVE_PHYSICAL_ATTACK_DEFENCE, 1) * (player == null ? 1 : Config.PVE_PHYSICAL_ATTACK_DEFENCE_MULTIPLIERS.getOrDefault(player.getClassId().getId(), 1f));
|
||||||
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
pveRaidDefense = attacker.isRaid() ? attacker.getStat().getValue(Stats.PVE_RAID_PHYSICAL_ATTACK_DEFENCE, 1) : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user