From df27b7f6f901aa24e3a4c61f2d74d6a026033d6a Mon Sep 17 00:00:00 2001
From: Adry85 <adrya85@hotmail.it>
Date: Fri, 9 Feb 2018 21:08:55 +0100
Subject: [PATCH] Added BabyPets and ImprovedBabyPets AI.

Patch by: St3eT
---
 dist/game/data/scripts.cfg                    |   2 +
 .../scripts/ai/npc/Summons/Pets/BabyPets.java | 135 +++++++++++
 .../ai/npc/Summons/Pets/ImprovedBabyPets.java | 224 ++++++++++++++++++
 dist/game/data/stats/npcs/12700-12799.xml     |   6 +-
 dist/game/data/stats/npcs/16000-16099.xml     |  16 +-
 dist/game/data/stats/pets/0009.xml            |   4 -
 dist/game/data/stats/pets/0010.xml            |   4 -
 dist/game/data/stats/pets/0011.xml            |   4 -
 dist/game/data/stats/skills/05100-05199.xml   |  23 +-
 dist/game/data/stats/skills/05500-05599.xml   |  13 +-
 10 files changed, 392 insertions(+), 39 deletions(-)
 create mode 100644 dist/game/data/scripts/ai/npc/Summons/Pets/BabyPets.java
 create mode 100644 dist/game/data/scripts/ai/npc/Summons/Pets/ImprovedBabyPets.java

diff --git a/dist/game/data/scripts.cfg b/dist/game/data/scripts.cfg
index 809efd399c..9b0613539d 100644
--- a/dist/game/data/scripts.cfg
+++ b/dist/game/data/scripts.cfg
@@ -58,6 +58,8 @@ ai/npc/Selina/Selina.java
 ai/npc/Sirra/Sirra.java
 ai/npc/SubclassCertification/SubclassCertification.java
 ai/npc/Summons/MerchantGolem/GolemTrader.java
+ai/npc/Summons/Pets/BabyPets.java
+ai/npc/Summons/Pets/ImprovedBabyPets.java
 ai/npc/Summons/Servitors/Servitors.java
 ai/npc/SupportUnitCaptain/SupportUnitCaptain.java
 ai/npc/SymbolMaker/SymbolMaker.java
