All pastes #41851 Raw Edit

Formulas

public text v1 · immutable
#41851 ·published 2006-02-16 17:34 UTC
rendered paste body
Index: /java/net/sf/l2j/gameserver/skills/Formulas.java
===================================================================
--- /java/net/sf/l2j/gameserver/skills/Formulas.java	(revision 1494)
+++ /java/net/sf/l2j/gameserver/skills/Formulas.java	(working copy)
@@ -31,7 +31,6 @@
 import net.sf.l2j.gameserver.model.actor.instance.L2DoorInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2NpcInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
-import net.sf.l2j.gameserver.model.actor.instance.L2PlayableInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2RaidBossInstance;
 import net.sf.l2j.gameserver.model.actor.instance.L2SiegeGuardInstance;
 import net.sf.l2j.gameserver.model.L2SiegeClan;
@@ -40,7 +39,6 @@
 import net.sf.l2j.gameserver.model.L2Skill.SkillType;
 import net.sf.l2j.gameserver.skills.ConditionPlayerState.CheckPlayerState;
 import net.sf.l2j.gameserver.templates.L2PcTemplate;
-import net.sf.l2j.gameserver.templates.L2Armor;
 import net.sf.l2j.gameserver.templates.L2Weapon;
 import net.sf.l2j.gameserver.templates.L2WeaponType;
 import net.sf.l2j.gameserver.util.Util;
@@ -1024,57 +1022,19 @@
 			mAtk *= 2;
 
 		//double damage = Math.sqrt(mAtk/mDef)*skill.getPower()*10.18;
-        double damage = (91*Math.sqrt(mAtk)*skill.getPower(attacker))/mDef;
-        //double damage = 40/Math.pow(mAtk*mDef,1./6)*Math.sqrt(mAtk/mDef)*skill.getPower(attacker);
+        //double damage = 91*Math.sqrt(mAtk)/mDef*skill.getPower(attacker);
         //double damage = 5*Math.sqrt(mAtk/mDef)*skill.getPower(attacker);
-//        if(attacker instanceof L2PcInstance && target instanceof L2PcInstance) damage *= 0.9; // PvP modifier (-10%)
+        double damage = 40/Math.pow(mAtk*mDef,1./6)*Math.sqrt(mAtk/mDef)*skill.getPower(attacker);
+        if(attacker instanceof L2PcInstance && target instanceof L2PcInstance) damage *= 0.9; // PvP modifier (-10%)
 		if(mcrit) damage *= 4;
 
-        if (target instanceof L2RaidBossInstance)  
-        {  
-                int cLevel = attacker.getLevel();  
-                int tLevel = target.getLevel();  
-                int rDamage = 1;  
-                if ( cLevel > tLevel )  
-                 {  
-                        rDamage = cLevel - tLevel;  
-                        if (rDamage > 9)  
-                                damage /= rDamage;  
-                        if  (damage < 1)  
-                                damage = 1;  
-                }  
-        }  
-
-        if (target instanceof L2PlayableInstance && attacker instanceof L2RaidBossInstance)  
-        {  
-                int cLevel = attacker.getLevel();  
-                int tLevel = target.getLevel();  
-                int rDamage = 1;  
-                if ( cLevel < tLevel )  
-                {  
-                        rDamage = tLevel - cLevel;  
-                        if (rDamage > 9)  
-                                damage *= rDamage;  
-                }  
-        }  
-
-        if (Config.ALT_GAME_MAGICFAILURES) // Failure calculation
+        // Failure calculation
+        if (Config.ALT_GAME_MAGICFAILURES && !calcMagicSuccess(attacker, target, skill))
         {
-            /* Level difference: 
-             *  less then 7 : full chance
-             *  7 - 20      : reduced chance
-             *  20 and more : min chance
-             */
-            // TODO: Temporary fix for skills with Power = 0 or LevelDepend not set
-            int rate = (int)(200 - 10 * (target.getLevel() - (skill.getMagicLevel()>0?skill.getMagicLevel():attacker.getLevel())));
-
-            if (target.isRaid()) rate /= 2; // chance is reduced for RaidBoss
-
-            if (rate > 123) rate = 123;
-            if (rate < 1) rate = 1;
-            int check = _rnd.get(100);
-            if (rate <= check) damage = 1;
-            else if (rate <= check +25) damage /= 2;
+        	if (attacker instanceof L2PcInstance) ((L2PcInstance)attacker).sendMessage("Attack failed");
+        	if (calcMagicSuccess(attacker, target, skill))
+                damage /= 2;
+            else damage = 1;
         }
          
 		return damage;
@@ -1148,7 +1108,7 @@
 		return d > 0;
     }
 
-    public boolean calcSkillSuccess(L2Character player, L2Character target, L2Skill skill, boolean ss, boolean sps, boolean bss )
+    public boolean calcSkillSuccessOld(L2Character player, 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"))
@@ -1358,6 +1318,129 @@
     	return success;
     }
 
+    public int calcSkillResistance(SkillType type, L2Character target)
+    {
+        if (type == null) return 0;
+        switch(type)
+        {
+            case BLEED: return (int) target.calcStat(Stats.BLEED_RES, 0, target, null);
+            case POISON: return (int) target.calcStat(Stats.POISON_RES, 0, target, null);
+            case STUN: return (int) target.calcStat(Stats.STUN_RES, 0, target, null);
+            case PARALYZE: return (int) target.calcStat(Stats.PARALYZE_RES, 0, target, null); 
+            case ROOT: return (int) target.calcStat(Stats.ROOT_RES, 0, target, null);
+            case SLEEP: return (int) target.calcStat(Stats.SLEEP_RES, 0, target, null);
+            case MUTE: return (int) target.calcStat(Stats.MUTE_RES, 0, target, null); 
+            case FEAR:
+            case CONFUSION: return (int) target.calcStat(Stats.CONFUSION_RES, 0, target, null);
+            default: return 0;
+        }
+    }
+
+    public int calcSkillStatModifier(SkillType type, L2Character target)
+    {
+        if (type == null) return 0;
+        switch(type)
+        {
+            case STUN: return target.getCON();
+            case ROOT: return target.getDEX();
+            case SLEEP: return target.getWIT();
+            case MUTE:
+            case CONFUSION: 
+            case PARALYZE: return target.getMEN();
+            default: return 0;
+        }
+    }
+
+    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);
+    }
+
+    public boolean calcMagicSuccess(L2Character attacker, L2Character target, L2Skill skill)
+    {
+        /* Level difference: 
+         *  less then 10 : full chance
+         *  10 - 20      : reduced chance
+         *  20 and more  : min chance
+         */
+        int value = target.isRaid()? 100 : 200; // chance is reduced for RaidBoss
+        int lvlDepend = 10;
+
+        // 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 rate = value + lvlmodifier;
+
+        if (rate > 99) rate = 99;
+        else if (rate < 1) rate = 1;
+
+        return (Rnd.get(100) < rate);
+    }
+
     public boolean calcAltSkillSuccess(L2Character activeChar, L2Character target, L2Skill skill)
     {
         // Get our numbers and base success rate