All pastes #45720 Raw Edit

Miscellany

public text v1 · immutable
#45720 ·published 2006-03-14 19:54 UTC
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);
    }