From 132e448300eb1f312eb6fe0558aa1ad6ae71a969 Mon Sep 17 00:00:00 2001
From: Zoey76 <zoey_76@msn.com>
Date: Fri, 28 Nov 2014 17:52:58 -0200
Subject: [PATCH] AI improvements.

Patch by: @St3eT
Reviewed by: @Zoey76
---
 .../scripts/ai/group_template/BeastFarm.java  |  2 +-
 .../scripts/ai/group_template/DenOfEvil.java  |  2 +-
 .../ai/group_template/FeedableBeasts.java     |  2 +-
 .../ai/group_template/MinionSpawnManager.java |  6 +--
 .../ai/group_template/NonLethalableNpcs.java  |  9 ++--
 .../ai/group_template/PlainsOfDion.java       |  2 +-
 .../ai/group_template/PolymorphingAngel.java  |  4 +-
 .../group_template/PolymorphingOnAttack.java  |  6 +--
 .../scripts/ai/group_template/RangeGuard.java | 12 ++---
 .../scripts/ai/group_template/Remnants.java   |  3 +-
 .../scripts/ai/group_template/Sandstorms.java | 11 ++--
 .../ai/group_template/SelMahumDrill.java      |  7 ++-
 .../ai/group_template/SelMahumSquad.java      | 54 +++++++++----------
 .../ai/group_template/SilentValley.java       |  2 +-
 .../ai/group_template/StakatoNest.java        | 17 +++---
 .../scripts/ai/group_template/SummonPc.java   |  1 +
 .../scripts/ai/group_template/TurekOrcs.java  |  2 +-
 .../data/scripts/ai/individual/Anais.java     | 14 +++--
 .../game/data/scripts/ai/individual/Core.java | 26 ++++-----
 .../ai/individual/CrimsonHatuOtis.java        | 22 ++++----
 .../scripts/ai/individual/EvasGiftBox.java    |  3 +-
 .../scripts/ai/individual/GraveRobbers.java   | 19 +------
 .../scripts/ai/individual/QueenShyeed.java    |  6 +--
 .../ai/individual/RagnaOrcCommander.java      | 19 +------
 .../scripts/ai/individual/RagnaOrcHero.java   | 19 +------
 .../scripts/ai/individual/RagnaOrcSeer.java   | 20 +------
 .../data/scripts/ai/individual/SinEater.java  |  6 +--
 .../scripts/ai/individual/SinWardens.java     |  2 +-
 .../data/scripts/ai/npc/AbstractNpcAI.java    | 10 ++++
 29 files changed, 127 insertions(+), 181 deletions(-)

diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/BeastFarm.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/BeastFarm.java
index 7dafcdcaf8..15bf3397f2 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/BeastFarm.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/BeastFarm.java
@@ -46,7 +46,7 @@ import com.l2jserver.gameserver.util.Util;
  * Updated to Freya.
  * @author Fulminus, Gigiikun
  */
