From 538191da49b91d0dcdb2ef4f79621aeb7ac93ebc Mon Sep 17 00:00:00 2001
From: Rumen Nikiforov <unafraid89@gmail.com>
Date: Sat, 9 Aug 2014 23:51:06 +0000
Subject: [PATCH] BETA: Fixing issues with channeling skills. 	* Patch by:
 St3eT

---
 .../ai/npc/NpcBuffers/NpcBufferAI.java        | 95 +++++++++++++++++--
 .../ai/npc/NpcBuffers/NpcBuffersData.xml      |  2 +-
 .../handlers/effecthandlers/SummonNpc.java    |  7 ++
 .../handlers/effecthandlers/Unsummon.java     | 29 +++---
 .../handlers/targethandlers/Ground.java       |  9 ++
 .../game/data/stats/skills/01400-01499.xml    | 10 +-
 6 files changed, 125 insertions(+), 27 deletions(-)

diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java
index 953141a8fb..afa288d8ab 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBufferAI.java
@@ -19,10 +19,13 @@
 package ai.npc.NpcBuffers;
 
 import com.l2jserver.gameserver.ThreadPoolManager;
+import com.l2jserver.gameserver.model.L2Party;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2TamedBeastInstance;
 import com.l2jserver.gameserver.model.skills.Skill;
+import com.l2jserver.gameserver.model.zone.ZoneId;
 import com.l2jserver.gameserver.util.Util;
 
 /**
@@ -63,7 +66,7 @@ public class NpcBufferAI implements Runnable
 				{
 					for (L2PcInstance member : player.getParty().getMembers())
 					{
-						if (Util.checkIfInRange(skill.getAffectRange(), _npc, member, true))
+						if (Util.checkIfInRange(skill.getAffectRange(), _npc, member, true) && !member.isDead())
 						{
 							skill.applyEffects(player, member);
 						}
@@ -71,7 +74,7 @@ public class NpcBufferAI implements Runnable
 				}
 				else
 				{
-					if (Util.checkIfInRange(skill.getAffectRange(), _npc, player, true))
+					if (Util.checkIfInRange(skill.getAffectRange(), _npc, player, true) && !player.isDead())
 					{
 						skill.applyEffects(player, player);
 					}
@@ -86,7 +89,7 @@ public class NpcBufferAI implements Runnable
 					{
 						case FRIEND:
 						{
-							if (isFriendly(player, target))
+							if (isFriendly(player, target) && target.isDead())
 							{
 								skill.applyEffects(target, target);
 							}
@@ -94,8 +97,13 @@ public class NpcBufferAI implements Runnable
 						}
 						case NOT_FRIEND:
 						{
-							if (!isFriendly(player, target))
+							if (isEnemy(player, target) && target.isDead())
 							{
+								// Update PvP status
+								if (target.isPlayable())
+								{
+									player.updatePvPStatus(target);
+								}
 								skill.applyEffects(target, target);
 							}
 							break;
@@ -108,6 +116,12 @@ public class NpcBufferAI implements Runnable
 		ThreadPoolManager.getInstance().scheduleGeneral(this, _skillData.getDelay());
 	}
 	
+	/**
+	 * Verifies if the character is an friend and can be affected by positive effect.
+	 * @param player the player
+	 * @param target the target
+	 * @return {@code true} if target can be affected by positive effect, {@code false} otherwise
+	 */
 	private boolean isFriendly(L2PcInstance player, L2Character target)
 	{
 		if (target.isPlayable())
@@ -119,26 +133,89 @@ public class NpcBufferAI implements Runnable
 				return true;
 			}
 			
-			if (player.isInParty() && targetPlayer.isInParty() && (player.getParty() == targetPlayer.getParty()))
+			if (player.isInParty() && targetPlayer.isInParty())
 			{
-				return true;
+				final L2Party party = player.getParty();
+				
+				if (party.containsPlayer(targetPlayer))
+				{
+					return true;
+				}
+				
+				if (party.isInCommandChannel() && party.getCommandChannel().containsPlayer(targetPlayer))
+				{
+					return true;
+				}
 			}
 			
