Parcourir la source

BETA: Support for Shield of Faith

Rumen Nikiforov il y a 14 ans
Parent
commit
3515dbbfcf

+ 12 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/L2Playable.java

@@ -313,6 +313,18 @@ public abstract class L2Playable extends L2Character
 	{
 		_lockedTarget = cha;
 	}
+
+	L2PcInstance transferDmgTo;
+		
+	public void setTransferDamageTo(L2PcInstance val)
+	{
+		transferDmgTo = val;
+	}
+	
+	public L2PcInstance getTransferingDamageTo()
+	{
+		return transferDmgTo;
+	}
 	
 	public abstract int getKarma();
 	

+ 38 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/status/PcStatus.java

@@ -156,6 +156,44 @@ public class PcStatus extends PlayableStatus
 				}
 			}
 			
+			final L2PcInstance caster = getActiveChar().getTransferingDamageTo();
+			if (caster != null
+					&& getActiveChar().getParty() != null
+					&& Util.checkIfInRange(1000, getActiveChar(), caster, true)
+					&& !caster.isDead() 
+					&& getActiveChar() != caster
+					&& getActiveChar().getParty().getPartyMembers().contains(caster))
+			{
+				int transferDmg = 0;
+				
+				transferDmg = (int) value * (int) getActiveChar().getStat().calcStat(Stats.TRANSFER_DAMAGE_TO_PLAYER, 0, null, null) / 100;
+				transferDmg = Math.min((int) caster.getCurrentHp() - 1, transferDmg);
+				if (transferDmg > 0 && attacker instanceof L2Playable)
+				{
+					int membersInRange = 0;
+					for (L2PcInstance member : caster.getParty().getPartyMembers())
+					{
+						if (Util.checkIfInRange(1000, member, caster, false) && member != caster)
+							membersInRange++;
+					}
+					
+					if (caster.getCurrentCp() > 0)
+					{
+						if (caster.getCurrentCp() > transferDmg)
+							reduceCp(transferDmg);
+						else
+						{
+							transferDmg = (int) (transferDmg - caster.getCurrentCp());
+							reduceCp((int) caster.getCurrentCp());
+						}
+					}
+					
+					caster.reduceCurrentHp(transferDmg / membersInRange, attacker, null);
+					value -= transferDmg;
+					fullValue = (int) value;
+				}
+			}
+			
 			if (!ignoreCP && attacker instanceof L2Playable)
 			{
 				if (getCurrentCp() >= value)

+ 44 - 7
L2J_Server_BETA/java/com/l2jserver/gameserver/model/actor/status/SummonStatus.java

@@ -15,9 +15,12 @@
 package com.l2jserver.gameserver.model.actor.status;
 
 import com.l2jserver.gameserver.model.actor.L2Character;
+import com.l2jserver.gameserver.model.actor.L2Playable;
 import com.l2jserver.gameserver.model.actor.L2Summon;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.entity.Duel;
+import com.l2jserver.gameserver.skills.Stats;
+import com.l2jserver.gameserver.util.Util;
 
 public class SummonStatus extends PlayableStatus
 {
@@ -35,16 +38,50 @@ public class SummonStatus extends PlayableStatus
 	@Override
 	public void reduceHp(double value, L2Character attacker, boolean awake, boolean isDOT, boolean isHPConsumption)
 	{
-		if (getActiveChar().isDead())
+		if (attacker == null || getActiveChar().isDead())
 			return;
 		
-		if (attacker != null)
+		final L2PcInstance attackerPlayer = attacker.getActingPlayer();
+		if (attackerPlayer != null && (getActiveChar().getOwner() == null || getActiveChar().getOwner().getDuelId() != attackerPlayer.getDuelId()))
+			attackerPlayer.setDuelState(Duel.DUELSTATE_INTERRUPTED);
+		
+		if (getActiveChar().getOwner().getParty() != null)
 		{
-			final L2PcInstance attackerPlayer = attacker.getActingPlayer();
-			if (attackerPlayer != null
-					&& (getActiveChar().getOwner() == null
-							|| getActiveChar().getOwner().getDuelId() != attackerPlayer.getDuelId()))
-				attackerPlayer.setDuelState(Duel.DUELSTATE_INTERRUPTED);
+			final L2PcInstance caster = getActiveChar().getTransferingDamageTo();
+			if (caster != null
+					&& getActiveChar().getParty() != null
+					&& Util.checkIfInRange(1000, getActiveChar(), caster, true)
+					&& !caster.isDead() 
+					&& getActiveChar().getOwner() != caster
+					&& getActiveChar().getParty().getPartyMembers().contains(caster))
+			{
+				int transferDmg = 0;
+
+				transferDmg = (int) value * (int) getActiveChar().getStat().calcStat(Stats.TRANSFER_DAMAGE_TO_PLAYER, 0, null, null) / 100;
+				transferDmg = Math.min((int) caster.getCurrentHp() - 1, transferDmg);
+				if (transferDmg > 0 && attacker instanceof L2Playable)
+				{
+					int membersInRange = 0;
+					for (L2PcInstance member : caster.getParty().getPartyMembers())
+					{
+						if (Util.checkIfInRange(1000, member, caster, false) && member != caster)
+							membersInRange++;
+					}
+					if (caster.getCurrentCp() > 0)
+					{
+						if (caster.getCurrentCp() > transferDmg)
+							reduceCp(transferDmg);
+						else
+						{
+							transferDmg = (int) (transferDmg - caster.getCurrentCp());
+							reduceCp((int) caster.getCurrentCp());
+						}
+					}
+					
+					caster.reduceCurrentHp(transferDmg / membersInRange, attacker, null);
+					value -= transferDmg;
+				}
+			}
 		}
 		super.reduceHp(value, attacker, awake, isDOT, isHPConsumption);
 	}

+ 1 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/Stats.java

@@ -194,6 +194,7 @@ public enum Stats
 	ABSORB_DAMAGE_PERCENT("absorbDam"),
 	TRANSFER_DAMAGE_PERCENT("transDam"),
 	MANA_SHIELD_PERCENT("manaShield"),
+	TRANSFER_DAMAGE_TO_PLAYER("transDamToPlayer"),
 	ABSORB_MANA_DAMAGE_PERCENT("absorbDamMana"),
 	
 	MAX_LOAD("maxLoad"),

+ 83 - 0
L2J_Server_BETA/java/com/l2jserver/gameserver/skills/effects/EffectTransferDamage.java

@@ -0,0 +1,83 @@
+/*
+ * This program is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation, either version 3 of the License, or (at your option) any later
+ * version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.l2jserver.gameserver.skills.effects;
+
+import com.l2jserver.gameserver.model.L2Effect;
+import com.l2jserver.gameserver.model.actor.L2Playable;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.skills.Env;
+import com.l2jserver.gameserver.templates.effects.EffectTemplate;
+import com.l2jserver.gameserver.templates.skills.L2EffectType;
+
+/**
+ *
+ * @author UnAfraid
+ */
+
+public class EffectTransferDamage extends L2Effect
+{  
+   public EffectTransferDamage(Env env, EffectTemplate template)
+   {
+      super(env, template);
+   }
+
+   public EffectTransferDamage(Env env, L2Effect effect)
+   {
+      super(env, effect);
+   }
+
+   /**
+    *
+    * @see com.l2jserver.gameserver.model.L2Effect#getEffectType()
+    */
+   @Override
+   public L2EffectType getEffectType()
+   {
+      return L2EffectType.DAMAGE_TRANSFER;
+   }
+
+   /**
+    *
+    * @see com.l2jserver.gameserver.model.L2Effect#onStart()
+    */
+   @Override
+   public boolean onStart()
+   {
+      if (getEffected() instanceof L2Playable && getEffector() instanceof L2PcInstance)
+    	  ((L2Playable) getEffected()).setTransferDamageTo((L2PcInstance) getEffector());
+      return true;
+   }
+
+   /**
+    *
+    * @see com.l2jserver.gameserver.model.L2Effect#onExit()
+    */
+   @Override
+   public void onExit()
+   {
+      if (getEffected() instanceof L2Playable && getEffector() instanceof L2PcInstance)
+         ((L2Playable) getEffected()).setTransferDamageTo(null);
+   }
+
+   /**
+    *
+    * @see com.l2jserver.gameserver.model.L2Effect#onActionTime()
+    */
+   @Override
+   public boolean onActionTime()
+   {
+      return false;
+   }
+}

+ 2 - 1
L2J_Server_BETA/java/com/l2jserver/gameserver/templates/skills/L2EffectType.java

@@ -75,5 +75,6 @@ public enum L2EffectType
 	HIDE,
 	ABORT_CAST,
 	INCREASE_CHARGES,
-	BLOCK_RESURRECTION
+	BLOCK_RESURRECTION,
+	DAMAGE_TRANSFER
 }