-public class BeastFarm extends AbstractNpcAI
+public final class BeastFarm extends AbstractNpcAI
 {
 	private static final int GOLDEN_SPICE = 15474;
 	private static final int CRYSTAL_SPICE = 15475;
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/DenOfEvil.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/DenOfEvil.java
index 8afc3d002a..3c115407de 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/DenOfEvil.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/DenOfEvil.java
@@ -37,7 +37,7 @@ import com.l2jserver.gameserver.util.Util;
  * Dummy AI for spawns/respawns only for testing.
  * @author Gnacik
  */
-public class DenOfEvil extends AbstractNpcAI
+public final class DenOfEvil extends AbstractNpcAI
 {
 	// private static final int _buffer_id = 32656;
 	protected static final int[] EYE_IDS =
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/FeedableBeasts.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/FeedableBeasts.java
index 1b7fc214f6..f72f06a08c 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/FeedableBeasts.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/FeedableBeasts.java
@@ -42,7 +42,7 @@ import com.l2jserver.gameserver.util.Util;
  * Growth-capable mobs: Polymorphing upon successful feeding.
  * @author Fulminus
  */
-public class FeedableBeasts extends AbstractNpcAI
+public final class FeedableBeasts extends AbstractNpcAI
 {
 	private static final int GOLDEN_SPICE = 6643;
 	private static final int CRYSTAL_SPICE = 6644;
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/MinionSpawnManager.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/MinionSpawnManager.java
index aa04b42d0b..bdfbce11ce 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/MinionSpawnManager.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/MinionSpawnManager.java
@@ -430,10 +430,10 @@ public final class MinionSpawnManager extends AbstractNpcAI
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
 	{
-		if (npc instanceof L2MonsterInstance)
+		if (npc.isMonster())
 		{
-			L2MonsterInstance monster = (L2MonsterInstance) npc;
-			if (!monster.hasMinions())
+			final L2MonsterInstance monster = (L2MonsterInstance) npc;
+			if (!monster.isTeleporting())
 			{
 				if (getRandom(1, 100) <= npc.getTemplate().getParameters().getInt("SummonPrivateRate", 0))
 				{
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/NonLethalableNpcs.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/NonLethalableNpcs.java
index 5e19273c63..1a2de4ff8a 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/NonLethalableNpcs.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/NonLethalableNpcs.java
@@ -25,14 +25,17 @@ import com.l2jserver.gameserver.model.actor.L2Npc;
 /**
  * @author UnAfraid
  */
-public class NonLethalableNpcs extends AbstractNpcAI
+public final class NonLethalableNpcs extends AbstractNpcAI
 {
-	private static final int HEADQUARTERS = 35062;
+	private static final int[] NPCS =
+	{
+		35062, // Headquarters
+	};
 	
 	public NonLethalableNpcs()
 	{
 		super(NonLethalableNpcs.class.getSimpleName(), "ai/group_template");
-		addSpawnId(HEADQUARTERS);
+		addSpawnId(NPCS);
 	}
 	
 	@Override
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/PlainsOfDion.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/PlainsOfDion.java
index 5db313743e..24c932b827 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/PlainsOfDion.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/PlainsOfDion.java
@@ -69,7 +69,7 @@ public final class PlainsOfDion extends AbstractNpcAI
 	{
 		if (npc.isScriptValue(0))
 		{
-			int i = getRandom(5);
+			final int i = getRandom(5);
 			if (i < 2)
 			{
 				broadcastNpcSay(npc, Say2.NPC_ALL, MONSTERS_MSG[i], player.getName());
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/PolymorphingAngel.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/PolymorphingAngel.java
index 05f6cf5d84..f171831418 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/PolymorphingAngel.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/PolymorphingAngel.java
@@ -30,7 +30,7 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
 /**
  * Angel spawns...when one of the angels in the keys dies, the other angel will spawn.
  */
-public class PolymorphingAngel extends AbstractNpcAI
+public final class PolymorphingAngel extends AbstractNpcAI
 {
 	private static final Map<Integer, Integer> ANGELSPAWNS = new FastMap<>();
 	static
@@ -51,7 +51,7 @@ public class PolymorphingAngel extends AbstractNpcAI
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
 	{
-		L2Attackable newNpc = (L2Attackable) addSpawn(ANGELSPAWNS.get(npc.getId()), npc);
+		final L2Attackable newNpc = (L2Attackable) addSpawn(ANGELSPAWNS.get(npc.getId()), npc);
 		newNpc.setRunning();
 		return super.onKill(npc, killer, isSummon);
 	}
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java
index 297c687bf1..97b97fca27 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/PolymorphingOnAttack.java
@@ -38,7 +38,7 @@ import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
  * Polymorphing on attack monsters AI.
  * @author Slyce
  */
-public class PolymorphingOnAttack extends AbstractNpcAI
+public final class PolymorphingOnAttack extends AbstractNpcAI
 {
 	private static final Map<Integer, List<Integer>> MOBSPAWNS = new HashMap<>();
 	static
@@ -102,8 +102,8 @@ public class PolymorphingOnAttack extends AbstractNpcAI
 						
 					}
 					npc.deleteMe();
-					L2Attackable newNpc = (L2Attackable) addSpawn(tmp.get(0), npc.getX(), npc.getY(), npc.getZ() + 10, npc.getHeading(), false, 0, true);
-					L2Character originalAttacker = isSummon ? attacker.getSummon() : attacker;
+					final L2Attackable newNpc = (L2Attackable) addSpawn(tmp.get(0), npc.getX(), npc.getY(), npc.getZ() + 10, npc.getHeading(), false, 0, true);
+					final L2Character originalAttacker = isSummon ? attacker.getSummon() : attacker;
 					newNpc.setRunning();
 					newNpc.addDamageHate(originalAttacker, 0, 500);
 					newNpc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, originalAttacker);
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/RangeGuard.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/RangeGuard.java
index eec209a4bb..675e24e5f6 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/RangeGuard.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/RangeGuard.java
@@ -18,8 +18,6 @@
  */
 package ai.group_template;
 
-import java.util.List;
-
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.datatables.NpcData;
@@ -39,11 +37,6 @@ public final class RangeGuard extends AbstractNpcAI
 {
 	// Skill
 	private static SkillHolder ULTIMATE_DEFENSE = new SkillHolder(5044, 3); // NPC Ultimate Defense
-	
-	// Misc
-	private static final int MIN_DISTANCE = 150;
-	
-	// Not allowed skills
 	//@formatter:off
 	private static final int[] NOT_ALLOWED_SKILLS =
 	{
@@ -83,13 +76,14 @@ public final class RangeGuard extends AbstractNpcAI
 		1529, // Soul Web
 	};
 	//@formatter:on
+	// Misc
+	private static final int MIN_DISTANCE = 150;
 	
 	private RangeGuard()
 	{
 		super(RangeGuard.class.getSimpleName(), "ai/group_template");
 		
-		final List<L2NpcTemplate> monsters = NpcData.getInstance().getAllNpcOfClassType("L2Monster");
-		for (L2NpcTemplate template : monsters)
+		for (L2NpcTemplate template : NpcData.getInstance().getAllNpcOfClassType("L2Monster"))
 		{
 			if (template.getParameters().getInt("LongRangeGuardRate", -1) > 0)
 			{
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/Remnants.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/Remnants.java
index f3849f122a..a7659bfeb2 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/Remnants.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/Remnants.java
@@ -29,7 +29,7 @@ import com.l2jserver.gameserver.model.skills.Skill;
  * Remnants AI.
  * @author DS
  */
-public class Remnants extends AbstractNpcAI
+public final class Remnants extends AbstractNpcAI
 {
 	private static final int[] NPCS =
 	{
@@ -83,7 +83,6 @@ public class Remnants extends AbstractNpcAI
 				}
 			}
 		}
-		
 		return super.onSkillSee(npc, caster, skill, targets, isSummon);
 	}
 	
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/Sandstorms.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/Sandstorms.java
index f71ff05ee7..1f03ba51c3 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/Sandstorms.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/Sandstorms.java
@@ -20,9 +20,9 @@ package ai.group_template;
 
 import ai.npc.AbstractNpcAI;
 
-import com.l2jserver.gameserver.datatables.SkillData;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.SkillHolder;
 
 /**
  * Sandstorms AI.
@@ -30,17 +30,22 @@ import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  */
 public class Sandstorms extends AbstractNpcAI
 {
+	// NPCs
+	private static final int SANDSTORM = 32350;
+	// Skills
+	private static final SkillHolder GUST = new SkillHolder(5435, 1); // Gust
+	
 	public Sandstorms()
 	{
 		super(Sandstorms.class.getSimpleName(), "ai/group_template");
-		addAggroRangeEnterId(32350); // Sandstorm
+		addAggroRangeEnterId(SANDSTORM); // Sandstorm
 	}
 	
 	@Override
 	public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon)
 	{
 		npc.setTarget(player);
-		npc.doCast(SkillData.getInstance().getSkill(5435, 1));
+		npc.doCast(GUST.getSkill());
 		return super.onAggroRangeEnter(npc, player, isSummon);
 	}
 	
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/SelMahumDrill.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/SelMahumDrill.java
index 6a29066345..8defc9728e 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/SelMahumDrill.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/SelMahumDrill.java
@@ -197,7 +197,7 @@ public final class SelMahumDrill extends AbstractNpcAI
 				break;
 			}
 		}
-		return null;
+		return super.onAdvEvent(event, npc, player);
 	}
 	
 	@Override
@@ -207,7 +207,6 @@ public final class SelMahumDrill extends AbstractNpcAI
 		{
 			npc.broadcastEvent("ATTACKED", 1000, null);
 		}
-		
 		return super.onAttack(npc, attacker, damage, isSummon);
 	}
 	
@@ -258,7 +257,7 @@ public final class SelMahumDrill extends AbstractNpcAI
 				}
 			}
 		}
-		return null;
+		return super.onEventReceived(eventName, sender, receiver, reference);
 	}
 	
 	@Override
@@ -283,7 +282,7 @@ public final class SelMahumDrill extends AbstractNpcAI
 		
 		// Restore AI handling by core
 		npc.disableCoreAI(false);
-		return null;
+		return super.onSpawn(npc);
 	}
 	
 	private void handleSocialAction(L2Npc npc, Actions action, boolean firstCall)
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/SelMahumSquad.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/SelMahumSquad.java
index 9264acc8cd..3a46c37572 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/SelMahumSquad.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/SelMahumSquad.java
@@ -91,22 +91,22 @@ public final class SelMahumSquad extends AbstractNpcAI
 	{
 		switch (event)
 		{
-			case "chef_disable_reward": // 2019005
+			case "chef_disable_reward":
 			{
-				npc.getVariables().set("REWARD_TIME_GONE", 1); // i_ai6 = 1
+				npc.getVariables().set("REWARD_TIME_GONE", 1);
 				break;
 			}
-			case "chef_heal_player": // 2019003
+			case "chef_heal_player":
 			{
 				healPlayer(npc, player);
 				break;
 			}
-			case "chef_remove_invul": // 2019006
+			case "chef_remove_invul":
 			{
 				if (npc.isMonster())
 				{
 					npc.setIsInvul(false);
-					npc.getVariables().remove("INVUL_REMOVE_TIMER_STARTED"); // i_ai5 = 0
+					npc.getVariables().remove("INVUL_REMOVE_TIMER_STARTED");
 					if ((player != null) && !player.isDead() && npc.getKnownList().knowsThePlayer(player))
 					{
 						attackPlayer((L2MonsterInstance) npc, player);
@@ -145,12 +145,12 @@ public final class SelMahumSquad extends AbstractNpcAI
 				npc.setIsRunning(false);
 				npc.setTarget(npc);
 				
-				if (npc.isNoRndWalk()) // i_ai0 == 1
+				if (npc.isNoRndWalk())
 				{
 					npc.doCast(SkillData.getInstance().getSkill(6331, 1));
 					npc.setDisplayEffect(MAHUM_EFFECT_SLEEP);
 				}
-				if (npc.getVariables().getInt("BUSY_STATE") == 1) // Eating - i_ai3 = 1
+				if (npc.getVariables().getInt("BUSY_STATE") == 1) // Eating
 				{
 					npc.doCast(SkillData.getInstance().getSkill(6332, 1));
 					npc.setDisplayEffect(MAHUM_EFFECT_EAT);
@@ -185,36 +185,36 @@ public final class SelMahumSquad extends AbstractNpcAI
 				break;
 			}
 		}
-		return null;
+		return super.onAdvEvent(event, npc, player);
 	}
 	
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, Skill skill)
 	{
-		if ((npc.getId() == CHEF) && (npc.getVariables().getInt("BUSY_STATE") == 0)) // i_ai2 == 0
+		if ((npc.getId() == CHEF) && (npc.getVariables().getInt("BUSY_STATE") == 0))
 		{
-			if (npc.getVariables().getInt("INVUL_REMOVE_TIMER_STARTED") == 0) // i_ai5 == 0
+			if (npc.getVariables().getInt("INVUL_REMOVE_TIMER_STARTED") == 0)
 			{
-				startQuestTimer("chef_remove_invul", 180000, npc, attacker); // 2019004
-				startQuestTimer("chef_disable_reward", 60000, npc, null); // 2019005
+				startQuestTimer("chef_remove_invul", 180000, npc, attacker);
+				startQuestTimer("chef_disable_reward", 60000, npc, null);
 				npc.getVariables().set("INVUL_REMOVE_TIMER_STARTED", 1);
 			}
-			startQuestTimer("chef_heal_player", 1000, npc, attacker); // 2019003
-			startQuestTimer("chef_set_invul", 60000, npc, null); // 2019006
+			startQuestTimer("chef_heal_player", 1000, npc, attacker);
+			startQuestTimer("chef_set_invul", 60000, npc, null);
 			npc.getVariables().set("BUSY_STATE", 1);
 		}
 		else if (Util.contains(SQUAD_LEADERS, npc.getId()))
 		{
 			handlePreAttackMotion(npc);
 		}
-		return null;
+		return super.onAttack(npc, attacker, damage, isSummon, skill);
 	}
 	
 	@Override
 	public String onFactionCall(L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isSummon)
 	{
 		handlePreAttackMotion(npc);
-		return null;
+		return super.onFactionCall(npc, caller, attacker, isSummon);
 	}
 	
 	@Override
@@ -295,8 +295,7 @@ public final class SelMahumSquad extends AbstractNpcAI
 				break;
 			}
 		}
-		
-		return null;
+		return super.onEventReceived(eventName, sender, receiver, reference);
 	}
 	
 	@Override
@@ -310,8 +309,7 @@ public final class SelMahumSquad extends AbstractNpcAI
 		cancelQuestTimer("chef_disable_reward", npc, null);
 		cancelQuestTimer("chef_heal_player", npc, null);
 		cancelQuestTimer("chef_set_invul", npc, null);
-		
-		return null;
+		return super.onKill(npc, killer, isSummon);
 	}
 	
 	@Override
@@ -339,8 +337,7 @@ public final class SelMahumSquad extends AbstractNpcAI
 			npc.doCast(SkillData.getInstance().getSkill(6688, 1));
 			npc.broadcastEvent("SCE_SOUP_FAILURE", 600, caster);
 		}
-		
-		return null;
+		return super.onSkillSee(npc, caster, skill, targets, isSummon);
 	}
 	
 	@Override