-			if (player.getParty().isInCommandChannel() && (player.getParty().getCommandChannel() == target.getParty().getCommandChannel()))
+			if ((player.getClanId() > 0) && (player.getClanId() == targetPlayer.getClanId()))
 			{
 				return true;
 			}
 			
-			if ((player.getClanId() > 0) && (player.getClanId() == targetPlayer.getClanId()))
+			if ((player.getAllyId() > 0) && (player.getAllyId() == targetPlayer.getAllyId()))
 			{
 				return true;
 			}
 			
-			if ((player.getAllyId() > 0) && (player.getAllyId() == targetPlayer.getAllyId()))
+			if ((player.getSiegeState() > 0) && player.isInsideZone(ZoneId.SIEGE) && (player.getSiegeState() == targetPlayer.getSiegeState()) && (player.getSiegeSide() == targetPlayer.getSiegeSide()))
 			{
 				return true;
 			}
 		}
 		return false;
 	}
+	
+	/**
+	 * Verifies if the character is an enemy and can be affected by negative effect.
+	 * @param player the player
+	 * @param target the target
+	 * @return {@code true} if target can be affected by negative effect, {@code false} otherwise
+	 */
+	private boolean isEnemy(L2PcInstance player, L2Character target)
+	{
+		if (isFriendly(player, target))
+		{
+			return false;
+		}
+		
+		if (target instanceof L2TamedBeastInstance)
+		{
+			return isEnemy(player, ((L2TamedBeastInstance) target).getOwner());
+		}
+		
+		if (target.isMonster())
+		{
+			return true;
+		}
+		
+		if (target.isPlayable())
+		{
+			final L2PcInstance targetPlayer = target.getActingPlayer();
+			
+			if (!isFriendly(player, targetPlayer))
+			{
+				if (targetPlayer.getPvpFlag() != 0)
+				{
+					return true;
+				}
+				
+				if (targetPlayer.getKarma() != 0)
+				{
+					return true;
+				}
+				
+				if ((player.getClan() != null) && (targetPlayer.getClan() != null) && player.getClan().isAtWarWith(targetPlayer.getClan()))
+				{
+					return true;
+				}
+				
+				if (targetPlayer.isInsideZone(ZoneId.PVP))
+				{
+					return true;
+				}
+			}
+		}
+		return false;
+	}
 }
\ No newline at end of file
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml
index 6bc5566ec7..1602816473 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/NpcBuffers/NpcBuffersData.xml
@@ -41,7 +41,7 @@
 	<npc id="13024">
 		<skill id="5129" level="1" initialDelay="1" delay="5" affectScope="RANGE" affectObject="FRIEND" /> <!-- Smokescreen -->
 	</npc>
-	<npc id="13025">
+	<npc id="13028">
 		<skill id="5145" level="1" initialDelay="1" delay="2" affectScope="RANGE" affectObject="NOT_FRIEND" /> <!-- Day of Doom -->
 	</npc>
 	<npc id="13030">
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java
index ea3d668778..c666d6194e 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/SummonNpc.java
@@ -30,6 +30,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate;
 import com.l2jserver.gameserver.model.conditions.Condition;
 import com.l2jserver.gameserver.model.effects.AbstractEffect;
+import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.BuffInfo;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.util.Rnd;
@@ -57,6 +58,12 @@ public final class SummonNpc extends AbstractEffect
 		_isSummonSpawn = params.getBoolean("isSummonSpawn", false);
 	}
 	
+	@Override
+	public L2EffectType getEffectType()
+	{
+		return L2EffectType.SUMMON_NPC;
+	}
+	
 	@Override
 	public boolean isInstant()
 	{
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java
index fd5d4d08af..eb9b0eba9d 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/Unsummon.java
@@ -76,19 +76,24 @@ public final class Unsummon extends AbstractEffect
 	public void onStart(BuffInfo info)
 	{
 		final L2Summon summon = info.getEffected().getSummon();
-		if (summon.isPhoenixBlessed() || summon.isNoblesseBlessed())
-		{
-			summon.stopEffects(L2EffectType.NOBLESSE_BLESSING);
-		}
-		else
+		
+		if (summon != null)
 		{
-			summon.stopAllEffectsExceptThoseThatLastThroughDeath();
+			final L2PcInstance summonOwner = summon.getOwner();
+			
+			if (summon.isPhoenixBlessed() || summon.isNoblesseBlessed())
+			{
+				summon.stopEffects(L2EffectType.NOBLESSE_BLESSING);
+			}
+			else
+			{
+				summon.stopAllEffectsExceptThoseThatLastThroughDeath();
+			}
+			
+			summon.abortAttack();
+			summon.abortCast();
+			summon.unSummon(summonOwner);
+			summonOwner.sendPacket(SystemMessageId.YOUR_SERVITOR_HAS_VANISHED);
 		}
-		
-		summon.abortAttack();
-		summon.abortCast();
-		final L2PcInstance summonOwner = info.getEffected().getActingPlayer();
-		summon.unSummon(summonOwner);
-		summonOwner.sendPacket(SystemMessageId.YOUR_SERVITOR_HAS_VANISHED);
 	}
 }
diff --git a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/Ground.java b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/Ground.java
index ff463d736d..61804eab2e 100644
--- a/L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/Ground.java
+++ b/L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/Ground.java
@@ -25,6 +25,7 @@ import com.l2jserver.gameserver.handler.ITargetTypeHandler;
 import com.l2jserver.gameserver.model.L2Object;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.effects.L2EffectType;
 import com.l2jserver.gameserver.model.skills.Skill;
 import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
 import com.l2jserver.gameserver.model.zone.ZoneId;
@@ -58,6 +59,14 @@ public class Ground implements ITargetTypeHandler
 				targetList.add(character);
 			}
 		}
+		
+		if (targetList.isEmpty())
+		{
+			if (skill.hasEffectType(L2EffectType.SUMMON_NPC))
+			{
+				targetList.add(activeChar);
+			}
+		}
 		return targetList.isEmpty() ? EMPTY_TARGET_LIST : targetList.toArray(new L2Character[targetList.size()]);
 	}
 	
diff --git a/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml b/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml
index 306d9fdc5f..09442b962a 100644
--- a/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml
+++ b/L2J_DataPack_BETA/dist/game/data/stats/skills/01400-01499.xml
@@ -684,7 +684,7 @@
 		<set name="affectRange" val="200" />
 		<set name="blockedInOlympiad" val="true" />
 		<set name="castRange" val="900" />
-		<set name="channelingSkillId" val="5130" />
+		<set name="channelingSkillId" val="1419" />
 		<set name="channelingTickInterval" val="2" />
 		<set name="effectPoint" val="-676" />
 		<set name="element" val="0" /> <!-- Fire -->
@@ -712,7 +712,7 @@
 		<set name="affectRange" val="200" />
 		<set name="blockedInOlympiad" val="true" />
 		<set name="castRange" val="900" />
-		<set name="channelingSkillId" val="5132" />
+		<set name="channelingSkillId" val="1420" />
 		<set name="channelingTickInterval" val="2" />
 		<set name="effectPoint" val="-676" />
 		<set name="element" val="2" /> <!-- Wind -->
@@ -740,7 +740,7 @@
 		<set name="affectRange" val="200" />
 		<set name="blockedInOlympiad" val="true" />
 		<set name="castRange" val="900" />
-		<set name="channelingSkillId" val="5131" />
+		<set name="channelingSkillId" val="1421" />
 		<set name="channelingTickInterval" val="2" />
 		<set name="effectPoint" val="-676" />
 		<set name="element" val="1" /> <!-- Water -->
@@ -789,7 +789,7 @@
 		<set name="affectRange" val="200" />
 		<set name="blockedInOlympiad" val="true" />
 		<set name="castRange" val="900" />
-		<set name="channelingSkillId" val="5133" />
+		<set name="channelingSkillId" val="1423" />
 		<set name="channelingTickInterval" val="2" />
 		<set name="effectPoint" val="-676" />
 		<set name="element" val="5" /> <!-- Dark -->
@@ -3366,4 +3366,4 @@
 			</effect>
 		</for>
 	</skill>
-</list>
+</list>
\ No newline at end of file
-- 
GitLab