浏览代码

Core support for new skill parameter pvpPower (by default same value as power).
Used for pvp only (playable vs playable), overrides normal power value.
Can be used for "duel" enchant routes.

_DS_ 15 年之前
父节点
当前提交
c1a9abdee9

+ 13 - 6
L2_GameServer/java/com/l2jserver/gameserver/model/L2Skill.java

@@ -184,6 +184,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
     private final int _feed;
     private final int _feed;
     // base success chance
     // base success chance
     private final double _power;
     private final double _power;
+    private final double _pvpPower;
     private final int _magicLevel;
     private final int _magicLevel;
     private final int _levelDepend;
     private final int _levelDepend;
     private final boolean _ignoreResists;
     private final boolean _ignoreResists;
@@ -369,6 +370,7 @@ public abstract class L2Skill implements IChanceSkillTrigger
 
 
         _targetType = set.getEnum("target", SkillTargetType.class);
         _targetType = set.getEnum("target", SkillTargetType.class);
         _power = set.getFloat("power", 0.f);
         _power = set.getFloat("power", 0.f);
+        _pvpPower = set.getFloat("pvpPower", (float)getPower());
         _magicLevel = set.getInteger("magicLvl", SkillTreeTable.getInstance().getMinSkillLevel(_id, _level));
         _magicLevel = set.getInteger("magicLvl", SkillTreeTable.getInstance().getMinSkillLevel(_id, _level));
         _levelDepend = set.getInteger("lvlDepend", 0);
         _levelDepend = set.getInteger("lvlDepend", 0);
         _ignoreResists = set.getBool("ignoreResists", false);
         _ignoreResists = set.getBool("ignoreResists", false);
@@ -498,16 +500,16 @@ public abstract class L2Skill implements IChanceSkillTrigger
     /**
     /**
      * Return the power of the skill.<BR><BR>
      * Return the power of the skill.<BR><BR>
      */
      */
