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); }