Index: D:/workspace/GameServer/java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java =================================================================== --- D:/workspace/GameServer/java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java (revision 1584) +++ D:/workspace/GameServer/java/net/sf/l2j/gameserver/model/actor/stat/CharStat.java (working copy) @@ -349,4 +349,21 @@ /** Return the WIT of the L2Character (base+modifier). */ public final int getWIT() { return (int)calcStat(Stats.STAT_WIT, getActiveChar().getTemplate().baseWIT, null, null); } + +// =========================================================================================================================================================== + + public int getSleepRes() { return (int)calcStat(Stats.SLEEP_RES, getActiveChar().getTemplate().baseSleepRes, null, null); } + public int getMuteRes() { return (int)calcStat(Stats.MUTE_RES, getActiveChar().getTemplate().baseMuteRes, null, null); } + public int getRootRes() { return (int)calcStat(Stats.ROOT_RES, getActiveChar().getTemplate().baseRootRes, null, null); } + public int getStunRes() { return (int)calcStat(Stats.STUN_RES, getActiveChar().getTemplate().baseStunRes, null, null); } + public int getBleedRes() { return (int)calcStat(Stats.BLEED_RES, getActiveChar().getTemplate().baseBleedRes, null, null); } + public int getPoisonRes() { return (int)calcStat(Stats.POISON_RES, getActiveChar().getTemplate().basePoisonRes, null, null); } + public int getMovementRes() { return (int)calcStat(Stats.MOVEMENT_RES, getActiveChar().getTemplate().baseMovementRes, null, null); } + public int getFearRes() { return (int)calcStat(Stats.FEAR_RES, getActiveChar().getTemplate().baseFearRes, null, null); } + public int getConfusionRes() { return (int)calcStat(Stats.CONFUSION_RES, getActiveChar().getTemplate().baseConfusionRes, null, null); } + public int getAggressionRes() { return (int)calcStat(Stats.AGGRESSION_RES, getActiveChar().getTemplate().baseAggressionRes, null, null); } + public int getDarknessRes() { return (int)calcStat(Stats.DARK_RES, getActiveChar().getTemplate().baseDarkRes, null, null); } + public int getSacredRes() { return (int)calcStat(Stats.SACRED_RES, getActiveChar().getTemplate().baseSacredRes, null, null); } + +// =========================================================================================================================================================== } Index: D:/workspace/GameServer/java/net/sf/l2j/gameserver/model/L2Character.java =================================================================== --- D:/workspace/GameServer/java/net/sf/l2j/gameserver/model/L2Character.java (revision 1584) +++ D:/workspace/GameServer/java/net/sf/l2j/gameserver/model/L2Character.java (working copy) @@ -4500,8 +4500,22 @@ public final int getWalkSpeed() { return getStat().getWalkSpeed(); } public int getWIT() { return getStat().getWIT(); } // ========================================================= + + public double getSleepRes() { return getStat().getSleepRes(); } + public double getMuteRes() { return getStat().getMuteRes(); } + public double getRootRes() { return getStat().getRootRes(); } + public double getStunRes() { return getStat().getStunRes(); } + public double getBleedRes() { return getStat().getBleedRes(); } + public double getPoisonRes() { return getStat().getPoisonRes(); } + public double getMovementRes() { return getStat().getMovementRes(); } + public double getFearRes() { return getStat().getFearRes(); } + public double getConfusionRes() { return getStat().getConfusionRes(); } + public double getAggressionRes() { return getStat().getAggressionRes(); } + public double getDarknessRes() { return getStat().getDarknessRes(); } + public double getSacredRes() { return getStat().getSacredRes(); } + +// =========================================================================================================================================================== - // ========================================================= // Status - NEED TO REMOVE ONCE L2CHARTATUS IS COMPLETE // Method - Public Index: D:/workspace/GameServer/java/net/sf/l2j/gameserver/skills/Formulas.java =================================================================== --- D:/workspace/GameServer/java/net/sf/l2j/gameserver/skills/Formulas.java (revision 1584) +++ D:/workspace/GameServer/java/net/sf/l2j/gameserver/skills/Formulas.java (working copy) @@ -1111,6 +1111,8 @@ public boolean calcSkillSuccessOld(L2Character player, L2Character target, L2Skill skill, boolean ss, boolean sps, boolean bss ) { + if(Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("l2jc")) + return calcL2jCSkillSuccess(player, target, skill); if(Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("alt") || Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("true")) return calcAltSkillSuccess(player, target, skill); @@ -1354,6 +1356,8 @@ public boolean calcSkillSuccess(L2Character attacker, L2Character target, L2Skill skill, boolean ss, boolean sps, boolean bss) { + if(Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("l2jc")) + return calcL2jCSkillSuccess(attacker, target, skill); if(Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("alt") || Config.ALT_GAME_SKILL_FORMULAS.equalsIgnoreCase("true")) return calcAltSkillSuccess(attacker, target, skill); @@ -1482,7 +1486,180 @@ if (check > rate) success = false; return success; } +// ============================================================================================================================================================= + public boolean calcL2jCSkillSuccess(L2Character player, L2Character target, L2Skill skill) + { +// ============================================================================================================================================================= +// check the skill level, type, power of the player + SkillType type = skill.getSkillType(); + double maxLevel = ((SkillTable.getInstance().getMaxLevel(skill.getId(),skill.getLevel())) / 55); + double skillLevel = (skill.getLevel() * maxLevel * 0.5); + double skillPower = (skill.getPower() * 0.01); +// ============================================================================================================================================================= +// setting the variables for success calculation + boolean success = false; + double rate = 1; + int check = Rnd.get(100); +// ============================================================================================================================================================= +// check the level difference between player and target + double LEVEL = 0; + int plvl = player.getLevel(); + int tlvl = target.getLevel(); + int l1 = plvl - tlvl; + int l2 = tlvl - plvl; + if (plvl >= tlvl) LEVEL = (100 + l1) * 0.6; + else LEVEL = (100 - l2) * 0.6; +// ============================================================================================================================================================= +// check the matk/mdef difference between player and target + double MAGIC = 0; + double matk = player.getMAtk(target, skill); + double mdef = target.getMDef(player, skill); + double m1 = matk - mdef; + double m2 = mdef - matk; + if (matk >= mdef) MAGIC = (3000 + m1) * (0.0045); + else MAGIC = (3000 - m2) * (0.0045); +// ============================================================================================================================================================= +// check the patk/pdef difference between player and target + double POWER = 0; + double patk = player.getPAtk(target); + double pdef = target.getPDef(player); + double p1 = patk - pdef; + double p2 = pdef - patk; + if (patk >= pdef) POWER = (3000 + p1) * (0.0045); + else POWER = (3000 - p2) * (0.0045); +// ============================================================================================================================================================= +// calculating the defense check modifier + double mcheck = LEVEL + MAGIC + skillLevel; + double pcheck = LEVEL + POWER + skillLevel; +// ============================================================================================================================================================= +// get the stats of the target + double tWIT = (target.getWIT() * 0.40); + double tMEN = (target.getMEN() * 0.40); + double tCON = (target.getCON() * 0.40); + double tDEX = (target.getDEX() * 0.40); +// ============================================================================================================================================================= +// get the stats of the attacker + double aINT = (player.getINT() * 0.10); + double aDEX = (player.getDEX() * 0.10); + double aSTR = (player.getSTR() * 0.10); + double aWIT = (player.getWIT() * 0.10); +// ============================================================================================================================================================= + switch(type) + { +// ============================================================================================================================================================= +// WIT affected resistances +// ============================================================================================================================================================= + case SLEEP: + if (target instanceof L2RaidBossInstance) rate = 0; + else + { + if (target.getSleepRes() == 0) rate = (mcheck + aWIT) - tWIT; + else rate = (mcheck + aWIT) - (tWIT + (target.getSleepRes()* 100)); + } + break; +// ============================================================================================================================================================= + case MUTE: + if (target instanceof L2RaidBossInstance) rate = 0; + else + { + if (target.getMuteRes() == 0) rate = (mcheck + aWIT) - tWIT; + else rate = (mcheck + aWIT) - (tWIT + (target.getMuteRes()* 100)); + } + break; +// ============================================================================================================================================================= + case ROOT: + if (target instanceof L2RaidBossInstance) rate = 0; + else + { + if (target.getRootRes() == 0) rate = (mcheck + aWIT) - tWIT; + else rate = (mcheck + aWIT) - (tWIT + (target.getRootRes()* 100)); + } + break; +// ============================================================================================================================================================= + case PARALYZE: + if (target instanceof L2RaidBossInstance) rate = 0; + else + { + if (target.getMovementRes() == 0) rate = (mcheck + aWIT) - tWIT; + else rate = (mcheck + aWIT) - (tWIT + (target.getMovementRes()* 100)); + } + break; +// ============================================================================================================================================================= + case FEAR: + if (target instanceof L2RaidBossInstance) rate = 0; + else + { + if (target.getFearRes() == 0) rate = (mcheck + aWIT) - tWIT; + else rate = (mcheck + aWIT) - (tWIT + (target.getFearRes()* 100)); + } + break; +// ============================================================================================================================================================= +// MEN affected resistances +// ============================================================================================================================================================= + case AGGDAMAGE: + if (target.getAggressionRes() == 0) rate = (mcheck + aINT) - tMEN; + else rate = (mcheck + aINT) - (tMEN + (target.getAggressionRes()* 100)); + break; +// ============================================================================================================================================================= + case POISON: + if (target.getPoisonRes() == 0) rate = (mcheck + aINT) - tMEN; + else rate = (mcheck + aINT) - (tMEN + (target.getPoisonRes()* 100)); + break; +// ============================================================================================================================================================= + case CONFUSION: + if (target instanceof L2RaidBossInstance) rate = 0; + else + { + if (target.getConfusionRes() == 0) rate = (mcheck + aINT) - tMEN; + else rate = (mcheck + aINT) - (tMEN + (target.getConfusionRes()* 100)); + } + break; +/*// ============================================================================================================================================================= + case DATK: + if (target.getDarknessRes() == 0) rate = mcheck + aINT - tMEN; + else rate = mcheck + aINT - (tMEN + (target.getDarknessRes()* 100)); + break; +// ============================================================================================================================================================= + case SATK: + if (target.getSacredRes() == 0) rate = (mcheck + aINT) - tMEN; + else rate = (mcheck + aINT) - (tMEN + (target.getSacredRes()* 100)); + break; +// =============================================================================================================================================================*/ +// CON affected resistances + + case BLEED: + if (target.getBleedRes() == 0) rate = (pcheck + aDEX) - tCON; + else rate = (pcheck + aDEX) - (tCON + (target.getBleedRes()* 100)); + break; +// ============================================================================================================================================================= +// For normal Stun Attack, with skillType = STUN + case STUN: + if (target instanceof L2RaidBossInstance) rate = 0; + else + { + if (target.getStunRes() == 0) rate = (pcheck + aDEX) - tCON; + else rate = (pcheck + aDEX) - (tCON + (target.getStunRes()* 100)); + } + break; +// ============================================================================================================================================================= +// For normal Stun attack with skillType = PDAM + default: + if (target instanceof L2RaidBossInstance) rate = 0; + else + { + if (target.getStunRes() == 0) rate = (pcheck + skillPower + aSTR) - (tCON + tDEX); + else rate = (pcheck + skillPower + aSTR) - (tCON + tDEX + (target.getStunRes()* 100)); + } + break; + } +// ============================================================================================================================================================= + if (rate < 0) rate = 0; + if (rate >= check) success = true; + else success = false; + return success; + } + public boolean calculateUnlockChance(L2Skill skill) { int level = skill.getLevel(); Index: D:/workspace/GameServer/java/net/sf/l2j/gameserver/skills/Stats.java =================================================================== --- D:/workspace/GameServer/java/net/sf/l2j/gameserver/skills/Stats.java (revision 1584) +++ D:/workspace/GameServer/java/net/sf/l2j/gameserver/skills/Stats.java (working copy) @@ -112,6 +112,8 @@ EARTH_RES, HOLY_RES, DARK_RES, + FEAR_RES, + SACRED_RES, NONE_WPN_RES, // Shields!!! SWORD_WPN_RES, @@ -204,6 +206,8 @@ if (name == "earthRes" ) return EARTH_RES; if (name == "holyRes" ) return HOLY_RES; if (name == "darkRes" ) return DARK_RES; + if (name == "fearRes" ) return FEAR_RES; + if (name == "sacredRes" ) return SACRED_RES; if (name == "noneWpnRes" ) return NONE_WPN_RES; if (name == "swordWpnRes" ) return SWORD_WPN_RES; Index: D:/workspace/GameServer/java/net/sf/l2j/gameserver/templates/L2CharTemplate.java =================================================================== --- D:/workspace/GameServer/java/net/sf/l2j/gameserver/templates/L2CharTemplate.java (revision 1584) +++ D:/workspace/GameServer/java/net/sf/l2j/gameserver/templates/L2CharTemplate.java (working copy) @@ -86,8 +86,11 @@ public final int baseWindRes; public final int baseWaterRes; public final int baseEarthRes; - public final int baseHolyRes; - public final int baseDarkRes; + public final int baseHolyRes; + public final int baseDarkRes; + public final int baseSacredRes; + public final int baseMuteRes; + public final int baseFearRes; public final int collisionRadius; public final int collisionHeight; @@ -150,6 +153,9 @@ baseEarthRes = set.getInteger("baseEarthRes", 0); baseHolyRes = set.getInteger("baseHolyRes", 0); baseDarkRes = set.getInteger("baseDarkRes", 0); + baseSacredRes = set.getInteger("baseSacredRes", 0); + baseMuteRes = set.getInteger("baseMuteRes", 0); + baseFearRes = set.getInteger("baseFearRes", 0); // Geometry collisionRadius = set.getInteger("collision_radius");