rendered paste body public boolean calcSkillSuccess(L2Character attacker, L2Character target, L2Skill skill, boolean ss, boolean sps, boolean bss)
{
if(Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("alt") || Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("true"))
return calcAltSkillSuccess(attacker, target, skill);
// Uncomment this if you want to revert to old skill success calculation:
// return calcSkillSuccessOld(attacker, target, skill, ss, sps, bss);
SkillType type = skill.getSkillType();
if (target.isRaid() && (type == SkillType.CONFUSION || type == SkillType.MUTE || type == SkillType.PARALYZE || type == SkillType.ROOT))
return false; // these skills should not work on RaidBoss
int value = (int)skill.getPower();
int lvlDepend = skill.getLevelDepend();
if (type == SkillType.PDAM || type == SkillType.MDAM) // For additional effects on PDAM skills (like STUN, SHOCK,...)
{
value = skill.getEffectPower();
type = skill.getEffectType();
}
// TODO: Temporary fix for skills with EffectPower = 0 or EffectType not set
if (value == 0 || type == null)
{
if (skill.getSkillType() == SkillType.PDAM)
{
value = 50;
type = SkillType.STUN;
}
if (skill.getSkillType() == SkillType.MDAM)
{
value = 30;
type = SkillType.PARALYZE;
}
}
// TODO: Temporary fix for skills with Power = 0 or LevelDepend not set
if(value == 0) value = (type == SkillType.PARALYZE)? 50 : 80;
if(lvlDepend == 0) lvlDepend = (type == SkillType.PARALYZE)? 1 : 2;
// TODO: Temporary fix for NPC skills with MagicLevel not set
// int lvlmodifier = (skill.getMagicLevel() - target.getLevel()) * lvlDepend;
int lvlmodifier = ((skill.getMagicLevel()>0?skill.getMagicLevel():attacker.getLevel()) - target.getLevel()) * lvlDepend;
int statmodifier = calcSkillStatModifier(type, target);
int ssmodifier = 100;
if (bss) ssmodifier = 200;
else if (sps) ssmodifier = 150;
else if (ss) ssmodifier = 150;
int rate = value + lvlmodifier - calcSkillResistance(type, target);
if (skill.isMagic()) rate *= Math.sqrt((double)attacker.getMAtk(target, skill)/target.getMDef(attacker, skill));
if (statmodifier > 0) rate = rate * (100 - statmodifier) / 100;
if (rate > 99) rate = 99;
else if (rate < 1) rate = 1;
if (ssmodifier != 100)
{
if (rate > 10000/(100+ssmodifier))
rate = 100-(100-rate)*100/ssmodifier;
else rate = rate*ssmodifier/100;
}
if(Config.DEVELOPER) System.out.println(skill.getName() + ": " + value + ", " + lvlmodifier + ", " + calcSkillResistance(type, target) + ", " + statmodifier + ", " + ssmodifier + ", " + Math.sqrt((double)attacker.getMAtk(target, skill)/target.getMDef(attacker, skill)) + " ==> " + rate);
return (Rnd.get(100) < rate);
}