ソースを参照

Two fixes for Blows by Faror:
* Backstab doesn't ignore transfer pain anymore
* Blows can now cancel magic casts

DrHouse 16 年 前
コミット
36b51ac0b4

+ 35 - 11
L2_GameServer/java/net/sf/l2j/gameserver/handler/skillhandlers/Blow.java

@@ -20,14 +20,18 @@ import net.sf.l2j.gameserver.model.L2Effect;
 import net.sf.l2j.gameserver.model.L2ItemInstance;
 import net.sf.l2j.gameserver.model.L2Object;
 import net.sf.l2j.gameserver.model.L2Skill;
+import net.sf.l2j.gameserver.model.L2Summon;
 import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
+import net.sf.l2j.gameserver.model.actor.instance.L2SummonInstance;
 import net.sf.l2j.gameserver.network.SystemMessageId;
 import net.sf.l2j.gameserver.network.serverpackets.SystemMessage;
 import net.sf.l2j.gameserver.skills.Env;
 import net.sf.l2j.gameserver.skills.Formulas;
+import net.sf.l2j.gameserver.skills.Stats;
 import net.sf.l2j.gameserver.skills.funcs.Func;
 import net.sf.l2j.gameserver.templates.L2SkillType;
 import net.sf.l2j.gameserver.templates.L2WeaponType;
+import net.sf.l2j.gameserver.util.Util;
 
 /**
  *
@@ -111,7 +115,21 @@ public class Blow implements ISkillHandler
 				{
 					L2PcInstance player = (L2PcInstance) target;
 					if (!player.isInvul())
-					{
+					{   
+						// Check and calculate transfered damage
+			            L2Summon summon = player.getPet();
+			            if (summon != null && summon instanceof L2SummonInstance && Util.checkIfInRange(900, player, summon, true))
+			            {
+			                int tDmg = (int)damage * (int)player.getStat().calcStat(Stats.TRANSFER_DAMAGE_PERCENT, 0, null, null) /100;
+
+			                // Only transfer dmg up to current HP, it should not be killed
+			                if (summon.getCurrentHp() < tDmg) tDmg = (int)summon.getCurrentHp() - 1;
+			                if (tDmg > 0)
+			                {
+			                    summon.reduceCurrentHp(tDmg, activeChar );
+			                    damage -= tDmg;
+			                }
+			            }
 						if (damage >= player.getCurrentHp())
 						{
 							if (player.isInDuel())
@@ -134,16 +152,22 @@ public class Blow implements ISkillHandler
 						else
 							player.setCurrentHp(player.getCurrentHp() - damage);
 					}
-					SystemMessage smsg = new SystemMessage(SystemMessageId.S1_RECEIVED_DAMAGE_OF_S3_FROM_S2);
-					smsg.addPcName(player);
-					smsg.addCharName(activeChar);
-					smsg.addNumber((int) damage);
-					player.sendPacket(smsg);
-				}
-				else
-					target.reduceCurrentHp(damage, activeChar);
-				if (activeChar instanceof L2PcInstance)
-					activeChar.sendPacket(new SystemMessage(SystemMessageId.S1_HAD_CRITICAL_HIT).addPcName((L2PcInstance) activeChar));
+	        		SystemMessage smsg = new SystemMessage(SystemMessageId.S1_RECEIVED_DAMAGE_OF_S3_FROM_S2);
+	        		smsg.addPcName(player);
+	        		smsg.addCharName(activeChar);
+	        		smsg.addNumber((int)damage);
+	        		player.sendPacket(smsg);
+	        	}
+	        	else
+	        		target.reduceCurrentHp(damage, activeChar);
+				// Manage attack or cast break of the target (calculating rate, sending message...)
+                if (!target.isRaid() && Formulas.getInstance().calcAtkBreak(target, damage))
+                {
+                	target.breakAttack();
+                	target.breakCast();
+                }
+				if(activeChar instanceof L2PcInstance)
+					activeChar.sendPacket(new SystemMessage(SystemMessageId.S1_HAD_CRITICAL_HIT).addPcName((L2PcInstance)activeChar));
 				SystemMessage sm = new SystemMessage(SystemMessageId.YOU_DID_S1_DMG);
 				sm.addNumber((int) damage);
 				activeChar.sendPacket(sm);