@@ -350,18 +347,16 @@ public final class SelMahumSquad extends AbstractNpcAI
 		{
 			npc.setIsInvul(false);
 		}
-		
 		else if (npc.getId() == FIRE)
 		{
 			startQuestTimer("fire", 1000, npc, null);
 		}
-		
 		else if (Util.contains(SQUAD_LEADERS, npc.getId()))
 		{
 			npc.setDisplayEffect(3);
 			npc.setIsNoRndWalk(false);
 		}
-		return null;
+		return super.onSpawn(npc);
 	}
 	
 	@Override
@@ -371,8 +366,7 @@ public final class SelMahumSquad extends AbstractNpcAI
 		{
 			healPlayer(npc, player);
 		}
-		
-		return null;
+		return super.onSpellFinished(npc, player, skill);
 	}
 	
 	private void healPlayer(L2Npc npc, L2PcInstance player)
@@ -385,8 +379,8 @@ public final class SelMahumSquad extends AbstractNpcAI
 		else
 		{
 			cancelQuestTimer("chef_set_invul", npc, null);
-			npc.getVariables().remove("BUSY_STATE"); // i_ai2 = 0
-			npc.getVariables().remove("INVUL_REMOVE_TIMER_STARTED"); // i_ai5 = 0
+			npc.getVariables().remove("BUSY_STATE");
+			npc.getVariables().remove("INVUL_REMOVE_TIMER_STARTED");
 			npc.setIsRunning(false);
 		}
 	}
