public boolean calcSkillSuccess(L2Character player, L2Character target, L2Skill skill) { if(Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("alt") || Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("true")) return calcAltSkillSuccess(player, target, skill); SkillType type = skill.getSkillType(); if(Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("forth")) { String word = "calc-"+type+"-success"; _log.fine("Try calculate '" + word + "'"); JBForth jbf = new JBForth(); if(jbf.core.word_exists(word)) { if(player instanceof L2PcInstance) jbf.setPlayer((L2PcInstance)player); jbf.data.st.push(player); jbf.data.st.push(target); jbf.data.st.push(skill); jbf.execp("to skill to target to self " + word); Object res = jbf.data.st.pop(); if(res != null) return (Integer)res != 0; } } boolean success = false; int rate = 0; int check = _rnd.nextInt(100); int skillPower = (int)skill.getPower() * 2; //int skillLevelMod = (skill.getLevel() + 3) * 60; int skillLevelMod = skillPower; int skillLevelModSilence = (skill.getLevel() + 12) * 80; int modifier = 1; int value = skillLevelMod; int valueSilence = skillLevelModSilence; int resModifier = 0; L2Effect[] effects = target.getAllEffects(); for ( L2Effect eff : effects ) { L2Skill sk = eff.getSkill(); if (sk.getId() == 1035 && sk.getLevel() == 1) { resModifier = 50; } else if (sk.getId() == 1035 && sk.getLevel() == 2) { resModifier = 60; } else if (sk.getId() == 1035 && sk.getLevel() == 3) { resModifier = 70; } else if (sk.getId() == 1035 && sk.getLevel() == 4) { resModifier = 80; } } int matkmultiplier = 0; switch(type) { case STUN: // For normal Stun Attack, with skillType = STUN modifier = target.getCON(); break; case PARALYZE: modifier = target.getWIT(); break; case SLEEP: modifier = target.getWIT(); break; case ROOT: modifier = target.getDEX(); break; default: // For normal Stun attack with skillType = PDAM value = skillPower; modifier = target.getCON(); break; } if (modifier == 0) { _log.warning("Name: "+target.getName()+" has bad base stat value. Fix datapack or notify dp ppl"); modifier = 1; } rate = ((player.getLevel() - target.getLevel()) + (value / modifier)); if (type == SkillType.PARALYZE /*|| type == SkillType.SLEEP*/) { rate = (int)(rate * 0.5); } if (type == SkillType.SLEEP) { if (target instanceof L2PcInstance) { rate = (int)((((skill.getLevel()*10) + (player.getLevel() - target.getLevel()) + matkmultiplier)/(modifier+10)) - resModifier); } else rate = (int)(40 + skill.getLevel() + (player.getLevel() - target.getLevel()) + matkmultiplier); } if (rate > 100) rate = 100; else if (rate < 0) rate = 0; if (check > rate) success = false; else success = true; return success; }