From 9deca1475b26fb69cb6091db06839266c5e021f2 Mon Sep 17 00:00:00 2001
From: Maneco2 <maneco_1@hotmail.com>
Date: Mon, 15 Jun 2020 19:18:28 -0300
Subject: [PATCH] Add Bloody Karik AI

---
 .../ai/group_template/NonLethalableNpcs.java  |   3 +
 .../datapack/ai/individual/BloodyKarik.java   | 165 ++++++++++++++++++
 src/main/resources/data/scripts.cfg           |   1 +
 3 files changed, 169 insertions(+)
 create mode 100644 src/main/java/com/l2jserver/datapack/ai/individual/BloodyKarik.java

diff --git a/src/main/java/com/l2jserver/datapack/ai/group_template/NonLethalableNpcs.java b/src/main/java/com/l2jserver/datapack/ai/group_template/NonLethalableNpcs.java
index 3d1af61ba5..4dde377d44 100644
--- a/src/main/java/com/l2jserver/datapack/ai/group_template/NonLethalableNpcs.java
+++ b/src/main/java/com/l2jserver/datapack/ai/group_template/NonLethalableNpcs.java
@@ -26,6 +26,9 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
  */
 public final class NonLethalableNpcs extends AbstractNpcAI {
 	private static final int[] NPCS = {
+		22854, // Bloody Karik
+		22855, // Bloody Berserker
+		22856, // Bloody Karinness
 		22857, // Knoriks
 		35062, // Headquarters
 	};
diff --git a/src/main/java/com/l2jserver/datapack/ai/individual/BloodyKarik.java b/src/main/java/com/l2jserver/datapack/ai/individual/BloodyKarik.java
new file mode 100644
index 0000000000..f0ebf777b5
--- /dev/null
+++ b/src/main/java/com/l2jserver/datapack/ai/individual/BloodyKarik.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright (C) 2004-2020 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 com.l2jserver.datapack.ai.individual;
+
+import com.l2jserver.datapack.ai.npc.AbstractNpcAI;
+import com.l2jserver.gameserver.GeoData;
+import com.l2jserver.gameserver.datatables.SpawnTable;
+import com.l2jserver.gameserver.model.L2Spawn;
+import com.l2jserver.gameserver.model.Location;
+import com.l2jserver.gameserver.model.actor.L2Attackable;
+import com.l2jserver.gameserver.model.actor.L2Npc;
+import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+
+/**
+ * Bloody Karik AI.
+ * @author Maneco2
+ * @version 2.6.2.0
+ */
+public class BloodyKarik extends AbstractNpcAI
+{
+	// NPCs
+	private static final int BLOODY_KARIK = 22854;
+	
+	private static final int[] BLOODY_FAMILY =
+	{
+		22854, // Bloody Karik
+		22855, // Bloody Berserker
+		22856, // Bloody Karinness
+	};
+	
+	public BloodyKarik()
+	{
+		super(BloodyKarik.class.getSimpleName(), "ai/individual");
+		addKillId(BLOODY_KARIK);
+		addAttackId(BLOODY_KARIK);
+		addTeleportId(BLOODY_KARIK);
+		addMoveFinishedId(BLOODY_KARIK);
+	}
+	
+	@Override
+	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
+	{
+		switch (event)
+		{
+			case "CORE_AI":
+			{
+				if (npc != null)
+				{
+					((L2Attackable) npc).clearAggroList();
+					npc.disableCoreAI(false);
+					startQuestTimer("RETURN_SPAWN", 300000, npc, null);
+				}
+				break;
+			}
+			case "RETURN_SPAWN":
+			{
+				if (npc != null)
+				{
+					((L2Attackable) npc).setCanReturnToSpawnPoint(true);
+				}
+				break;
+			}
+		}
+		return super.onAdvEvent(event, npc, player);
+	}
+	
+	@Override
+	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
+	{
+		switch (npc.getId())
+		{
+			case BLOODY_KARIK:
+			{
+				final double DistSpawn = npc.calculateDistance(npc.getSpawn().getLocation(), false, false);
+				if (DistSpawn > 3000)
+				{
+					npc.disableCoreAI(true);
+					npc.teleToLocation(npc.getSpawn().getLocation());
+				}
+				else
+				{
+					if ((DistSpawn > 500) && (getRandom(100) < 1) && (npc.isInCombat()) && (!npc.isCastingNow()))
+					{
+						for (int object : BLOODY_FAMILY)
+						{
+							for (L2Spawn spawn : SpawnTable.getInstance().getSpawns(object))
+							{
+								final L2Npc obj = spawn.getLastSpawn();
+								if ((obj != null) && !obj.isDead() && (Math.abs(npc.getZ() - obj.getZ()) < 150))
+								{
+									if (npc.calculateDistance(obj, false, false) > obj.getTemplate().getClanHelpRange())
+									{
+										if ((npc.calculateDistance(obj, false, false) < 3000) && GeoData.getInstance().canSeeTarget(npc, obj))
+										{
+											npc.disableCoreAI(true);
+											((L2Attackable) npc).setCanReturnToSpawnPoint(false);
+											addMoveToDesire(npc, new Location(obj.getX() + getRandom(-100, 100), obj.getY() + getRandom(-100, 100), obj.getZ() + 20, 0), 0);
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+				break;
+			}
+		}
+		return super.onAttack(npc, attacker, damage, isSummon);
+	}
+	
+	@Override
+	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
+	{
+		switch (npc.getId())
+		{
+			case BLOODY_KARIK:
+			{
+				if (getRandom(100) < 5)
+				{
+					final int newZ = npc.getZ() + 20;
+					addAttackDesire(addSpawn(npc.getId(), npc.getX(), npc.getY(), newZ, npc.getHeading(), false, 0), killer);
+					addAttackDesire(addSpawn(npc.getId(), npc.getX(), npc.getY() - 10, newZ, npc.getHeading(), false, 0), killer);
+					addAttackDesire(addSpawn(npc.getId(), npc.getX(), npc.getY() - 20, newZ, npc.getHeading(), false, 0), killer);
+					addAttackDesire(addSpawn(npc.getId(), npc.getX(), npc.getY() + 10, newZ, npc.getHeading(), false, 0), killer);
+					addAttackDesire(addSpawn(npc.getId(), npc.getX(), npc.getY() + 20, newZ, npc.getHeading(), false, 0), killer);
+				}
+				break;
+			}
+		}
+		return super.onKill(npc, killer, isSummon);
+	}
+	
+	@Override
+	protected void onTeleport(L2Npc npc)
+	{
+		startQuestTimer("CORE_AI", 100, npc, null);
+	}
+	
+	@Override
+	public void onMoveFinished(L2Npc npc)
+	{
+		startQuestTimer("CORE_AI", 100, npc, null);
+	}
+	
+	public static void main(String[] args)
+	{
+		new BloodyKarik();
+	}
+}
\ No newline at end of file
diff --git a/src/main/resources/data/scripts.cfg b/src/main/resources/data/scripts.cfg
index d559409cbc..1a7aa90533 100644
--- a/src/main/resources/data/scripts.cfg
+++ b/src/main/resources/data/scripts.cfg
@@ -150,6 +150,7 @@ com/l2jserver/datapack/ai/individual/Beleth.java
 com/l2jserver/datapack/ai/individual/BlackdaggerWing.java
 com/l2jserver/datapack/ai/individual/BleedingFly.java
 com/l2jserver/datapack/ai/individual/BloodyBerserker.java
+com/l2jserver/datapack/ai/individual/BloodyKarik.java
 com/l2jserver/datapack/ai/individual/BloodyKarinness.java
 com/l2jserver/datapack/ai/individual/CrimsonHatuOtis.java
 com/l2jserver/datapack/ai/individual/Core.java
-- 
GitLab