Noticias:

Debes de estar registrado para poder ver el contenido indicado. Registrate o Conectate

Menú Principal

Better Champions

Iniciado por Swarlog, Ago 31, 2022, 08:05 PM

Tema anterior - Siguiente tema

Swarlog

Blue (Easy)
-  Easy champions have Blue Aura (Blue Team)
- Easy champions are much easy to kill but he give lower exp/drop reward.

Red (Hard)
- Hard champions have Red Aura (Red Team)
- Hard champions are hard to kill, but he give better exp/drop reward.

### Eclipse Workspace Patch 1.0
#P L2J_DataPack_BETA
Index: dist/game/data/scripts/handlers/admincommandhandlers/AdminKill.java
===================================================================
--- dist/game/data/scripts/handlers/admincommandhandlers/AdminKill.java (revision 10308)
+++ dist/game/data/scripts/handlers/admincommandhandlers/AdminKill.java (working copy)
@@ -22,9 +22,11 @@
 import java.util.logging.Logger;
 
 import com.l2jserver.Config;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2World;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2ControllableMobInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
@@ -135,9 +137,9 @@
  }
  target.reduceCurrentHp(target.getMaxHp() + target.getMaxCp() + 1, activeChar, null);
  }
- else if (Config.L2JMOD_CHAMPION_ENABLE && target.isChampion())
+ else if (ChampionData.getInstance().isEnabled() && target.isChampion())
  {
- target.reduceCurrentHp((target.getMaxHp() * Config.L2JMOD_CHAMPION_HP) + 1, activeChar, null);
+ target.reduceCurrentHp((target.getMaxHp() * ChampionData.getInstance().getHpMultipler((L2Attackable) target)) + 1, activeChar, null);
  }
  else
  {
Index: dist/game/data/scripts/handlers/admincommandhandlers/AdminMenu.java
===================================================================
--- dist/game/data/scripts/handlers/admincommandhandlers/AdminMenu.java (revision 10308)
+++ dist/game/data/scripts/handlers/admincommandhandlers/AdminMenu.java (working copy)
@@ -22,14 +22,15 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import com.l2jserver.Config;
 import com.l2jserver.gameserver.datatables.AdminTable;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.handler.AdminCommandHandler;
 import com.l2jserver.gameserver.handler.IAdminCommandHandler;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.L2World;
 import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.network.SystemMessageId;
@@ -253,9 +254,9 @@
  target.reduceCurrentHp(target.getMaxHp() + target.getMaxCp() + 1, activeChar, null);
  filename = "charmanage.htm";
  }
