Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- =============================
- Index: GameServer.java
- =============================
- +import net.sf.l2j.gameserver.dev.manager.ClassDamageManager;
- import net.sf.l2j.gameserver.geoengine.GeoEngine;
- -StringUtil.printSection("Characters");
- +StringUtil.printSection("Characters");
- + ClassDamageManager.loadConfig();
- =============================
- Index: AdminAdmin.java
- =============================
- +import net.sf.l2j.gameserver.dev.manager.ClassDamageManager;
- import net.sf.l2j.gameserver.handler.IAdminCommandHandler;
- else if (type.startsWith("config"))
- {
- Config.loadGameServer();
- + ClassDamageManager.reload();
- activeChar.sendMessage("Configs files have been reloaded.");
- }
- =============================
- Index: net/sf/l2j/gameserver/dev/manager/ClassDamageManager.java
- =============================
- + package net.sf.l2j.gameserver.dev.manager;
- +
- + import java.io.File;
- + import java.io.FileInputStream;
- + import java.io.InputStream;
- + import java.util.HashMap;
- + import java.util.Hashtable;
- + import java.util.Map;
- + import java.util.Properties;
- + import java.util.Set;
- + import java.util.logging.Logger;
- +
- + import net.sf.l2j.gameserver.model.actor.Player;
- +
- + /**
- + * @author BAN - L2JDEV
- + */
- + public class ClassDamageManager
- + {
- + private static Logger LOG = Logger.getLogger(ClassDamageManager.class.getName());
- + private static final Map<String, Integer> classNameToIdMap = new HashMap<>();
- +
- + private static Hashtable<Integer, Double> damage_to_mage = new Hashtable<>();
- + private static Hashtable<Integer, Double> damage_to_fighter = new Hashtable<>();
- +
- + private static Hashtable<Integer, Double> damage_by_mage = new Hashtable<>();
- + private static Hashtable<Integer, Double> damage_by_fighter = new Hashtable<>();
- +
- + private static Hashtable<Integer, String> id_to_name = new Hashtable<>();
- + private static Hashtable<String, Integer> name_to_id = new Hashtable<>();
- +
- + public static final String CLASS_DAMAGES_FILE = "./config/classDamages.properties";
- +
- + static
- + {
- + classNameToIdMap.put("Human Fighter", 0);
- + classNameToIdMap.put("Warrior", 1);
- + classNameToIdMap.put("Gladiator", 2);
- + classNameToIdMap.put("Warlord", 3);
- + classNameToIdMap.put("Human Knight", 4);
- + classNameToIdMap.put("Paladin", 5);
- + classNameToIdMap.put("Dark Avenger", 6);
- + classNameToIdMap.put("Rogue", 7);
- + classNameToIdMap.put("Treasure Hunter", 8);
- + classNameToIdMap.put("Hawkeye", 9);
- + classNameToIdMap.put("Human Mage", 10);
- + classNameToIdMap.put("Human Wizard", 11);
- + classNameToIdMap.put("Sorcerer", 12);
- + classNameToIdMap.put("Necromancer", 13);
- + classNameToIdMap.put("Warlock", 14);
- + classNameToIdMap.put("Cleric", 15);
- + classNameToIdMap.put("Bishop", 16);
- + classNameToIdMap.put("Human Prophet", 17);
- + classNameToIdMap.put("Elf Fighter", 18);
- + classNameToIdMap.put("Elf Knight", 19);
- + classNameToIdMap.put("Temple Knight", 20);
- + classNameToIdMap.put("Swordsinger", 21);
- + classNameToIdMap.put("Scout", 22);
- + classNameToIdMap.put("Plains Walker", 23);
- + classNameToIdMap.put("Silver Ranger", 24);
- + classNameToIdMap.put("Elf Mage", 25);
- + classNameToIdMap.put("Elf Wizard", 26);
- + classNameToIdMap.put("Spellsinger", 27);
- + classNameToIdMap.put("Elemental Summoner", 28);
- + classNameToIdMap.put("Oracle", 29);
- + classNameToIdMap.put("Elder", 30);
- + classNameToIdMap.put("DE Fighter", 31);
- + classNameToIdMap.put("Palus Knight", 32);
- + classNameToIdMap.put("Shillien Knight", 33);
- + classNameToIdMap.put("Bladedancer", 34);
- + classNameToIdMap.put("Assassin", 35);
- + classNameToIdMap.put("Abyss Walker", 36);
- + classNameToIdMap.put("Phantom Ranger", 37);
- + classNameToIdMap.put("DE Mage", 38);
- + classNameToIdMap.put("DE Wizard", 39);
- + classNameToIdMap.put("Spell Howler", 40);
- + classNameToIdMap.put("Phantom Summoner", 41);
- + classNameToIdMap.put("Shillien Oracle", 42);
- + classNameToIdMap.put("Shillien Elder", 43);
- + classNameToIdMap.put("Orc Fighter", 44);
- + classNameToIdMap.put("Raider", 45);
- + classNameToIdMap.put("Destroyer", 46);
- + classNameToIdMap.put("Monk", 47);
- + classNameToIdMap.put("Tyrant", 48);
- + classNameToIdMap.put("Orc Mage", 49);
- + classNameToIdMap.put("Shaman", 50);
- + classNameToIdMap.put("Overlord", 51);
- + classNameToIdMap.put("Warcryer", 52);
- + classNameToIdMap.put("Dwarf Fighter", 53);
- + classNameToIdMap.put("Scavenger", 54);
- + classNameToIdMap.put("Bounty Hunter", 55);
- + classNameToIdMap.put("Artisan", 56);
- + classNameToIdMap.put("Warsmith", 57);
- + classNameToIdMap.put("Duelist", 88);
- + classNameToIdMap.put("DreadNought", 89);
- + classNameToIdMap.put("Phoenix Knight", 90);
- + classNameToIdMap.put("Hell Knight", 91);
- + classNameToIdMap.put("Sagittarius", 92);
- + classNameToIdMap.put("Adventurer", 93);
- + classNameToIdMap.put("Archmage", 94);
- + classNameToIdMap.put("Soultaker", 95);
- + classNameToIdMap.put("Arcana Lord", 96);
- + classNameToIdMap.put("Cardinal", 97);
- + classNameToIdMap.put("Hierophant", 98);
- + classNameToIdMap.put("Eva Templar", 99);
- + classNameToIdMap.put("Sword Muse", 100);
- + classNameToIdMap.put("Wind Rider", 101);
- + classNameToIdMap.put("Moonlight Sentinel", 102);
- + classNameToIdMap.put("Mystic Muse", 103);
- + classNameToIdMap.put("Elemental Master", 104);
- + classNameToIdMap.put("Eva's Saint", 105);
- + classNameToIdMap.put("Shillien Templar", 106);
- + classNameToIdMap.put("Spectral Dancer", 107);
- + classNameToIdMap.put("Ghost Hunter", 108);
- + classNameToIdMap.put("Ghost Sentinel", 109);
- + classNameToIdMap.put("Storm Screamer", 110);
- + classNameToIdMap.put("Spectral Master", 111);
- + classNameToIdMap.put("Shillen Saint", 112);
- + classNameToIdMap.put("Titan", 113);
- + classNameToIdMap.put("Grand Khauatari", 114);
- + classNameToIdMap.put("Dominator", 115);
- + classNameToIdMap.put("Doomcryer", 116);
- + classNameToIdMap.put("Fortune Seeker", 117);
- + classNameToIdMap.put("Maestro", 118);
- +
- + }
- +
- + public static int getClassIdByName(String className)
- + {
- + // Check for special cases
- + if (className.equals("Eva s Saint"))
- + {
- + className = "Eva's Saint";
- + }
- +
- + // Retrieve class ID from the map, default to -1 if not found
- + return classNameToIdMap.getOrDefault(className, -1);
- + }
- +
- + public static void reload()
- + {
- + classNameToIdMap.clear();
- + id_to_name.clear();
- + name_to_id.clear();
- + damage_to_fighter.clear();
- + damage_to_mage.clear();
- + damage_by_fighter.clear();
- + damage_by_mage.clear();
- +
- + final String SCRIPT = CLASS_DAMAGES_FILE;
- + File file = new File(SCRIPT);
- +
- + try (InputStream is = new FileInputStream(file))
- + {
- + final Properties scriptSetting = new Properties();
- + scriptSetting.load(is);
- +
- + final Set<Object> key_set = scriptSetting.keySet();
- +
- + for (final Object key : key_set)
- + {
- + final String key_string = (String) key;
- +
- + final String[] class_and_type = key_string.split("__");
- +
- + String class_name = class_and_type[0].replace("_", " ");
- +
- + // Check for special cases
- + if (class_name.equals("Eva s Saint"))
- + {
- + class_name = "Eva's Saint";
- + }
- +
- + final String type = class_and_type[1];
- +
- + final Integer classId = getClassIdByName(class_name);
- +
- + if (classId != -1)
- + {
- + id_to_name.put(classId, class_name);
- + name_to_id.put(class_name, classId);
- +
- + if (type.equals("ToFighter"))
- + {
- + damage_to_fighter.put(classId, Double.parseDouble(scriptSetting.getProperty(key_string)));
- + }
- + else if (type.equals("ToMage"))
- + {
- + damage_to_mage.put(classId, Double.parseDouble(scriptSetting.getProperty(key_string)));
- + }
- + else if (type.equals("ByFighter"))
- + {
- + damage_by_fighter.put(classId, Double.parseDouble(scriptSetting.getProperty(key_string)));
- + }
- + else if (type.equals("ByMage"))
- + {
- + damage_by_mage.put(classId, Double.parseDouble(scriptSetting.getProperty(key_string)));
- + }
- + }
- + }
- +
- + }
- + catch (final Exception e)
- + {
- + LOG.severe("Erro ao carregar configurações de dano de classe: " + e.getMessage());
- + e.printStackTrace();
- + }
- + }
- +
- + public static void loadConfig()
- + {
- + final String SCRIPT = CLASS_DAMAGES_FILE;
- + File file = new File(SCRIPT);
- +
- + try (InputStream is = new FileInputStream(file))
- + {
- + final Properties scriptSetting = new Properties();
- + scriptSetting.load(is);
- +
- + final Set<Object> key_set = scriptSetting.keySet();
- +
- + for (final Object key : key_set)
- + {
- + final String key_string = (String) key;
- +
- + final String[] class_and_type = key_string.split("__");
- +
- + String class_name = class_and_type[0].replace("_", " ");
- +
- + // Check for special cases
- + if (class_name.equals("Eva s Saint"))
- + {
- + class_name = "Eva's Saint";
- + }
- +
- + final String type = class_and_type[1];
- +
- + final Integer classId = getClassIdByName(class_name);
- +
- + if (classId != -1)
- + {
- + id_to_name.put(classId, class_name);
- + name_to_id.put(class_name, classId);
- +
- + if (type.equals("ToFighter"))
- + {
- + damage_to_fighter.put(classId, Double.parseDouble(scriptSetting.getProperty(key_string)));
- + }
- + else if (type.equals("ToMage"))
- + {
- + damage_to_mage.put(classId, Double.parseDouble(scriptSetting.getProperty(key_string)));
- + }
- + else if (type.equals("ByFighter"))
- + {
- + damage_by_fighter.put(classId, Double.parseDouble(scriptSetting.getProperty(key_string)));
- + }
- + else if (type.equals("ByMage"))
- + {
- + damage_by_mage.put(classId, Double.parseDouble(scriptSetting.getProperty(key_string)));
- + }
- + }
- + }
- +
- + LOG.info("ClassDamageManager: Loaded " + id_to_name.size() + " class damage configurations");
- + }
- + catch (final Exception e)
- + {
- + LOG.severe("Erro ao carregar configurações de dano de classe: " + e.getMessage());
- + e.printStackTrace();
- + }
- + }
- +
- + public static double getClassDamageToMage(final int id)
- + {
- +
- + final Double multiplier = damage_to_mage.get(id);
- +
- + if (multiplier != null)
- + return multiplier;
- + return 1;
- + }
- +
- + public static double getClassDamageToFighter(final int id)
- + {
- + final Double multiplier = damage_to_fighter.get(id);
- + if (multiplier != null)
- + return multiplier;
- + return 1;
- + }
- +
- + public static double getClassDamageByMage(final int id)
- + {
- + final Double multiplier = damage_by_mage.get(id);
- + if (multiplier != null)
- + return multiplier;
- + return 1;
- + }
- +
- + public static double getClassDamageByFighter(final int id)
- + {
- + final Double multiplier = damage_by_fighter.get(id);
- + if (multiplier != null)
- + return multiplier;
- + return 1;
- + }
- +
- + public static int getIdByName(final String name)
- + {
- +
- + final Integer id = name_to_id.get(name);
- + if (id != null)
- + return id;
- + return 0;
- + }
- +
- + public static String getNameById(final int id)
- + {
- +
- + final String name = id_to_name.get(id);
- + if (name != null)
- + return name;
- + return "";
- + }
- +
- + public static double getDamageMultiplier(Player attacker, Player attacked)
- + {
- +
- + if (attacker == null || attacked == null)
- + return 1;
- +
- + double attackerMulti = 1;
- +
- + if (attacked.isMageClass())
- + attackerMulti = getClassDamageToMage(attacker.getClassId().getId());
- + else
- + attackerMulti = getClassDamageToFighter(attacker.getClassId().getId());
- +
- + double attackedMulti = 1;
- +
- + if (attacker.isMageClass())
- + attackedMulti = getClassDamageByMage(attacked.getClassId().getId());
- + else
- + attackedMulti = getClassDamageByFighter(attacked.getClassId().getId());
- +
- + final double output = attackerMulti * attackedMulti;
- + return output;
- + }
- +
- + }
- =============================
- Index: net.sf.l2j.gameserver.handler.skillhandlers.Pdam.java
- =============================
- +import net.sf.l2j.gameserver.dev.manager.ClassDamageManager;
- import net.sf.l2j.gameserver.enums.items.ShotType;
- + if (activeChar instanceof Player && target instanceof Player)
- + {
- + damage *= ClassDamageManager.getDamageMultiplier((Player) activeChar, (Player) target);
- + }
- activeChar.sendDamageMessage(target, damage, false, crit, false);
- =============================
- Index: net.sf.l2j.gameserver.handler.skillhandlers.Mdam.java
- =============================
- // Manage cast break of the target (calculating rate, sending message...)
- Formulas.calcCastBreak(target, damage);
- + if (activeChar instanceof Player && target instanceof Player)
- + {
- + damage *= ClassDamageManager.getDamageMultiplier((Player) activeChar, (Player) target);
- + }
- // vengeance reflected damage
- if ((reflect & Formulas.SKILL_REFLECT_VENGEANCE) != 0)
- =============================
- Index: config/classDamages.properties
- =============================
- + #============================================================#
- + # Class Balance System #
- + #============================================================#
- + # Example: 1.0 = default, 1.1 = +10% power, 0.9 = -10% power,
- + # 2.0 = +200% (x2) power
- + #-------------------------------------------------------------
- + # Damage to Fighter -
- + #-------------------------------------------------------------
- + # 2nd class
- + Gladiator__ToFighter = 1.0
- + Warlord__ToFighter = 1.0
- + Paladin__ToFighter = 1.0
- + Dark_Avenger__ToFighter = 1.0
- + Hawkeye__ToFighter = 1.3
- + Treasure_Hunter__ToFighter = 0.8
- + Sorcerer__ToFighter = 1.0
- + Necromancer__ToFighter = 1.0
- + Warlock__ToFighter = 1.0
- + Bishop__ToFighter = 1.0
- + Prophet__ToFighter = 1.0
- + Temple_Knight__ToFighter = 1.0
- + Swordsinger__ToFighter = 1.0
- + Plainswalker__ToFighter = 0.8
- + Silver_Ranger__ToFighter = 1.3
- + Spellsinger__ToFighter = 1.0
- + Elemental_Summoner__ToFighter = 1.0
- + Elven_Elder__ToFighter = 1.0
- + Shillien_Knight__ToFighter = 1.0
- + Bladedancer__ToFighter = 1.0
- + Abyss_Walker__ToFighter = 0.8
- + Phantom_Ranger__ToFighter = 1.3
- + Spellhowler__ToFighter = 1.0
- + Phantom_Summoner__ToFighter = 1.0
- + Shillien_Elder__ToFighter = 1.0
- + Destroyer__ToFighter = 1.0
- + Tyrant__ToFighter = 1.0
- + Overlord__ToFighter = 1.0
- + Warcryer__ToFighter = 1.0
- + Bounty_Hunter__ToFighter = 1.0
- + Warsmith__ToFighter = 1.0
- + # 3rd class
- + Duelist__ToFighter = 1.0
- + DreadNought__ToFighter = 1.0
- + Phoenix_Knight__ToFighter = 1.0
- + Hell_Knight__ToFighter = 1.0
- + Sagittarius__ToFighter = 1.3
- + Adventurer__ToFighter = 0.8
- + Archmage__ToFighter = 1.0
- + Soultaker__ToFighter = 1.0
- + Arcana_Lord__ToFighter = 1.0
- + Cardinal__ToFighter = 1.0
- + Hierophant__ToFighter = 1.0
- + Eva_Templar__ToFighter = 1.0
- + Sword_Muse__ToFighter = 1.0
- + Wind_Rider__ToFighter = 0.8
- + Moonlight_Sentinel__ToFighter = 1.3
- + Mystic_Muse__ToFighter = 1.0
- + Elemental_Master__ToFighter = 1.0
- + Eva_s_Saint__ToFighter = 1.0
- + Shillien_Templar__ToFighter = 1.0
- + Spectral_Dancer__ToFighter = 1.0
- + Ghost_Hunter__ToFighter = 0.8
- + Ghost_Sentinel__ToFighter = 1.3
- + Storm_Screamer__ToFighter = 1.0
- + Spectral_Master__ToFighter = 1.0
- + Shillien_Saint__ToFighter = 1.0
- + Titan__ToFighter = 1.0
- + Grand_Khauatari__ToFighter = 1.0
- + Dominator__ToFighter = 1.0
- + Doomcryer__ToFighter = 1.0
- + Fortune_Seeker__ToFighter = 1.0
- + Maestro__ToFighter = 1.0
- + #-------------------------------------------------------------
- + # Damage to Mage -
- + #-------------------------------------------------------------
- + # 2nd class
- + Gladiator__ToMage = 1.0
- + Warlord__ToMage = 1.0
- + Paladin__ToMage = 1.0
- + Dark_Avenger__ToMage = 1.0
- + Hawkeye__ToMage = 1.3
- + Treasure_Hunter__ToMage = 0.8
- + Sorcerer__ToMage = 1.0
- + Necromancer__ToMage = 1.0
- + Warlock__ToMage = 1.0
- + Bishop__ToMage = 1.0
- + Prophet__ToMage = 1.0
- + Temple_Knight__ToMage = 1.0
- + Swordsinger__ToMage = 1.0
- + Plainswalker__ToMage = 0.8
- + Silver_Ranger__ToMage = 1.3
- + Spellsinger__ToMage = 1.0
- + Elemental_Summoner__ToMage = 1.0
- + Elven_Elder__ToMage = 1.0
- + Shillien_Knight__ToMage = 1.0
- + Bladedancer__ToMage = 1.0
- + Abyss_Walker__ToMage = 0.8
- + Phantom_Ranger__ToMage = 1.2
- + Spellhowler__ToMage = 1.0
- + Phantom_Summoner__ToMage = 1.0
- + Shillien_Elder__ToMage = 1.0
- + Destroyer__ToMage = 1.0
- + Tyrant__ToMage = 1.0
- + Overlord__ToMage = 1.0
- + Warcryer__ToMage = 1.0
- + Bounty_Hunter__ToMage = 1.0
- + Warsmith__ToMage = 1.0
- + # 3rd class
- + Duelist__ToMage = 1.0
- + DreadNought__ToMage = 1.0
- + Phoenix_Knight__ToMage = 1.0
- + Hell_Knight__ToMage = 1.0
- + Sagittarius__ToMage = 1.3
- + Adventurer__ToMage = 0.8
- + Archmage__ToMage = 1.0
- + Soultaker__ToMage = 1.0
- + Arcana_Lord__ToMage = 1.0
- + Cardinal__ToMage = 1.0
- + Hierophant__ToMage = 1.0
- + Eva_Templar__ToMage = 1.0
- + Sword_Muse__ToMage = 1.0
- + Wind_Rider__ToMage = 0.8
- + Moonlight_Sentinel__ToMage = 1.3
- + Mystic_Muse__ToMage = 1.0
- + Elemental_Master__ToMage = 1.0
- + Eva_s_Saint__ToMage = 1.0
- + Shillien_Templar__ToMage = 1.0
- + Spectral_Dancer__ToMage = 1.0
- + Ghost_Hunter__ToMage = 0.8
- + Ghost_Sentinel__ToMage = 1.2
- + Storm_Screamer__ToMage = 1.0
- + Spectral_Master__ToMage = 1.0
- + Shillien_Saint__ToMage = 1.0
- + Titan__ToMage = 1.0
- + Grand_Khauatari__ToMage = 1.0
- + Dominator__ToMage = 1.0
- + Doomcryer__ToMage = 1.0
- + Fortune_Seeker__ToMage = 1.0
- + Maestro__ToMage = 1.0
- + #-------------------------------------------------------------
- + # Damage By Fighter -
- + #-------------------------------------------------------------
- + # 2nd class
- + Gladiator__ByFighter = 1.0
- + Warlord__ByFighter = 1.0
- + Paladin__ByFighter = 1.0
- + Dark_Avenger__ByFighter = 1.0
- + Hawkeye__ByFighter = 1.0
- + Treasure_Hunter__ByFighter = 1.0
- + Sorcerer__ByFighter = 1.0
- + Necromancer__ByFighter = 1.0
- + Warlock__ByFighter = 1.0
- + Bishop__ByFighter = 1.0
- + Prophet__ByFighter = 1.0
- + Temple_Knight__ByFighter = 1.0
- + Swordsinger__ByFighter = 1.0
- + Plainswalker__ByFighter = 1.0
- + Silver_Ranger__ByFighter = 1.0
- + Spellsinger__ByFighter = 1.0
- + Elemental_Summoner__ByFighter = 1.0
- + Elven_Elder__ByFighter = 1.0
- + Shillien_Knight__ByFighter = 1.0
- + Bladedancer__ByFighter = 1.0
- + Abyss_Walker__ByFighter = 1.0
- + Phantom_Ranger__ByFighter = 1.0
- + Spellhowler__ByFighter = 1.0
- + Phantom_Summoner__ByFighter = 1.0
- + Shillien_Elder__ByFighter = 1.0
- + Destroyer__ByFighter = 1.0
- + Tyrant__ByFighter = 1.0
- + Overlord__ByFighter = 1.0
- + Warcryer__ByFighter = 1.0
- + Bounty_Hunter__ByFighter = 1.0
- + Warsmith__ByFighter = 1.0
- + # 3rd class
- + Duelist__ByFighter = 1.0
- + DreadNought__ByFighter = 1.0
- + Phoenix_Knight__ByFighter = 1.0
- + Hell_Knight__ByFighter = 1.0
- + Sagittarius__ByFighter = 1.0
- + Adventurer__ByFighter = 1.0
- + Archmage__ByFighter = 1.0
- + Soultaker__ByFighter = 1.0
- + Arcana_Lord__ByFighter = 1.0
- + Cardinal__ByFighter = 1.0
- + Hierophant__ByFighter = 1.0
- + Eva_Templar__ByFighter = 1.0
- + Sword_Muse__ByFighter = 1.0
- + Wind_Rider__ByFighter = 1.0
- + Moonlight_Sentinel__ByFighter = 1.0
- + Mystic_Muse__ByFighter = 1.0
- + Elemental_Master__ByFighter = 1.0
- + Eva_s_Saint__ByFighter = 1.0
- + Shillien_Templar__ByFighter = 1.0
- + Spectral_Dancer__ByFighter = 1.0
- + Ghost_Hunter__ByFighter = 1.0
- + Ghost_Sentinel__ByFighter = 1.0
- + Storm_Screamer__ByFighter = 1.0
- + Spectral_Master__ByFighter = 1.0
- + Shillien_Saint__ByFighter = 1.0
- + Titan__ByFighter = 1.0
- + Grand_Khauatari__ByFighter = 1.0
- + Dominator__ByFighter = 1.0
- + Doomcryer__ByFighter = 1.0
- + Fortune_Seeker__ByFighter = 1.0
- + Maestro__ByFighter = 1.0
- + #-------------------------------------------------------------
- + # Damage By Mage -
- + #-------------------------------------------------------------
- + # 2nd class
- + Gladiator__ByMage = 1.0
- + Warlord__ByMage = 1.0
- + Paladin__ByMage = 1.0
- + Dark_Avenger__ByMage = 1.0
- + Hawkeye__ByMage = 0.8
- + Treasure_Hunter__ByMage = 1.0
- + Sorcerer__ByMage = 1.0
- + Necromancer__ByMage = 1.0
- + Warlock__ByMage = 1.0
- + Bishop__ByMage = 1.0
- + Prophet__ByMage = 1.0
- + Temple_Knight__ByMage = 1.0
- + Swordsinger__ByMage = 1.0
- + Plainswalker__ByMage = 1.0
- + Silver_Ranger__ByMage = 1.0
- + Spellsinger__ByMage = 0.8
- + Elemental_Summoner__ByMage = 1.0
- + Elven_Elder__ByMage = 1.0
- + Shillien_Knight__ByMage = 1.0
- + Bladedancer__ByMage = 1.0
- + Abyss_Walker__ByMage = 1.0
- + Phantom_Ranger__ByMage = 1.0
- + Spellhowler__ByMage = 1.0
- + Phantom_Summoner__ByMage = 1.0
- + Shillien_Elder__ByMage = 1.0
- + Destroyer__ByMage = 1.0
- + Tyrant__ByMage = 1.0
- + Overlord__ByMage = 1.0
- + Warcryer__ByMage = 1.0
- + Bounty_Hunter__ByMage = 1.0
- + Warsmith__ByMage = 1.0
- + # 3rd
- + Duelist__ByMage = 1.0
- + DreadNought__ByMage = 1.0
- + Phoenix_Knight__ByMage = 1.0
- + Hell_Knight__ByMage = 1.0
- + Sagittarius__ByMage = 0.8
- + Adventurer__ByMage = 1.0
- + Archmage__ByMage = 0.8
- + Soultaker__ByMage = 1.0
- + Arcana_Lord__ByMage = 1.0
- + Cardinal__ByMage = 1.0
- + Hierophant__ByMage = 1.0
- + Eva_Templar__ByMage = 1.0
- + Sword_Muse__ByMage = 1.0
- + Wind_Rider__ByMage = 1.0
- + Moonlight_Sentinel__ByMage = 1.0
- + Mystic_Muse__ByMage = 0.8
- + Elemental_Master__ByMage = 1.0
- + Eva_s_Saint__ByMage = 1.0
- + Shillien_Templar__ByMage = 1.0
- + Spectral_Dancer__ByMage = 1.0
- + Ghost_Hunter__ByMage = 1.0
- + Ghost_Sentinel__ByMage = 1.0
- + Storm_Screamer__ByMage = 1.0
- + Spectral_Master__ByMage = 1.0
- + Shillien_Saint__ByMage = 1.0
- + Titan__ByMage = 1.0
- + Grand_Khauatari__ByMage = 1.0
- + Dominator__ByMage = 1.0
- + Doomcryer__ByMage = 1.0
- + Fortune_Seeker__ByMage = 1.0
- + Maestro__ByMage = 1.0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement