فهرست منبع

BETA: DP-Part for [L5901].

	* More retail like Chain Heal effect
	* Unhardcoded TARGET_ONE !TargetType
	* Misc AI cleanup
	
	Reviewed by: lion, MELERIX, UnAfraid, Zoey76
Adry_85 12 سال پیش
والد
کامیت
4569447371
17فایلهای تغییر یافته به همراه182 افزوده شده و 278 حذف شده
  1. 1 5
      L2J_DataPack_BETA/dist/game/data/scripts/ai/fantasy_isle/HandysBlockCheckerEvent.java
  2. 0 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/fantasy_isle/MC_Show.java
  3. 2 4
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/ForgeOfTheGods/ForgeOfTheGods.java
  4. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Rafforty/Rafforty.java
  5. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Tunatun/Tunatun.java
  6. 3 5
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java
  7. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminBuffs.java
  8. 1 1
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpHeal.java
  9. 0 162
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/ChainHeal.java
  10. 0 81
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/CombatPointHeal.java
  11. 162 0
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/TargetAreaFriendly.java
  12. 3 7
      L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/TargetOne.java
  13. 0 1
      L2J_DataPack_BETA/dist/game/data/scripts/instances/FinalEmperialTomb/FinalEmperialTomb.java
  14. 0 1
      L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00020_BringUpWithLove/Q00020_BringUpWithLove.java
  15. 0 1
      L2J_DataPack_BETA/dist/game/data/stats/skills/01300-01399.xml
  16. 7 5
      L2J_DataPack_BETA/dist/game/data/stats/skills/01500-01599.xml
  17. 0 1
      L2J_DataPack_BETA/dist/game/data/stats/skills/04300-04399.xml

+ 1 - 5
L2J_DataPack_BETA/dist/game/data/scripts/ai/fantasy_isle/HandysBlockCheckerEvent.java

@@ -86,11 +86,7 @@ public class HandysBlockCheckerEvent extends Quest
 	
 	private boolean eventIsFull(int arena)
 	{
-		if (HandysBlockCheckerManager.getInstance().getHolder(arena).getAllPlayers().size() == 12)
-		{
-			return true;
-		}
-		return false;
+		return HandysBlockCheckerManager.getInstance().getHolder(arena).getAllPlayers().size() == 12;
 	}
 	
 	public HandysBlockCheckerEvent(int questId, String name, String descr)

+ 0 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/fantasy_isle/MC_Show.java

@@ -97,7 +97,6 @@ public class MC_Show extends AbstractNpcAI
 		NpcStringId.PLEASE_REMEMBER_THAT_FANTASY_ISLE_IS_ALWAYS_PLANNING_A_LOT_OF_GREAT_SHOWS_FOR_YOU,
 		NpcStringId.WELL_I_WISH_I_COULD_CONTINUE_ALL_NIGHT_LONG_BUT_THIS_IS_IT_FOR_TODAY_THANK_YOU,
 		NpcStringId.WE_LOVE_YOU
-	
 	};
 	
 	private class ShoutInfo

+ 2 - 4
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/ForgeOfTheGods/ForgeOfTheGods.java

@@ -49,8 +49,7 @@ public class ForgeOfTheGods extends AbstractNpcAI
 		22646, // Ashuras of Destruction
 		22647, // Lavasillisk
 		22648, // Blazing Ifrit
-		22649
-	// Magma Drake
+		22649, // Magma Drake
 	};
 	
 	private static final int[] LAVASAURUSES =
@@ -59,8 +58,7 @@ public class ForgeOfTheGods extends AbstractNpcAI
 		18800, // Fledgling Lavasaurus
 		18801, // Adult Lavasaurus
 		18802, // Elderly Lavasaurus
-		18803
-	// Ancient Lavasaurus
+		18803, // Ancient Lavasaurus
 	};
 	
 	private static final int REFRESH = 15;

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Rafforty/Rafforty.java

@@ -67,7 +67,7 @@ public class Rafforty extends AbstractNpcAI
 		return htmltext;
 	}
 	
-	public Rafforty(String name, String descr)
+	private Rafforty(String name, String descr)
 	{
 		super(name, descr);
 		addStartNpc(RAFFORTY);

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/ai/npc/Tunatun/Tunatun.java

@@ -62,7 +62,7 @@ public class Tunatun extends AbstractNpcAI
 		return event;
 	}
 	
-	public Tunatun(String name, String descr)
+	private Tunatun(String name, String descr)
 	{
 		super(name, descr);
 		addStartNpc(TUNATUN);

+ 3 - 5
L2J_DataPack_BETA/dist/game/data/scripts/handlers/MasterHandler.java

@@ -211,9 +211,7 @@ import handlers.itemhandlers.TeleportBookmark;
 import handlers.skillhandlers.BallistaBomb;
 import handlers.skillhandlers.BeastSkills;
 import handlers.skillhandlers.Blow;
-import handlers.skillhandlers.ChainHeal;
 import handlers.skillhandlers.Charge;
-import handlers.skillhandlers.CombatPointHeal;
 import handlers.skillhandlers.Continuous;
 import handlers.skillhandlers.CpDamPercent;
 import handlers.skillhandlers.Craft;
@@ -250,6 +248,7 @@ import handlers.skillhandlers.Unlock;
 import handlers.targethandlers.TargetAlly;
 import handlers.targethandlers.TargetArea;
 import handlers.targethandlers.TargetAreaCorpseMob;
+import handlers.targethandlers.TargetAreaFriendly;
 import handlers.targethandlers.TargetAreaSummon;
 import handlers.targethandlers.TargetAura;
 import handlers.targethandlers.TargetAuraCorpseMob;
@@ -532,12 +531,11 @@ public class MasterHandler
 			Blow.class,
 			Pdam.class,
 			Mdam.class,
+			Charge.class,
 			CpDamPercent.class,
 			Manadam.class,
 			Heal.class,
 			HealPercent.class,
-			CombatPointHeal.class,
-			Charge.class,
 			Continuous.class,
 			Detection.class,
 			Resurrect.class,
@@ -545,7 +543,6 @@ public class MasterHandler
 			StrSiegeAssault.class,
 			SummonFriend.class,
 			Disablers.class,
-			ChainHeal.class,
 			StealBuffs.class,
 			BallistaBomb.class,
 			TakeCastle.class,
@@ -606,6 +603,7 @@ public class MasterHandler
 			TargetAlly.class,
 			TargetArea.class,
 			TargetAreaCorpseMob.class,
+			TargetAreaFriendly.class,
 			TargetAreaSummon.class,
 			TargetAura.class,
 			TargetAuraCorpseMob.class,

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/handlers/admincommandhandlers/AdminBuffs.java

@@ -149,7 +149,7 @@ public class AdminBuffs implements IAdminCommandHandler
 					}
 				}
 				
-				activeChar.sendMessage("All effects canceled within raidus " + radius);
+				activeChar.sendMessage("All effects canceled within radius " + radius);
 				return true;
 			}
 			catch (NumberFormatException e)

+ 1 - 1
L2J_DataPack_BETA/dist/game/data/scripts/handlers/effecthandlers/CpHeal.java

@@ -51,8 +51,8 @@ public class CpHeal extends L2Effect
 		{
 			return false;
 		}
-		StatusUpdate su = new StatusUpdate(target);
 		
+		StatusUpdate su = new StatusUpdate(target);
 		double amount = calc();
 		
 		// Prevents overheal and negative amount

+ 0 - 162
L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/ChainHeal.java

@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J DataPack
- * 
- * This file is part of L2J DataPack.
- * 
- * L2J DataPack 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.
- * 
- * L2J DataPack 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 handlers.skillhandlers;
-
-import java.util.List;
-import java.util.Map;
-
-import javolution.util.FastList;
-import javolution.util.FastMap;
-
-import com.l2jserver.gameserver.handler.ISkillHandler;
-import com.l2jserver.gameserver.handler.SkillHandler;
-import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
-import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
-import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
-import com.l2jserver.util.ValueSortMap;
-
-/**
- * @author Nik, UnAfraid
- */
-public class ChainHeal implements ISkillHandler
-{
-	private static final L2SkillType[] SKILL_IDS =
-	{
-		L2SkillType.CHAIN_HEAL
-	};
-	
-	@Override
-	public void useSkill(L2Character activeChar, L2Skill skill, L2Object[] targets)
-	{
-		// check for other effects
-		ISkillHandler handler = SkillHandler.getInstance().getHandler(L2SkillType.BUFF);
-		
-		if (handler != null)
-		{
-			handler.useSkill(activeChar, skill, targets);
-		}
-		
-		SystemMessage sm;
-		double amount = 0;
-		
-		L2Character[] characters = getTargetsToHeal((L2Character[]) targets);
-		double power = skill.getPower();
-		
-		// Get top 10 most damaged and iterate the heal over them
-		for (L2Character character : characters)
-		{
-			// 1505 - sublime self sacrifice
-			if ((character.isDead() || character.isInvul()) && (skill.getId() != 1505))
-			{
-				continue;
-			}
-			
-			// Cursed weapon owner can't heal or be healed
-			if (character != activeChar)
-			{
-				if (character.isPlayer() && character.getActingPlayer().isCursedWeaponEquipped())
-				{
-					continue;
-				}
-			}
-			
-			if (power == 100.)
-			{
-				amount = character.getMaxHp();
-			}
-			else
-			{
-				amount = (character.getMaxHp() * power) / 100.0;
-			}
-			
-			amount = Math.min(amount, character.getMaxRecoverableHp() - character.getCurrentHp());
-			
-			if (amount < 0)
-			{
-				amount = 0;
-			}
-			
-			character.setCurrentHp(amount + character.getCurrentHp());
-			
-			if (activeChar != character)
-			{
-				sm = SystemMessage.getSystemMessage(SystemMessageId.S2_HP_RESTORED_BY_C1);
-				sm.addCharName(activeChar);
-			}
-			else
-			{
-				sm = SystemMessage.getSystemMessage(SystemMessageId.S1_HP_RESTORED);
-			}
-			sm.addNumber((int) amount);
-			character.sendPacket(sm);
-			
-			StatusUpdate su = new StatusUpdate(character);
-			su.addAttribute(StatusUpdate.CUR_HP, (int) character.getCurrentHp());
-			character.sendPacket(su);
-			
-			power -= 3;
-		}
-	}
-	
-	private L2Character[] getTargetsToHeal(L2Character[] targets)
-	{
-		Map<L2Character, Double> tmpTargets = new FastMap<>();
-		List<L2Character> sortedListToReturn = new FastList<>();
-		int curTargets = 0;
-		
-		for (L2Character target : targets)
-		{
-			// 1505 - sublime self sacrifice
-			if (((target == null) || target.isDead() || target.isInvul()))
-			{
-				continue;
-			}
-			
-			if (target.getMaxHp() == target.getCurrentHp())
-			{
-				continue;
-			}
-			
-			double hpPercent = target.getCurrentHp() / target.getMaxHp();
-			tmpTargets.put(target, hpPercent);
-			
-			curTargets++;
-			if (curTargets >= 10)
-			{
-				break;
-			}
-		}
-		
-		// Sort in ascending order then add the values to the list
-		ValueSortMap.sortMapByValue(tmpTargets, true);
-		sortedListToReturn.addAll(tmpTargets.keySet());
-		
-		return sortedListToReturn.toArray(new L2Character[sortedListToReturn.size()]);
-	}
-	
-	@Override
-	public L2SkillType[] getSkillIds()
-	{
-		return SKILL_IDS;
-	}
-}

+ 0 - 81
L2J_DataPack_BETA/dist/game/data/scripts/handlers/skillhandlers/CombatPointHeal.java

@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2004-2013 L2J DataPack
- * 
- * This file is part of L2J DataPack.
- * 
- * L2J DataPack 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.
- * 
- * L2J DataPack 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 handlers.skillhandlers;
-
-import com.l2jserver.gameserver.handler.ISkillHandler;
-import com.l2jserver.gameserver.handler.SkillHandler;
-import com.l2jserver.gameserver.model.L2Object;
-import com.l2jserver.gameserver.model.actor.L2Character;
-import com.l2jserver.gameserver.model.skills.L2Skill;
-import com.l2jserver.gameserver.model.skills.L2SkillType;
-import com.l2jserver.gameserver.network.SystemMessageId;
-import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
-import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
-
-/**
- * @version $Revision: 1.1.2.2.2.1 $ $Date: 2005/03/02 15:38:36 $
- */
-public class CombatPointHeal implements ISkillHandler
-{
-	private static final L2SkillType[] SKILL_IDS =
-	{
-		L2SkillType.COMBATPOINTHEAL
-	};
-	
-	@Override
-	public void useSkill(L2Character actChar, L2Skill skill, L2Object[] targets)
-	{
-		// check for other effects
-		ISkillHandler handler = SkillHandler.getInstance().getHandler(L2SkillType.BUFF);
-		
-		if (handler != null)
-		{
-			handler.useSkill(actChar, skill, targets);
-		}
-		
-		for (L2Character target : (L2Character[]) targets)
-		{
-			if (target.isInvul())
-			{
-				continue;
-			}
-			
-			double cp = skill.getPower();
-			
-			cp = Math.min(cp, target.getMaxRecoverableCp() - target.getCurrentCp());
-			
-			// Prevent negative amounts
-			cp = Math.max(cp, 0);
-			
-			SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.S1_CP_WILL_BE_RESTORED);
-			sm.addNumber((int) cp);
-			target.sendPacket(sm);
-			target.setCurrentCp(cp + target.getCurrentCp());
-			StatusUpdate sump = new StatusUpdate(target);
-			sump.addAttribute(StatusUpdate.CUR_CP, (int) target.getCurrentCp());
-			target.sendPacket(sump);
-		}
-	}
-	
-	@Override
-	public L2SkillType[] getSkillIds()
-	{
-		return SKILL_IDS;
-	}
-}

+ 162 - 0
L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/TargetAreaFriendly.java

@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2004-2013 L2J DataPack
+ * 
+ * This file is part of L2J DataPack.
+ * 
+ * L2J DataPack 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.
+ * 
+ * L2J DataPack 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 handlers.targethandlers;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import com.l2jserver.Config;
+import com.l2jserver.gameserver.GeoData;
+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.L2SiegeFlagInstance;
+import com.l2jserver.gameserver.model.skills.L2Skill;
+import com.l2jserver.gameserver.model.skills.targets.L2TargetType;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.util.Rnd;
+
+/**
+ * @author Adry_85
+ */
+public class TargetAreaFriendly implements ITargetTypeHandler
+{
+	@Override
+	public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
+	{
+		List<L2Character> targetList = new ArrayList<>();
+		if (!checkTarget(activeChar, target) && (skill.getCastRange() >= 0))
+		{
+			activeChar.sendPacket(SystemMessageId.TARGET_IS_INCORRECT);
+			return _emptyTargetList;
+		}
+		
+		if (skill.getCastRange() >= 0)
+		{
+			if (onlyFirst)
+			{
+				return new L2Character[]
+				{
+					target
+				};
+			}
+			
+			if (activeChar.getActingPlayer().isInOlympiadMode())
+			{
+				return new L2Character[]
+				{
+					activeChar
+				};
+			}
+			targetList.add(target); // Add target to target list
+		}
+		
+		if (target != null)
+		{
+			int[] affectLimit = skill.getAffectLimit();
+			// calculate maximum affect limit between min and max values
+			int randomMax = Rnd.get(affectLimit[0], affectLimit[1]);
+			int curTargets = 0;
+			final Collection<L2Character> objs = target.getKnownList().getKnownCharactersInRadius(skill.getAffectRange());
+			
+			// TODO: Chain Heal - The recovery amount decreases starting from the most injured person.
+			Collections.sort(targetList, new CharComparator());
+			
+			for (L2Character obj : objs)
+			{
+				if (!checkTarget(activeChar, obj) || (obj == activeChar))
+				{
+					continue;
+				}
+				
+				targetList.add(obj);
+				
+				curTargets++;
+				if (curTargets >= randomMax)
+				{
+					break;
+				}
+			}
+		}
+		
+		if (targetList.isEmpty())
+		{
+			return _emptyTargetList;
+		}
+		return targetList.toArray(new L2Character[targetList.size()]);
+	}
+	
+	private boolean checkTarget(L2Character activeChar, L2Character target)
+	{
+		if ((Config.GEODATA > 0) && !GeoData.getInstance().canSeeTarget(activeChar, target))
+		{
+			return false;
+		}
+		
+		if ((target == null) || target.isDead() || target.isAlikeDead() || target.isDoor() || (target instanceof L2SiegeFlagInstance) || target.isMonster())
+		{
+			return false;
+		}
+		
+		if ((target.getActingPlayer() != null) && (target.getActingPlayer().inObserverMode() || target.getActingPlayer().isInOlympiadMode()))
+		{
+			return false;
+		}
+		
+		if ((activeChar.getActingPlayer().getClan() != null) && (target.getActingPlayer().getClan() != null))
+		{
+			if (activeChar.getActingPlayer().getClanId() != target.getActingPlayer().getClanId())
+			{
+				return false;
+			}
+		}
+		
+		if ((activeChar.getActingPlayer().getAllyId() != 0) && (target.getActingPlayer().getAllyId() != 0))
+		{
+			if (activeChar.getActingPlayer().getAllyId() != target.getActingPlayer().getAllyId())
+			{
+				return false;
+			}
+		}
+		
+		if ((target != activeChar) && (target.getActingPlayer() != null) && (target.getActingPlayer().getPvpFlag() > 0))
+		{
+			return false;
+		}
+		return true;
+	}
+	
+	public class CharComparator implements Comparator<L2Character>
+	{
+		@Override
+		public int compare(L2Character char1, L2Character char2)
+		{
+			return Integer.compare((int) (char1.getCurrentHp() / char1.getMaxHp()), (int) (char2.getCurrentHp() / char2.getMaxHp()));
+		}
+	}
+	
+	@Override
+	public Enum<L2TargetType> getTargetType()
+	{
+		return L2TargetType.TARGET_AREA_FRIENDLY;
+	}
+}

+ 3 - 7
L2J_DataPack_BETA/dist/game/data/scripts/handlers/targethandlers/TargetOne.java

@@ -35,24 +35,20 @@ public class TargetOne implements ITargetTypeHandler
 	@Override
 	public L2Object[] getTargetList(L2Skill skill, L2Character activeChar, boolean onlyFirst, L2Character target)
 	{
-		boolean canTargetSelf = skill.getId() == 1335; // TODO: Unhardcode Balance Life
+		boolean canTargetSelf = false;
 		switch (skill.getSkillType())
 		{
 			case BUFF:
 			case HEAL:
 			case HEAL_PERCENT:
 			case MANAHEAL_BY_LEVEL:
-			case COMBATPOINTHEAL:
 			case DUMMY:
 				canTargetSelf = true;
 				break;
 			default:
 			{
-				if (skill.hasEffectType(L2EffectType.CANCEL_DEBUFF, L2EffectType.NEGATE))
-				{
-					canTargetSelf = true;
-					break;
-				}
+				canTargetSelf = skill.hasEffectType(L2EffectType.CANCEL_DEBUFF, L2EffectType.NEGATE, L2EffectType.CPHEAL);
+				break;
 			}
 		}
 		

+ 0 - 1
L2J_DataPack_BETA/dist/game/data/scripts/instances/FinalEmperialTomb/FinalEmperialTomb.java

@@ -297,7 +297,6 @@ public class FinalEmperialTomb extends Quest
 	@SuppressWarnings("unused")
 	private void load()
 	{
-		
 		int spawnCount = 0;
 		try
 		{

+ 0 - 1
L2J_DataPack_BETA/dist/game/data/scripts/quests/Q00020_BringUpWithLove/Q00020_BringUpWithLove.java

@@ -43,7 +43,6 @@ public class Q00020_BringUpWithLove extends Quest
 		super(questId, name, descr);
 		addStartNpc(TUNATUN);
 		addTalkId(TUNATUN);
-		addFirstTalkId(TUNATUN);
 	}
 	
 	@Override

+ 0 - 1
L2J_DataPack_BETA/dist/game/data/stats/skills/01300-01399.xml

@@ -159,7 +159,6 @@
 		<set name="target" val="TARGET_ONE" />
 		<set name="hitTime" val="5000" />
 		<set name="reuseDelay" val="5000" />
-		<set name="skillType" val="COMBATPOINTHEAL" />
 		<set name="isMagic" val="1" /> <!-- Magic Skill -->
 		<set name="operateType" val="A1" />
 		<set name="castRange" val="600" />

+ 7 - 5
L2J_DataPack_BETA/dist/game/data/stats/skills/01500-01599.xml

@@ -1438,21 +1438,23 @@
 	<skill id="1553" levels="1" name="Chain Heal">
 		<!-- High Five Skill -->
 		<set name="affectLimit" val="5-12" />
+		<set name="affectRange" val="300" />
 		<set name="aggroPoints" val="398" /> <!-- FIXME: value unconfirmed -->
+		<set name="castRange" val="900" />
+		<set name="effectRange" val="1400" />
 		<set name="hitTime" val="3000" />
 		<set name="isMagic" val="1" /> <!-- Magic Skill -->
 		<set name="itemConsumeCount" val="4" />
 		<set name="itemConsumeId" val="3031" />
-		<!-- set name="maxTargets" val="10" / TODO: Require Support -->
 		<set name="magicLvl" val="83" />
 		<set name="mpConsume" val="156" />
 		<set name="mpInitialConsume" val="38" />
 		<set name="operateType" val="A1" /> <!-- FIXME: value unconfirmed -->
-		<set name="power" val="30" />
 		<set name="reuseDelay" val="5000" />
-		<set name="affectRange" val="900" />
-		<set name="skillType" val="CHAIN_HEAL" />
-		<set name="target" val="TARGET_ALLY" /> <!-- TODO: Appears to be only for TARGET_ALLY_MEMBER_AREA + (10 targets around him), not ALL ALLY MEMBERS -->
+		<set name="target" val="TARGET_AREA_FRIENDLY" />
+		<for>
+			<effect name="HealPercent" noicon="1" val="30" />
+		</for>
 	</skill>
 	<skill id="1554" levels="1" name="Aura Blast">
 		<!-- High Five Skill -->

+ 0 - 1
L2J_DataPack_BETA/dist/game/data/stats/skills/04300-04399.xml

@@ -1301,7 +1301,6 @@
 		<set name="isMagic" val="1" /> <!-- Magic Skill -->
 		<set name="magicLvl" val="1" />
 		<set name="operateType" val="A1" />
-		<set name="skillType" val="COMBATPOINTHEAL" />
 		<set name="target" val="TARGET_ONE" />
 		<for>
 			<effect name="CpHeal" noicon="1" val="5000" />