- else if (Config.L2JMOD_CHAMPION_ENABLE && target.isChampion())
+ else if (ChampionData.getInstance().isEnabled() && target.isChampion())
  {
- target.reduceCurrentHp((target.getMaxHp() * Config.L2JMOD_CHAMPION_HP) + 1, activeChar, null);
+ target.reduceCurrentHp((target.getMaxHp() * ChampionData.getInstance().getHpMultipler((L2Attackable) target)) + 1, activeChar, null);
  }
  else
  {
#P L2J_Server_BETA
Index: java/com/l2jserver/gameserver/model/actor/L2Character.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/L2Character.java (revision 6514)
+++ java/com/l2jserver/gameserver/model/actor/L2Character.java (working copy)
@@ -45,6 +45,7 @@
 import com.l2jserver.gameserver.ai.L2AttackableAI;
 import com.l2jserver.gameserver.ai.L2CharacterAI;
 import com.l2jserver.gameserver.datatables.CategoryData;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.datatables.DoorTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.SkillData;
@@ -6552,9 +6553,9 @@
 
  public void reduceCurrentHp(double i, L2Character attacker, boolean awake, boolean isDOT, Skill skill)
  {
- if (Config.L2JMOD_CHAMPION_ENABLE && isChampion() && (Config.L2JMOD_CHAMPION_HP != 0))
+ if (ChampionData.getInstance().isEnabled() && isChampion())
  {
- getStatus().reduceHp(i / Config.L2JMOD_CHAMPION_HP, attacker, awake, isDOT, false);
+ getStatus().reduceHp(i / ChampionData.getInstance().getHpMultipler((L2Attackable) this), attacker, awake, isDOT, false);
  }
  else
  {
Index: java/com/l2jserver/gameserver/model/actor/L2Attackable.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/L2Attackable.java (revision 6514)
+++ java/com/l2jserver/gameserver/model/actor/L2Attackable.java (working copy)
@@ -33,6 +33,7 @@
 import com.l2jserver.gameserver.ai.L2CharacterAI;
 import com.l2jserver.gameserver.ai.L2FortSiegeGuardAI;
 import com.l2jserver.gameserver.ai.L2SiegeGuardAI;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.datatables.EventDroplist;
 import com.l2jserver.gameserver.datatables.EventDroplist.DateDrop;
 import com.l2jserver.gameserver.datatables.ItemTable;
@@ -77,6 +78,7 @@
  private boolean _isRaid = false;
  private boolean _isRaidMinion = false;
  private boolean _champion = false;
+ private boolean _isHardChamp = false;
  private final Map<L2Character, AggroInfo> _aggroList = new ConcurrentHashMap<>();
  private boolean _isReturningToSpawnPoint = false;
  private boolean _canReturnToSpawnPoint = true;
@@ -501,10 +503,10 @@
  long exp = expSp[0];
  int sp = expSp[1];
 
- if (Config.L2JMOD_CHAMPION_ENABLE && isChampion())
+ if (ChampionData.getInstance().isEnabled() && isChampion())
  {
- exp *= Config.L2JMOD_CHAMPION_REWARDS;
- sp *= Config.L2JMOD_CHAMPION_REWARDS;
+ exp *= ChampionData.getInstance().getRewardMultipler(this);
+ sp *= ChampionData.getInstance().getRewardMultipler(this);
  }
 
  exp *= penalty;
@@ -610,10 +612,10 @@
  long exp = expSp[0];
  int sp = expSp[1];
 
- if (Config.L2JMOD_CHAMPION_ENABLE && isChampion())
+ if (ChampionData.getInstance().isEnabled() && isChampion())
  {
- exp *= Config.L2JMOD_CHAMPION_REWARDS;
- sp *= Config.L2JMOD_CHAMPION_REWARDS;
+ exp *= ChampionData.getInstance().getRewardMultipler(this);
+ sp *= ChampionData.getInstance().getRewardMultipler(this);
  }
 
  exp *= partyMul;
@@ -1046,12 +1048,11 @@
  }
 
  // Apply Special Item drop with random(rnd) quantity(qty) for champions.
- if (Config.L2JMOD_CHAMPION_ENABLE && isChampion() && ((Config.L2JMOD_CHAMPION_REWARD_LOWER_LVL_ITEM_CHANCE > 0) || (Config.L2JMOD_CHAMPION_REWARD_HIGHER_LVL_ITEM_CHANCE > 0)))
+ if (ChampionData.getInstance().isEnabled() && isChampion() && ((ChampionData.getInstance().getLowerLvChance(this) > 0) || (ChampionData.getInstance().getHigherLvChance(this) > 0)))
  {
- int champqty = Rnd.get(Config.L2JMOD_CHAMPION_REWARD_QTY);
- ItemHolder item = new ItemHolder(Config.L2JMOD_CHAMPION_REWARD_ID, ++champqty);
-
- if ((player.getLevel() <= getLevel()) && (Rnd.get(100) < Config.L2JMOD_CHAMPION_REWARD_LOWER_LVL_ITEM_CHANCE))
+ int champqty = Rnd.get(ChampionData.getInstance().getRewardCount(this));
+ ItemHolder item = new ItemHolder(ChampionData.getInstance().getRewardId(this), ++champqty);
+ if ((player.getLevel() <= getLevel()) && (Rnd.get(100) < ChampionData.getInstance().getLowerLvChance(this)))
  {
  if (Config.AUTO_LOOT || isFlying())
  {
@@ -1062,7 +1063,7 @@
  dropItem(player, item);
  }
  }
- else if ((player.getLevel() > getLevel()) && (Rnd.get(100) < Config.L2JMOD_CHAMPION_REWARD_HIGHER_LVL_ITEM_CHANCE))
+ else if ((player.getLevel() > getLevel()) && (Rnd.get(100) < ChampionData.getInstance().getHigherLvChance(this)))
  {
  if (Config.AUTO_LOOT || isFlying())
  {
@@ -1694,7 +1695,7 @@
  */
  public boolean useVitalityRate()
  {
- if (isChampion() && !Config.L2JMOD_CHAMPION_ENABLE_VITALITY)
+ if (isChampion() && !ChampionData.getInstance().isEnabledVitality(this))
  {
  return false;
  }
@@ -1759,6 +1760,16 @@
  return _champion;
  }
 
+ public void setHardChampion(boolean champ)
+ {
+ _isHardChamp = champ;
+ }
+
+ public boolean isHardChampion()
+ {
+ return _isHardChamp;
+ }
+
  @Override
  public boolean isAttackable()
  {
Index: java/com/l2jserver/gameserver/model/stats/Formulas.java
===================================================================
--- java/com/l2jserver/gameserver/model/stats/Formulas.java (revision 6514)
+++ java/com/l2jserver/gameserver/model/stats/Formulas.java (working copy)
@@ -25,6 +25,7 @@
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.SevenSigns;
 import com.l2jserver.gameserver.SevenSignsFestival;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.datatables.HitConditionBonus;
 import com.l2jserver.gameserver.datatables.KarmaData;
 import com.l2jserver.gameserver.instancemanager.CastleManager;
@@ -254,9 +255,9 @@
  double hpRegenMultiplier = cha.isRaid() ? Config.RAID_HP_REGEN_MULTIPLIER : Config.HP_REGEN_MULTIPLIER;
  double hpRegenBonus = 0;
 
- if (Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion())
+ if (ChampionData.getInstance().isEnabled() && cha.isChampion())
  {
- hpRegenMultiplier *= Config.L2JMOD_CHAMPION_HP_REGEN;
+ hpRegenMultiplier *= ChampionData.getInstance().getHpRegMultipler((L2Attackable) cha);
  }
 
  if (cha.isPlayer())
Index: java/com/l2jserver/gameserver/model/quest/Quest.java
===================================================================
--- java/com/l2jserver/gameserver/model/quest/Quest.java (revision 6514)
+++ java/com/l2jserver/gameserver/model/quest/Quest.java (working copy)
@@ -38,6 +38,7 @@
 import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.ThreadPoolManager;
 import com.l2jserver.gameserver.cache.HtmCache;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.datatables.DoorTable;
 import com.l2jserver.gameserver.datatables.ItemTable;
 import com.l2jserver.gameserver.datatables.NpcData;
@@ -3520,18 +3521,18 @@
  minAmount *= Config.RATE_QUEST_DROP;
  maxAmount *= Config.RATE_QUEST_DROP;
  dropChance *= Config.RATE_QUEST_DROP; // TODO separate configs for rate and amount
- if ((npc != null) && Config.L2JMOD_CHAMPION_ENABLE && npc.isChampion())
+ if ((npc != null) && ChampionData.getInstance().isEnabled() && npc.isChampion())
  {
- dropChance *= Config.L2JMOD_CHAMPION_REWARDS;
+ dropChance *= ChampionData.getInstance().getRewardMultipler((L2Attackable) npc);
  if ((itemId == Inventory.ADENA_ID) || (itemId == Inventory.ANCIENT_ADENA_ID))
  {
- minAmount *= Config.L2JMOD_CHAMPION_ADENAS_REWARDS;
- maxAmount *= Config.L2JMOD_CHAMPION_ADENAS_REWARDS;
+ minAmount *= ChampionData.getInstance().getAdenaMultipler((L2Attackable) npc);
+ maxAmount *= ChampionData.getInstance().getAdenaMultipler((L2Attackable) npc);
  }
  else
  {
- minAmount *= Config.L2JMOD_CHAMPION_REWARDS;
- maxAmount *= Config.L2JMOD_CHAMPION_REWARDS;
+ minAmount *= ChampionData.getInstance().getRewardMultipler((L2Attackable) npc);
+ maxAmount *= ChampionData.getInstance().getRewardMultipler((L2Attackable) npc);
  }
  }
 
Index: java/com/l2jserver/gameserver/ai/L2AttackableAI.java
===================================================================
--- java/com/l2jserver/gameserver/ai/L2AttackableAI.java (revision 6514)
+++ java/com/l2jserver/gameserver/ai/L2AttackableAI.java (working copy)
@@ -32,6 +32,7 @@
 import com.l2jserver.gameserver.GameTimeController;
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.datatables.NpcData;
 import com.l2jserver.gameserver.datatables.TerritoryTable;
 import com.l2jserver.gameserver.enums.AISkillScope;
@@ -292,7 +293,7 @@
  return false;
  }
 
- if (me.isChampion() && Config.L2JMOD_CHAMPION_PASSIVE)
+ if (me.isChampion() && ChampionData.getInstance().isPassive(me))
  {
  return false;
  }
Index: java/com/l2jserver/Config.java
===================================================================
--- java/com/l2jserver/Config.java (revision 6514)
+++ java/com/l2jserver/Config.java (working copy)
@@ -104,6 +104,7 @@
  public static final String CHAT_FILTER_FILE = "./config/chatfilter.txt";
  public static final String EMAIL_CONFIG_FILE = "./config/Email.properties";
  public static final String CH_SIEGE_FILE = "./config/ConquerableHallSiege.properties";
+ public static final String CHAMPION_MOD = "./config/ChampionMod.properties";
  // --------------------------------------------------
  // L2J Variable Definitions
  // --------------------------------------------------
@@ -680,24 +681,6 @@
  // --------------------------------------------------
  // L2JMods Settings
  // --------------------------------------------------
- public static boolean L2JMOD_CHAMPION_ENABLE;
- public static boolean L2JMOD_CHAMPION_PASSIVE;
- public static int L2JMOD_CHAMPION_FREQUENCY;
- public static String L2JMOD_CHAMP_TITLE;
- public static int L2JMOD_CHAMP_MIN_LVL;
- public static int L2JMOD_CHAMP_MAX_LVL;
- public static int L2JMOD_CHAMPION_HP;
- public static int L2JMOD_CHAMPION_REWARDS;
- public static float L2JMOD_CHAMPION_ADENAS_REWARDS;
- public static float L2JMOD_CHAMPION_HP_REGEN;
- public static float L2JMOD_CHAMPION_ATK;
- public static float L2JMOD_CHAMPION_SPD_ATK;
- public static int L2JMOD_CHAMPION_REWARD_LOWER_LVL_ITEM_CHANCE;
- public static int L2JMOD_CHAMPION_REWARD_HIGHER_LVL_ITEM_CHANCE;
- public static int L2JMOD_CHAMPION_REWARD_ID;
- public static int L2JMOD_CHAMPION_REWARD_QTY;
- public static boolean L2JMOD_CHAMPION_ENABLE_VITALITY;
- public static boolean L2JMOD_CHAMPION_ENABLE_IN_INSTANCES;
  public static boolean TVT_EVENT_ENABLED;
  public static boolean TVT_EVENT_IN_INSTANCE;
  public static String TVT_EVENT_INSTANCE_FILE;
@@ -989,6 +972,40 @@
  public static int STARTING_VITALITY_POINTS;
 
  // --------------------------------------------------
+ // Champion Mod Settings
+ // --------------------------------------------------
+ public static boolean CHAMPION_ENABLE;
+ public static boolean CHAMPION_PASSIVE;
+ public static int CHAMPION_FREQUENCY_EASY;
+ public static int CHAMPION_FREQUENCY_HARD;
+ public static String CHAMPION_TITLE_EASY;
+ public static String CHAMPION_TITLE_HARD;
+ public static int CHAMPION_MIN_LVL_EASY;
+ public static int CHAMPION_MIN_LVL_HARD;
+ public static int CHAMPION_MAX_LVL_EASY;
+ public static int CHAMPION_MAX_LVL_HARD;
+ public static int CHAMPION_HP_EASY;
+ public static int CHAMPION_HP_HARD;
+ public static int CHAMPION_REWARDS_EASY;
+ public static int CHAMPION_REWARDS_HARD;
+ public static float CHAMPION_ADENAS_REWARD_EASY;
+ public static float CHAMPION_ADENAS_REWARD_HARD;
+ public static float CHAMPION_HP_REGEN_EASY;
+ public static float CHAMPION_HP_REGEN_HARD;
+ public static float CHAMPION_ATK_EASY;
+ public static float CHAMPION_ATK_HARD;
+ public static float CHAMPION_SPD_ATK_EASY;
+ public static float CHAMPION_SPD_ATK_HARD;
+ public static int CHAMPION_REWARD_LOWER_LVL_ITEM_CHANCE;
+ public static int CHAMPION_REWARD_HIGHER_LVL_ITEM_CHANCE;
+ public static int CHAMPION_REWARD_ID_EASY;
+ public static int CHAMPION_REWARD_ID_HARD;
+ public static int CHAMPION_REWARD_QTY_EASY;
+ public static int CHAMPION_REWARD_QTY_HARD;
+ public static boolean CHAMPION_ENABLE_VITALITY;
+ public static boolean CHAMPION_ENABLE_IN_INSTANCES;
+
+ // --------------------------------------------------
  // No classification assigned to the following yet
  // --------------------------------------------------
  public static int MAX_ITEM_IN_PACKET;
@@ -2264,28 +2281,41 @@
  }
  }
 
+ // Load Champion Mod L2Properties file (if exists)
+ final PropertiesParser ChampionMod = new PropertiesParser(CHAMPION_MOD);
+ CHAMPION_ENABLE = ChampionMod.getBoolean("ChampionEnable", false);
+ CHAMPION_PASSIVE = ChampionMod.getBoolean("ChampionPassive", false);
+ CHAMPION_ENABLE_VITALITY = ChampionMod.getBoolean("ChampionEnableVitality", false);
+ CHAMPION_ENABLE_IN_INSTANCES = ChampionMod.getBoolean("ChampionEnableInInstances", false);
+ CHAMPION_REWARD_LOWER_LVL_ITEM_CHANCE = ChampionMod.getInt("ChampionRewardLowerLvlItemChance", 0);
+ CHAMPION_REWARD_HIGHER_LVL_ITEM_CHANCE = ChampionMod.getInt("ChampionRewardHigherLvlItemChance", 0);
+ CHAMPION_FREQUENCY_EASY = ChampionMod.getInt("ChampionFrequencyEasy", 0);
+ CHAMPION_FREQUENCY_HARD = ChampionMod.getInt("ChampionFrequencyHard", 0);
+ CHAMPION_TITLE_EASY = ChampionMod.getString("ChampionTitleEasy", "Easy Champion");
+ CHAMPION_TITLE_HARD = ChampionMod.getString("ChampionTitleHard", "Hard Champion");
+ CHAMPION_MIN_LVL_EASY = ChampionMod.getInt("ChampionMinLevelEasy", 20);
+ CHAMPION_MIN_LVL_HARD = ChampionMod.getInt("ChampionMinLevelHard", 20);
+ CHAMPION_MAX_LVL_EASY = ChampionMod.getInt("ChampionMaxLevelEasy", 60);
+ CHAMPION_MAX_LVL_HARD = ChampionMod.getInt("ChampionMaxLevelHard", 60);
+ CHAMPION_HP_EASY = ChampionMod.getInt("ChampionHpEasy", 7);
+ CHAMPION_HP_HARD = ChampionMod.getInt("ChampionHpHard", 14);
+ CHAMPION_HP_REGEN_EASY = ChampionMod.getFloat("ChampionHpRegenEasy", 1);
+ CHAMPION_HP_REGEN_HARD = ChampionMod.getFloat("ChampionHpRegenHard", 1);
+ CHAMPION_REWARDS_EASY = ChampionMod.getInt("ChampionRewardsEasy", 2);
+ CHAMPION_REWARDS_HARD = ChampionMod.getInt("ChampionRewardsHard", 3);
+ CHAMPION_ADENAS_REWARD_EASY = ChampionMod.getFloat("ChampionAdenasRewardsEasy", 1);
+ CHAMPION_ADENAS_REWARD_HARD = ChampionMod.getFloat("ChampionAdenasRewardsHard", 2);
+ CHAMPION_ATK_EASY = ChampionMod.getFloat("ChampionAtkEasy", 1);
+ CHAMPION_ATK_HARD = ChampionMod.getFloat("ChampionAtkHard", 2);
+ CHAMPION_SPD_ATK_EASY = ChampionMod.getFloat("ChampionSpdAtkEasy", 1);
+ CHAMPION_SPD_ATK_HARD = ChampionMod.getFloat("ChampionSpdAtkHard", 2);
+ CHAMPION_REWARD_ID_EASY = ChampionMod.getInt("ChampionRewardItemIDEasy", 6393);
+ CHAMPION_REWARD_ID_HARD = ChampionMod.getInt("ChampionRewardItemIDHard", 6393);
+ CHAMPION_REWARD_QTY_EASY = ChampionMod.getInt("ChampionRewardItemQtyEasy", 1);
+ CHAMPION_REWARD_QTY_HARD = ChampionMod.getInt("ChampionRewardItemQtyHard", 2);
+
  // Load L2JMod L2Properties file (if exists)
  final PropertiesParser L2JModSettings = new PropertiesParser(L2JMOD_CONFIG_FILE);
-
- L2JMOD_CHAMPION_ENABLE = L2JModSettings.getBoolean("ChampionEnable", false);
- L2JMOD_CHAMPION_PASSIVE = L2JModSettings.getBoolean("ChampionPassive", false);
- L2JMOD_CHAMPION_FREQUENCY = L2JModSettings.getInt("ChampionFrequency", 0);
- L2JMOD_CHAMP_TITLE = L2JModSettings.getString("ChampionTitle", "Champion");
- L2JMOD_CHAMP_MIN_LVL = L2JModSettings.getInt("ChampionMinLevel", 20);
- L2JMOD_CHAMP_MAX_LVL = L2JModSettings.getInt("ChampionMaxLevel", 60);
- L2JMOD_CHAMPION_HP = L2JModSettings.getInt("ChampionHp", 7);
- L2JMOD_CHAMPION_HP_REGEN = L2JModSettings.getFloat("ChampionHpRegen", 1);
- L2JMOD_CHAMPION_REWARDS = L2JModSettings.getInt("ChampionRewards", 8);
- L2JMOD_CHAMPION_ADENAS_REWARDS = L2JModSettings.getFloat("ChampionAdenasRewards", 1);
- L2JMOD_CHAMPION_ATK = L2JModSettings.getFloat("ChampionAtk", 1);
- L2JMOD_CHAMPION_SPD_ATK = L2JModSettings.getFloat("ChampionSpdAtk", 1);
- L2JMOD_CHAMPION_REWARD_LOWER_LVL_ITEM_CHANCE = L2JModSettings.getInt("ChampionRewardLowerLvlItemChance", 0);
- L2JMOD_CHAMPION_REWARD_HIGHER_LVL_ITEM_CHANCE = L2JModSettings.getInt("ChampionRewardHigherLvlItemChance", 0);
- L2JMOD_CHAMPION_REWARD_ID = L2JModSettings.getInt("ChampionRewardItemID", 6393);
- L2JMOD_CHAMPION_REWARD_QTY = L2JModSettings.getInt("ChampionRewardItemQty", 1);
- L2JMOD_CHAMPION_ENABLE_VITALITY = L2JModSettings.getBoolean("ChampionEnableVitality", false);
- L2JMOD_CHAMPION_ENABLE_IN_INSTANCES = L2JModSettings.getBoolean("ChampionEnableInInstances", false);
-
  TVT_EVENT_ENABLED = L2JModSettings.getBoolean("TvTEventEnabled", false);
  TVT_EVENT_IN_INSTANCE = L2JModSettings.getBoolean("TvTEventInInstance", false);
  TVT_EVENT_INSTANCE_FILE = L2JModSettings.getString("TvTEventInstanceFile", "coliseum.xml");
@@ -3517,51 +3547,6 @@
  case "commonrecipelimit":
  COMMON_RECIPE_LIMIT = Integer.parseInt(pValue);
  break;
- case "championenable":
- L2JMOD_CHAMPION_ENABLE = Boolean.parseBoolean(pValue);
- break;
- case "championfrequency":
- L2JMOD_CHAMPION_FREQUENCY = Integer.parseInt(pValue);
- break;
- case "championminlevel":
- L2JMOD_CHAMP_MIN_LVL = Integer.parseInt(pValue);
- break;
- case "championmaxlevel":
- L2JMOD_CHAMP_MAX_LVL = Integer.parseInt(pValue);
- break;
- case "championhp":
- L2JMOD_CHAMPION_HP = Integer.parseInt(pValue);
- break;
- case "championhpregen":
- L2JMOD_CHAMPION_HP_REGEN = Float.parseFloat(pValue);
- break;
- case "championrewards":
- L2JMOD_CHAMPION_REWARDS = Integer.parseInt(pValue);
- break;
- case "championadenasrewards":
- L2JMOD_CHAMPION_ADENAS_REWARDS = Float.parseFloat(pValue);
- break;
- case "championatk":
- L2JMOD_CHAMPION_ATK = Float.parseFloat(pValue);
- break;
- case "championspdatk":
- L2JMOD_CHAMPION_SPD_ATK = Float.parseFloat(pValue);
- break;
- case "championrewardlowerlvlitemchance":
- L2JMOD_CHAMPION_REWARD_LOWER_LVL_ITEM_CHANCE = Integer.parseInt(pValue);
- break;
- case "championrewardhigherlvlitemchance":
- L2JMOD_CHAMPION_REWARD_HIGHER_LVL_ITEM_CHANCE = Integer.parseInt(pValue);
- break;
- case "championrewarditemid":
- L2JMOD_CHAMPION_REWARD_ID = Integer.parseInt(pValue);
- break;
- case "championrewarditemqty":
- L2JMOD_CHAMPION_REWARD_QTY = Integer.parseInt(pValue);
- break;
- case "championenableininstances":
- L2JMOD_CHAMPION_ENABLE_IN_INSTANCES = Boolean.parseBoolean(pValue);
- break;
  case "allowwedding":
  L2JMOD_ALLOW_WEDDING = Boolean.parseBoolean(pValue);
  break;
Index: java/com/l2jserver/gameserver/datatables/ChampionData.java
===================================================================
--- java/com/l2jserver/gameserver/datatables/ChampionData.java (revision 0)
+++ java/com/l2jserver/gameserver/datatables/ChampionData.java (working copy)
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2004-2014 L2J Server
+ *
+ * This file is part of L2J Server.
+ *
+ * L2J Server is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * L2J Server is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.datatables;
+
+import java.util.logging.Logger;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
+
+/**
+ * @author St3eT
+ */
+public class ChampionData
+{
+ private static final Logger _log = Logger.getLogger(ChampionData.class.getName());
+
+ public boolean isEnabled()
+ {
+ return Config.CHAMPION_ENABLE;
+ }
+
+ public boolean isPassive(L2Attackable champion)
+ {
+ // TODO: Implement it for both champions.
+ return Config.CHAMPION_PASSIVE;
+ }
+
+ public String getTitle(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_TITLE_HARD : Config.CHAMPION_TITLE_EASY;
+ }
+
+ public int getChance(boolean isHard)
+ {
+ return isHard ? Config.CHAMPION_FREQUENCY_HARD : Config.CHAMPION_FREQUENCY_EASY;
+ }
+
+ public int getMinLv(boolean isHard)
+ {
+ return isHard ? Config.CHAMPION_MIN_LVL_HARD : Config.CHAMPION_MIN_LVL_EASY;
+ }
+
+ public int getMaxLv(boolean isHard)
+ {
+ return isHard ? Config.CHAMPION_MAX_LVL_HARD : Config.CHAMPION_MAX_LVL_EASY;
+ }
+
+ public int getHpMultipler(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_HP_HARD : Config.CHAMPION_HP_EASY;
+ }
+
+ public int getRewardMultipler(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_REWARDS_HARD : Config.CHAMPION_REWARDS_EASY;
+ }
+
+ public float getAdenaMultipler(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_ADENAS_REWARD_HARD : Config.CHAMPION_ADENAS_REWARD_EASY;
+ }
+
+ public float getHpRegMultipler(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_HP_REGEN_HARD : Config.CHAMPION_HP_REGEN_EASY;
+ }
+
+ public float getAttackMultipler(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_ATK_HARD : Config.CHAMPION_ATK_EASY;
+ }
+
+ public float getAttacSpdkMultipler(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_SPD_ATK_HARD : Config.CHAMPION_SPD_ATK_EASY;
+ }
+
+ public int getLowerLvChance(L2Attackable champion)
+ {
+ // TODO: Implement it for both champions.
+ return Config.CHAMPION_REWARD_LOWER_LVL_ITEM_CHANCE;
+ }
+
+ public int getHigherLvChance(L2Attackable champion)
+ {
+ // TODO: Implement it for both champions.
+ return Config.CHAMPION_REWARD_HIGHER_LVL_ITEM_CHANCE;
+ }
+
+ public int getRewardId(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_REWARD_ID_HARD : Config.CHAMPION_REWARD_ID_EASY;
+ }
+
+ public int getRewardCount(L2Attackable champion)
+ {
+ return champion.isHardChampion() ? Config.CHAMPION_REWARD_QTY_HARD : Config.CHAMPION_REWARD_QTY_EASY;
+ }
+
+ public boolean isEnabledVitality(L2Attackable champion)
+ {
+ // TODO: Implement it for both champions.
+ return Config.CHAMPION_ENABLE_VITALITY;
+ }
+
+ public boolean inInstanceEnabled()
+ {
+ return Config.CHAMPION_ENABLE_IN_INSTANCES;
+ }
+
+ /**
+ * Gets the single instance of ChampionData.
+ * @return single instance of ChampionData
+ */
+ public static ChampionData getInstance()
+ {
+ return SingletonHolder._instance;
+ }
+
+ private static class SingletonHolder
+ {
+ protected static final ChampionData _instance = new ChampionData();
+ }
+}
\ No newline at end of file
Index: java/com/l2jserver/gameserver/model/L2Spawn.java
===================================================================
--- java/com/l2jserver/gameserver/model/L2Spawn.java (revision 6514)
+++ java/com/l2jserver/gameserver/model/L2Spawn.java (working copy)
@@ -30,6 +30,7 @@
 import com.l2jserver.Config;
 import com.l2jserver.gameserver.GeoData;
 import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.datatables.NpcPersonalAIData;
 import com.l2jserver.gameserver.datatables.TerritoryTable;
 import com.l2jserver.gameserver.idfactory.IdFactory;
@@ -626,16 +627,26 @@
  ((L2Attackable) mob).setChampion(false);
  }
 
- if (Config.L2JMOD_CHAMPION_ENABLE)
+ if (ChampionData.getInstance().isEnabled())
  {
  // Set champion on next spawn
- if (mob.isMonster() && !getTemplate().isUndying() && !mob.isRaid() && !mob.isRaidMinion() && (Config.L2JMOD_CHAMPION_FREQUENCY > 0) && (mob.getLevel() >= Config.L2JMOD_CHAMP_MIN_LVL) && (mob.getLevel() <= Config.L2JMOD_CHAMP_MAX_LVL) && (Config.L2JMOD_CHAMPION_ENABLE_IN_INSTANCES || (getInstanceId() == 0)))
+ if (mob.isMonster() && !getTemplate().isUndying() && !mob.isRaid() && !mob.isRaidMinion() && (mob.getLevel() >= ChampionData.getInstance().getMinLv(false)) && (mob.getLevel() <= ChampionData.getInstance().getMaxLv(false)) && (ChampionData.getInstance().inInstanceEnabled() || (getInstanceId() == 0)))
  {
- if (Rnd.get(100) < Config.L2JMOD_CHAMPION_FREQUENCY)
+ if (Rnd.get(100) < ChampionData.getInstance().getChance(false))
  {
  ((L2Attackable) mob).setChampion(true);
+ ((L2Attackable) mob).setHardChampion(false);
  }
  }
+
+ if (mob.isMonster() && !getTemplate().isUndying() && !mob.isRaid() && !mob.isRaidMinion() && (mob.getLevel() >= ChampionData.getInstance().getMinLv(true)) && (mob.getLevel() <= ChampionData.getInstance().getMaxLv(true)) && (ChampionData.getInstance().inInstanceEnabled() || (getInstanceId() == 0)))
+ {
+ if (Rnd.get(100) < ChampionData.getInstance().getChance(true))
+ {
+ ((L2Attackable) mob).setChampion(true);
+ ((L2Attackable) mob).setHardChampion(true);
+ }
+ }
  }
 
  // Link the L2NpcInstance to this L2Spawn
Index: java/com/l2jserver/gameserver/model/drops/GeneralDropItem.java
===================================================================
--- java/com/l2jserver/gameserver/model/drops/GeneralDropItem.java (revision 6514)
+++ java/com/l2jserver/gameserver/model/drops/GeneralDropItem.java (working copy)
@@ -22,6 +22,8 @@
 import java.util.List;
 
 import com.l2jserver.Config;
+import com.l2jserver.gameserver.datatables.ChampionData;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.holders.ItemHolder;
 import com.l2jserver.gameserver.model.itemcontainer.Inventory;
@@ -81,7 +83,7 @@
  double multiplier = 1;
  if (victim.isChampion())
  {
- multiplier *= getItemId() != Inventory.ADENA_ID ? Config.L2JMOD_CHAMPION_REWARDS : Config.L2JMOD_CHAMPION_ADENAS_REWARDS;
+ multiplier *= getItemId() != Inventory.ADENA_ID ? ChampionData.getInstance().getRewardMultipler((L2Attackable) victim) : ChampionData.getInstance().getAdenaMultipler((L2Attackable) victim);
  }
  Float dropChanceMultiplier = Config.RATE_DROP_AMOUNT_MULTIPLIER.get(getItemId());
  if (dropChanceMultiplier != null)
@@ -111,7 +113,7 @@
  double multiplier = 1;
  if (victim.isChampion())
  {
- multiplier *= getItemId() != Inventory.ADENA_ID ? Config.L2JMOD_CHAMPION_REWARDS : Config.L2JMOD_CHAMPION_ADENAS_REWARDS;
+ multiplier *= getItemId() != Inventory.ADENA_ID ? ChampionData.getInstance().getRewardMultipler((L2Attackable) victim) : ChampionData.getInstance().getAdenaMultipler((L2Attackable) victim);
  }
  Float dropChanceMultiplier = Config.RATE_DROP_AMOUNT_MULTIPLIER.get(getItemId());
  if (dropChanceMultiplier != null)
Index: java/com/l2jserver/gameserver/model/actor/stat/CharStat.java
===================================================================
--- java/com/l2jserver/gameserver/model/actor/stat/CharStat.java (revision 6514)
+++ java/com/l2jserver/gameserver/model/actor/stat/CharStat.java (working copy)
@@ -21,8 +21,10 @@
 import java.util.Arrays;
 
 import com.l2jserver.Config;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.model.Elementals;
 import com.l2jserver.gameserver.model.PcCondOverride;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.items.L2Weapon;
 import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
@@ -298,9 +300,9 @@
  public int getMAtk(L2Character target, Skill skill)
  {
  float bonusAtk = 1;
- if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
+ if (ChampionData.getInstance().isEnabled() && _activeChar.isChampion())
  {
- bonusAtk = Config.L2JMOD_CHAMPION_ATK;
+ bonusAtk = ChampionData.getInstance().getAttackMultipler((L2Attackable) _activeChar);
  }
  if (_activeChar.isRaid())
  {
@@ -317,9 +319,9 @@
  public int getMAtkSpd()
  {
  float bonusSpdAtk = 1;
- if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
+ if (ChampionData.getInstance().isEnabled() && _activeChar.isChampion())
  {
- bonusSpdAtk = Config.L2JMOD_CHAMPION_SPD_ATK;
+ bonusSpdAtk = ChampionData.getInstance().getAttacSpdkMultipler((L2Attackable) _activeChar);
  }
 
  double val = calcStat(Stats.MAGIC_ATTACK_SPEED, _activeChar.getTemplate().getBaseMAtkSpd() * bonusSpdAtk);
@@ -429,9 +431,9 @@
  public int getPAtk(L2Character target)
  {
  float bonusAtk = 1;
- if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
+ if (ChampionData.getInstance().isEnabled() && _activeChar.isChampion())
  {
- bonusAtk = Config.L2JMOD_CHAMPION_ATK;
+ bonusAtk = ChampionData.getInstance().getAttackMultipler((L2Attackable) _activeChar);
  }
  if (_activeChar.isRaid())
  {
@@ -446,9 +448,9 @@
  public int getPAtkSpd()
  {
  float bonusAtk = 1;
- if (Config.L2JMOD_CHAMPION_ENABLE && _activeChar.isChampion())
+ if (ChampionData.getInstance().isEnabled() && _activeChar.isChampion())
  {
- bonusAtk = Config.L2JMOD_CHAMPION_SPD_ATK;
+ bonusAtk = ChampionData.getInstance().getAttacSpdkMultipler((L2Attackable) _activeChar);
  }
  int val = (int) Math.round(calcStat(Stats.POWER_ATTACK_SPEED, _activeChar.getTemplate().getBasePAtkSpd() * bonusAtk, null, null));
  return val;
Index: java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java
===================================================================
--- java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java (revision 6514)
+++ java/com/l2jserver/gameserver/network/serverpackets/AbstractNpcInfo.java (working copy)
@@ -19,10 +19,12 @@
 package com.l2jserver.gameserver.network.serverpackets;
 
 import com.l2jserver.Config;
+import com.l2jserver.gameserver.datatables.ChampionData;
 import com.l2jserver.gameserver.datatables.ClanTable;
 import com.l2jserver.gameserver.instancemanager.TownManager;
 import com.l2jserver.gameserver.model.L2Clan;
 import com.l2jserver.gameserver.model.PcCondOverride;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Summon;
@@ -103,9 +105,9 @@
  {
  _title = "Invisible";
  }
- else if (Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion())
+ else if (ChampionData.getInstance().isEnabled() && cha.isChampion())
  {
- _title = (Config.L2JMOD_CHAMP_TITLE); // On every subclass
+ _title = ChampionData.getInstance().getTitle((L2Attackable) cha); // On every subclass
  }
  else if (cha.getTemplate().isUsingServerSideTitle())
  {