}
L2Skill skill = env.skill;
if (!skill.isOffensive()) {
return Rnd.chance(env.value);
}
L2Character character = env.character;
L2Character target = env.target;
env.value = Math.max(Math.min(env.value, 100), 1); // РќР° РІСЃСЏРєРёР№
// случай
double base = env.value; // Запоминаем базовый шанс
// (нужен позже)
double mLevel = skill.getMagicLevel() == 0 || !character.isPlayer() ? character
.getLevel() : skill.getMagicLevel(); // Разница в
// СѓСЂРѕРІРЅСЏС…
mLevel = (mLevel - target.getLevel() + 3) * skill.getLevelModifier();
env.value += mLevel >= 0 ? 0 : mLevel;
boolean isGM = character.isPlayer() && ((L2Player) character).isGM();
if (isGM) {
character.sendMessage("magic level: " + mLevel);
character.sendMessage("chance: " + env.value);
}
if (skill.getSavevs() > 0) {
if (isGM) {
character.sendMessage("skill: " + skill);
character.sendMessage("chance: " + env.value);
character.sendMessage("save type: " + skill.getSavevs());
}
env.value += 30 - calcSavevsDependence(skill.getSavevs(), target); // Бонус
// РѕС‚
// MEN/CON/etc
if (isGM) {
character.sendMessage("chance w/savevs: " + env.value);
}
}
env.value = Math.max(env.value, 1);
if (skill.isMagic()) // Ртот блок только для
// магических скиллов
{
int mdef = Math.max(1, target.getMDef(target, skill)); // Вычисляем
// mDef
// цели
double matk = character.getMAtk(target, skill);
if (skill.isSSPossible() && spiritshot > 0) // Считаем
// Р±РѕРЅСѓСЃ РѕС‚
// шотов
{
matk *= spiritshot * 2;
}
env.value *= Config.SKILLS_CHANCE_MOD
* Math.pow(matk, Config.SKILLS_CHANCE_POW) / mdef;
}
if (!skill.isIgnoreResists()) {
double res = 0;
if (resistType != null) {
res += target.calcStat(resistType, character, skill);
}
if (attibuteType != null) {
res -= character.calcStat(attibuteType, target, skill);
}
res += target.calcStat(Stats.DEBUFF_RECEPTIVE, character, skill);
if (res != 0) {
double mod = Math.abs(0.02 * res) + 1;
env.value = res > 0 ? env.value / mod : env.value * mod;
if (isGM) {
if (resistType != null) {
character.sendMessage("resist: " + resistType);
character.sendMessage("defense: "
+ (int) target.calcStat(resistType, character,
skill));
}
if (attibuteType != null) {
character.sendMessage("attack: "
+ (int) character.calcStat(attibuteType,
target, skill));
character.sendMessage("chance w/resist: " + env.value);
}
}
}
}
env.value = character.calcStat(Stats.ACTIVATE_RATE, env.value, target,
skill); // Учитываем общий бонус к
// шансам, если есть
// if(skill.isSoulBoost()) // Бонус от душ камаелей
// env.value *= 0.85 + 0.06 * Math.min(character.getConsumedSouls(), 5);
env.value = Math.max(env.value,
Math.min(base, Config.SKILLS_CHANCE_MIN)); // Если
// базовый
// шанс
// более
// Config.SKILLS_CHANCE_MIN,
// то при
// небольшой
// разнице в
// СѓСЂРѕРІРЅСЏС…,
// делаем
// кап
// СЃРЅРёР·Сѓ.
env.value = Math.max(Math.min(env.value, Config.SKILLS_CHANCE_CAP), 1); // Применяем
// кап
if (target.isPlayer()) {
L2Player player = (L2Player) target;
if ((Config.SKILLS_SHOW_CHANCE && character.isMonster() || player
.isGM()) && player.getVarB("SkillsMobChance")) {
target.sendMessage(character.getName()
+ ": "
+ new CustomMessage(
"l2p.gameserver.skills.Formulas.Chance", target)
.addString(skill.getName())
.addNumber(Math.round(env.value)).toString());