diff --git a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_1.0_Ertheia/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_2.5_Underground/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_3.0_Helios/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_4.0_GrandCrusade/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_5.0_Salvation/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_5.5_EtinasFate/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_Classic_2.0_Saviors/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_Classic_2.1_Zaken/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_Classic_2.2_Antharas/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/Spoil.java b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/Spoil.java index 2d1b2ef1b3..f3bba984b7 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/Spoil.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/dist/game/data/scripts/handlers/effecthandlers/Spoil.java @@ -16,6 +16,8 @@ */ package handlers.effecthandlers; +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.Rnd; import com.l2jmobius.gameserver.ai.CtrlEvent; import com.l2jmobius.gameserver.model.StatsSet; import com.l2jmobius.gameserver.model.actor.L2Character; @@ -23,7 +25,6 @@ import com.l2jmobius.gameserver.model.actor.instance.L2MonsterInstance; import com.l2jmobius.gameserver.model.effects.AbstractEffect; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.skills.Skill; -import com.l2jmobius.gameserver.model.stats.Formulas; import com.l2jmobius.gameserver.network.SystemMessageId; /** @@ -39,7 +40,22 @@ public final class Spoil extends AbstractEffect @Override public boolean calcSuccess(L2Character effector, L2Character effected, Skill skill) { - return Formulas.calcMagicSuccess(effector, effected, skill); + final int lvlDifference = (effected.getLevel() - (skill.getMagicLevel() > 0 ? skill.getMagicLevel() : effector.getLevel())); + final double lvlModifier = Math.pow(1.3, lvlDifference); + float targetModifier = 1; + if (effected.isAttackable() && !effected.isRaid() && !effected.isRaidMinion() && (effected.getLevel() >= Config.MIN_NPC_LVL_MAGIC_PENALTY) && (effector.getActingPlayer() != null) && ((effected.getLevel() - effector.getActingPlayer().getLevel()) >= 3)) + { + final int lvlDiff = effected.getLevel() - effector.getActingPlayer().getLevel() - 2; + if (lvlDiff >= Config.NPC_SKILL_CHANCE_PENALTY.size()) + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(Config.NPC_SKILL_CHANCE_PENALTY.size() - 1); + } + else + { + targetModifier = Config.NPC_SKILL_CHANCE_PENALTY.get(lvlDiff); + } + } + return Rnd.get(100) < (100 - Math.round((float) (lvlModifier * targetModifier))); } @Override