diff --git a/dist/game/data/scripts/ai/npc/Summons/Pets/BabyPets.java b/dist/game/data/scripts/ai/npc/Summons/Pets/BabyPets.java
new file mode 100644
index 0000000000..8399929c8f
--- /dev/null
+++ b/dist/game/data/scripts/ai/npc/Summons/Pets/BabyPets.java
@@ -0,0 +1,135 @@
+/*
+ * Copyright (C) 2004-2018 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 ai.npc.Summons.Pets;
+
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.L2Summon;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.ListenerRegisterType;
+import com.l2jserver.gameserver.model.events.annotations.RegisterEvent;
+import com.l2jserver.gameserver.model.events.annotations.RegisterType;
+import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogout;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.util.Util;
+
+import ai.npc.AbstractNpcAI;
+
+/**
+ * Baby Pets AI.
+ * @author St3eT
+ * @since 2.6.0.0
+ */
+public final class BabyPets extends AbstractNpcAI
+{
+	// NPCs
+	private static final int[] BABY_PETS =
+	{
+		12780, // Baby Buffalo
+		12781, // Baby Kookaburra
+		12782, // Baby Cougar
+	};
+	
+	// Skills
+	private static final int HEAL_TRICK = 4717;
+	private static final int GREATER_HEAL_TRICK = 4718;
+	
+	private BabyPets()
+	{
+		super(BabyPets.class.getSimpleName(), "ai/npc/Summons/Pets");
+		addSummonSpawnId(BABY_PETS);
+	}
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (event.equals("CAST_HEAL") && (player != null))
+		{
+			final L2PetInstance pet = (L2PetInstance) player.getSummon();
+			
+			if (pet != null)
+			{
+				if (getRandom(100) <= 25)
+				{
+					castHealSkill(pet, new SkillHolder(HEAL_TRICK, getHealLevel(pet)), 80);
+				}
+				
+				if (getRandom(100) <= 75)
+				{
+					castHealSkill(pet, new SkillHolder(GREATER_HEAL_TRICK, getHealLevel(pet)), 15);
+				}
+			}
+			else
+			{
+				cancelQuestTimer("CAST_HEAL", null, player);
+			}
+		}
+		return super.onAdvEvent(event, npc, player);
+	}
+	
+	@RegisterEvent(EventType.ON_PLAYER_LOGOUT)
+	@RegisterType(ListenerRegisterType.GLOBAL)
+	public void OnPlayerLogout(OnPlayerLogout event)
+	{
+		cancelQuestTimer("CAST_HEAL", null, event.getActiveChar());
+	}
+	
+	@Override
+	public void onSummonSpawn(L2Summon summon)
+	{
+		startQuestTimer("CAST_HEAL", 1000, null, summon.getOwner(), true);
+	}
+	
+	private void castHealSkill(L2Summon summon, SkillHolder skill, int maxHpPer)
+	{
+		final L2PcInstance owner = summon.getOwner();
+		if (!owner.isDead() && !summon.isHungry() && (((owner.getCurrentHp() / owner.getMaxHp()) * 100) < maxHpPer) && summon.checkDoCastConditions(skill.getSkill()))
+		{
+			final boolean previousFollowStatus = summon.getFollowStatus();
+			
+			if (!previousFollowStatus && !summon.isInsideRadius(owner, skill.getSkill().getCastRange(), true, true))
+			{
+				return;
+			}
+			
+			summon.setTarget(owner);
+			summon.doCast(skill.getSkill());
+			summon.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PET_USES_S1).addSkillName(skill.getSkill()));
+			
+			if (previousFollowStatus != summon.getFollowStatus())
+			{
+				summon.setFollowStatus(previousFollowStatus);
+			}
+		}
+	}
+	
+	private int getHealLevel(L2Summon summon)
+	{
+		final int summonLevel = summon.getLevel();
+		return Util.constrain(summonLevel < 70 ? (summonLevel / 10) : (7 + ((summonLevel - 70) / 5)), 1, 12);
+	}
+	
+	public static void main(String[] args)
+	{
+		new BabyPets();
+	}
+}
\ No newline at end of file
diff --git a/dist/game/data/scripts/ai/npc/Summons/Pets/ImprovedBabyPets.java b/dist/game/data/scripts/ai/npc/Summons/Pets/ImprovedBabyPets.java
new file mode 100644
index 0000000000..8ba5f668d4
--- /dev/null
+++ b/dist/game/data/scripts/ai/npc/Summons/Pets/ImprovedBabyPets.java
@@ -0,0 +1,224 @@
+/*
+ * Copyright (C) 2004-2018 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 ai.npc.Summons.Pets;
+
+import com.l2jserver.gameserver.model.StatsSet;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.L2Summon;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
+import com.l2jserver.gameserver.model.events.EventType;
+import com.l2jserver.gameserver.model.events.ListenerRegisterType;
+import com.l2jserver.gameserver.model.events.annotations.RegisterEvent;
+import com.l2jserver.gameserver.model.events.annotations.RegisterType;
+import com.l2jserver.gameserver.model.events.impl.character.player.OnPlayerLogout;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
+import com.l2jserver.gameserver.model.skills.AbnormalType;
+import com.l2jserver.gameserver.network.SystemMessageId;
+import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
+import com.l2jserver.gameserver.util.Util;
+
+import ai.npc.AbstractNpcAI;
+
+/**
+ * Improved Baby Pets AI.
+ * @author St3eT
+ * @since 2.6.0.0
+ */
+public final class ImprovedBabyPets extends AbstractNpcAI
+{
+	// NPCs
+	private static final int[] IMPROVED_BABY_PETS =
+	{
+		16034, // Improved Baby Buffalo
+		16035, // Improved Baby Kookaburra
+		16036, // Improved Baby Cougar
+	};
+	
+	// Skill
+	private static final int BUFF_CONTROL = 5771;
+	
+	private ImprovedBabyPets()
+	{
+		super(ImprovedBabyPets.class.getSimpleName(), "ai/npc/Summons/Pets");
+		addSummonSpawnId(IMPROVED_BABY_PETS);
+	}
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		if (player != null)
+		{
+			final L2PetInstance pet = (L2PetInstance) player.getSummon();
+			if (pet == null)
+			{
+				cancelQuestTimer("CAST_BUFF", null, player);
+				cancelQuestTimer("CAST_HEAL", null, player);
+			}
+			else if (event.equals("CAST_HEAL") && player.isInCombat() && !pet.isHungry())
+			{
+				final double hpPer = (player.getCurrentHp() / player.getMaxHp()) * 100;
+				final double mpPer = (player.getCurrentMp() / player.getMaxMp()) * 100;
+				final int healStep = (int) Math.floor((pet.getLevel() / 5) - 11);
+				final int healType = pet.getTemplate().getParameters().getInt("heal_type", 0);
+				
+				switch (healType)
+				{
+					case 0:
+					{
+						if (hpPer < 30)
+						{
+							castHealSkill(pet, Util.constrain(healStep, 0, 3), 2);
+						}
+						else if (mpPer < 60)
+						{
+							castHealSkill(pet, Util.constrain(healStep, 0, 3), 1);
+						}
+						break;
+					}
+					case 1:
+					{
+						if ((hpPer >= 30) && (hpPer < 70))
+						{
+							castHealSkill(pet, Util.constrain(healStep, 0, 3), 1);
+						}
+						else if (hpPer < 30)
+						{
+							castHealSkill(pet, Util.constrain(healStep, 0, 3), 2);
+						}
+						break;
+					}
+				}
+			}
+			else if (event.equals("CAST_BUFF") && !pet.isAffectedBySkill(BUFF_CONTROL) && !pet.isHungry())
+			{
+				final int buffStep = (int) Util.constrain(Math.floor((pet.getLevel() / 5) - 11), 0, 3);
+				for (int i = 1; i <= (2 * (1 + buffStep)); i++)
+				{
+					castBuffSkill(pet, buffStep, i);
+				}
+			}
+		}
+		return super.onAdvEvent(event, npc, player);
+	}
+	
+	@RegisterEvent(EventType.ON_PLAYER_LOGOUT)
+	@RegisterType(ListenerRegisterType.GLOBAL)
+	public void OnPlayerLogout(OnPlayerLogout event)
+	{
+		cancelQuestTimer("CAST_BUFF", null, event.getActiveChar());
+		cancelQuestTimer("CAST_HEAL", null, event.getActiveChar());
+	}
+	
+	@Override
+	public void onSummonSpawn(L2Summon summon)
+	{
+		startQuestTimer("CAST_BUFF", 10000, null, summon.getOwner(), true);
+		startQuestTimer("CAST_HEAL", 3000, null, summon.getOwner(), true);
+	}
+	
+	private boolean castBuffSkill(L2Summon summon, int stepNumber, int buffNumber)
+	{
+		final L2PcInstance owner = summon.getOwner();
+		if ((owner == null) || owner.isDead() || owner.isInvul())
+		{
+			return false;
+		}
+		
+		final StatsSet parameters = summon.getTemplate().getParameters();
+		final SkillHolder skill = parameters.getObject("step" + stepNumber + "_buff0" + buffNumber, SkillHolder.class);
+		
+		if (skill != null)
+		{
+			final SkillHolder mergedSkill = parameters.getObject("step" + stepNumber + "_merged_buff0" + buffNumber, SkillHolder.class);
+			final int targetType = parameters.getInt("step" + stepNumber + "_buff_target0" + buffNumber, 0);
+			if (!hasAbnormal(owner, skill.getSkill().getAbnormalType()) && summon.checkDoCastConditions(skill.getSkill()))
+			{
+				if ((mergedSkill != null) && hasAbnormal(owner, mergedSkill.getSkill().getAbnormalType()))
+				{
+					return false;
+				}
+				
+				final boolean previousFollowStatus = summon.getFollowStatus();
+				
+				if (!previousFollowStatus && !summon.isInsideRadius(owner, skill.getSkill().getCastRange(), true, true))
+				{
+					return false;
+				}
+				
+				if ((targetType >= 0) && (targetType <= 2))
+				{
+					summon.setTarget((targetType == 1) ? summon : owner);
+					summon.doCast(skill.getSkill());
+					summon.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PET_USES_S1).addSkillName(skill.getSkill()));
+					
+					if (previousFollowStatus != summon.getFollowStatus())
+					{
+						summon.setFollowStatus(previousFollowStatus);
+					}
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+	
+	private void castHealSkill(L2Summon summon, int stepNumber, int healNumber)
+	{
+		final L2PcInstance owner = summon.getOwner();
+		final StatsSet parameters = summon.getTemplate().getParameters();
+		final SkillHolder skill = parameters.getObject("step" + stepNumber + "_heal0" + healNumber, SkillHolder.class);
+		final int targetType = parameters.getInt("step" + stepNumber + "_heal_target0" + healNumber, 0);
+		
+		if ((skill != null) && (owner != null) && summon.checkDoCastConditions(skill.getSkill()) && !owner.isDead())
+		{
+			final boolean previousFollowStatus = summon.getFollowStatus();
+			
+			if (!previousFollowStatus && !summon.isInsideRadius(owner, skill.getSkill().getCastRange(), true, true))
+			{
+				return;
+			}
+			
+			if (!hasAbnormal(owner, skill.getSkill().getAbnormalType()))
+			{
+				if ((targetType >= 0) && (targetType <= 2))
+				{
+					summon.setTarget((targetType == 1) ? summon : owner);
+					summon.doCast(skill.getSkill());
+					summon.sendPacket(SystemMessage.getSystemMessage(SystemMessageId.PET_USES_S1).addSkillName(skill.getSkill()));
+					
+					if (previousFollowStatus != summon.getFollowStatus())
+					{
+						summon.setFollowStatus(previousFollowStatus);
+					}
+				}
+			}
+		}
+	}
+	
+	private static boolean hasAbnormal(L2PcInstance player, AbnormalType type)
+	{
+		return player.getEffectList().getBuffInfoByAbnormalType(type) != null;
+	}
+	
+	public static void main(String[] args)
+	{
+		new ImprovedBabyPets();
+	}
+}
\ No newline at end of file
diff --git a/dist/game/data/stats/npcs/12700-12799.xml b/dist/game/data/stats/npcs/12700-12799.xml
index 7faccf9a24..8d0213c7c6 100644
--- a/dist/game/data/stats/npcs/12700-12799.xml
+++ b/dist/game/data/stats/npcs/12700-12799.xml
@@ -222,7 +222,7 @@
 			<height normal="31" />
 		</collision>
 	</npc>
-	<npc id="12780" level="25" type="L2BabyPet" name="Baby Buffalo">
+	<npc id="12780" level="25" type="L2Pet" name="Baby Buffalo">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<skill name="Heal1" id="4717" level="1" /> <!-- Heal Trick -->
@@ -264,7 +264,7 @@
 			<height normal="15" />
 		</collision>
 	</npc>
-	<npc id="12781" level="25" type="L2BabyPet" name="Baby Kookaburra">
+	<npc id="12781" level="25" type="L2Pet" name="Baby Kookaburra">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<skill name="Heal1" id="4717" level="1" /> <!-- Heal Trick -->
@@ -306,7 +306,7 @@
 			<height normal="15" />
 		</collision>
 	</npc>
-	<npc id="12782" level="25" type="L2BabyPet" name="Baby Cougar">
+	<npc id="12782" level="25" type="L2Pet" name="Baby Cougar">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<skill name="Heal1" id="4717" level="1" /> <!-- Heal Trick -->
diff --git a/dist/game/data/stats/npcs/16000-16099.xml b/dist/game/data/stats/npcs/16000-16099.xml
index fc2741a7d7..be80a70d6b 100644
--- a/dist/game/data/stats/npcs/16000-16099.xml
+++ b/dist/game/data/stats/npcs/16000-16099.xml
@@ -1100,7 +1100,7 @@
 			<height normal="5.271" />
 		</collision>
 	</npc>
-	<npc id="16034" level="55" type="L2BabyPet" name="Improved Baby Buffalo">
+	<npc id="16034" level="55" type="L2Pet" name="Improved Baby Buffalo">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<skill name="step0_buff01" id="5189" level="6" /> <!-- Pet Blessed Body -->
@@ -1228,7 +1228,7 @@
 			<height normal="15" />
 		</collision>
 	</npc>
-	<npc id="16035" level="55" type="L2BabyPet" name="Improved Baby Kookaburra">
+	<npc id="16035" level="55" type="L2Pet" name="Improved Baby Kookaburra">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<skill name="step0_buff01" id="5194" level="3" /> <!-- Pet Empower -->
@@ -1357,7 +1357,7 @@
 			<height normal="15" />
 		</collision>
 	</npc>
-	<npc id="16036" level="55" type="L2BabyPet" name="Improved Baby Cougar">
+	<npc id="16036" level="55" type="L2Pet" name="Improved Baby Cougar">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<skill name="step0_buff01" id="5194" level="3" /> <!-- Pet Empower -->
@@ -2230,7 +2230,7 @@
 			<height normal="16.5" />
 		</collision>
 	</npc>
-	<npc id="16045" level="55" type="L2BabyPet" name="White Weasel">
+	<npc id="16045" level="55" type="L2Pet" name="White Weasel">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<param name="MoveAroundSocial" value="133" />
@@ -2323,7 +2323,7 @@
 			<height normal="12.5" />
 		</collision>
 	</npc>
-	<npc id="16046" level="55" type="L2BabyPet" name="Fairy Princess">
+	<npc id="16046" level="55" type="L2Pet" name="Fairy Princess">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<param name="MoveAroundSocial" value="123" />
@@ -2486,7 +2486,7 @@
 			<height normal="19.5" />
 		</collision>
 	</npc>
-	<npc id="16051" level="55" type="L2BabyPet" name="Spirit Shaman">
+	<npc id="16051" level="55" type="L2Pet" name="Spirit Shaman">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<param name="MoveAroundSocial" value="80" />
@@ -2631,7 +2631,7 @@
 			<height normal="15.6" />
 		</collision>
 	</npc>
-	<npc id="16052" level="55" type="L2BabyPet" name="Toy Knight">
+	<npc id="16052" level="55" type="L2Pet" name="Toy Knight">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<param name="MoveAroundSocial" value="58" />
@@ -2806,7 +2806,7 @@
 			<height normal="15" />
 		</collision>
 	</npc>
-	<npc id="16053" level="55" type="L2BabyPet" name="Turtle Ascetic">
+	<npc id="16053" level="55" type="L2Pet" name="Turtle Ascetic">
 		<!-- Confirmed CT2.5 -->
 		<parameters>
 			<param name="MoveAroundSocial" value="100" />
diff --git a/dist/game/data/stats/pets/0009.xml b/dist/game/data/stats/pets/0009.xml
index 42164cc937..52e5496de5 100644
--- a/dist/game/data/stats/pets/0009.xml
+++ b/dist/game/data/stats/pets/0009.xml
@@ -5,10 +5,6 @@
 	<pet id="12780" itemId="6648" index="9">
 		<set name="food" val="7582" />
 		<set name="hungry_limit" val="55" />
-		<skills>
-			<skill minLvl="1" skillId="4717" skillLvl="0" />
-			<skill minLvl="1" skillId="4718" skillLvl="0" />
-		</skills>
 		<stats>
 			<stat level="1">
 				<set name="max_meal" val="12" />
diff --git a/dist/game/data/stats/pets/0010.xml b/dist/game/data/stats/pets/0010.xml
index 06b02d03c0..5d2edad7ef 100644
--- a/dist/game/data/stats/pets/0010.xml
+++ b/dist/game/data/stats/pets/0010.xml
@@ -5,10 +5,6 @@
 	<pet id="12781" itemId="6650" index="10">
 		<set name="food" val="7582" />
 		<set name="hungry_limit" val="55" />
-		<skills>
-			<skill minLvl="1" skillId="4717" skillLvl="0" />
-			<skill minLvl="1" skillId="4718" skillLvl="0" />
-		</skills>
 		<stats>
 			<stat level="1">
 				<set name="max_meal" val="12" />
diff --git a/dist/game/data/stats/pets/0011.xml b/dist/game/data/stats/pets/0011.xml
index f11c4081b6..f81532460a 100644
--- a/dist/game/data/stats/pets/0011.xml
+++ b/dist/game/data/stats/pets/0011.xml
@@ -5,10 +5,6 @@
 	<pet id="12782" itemId="6649" index="11">
 		<set name="food" val="7582" />
 		<set name="hungry_limit" val="55" />
-		<skills>
-			<skill minLvl="1" skillId="4717" skillLvl="0" />
-			<skill minLvl="1" skillId="4718" skillLvl="0" />
-		</skills>
 		<stats>
 			<stat level="1">
 				<set name="max_meal" val="12" />
diff --git a/dist/game/data/stats/skills/05100-05199.xml b/dist/game/data/stats/skills/05100-05199.xml
index 356d7b72f5..a681c62cc7 100644
--- a/dist/game/data/stats/skills/05100-05199.xml
+++ b/dist/game/data/stats/skills/05100-05199.xml
@@ -2070,28 +2070,28 @@
 		</effects>
 	</skill>
 	<skill id="5195" levels="12" name="Pet Greater Heal">
-		<table name="#abnormalLvls"> 1 1 2 2 4 6 7 7 7 7 7 7 </table>
+		<!-- High Five Confirmed -->
+		<table name="#abnormalLvl"> 1 1 2 2 4 6 7 7 7 7 7 7 </table>
 		<table name="#amount"> 58 92 148 219 299 380 450 477 500 525 542 550 </table>
-		<table name="#effectPoints"> 83 151 245 362 494 628 743 789 826 867 895 913 </table>
+		<table name="#effectPoint"> 83 151 245 362 494 628 743 789 826 867 895 913 </table>
+		<table name="#healOverTime"> 4 7 10 15 20 26 30 32 32 32 32 32 </table>
 		<table name="#magicLvl"> 10 20 30 40 50 60 70 75 80 85 90 95 </table>
-		<table name="#mpConsume2"> 7 12 18 25 32 39 46 49 51 52 53 53  </table>
 		<table name="#mpConsume1"> 2 3 5 7 8 10 12 13 13 13 14 14 </table>
-		<set name="abnormalLvl" val="#abnormalLvls" />
+		<table name="#mpConsume2"> 7 12 18 25 32 39 46 49 51 52 53 53 </table>
+		<set name="abnormalLvl" val="#abnormalLvl" />
 		<set name="abnormalTime" val="15" />
 		<set name="abnormalType" val="LIFE_FORCE_OTHERS" />
-		<set name="activateRate" val="0" />
+		<set name="affectScope" val="SINGLE" />
 		<set name="castRange" val="600" />
-		<set name="effectPoint" val="#effectPoints" />
+		<set name="effectPoint" val="#effectPoint" />
 		<set name="effectRange" val="1100" />
 		<set name="hitTime" val="5000" />
 		<set name="icon" val="icon.skill1217" />
-		<set name="isMagic" val="1" /> <!-- Magic Skill -->
+		<set name="isMagic" val="1" />
 		<set name="magicLvl" val="#magicLvl" />
-		<set name="mpConsume2" val="#mpConsume2" />
 		<set name="mpConsume1" val="#mpConsume1" />
+		<set name="mpConsume2" val="#mpConsume2" />
 		<set name="operateType" val="A2" />
-		<set name="power" val="#amount" /> <!-- TODO: remove after BabyPet rework -->
-		<set name="reuseDelay" val="6000" />
 		<set name="reuseDelay" val="10000" />
 		<set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
 		<set name="targetType" val="OWNER_PET" />
@@ -2099,6 +2099,9 @@
 			<effect name="Heal">
 				<param power="#amount" />
 			</effect>
+			<effect name="HealOverTime" ticks="1">
+				<param power="#healOverTime" />
+			</effect>
 		</effects>
 	</skill>
 	<skill id="5196" levels="3" name="Pet Wind Shackle">
diff --git a/dist/game/data/stats/skills/05500-05599.xml b/dist/game/data/stats/skills/05500-05599.xml
index 21c18c7ced..bf26ee7003 100644
--- a/dist/game/data/stats/skills/05500-05599.xml
+++ b/dist/game/data/stats/skills/05500-05599.xml
@@ -1761,22 +1761,23 @@
 		</effects>
 	</skill>
 	<skill id="5590" levels="12" name="Pet Battle Heal">
+		<!-- High Five Confirmed -->
 		<table name="#amount"> 91 166 269 398 544 690 817 867 909 954 985 1005 </table>
-		<table name="#effectPoints"> 66 121 196 290 396 502 595 631 661 694 716 731 </table>
+		<table name="#effectPoint"> 66 121 196 290 396 502 595 631 661 694 716 731 </table>
 		<table name="#magicLvl"> 10 20 30 40 50 60 70 75 80 85 90 95 </table>
-		<table name="#mpConsume2"> 10 18 27 37 48 59 68 73 76 78 79 79 </table>
 		<table name="#mpConsume1"> 3 5 7 10 12 15 17 19 19 20 20 20 </table>
+		<table name="#mpConsume2"> 10 18 27 37 48 59 68 73 76 78 79 79 </table>
+		<set name="affectScope" val="SINGLE" />
 		<set name="castRange" val="600" />
-		<set name="effectPoint" val="#effectPoints" />
+		<set name="effectPoint" val="#effectPoint" />
 		<set name="effectRange" val="1100" />
 		<set name="hitTime" val="2000" />
 		<set name="icon" val="icon.skill1218" />
-		<set name="isMagic" val="1" /> <!-- Magic Skill -->
+		<set name="isMagic" val="1" />
 		<set name="magicLvl" val="#magicLvl" />
-		<set name="mpConsume2" val="#mpConsume2" />
 		<set name="mpConsume1" val="#mpConsume1" />
+		<set name="mpConsume2" val="#mpConsume2" />
 		<set name="operateType" val="A1" />
-		<set name="power" val="#amount" /> <!-- TODO: remove after BabyPet rework -->
 		<set name="reuseDelay" val="3000" />
 		<set name="rideState" val="NONE;STRIDER;WYVERN;WOLF" />
 		<set name="targetType" val="OWNER_PET" />
-- 
GitLab