@@ -395,7 +389,7 @@ public final class SelMahumSquad extends AbstractNpcAI
 	{
 		cancelQuestTimer("remove_effects", attacked, null);
 		attacked.getVariables().remove("BUSY_STATE");
-		attacked.setIsNoRndWalk(false); // i_ai0 == 0
+		attacked.setIsNoRndWalk(false);
 		attacked.setDisplayEffect(MAHUM_EFFECT_NONE);
 		if (attacked.getRightHandItem() == OHS_Weapon)
 		{
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/SilentValley.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/SilentValley.java
index 5b8d544c27..6d8d4c1e52 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/SilentValley.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/SilentValley.java
@@ -34,7 +34,7 @@ import com.l2jserver.gameserver.network.clientpackets.Say2;
  * Silent Valley AI
  * @author malyelfik
  */
-public class SilentValley extends AbstractNpcAI
+public final class SilentValley extends AbstractNpcAI
 {
 	// Skills
 	private static final SkillHolder BETRAYAL = new SkillHolder(6033, 1); // Treasure Seeker's Betrayal
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/StakatoNest.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/StakatoNest.java
index b1385aba8a..2b0005a166 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/StakatoNest.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/StakatoNest.java
@@ -38,7 +38,7 @@ import com.l2jserver.gameserver.util.Util;
  * Stakato Nest AI.
  * @author Gnacik
  */
-public class StakatoNest extends AbstractNpcAI
+public final class StakatoNest extends AbstractNpcAI
 {
 	// @formatter:off
 	// List of all mobs just for register
@@ -93,11 +93,11 @@ public class StakatoNest extends AbstractNpcAI
 	@Override
 	public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
 	{
-		L2MonsterInstance mob = (L2MonsterInstance) npc;
+		final L2MonsterInstance mob = (L2MonsterInstance) npc;
 		
 		if ((mob.getId() == STAKATO_LEADER) && (getRandom(1000) < 100) && (mob.getCurrentHp() < (mob.getMaxHp() * 0.3)))
 		{
-			L2MonsterInstance _follower = checkMinion(npc);
+			final L2MonsterInstance _follower = checkMinion(npc);
 			
 			if (_follower != null)
 			{
@@ -121,7 +121,7 @@ public class StakatoNest extends AbstractNpcAI
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
 	{
-		L2MonsterInstance monster;
+		final L2MonsterInstance monster;
 		switch (npc.getId())
 		{
 			case STAKATO_NURSE:
@@ -186,7 +186,7 @@ public class StakatoNest extends AbstractNpcAI
 		if (Util.contains(COCOONS, npc.getId()) && Util.contains(targets, npc) && (skill.getId() == GROWTH_ACCELERATOR))
 		{
 			npc.doDie(caster);
-			L2Npc spawned = addSpawn(STAKATO_CHIEF, npc.getX(), npc.getY(), npc.getZ(), Util.calculateHeadingFrom(npc, caster), false, 0, true);
+			final L2Npc spawned = addSpawn(STAKATO_CHIEF, npc.getX(), npc.getY(), npc.getZ(), Util.calculateHeadingFrom(npc, caster), false, 0, true);
 			attackPlayer(caster, spawned);
 		}
 		return super.onSkillSee(npc, caster, skill, targets, isSummon);
@@ -214,7 +214,7 @@ public class StakatoNest extends AbstractNpcAI
 		{
 			npc.getSpawn().decreaseCount(npc);
 			npc.deleteMe();
-			L2Npc _spawned = addSpawn(npcId, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, true);
+			final L2Npc _spawned = addSpawn(npcId, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading(), false, 0, true);
 			attackPlayer(player, _spawned);
 		}
 		return super.onAdvEvent(event, npc, player);
@@ -222,16 +222,15 @@ public class StakatoNest extends AbstractNpcAI
 	
 	private static L2MonsterInstance checkMinion(L2Npc npc)
 	{
-		L2MonsterInstance mob = (L2MonsterInstance) npc;
+		final L2MonsterInstance mob = (L2MonsterInstance) npc;
 		if (mob.hasMinions())
 		{
-			List<L2MonsterInstance> minion = mob.getMinionList().getSpawnedMinions();
+			final List<L2MonsterInstance> minion = mob.getMinionList().getSpawnedMinions();
 			if ((minion != null) && !minion.isEmpty() && (minion.get(0) != null) && !minion.get(0).isDead())
 			{
 				return minion.get(0);
 			}
 		}
-		
 		return null;
 	}
 	
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/SummonPc.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/SummonPc.java
index a3aa94f54b..1c23a6621b 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/SummonPc.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/SummonPc.java
@@ -60,6 +60,7 @@ public final class SummonPc extends AbstractNpcAI
 					npc.setTarget(attacker);
 					npc.doCast(SUMMON_PC.getSkill());
 				}
+				
 				if ((SUMMON_PC.getSkill().getMpConsume() < npc.getCurrentMp()) && (SUMMON_PC.getSkill().getHpConsume() < npc.getCurrentHp()) && !npc.isSkillDisabled(SUMMON_PC.getSkill()))
 				{
 					npc.setTarget(attacker);
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/group_template/TurekOrcs.java b/L2J_DataPack/dist/game/data/scripts/ai/group_template/TurekOrcs.java
index 1b6312627b..e68dc9ba83 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/group_template/TurekOrcs.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/group_template/TurekOrcs.java
@@ -103,7 +103,7 @@ public final class TurekOrcs extends AbstractNpcAI
 			((L2Attackable) receiver).addDamageHate(reference.getActingPlayer(), 0, 99999);
 			receiver.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, reference.getActingPlayer());
 		}
-		return null;
+		return super.onEventReceived(eventName, sender, receiver, reference);
 	}
 	
 	@Override
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/Anais.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/Anais.java
index 84bcea42bd..20d2db44bd 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/Anais.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/Anais.java
@@ -83,20 +83,21 @@ public final class Anais extends AbstractNpcAI
 		switch (event)
 		{
 			case "CHECK":
+			{
 				if (!npc.isAttackingNow())
 				{
 					cancelQuestTimer("CHECK", npc, null);
 				}
 				if ((_current != null) || (_pot < 4))
 				{
-					Map<Integer, L2PcInstance> players = npc.getKnownList().getKnownPlayers();
-					L2PcInstance target = players.get(getRandom(players.size() - 1));
+					final Map<Integer, L2PcInstance> players = npc.getKnownList().getKnownPlayers();
+					final L2PcInstance target = players.get(getRandom(players.size() - 1));
 					_nextTarget = target;
 					if (_nextTarget == null)
 					{
 						_nextTarget = (L2PcInstance) npc.getTarget();
 					}
-					L2Npc b = _divineBurners.get(_pot);
+					final L2Npc b = _divineBurners.get(_pot);
 					_pot = _pot + 1;
 					b.setDisplayEffect(1);
 					b.setIsRunning(false);
@@ -109,7 +110,9 @@ public final class Anais extends AbstractNpcAI
 					ward.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, _nextTarget);
 				}
 				break;
+			}
 			case "GUARD_ATTACK":
+			{
 				if (_nextTarget != null)
 				{
 					final double distance = npc.calculateDistance(_nextTarget, false, false);
@@ -124,7 +127,9 @@ public final class Anais extends AbstractNpcAI
 					}
 				}
 				break;
+			}
 			case "SUICIDE":
+			{
 				npc.doCast(DIVINE_NOVA.getSkill());
 				cancelQuestTimer("GUARD_ATTACK", npc, _nextTarget);
 				if (_current != null)
@@ -135,8 +140,9 @@ public final class Anais extends AbstractNpcAI
 				}
 				npc.doDie(null);
 				break;
+			}
 		}
-		return null;
+		return super.onAdvEvent(event, npc, player);
 	}
 	
 	@Override
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/Core.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/Core.java
index 2bdcf17001..2550149462 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/Core.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/Core.java
@@ -64,8 +64,8 @@ public final class Core extends AbstractNpcAI
 		registerMobs(CORE, DEATH_KNIGHT, DOOM_WRAITH, SUSCEPTOR);
 		
 		_FirstAttacked = false;
-		StatsSet info = GrandBossManager.getInstance().getStatsSet(CORE);
-		int status = GrandBossManager.getInstance().getBossStatus(CORE);
+		final StatsSet info = GrandBossManager.getInstance().getStatsSet(CORE);
+		final int status = GrandBossManager.getInstance().getBossStatus(CORE);
 		if (status == DEAD)
 		{
 			// load the unlock date and time for Core from DB
@@ -86,18 +86,18 @@ public final class Core extends AbstractNpcAI
 		}
 		else
 		{
-			String test = loadGlobalQuestVar("Core_Attacked");
+			final String test = loadGlobalQuestVar("Core_Attacked");
 			if (test.equalsIgnoreCase("true"))
 			{
 				_FirstAttacked = true;
 			}
-			int loc_x = info.getInt("loc_x");
-			int loc_y = info.getInt("loc_y");
-			int loc_z = info.getInt("loc_z");
-			int heading = info.getInt("heading");
-			int hp = info.getInt("currentHP");
-			int mp = info.getInt("currentMP");
-			L2GrandBossInstance core = (L2GrandBossInstance) addSpawn(CORE, loc_x, loc_y, loc_z, heading, false, 0);
+			final int loc_x = info.getInt("loc_x");
+			final int loc_y = info.getInt("loc_y");
+			final int loc_z = info.getInt("loc_z");
+			final int heading = info.getInt("heading");
+			final int hp = info.getInt("currentHP");
+			final int mp = info.getInt("currentMP");
+			final L2GrandBossInstance core = (L2GrandBossInstance) addSpawn(CORE, loc_x, loc_y, loc_z, heading, false, 0);
 			core.setCurrentHpMp(hp, mp);
 			spawnBoss(core);
 		}
@@ -117,14 +117,14 @@ public final class Core extends AbstractNpcAI
 		L2Attackable mob;
 		for (int i = 0; i < 5; i++)
 		{
-			int x = 16800 + (i * 360);
+			final int x = 16800 + (i * 360);
 			mob = (L2Attackable) addSpawn(DEATH_KNIGHT, x, 110000, npc.getZ(), 280 + getRandom(40), false, 0);
 			mob.setIsRaidMinion(true);
 			Minions.add(mob);
 			mob = (L2Attackable) addSpawn(DEATH_KNIGHT, x, 109000, npc.getZ(), 280 + getRandom(40), false, 0);
 			mob.setIsRaidMinion(true);
 			Minions.add(mob);
-			int x2 = 16800 + (i * 600);
+			final int x2 = 16800 + (i * 600);
 			mob = (L2Attackable) addSpawn(DOOM_WRAITH, x2, 109300, npc.getZ(), 280 + getRandom(40), false, 0);
 			mob.setIsRaidMinion(true);
 			Minions.add(mob);
@@ -193,7 +193,7 @@ public final class Core extends AbstractNpcAI
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
 	{
-		int npcId = npc.getId();
+		final int npcId = npc.getId();
 		if (npcId == CORE)
 		{
 			int objId = npc.getObjectId();
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/CrimsonHatuOtis.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/CrimsonHatuOtis.java
index 241670092d..125b7fddd7 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/CrimsonHatuOtis.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/CrimsonHatuOtis.java
@@ -50,25 +50,29 @@ public final class CrimsonHatuOtis extends AbstractNpcAI
 	{
 		switch (event)
 		{
-			case "skill":
+			case "SKILL":
+			{
 				if (npc.isDead())
 				{
-					cancelQuestTimer("skill", npc, null);
+					cancelQuestTimer("SKILL", npc, null);
 					return null;
 				}
 				npc.setTarget(player);
 				npc.doCast(BOSS_SPINING_SLASH.getSkill());
-				startQuestTimer("skill", 60000, npc, null);
+				startQuestTimer("SKILL", 60000, npc, null);
 				break;
-			case "buff":
+			}
+			case "BUFF":
+			{
 				if (npc.isScriptValue(2))
 				{
 					npc.setTarget(npc);
 					npc.doCast(BOSS_HASTE.getSkill());
 				}
 				break;
+			}
 		}
-		return null;
+		return super.onAdvEvent(event, npc, player);
 	}
 	
 	@Override
@@ -77,13 +81,13 @@ public final class CrimsonHatuOtis extends AbstractNpcAI
 		if (npc.isScriptValue(0))
 		{
 			npc.setScriptValue(1);
-			startQuestTimer("skill", 5000, npc, null);
+			startQuestTimer("SKILL", 5000, npc, null);
 		}
 		else if (npc.isScriptValue(1) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.3)))
 		{
 			broadcastNpcSay(npc, Say2.NPC_ALL, NpcStringId.IVE_HAD_IT_UP_TO_HERE_WITH_YOU_ILL_TAKE_CARE_OF_YOU);
 			npc.setScriptValue(2);
-			startQuestTimer("buff", 1000, npc, null);
+			startQuestTimer("BUFF", 1000, npc, null);
 		}
 		return super.onAttack(npc, attacker, damage, isSummon);
 	}
@@ -91,8 +95,8 @@ public final class CrimsonHatuOtis extends AbstractNpcAI
 	@Override
 	public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
 	{
-		cancelQuestTimer("skill", npc, null);
-		cancelQuestTimer("buff", npc, null);
+		cancelQuestTimer("SKILL", npc, null);
+		cancelQuestTimer("BUFF", npc, null);
 		return super.onKill(npc, player, isSummon);
 	}
 	
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/EvasGiftBox.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/EvasGiftBox.java
index 697153fb22..aed0c40c48 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/EvasGiftBox.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/EvasGiftBox.java
@@ -55,7 +55,8 @@ public final class EvasGiftBox extends AbstractNpcAI
 			{
 				npc.dropItem(killer, CRYSTAL);
 			}
-			else if (getRandom(100) < 33)
+			
+			if (getRandom(100) < 33)
 			{
 				npc.dropItem(killer, CORAL);
 			}
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/GraveRobbers.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/GraveRobbers.java
index 16f05d2e22..631d00e393 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/GraveRobbers.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/GraveRobbers.java
@@ -21,8 +21,6 @@ package ai.individual;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.holders.MinionHolder;
 
 /**
  * Grove Robber's AI.<br>
@@ -46,25 +44,10 @@ public final class GraveRobbers extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (getRandom(2) == 0)
-		{
-			spawnMinions(npc, "Privates1");
-		}
-		else
-		{
-			spawnMinions(npc, "Privates2");
-		}
+		spawnMinions(npc, "Privates" + getRandom(1, 2));
 		return super.onSpawn(npc);
 	}
 	
-	private void spawnMinions(final L2Npc npc, final String spawnName)
-	{
-		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
-		{
-			addMinion((L2MonsterInstance) npc, is.getId());
-		}
-	}
-	
 	public static void main(String[] args)
 	{
 		new GraveRobbers();
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/QueenShyeed.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/QueenShyeed.java
index f3e09173e5..e38e753788 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/QueenShyeed.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/QueenShyeed.java
@@ -84,8 +84,8 @@ public final class QueenShyeed extends AbstractNpcAI
 	
 	private void spawnShyeed()
 	{
-		String respawn = loadGlobalQuestVar("Respawn");
-		long remain = (!respawn.isEmpty()) ? Long.parseLong(respawn) - System.currentTimeMillis() : 0;
+		final String respawn = loadGlobalQuestVar("Respawn");
+		final long remain = (!respawn.isEmpty()) ? Long.parseLong(respawn) - System.currentTimeMillis() : 0;
 		if (remain > 0)
 		{
 			startQuestTimer("respawn", remain, null, null);
@@ -100,7 +100,7 @@ public final class QueenShyeed extends AbstractNpcAI
 	
 	private void startRespawn()
 	{
-		int respawnTime = RESPAWN - getRandom(RANDOM_RESPAWN);
+		final int respawnTime = RESPAWN - getRandom(RANDOM_RESPAWN);
 		saveGlobalQuestVar("Respawn", Long.toString(System.currentTimeMillis() + respawnTime));
 		startQuestTimer("respawn", respawnTime, null, null);
 		MOB_BUFF_ZONE.setEnabled(false);
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcCommander.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcCommander.java
index 99291385a7..26192184d0 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcCommander.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcCommander.java
@@ -21,8 +21,6 @@ package ai.individual;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.holders.MinionHolder;
 
 /**
  * Ragna Orc Commander AI.
@@ -42,25 +40,10 @@ public final class RagnaOrcCommander extends AbstractNpcAI
 	public String onSpawn(L2Npc npc)
 	{
 		spawnMinions(npc, "Privates1");
-		if (getRandom(100) < 50)
-		{
-			spawnMinions(npc, "Privates2");
-		}
-		else
-		{
-			spawnMinions(npc, "Privates3");
-		}
+		spawnMinions(npc, getRandomBoolean() ? "Privates2" : "Privates3");
 		return super.onSpawn(npc);
 	}
 	
-	private void spawnMinions(final L2Npc npc, final String spawnName)
-	{
-		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
-		{
-			addMinion((L2MonsterInstance) npc, is.getId());
-		}
-	}
-	
 	public static void main(String[] args)
 	{
 		new RagnaOrcCommander();
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcHero.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcHero.java
index 0da58ba149..57cb6f4ee3 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcHero.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcHero.java
@@ -21,8 +21,6 @@ package ai.individual;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.holders.MinionHolder;
 
 /**
  * Ragna Orc Hero AI.
@@ -41,25 +39,10 @@ public final class RagnaOrcHero extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		if (getRandom(100) < 70)
-		{
-			spawnMinions(npc, "Privates1");
-		}
-		else
-		{
-			spawnMinions(npc, "Privates2");
-		}
+		spawnMinions(npc, getRandom(100) < 70 ? "Privates1" : "Privates2");
 		return super.onSpawn(npc);
 	}
 	
-	private void spawnMinions(final L2Npc npc, final String spawnName)
-	{
-		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
-		{
-			addMinion((L2MonsterInstance) npc, is.getId());
-		}
-	}
-	
 	public static void main(String[] args)
 	{
 		new RagnaOrcHero();
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcSeer.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcSeer.java
index ed1e072967..b2bcdac7d6 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcSeer.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/RagnaOrcSeer.java
@@ -21,8 +21,6 @@ package ai.individual;
 import ai.npc.AbstractNpcAI;
 
 import com.l2jserver.gameserver.model.actor.L2Npc;
-import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
-import com.l2jserver.gameserver.model.holders.MinionHolder;
 
 /**
  * Ragna Orc Seer AI.
@@ -41,26 +39,10 @@ public final class RagnaOrcSeer extends AbstractNpcAI
 	@Override
 	public String onSpawn(L2Npc npc)
 	{
-		
-		if (getRandom(100) < 50)
-		{
-			spawnMinions(npc, "Privates1");
-		}
-		else
-		{
-			spawnMinions(npc, "Privates2");
-		}
+		spawnMinions(npc, "Privates" + getRandom(1, 2));
 		return super.onSpawn(npc);
 	}
 	
-	private void spawnMinions(final L2Npc npc, final String spawnName)
-	{
-		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
-		{
-			addMinion((L2MonsterInstance) npc, is.getId());
-		}
-	}
-	
 	public static void main(String[] args)
 	{
 		new RagnaOrcSeer();
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/SinEater.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/SinEater.java
index cf46097096..b238055ec9 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/SinEater.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/SinEater.java
@@ -53,7 +53,7 @@ public final class SinEater extends AbstractNpcAI
 	@Override
 	public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
 	{
-		if (event.equals("2001") && (player != null) && (player.getSummon() != null))
+		if (event.equals("TALK") && (player != null) && (player.getSummon() != null))
 		{
 			if (getRandom(100) < 30)
 			{
@@ -81,7 +81,7 @@ public final class SinEater extends AbstractNpcAI
 					broadcastSummonSay(summon, NpcStringId.OH_THIS_IS_DRAGGING_ON_TOO_LONG_AT_THIS_RATE_I_WONT_MAKE_IT_HOME_BEFORE_THE_SEVEN_SEALS_ARE_BROKEN);
 				}
 			}
-			startQuestTimer("2001", 60000, null, player);
+			startQuestTimer("TALK", 60000, null, player);
 		}
 		return super.onAdvEvent(event, npc, player);
 	}
@@ -137,7 +137,7 @@ public final class SinEater extends AbstractNpcAI
 	public void onSummonSpawn(L2Summon summon)
 	{
 		broadcastSummonSay(summon, getRandomBoolean() ? NpcStringId.HEY_IT_SEEMS_LIKE_YOU_NEED_MY_HELP_DOESNT_IT : NpcStringId.ALMOST_GOT_IT_OUCH_STOP_DAMN_THESE_BLOODY_MANACLES);
-		startQuestTimer("2001", 60000, null, summon.getOwner());
+		startQuestTimer("TALK", 60000, null, summon.getOwner());
 	}
 	
 	@Override
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/individual/SinWardens.java b/L2J_DataPack/dist/game/data/scripts/ai/individual/SinWardens.java
index d3294294e4..8910ce2bad 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/individual/SinWardens.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/individual/SinWardens.java
@@ -67,7 +67,7 @@ public final class SinWardens extends AbstractNpcAI
 	{
 		if (npc.isMinion())
 		{
-			L2MonsterInstance master = ((L2MonsterInstance) npc).getLeader();
+			final L2MonsterInstance master = ((L2MonsterInstance) npc).getLeader();
 			if ((master != null) && !master.isDead())
 			{
 				int killedCount = killedMinionsCount.containsKey(master.getObjectId()) ? killedMinionsCount.get(master.getObjectId()) : 0;
diff --git a/L2J_DataPack/dist/game/data/scripts/ai/npc/AbstractNpcAI.java b/L2J_DataPack/dist/game/data/scripts/ai/npc/AbstractNpcAI.java
index 33532636cc..8fbfac8acb 100644
--- a/L2J_DataPack/dist/game/data/scripts/ai/npc/AbstractNpcAI.java
+++ b/L2J_DataPack/dist/game/data/scripts/ai/npc/AbstractNpcAI.java
@@ -25,7 +25,9 @@ import com.l2jserver.gameserver.model.actor.L2Attackable;
 import com.l2jserver.gameserver.model.actor.L2Character;
 import com.l2jserver.gameserver.model.actor.L2Npc;
 import com.l2jserver.gameserver.model.actor.L2Playable;
+import com.l2jserver.gameserver.model.actor.instance.L2MonsterInstance;
 import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
+import com.l2jserver.gameserver.model.holders.MinionHolder;
 import com.l2jserver.gameserver.model.holders.SkillHolder;
 import com.l2jserver.gameserver.model.quest.Quest;
 import com.l2jserver.gameserver.network.NpcStringId;
@@ -208,4 +210,12 @@ public abstract class AbstractNpcAI extends Quest
 		npc.setTarget(target);
 		npc.getAI().setIntention(CtrlIntention.AI_INTENTION_CAST, skill.getSkill(), target);
 	}
+	
+	public void spawnMinions(final L2Npc npc, final String spawnName)
+	{
+		for (MinionHolder is : npc.getTemplate().getParameters().getMinionList(spawnName))
+		{
+			addMinion((L2MonsterInstance) npc, is.getId());
+		}
+	}
 }
\ No newline at end of file
-- 
GitLab