-    public final double getPower(L2Character activeChar)
+    public final double getPower(L2Character activeChar, boolean isPvP)
     {
     {
     	if (activeChar == null)
     	if (activeChar == null)
-    		return _power;
+    		return getPower(isPvP);
     	
     	
     	switch (_skillType)
     	switch (_skillType)
     	{
     	{
     		case DEATHLINK:
     		case DEATHLINK:
     		{
     		{
-    			return _power * Math.pow(1.7165 - activeChar.getCurrentHp() / activeChar.getMaxHp(), 2) * 0.577; 
+    			return getPower(isPvP) * Math.pow(1.7165 - activeChar.getCurrentHp() / activeChar.getMaxHp(), 2) * 0.577; 
     			/*
     			/*
     			 * DrHouse:
     			 * DrHouse:
     			 * Rolling back to old formula (look below) for DEATHLINK due to this one based on logarithm is not
     			 * Rolling back to old formula (look below) for DEATHLINK due to this one based on logarithm is not
@@ -520,16 +522,21 @@ public abstract class L2Skill implements IChanceSkillTrigger
     		}
     		}
     		case FATAL:
     		case FATAL:
     		{
     		{
-    			return _power*3.5*(1-activeChar.getCurrentHp()/activeChar.getMaxHp());
+    			return getPower(isPvP)*3.5*(1-activeChar.getCurrentHp()/activeChar.getMaxHp());
     		}
     		}
     		default:
     		default:
-    			return _power;
+    			return getPower(isPvP);
     	}
     	}
     }
     }
 
 
     public final double getPower()
     public final double getPower()
     {
     {
-        return _power;
+    	return _power;
+    }
+
+    public final double getPower(boolean isPvP)
+    {
+        return isPvP ? _pvpPower : _power;
     }
     }
 
 
     public final L2SkillType[] getNegateStats()
     public final L2SkillType[] getNegateStats()

+ 19 - 20
L2_GameServer/java/com/l2jserver/gameserver/skills/Formulas.java

@@ -1271,7 +1271,8 @@ public final class Formulas
 	/** Calculate blow damage based on cAtk */
 	/** Calculate blow damage based on cAtk */
 	public static double calcBlowDamage(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean ss)
 	public static double calcBlowDamage(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean ss)
 	{
 	{
-		double power = skill.getPower();
+		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable); 
+		double power = skill.getPower(isPvP);
 		double damage = attacker.getPAtk(target);
 		double damage = attacker.getPAtk(target);
 		damage+=calcValakasAttribute(attacker, target, skill);
 		damage+=calcValakasAttribute(attacker, target, skill);
 		double defence = target.getPDef(attacker);
 		double defence = target.getPDef(attacker);
@@ -1287,8 +1288,7 @@ public final class Formulas
 		}
 		}
 
 
 		// Def bonusses in PvP fight
 		// Def bonusses in PvP fight
-		if((attacker instanceof L2Playable)
-				&& (target instanceof L2Playable))
+		if(isPvP)
 		{
 		{
 			if(skill == null)
 			if(skill == null)
 				defence *= target.calcStat(Stats.PVP_PHYSICAL_DEF, 1, null, null);
 				defence *= target.calcStat(Stats.PVP_PHYSICAL_DEF, 1, null, null);
@@ -1326,8 +1326,7 @@ public final class Formulas
 		damage += Rnd.get() * attacker.getRandomDamage(target);
 		damage += Rnd.get() * attacker.getRandomDamage(target);
 		
 		
 		// Dmg bonusses in PvP fight
 		// Dmg bonusses in PvP fight
-		if((attacker instanceof L2Playable)
-				&& (target instanceof L2Playable))
+		if(isPvP)
 		{
 		{
 			if(skill == null)
 			if(skill == null)
 				damage *= attacker.calcStat(Stats.PVP_PHYSICAL_DMG, 1, null, null);
 				damage *= attacker.calcStat(Stats.PVP_PHYSICAL_DMG, 1, null, null);
@@ -1355,6 +1354,7 @@ public final class Formulas
 	public static final double calcPhysDam(L2Character attacker, L2Character target, L2Skill skill,
 	public static final double calcPhysDam(L2Character attacker, L2Character target, L2Skill skill,
 									byte shld, boolean crit, boolean dual, boolean ss)
 									byte shld, boolean crit, boolean dual, boolean ss)
 	{
 	{
+		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable); 
 		double damage = attacker.getPAtk(target);
 		double damage = attacker.getPAtk(target);
 		double defence = target.getPDef(attacker);
 		double defence = target.getPDef(attacker);
 		damage+=calcValakasAttribute(attacker, target, skill);
 		damage+=calcValakasAttribute(attacker, target, skill);
@@ -1369,8 +1369,7 @@ public final class Formulas
 			((L2Npc)attacker)._soulshotcharged = false;
 			((L2Npc)attacker)._soulshotcharged = false;
 		}
 		}
 		// Def bonusses in PvP fight
 		// Def bonusses in PvP fight
-		if((attacker instanceof L2Playable) 
-				&& (target instanceof L2Playable))
+		if(isPvP)
 		{
 		{
 			if(skill == null)
 			if(skill == null)
 				defence *= target.calcStat(Stats.PVP_PHYSICAL_DEF, 1, null, null);
 				defence *= target.calcStat(Stats.PVP_PHYSICAL_DEF, 1, null, null);
@@ -1391,7 +1390,7 @@ public final class Formulas
 		if (ss) damage *= 2;
 		if (ss) damage *= 2;
 		if (skill != null)
 		if (skill != null)
 		{
 		{
-			double skillpower = skill.getPower(attacker);
+			double skillpower = skill.getPower(attacker, isPvP);
 			float ssboost = skill.getSSBoost();
 			float ssboost = skill.getSSBoost();
 			if (ssboost <= 0)
 			if (ssboost <= 0)
 				damage += skillpower;
 				damage += skillpower;
@@ -1558,8 +1557,7 @@ public final class Formulas
 		}
 		}
 		
 		
 		// Dmg bonusses in PvP fight
 		// Dmg bonusses in PvP fight
-		if((attacker instanceof L2Playable) 
-				&& (target instanceof L2Playable))
+		if(isPvP)
 		{
 		{
 			if(skill == null)
 			if(skill == null)
 				damage *= attacker.calcStat(Stats.PVP_PHYSICAL_DMG, 1, null, null);
 				damage *= attacker.calcStat(Stats.PVP_PHYSICAL_DMG, 1, null, null);
@@ -1579,6 +1577,7 @@ public final class Formulas
 	public static final double calcMagicDam(L2Character attacker, L2Character target, L2Skill skill,
 	public static final double calcMagicDam(L2Character attacker, L2Character target, L2Skill skill,
 										byte shld, boolean ss, boolean bss, boolean mcrit)
 										byte shld, boolean ss, boolean bss, boolean mcrit)
 	{	
 	{	
+		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable); 
 		double mAtk = attacker.getMAtk(target, skill);
 		double mAtk = attacker.getMAtk(target, skill);
 		double mDef = target.getMDef(attacker, skill);
 		double mDef = target.getMDef(attacker, skill);
 		// AI SpiritShot
 		// AI SpiritShot
@@ -1594,8 +1593,7 @@ public final class Formulas
 		}
 		}
 		// --------------------------------
 		// --------------------------------
 		// Pvp bonuses for def
 		// Pvp bonuses for def
-		if((attacker instanceof L2Playable)
-				&& (target instanceof L2Playable))
+		if(isPvP)
 		{
 		{
 			if(skill.isMagic())
 			if(skill.isMagic())
 				mDef *= target.calcStat(Stats.PVP_MAGICAL_DEF, 1, null, null);
 				mDef *= target.calcStat(Stats.PVP_MAGICAL_DEF, 1, null, null);
@@ -1615,7 +1613,7 @@ public final class Formulas
 		if (bss) mAtk *= 4;
 		if (bss) mAtk *= 4;
 		else if (ss) mAtk *= 2;
 		else if (ss) mAtk *= 2;
 
 
-		double damage = 91 * Math.sqrt(mAtk) / mDef * skill.getPower(attacker); 
+		double damage = 91 * Math.sqrt(mAtk) / mDef * skill.getPower(attacker, isPvP); 
 		
 		
 		// In C5 summons make 10 % less dmg in PvP.
 		// In C5 summons make 10 % less dmg in PvP.
 		if(attacker instanceof L2Summon && target instanceof L2PcInstance) damage *= 0.9;
 		if(attacker instanceof L2Summon && target instanceof L2PcInstance) damage *= 0.9;
@@ -1674,8 +1672,7 @@ public final class Formulas
 
 
 		damage += Rnd.get() * attacker.getRandomDamage(target);
 		damage += Rnd.get() * attacker.getRandomDamage(target);
 		// Pvp bonuses for dmg
 		// Pvp bonuses for dmg
-		if((attacker instanceof L2Playable)
-				&& (target instanceof L2Playable))
+		if(isPvP)
 		{
 		{
 			if(skill.isMagic())
 			if(skill.isMagic())
 				damage *= attacker.calcStat(Stats.PVP_MAGICAL_DMG, 1, null, null);
 				damage *= attacker.calcStat(Stats.PVP_MAGICAL_DMG, 1, null, null);
@@ -1712,7 +1709,7 @@ public final class Formulas
 				return 1;
 				return 1;
 		}
 		}
 		
 		
-		double damage = 91 * Math.sqrt(mAtk) / mDef * skill.getPower();
+		double damage = 91 * Math.sqrt(mAtk) / mDef * skill.getPower(target instanceof L2Playable);
 		L2PcInstance owner = attacker.getOwner();
 		L2PcInstance owner = attacker.getOwner();
 		// Failure calculation
 		// Failure calculation
 		if (Config.ALT_GAME_MAGICFAILURES && !calcMagicSuccess(owner, target, skill))
 		if (Config.ALT_GAME_MAGICFAILURES && !calcMagicSuccess(owner, target, skill))
@@ -2414,15 +2411,16 @@ public final class Formulas
 
 
 	public static boolean calcSkillSuccess(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean ss, boolean sps, boolean bss)
 	public static boolean calcSkillSuccess(L2Character attacker, L2Character target, L2Skill skill, byte shld, boolean ss, boolean sps, boolean bss)
 	{
 	{
+		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable); 
 		if (skill.ignoreResists())
 		if (skill.ignoreResists())
-			return (Rnd.get(100) < skill.getPower());
+			return (Rnd.get(100) < skill.getPower(isPvP));
 
 
 		if (shld == SHIELD_DEFENSE_PERFECT_BLOCK) // perfect block
 		if (shld == SHIELD_DEFENSE_PERFECT_BLOCK) // perfect block
 			return false;
 			return false;
 		
 		
 		L2SkillType type = skill.getSkillType();
 		L2SkillType type = skill.getSkillType();
 
 
-		int value = (int) skill.getPower();
+		int value = (int) skill.getPower(isPvP);
 		int lvlDepend = skill.getLevelDepend();
 		int lvlDepend = skill.getLevelDepend();
 
 
 		// TODO: Temporary fix for skills with Power = 0 or LevelDepend not set
 		// TODO: Temporary fix for skills with Power = 0 or LevelDepend not set
@@ -2545,7 +2543,7 @@ public final class Formulas
 		if (calcSkillReflect(target, skill) != SKILL_REFLECT_FAILED)
 		if (calcSkillReflect(target, skill) != SKILL_REFLECT_FAILED)
 			return false;
 			return false;
 		
 		
-		int value = (int) skill.getPower();
+		int value = (int) skill.getPower(target instanceof L2Playable);
 		int lvlDepend = skill.getLevelDepend();
 		int lvlDepend = skill.getLevelDepend();
 		
 		
 		// TODO: Temporary fix for skills with Power = 0 or LevelDepend not set
 		// TODO: Temporary fix for skills with Power = 0 or LevelDepend not set
@@ -2691,11 +2689,12 @@ public final class Formulas
     	//Mana Burnt = (SQR(M.Atk)*Power*(Target Max MP/97))/M.Def
     	//Mana Burnt = (SQR(M.Atk)*Power*(Target Max MP/97))/M.Def
     	double mAtk = attacker.getMAtk(target, skill);
     	double mAtk = attacker.getMAtk(target, skill);
 		double mDef = target.getMDef(attacker, skill);
 		double mDef = target.getMDef(attacker, skill);
+		final boolean isPvP = (attacker instanceof L2Playable) && (target instanceof L2Playable); 
 		double mp = target.getMaxMp();
 		double mp = target.getMaxMp();
 		if (bss) mAtk *= 4;
 		if (bss) mAtk *= 4;
 		else if (ss) mAtk *= 2;
 		else if (ss) mAtk *= 2;
 
 
-		double damage = (Math.sqrt(mAtk) * skill.getPower(attacker) * (mp/97)) / mDef;
+		double damage = (Math.sqrt(mAtk) * skill.getPower(attacker, isPvP) * (mp/97)) / mDef;
 		damage *= calcSkillVulnerability(attacker, target, skill);
 		damage *= calcSkillVulnerability(attacker, target, skill);
 		if (target instanceof L2Attackable && !target.isRaid() && !target.isRaidMinion()
 		if (target instanceof L2Attackable && !target.isRaid() && !target.isRaidMinion()
 				&& target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY && attacker.getActingPlayer() != null
 				&& target.getLevel() >= Config.MIN_NPC_LVL_DMG_PENALTY && attacker.getActingPlayer() != null