瀏覽代碼

HP consumed for some skills (like "Crush of Doom" or toogles) will be reduced even if invul
HP reduced while invul and damage comes from DamageOverTime (DOT)

Fixes #3391

DrHouse 16 年之前
父節點
當前提交
476b19b333

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/L2Character.java

@@ -6080,7 +6080,7 @@ public abstract class L2Character extends L2Object
 				if (consumeHp + 1 >= getCurrentHp())
 					consumeHp = getCurrentHp() - 1.0;
 				
-				getStatus().reduceHp(consumeHp, this);
+				getStatus().reduceHp(consumeHp, this, true);
 				
 				su.addAttribute(StatusUpdate.CUR_HP, (int) getCurrentHp());
 				isSendStatus = true;
@@ -6756,9 +6756,9 @@ public abstract class L2Character extends L2Object
 	public void reduceCurrentHp(double i, L2Character attacker, boolean awake, boolean isDOT, L2Skill skill)
 	{
 		if (Config.L2JMOD_CHAMPION_ENABLE && isChampion() && Config.L2JMOD_CHAMPION_HP != 0)
-			getStatus().reduceHp(i/Config.L2JMOD_CHAMPION_HP, attacker, awake, isDOT);
+			getStatus().reduceHp(i/Config.L2JMOD_CHAMPION_HP, attacker, awake, isDOT, false);
 		else
-			getStatus().reduceHp(i, attacker, awake, isDOT);
+			getStatus().reduceHp(i, attacker, awake, isDOT, false);
 	}
 	public void reduceCurrentMp(double i) { getStatus().reduceMp(i); }
 	public void removeStatusListener(L2Character object) { getStatus().removeStatusListener(object); }

+ 1 - 1
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/instance/L2PcInstance.java

@@ -10660,7 +10660,7 @@ public final class L2PcInstance extends L2Playable
 	@Override
 	public void reduceCurrentHp(double value, L2Character attacker, boolean awake, boolean isDOT, L2Skill skill)
 	{
-		getStatus().reduceHp(value, attacker, awake, isDOT);
+		getStatus().reduceHp(value, attacker, awake, isDOT, false);
 
     	// notify the tamed beast of attacks
     	if (getTrainedBeast() != null )

+ 16 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/status/CharStatus.java

@@ -117,14 +117,27 @@ public class CharStatus
      */
     public void reduceHp(double value, L2Character attacker)
     {
-        reduceHp(value, attacker, true, false);
+        reduceHp(value, attacker, true, false, false);
     }
     
-    public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT)
+    public void reduceHp(double value, L2Character attacker, boolean isHpConsumption)
+    {
+    	reduceHp(value, attacker, true, false, isHpConsumption);
+    }
+    
+    public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHpConsumption)
     {
     	if (getActiveChar() instanceof L2FortBallistaInstance && getActiveChar().getMaxHp() == value){}
     	else if (getActiveChar().isInvul())
-            return;
+    	{
+    		if (attacker == getActiveChar())
+    		{
+    			if (!isDOT && !isHpConsumption)
+    				return;
+    		}
+    		else
+    			return;
+    	}
         if (getActiveChar().isDead())
             return;
         

+ 2 - 2
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/status/FolkStatus.java

@@ -33,10 +33,10 @@ public class FolkStatus extends NpcStatus
     // =========================================================
     // Method - Public
     @Override
-	public final void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false); }
+	public final void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false, false); }
 
     @Override
-	public final void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT)
+	public final void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHpConsumption)
     {
     }
     

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/status/NpcStatus.java

@@ -33,10 +33,10 @@ public class NpcStatus extends CharStatus
     // =========================================================
     // Method - Public
     @Override
-	public void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false); }
+	public void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false, false); }
 
     @Override
-	public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT)
+	public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHpConsumption)
     {
         if (getActiveChar().isDead()) return;
         
@@ -50,7 +50,7 @@ public class NpcStatus extends CharStatus
         // Add attackers to npc's attacker list
         if (attacker != null) getActiveChar().addAttackerToAttackByList(attacker);
 
-        super.reduceHp(value, attacker, awake, isDOT);
+        super.reduceHp(value, attacker, awake, isDOT, isHpConsumption);
     }
 
     // =========================================================

+ 13 - 5
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/status/PcStatus.java

@@ -40,12 +40,20 @@ public class PcStatus extends PlayableStatus
     // =========================================================
     // Method - Public
     @Override
-	public final void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false); }
+	public final void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false, false); }
     @Override
-	public final void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT)
+	public final void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHpConsumption)
     {
-        if (getActiveChar().isInvul() && getActiveChar() != attacker)
-        	return;
+    	if (getActiveChar().isInvul())
+    	{
+    		if (attacker == getActiveChar())
+    		{
+    			if (!isDOT && !isHpConsumption)
+    				return;
+    		}
+    		else
+    			return;
+    	}
 		if (getActiveChar().isDead())
 			return;
 		
@@ -110,7 +118,7 @@ public class PcStatus extends PlayableStatus
             }
         }
 
-        super.reduceHp(value, attacker, awake, isDOT);
+        super.reduceHp(value, attacker, awake, isDOT, isHpConsumption);
 
         if (!getActiveChar().isDead() && getActiveChar().isSitting() && !isDOT)
             getActiveChar().standUp();

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/status/PetStatus.java

@@ -36,13 +36,13 @@ public class PetStatus extends SummonStatus
     // =========================================================
     // Method - Public
     @Override
-	public final void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false); }
+	public final void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false, false); }
     @Override
-	public final void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT)
+	public final void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHpConsumption)
     {
         if (getActiveChar().isDead()) return;
 
-        super.reduceHp(value, attacker, awake, isDOT);
+        super.reduceHp(value, attacker, awake, isDOT, isHpConsumption);
 
         if (attacker != null)
         {

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/status/PlayableStatus.java

@@ -32,13 +32,13 @@ public class PlayableStatus extends CharStatus
     // =========================================================
     // Method - Public
     @Override
-	public void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false); }
+	public void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false, false); }
     @Override
-	public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT)
+	public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHPConsumption)
     {
         if (getActiveChar().isDead()) return;
 
-        super.reduceHp(value, attacker, awake, isDOT);
+        super.reduceHp(value, attacker, awake, isDOT, isHPConsumption);
         /*
         if (attacker != null && attacker != getActiveChar())
         {

+ 3 - 3
L2_GameServer/java/net/sf/l2j/gameserver/model/actor/status/SiegeFlagStatus.java

@@ -11,15 +11,15 @@ public class SiegeFlagStatus extends NpcStatus
 	}
 	
 	@Override
-	public void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false); }
+	public void reduceHp(double value, L2Character attacker) { reduceHp(value, attacker, true, false, false); }
 
 	@Override
-	public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT)
+	public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHpConsumption)
 	{
 		if (getActiveChar().isAdvancedHeadquarter())
 			value /= 2.;
 		
-		super.reduceHp(value, attacker, awake, isDOT);
+		super.reduceHp(value, attacker, awake, isDOT, isHpConsumption);
 	}
 	
 	@Override